@cryptotaxi247 / CoPilot / commits / 25f6c5a6

import vue template (#80)

* import vue template * precommit fixes * precommit commented out eslint for now

taylor_socfortress committed Jul 27, 2023 at 09:56 UTC 25f6c5a65d2991b983d6478ef73f216cba77a4b1
364 files changed +91012
.eslintrc.cjs new
+17
@@ -0,0 +1,17 @@
1 +/* eslint-env node */
2 +require("@rushstack/eslint-patch/modern-module-resolution")
3 +
4 +module.exports = {
5 + root: true,
6 + extends: ["plugin:vue/vue3-essential", "eslint:recommended", "@vue/eslint-config-typescript", "@vue/eslint-config-prettier"],
7 + overrides: [
8 + {
9 + files: ["cypress/e2e/**.{cy,spec}.{js,ts,jsx,tsx}"],
10 + extends: ["plugin:cypress/recommended"]
11 + }
12 + ],
13 + parserOptions: {
14 + ecmaVersion: "latest",
15 + sourceType: "module"
16 + }
17 +}
.pre-commit-config.yaml
+13
@@ -47,3 +47,16 @@ repos:
47 rev: "v3.0.0"
48 hooks:
49 - id: prettier
50 +
51 + # - repo: https://github.com/pre-commit/mirrors-eslint
52 + # rev: v8.41.0
53 + # hooks:
54 + # - id: eslint
55 + # files: \.([cjt]sx?|[cm]ts|[cm]js|cvue)$ # *.js, *.jsx, *.ts, *.tsx and *.vue
56 + # additional_dependencies:
57 + # - "@rushstack/eslint-patch@1.2.0"
58 + # - eslint@8.41.0
59 + # - "@vue/eslint-config-prettier@7.1.0"
60 + # - "@vue/eslint-config-typescript@11.0.2"
61 + # - eslint-plugin-cypress@2.13.3
62 + # - eslint-plugin-vue@9.11.1
cypress.config.ts new
+8
@@ -0,0 +1,8 @@
1 +import { defineConfig } from "cypress"
2 +
3 +export default defineConfig({
4 + e2e: {
5 + specPattern: "cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}",
6 + baseUrl: "http://localhost:4173"
7 + }
8 +})
cypress/e2e/example.cy.ts new
+8
@@ -0,0 +1,8 @@
1 +// https://docs.cypress.io/api/introduction/api.html
2 +
3 +describe("My First Test", () => {
4 + it("visits the app root url", () => {
5 + cy.visit("/")
6 + cy.contains("h1", "You did it!")
7 + })
8 +})
cypress/e2e/tsconfig.json new
+10
@@ -0,0 +1,10 @@
1 +{
2 + "extends": "@vue/tsconfig/tsconfig.web.json",
3 + "include": ["./**/*", "../support/**/*"],
4 + "compilerOptions": {
5 + "isolatedModules": false,
6 + "target": "es5",
7 + "lib": ["es5", "dom"],
8 + "types": ["cypress"]
9 + }
10 +}
cypress/fixtures/example.json new
+5
@@ -0,0 +1,5 @@
1 +{
2 + "name": "Using fixtures to represent data",
3 + "email": "hello@cypress.io",
4 + "body": "Fixtures are a great way to mock data for responses to routes"
5 +}
cypress/support/commands.ts new
+39
@@ -0,0 +1,39 @@
1 +/// <reference types="cypress" />
2 +// ***********************************************
3 +// This example commands.ts shows you how to
4 +// create various custom commands and overwrite
5 +// existing commands.
6 +//
7 +// For more comprehensive examples of custom
8 +// commands please read more here:
9 +// https://on.cypress.io/custom-commands
10 +// ***********************************************
11 +//
12 +//
13 +// -- This is a parent command --
14 +// Cypress.Commands.add('login', (email, password) => { ... })
15 +//
16 +//
17 +// -- This is a child command --
18 +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
19 +//
20 +//
21 +// -- This is a dual command --
22 +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
23 +//
24 +//
25 +// -- This will overwrite an existing command --
26 +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
27 +//
28 +// declare global {
29 +// namespace Cypress {
30 +// interface Chainable {
31 +// login(email: string, password: string): Chainable<void>
32 +// drag(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
33 +// dismiss(subject: string, options?: Partial<TypeOptions>): Chainable<Element>
34 +// visit(originalFn: CommandOriginalFn, url: string, options: Partial<VisitOptions>): Chainable<Element>
35 +// }
36 +// }
37 +// }
38 +
39 +export {}
cypress/support/e2e.ts new
+20
@@ -0,0 +1,20 @@
1 +// ***********************************************************
2 +// This example support/index.js is processed and
3 +// loaded automatically before your test files.
4 +//
5 +// This is a great place to put global configuration and
6 +// behavior that modifies Cypress.
7 +//
8 +// You can change the location of this file or turn off
9 +// automatically serving support files with the
10 +// 'supportFile' configuration option.
11 +//
12 +// You can read more here:
13 +// https://on.cypress.io/configuration
14 +// ***********************************************************
15 +
16 +// Import commands.js using ES2015 syntax:
17 +import "./commands"
18 +
19 +// Alternatively you can use CommonJS syntax:
20 +// require('./commands')
index.html new
+105
@@ -0,0 +1,105 @@
1 +<!doctype html>
2 +<html lang="en">
3 + <head>
4 + <meta charset="utf-8" />
5 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
7 + <link rel="canonical" href="http://pragmatic.ddmweb.it" />
8 + <link rel="shortcut icon" href="/favicon.ico" />
9 + <title>Pragmatic - Vue.js Admin Template</title>
10 +
11 + <meta name="apple-mobile-web-app-capable" content="yes" />
12 + <meta name="apple-mobile-web-app-status-bar-style" content="default" />
13 + <meta name="apple-mobile-web-app-title" content="Pragmatic" />
14 + <meta name="apple-touch-fullscreen" content="yes" />
15 +
16 + <link rel="apple-touch-icon" sizes="57x57" href="/static/icons/apple-icon-57x57.png" />
17 + <link rel="apple-touch-icon" sizes="60x60" href="/static/icons/apple-icon-60x60.png" />
18 + <link rel="apple-touch-icon" sizes="72x72" href="/static/icons/apple-icon-72x72.png" />
19 + <link rel="apple-touch-icon" sizes="76x76" href="/static/icons/apple-icon-76x76.png" />
20 + <link rel="apple-touch-icon" sizes="114x114" href="/static/icons/apple-icon-114x114.png" />
21 + <link rel="apple-touch-icon" sizes="120x120" href="/static/icons/apple-icon-120x120.png" />
22 + <link rel="apple-touch-icon" sizes="144x144" href="/static/icons/apple-icon-144x144.png" />
23 + <link rel="apple-touch-icon" sizes="152x152" href="/static/icons/apple-icon-152x152.png" />
24 + <link rel="apple-touch-icon" sizes="180x180" href="/static/icons/apple-icon-180x180.png" />
25 + <link rel="icon" type="image/png" sizes="192x192" href="/static/icons/android-icon-192x192.png" />
26 + <link rel="icon" type="image/png" sizes="32x32" href="/static/icons/favicon-32x32.png" />
27 + <link rel="icon" type="image/png" sizes="96x96" href="/static/icons/favicon-96x96.png" />
28 + <link rel="icon" type="image/png" sizes="16x16" href="/static/icons/favicon-16x16.png" />
29 + <link rel="manifest" href="/manifest.json" />
30 + <meta name="msapplication-TileColor" content="#ffffff" />
31 + <meta name="msapplication-TileImage" content="/static/icons/ms-icon-144x144.png" />
32 + <meta name="theme-color" content="#ffffff" />
33 +
34 + <!-- Search Engine -->
35 + <meta name="description" content="Element UI Vuejs design admin template with pre-built apps and pages" />
36 + <meta
37 + name="keywords"
38 + content="HTML,CSS,VueJs,JAVASCRIPT,JS,element,admin,dashboard,theme,html dashboard, html css dashboard, web dashboard,vue dashboard, premium vue.js dashboard, vue.js admin template"
39 + />
40 + <meta name="author" content="Linko" />
41 + <meta name="image" content="https://pragmatic.ddmweb.it/logo.png" />
42 + <!-- Twitter -->
43 + <meta name="twitter:card" content="summary_large_image" />
44 + <meta name="twitter:title" content="Pragmatic - Vue.js Admin Template" />
45 + <meta name="twitter:description" content="Element UI Vuejs design admin template with pre-built apps and pages" />
46 + <meta name="twitter:site" content="@Linko_ddm" />
47 + <meta name="twitter:creator" content="@Linko_ddm" />
48 + <meta name="twitter:image" content="https://pragmatic.ddmweb.it/preview.jpg" />
49 + <!-- Open Graph general (Facebook, Pinterest & Google+) -->
50 + <meta name="og:title" content="Pragmatic - Vue.js Admin Template" />
51 + <meta name="og:description" content="Element UI Vuejs design admin template with pre-built apps and pages" />
52 + <meta name="og:image" content="https://pragmatic.ddmweb.it/preview.jpg" />
53 + <meta name="og:url" content="https://pragmatic.ddmweb.it" />
54 + <meta name="og:site_name" content="Pragmatic" />
55 + <meta name="og:type" content="website" />
56 + <meta property="og:title" content="Pragmatic - Vue.js Admin Template" />
57 + <meta property="og:description" content="Element UI Vuejs design admin template with pre-built apps and pages" />
58 + <meta property="og:image" content="https://pragmatic.ddmweb.it/preview.jpg" />
59 + <meta property="og:url" content="https://pragmatic.ddmweb.it" />
60 + <meta property="og:site_name" content="Pragmatic" />
61 + <meta property="og:type" content="website" />
62 +
63 + <style>
64 + .splash-screen {
65 + background: #4a596a;
66 + position: fixed;
67 + top: 0;
68 + left: 0;
69 + bottom: 0;
70 + right: 0;
71 + z-index: 99999;
72 + }
73 +
74 + .splash-screen > .wrap {
75 + position: absolute;
76 + top: 50%;
77 + left: 50%;
78 + transform: translateX(-50%) translateY(-50%);
79 + }
80 +
81 + .splash-screen > .wrap > img {
82 + margin: 30px auto;
83 + display: block;
84 + width: 100px;
85 + }
86 +
87 + .splash-screen > .wrap > img.logo {
88 + -webkit-filter: drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.3));
89 + filter: drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.3));
90 + }
91 + </style>
92 + </head>
93 +
94 + <body class="theme-default">
95 + <div id="app">
96 + <div class="splash-screen">
97 + <div class="wrap">
98 + <img src="/logo.svg" class="logo" alt="logo" />
99 + <img src="/Ripple-2s-200px.gif" alt="loading-image" />
100 + </div>
101 + </div>
102 + </div>
103 + <script type="module" src="/src/main.ts"></script>
104 + </body>
105 +</html>
package-lock.json new
+12144
@@ -0,0 +1,12144 @@
1 +{
2 + "name": "pragmatic",
3 + "version": "5.0.0",
4 + "lockfileVersion": 2,
5 + "requires": true,
6 + "packages": {
7 + "": {
8 + "name": "pragmatic",
9 + "version": "5.0.0",
10 + "dependencies": {
11 + "@element-plus/icons-vue": "^2.1.0",
12 + "@fullcalendar/core": "^5.11.4",
13 + "@fullcalendar/daygrid": "^5.11.4",
14 + "@fullcalendar/interaction": "^5.11.4",
15 + "@fullcalendar/list": "^5.11.4",
16 + "@fullcalendar/timegrid": "^5.11.4",
17 + "@fullcalendar/vue3": "^5.11.4",
18 + "@mdi/font": "^7.2.96",
19 + "@vue-leaflet/vue-leaflet": "^0.9.0",
20 + "animate.css": "^4.1.1",
21 + "balloon-css": "^1.2.0",
22 + "chance": "^1.1.11",
23 + "cryptocoins-icons": "^2.9.0",
24 + "dayjs": "^1.11.7",
25 + "detect-browser": "^5.3.0",
26 + "drift-zoom": "^1.5.1",
27 + "echarts": "^5.4.2",
28 + "element-plus": "^2.3.4",
29 + "file-saver": "^2.0.5",
30 + "flag-icon-css": "^4.1.7",
31 + "flex.box": "^3.4.4",
32 + "leaflet": "^1.9.3",
33 + "lodash": "^4.17.21",
34 + "mapbox-gl": "^2.14.1",
35 + "marquee-infinite": "^0.0.4",
36 + "mavon-editor": "^3.0.1",
37 + "papaparse": "^5.4.1",
38 + "pell": "^1.0.6",
39 + "perfect-scrollbar": "^1.5.5",
40 + "pinia": "^2.0.22",
41 + "pinia-plugin-persistedstate": "^2.2.0",
42 + "quill": "^1.3.7",
43 + "tui-grid": "^4.21.9",
44 + "v-click-outside": "^3.2.0",
45 + "v-viewer": "3.0.11",
46 + "vue": "^3.2.47",
47 + "vue-chartkick": "^1.1.0",
48 + "vue-fullscreen": "^3.1.1",
49 + "vue-i18n": "^9.2.2",
50 + "vue-router": "^4.1.6",
51 + "vue-virtual-collection": "^1.5.0",
52 + "vue3-highlightjs": "^1.0.5",
53 + "vue3-tui-grid": "^0.1.51"
54 + },
55 + "devDependencies": {
56 + "@rushstack/eslint-patch": "^1.2.0",
57 + "@types/jsdom": "^21.1.1",
58 + "@types/node": "^18.16.0",
59 + "@vitejs/plugin-vue": "^3.2.0",
60 + "@vue/eslint-config-prettier": "^7.1.0",
61 + "@vue/eslint-config-typescript": "^11.0.2",
62 + "@vue/test-utils": "^2.3.2",
63 + "@vue/tsconfig": "^0.3.2",
64 + "cypress": "^12.10.0",
65 + "eslint": "^8.39.0",
66 + "eslint-plugin-vue": "^9.11.0",
67 + "jsdom": "^21.1.1",
68 + "npm-run-all": "^4.1.5",
69 + "prettier": "^2.8.8",
70 + "sass": "^1.62.0",
71 + "start-server-and-test": "^2.0.0",
72 + "typescript": "~4.9.5",
73 + "url": "^0.11.0",
74 + "vite": "^3.2.6",
75 + "vitest": "^0.23.4",
76 + "vue-tsc": "^1.4.1"
77 + }
78 + },
79 + "node_modules/@babel/parser": {
80 + "version": "7.21.4",
81 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz",
82 + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==",
83 + "bin": {
84 + "parser": "bin/babel-parser.js"
85 + },
86 + "engines": {
87 + "node": ">=6.0.0"
88 + }
89 + },
90 + "node_modules/@colors/colors": {
91 + "version": "1.5.0",
92 + "dev": true,
93 + "license": "MIT",
94 + "optional": true,
95 + "engines": {
96 + "node": ">=0.1.90"
97 + }
98 + },
99 + "node_modules/@ctrl/tinycolor": {
100 + "version": "3.4.1",
101 + "license": "MIT",
102 + "engines": {
103 + "node": ">=10"
104 + }
105 + },
106 + "node_modules/@cypress/request": {
107 + "version": "2.88.10",
108 + "dev": true,
109 + "license": "Apache-2.0",
110 + "dependencies": {
111 + "aws-sign2": "~0.7.0",
112 + "aws4": "^1.8.0",
113 + "caseless": "~0.12.0",
114 + "combined-stream": "~1.0.6",
115 + "extend": "~3.0.2",
116 + "forever-agent": "~0.6.1",
117 + "form-data": "~2.3.2",
118 + "http-signature": "~1.3.6",
119 + "is-typedarray": "~1.0.0",
120 + "isstream": "~0.1.2",
121 + "json-stringify-safe": "~5.0.1",
122 + "mime-types": "~2.1.19",
123 + "performance-now": "^2.1.0",
124 + "qs": "~6.5.2",
125 + "safe-buffer": "^5.1.2",
126 + "tough-cookie": "~2.5.0",
127 + "tunnel-agent": "^0.6.0",
128 + "uuid": "^8.3.2"
129 + },
130 + "engines": {
131 + "node": ">= 6"
132 + }
133 + },
134 + "node_modules/@cypress/xvfb": {
135 + "version": "1.2.4",
136 + "dev": true,
137 + "license": "MIT",
138 + "dependencies": {
139 + "debug": "^3.1.0",
140 + "lodash.once": "^4.1.1"
141 + }
142 + },
143 + "node_modules/@cypress/xvfb/node_modules/debug": {
144 + "version": "3.2.7",
145 + "dev": true,
146 + "license": "MIT",
147 + "dependencies": {
148 + "ms": "^2.1.1"
149 + }
150 + },
151 + "node_modules/@element-plus/icons-vue": {
152 + "version": "2.1.0",
153 + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz",
154 + "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==",
155 + "peerDependencies": {
156 + "vue": "^3.2.0"
157 + }
158 + },
159 + "node_modules/@esbuild/android-arm": {
160 + "version": "0.15.18",
161 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
162 + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
163 + "cpu": [
164 + "arm"
165 + ],
166 + "dev": true,
167 + "optional": true,
168 + "os": [
169 + "android"
170 + ],
171 + "engines": {
172 + "node": ">=12"
173 + }
174 + },
175 + "node_modules/@esbuild/linux-loong64": {
176 + "version": "0.15.18",
177 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
178 + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
179 + "cpu": [
180 + "loong64"
181 + ],
182 + "dev": true,
183 + "optional": true,
184 + "os": [
185 + "linux"
186 + ],
187 + "engines": {
188 + "node": ">=12"
189 + }
190 + },
191 + "node_modules/@eslint-community/eslint-utils": {
192 + "version": "4.4.0",
193 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
194 + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
195 + "dev": true,
196 + "dependencies": {
197 + "eslint-visitor-keys": "^3.3.0"
198 + },
199 + "engines": {
200 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
201 + },
202 + "peerDependencies": {
203 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
204 + }
205 + },
206 + "node_modules/@eslint-community/regexpp": {
207 + "version": "4.5.0",
208 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz",
209 + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==",
210 + "dev": true,
211 + "engines": {
212 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
213 + }
214 + },
215 + "node_modules/@eslint/eslintrc": {
216 + "version": "2.0.2",
217 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
218 + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
219 + "dev": true,
220 + "dependencies": {
221 + "ajv": "^6.12.4",
222 + "debug": "^4.3.2",
223 + "espree": "^9.5.1",
224 + "globals": "^13.19.0",
225 + "ignore": "^5.2.0",
226 + "import-fresh": "^3.2.1",
227 + "js-yaml": "^4.1.0",
228 + "minimatch": "^3.1.2",
229 + "strip-json-comments": "^3.1.1"
230 + },
231 + "engines": {
232 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
233 + },
234 + "funding": {
235 + "url": "https://opencollective.com/eslint"
236 + }
237 + },
238 + "node_modules/@eslint/js": {
239 + "version": "8.39.0",
240 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz",
241 + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==",
242 + "dev": true,
243 + "engines": {
244 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
245 + }
246 + },
247 + "node_modules/@floating-ui/core": {
248 + "version": "1.0.1",
249 + "license": "MIT"
250 + },
251 + "node_modules/@floating-ui/dom": {
252 + "version": "1.0.1",
253 + "license": "MIT",
254 + "dependencies": {
255 + "@floating-ui/core": "^1.0.1"
256 + }
257 + },
258 + "node_modules/@fullcalendar/common": {
259 + "version": "5.11.4",
260 + "resolved": "https://registry.npmjs.org/@fullcalendar/common/-/common-5.11.4.tgz",
261 + "integrity": "sha512-wjy+EZgZIPWq1Z5qeB/pV2dmsXwzTJ2teNh5bjlVeHsvDYwERXSZEG2CdoF/NCTJaYeQY93xu1cj9Jw/0KXywA==",
262 + "dependencies": {
263 + "tslib": "^2.1.0"
264 + }
265 + },
266 + "node_modules/@fullcalendar/core": {
267 + "version": "5.11.4",
268 + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-5.11.4.tgz",
269 + "integrity": "sha512-p1/GRIageomlyJpsMVi+Ig5TNo9t2sEYsLHe6zvtCLtpXK/l03veZukYyM/jou8VzT0VJp1f7yN8irc5VBgqxw==",
270 + "dependencies": {
271 + "@fullcalendar/common": "~5.11.4",
272 + "preact": "^10.0.5",
273 + "tslib": "^2.1.0"
274 + }
275 + },
276 + "node_modules/@fullcalendar/daygrid": {
277 + "version": "5.11.4",
278 + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-5.11.4.tgz",
279 + "integrity": "sha512-M/pSrxgrtG5vDkOxqTgv6WrptrsXjp5QgQLyXantSy+9EuZOagPKJDh+HEU94DKUAc0mlXS6iDdf0WzjkTHe6A==",
280 + "dependencies": {
281 + "@fullcalendar/common": "~5.11.4",
282 + "tslib": "^2.1.0"
283 + }
284 + },
285 + "node_modules/@fullcalendar/interaction": {
286 + "version": "5.11.4",
287 + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-5.11.4.tgz",
288 + "integrity": "sha512-AP04uFi3pRtPq83xvLCR1bjBKIf6r1PJDiT2Yz7yDK8Ax3fUUKbAi96V6QgMs8SPNTWkKmBIL8NL60QiI9oWQA==",
289 + "dependencies": {
290 + "@fullcalendar/common": "~5.11.4",
291 + "tslib": "^2.1.0"
292 + }
293 + },
294 + "node_modules/@fullcalendar/list": {
295 + "version": "5.11.4",
296 + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-5.11.4.tgz",
297 + "integrity": "sha512-GA1nUx9rvZcwwcQFBmTnxX0M7s7ywRCPsx/WWsBqxnkTYSufNMXp1hXyZo9o/K5MlqzcKalBOEz16HSlckZB9w==",
298 + "dependencies": {
299 + "@fullcalendar/common": "~5.11.4",
300 + "tslib": "^2.1.0"
301 + }
302 + },
303 + "node_modules/@fullcalendar/timegrid": {
304 + "version": "5.11.4",
305 + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-5.11.4.tgz",
306 + "integrity": "sha512-Ks9Kuiwf+JBqrN5qjC8Gy3ngLWIdbCQYISpYuREPvwMRnXxAmoYKvnkgkxoxde1X5w6X61CaT3sSYZQv9xJqVw==",
307 + "dependencies": {
308 + "@fullcalendar/common": "~5.11.4",
309 + "@fullcalendar/daygrid": "~5.11.4",
310 + "tslib": "^2.1.0"
311 + }
312 + },
313 + "node_modules/@fullcalendar/vue3": {
314 + "version": "5.11.4",
315 + "resolved": "https://registry.npmjs.org/@fullcalendar/vue3/-/vue3-5.11.4.tgz",
316 + "integrity": "sha512-60N23LArG8YWTr7N3dyPo7eNix8Un71zRkDKKqZa2l6ficLUfPSzmIiZN9UqtWxbKkfzNel/cdttdjDM6it8Cg==",
317 + "dependencies": {
318 + "@fullcalendar/core": "~5.11.4",
319 + "tslib": "^2.1.0"
320 + },
321 + "peerDependencies": {
322 + "vue": "^3.0.11"
323 + }
324 + },
325 + "node_modules/@hapi/hoek": {
326 + "version": "9.3.0",
327 + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
328 + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
329 + "dev": true
330 + },
331 + "node_modules/@hapi/topo": {
332 + "version": "5.1.0",
333 + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
334 + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
335 + "dev": true,
336 + "dependencies": {
337 + "@hapi/hoek": "^9.0.0"
338 + }
339 + },
340 + "node_modules/@humanwhocodes/config-array": {
341 + "version": "0.11.8",
342 + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
343 + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
344 + "dev": true,
345 + "dependencies": {
346 + "@humanwhocodes/object-schema": "^1.2.1",
347 + "debug": "^4.1.1",
348 + "minimatch": "^3.0.5"
349 + },
350 + "engines": {
351 + "node": ">=10.10.0"
352 + }
353 + },
354 + "node_modules/@humanwhocodes/module-importer": {
355 + "version": "1.0.1",
356 + "dev": true,
357 + "license": "Apache-2.0",
358 + "engines": {
359 + "node": ">=12.22"
360 + },
361 + "funding": {
362 + "type": "github",
363 + "url": "https://github.com/sponsors/nzakas"
364 + }
365 + },
366 + "node_modules/@humanwhocodes/object-schema": {
367 + "version": "1.2.1",
368 + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
369 + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
370 + "dev": true
371 + },
372 + "node_modules/@intlify/core-base": {
373 + "version": "9.2.2",
374 + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz",
375 + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==",
376 + "dependencies": {
377 + "@intlify/devtools-if": "9.2.2",
378 + "@intlify/message-compiler": "9.2.2",
379 + "@intlify/shared": "9.2.2",
380 + "@intlify/vue-devtools": "9.2.2"
381 + },
382 + "engines": {
383 + "node": ">= 14"
384 + }
385 + },
386 + "node_modules/@intlify/devtools-if": {
387 + "version": "9.2.2",
388 + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz",
389 + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==",
390 + "dependencies": {
391 + "@intlify/shared": "9.2.2"
392 + },
393 + "engines": {
394 + "node": ">= 14"
395 + }
396 + },
397 + "node_modules/@intlify/message-compiler": {
398 + "version": "9.2.2",
399 + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz",
400 + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==",
401 + "dependencies": {
402 + "@intlify/shared": "9.2.2",
403 + "source-map": "0.6.1"
404 + },
405 + "engines": {
406 + "node": ">= 14"
407 + }
408 + },
409 + "node_modules/@intlify/shared": {
410 + "version": "9.2.2",
411 + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz",
412 + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==",
413 + "engines": {
414 + "node": ">= 14"
415 + }
416 + },
417 + "node_modules/@intlify/vue-devtools": {
418 + "version": "9.2.2",
419 + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz",
420 + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==",
421 + "dependencies": {
422 + "@intlify/core-base": "9.2.2",
423 + "@intlify/shared": "9.2.2"
424 + },
425 + "engines": {
426 + "node": ">= 14"
427 + }
428 + },
429 + "node_modules/@jridgewell/gen-mapping": {
430 + "version": "0.3.2",
431 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
432 + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
433 + "dev": true,
434 + "optional": true,
435 + "peer": true,
436 + "dependencies": {
437 + "@jridgewell/set-array": "^1.0.1",
438 + "@jridgewell/sourcemap-codec": "^1.4.10",
439 + "@jridgewell/trace-mapping": "^0.3.9"
440 + },
441 + "engines": {
442 + "node": ">=6.0.0"
443 + }
444 + },
445 + "node_modules/@jridgewell/resolve-uri": {
446 + "version": "3.1.0",
447 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
448 + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
449 + "dev": true,
450 + "optional": true,
451 + "peer": true,
452 + "engines": {
453 + "node": ">=6.0.0"
454 + }
455 + },
456 + "node_modules/@jridgewell/set-array": {
457 + "version": "1.1.2",
458 + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
459 + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
460 + "dev": true,
461 + "optional": true,
462 + "peer": true,
463 + "engines": {
464 + "node": ">=6.0.0"
465 + }
466 + },
467 + "node_modules/@jridgewell/source-map": {
468 + "version": "0.3.2",
469 + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
470 + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
471 + "dev": true,
472 + "optional": true,
473 + "peer": true,
474 + "dependencies": {
475 + "@jridgewell/gen-mapping": "^0.3.0",
476 + "@jridgewell/trace-mapping": "^0.3.9"
477 + }
478 + },
479 + "node_modules/@jridgewell/sourcemap-codec": {
480 + "version": "1.4.14",
481 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
482 + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
483 + "dev": true,
484 + "optional": true,
485 + "peer": true
486 + },
487 + "node_modules/@jridgewell/trace-mapping": {
488 + "version": "0.3.15",
489 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
490 + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
491 + "dev": true,
492 + "optional": true,
493 + "peer": true,
494 + "dependencies": {
495 + "@jridgewell/resolve-uri": "^3.0.3",
496 + "@jridgewell/sourcemap-codec": "^1.4.10"
497 + }
498 + },
499 + "node_modules/@mapbox/geojson-rewind": {
500 + "version": "0.5.2",
501 + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz",
502 + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==",
503 + "dependencies": {
504 + "get-stream": "^6.0.1",
505 + "minimist": "^1.2.6"
506 + },
507 + "bin": {
508 + "geojson-rewind": "geojson-rewind"
509 + }
510 + },
511 + "node_modules/@mapbox/geojson-rewind/node_modules/get-stream": {
512 + "version": "6.0.1",
513 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
514 + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
515 + "engines": {
516 + "node": ">=10"
517 + },
518 + "funding": {
519 + "url": "https://github.com/sponsors/sindresorhus"
520 + }
521 + },
522 + "node_modules/@mapbox/jsonlint-lines-primitives": {
523 + "version": "2.0.2",
524 + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
525 + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==",
526 + "engines": {
527 + "node": ">= 0.6"
528 + }
529 + },
530 + "node_modules/@mapbox/mapbox-gl-supported": {
531 + "version": "2.0.1",
532 + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-2.0.1.tgz",
533 + "integrity": "sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ=="
534 + },
535 + "node_modules/@mapbox/point-geometry": {
536 + "version": "0.1.0",
537 + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
538 + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ=="
539 + },
540 + "node_modules/@mapbox/tiny-sdf": {
541 + "version": "2.0.6",
542 + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz",
543 + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA=="
544 + },
545 + "node_modules/@mapbox/unitbezier": {
546 + "version": "0.0.1",
547 + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz",
548 + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw=="
549 + },
550 + "node_modules/@mapbox/vector-tile": {
551 + "version": "1.3.1",
552 + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz",
553 + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==",
554 + "dependencies": {
555 + "@mapbox/point-geometry": "~0.1.0"
556 + }
557 + },
558 + "node_modules/@mapbox/whoots-js": {
559 + "version": "3.1.0",
560 + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz",
561 + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==",
562 + "engines": {
563 + "node": ">=6.0.0"
564 + }
565 + },
566 + "node_modules/@mdi/font": {
567 + "version": "7.2.96",
568 + "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.2.96.tgz",
569 + "integrity": "sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w=="
570 + },
571 + "node_modules/@nodelib/fs.scandir": {
572 + "version": "2.1.5",
573 + "dev": true,
574 + "license": "MIT",
575 + "dependencies": {
576 + "@nodelib/fs.stat": "2.0.5",
577 + "run-parallel": "^1.1.9"
578 + },
579 + "engines": {
580 + "node": ">= 8"
581 + }
582 + },
583 + "node_modules/@nodelib/fs.stat": {
584 + "version": "2.0.5",
585 + "dev": true,
586 + "license": "MIT",
587 + "engines": {
588 + "node": ">= 8"
589 + }
590 + },
591 + "node_modules/@nodelib/fs.walk": {
592 + "version": "1.2.8",
593 + "dev": true,
594 + "license": "MIT",
595 + "dependencies": {
596 + "@nodelib/fs.scandir": "2.1.5",
597 + "fastq": "^1.6.0"
598 + },
599 + "engines": {
600 + "node": ">= 8"
601 + }
602 + },
603 + "node_modules/@popperjs/core": {
604 + "name": "@sxzz/popperjs-es",
605 + "version": "2.11.7",
606 + "license": "MIT",
607 + "funding": {
608 + "type": "opencollective",
609 + "url": "https://opencollective.com/popperjs"
610 + }
611 + },
612 + "node_modules/@rushstack/eslint-patch": {
613 + "version": "1.2.0",
614 + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz",
615 + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==",
616 + "dev": true
617 + },
618 + "node_modules/@sideway/address": {
619 + "version": "4.1.4",
620 + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
621 + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
622 + "dev": true,
623 + "dependencies": {
624 + "@hapi/hoek": "^9.0.0"
625 + }
626 + },
627 + "node_modules/@sideway/formula": {
628 + "version": "3.0.1",
629 + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
630 + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
631 + "dev": true
632 + },
633 + "node_modules/@sideway/pinpoint": {
634 + "version": "2.0.0",
635 + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
636 + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
637 + "dev": true
638 + },
639 + "node_modules/@tootallnate/once": {
640 + "version": "2.0.0",
641 + "dev": true,
642 + "license": "MIT",
643 + "engines": {
644 + "node": ">= 10"
645 + }
646 + },
647 + "node_modules/@types/chai": {
648 + "version": "4.3.3",
649 + "dev": true,
650 + "license": "MIT"
651 + },
652 + "node_modules/@types/chai-subset": {
653 + "version": "1.3.3",
654 + "dev": true,
655 + "license": "MIT",
656 + "dependencies": {
657 + "@types/chai": "*"
658 + }
659 + },
660 + "node_modules/@types/geojson": {
661 + "version": "7946.0.10",
662 + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
663 + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==",
664 + "optional": true,
665 + "peer": true
666 + },
667 + "node_modules/@types/jsdom": {
668 + "version": "21.1.1",
669 + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.1.tgz",
670 + "integrity": "sha512-cZFuoVLtzKP3gmq9eNosUL1R50U+USkbLtUQ1bYVgl/lKp0FZM7Cq4aIHAL8oIvQ17uSHi7jXPtfDOdjPwBE7A==",
671 + "dev": true,
672 + "dependencies": {
673 + "@types/node": "*",
674 + "@types/tough-cookie": "*",
675 + "parse5": "^7.0.0"
676 + }
677 + },
678 + "node_modules/@types/json-schema": {
679 + "version": "7.0.11",
680 + "dev": true,
681 + "license": "MIT"
682 + },
683 + "node_modules/@types/leaflet": {
684 + "version": "1.7.11",
685 + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.11.tgz",
686 + "integrity": "sha512-VwAYom2pfIAf/pLj1VR5aLltd4tOtHyvfaJlNYCoejzP2nu52PrMi1ehsLRMUS+bgafmIIKBV1cMfKeS+uJ0Vg==",
687 + "optional": true,
688 + "peer": true,
689 + "dependencies": {
690 + "@types/geojson": "*"
691 + }
692 + },
693 + "node_modules/@types/lodash": {
694 + "version": "4.14.184",
695 + "license": "MIT"
696 + },
697 + "node_modules/@types/lodash-es": {
698 + "version": "4.17.6",
699 + "license": "MIT",
700 + "dependencies": {
701 + "@types/lodash": "*"
702 + }
703 + },
704 + "node_modules/@types/node": {
705 + "version": "18.16.0",
706 + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz",
707 + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==",
708 + "dev": true
709 + },
710 + "node_modules/@types/sinonjs__fake-timers": {
711 + "version": "8.1.1",
712 + "dev": true,
713 + "license": "MIT"
714 + },
715 + "node_modules/@types/sizzle": {
716 + "version": "2.3.3",
717 + "dev": true,
718 + "license": "MIT"
719 + },
720 + "node_modules/@types/tough-cookie": {
721 + "version": "4.0.2",
722 + "dev": true,
723 + "license": "MIT"
724 + },
725 + "node_modules/@types/web-bluetooth": {
726 + "version": "0.0.15",
727 + "license": "MIT"
728 + },
729 + "node_modules/@types/yauzl": {
730 + "version": "2.10.0",
731 + "dev": true,
732 + "license": "MIT",
733 + "optional": true,
734 + "dependencies": {
735 + "@types/node": "*"
736 + }
737 + },
738 + "node_modules/@typescript-eslint/eslint-plugin": {
739 + "version": "5.36.1",
740 + "dev": true,
741 + "license": "MIT",
742 + "dependencies": {
743 + "@typescript-eslint/scope-manager": "5.36.1",
744 + "@typescript-eslint/type-utils": "5.36.1",
745 + "@typescript-eslint/utils": "5.36.1",
746 + "debug": "^4.3.4",
747 + "functional-red-black-tree": "^1.0.1",
748 + "ignore": "^5.2.0",
749 + "regexpp": "^3.2.0",
750 + "semver": "^7.3.7",
751 + "tsutils": "^3.21.0"
752 + },
753 + "engines": {
754 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
755 + },
756 + "funding": {
757 + "type": "opencollective",
758 + "url": "https://opencollective.com/typescript-eslint"
759 + },
760 + "peerDependencies": {
761 + "@typescript-eslint/parser": "^5.0.0",
762 + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
763 + },
764 + "peerDependenciesMeta": {
765 + "typescript": {
766 + "optional": true
767 + }
768 + }
769 + },
770 + "node_modules/@typescript-eslint/parser": {
771 + "version": "5.36.1",
772 + "dev": true,
773 + "license": "BSD-2-Clause",
774 + "dependencies": {
775 + "@typescript-eslint/scope-manager": "5.36.1",
776 + "@typescript-eslint/types": "5.36.1",
777 + "@typescript-eslint/typescript-estree": "5.36.1",
778 + "debug": "^4.3.4"
779 + },
780 + "engines": {
781 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
782 + },
783 + "funding": {
784 + "type": "opencollective",
785 + "url": "https://opencollective.com/typescript-eslint"
786 + },
787 + "peerDependencies": {
788 + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
789 + },
790 + "peerDependenciesMeta": {
791 + "typescript": {
792 + "optional": true
793 + }
794 + }
795 + },
796 + "node_modules/@typescript-eslint/scope-manager": {
797 + "version": "5.36.1",
798 + "dev": true,
799 + "license": "MIT",
800 + "dependencies": {
801 + "@typescript-eslint/types": "5.36.1",
802 + "@typescript-eslint/visitor-keys": "5.36.1"
803 + },
804 + "engines": {
805 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
806 + },
807 + "funding": {
808 + "type": "opencollective",
809 + "url": "https://opencollective.com/typescript-eslint"
810 + }
811 + },
812 + "node_modules/@typescript-eslint/type-utils": {
813 + "version": "5.36.1",
814 + "dev": true,
815 + "license": "MIT",
816 + "dependencies": {
817 + "@typescript-eslint/typescript-estree": "5.36.1",
818 + "@typescript-eslint/utils": "5.36.1",
819 + "debug": "^4.3.4",
820 + "tsutils": "^3.21.0"
821 + },
822 + "engines": {
823 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
824 + },
825 + "funding": {
826 + "type": "opencollective",
827 + "url": "https://opencollective.com/typescript-eslint"
828 + },
829 + "peerDependencies": {
830 + "eslint": "*"
831 + },
832 + "peerDependenciesMeta": {
833 + "typescript": {
834 + "optional": true
835 + }
836 + }
837 + },
838 + "node_modules/@typescript-eslint/types": {
839 + "version": "5.36.1",
840 + "dev": true,
841 + "license": "MIT",
842 + "engines": {
843 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
844 + },
845 + "funding": {
846 + "type": "opencollective",
847 + "url": "https://opencollective.com/typescript-eslint"
848 + }
849 + },
850 + "node_modules/@typescript-eslint/typescript-estree": {
851 + "version": "5.36.1",
852 + "dev": true,
853 + "license": "BSD-2-Clause",
854 + "dependencies": {
855 + "@typescript-eslint/types": "5.36.1",
856 + "@typescript-eslint/visitor-keys": "5.36.1",
857 + "debug": "^4.3.4",
858 + "globby": "^11.1.0",
859 + "is-glob": "^4.0.3",
860 + "semver": "^7.3.7",
861 + "tsutils": "^3.21.0"
862 + },
863 + "engines": {
864 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
865 + },
866 + "funding": {
867 + "type": "opencollective",
868 + "url": "https://opencollective.com/typescript-eslint"
869 + },
870 + "peerDependenciesMeta": {
871 + "typescript": {
872 + "optional": true
873 + }
874 + }
875 + },
876 + "node_modules/@typescript-eslint/utils": {
877 + "version": "5.36.1",
878 + "dev": true,
879 + "license": "MIT",
880 + "dependencies": {
881 + "@types/json-schema": "^7.0.9",
882 + "@typescript-eslint/scope-manager": "5.36.1",
883 + "@typescript-eslint/types": "5.36.1",
884 + "@typescript-eslint/typescript-estree": "5.36.1",
885 + "eslint-scope": "^5.1.1",
886 + "eslint-utils": "^3.0.0"
887 + },
888 + "engines": {
889 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
890 + },
891 + "funding": {
892 + "type": "opencollective",
893 + "url": "https://opencollective.com/typescript-eslint"
894 + },
895 + "peerDependencies": {
896 + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
897 + }
898 + },
899 + "node_modules/@typescript-eslint/visitor-keys": {
900 + "version": "5.36.1",
901 + "dev": true,
902 + "license": "MIT",
903 + "dependencies": {
904 + "@typescript-eslint/types": "5.36.1",
905 + "eslint-visitor-keys": "^3.3.0"
906 + },
907 + "engines": {
908 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
909 + },
910 + "funding": {
911 + "type": "opencollective",
912 + "url": "https://opencollective.com/typescript-eslint"
913 + }
914 + },
915 + "node_modules/@vitejs/plugin-vue": {
916 + "version": "3.2.0",
917 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz",
918 + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==",
919 + "dev": true,
920 + "engines": {
921 + "node": "^14.18.0 || >=16.0.0"
922 + },
923 + "peerDependencies": {
924 + "vite": "^3.0.0",
925 + "vue": "^3.2.25"
926 + }
927 + },
928 + "node_modules/@volar/language-core": {
929 + "version": "1.4.0",
930 + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.4.0.tgz",
931 + "integrity": "sha512-zZg771L/v4MCPwM1KJxvnQ3q3QgbGJtEytivqf+PsxPr0kQ7XtwB1J30dd+YSGN869pXXZ0V6vWdHkDpWC8F3A==",
932 + "dev": true,
933 + "dependencies": {
934 + "@volar/source-map": "1.4.0"
935 + }
936 + },
937 + "node_modules/@volar/source-map": {
938 + "version": "1.4.0",
939 + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.4.0.tgz",
940 + "integrity": "sha512-gkV8ol9qtP7aMdgijc8a5Yoxxoo90TT55YCi9bsMbKxEUDsOAnlciFNlijR9Ebe42d67GV3w15/RzjveTRNGBw==",
941 + "dev": true,
942 + "dependencies": {
943 + "muggle-string": "^0.2.2"
944 + }
945 + },
946 + "node_modules/@volar/typescript": {
947 + "version": "1.4.0",
948 + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.4.0.tgz",
949 + "integrity": "sha512-r6OMHj/LeS86iQy3LEjjS+qpmHr9I7BiH8gAwp9WEJP76FHlMPi/EPDQxhf3VcMQ/w6Pi5aBczqI+I3akr9t4g==",
950 + "dev": true,
951 + "dependencies": {
952 + "@volar/language-core": "1.4.0"
953 + },
954 + "peerDependencies": {
955 + "typescript": "*"
956 + }
957 + },
958 + "node_modules/@volar/vue-language-core": {
959 + "version": "1.4.1",
960 + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.4.1.tgz",
961 + "integrity": "sha512-BMfOUhrJ/2E6hwvY6tVq8FCAFCdh7QTscLNuwU71qr2wjxMytMQfrlSZI4fkIhuMt52anKGnps/Uk6wOL0JSgw==",
962 + "dev": true,
963 + "dependencies": {
964 + "@volar/language-core": "1.4.0",
965 + "@volar/source-map": "1.4.0",
966 + "@vue/compiler-dom": "^3.2.0",
967 + "@vue/compiler-sfc": "^3.2.0",
968 + "@vue/reactivity": "^3.2.0",
969 + "@vue/shared": "^3.2.0",
970 + "minimatch": "^9.0.0",
971 + "muggle-string": "^0.2.2",
972 + "vue-template-compiler": "^2.7.14"
973 + }
974 + },
975 + "node_modules/@volar/vue-language-core/node_modules/brace-expansion": {
976 + "version": "2.0.1",
977 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
978 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
979 + "dev": true,
980 + "dependencies": {
981 + "balanced-match": "^1.0.0"
982 + }
983 + },
984 + "node_modules/@volar/vue-language-core/node_modules/minimatch": {
985 + "version": "9.0.0",
986 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz",
987 + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==",
988 + "dev": true,
989 + "dependencies": {
990 + "brace-expansion": "^2.0.1"
991 + },
992 + "engines": {
993 + "node": ">=16 || 14 >=14.17"
994 + },
995 + "funding": {
996 + "url": "https://github.com/sponsors/isaacs"
997 + }
998 + },
999 + "node_modules/@volar/vue-typescript": {
1000 + "version": "1.4.1",
1001 + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.4.1.tgz",
1002 + "integrity": "sha512-jqmubPrJLlT49gEkNwHDHyY5BI4Focp7c+KCCJDPMKQV8QhWdOrxU7p1pMWmPdqqmX+4dgJI6Lt+JxJ4lg5mWA==",
1003 + "dev": true,
1004 + "dependencies": {
1005 + "@volar/typescript": "1.4.0",
1006 + "@volar/vue-language-core": "1.4.1"
1007 + }
1008 + },
1009 + "node_modules/@vue-leaflet/vue-leaflet": {
1010 + "version": "0.9.0",
1011 + "resolved": "https://registry.npmjs.org/@vue-leaflet/vue-leaflet/-/vue-leaflet-0.9.0.tgz",
1012 + "integrity": "sha512-B5sxleSIFP0RK+7418BQirZ7oXa0t2dZrwfGI/0ABgaFLCWmHWP26w4soqrF5MlpThvhieAIUVIVuTdgXUenmA==",
1013 + "dependencies": {
1014 + "vue": "^3.2.25"
1015 + },
1016 + "peerDependencies": {
1017 + "@types/leaflet": "^1.5.7",
1018 + "leaflet": "^1.6.0"
1019 + },
1020 + "peerDependenciesMeta": {
1021 + "@types/leaflet": {
1022 + "optional": true
1023 + }
1024 + }
1025 + },
1026 + "node_modules/@vue/compiler-core": {
1027 + "version": "3.2.47",
1028 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
1029 + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
1030 + "dependencies": {
1031 + "@babel/parser": "^7.16.4",
1032 + "@vue/shared": "3.2.47",
1033 + "estree-walker": "^2.0.2",
1034 + "source-map": "^0.6.1"
1035 + }
1036 + },
1037 + "node_modules/@vue/compiler-dom": {
1038 + "version": "3.2.47",
1039 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
1040 + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
1041 + "dependencies": {
1042 + "@vue/compiler-core": "3.2.47",
1043 + "@vue/shared": "3.2.47"
1044 + }
1045 + },
1046 + "node_modules/@vue/compiler-sfc": {
1047 + "version": "3.2.47",
1048 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
1049 + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
1050 + "dependencies": {
1051 + "@babel/parser": "^7.16.4",
1052 + "@vue/compiler-core": "3.2.47",
1053 + "@vue/compiler-dom": "3.2.47",
1054 + "@vue/compiler-ssr": "3.2.47",
1055 + "@vue/reactivity-transform": "3.2.47",
1056 + "@vue/shared": "3.2.47",
1057 + "estree-walker": "^2.0.2",
1058 + "magic-string": "^0.25.7",
1059 + "postcss": "^8.1.10",
1060 + "source-map": "^0.6.1"
1061 + }
1062 + },
1063 + "node_modules/@vue/compiler-ssr": {
1064 + "version": "3.2.47",
1065 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
1066 + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
1067 + "dependencies": {
1068 + "@vue/compiler-dom": "3.2.47",
1069 + "@vue/shared": "3.2.47"
1070 + }
1071 + },
1072 + "node_modules/@vue/devtools-api": {
1073 + "version": "6.5.0",
1074 + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
1075 + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
1076 + },
1077 + "node_modules/@vue/eslint-config-prettier": {
1078 + "version": "7.1.0",
1079 + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz",
1080 + "integrity": "sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==",
1081 + "dev": true,
1082 + "dependencies": {
1083 + "eslint-config-prettier": "^8.3.0",
1084 + "eslint-plugin-prettier": "^4.0.0"
1085 + },
1086 + "peerDependencies": {
1087 + "eslint": ">= 7.28.0",
1088 + "prettier": ">= 2.0.0"
1089 + }
1090 + },
1091 + "node_modules/@vue/eslint-config-typescript": {
1092 + "version": "11.0.2",
1093 + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.2.tgz",
1094 + "integrity": "sha512-EiKud1NqlWmSapBFkeSrE994qpKx7/27uCGnhdqzllYDpQZroyX/O6bwjEpeuyKamvLbsGdO6PMR2faIf+zFnw==",
1095 + "dev": true,
1096 + "dependencies": {
1097 + "@typescript-eslint/eslint-plugin": "^5.0.0",
1098 + "@typescript-eslint/parser": "^5.0.0",
1099 + "vue-eslint-parser": "^9.0.0"
1100 + },
1101 + "engines": {
1102 + "node": "^14.17.0 || >=16.0.0"
1103 + },
1104 + "peerDependencies": {
1105 + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0",
1106 + "eslint-plugin-vue": "^9.0.0",
1107 + "typescript": "*"
1108 + },
1109 + "peerDependenciesMeta": {
1110 + "typescript": {
1111 + "optional": true
1112 + }
1113 + }
1114 + },
1115 + "node_modules/@vue/reactivity": {
1116 + "version": "3.2.47",
1117 + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz",
1118 + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
1119 + "dependencies": {
1120 + "@vue/shared": "3.2.47"
1121 + }
1122 + },
1123 + "node_modules/@vue/reactivity-transform": {
1124 + "version": "3.2.47",
1125 + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
1126 + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
1127 + "dependencies": {
1128 + "@babel/parser": "^7.16.4",
1129 + "@vue/compiler-core": "3.2.47",
1130 + "@vue/shared": "3.2.47",
1131 + "estree-walker": "^2.0.2",
1132 + "magic-string": "^0.25.7"
1133 + }
1134 + },
1135 + "node_modules/@vue/runtime-core": {
1136 + "version": "3.2.47",
1137 + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
1138 + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
1139 + "dependencies": {
1140 + "@vue/reactivity": "3.2.47",
1141 + "@vue/shared": "3.2.47"
1142 + }
1143 + },
1144 + "node_modules/@vue/runtime-dom": {
1145 + "version": "3.2.47",
1146 + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
1147 + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
1148 + "dependencies": {
1149 + "@vue/runtime-core": "3.2.47",
1150 + "@vue/shared": "3.2.47",
1151 + "csstype": "^2.6.8"
1152 + }
1153 + },
1154 + "node_modules/@vue/server-renderer": {
1155 + "version": "3.2.47",
1156 + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
1157 + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
1158 + "dependencies": {
1159 + "@vue/compiler-ssr": "3.2.47",
1160 + "@vue/shared": "3.2.47"
1161 + },
1162 + "peerDependencies": {
1163 + "vue": "3.2.47"
1164 + }
1165 + },
1166 + "node_modules/@vue/shared": {
1167 + "version": "3.2.47",
1168 + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
1169 + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ=="
1170 + },
1171 + "node_modules/@vue/test-utils": {
1172 + "version": "2.3.2",
1173 + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.3.2.tgz",
1174 + "integrity": "sha512-hJnVaYhbrIm0yBS0+e1Y0Sj85cMyAi+PAbK4JHqMRUZ6S622Goa+G7QzkRSyvCteG8wop7tipuEbHoZo26wsSA==",
1175 + "dev": true,
1176 + "dependencies": {
1177 + "js-beautify": "1.14.6"
1178 + },
1179 + "optionalDependencies": {
1180 + "@vue/compiler-dom": "^3.0.1",
1181 + "@vue/server-renderer": "^3.0.1"
1182 + },
1183 + "peerDependencies": {
1184 + "@vue/compiler-dom": "^3.0.1",
1185 + "@vue/server-renderer": "^3.0.1",
1186 + "vue": "^3.0.1"
1187 + }
1188 + },
1189 + "node_modules/@vue/tsconfig": {
1190 + "version": "0.3.2",
1191 + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.3.2.tgz",
1192 + "integrity": "sha512-jWzZbGyrZAEbHYGn0kPzJ+MMtIkIxb0+hL5+RghBowyOxMRs9jMdp5XvpXz3wgCzjRZiUucy29042HBe9cxoYA==",
1193 + "dev": true
1194 + },
1195 + "node_modules/@vueuse/core": {
1196 + "version": "9.1.1",
1197 + "license": "MIT",
1198 + "dependencies": {
1199 + "@types/web-bluetooth": "^0.0.15",
1200 + "@vueuse/metadata": "9.1.1",
1201 + "@vueuse/shared": "9.1.1",
1202 + "vue-demi": "*"
1203 + },
1204 + "funding": {
1205 + "url": "https://github.com/sponsors/antfu"
1206 + }
1207 + },
1208 + "node_modules/@vueuse/core/node_modules/vue-demi": {
1209 + "version": "0.13.11",
1210 + "hasInstallScript": true,
1211 + "license": "MIT",
1212 + "bin": {
1213 + "vue-demi-fix": "bin/vue-demi-fix.js",
1214 + "vue-demi-switch": "bin/vue-demi-switch.js"
1215 + },
1216 + "engines": {
1217 + "node": ">=12"
1218 + },
1219 + "funding": {
1220 + "url": "https://github.com/sponsors/antfu"
1221 + },
1222 + "peerDependencies": {
1223 + "@vue/composition-api": "^1.0.0-rc.1",
1224 + "vue": "^3.0.0-0 || ^2.6.0"
1225 + },
1226 + "peerDependenciesMeta": {
1227 + "@vue/composition-api": {
1228 + "optional": true
1229 + }
1230 + }
1231 + },
1232 + "node_modules/@vueuse/metadata": {
1233 + "version": "9.1.1",
1234 + "license": "MIT",
1235 + "funding": {
1236 + "url": "https://github.com/sponsors/antfu"
1237 + }
1238 + },
1239 + "node_modules/@vueuse/shared": {
1240 + "version": "9.1.1",
1241 + "license": "MIT",
1242 + "dependencies": {
1243 + "vue-demi": "*"
1244 + },
1245 + "funding": {
1246 + "url": "https://github.com/sponsors/antfu"
1247 + }
1248 + },
1249 + "node_modules/@vueuse/shared/node_modules/vue-demi": {
1250 + "version": "0.13.11",
1251 + "hasInstallScript": true,
1252 + "license": "MIT",
1253 + "bin": {
1254 + "vue-demi-fix": "bin/vue-demi-fix.js",
1255 + "vue-demi-switch": "bin/vue-demi-switch.js"
1256 + },
1257 + "engines": {
1258 + "node": ">=12"
1259 + },
1260 + "funding": {
1261 + "url": "https://github.com/sponsors/antfu"
1262 + },
1263 + "peerDependencies": {
1264 + "@vue/composition-api": "^1.0.0-rc.1",
1265 + "vue": "^3.0.0-0 || ^2.6.0"
1266 + },
1267 + "peerDependenciesMeta": {
1268 + "@vue/composition-api": {
1269 + "optional": true
1270 + }
1271 + }
1272 + },
1273 + "node_modules/abab": {
1274 + "version": "2.0.6",
1275 + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
1276 + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
1277 + "dev": true
1278 + },
1279 + "node_modules/abbrev": {
1280 + "version": "1.1.1",
1281 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1282 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
1283 + "dev": true
1284 + },
1285 + "node_modules/acorn": {
1286 + "version": "8.8.2",
1287 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
1288 + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
1289 + "dev": true,
1290 + "bin": {
1291 + "acorn": "bin/acorn"
1292 + },
1293 + "engines": {
1294 + "node": ">=0.4.0"
1295 + }
1296 + },
1297 + "node_modules/acorn-globals": {
1298 + "version": "7.0.1",
1299 + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
1300 + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
1301 + "dev": true,
1302 + "dependencies": {
1303 + "acorn": "^8.1.0",
1304 + "acorn-walk": "^8.0.2"
1305 + }
1306 + },
1307 + "node_modules/acorn-jsx": {
1308 + "version": "5.3.2",
1309 + "dev": true,
1310 + "license": "MIT",
1311 + "peerDependencies": {
1312 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1313 + }
1314 + },
1315 + "node_modules/acorn-walk": {
1316 + "version": "8.2.0",
1317 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
1318 + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
1319 + "dev": true,
1320 + "engines": {
1321 + "node": ">=0.4.0"
1322 + }
1323 + },
1324 + "node_modules/adler-32": {
1325 + "version": "1.2.0",
1326 + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
1327 + "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
1328 + "dependencies": {
1329 + "exit-on-epipe": "~1.0.1",
1330 + "printj": "~1.1.0"
1331 + },
1332 + "bin": {
1333 + "adler32": "bin/adler32.njs"
1334 + },
1335 + "engines": {
1336 + "node": ">=0.8"
1337 + }
1338 + },
1339 + "node_modules/agent-base": {
1340 + "version": "6.0.2",
1341 + "dev": true,
1342 + "license": "MIT",
1343 + "dependencies": {
1344 + "debug": "4"
1345 + },
1346 + "engines": {
1347 + "node": ">= 6.0.0"
1348 + }
1349 + },
1350 + "node_modules/aggregate-error": {
1351 + "version": "3.1.0",
1352 + "dev": true,
1353 + "license": "MIT",
1354 + "dependencies": {
1355 + "clean-stack": "^2.0.0",
1356 + "indent-string": "^4.0.0"
1357 + },
1358 + "engines": {
1359 + "node": ">=8"
1360 + }
1361 + },
1362 + "node_modules/ajv": {
1363 + "version": "6.12.6",
1364 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1365 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1366 + "dev": true,
1367 + "dependencies": {
1368 + "fast-deep-equal": "^3.1.1",
1369 + "fast-json-stable-stringify": "^2.0.0",
1370 + "json-schema-traverse": "^0.4.1",
1371 + "uri-js": "^4.2.2"
1372 + },
1373 + "funding": {
1374 + "type": "github",
1375 + "url": "https://github.com/sponsors/epoberezkin"
1376 + }
1377 + },
1378 + "node_modules/animate.css": {
1379 + "version": "4.1.1",
1380 + "license": "MIT"
1381 + },
1382 + "node_modules/ansi-colors": {
1383 + "version": "4.1.3",
1384 + "dev": true,
1385 + "license": "MIT",
1386 + "engines": {
1387 + "node": ">=6"
1388 + }
1389 + },
1390 + "node_modules/ansi-escapes": {
1391 + "version": "4.3.2",
1392 + "dev": true,
1393 + "license": "MIT",
1394 + "dependencies": {
1395 + "type-fest": "^0.21.3"
1396 + },
1397 + "engines": {
1398 + "node": ">=8"
1399 + },
1400 + "funding": {
1401 + "url": "https://github.com/sponsors/sindresorhus"
1402 + }
1403 + },
1404 + "node_modules/ansi-escapes/node_modules/type-fest": {
1405 + "version": "0.21.3",
1406 + "dev": true,
1407 + "license": "(MIT OR CC0-1.0)",
1408 + "engines": {
1409 + "node": ">=10"
1410 + },
1411 + "funding": {
1412 + "url": "https://github.com/sponsors/sindresorhus"
1413 + }
1414 + },
1415 + "node_modules/ansi-regex": {
1416 + "version": "5.0.1",
1417 + "dev": true,
1418 + "license": "MIT",
1419 + "engines": {
1420 + "node": ">=8"
1421 + }
1422 + },
1423 + "node_modules/ansi-styles": {
1424 + "version": "4.3.0",
1425 + "dev": true,
1426 + "license": "MIT",
1427 + "dependencies": {
1428 + "color-convert": "^2.0.1"
1429 + },
1430 + "engines": {
1431 + "node": ">=8"
1432 + },
1433 + "funding": {
1434 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1435 + }
1436 + },
1437 + "node_modules/anymatch": {
1438 + "version": "3.1.2",
1439 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
1440 + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
1441 + "dev": true,
1442 + "dependencies": {
1443 + "normalize-path": "^3.0.0",
1444 + "picomatch": "^2.0.4"
1445 + },
1446 + "engines": {
1447 + "node": ">= 8"
1448 + }
1449 + },
1450 + "node_modules/arch": {
1451 + "version": "2.2.0",
1452 + "dev": true,
1453 + "funding": [
1454 + {
1455 + "type": "github",
1456 + "url": "https://github.com/sponsors/feross"
1457 + },
1458 + {
1459 + "type": "patreon",
1460 + "url": "https://www.patreon.com/feross"
1461 + },
1462 + {
1463 + "type": "consulting",
1464 + "url": "https://feross.org/support"
1465 + }
1466 + ],
1467 + "license": "MIT"
1468 + },
1469 + "node_modules/arg": {
1470 + "version": "5.0.2",
1471 + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1472 + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1473 + "dev": true
1474 + },
1475 + "node_modules/argparse": {
1476 + "version": "2.0.1",
1477 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1478 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1479 + "dev": true
1480 + },
1481 + "node_modules/array-union": {
1482 + "version": "2.1.0",
1483 + "dev": true,
1484 + "license": "MIT",
1485 + "engines": {
1486 + "node": ">=8"
1487 + }
1488 + },
1489 + "node_modules/asn1": {
1490 + "version": "0.2.6",
1491 + "dev": true,
1492 + "license": "MIT",
1493 + "dependencies": {
1494 + "safer-buffer": "~2.1.0"
1495 + }
1496 + },
1497 + "node_modules/assert-plus": {
1498 + "version": "1.0.0",
1499 + "dev": true,
1500 + "license": "MIT",
1501 + "engines": {
1502 + "node": ">=0.8"
1503 + }
1504 + },
1505 + "node_modules/assertion-error": {
1506 + "version": "1.1.0",
1507 + "dev": true,
1508 + "license": "MIT",
1509 + "engines": {
1510 + "node": "*"
1511 + }
1512 + },
1513 + "node_modules/astral-regex": {
1514 + "version": "2.0.0",
1515 + "dev": true,
1516 + "license": "MIT",
1517 + "engines": {
1518 + "node": ">=8"
1519 + }
1520 + },
1521 + "node_modules/async": {
1522 + "version": "3.2.4",
1523 + "dev": true,
1524 + "license": "MIT"
1525 + },
1526 + "node_modules/async-validator": {
1527 + "version": "4.2.5",
1528 + "license": "MIT"
1529 + },
1530 + "node_modules/asynckit": {
1531 + "version": "0.4.0",
1532 + "dev": true,
1533 + "license": "MIT"
1534 + },
1535 + "node_modules/at-least-node": {
1536 + "version": "1.0.0",
1537 + "dev": true,
1538 + "license": "ISC",
1539 + "engines": {
1540 + "node": ">= 4.0.0"
1541 + }
1542 + },
1543 + "node_modules/aws-sign2": {
1544 + "version": "0.7.0",
1545 + "dev": true,
1546 + "license": "Apache-2.0",
1547 + "engines": {
1548 + "node": "*"
1549 + }
1550 + },
1551 + "node_modules/aws4": {
1552 + "version": "1.11.0",
1553 + "dev": true,
1554 + "license": "MIT"
1555 + },
1556 + "node_modules/axios": {
1557 + "version": "0.27.2",
1558 + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
1559 + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
1560 + "dev": true,
1561 + "dependencies": {
1562 + "follow-redirects": "^1.14.9",
1563 + "form-data": "^4.0.0"
1564 + }
1565 + },
1566 + "node_modules/axios/node_modules/form-data": {
1567 + "version": "4.0.0",
1568 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1569 + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1570 + "dev": true,
1571 + "dependencies": {
1572 + "asynckit": "^0.4.0",
1573 + "combined-stream": "^1.0.8",
1574 + "mime-types": "^2.1.12"
1575 + },
1576 + "engines": {
1577 + "node": ">= 6"
1578 + }
1579 + },
1580 + "node_modules/balanced-match": {
1581 + "version": "1.0.2",
1582 + "dev": true,
1583 + "license": "MIT"
1584 + },
1585 + "node_modules/balloon-css": {
1586 + "version": "1.2.0",
1587 + "resolved": "https://registry.npmjs.org/balloon-css/-/balloon-css-1.2.0.tgz",
1588 + "integrity": "sha512-urXwkHgwp6GsXVF+it01485Z2Cj4pnW02ICnM0TemOlkKmCNnDLmyy+ZZiRXBpwldUXO+aRNr7Hdia4CBvXJ5A=="
1589 + },
1590 + "node_modules/base64-js": {
1591 + "version": "1.5.1",
1592 + "dev": true,
1593 + "funding": [
1594 + {
1595 + "type": "github",
1596 + "url": "https://github.com/sponsors/feross"
1597 + },
1598 + {
1599 + "type": "patreon",
1600 + "url": "https://www.patreon.com/feross"
1601 + },
1602 + {
1603 + "type": "consulting",
1604 + "url": "https://feross.org/support"
1605 + }
1606 + ],
1607 + "license": "MIT"
1608 + },
1609 + "node_modules/bcrypt-pbkdf": {
1610 + "version": "1.0.2",
1611 + "dev": true,
1612 + "license": "BSD-3-Clause",
1613 + "dependencies": {
1614 + "tweetnacl": "^0.14.3"
1615 + }
1616 + },
1617 + "node_modules/binary-extensions": {
1618 + "version": "2.2.0",
1619 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
1620 + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
1621 + "dev": true,
1622 + "engines": {
1623 + "node": ">=8"
1624 + }
1625 + },
1626 + "node_modules/blob-util": {
1627 + "version": "2.0.2",
1628 + "dev": true,
1629 + "license": "Apache-2.0"
1630 + },
1631 + "node_modules/bluebird": {
1632 + "version": "3.7.2",
1633 + "dev": true,
1634 + "license": "MIT"
1635 + },
1636 + "node_modules/boolbase": {
1637 + "version": "1.0.0",
1638 + "dev": true,
1639 + "license": "ISC"
1640 + },
1641 + "node_modules/brace-expansion": {
1642 + "version": "1.1.11",
1643 + "dev": true,
1644 + "license": "MIT",
1645 + "dependencies": {
1646 + "balanced-match": "^1.0.0",
1647 + "concat-map": "0.0.1"
1648 + }
1649 + },
1650 + "node_modules/braces": {
1651 + "version": "3.0.2",
1652 + "dev": true,
1653 + "license": "MIT",
1654 + "dependencies": {
1655 + "fill-range": "^7.0.1"
1656 + },
1657 + "engines": {
1658 + "node": ">=8"
1659 + }
1660 + },
1661 + "node_modules/buffer": {
1662 + "version": "5.7.1",
1663 + "dev": true,
1664 + "funding": [
1665 + {
1666 + "type": "github",
1667 + "url": "https://github.com/sponsors/feross"
1668 + },
1669 + {
1670 + "type": "patreon",
1671 + "url": "https://www.patreon.com/feross"
1672 + },
1673 + {
1674 + "type": "consulting",
1675 + "url": "https://feross.org/support"
1676 + }
1677 + ],
1678 + "license": "MIT",
1679 + "dependencies": {
1680 + "base64-js": "^1.3.1",
1681 + "ieee754": "^1.1.13"
1682 + }
1683 + },
1684 + "node_modules/buffer-crc32": {
1685 + "version": "0.2.13",
1686 + "dev": true,
1687 + "license": "MIT",
1688 + "engines": {
1689 + "node": "*"
1690 + }
1691 + },
1692 + "node_modules/buffer-from": {
1693 + "version": "1.1.2",
1694 + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
1695 + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
1696 + "dev": true,
1697 + "optional": true,
1698 + "peer": true
1699 + },
1700 + "node_modules/cachedir": {
1701 + "version": "2.3.0",
1702 + "dev": true,
1703 + "license": "MIT",
1704 + "engines": {
1705 + "node": ">=6"
1706 + }
1707 + },
1708 + "node_modules/call-bind": {
1709 + "version": "1.0.2",
1710 + "license": "MIT",
1711 + "dependencies": {
1712 + "function-bind": "^1.1.1",
1713 + "get-intrinsic": "^1.0.2"
1714 + },
1715 + "funding": {
1716 + "url": "https://github.com/sponsors/ljharb"
1717 + }
1718 + },
1719 + "node_modules/callsites": {
1720 + "version": "3.1.0",
1721 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1722 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1723 + "dev": true,
1724 + "engines": {
1725 + "node": ">=6"
1726 + }
1727 + },
1728 + "node_modules/caseless": {
1729 + "version": "0.12.0",
1730 + "dev": true,
1731 + "license": "Apache-2.0"
1732 + },
1733 + "node_modules/cfb": {
1734 + "version": "1.2.2",
1735 + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz",
1736 + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
1737 + "dependencies": {
1738 + "adler-32": "~1.3.0",
1739 + "crc-32": "~1.2.0"
1740 + },
1741 + "engines": {
1742 + "node": ">=0.8"
1743 + }
1744 + },
1745 + "node_modules/cfb/node_modules/adler-32": {
1746 + "version": "1.3.1",
1747 + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz",
1748 + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
1749 + "engines": {
1750 + "node": ">=0.8"
1751 + }
1752 + },
1753 + "node_modules/chai": {
1754 + "version": "4.3.6",
1755 + "dev": true,
1756 + "license": "MIT",
1757 + "dependencies": {
1758 + "assertion-error": "^1.1.0",
1759 + "check-error": "^1.0.2",
1760 + "deep-eql": "^3.0.1",
1761 + "get-func-name": "^2.0.0",
1762 + "loupe": "^2.3.1",
1763 + "pathval": "^1.1.1",
1764 + "type-detect": "^4.0.5"
1765 + },
1766 + "engines": {
1767 + "node": ">=4"
1768 + }
1769 + },
1770 + "node_modules/chalk": {
1771 + "version": "4.1.2",
1772 + "dev": true,
1773 + "license": "MIT",
1774 + "dependencies": {
1775 + "ansi-styles": "^4.1.0",
1776 + "supports-color": "^7.1.0"
1777 + },
1778 + "engines": {
1779 + "node": ">=10"
1780 + },
1781 + "funding": {
1782 + "url": "https://github.com/chalk/chalk?sponsor=1"
1783 + }
1784 + },
1785 + "node_modules/chalk/node_modules/supports-color": {
1786 + "version": "7.2.0",
1787 + "dev": true,
1788 + "license": "MIT",
1789 + "dependencies": {
1790 + "has-flag": "^4.0.0"
1791 + },
1792 + "engines": {
1793 + "node": ">=8"
1794 + }
1795 + },
1796 + "node_modules/chance": {
1797 + "version": "1.1.11",
1798 + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.11.tgz",
1799 + "integrity": "sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA=="
1800 + },
1801 + "node_modules/chart.js": {
1802 + "version": "3.9.1",
1803 + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz",
1804 + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==",
1805 + "optional": true
1806 + },
1807 + "node_modules/chartjs-adapter-date-fns": {
1808 + "version": "2.0.0",
1809 + "resolved": "https://registry.npmjs.org/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-2.0.0.tgz",
1810 + "integrity": "sha512-rmZINGLe+9IiiEB0kb57vH3UugAtYw33anRiw5kS2Tu87agpetDDoouquycWc9pRsKtQo5j+vLsYHyr8etAvFw==",
1811 + "optional": true,
1812 + "peerDependencies": {
1813 + "chart.js": "^3.0.0"
1814 + }
1815 + },
1816 + "node_modules/chartkick": {
1817 + "version": "4.2.0",
1818 + "resolved": "https://registry.npmjs.org/chartkick/-/chartkick-4.2.0.tgz",
1819 + "integrity": "sha512-7yYZyxeFhOh/LA7gc1VwDFgc6t4ZM9RrbBjgb4dJoFukk2+94QkK0yulYI2OUH1cjcfrf1qmj04FkjZx7kZDeg==",
1820 + "optionalDependencies": {
1821 + "chart.js": ">=3.0.2",
1822 + "chartjs-adapter-date-fns": ">=2.0.0",
1823 + "date-fns": ">=2.0.0"
1824 + }
1825 + },
1826 + "node_modules/check-error": {
1827 + "version": "1.0.2",
1828 + "dev": true,
1829 + "license": "MIT",
1830 + "engines": {
1831 + "node": "*"
1832 + }
1833 + },
1834 + "node_modules/check-more-types": {
1835 + "version": "2.24.0",
1836 + "dev": true,
1837 + "license": "MIT",
1838 + "engines": {
1839 + "node": ">= 0.8.0"
1840 + }
1841 + },
1842 + "node_modules/chokidar": {
1843 + "version": "3.5.3",
1844 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
1845 + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
1846 + "dev": true,
1847 + "funding": [
1848 + {
1849 + "type": "individual",
1850 + "url": "https://paulmillr.com/funding/"
1851 + }
1852 + ],
1853 + "dependencies": {
1854 + "anymatch": "~3.1.2",
1855 + "braces": "~3.0.2",
1856 + "glob-parent": "~5.1.2",
1857 + "is-binary-path": "~2.1.0",
1858 + "is-glob": "~4.0.1",
1859 + "normalize-path": "~3.0.0",
1860 + "readdirp": "~3.6.0"
1861 + },
1862 + "engines": {
1863 + "node": ">= 8.10.0"
1864 + },
1865 + "optionalDependencies": {
1866 + "fsevents": "~2.3.2"
1867 + }
1868 + },
1869 + "node_modules/chokidar/node_modules/glob-parent": {
1870 + "version": "5.1.2",
1871 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1872 + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1873 + "dev": true,
1874 + "dependencies": {
1875 + "is-glob": "^4.0.1"
1876 + },
1877 + "engines": {
1878 + "node": ">= 6"
1879 + }
1880 + },
1881 + "node_modules/ci-info": {
1882 + "version": "3.3.2",
1883 + "dev": true,
1884 + "license": "MIT"
1885 + },
1886 + "node_modules/clean-stack": {
1887 + "version": "2.2.0",
1888 + "dev": true,
1889 + "license": "MIT",
1890 + "engines": {
1891 + "node": ">=6"
1892 + }
1893 + },
1894 + "node_modules/cli-cursor": {
1895 + "version": "3.1.0",
1896 + "dev": true,
1897 + "license": "MIT",
1898 + "dependencies": {
1899 + "restore-cursor": "^3.1.0"
1900 + },
1901 + "engines": {
1902 + "node": ">=8"
1903 + }
1904 + },
1905 + "node_modules/cli-table3": {
1906 + "version": "0.6.2",
1907 + "dev": true,
1908 + "license": "MIT",
1909 + "dependencies": {
1910 + "string-width": "^4.2.0"
1911 + },
1912 + "engines": {
1913 + "node": "10.* || >= 12.*"
1914 + },
1915 + "optionalDependencies": {
1916 + "@colors/colors": "1.5.0"
1917 + }
1918 + },
1919 + "node_modules/cli-truncate": {
1920 + "version": "2.1.0",
1921 + "dev": true,
1922 + "license": "MIT",
1923 + "dependencies": {
1924 + "slice-ansi": "^3.0.0",
1925 + "string-width": "^4.2.0"
1926 + },
1927 + "engines": {
1928 + "node": ">=8"
1929 + },
1930 + "funding": {
1931 + "url": "https://github.com/sponsors/sindresorhus"
1932 + }
1933 + },
1934 + "node_modules/clone": {
1935 + "version": "2.1.2",
1936 + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
1937 + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
1938 + "engines": {
1939 + "node": ">=0.8"
1940 + }
1941 + },
1942 + "node_modules/codepage": {
1943 + "version": "1.15.0",
1944 + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz",
1945 + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
1946 + "engines": {
1947 + "node": ">=0.8"
1948 + }
1949 + },
1950 + "node_modules/color-convert": {
1951 + "version": "2.0.1",
1952 + "dev": true,
1953 + "license": "MIT",
1954 + "dependencies": {
1955 + "color-name": "~1.1.4"
1956 + },
1957 + "engines": {
1958 + "node": ">=7.0.0"
1959 + }
1960 + },
1961 + "node_modules/color-name": {
1962 + "version": "1.1.4",
1963 + "dev": true,
1964 + "license": "MIT"
1965 + },
1966 + "node_modules/colorette": {
1967 + "version": "2.0.19",
1968 + "dev": true,
1969 + "license": "MIT"
1970 + },
1971 + "node_modules/combined-stream": {
1972 + "version": "1.0.8",
1973 + "dev": true,
1974 + "license": "MIT",
1975 + "dependencies": {
1976 + "delayed-stream": "~1.0.0"
1977 + },
1978 + "engines": {
1979 + "node": ">= 0.8"
1980 + }
1981 + },
1982 + "node_modules/commander": {
1983 + "version": "6.2.1",
1984 + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
1985 + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
1986 + "dev": true,
1987 + "engines": {
1988 + "node": ">= 6"
1989 + }
1990 + },
1991 + "node_modules/common-tags": {
1992 + "version": "1.8.2",
1993 + "dev": true,
1994 + "license": "MIT",
1995 + "engines": {
1996 + "node": ">=4.0.0"
1997 + }
1998 + },
1999 + "node_modules/concat-map": {
2000 + "version": "0.0.1",
2001 + "dev": true,
2002 + "license": "MIT"
2003 + },
2004 + "node_modules/config-chain": {
2005 + "version": "1.1.13",
2006 + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
2007 + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
2008 + "dev": true,
2009 + "dependencies": {
2010 + "ini": "^1.3.4",
2011 + "proto-list": "~1.2.1"
2012 + }
2013 + },
2014 + "node_modules/config-chain/node_modules/ini": {
2015 + "version": "1.3.8",
2016 + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
2017 + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
2018 + "dev": true
2019 + },
2020 + "node_modules/core-util-is": {
2021 + "version": "1.0.2",
2022 + "dev": true,
2023 + "license": "MIT"
2024 + },
2025 + "node_modules/crc-32": {
2026 + "version": "1.2.2",
2027 + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
2028 + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
2029 + "bin": {
2030 + "crc32": "bin/crc32.njs"
2031 + },
2032 + "engines": {
2033 + "node": ">=0.8"
2034 + }
2035 + },
2036 + "node_modules/cross-spawn": {
2037 + "version": "7.0.3",
2038 + "dev": true,
2039 + "license": "MIT",
2040 + "dependencies": {
2041 + "path-key": "^3.1.0",
2042 + "shebang-command": "^2.0.0",
2043 + "which": "^2.0.1"
2044 + },
2045 + "engines": {
2046 + "node": ">= 8"
2047 + }
2048 + },
2049 + "node_modules/cryptocoins-icons": {
2050 + "version": "2.9.0",
2051 + "resolved": "https://registry.npmjs.org/cryptocoins-icons/-/cryptocoins-icons-2.9.0.tgz",
2052 + "integrity": "sha512-bfhtws/Hs4YOv7GXrCQfZ9yzgVLqkJsFzgsTFVFBY/D1qPIICQI0UjcoFxea8dlBlwerxNu3Shp0T0ucBLHwng=="
2053 + },
2054 + "node_modules/csscolorparser": {
2055 + "version": "1.0.3",
2056 + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
2057 + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w=="
2058 + },
2059 + "node_modules/cssesc": {
2060 + "version": "3.0.0",
2061 + "dev": true,
2062 + "license": "MIT",
2063 + "bin": {
2064 + "cssesc": "bin/cssesc"
2065 + },
2066 + "engines": {
2067 + "node": ">=4"
2068 + }
2069 + },
2070 + "node_modules/cssfilter": {
2071 + "version": "0.0.10",
2072 + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
2073 + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw=="
2074 + },
2075 + "node_modules/cssstyle": {
2076 + "version": "3.0.0",
2077 + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
2078 + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==",
2079 + "dev": true,
2080 + "dependencies": {
2081 + "rrweb-cssom": "^0.6.0"
2082 + },
2083 + "engines": {
2084 + "node": ">=14"
2085 + }
2086 + },
2087 + "node_modules/csstype": {
2088 + "version": "2.6.21",
2089 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
2090 + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
2091 + },
2092 + "node_modules/cypress": {
2093 + "version": "12.10.0",
2094 + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.10.0.tgz",
2095 + "integrity": "sha512-Y0wPc221xKKW1/4iAFCphkrG2jNR4MjOne3iGn4mcuCaE7Y5EtXL83N8BzRsAht7GYfWVjJ/UeTqEdDKHz39HQ==",
2096 + "dev": true,
2097 + "hasInstallScript": true,
2098 + "dependencies": {
2099 + "@cypress/request": "^2.88.10",
2100 + "@cypress/xvfb": "^1.2.4",
2101 + "@types/node": "^14.14.31",
2102 + "@types/sinonjs__fake-timers": "8.1.1",
2103 + "@types/sizzle": "^2.3.2",
2104 + "arch": "^2.2.0",
2105 + "blob-util": "^2.0.2",
2106 + "bluebird": "^3.7.2",
2107 + "buffer": "^5.6.0",
2108 + "cachedir": "^2.3.0",
2109 + "chalk": "^4.1.0",
2110 + "check-more-types": "^2.24.0",
2111 + "cli-cursor": "^3.1.0",
2112 + "cli-table3": "~0.6.1",
2113 + "commander": "^6.2.1",
2114 + "common-tags": "^1.8.0",
2115 + "dayjs": "^1.10.4",
2116 + "debug": "^4.3.4",
2117 + "enquirer": "^2.3.6",
2118 + "eventemitter2": "6.4.7",
2119 + "execa": "4.1.0",
2120 + "executable": "^4.1.1",
2121 + "extract-zip": "2.0.1",
2122 + "figures": "^3.2.0",
2123 + "fs-extra": "^9.1.0",
2124 + "getos": "^3.2.1",
2125 + "is-ci": "^3.0.0",
2126 + "is-installed-globally": "~0.4.0",
2127 + "lazy-ass": "^1.6.0",
2128 + "listr2": "^3.8.3",
2129 + "lodash": "^4.17.21",
2130 + "log-symbols": "^4.0.0",
2131 + "minimist": "^1.2.8",
2132 + "ospath": "^1.2.2",
2133 + "pretty-bytes": "^5.6.0",
2134 + "proxy-from-env": "1.0.0",
2135 + "request-progress": "^3.0.0",
2136 + "semver": "^7.3.2",
2137 + "supports-color": "^8.1.1",
2138 + "tmp": "~0.2.1",
2139 + "untildify": "^4.0.0",
2140 + "yauzl": "^2.10.0"
2141 + },
2142 + "bin": {
2143 + "cypress": "bin/cypress"
2144 + },
2145 + "engines": {
2146 + "node": "^14.0.0 || ^16.0.0 || >=18.0.0"
2147 + }
2148 + },
2149 + "node_modules/cypress/node_modules/@types/node": {
2150 + "version": "14.18.26",
2151 + "dev": true,
2152 + "license": "MIT"
2153 + },
2154 + "node_modules/dashdash": {
2155 + "version": "1.14.1",
2156 + "dev": true,
2157 + "license": "MIT",
2158 + "dependencies": {
2159 + "assert-plus": "^1.0.0"
2160 + },
2161 + "engines": {
2162 + "node": ">=0.10"
2163 + }
2164 + },
2165 + "node_modules/data-urls": {
2166 + "version": "4.0.0",
2167 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
2168 + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==",
2169 + "dev": true,
2170 + "dependencies": {
2171 + "abab": "^2.0.6",
2172 + "whatwg-mimetype": "^3.0.0",
2173 + "whatwg-url": "^12.0.0"
2174 + },
2175 + "engines": {
2176 + "node": ">=14"
2177 + }
2178 + },
2179 + "node_modules/date-fns": {
2180 + "version": "2.29.2",
2181 + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.2.tgz",
2182 + "integrity": "sha512-0VNbwmWJDS/G3ySwFSJA3ayhbURMTJLtwM2DTxf9CWondCnh6DTNlO9JgRSq6ibf4eD0lfMJNBxUdEAHHix+bA==",
2183 + "optional": true,
2184 + "engines": {
2185 + "node": ">=0.11"
2186 + },
2187 + "funding": {
2188 + "type": "opencollective",
2189 + "url": "https://opencollective.com/date-fns"
2190 + }
2191 + },
2192 + "node_modules/dayjs": {
2193 + "version": "1.11.7",
2194 + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
2195 + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
2196 + },
2197 + "node_modules/de-indent": {
2198 + "version": "1.0.2",
2199 + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
2200 + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
2201 + "dev": true
2202 + },
2203 + "node_modules/debug": {
2204 + "version": "4.3.4",
2205 + "dev": true,
2206 + "license": "MIT",
2207 + "dependencies": {
2208 + "ms": "2.1.2"
2209 + },
2210 + "engines": {
2211 + "node": ">=6.0"
2212 + },
2213 + "peerDependenciesMeta": {
2214 + "supports-color": {
2215 + "optional": true
2216 + }
2217 + }
2218 + },
2219 + "node_modules/decimal.js": {
2220 + "version": "10.4.3",
2221 + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
2222 + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
2223 + "dev": true
2224 + },
2225 + "node_modules/deep-eql": {
2226 + "version": "3.0.1",
2227 + "dev": true,
2228 + "license": "MIT",
2229 + "dependencies": {
2230 + "type-detect": "^4.0.0"
2231 + },
2232 + "engines": {
2233 + "node": ">=0.12"
2234 + }
2235 + },
2236 + "node_modules/deep-equal": {
2237 + "version": "1.1.1",
2238 + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
2239 + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
2240 + "dependencies": {
2241 + "is-arguments": "^1.0.4",
2242 + "is-date-object": "^1.0.1",
2243 + "is-regex": "^1.0.4",
2244 + "object-is": "^1.0.1",
2245 + "object-keys": "^1.1.1",
2246 + "regexp.prototype.flags": "^1.2.0"
2247 + },
2248 + "funding": {
2249 + "url": "https://github.com/sponsors/ljharb"
2250 + }
2251 + },
2252 + "node_modules/deep-is": {
2253 + "version": "0.1.4",
2254 + "dev": true,
2255 + "license": "MIT"
2256 + },
2257 + "node_modules/define-properties": {
2258 + "version": "1.1.4",
2259 + "license": "MIT",
2260 + "dependencies": {
2261 + "has-property-descriptors": "^1.0.0",
2262 + "object-keys": "^1.1.1"
2263 + },
2264 + "engines": {
2265 + "node": ">= 0.4"
2266 + },
2267 + "funding": {
2268 + "url": "https://github.com/sponsors/ljharb"
2269 + }
2270 + },
2271 + "node_modules/delayed-stream": {
2272 + "version": "1.0.0",
2273 + "dev": true,
2274 + "license": "MIT",
2275 + "engines": {
2276 + "node": ">=0.4.0"
2277 + }
2278 + },
2279 + "node_modules/detect-browser": {
2280 + "version": "5.3.0",
2281 + "license": "MIT"
2282 + },
2283 + "node_modules/dir-glob": {
2284 + "version": "3.0.1",
2285 + "dev": true,
2286 + "license": "MIT",
2287 + "dependencies": {
2288 + "path-type": "^4.0.0"
2289 + },
2290 + "engines": {
2291 + "node": ">=8"
2292 + }
2293 + },
2294 + "node_modules/doctrine": {
2295 + "version": "3.0.0",
2296 + "dev": true,
2297 + "license": "Apache-2.0",
2298 + "dependencies": {
2299 + "esutils": "^2.0.2"
2300 + },
2301 + "engines": {
2302 + "node": ">=6.0.0"
2303 + }
2304 + },
2305 + "node_modules/domexception": {
2306 + "version": "4.0.0",
2307 + "dev": true,
2308 + "license": "MIT",
2309 + "dependencies": {
2310 + "webidl-conversions": "^7.0.0"
2311 + },
2312 + "engines": {
2313 + "node": ">=12"
2314 + }
2315 + },
2316 + "node_modules/dompurify": {
2317 + "version": "2.4.0",
2318 + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.0.tgz",
2319 + "integrity": "sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA=="
2320 + },
2321 + "node_modules/drift-zoom": {
2322 + "version": "1.5.1",
2323 + "resolved": "https://registry.npmjs.org/drift-zoom/-/drift-zoom-1.5.1.tgz",
2324 + "integrity": "sha512-GNLWl0ydTkgyFxfPouKvAZXvJhTt2dqUGkXCqENe+Y1OlQuQ+nUNKgvSpNvjp3nrbcij75GbJR/iMf/qdZbgPw=="
2325 + },
2326 + "node_modules/duplexer": {
2327 + "version": "0.1.2",
2328 + "dev": true,
2329 + "license": "MIT"
2330 + },
2331 + "node_modules/earcut": {
2332 + "version": "2.2.4",
2333 + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
2334 + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
2335 + },
2336 + "node_modules/ecc-jsbn": {
2337 + "version": "0.1.2",
2338 + "dev": true,
2339 + "license": "MIT",
2340 + "dependencies": {
2341 + "jsbn": "~0.1.0",
2342 + "safer-buffer": "^2.1.0"
2343 + }
2344 + },
2345 + "node_modules/echarts": {
2346 + "version": "5.4.2",
2347 + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.2.tgz",
2348 + "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==",
2349 + "dependencies": {
2350 + "tslib": "2.3.0",
2351 + "zrender": "5.4.3"
2352 + }
2353 + },
2354 + "node_modules/echarts/node_modules/tslib": {
2355 + "version": "2.3.0",
2356 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
2357 + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
2358 + },
2359 + "node_modules/editorconfig": {
2360 + "version": "0.15.3",
2361 + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
2362 + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
2363 + "dev": true,
2364 + "dependencies": {
2365 + "commander": "^2.19.0",
2366 + "lru-cache": "^4.1.5",
2367 + "semver": "^5.6.0",
2368 + "sigmund": "^1.0.1"
2369 + },
2370 + "bin": {
2371 + "editorconfig": "bin/editorconfig"
2372 + }
2373 + },
2374 + "node_modules/editorconfig/node_modules/commander": {
2375 + "version": "2.20.3",
2376 + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
2377 + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
2378 + "dev": true
2379 + },
2380 + "node_modules/editorconfig/node_modules/lru-cache": {
2381 + "version": "4.1.5",
2382 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
2383 + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
2384 + "dev": true,
2385 + "dependencies": {
2386 + "pseudomap": "^1.0.2",
2387 + "yallist": "^2.1.2"
2388 + }
2389 + },
2390 + "node_modules/editorconfig/node_modules/semver": {
2391 + "version": "5.7.1",
2392 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2393 + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
2394 + "dev": true,
2395 + "bin": {
2396 + "semver": "bin/semver"
2397 + }
2398 + },
2399 + "node_modules/editorconfig/node_modules/yallist": {
2400 + "version": "2.1.2",
2401 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
2402 + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
2403 + "dev": true
2404 + },
2405 + "node_modules/element-plus": {
2406 + "version": "2.3.4",
2407 + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.3.4.tgz",
2408 + "integrity": "sha512-SQr0J9z7N4z48WYk/l9NE2tizl8Q7j2OhqlpTc42k4pGncry3+rVX6dsmcsglFynn6vt3NzYxWJqmLFyDKQq+g==",
2409 + "dependencies": {
2410 + "@ctrl/tinycolor": "^3.4.1",
2411 + "@element-plus/icons-vue": "^2.0.6",
2412 + "@floating-ui/dom": "^1.0.1",
2413 + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
2414 + "@types/lodash": "^4.14.182",
2415 + "@types/lodash-es": "^4.17.6",
2416 + "@vueuse/core": "^9.1.0",
2417 + "async-validator": "^4.2.5",
2418 + "dayjs": "^1.11.3",
2419 + "escape-html": "^1.0.3",
2420 + "lodash": "^4.17.21",
2421 + "lodash-es": "^4.17.21",
2422 + "lodash-unified": "^1.0.2",
2423 + "memoize-one": "^6.0.0",
2424 + "normalize-wheel-es": "^1.2.0"
2425 + },
2426 + "peerDependencies": {
2427 + "vue": "^3.2.0"
2428 + }
2429 + },
2430 + "node_modules/emoji-regex": {
2431 + "version": "8.0.0",
2432 + "dev": true,
2433 + "license": "MIT"
2434 + },
2435 + "node_modules/end-of-stream": {
2436 + "version": "1.4.4",
2437 + "dev": true,
2438 + "license": "MIT",
2439 + "dependencies": {
2440 + "once": "^1.4.0"
2441 + }
2442 + },
2443 + "node_modules/enquirer": {
2444 + "version": "2.3.6",
2445 + "dev": true,
2446 + "license": "MIT",
2447 + "dependencies": {
2448 + "ansi-colors": "^4.1.1"
2449 + },
2450 + "engines": {
2451 + "node": ">=8.6"
2452 + }
2453 + },
2454 + "node_modules/entities": {
2455 + "version": "4.4.0",
2456 + "dev": true,
2457 + "license": "BSD-2-Clause",
2458 + "engines": {
2459 + "node": ">=0.12"
2460 + },
2461 + "funding": {
2462 + "url": "https://github.com/fb55/entities?sponsor=1"
2463 + }
2464 + },
2465 + "node_modules/error-ex": {
2466 + "version": "1.3.2",
2467 + "dev": true,
2468 + "license": "MIT",
2469 + "dependencies": {
2470 + "is-arrayish": "^0.2.1"
2471 + }
2472 + },
2473 + "node_modules/es-abstract": {
2474 + "version": "1.20.2",
2475 + "dev": true,
2476 + "license": "MIT",
2477 + "dependencies": {
2478 + "call-bind": "^1.0.2",
2479 + "es-to-primitive": "^1.2.1",
2480 + "function-bind": "^1.1.1",
2481 + "function.prototype.name": "^1.1.5",
2482 + "get-intrinsic": "^1.1.2",
2483 + "get-symbol-description": "^1.0.0",
2484 + "has": "^1.0.3",
2485 + "has-property-descriptors": "^1.0.0",
2486 + "has-symbols": "^1.0.3",
2487 + "internal-slot": "^1.0.3",
2488 + "is-callable": "^1.2.4",
2489 + "is-negative-zero": "^2.0.2",
2490 + "is-regex": "^1.1.4",
2491 + "is-shared-array-buffer": "^1.0.2",
2492 + "is-string": "^1.0.7",
2493 + "is-weakref": "^1.0.2",
2494 + "object-inspect": "^1.12.2",
2495 + "object-keys": "^1.1.1",
2496 + "object.assign": "^4.1.4",
2497 + "regexp.prototype.flags": "^1.4.3",
2498 + "string.prototype.trimend": "^1.0.5",
2499 + "string.prototype.trimstart": "^1.0.5",
2500 + "unbox-primitive": "^1.0.2"
2501 + },
2502 + "engines": {
2503 + "node": ">= 0.4"
2504 + },
2505 + "funding": {
2506 + "url": "https://github.com/sponsors/ljharb"
2507 + }
2508 + },
2509 + "node_modules/es-to-primitive": {
2510 + "version": "1.2.1",
2511 + "dev": true,
2512 + "license": "MIT",
2513 + "dependencies": {
2514 + "is-callable": "^1.1.4",
2515 + "is-date-object": "^1.0.1",
2516 + "is-symbol": "^1.0.2"
2517 + },
2518 + "engines": {
2519 + "node": ">= 0.4"
2520 + },
2521 + "funding": {
2522 + "url": "https://github.com/sponsors/ljharb"
2523 + }
2524 + },
2525 + "node_modules/esbuild": {
2526 + "version": "0.15.18",
2527 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
2528 + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
2529 + "dev": true,
2530 + "hasInstallScript": true,
2531 + "bin": {
2532 + "esbuild": "bin/esbuild"
2533 + },
2534 + "engines": {
2535 + "node": ">=12"
2536 + },
2537 + "optionalDependencies": {
2538 + "@esbuild/android-arm": "0.15.18",
2539 + "@esbuild/linux-loong64": "0.15.18",
2540 + "esbuild-android-64": "0.15.18",
2541 + "esbuild-android-arm64": "0.15.18",
2542 + "esbuild-darwin-64": "0.15.18",
2543 + "esbuild-darwin-arm64": "0.15.18",
2544 + "esbuild-freebsd-64": "0.15.18",
2545 + "esbuild-freebsd-arm64": "0.15.18",
2546 + "esbuild-linux-32": "0.15.18",
2547 + "esbuild-linux-64": "0.15.18",
2548 + "esbuild-linux-arm": "0.15.18",
2549 + "esbuild-linux-arm64": "0.15.18",
2550 + "esbuild-linux-mips64le": "0.15.18",
2551 + "esbuild-linux-ppc64le": "0.15.18",
2552 + "esbuild-linux-riscv64": "0.15.18",
2553 + "esbuild-linux-s390x": "0.15.18",
2554 + "esbuild-netbsd-64": "0.15.18",
2555 + "esbuild-openbsd-64": "0.15.18",
2556 + "esbuild-sunos-64": "0.15.18",
2557 + "esbuild-windows-32": "0.15.18",
2558 + "esbuild-windows-64": "0.15.18",
2559 + "esbuild-windows-arm64": "0.15.18"
2560 + }
2561 + },
2562 + "node_modules/esbuild-android-64": {
2563 + "version": "0.15.18",
2564 + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
2565 + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
2566 + "cpu": [
2567 + "x64"
2568 + ],
2569 + "dev": true,
2570 + "optional": true,
2571 + "os": [
2572 + "android"
2573 + ],
2574 + "engines": {
2575 + "node": ">=12"
2576 + }
2577 + },
2578 + "node_modules/esbuild-android-arm64": {
2579 + "version": "0.15.18",
2580 + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
2581 + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
2582 + "cpu": [
2583 + "arm64"
2584 + ],
2585 + "dev": true,
2586 + "optional": true,
2587 + "os": [
2588 + "android"
2589 + ],
2590 + "engines": {
2591 + "node": ">=12"
2592 + }
2593 + },
2594 + "node_modules/esbuild-darwin-64": {
2595 + "version": "0.15.18",
2596 + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
2597 + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
2598 + "cpu": [
2599 + "x64"
2600 + ],
2601 + "dev": true,
2602 + "optional": true,
2603 + "os": [
2604 + "darwin"
2605 + ],
2606 + "engines": {
2607 + "node": ">=12"
2608 + }
2609 + },
2610 + "node_modules/esbuild-darwin-arm64": {
2611 + "version": "0.15.18",
2612 + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
2613 + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
2614 + "cpu": [
2615 + "arm64"
2616 + ],
2617 + "dev": true,
2618 + "optional": true,
2619 + "os": [
2620 + "darwin"
2621 + ],
2622 + "engines": {
2623 + "node": ">=12"
2624 + }
2625 + },
2626 + "node_modules/esbuild-freebsd-64": {
2627 + "version": "0.15.18",
2628 + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
2629 + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
2630 + "cpu": [
2631 + "x64"
2632 + ],
2633 + "dev": true,
2634 + "optional": true,
2635 + "os": [
2636 + "freebsd"
2637 + ],
2638 + "engines": {
2639 + "node": ">=12"
2640 + }
2641 + },
2642 + "node_modules/esbuild-freebsd-arm64": {
2643 + "version": "0.15.18",
2644 + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
2645 + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
2646 + "cpu": [
2647 + "arm64"
2648 + ],
2649 + "dev": true,
2650 + "optional": true,
2651 + "os": [
2652 + "freebsd"
2653 + ],
2654 + "engines": {
2655 + "node": ">=12"
2656 + }
2657 + },
2658 + "node_modules/esbuild-linux-32": {
2659 + "version": "0.15.18",
2660 + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
2661 + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
2662 + "cpu": [
2663 + "ia32"
2664 + ],
2665 + "dev": true,
2666 + "optional": true,
2667 + "os": [
2668 + "linux"
2669 + ],
2670 + "engines": {
2671 + "node": ">=12"
2672 + }
2673 + },
2674 + "node_modules/esbuild-linux-64": {
2675 + "version": "0.15.18",
2676 + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
2677 + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
2678 + "cpu": [
2679 + "x64"
2680 + ],
2681 + "dev": true,
2682 + "optional": true,
2683 + "os": [
2684 + "linux"
2685 + ],
2686 + "engines": {
2687 + "node": ">=12"
2688 + }
2689 + },
2690 + "node_modules/esbuild-linux-arm": {
2691 + "version": "0.15.18",
2692 + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
2693 + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
2694 + "cpu": [
2695 + "arm"
2696 + ],
2697 + "dev": true,
2698 + "optional": true,
2699 + "os": [
2700 + "linux"
2701 + ],
2702 + "engines": {
2703 + "node": ">=12"
2704 + }
2705 + },
2706 + "node_modules/esbuild-linux-arm64": {
2707 + "version": "0.15.18",
2708 + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
2709 + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
2710 + "cpu": [
2711 + "arm64"
2712 + ],
2713 + "dev": true,
2714 + "optional": true,
2715 + "os": [
2716 + "linux"
2717 + ],
2718 + "engines": {
2719 + "node": ">=12"
2720 + }
2721 + },
2722 + "node_modules/esbuild-linux-mips64le": {
2723 + "version": "0.15.18",
2724 + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
2725 + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
2726 + "cpu": [
2727 + "mips64el"
2728 + ],
2729 + "dev": true,
2730 + "optional": true,
2731 + "os": [
2732 + "linux"
2733 + ],
2734 + "engines": {
2735 + "node": ">=12"
2736 + }
2737 + },
2738 + "node_modules/esbuild-linux-ppc64le": {
2739 + "version": "0.15.18",
2740 + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
2741 + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
2742 + "cpu": [
2743 + "ppc64"
2744 + ],
2745 + "dev": true,
2746 + "optional": true,
2747 + "os": [
2748 + "linux"
2749 + ],
2750 + "engines": {
2751 + "node": ">=12"
2752 + }
2753 + },
2754 + "node_modules/esbuild-linux-riscv64": {
2755 + "version": "0.15.18",
2756 + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
2757 + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
2758 + "cpu": [
2759 + "riscv64"
2760 + ],
2761 + "dev": true,
2762 + "optional": true,
2763 + "os": [
2764 + "linux"
2765 + ],
2766 + "engines": {
2767 + "node": ">=12"
2768 + }
2769 + },
2770 + "node_modules/esbuild-linux-s390x": {
2771 + "version": "0.15.18",
2772 + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
2773 + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
2774 + "cpu": [
2775 + "s390x"
2776 + ],
2777 + "dev": true,
2778 + "optional": true,
2779 + "os": [
2780 + "linux"
2781 + ],
2782 + "engines": {
2783 + "node": ">=12"
2784 + }
2785 + },
2786 + "node_modules/esbuild-netbsd-64": {
2787 + "version": "0.15.18",
2788 + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
2789 + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
2790 + "cpu": [
2791 + "x64"
2792 + ],
2793 + "dev": true,
2794 + "optional": true,
2795 + "os": [
2796 + "netbsd"
2797 + ],
2798 + "engines": {
2799 + "node": ">=12"
2800 + }
2801 + },
2802 + "node_modules/esbuild-openbsd-64": {
2803 + "version": "0.15.18",
2804 + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
2805 + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
2806 + "cpu": [
2807 + "x64"
2808 + ],
2809 + "dev": true,
2810 + "optional": true,
2811 + "os": [
2812 + "openbsd"
2813 + ],
2814 + "engines": {
2815 + "node": ">=12"
2816 + }
2817 + },
2818 + "node_modules/esbuild-sunos-64": {
2819 + "version": "0.15.18",
2820 + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
2821 + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
2822 + "cpu": [
2823 + "x64"
2824 + ],
2825 + "dev": true,
2826 + "optional": true,
2827 + "os": [
2828 + "sunos"
2829 + ],
2830 + "engines": {
2831 + "node": ">=12"
2832 + }
2833 + },
2834 + "node_modules/esbuild-windows-32": {
2835 + "version": "0.15.18",
2836 + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
2837 + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
2838 + "cpu": [
2839 + "ia32"
2840 + ],
2841 + "dev": true,
2842 + "optional": true,
2843 + "os": [
2844 + "win32"
2845 + ],
2846 + "engines": {
2847 + "node": ">=12"
2848 + }
2849 + },
2850 + "node_modules/esbuild-windows-64": {
2851 + "version": "0.15.18",
2852 + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
2853 + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
2854 + "cpu": [
2855 + "x64"
2856 + ],
2857 + "dev": true,
2858 + "optional": true,
2859 + "os": [
2860 + "win32"
2861 + ],
2862 + "engines": {
2863 + "node": ">=12"
2864 + }
2865 + },
2866 + "node_modules/esbuild-windows-arm64": {
2867 + "version": "0.15.18",
2868 + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
2869 + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
2870 + "cpu": [
2871 + "arm64"
2872 + ],
2873 + "dev": true,
2874 + "optional": true,
2875 + "os": [
2876 + "win32"
2877 + ],
2878 + "engines": {
2879 + "node": ">=12"
2880 + }
2881 + },
2882 + "node_modules/escape-html": {
2883 + "version": "1.0.3",
2884 + "license": "MIT"
2885 + },
2886 + "node_modules/escape-string-regexp": {
2887 + "version": "4.0.0",
2888 + "dev": true,
2889 + "license": "MIT",
2890 + "engines": {
2891 + "node": ">=10"
2892 + },
2893 + "funding": {
2894 + "url": "https://github.com/sponsors/sindresorhus"
2895 + }
2896 + },
2897 + "node_modules/escodegen": {
2898 + "version": "2.0.0",
2899 + "dev": true,
2900 + "license": "BSD-2-Clause",
2901 + "dependencies": {
2902 + "esprima": "^4.0.1",
2903 + "estraverse": "^5.2.0",
2904 + "esutils": "^2.0.2",
2905 + "optionator": "^0.8.1"
2906 + },
2907 + "bin": {
2908 + "escodegen": "bin/escodegen.js",
2909 + "esgenerate": "bin/esgenerate.js"
2910 + },
2911 + "engines": {
2912 + "node": ">=6.0"
2913 + },
2914 + "optionalDependencies": {
2915 + "source-map": "~0.6.1"
2916 + }
2917 + },
2918 + "node_modules/escodegen/node_modules/estraverse": {
2919 + "version": "5.3.0",
2920 + "dev": true,
2921 + "license": "BSD-2-Clause",
2922 + "engines": {
2923 + "node": ">=4.0"
2924 + }
2925 + },
2926 + "node_modules/escodegen/node_modules/levn": {
2927 + "version": "0.3.0",
2928 + "dev": true,
2929 + "license": "MIT",
2930 + "dependencies": {
2931 + "prelude-ls": "~1.1.2",
2932 + "type-check": "~0.3.2"
2933 + },
2934 + "engines": {
2935 + "node": ">= 0.8.0"
2936 + }
2937 + },
2938 + "node_modules/escodegen/node_modules/optionator": {
2939 + "version": "0.8.3",
2940 + "dev": true,
2941 + "license": "MIT",
2942 + "dependencies": {
2943 + "deep-is": "~0.1.3",
2944 + "fast-levenshtein": "~2.0.6",
2945 + "levn": "~0.3.0",
2946 + "prelude-ls": "~1.1.2",
2947 + "type-check": "~0.3.2",
2948 + "word-wrap": "~1.2.3"
2949 + },
2950 + "engines": {
2951 + "node": ">= 0.8.0"
2952 + }
2953 + },
2954 + "node_modules/escodegen/node_modules/prelude-ls": {
2955 + "version": "1.1.2",
2956 + "dev": true,
2957 + "engines": {
2958 + "node": ">= 0.8.0"
2959 + }
2960 + },
2961 + "node_modules/escodegen/node_modules/type-check": {
2962 + "version": "0.3.2",
2963 + "dev": true,
2964 + "license": "MIT",
2965 + "dependencies": {
2966 + "prelude-ls": "~1.1.2"
2967 + },
2968 + "engines": {
2969 + "node": ">= 0.8.0"
2970 + }
2971 + },
2972 + "node_modules/eslint": {
2973 + "version": "8.39.0",
2974 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz",
2975 + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==",
2976 + "dev": true,
2977 + "dependencies": {
2978 + "@eslint-community/eslint-utils": "^4.2.0",
2979 + "@eslint-community/regexpp": "^4.4.0",
2980 + "@eslint/eslintrc": "^2.0.2",
2981 + "@eslint/js": "8.39.0",
2982 + "@humanwhocodes/config-array": "^0.11.8",
2983 + "@humanwhocodes/module-importer": "^1.0.1",
2984 + "@nodelib/fs.walk": "^1.2.8",
2985 + "ajv": "^6.10.0",
2986 + "chalk": "^4.0.0",
2987 + "cross-spawn": "^7.0.2",
2988 + "debug": "^4.3.2",
2989 + "doctrine": "^3.0.0",
2990 + "escape-string-regexp": "^4.0.0",
2991 + "eslint-scope": "^7.2.0",
2992 + "eslint-visitor-keys": "^3.4.0",
2993 + "espree": "^9.5.1",
2994 + "esquery": "^1.4.2",
2995 + "esutils": "^2.0.2",
2996 + "fast-deep-equal": "^3.1.3",
2997 + "file-entry-cache": "^6.0.1",
2998 + "find-up": "^5.0.0",
2999 + "glob-parent": "^6.0.2",
3000 + "globals": "^13.19.0",
3001 + "grapheme-splitter": "^1.0.4",
3002 + "ignore": "^5.2.0",
3003 + "import-fresh": "^3.0.0",
3004 + "imurmurhash": "^0.1.4",
3005 + "is-glob": "^4.0.0",
3006 + "is-path-inside": "^3.0.3",
3007 + "js-sdsl": "^4.1.4",
3008 + "js-yaml": "^4.1.0",
3009 + "json-stable-stringify-without-jsonify": "^1.0.1",
3010 + "levn": "^0.4.1",
3011 + "lodash.merge": "^4.6.2",
3012 + "minimatch": "^3.1.2",
3013 + "natural-compare": "^1.4.0",
3014 + "optionator": "^0.9.1",
3015 + "strip-ansi": "^6.0.1",
3016 + "strip-json-comments": "^3.1.0",
3017 + "text-table": "^0.2.0"
3018 + },
3019 + "bin": {
3020 + "eslint": "bin/eslint.js"
3021 + },
3022 + "engines": {
3023 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3024 + },
3025 + "funding": {
3026 + "url": "https://opencollective.com/eslint"
3027 + }
3028 + },
3029 + "node_modules/eslint-config-prettier": {
3030 + "version": "8.5.0",
3031 + "dev": true,
3032 + "license": "MIT",
3033 + "bin": {
3034 + "eslint-config-prettier": "bin/cli.js"
3035 + },
3036 + "peerDependencies": {
3037 + "eslint": ">=7.0.0"
3038 + }
3039 + },
3040 + "node_modules/eslint-plugin-prettier": {
3041 + "version": "4.2.1",
3042 + "dev": true,
3043 + "license": "MIT",
3044 + "dependencies": {
3045 + "prettier-linter-helpers": "^1.0.0"
3046 + },
3047 + "engines": {
3048 + "node": ">=12.0.0"
3049 + },
3050 + "peerDependencies": {
3051 + "eslint": ">=7.28.0",
3052 + "prettier": ">=2.0.0"
3053 + },
3054 + "peerDependenciesMeta": {
3055 + "eslint-config-prettier": {
3056 + "optional": true
3057 + }
3058 + }
3059 + },
3060 + "node_modules/eslint-plugin-vue": {
3061 + "version": "9.11.0",
3062 + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.11.0.tgz",
3063 + "integrity": "sha512-bBCJAZnkBV7ATH4Z1E7CvN3nmtS4H7QUU3UBxPdo8WohRU+yHjnQRALpTbxMVcz0e4Mx3IyxIdP5HYODMxK9cQ==",
3064 + "dev": true,
3065 + "dependencies": {
3066 + "@eslint-community/eslint-utils": "^4.3.0",
3067 + "natural-compare": "^1.4.0",
3068 + "nth-check": "^2.0.1",
3069 + "postcss-selector-parser": "^6.0.9",
3070 + "semver": "^7.3.5",
3071 + "vue-eslint-parser": "^9.0.1",
3072 + "xml-name-validator": "^4.0.0"
3073 + },
3074 + "engines": {
3075 + "node": "^14.17.0 || >=16.0.0"
3076 + },
3077 + "peerDependencies": {
3078 + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
3079 + }
3080 + },
3081 + "node_modules/eslint-scope": {
3082 + "version": "5.1.1",
3083 + "dev": true,
3084 + "license": "BSD-2-Clause",
3085 + "dependencies": {
3086 + "esrecurse": "^4.3.0",
3087 + "estraverse": "^4.1.1"
3088 + },
3089 + "engines": {
3090 + "node": ">=8.0.0"
3091 + }
3092 + },
3093 + "node_modules/eslint-utils": {
3094 + "version": "3.0.0",
3095 + "dev": true,
3096 + "license": "MIT",
3097 + "dependencies": {
3098 + "eslint-visitor-keys": "^2.0.0"
3099 + },
3100 + "engines": {
3101 + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
3102 + },
3103 + "funding": {
3104 + "url": "https://github.com/sponsors/mysticatea"
3105 + },
3106 + "peerDependencies": {
3107 + "eslint": ">=5"
3108 + }
3109 + },
3110 + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
3111 + "version": "2.1.0",
3112 + "dev": true,
3113 + "license": "Apache-2.0",
3114 + "engines": {
3115 + "node": ">=10"
3116 + }
3117 + },
3118 + "node_modules/eslint-visitor-keys": {
3119 + "version": "3.4.0",
3120 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
3121 + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
3122 + "dev": true,
3123 + "engines": {
3124 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3125 + },
3126 + "funding": {
3127 + "url": "https://opencollective.com/eslint"
3128 + }
3129 + },
3130 + "node_modules/eslint/node_modules/eslint-scope": {
3131 + "version": "7.2.0",
3132 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
3133 + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
3134 + "dev": true,
3135 + "dependencies": {
3136 + "esrecurse": "^4.3.0",
3137 + "estraverse": "^5.2.0"
3138 + },
3139 + "engines": {
3140 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3141 + },
3142 + "funding": {
3143 + "url": "https://opencollective.com/eslint"
3144 + }
3145 + },
3146 + "node_modules/eslint/node_modules/estraverse": {
3147 + "version": "5.3.0",
3148 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
3149 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
3150 + "dev": true,
3151 + "engines": {
3152 + "node": ">=4.0"
3153 + }
3154 + },
3155 + "node_modules/espree": {
3156 + "version": "9.5.1",
3157 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
3158 + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
3159 + "dev": true,
3160 + "dependencies": {
3161 + "acorn": "^8.8.0",
3162 + "acorn-jsx": "^5.3.2",
3163 + "eslint-visitor-keys": "^3.4.0"
3164 + },
3165 + "engines": {
3166 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
3167 + },
3168 + "funding": {
3169 + "url": "https://opencollective.com/eslint"
3170 + }
3171 + },
3172 + "node_modules/esprima": {
3173 + "version": "4.0.1",
3174 + "dev": true,
3175 + "license": "BSD-2-Clause",
3176 + "bin": {
3177 + "esparse": "bin/esparse.js",
3178 + "esvalidate": "bin/esvalidate.js"
3179 + },
3180 + "engines": {
3181 + "node": ">=4"
3182 + }
3183 + },
3184 + "node_modules/esquery": {
3185 + "version": "1.5.0",
3186 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
3187 + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
3188 + "dev": true,
3189 + "dependencies": {
3190 + "estraverse": "^5.1.0"
3191 + },
3192 + "engines": {
3193 + "node": ">=0.10"
3194 + }
3195 + },
3196 + "node_modules/esquery/node_modules/estraverse": {
3197 + "version": "5.3.0",
3198 + "dev": true,
3199 + "license": "BSD-2-Clause",
3200 + "engines": {
3201 + "node": ">=4.0"
3202 + }
3203 + },
3204 + "node_modules/esrecurse": {
3205 + "version": "4.3.0",
3206 + "dev": true,
3207 + "license": "BSD-2-Clause",
3208 + "dependencies": {
3209 + "estraverse": "^5.2.0"
3210 + },
3211 + "engines": {
3212 + "node": ">=4.0"
3213 + }
3214 + },
3215 + "node_modules/esrecurse/node_modules/estraverse": {
3216 + "version": "5.3.0",
3217 + "dev": true,
3218 + "license": "BSD-2-Clause",
3219 + "engines": {
3220 + "node": ">=4.0"
3221 + }
3222 + },
3223 + "node_modules/estraverse": {
3224 + "version": "4.3.0",
3225 + "dev": true,
3226 + "license": "BSD-2-Clause",
3227 + "engines": {
3228 + "node": ">=4.0"
3229 + }
3230 + },
3231 + "node_modules/estree-walker": {
3232 + "version": "2.0.2",
3233 + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
3234 + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
3235 + },
3236 + "node_modules/esutils": {
3237 + "version": "2.0.3",
3238 + "dev": true,
3239 + "license": "BSD-2-Clause",
3240 + "engines": {
3241 + "node": ">=0.10.0"
3242 + }
3243 + },
3244 + "node_modules/event-stream": {
3245 + "version": "3.3.4",
3246 + "dev": true,
3247 + "license": "MIT",
3248 + "dependencies": {
3249 + "duplexer": "~0.1.1",
3250 + "from": "~0",
3251 + "map-stream": "~0.1.0",
3252 + "pause-stream": "0.0.11",
3253 + "split": "0.3",
3254 + "stream-combiner": "~0.0.4",
3255 + "through": "~2.3.1"
3256 + }
3257 + },
3258 + "node_modules/eventemitter2": {
3259 + "version": "6.4.7",
3260 + "dev": true,
3261 + "license": "MIT"
3262 + },
3263 + "node_modules/eventemitter3": {
3264 + "version": "2.0.3",
3265 + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
3266 + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg=="
3267 + },
3268 + "node_modules/execa": {
3269 + "version": "4.1.0",
3270 + "dev": true,
3271 + "license": "MIT",
3272 + "dependencies": {
3273 + "cross-spawn": "^7.0.0",
3274 + "get-stream": "^5.0.0",
3275 + "human-signals": "^1.1.1",
3276 + "is-stream": "^2.0.0",
3277 + "merge-stream": "^2.0.0",
3278 + "npm-run-path": "^4.0.0",
3279 + "onetime": "^5.1.0",
3280 + "signal-exit": "^3.0.2",
3281 + "strip-final-newline": "^2.0.0"
3282 + },
3283 + "engines": {
3284 + "node": ">=10"
3285 + },
3286 + "funding": {
3287 + "url": "https://github.com/sindresorhus/execa?sponsor=1"
3288 + }
3289 + },
3290 + "node_modules/executable": {
3291 + "version": "4.1.1",
3292 + "dev": true,
3293 + "license": "MIT",
3294 + "dependencies": {
3295 + "pify": "^2.2.0"
3296 + },
3297 + "engines": {
3298 + "node": ">=4"
3299 + }
3300 + },
3301 + "node_modules/exit-on-epipe": {
3302 + "version": "1.0.1",
3303 + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
3304 + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==",
3305 + "engines": {
3306 + "node": ">=0.8"
3307 + }
3308 + },
3309 + "node_modules/extend": {
3310 + "version": "3.0.2",
3311 + "license": "MIT"
3312 + },
3313 + "node_modules/extract-zip": {
3314 + "version": "2.0.1",
3315 + "dev": true,
3316 + "license": "BSD-2-Clause",
3317 + "dependencies": {
3318 + "debug": "^4.1.1",
3319 + "get-stream": "^5.1.0",
3320 + "yauzl": "^2.10.0"
3321 + },
3322 + "bin": {
3323 + "extract-zip": "cli.js"
3324 + },
3325 + "engines": {
3326 + "node": ">= 10.17.0"
3327 + },
3328 + "optionalDependencies": {
3329 + "@types/yauzl": "^2.9.1"
3330 + }
3331 + },
3332 + "node_modules/extsprintf": {
3333 + "version": "1.3.0",
3334 + "dev": true,
3335 + "engines": [
3336 + "node >=0.6.0"
3337 + ],
3338 + "license": "MIT"
3339 + },
3340 + "node_modules/fast-deep-equal": {
3341 + "version": "3.1.3",
3342 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
3343 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
3344 + "dev": true
3345 + },
3346 + "node_modules/fast-diff": {
3347 + "version": "1.2.0",
3348 + "dev": true,
3349 + "license": "Apache-2.0"
3350 + },
3351 + "node_modules/fast-glob": {
3352 + "version": "3.2.11",
3353 + "dev": true,
3354 + "license": "MIT",
3355 + "dependencies": {
3356 + "@nodelib/fs.stat": "^2.0.2",
3357 + "@nodelib/fs.walk": "^1.2.3",
3358 + "glob-parent": "^5.1.2",
3359 + "merge2": "^1.3.0",
3360 + "micromatch": "^4.0.4"
3361 + },
3362 + "engines": {
3363 + "node": ">=8.6.0"
3364 + }
3365 + },
3366 + "node_modules/fast-glob/node_modules/glob-parent": {
3367 + "version": "5.1.2",
3368 + "dev": true,
3369 + "license": "ISC",
3370 + "dependencies": {
3371 + "is-glob": "^4.0.1"
3372 + },
3373 + "engines": {
3374 + "node": ">= 6"
3375 + }
3376 + },
3377 + "node_modules/fast-json-stable-stringify": {
3378 + "version": "2.1.0",
3379 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
3380 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
3381 + "dev": true
3382 + },
3383 + "node_modules/fast-levenshtein": {
3384 + "version": "2.0.6",
3385 + "dev": true,
3386 + "license": "MIT"
3387 + },
3388 + "node_modules/fastq": {
3389 + "version": "1.13.0",
3390 + "dev": true,
3391 + "license": "ISC",
3392 + "dependencies": {
3393 + "reusify": "^1.0.4"
3394 + }
3395 + },
3396 + "node_modules/fd-slicer": {
3397 + "version": "1.1.0",
3398 + "dev": true,
3399 + "license": "MIT",
3400 + "dependencies": {
3401 + "pend": "~1.2.0"
3402 + }
3403 + },
3404 + "node_modules/figures": {
3405 + "version": "3.2.0",
3406 + "dev": true,
3407 + "license": "MIT",
3408 + "dependencies": {
3409 + "escape-string-regexp": "^1.0.5"
3410 + },
3411 + "engines": {
3412 + "node": ">=8"
3413 + },
3414 + "funding": {
3415 + "url": "https://github.com/sponsors/sindresorhus"
3416 + }
3417 + },
3418 + "node_modules/figures/node_modules/escape-string-regexp": {
3419 + "version": "1.0.5",
3420 + "dev": true,
3421 + "license": "MIT",
3422 + "engines": {
3423 + "node": ">=0.8.0"
3424 + }
3425 + },
3426 + "node_modules/file-entry-cache": {
3427 + "version": "6.0.1",
3428 + "dev": true,
3429 + "license": "MIT",
3430 + "dependencies": {
3431 + "flat-cache": "^3.0.4"
3432 + },
3433 + "engines": {
3434 + "node": "^10.12.0 || >=12.0.0"
3435 + }
3436 + },
3437 + "node_modules/file-saver": {
3438 + "version": "2.0.5",
3439 + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
3440 + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
3441 + },
3442 + "node_modules/fill-range": {
3443 + "version": "7.0.1",
3444 + "dev": true,
3445 + "license": "MIT",
3446 + "dependencies": {
3447 + "to-regex-range": "^5.0.1"
3448 + },
3449 + "engines": {
3450 + "node": ">=8"
3451 + }
3452 + },
3453 + "node_modules/find-up": {
3454 + "version": "5.0.0",
3455 + "dev": true,
3456 + "license": "MIT",
3457 + "dependencies": {
3458 + "locate-path": "^6.0.0",
3459 + "path-exists": "^4.0.0"
3460 + },
3461 + "engines": {
3462 + "node": ">=10"
3463 + },
3464 + "funding": {
3465 + "url": "https://github.com/sponsors/sindresorhus"
3466 + }
3467 + },
3468 + "node_modules/flag-icon-css": {
3469 + "version": "4.1.7",
3470 + "resolved": "https://registry.npmjs.org/flag-icon-css/-/flag-icon-css-4.1.7.tgz",
3471 + "integrity": "sha512-AFjSU+fv98XbU0vnTQ32vcLj89UEr1MhwDFcooQv14qWJCjg9fGZzfh9BVyDhAhIOZW/pGmJmq38RqpgPaeybQ==",
3472 + "deprecated": "The project has been renamed to flag-icons"
3473 + },
3474 + "node_modules/flat-cache": {
3475 + "version": "3.0.4",
3476 + "dev": true,
3477 + "license": "MIT",
3478 + "dependencies": {
3479 + "flatted": "^3.1.0",
3480 + "rimraf": "^3.0.2"
3481 + },
3482 + "engines": {
3483 + "node": "^10.12.0 || >=12.0.0"
3484 + }
3485 + },
3486 + "node_modules/flatted": {
3487 + "version": "3.2.7",
3488 + "dev": true,
3489 + "license": "ISC"
3490 + },
3491 + "node_modules/flex.box": {
3492 + "version": "3.4.4",
3493 + "license": "MIT"
3494 + },
3495 + "node_modules/follow-redirects": {
3496 + "version": "1.15.2",
3497 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
3498 + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
3499 + "dev": true,
3500 + "funding": [
3501 + {
3502 + "type": "individual",
3503 + "url": "https://github.com/sponsors/RubenVerborgh"
3504 + }
3505 + ],
3506 + "engines": {
3507 + "node": ">=4.0"
3508 + },
3509 + "peerDependenciesMeta": {
3510 + "debug": {
3511 + "optional": true
3512 + }
3513 + }
3514 + },
3515 + "node_modules/forever-agent": {
3516 + "version": "0.6.1",
3517 + "dev": true,
3518 + "license": "Apache-2.0",
3519 + "engines": {
3520 + "node": "*"
3521 + }
3522 + },
3523 + "node_modules/form-data": {
3524 + "version": "2.3.3",
3525 + "dev": true,
3526 + "license": "MIT",
3527 + "dependencies": {
3528 + "asynckit": "^0.4.0",
3529 + "combined-stream": "^1.0.6",
3530 + "mime-types": "^2.1.12"
3531 + },
3532 + "engines": {
3533 + "node": ">= 0.12"
3534 + }
3535 + },
3536 + "node_modules/frac": {
3537 + "version": "1.1.2",
3538 + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
3539 + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
3540 + "engines": {
3541 + "node": ">=0.8"
3542 + }
3543 + },
3544 + "node_modules/from": {
3545 + "version": "0.1.7",
3546 + "dev": true,
3547 + "license": "MIT"
3548 + },
3549 + "node_modules/fs-extra": {
3550 + "version": "9.1.0",
3551 + "dev": true,
3552 + "license": "MIT",
3553 + "dependencies": {
3554 + "at-least-node": "^1.0.0",
3555 + "graceful-fs": "^4.2.0",
3556 + "jsonfile": "^6.0.1",
3557 + "universalify": "^2.0.0"
3558 + },
3559 + "engines": {
3560 + "node": ">=10"
3561 + }
3562 + },
3563 + "node_modules/fs.realpath": {
3564 + "version": "1.0.0",
3565 + "dev": true,
3566 + "license": "ISC"
3567 + },
3568 + "node_modules/fsevents": {
3569 + "version": "2.3.2",
3570 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
3571 + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
3572 + "dev": true,
3573 + "hasInstallScript": true,
3574 + "optional": true,
3575 + "os": [
3576 + "darwin"
3577 + ],
3578 + "engines": {
3579 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
3580 + }
3581 + },
3582 + "node_modules/function-bind": {
3583 + "version": "1.1.1",
3584 + "license": "MIT"
3585 + },
3586 + "node_modules/function.prototype.name": {
3587 + "version": "1.1.5",
3588 + "dev": true,
3589 + "license": "MIT",
3590 + "dependencies": {
3591 + "call-bind": "^1.0.2",
3592 + "define-properties": "^1.1.3",
3593 + "es-abstract": "^1.19.0",
3594 + "functions-have-names": "^1.2.2"
3595 + },
3596 + "engines": {
3597 + "node": ">= 0.4"
3598 + },
3599 + "funding": {
3600 + "url": "https://github.com/sponsors/ljharb"
3601 + }
3602 + },
3603 + "node_modules/functional-red-black-tree": {
3604 + "version": "1.0.1",
3605 + "dev": true,
3606 + "license": "MIT"
3607 + },
3608 + "node_modules/functions-have-names": {
3609 + "version": "1.2.3",
3610 + "license": "MIT",
3611 + "funding": {
3612 + "url": "https://github.com/sponsors/ljharb"
3613 + }
3614 + },
3615 + "node_modules/geojson-vt": {
3616 + "version": "3.2.1",
3617 + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz",
3618 + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg=="
3619 + },
3620 + "node_modules/get-func-name": {
3621 + "version": "2.0.0",
3622 + "dev": true,
3623 + "license": "MIT",
3624 + "engines": {
3625 + "node": "*"
3626 + }
3627 + },
3628 + "node_modules/get-intrinsic": {
3629 + "version": "1.1.2",
3630 + "license": "MIT",
3631 + "dependencies": {
3632 + "function-bind": "^1.1.1",
3633 + "has": "^1.0.3",
3634 + "has-symbols": "^1.0.3"
3635 + },
3636 + "funding": {
3637 + "url": "https://github.com/sponsors/ljharb"
3638 + }
3639 + },
3640 + "node_modules/get-stream": {
3641 + "version": "5.2.0",
3642 + "dev": true,
3643 + "license": "MIT",
3644 + "dependencies": {
3645 + "pump": "^3.0.0"
3646 + },
3647 + "engines": {
3648 + "node": ">=8"
3649 + },
3650 + "funding": {
3651 + "url": "https://github.com/sponsors/sindresorhus"
3652 + }
3653 + },
3654 + "node_modules/get-symbol-description": {
3655 + "version": "1.0.0",
3656 + "dev": true,
3657 + "license": "MIT",
3658 + "dependencies": {
3659 + "call-bind": "^1.0.2",
3660 + "get-intrinsic": "^1.1.1"
3661 + },
3662 + "engines": {
3663 + "node": ">= 0.4"
3664 + },
3665 + "funding": {
3666 + "url": "https://github.com/sponsors/ljharb"
3667 + }
3668 + },
3669 + "node_modules/getos": {
3670 + "version": "3.2.1",
3671 + "dev": true,
3672 + "license": "MIT",
3673 + "dependencies": {
3674 + "async": "^3.2.0"
3675 + }
3676 + },
3677 + "node_modules/getpass": {
3678 + "version": "0.1.7",
3679 + "dev": true,
3680 + "license": "MIT",
3681 + "dependencies": {
3682 + "assert-plus": "^1.0.0"
3683 + }
3684 + },
3685 + "node_modules/gl-matrix": {
3686 + "version": "3.4.3",
3687 + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
3688 + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
3689 + },
3690 + "node_modules/glob": {
3691 + "version": "7.2.3",
3692 + "dev": true,
3693 + "license": "ISC",
3694 + "dependencies": {
3695 + "fs.realpath": "^1.0.0",
3696 + "inflight": "^1.0.4",
3697 + "inherits": "2",
3698 + "minimatch": "^3.1.1",
3699 + "once": "^1.3.0",
3700 + "path-is-absolute": "^1.0.0"
3701 + },
3702 + "engines": {
3703 + "node": "*"
3704 + },
3705 + "funding": {
3706 + "url": "https://github.com/sponsors/isaacs"
3707 + }
3708 + },
3709 + "node_modules/glob-parent": {
3710 + "version": "6.0.2",
3711 + "dev": true,
3712 + "license": "ISC",
3713 + "dependencies": {
3714 + "is-glob": "^4.0.3"
3715 + },
3716 + "engines": {
3717 + "node": ">=10.13.0"
3718 + }
3719 + },
3720 + "node_modules/global-dirs": {
3721 + "version": "3.0.0",
3722 + "dev": true,
3723 + "license": "MIT",
3724 + "dependencies": {
3725 + "ini": "2.0.0"
3726 + },
3727 + "engines": {
3728 + "node": ">=10"
3729 + },
3730 + "funding": {
3731 + "url": "https://github.com/sponsors/sindresorhus"
3732 + }
3733 + },
3734 + "node_modules/globals": {
3735 + "version": "13.20.0",
3736 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
3737 + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
3738 + "dev": true,
3739 + "dependencies": {
3740 + "type-fest": "^0.20.2"
3741 + },
3742 + "engines": {
3743 + "node": ">=8"
3744 + },
3745 + "funding": {
3746 + "url": "https://github.com/sponsors/sindresorhus"
3747 + }
3748 + },
3749 + "node_modules/globby": {
3750 + "version": "11.1.0",
3751 + "dev": true,
3752 + "license": "MIT",
3753 + "dependencies": {
3754 + "array-union": "^2.1.0",
3755 + "dir-glob": "^3.0.1",
3756 + "fast-glob": "^3.2.9",
3757 + "ignore": "^5.2.0",
3758 + "merge2": "^1.4.1",
3759 + "slash": "^3.0.0"
3760 + },
3761 + "engines": {
3762 + "node": ">=10"
3763 + },
3764 + "funding": {
3765 + "url": "https://github.com/sponsors/sindresorhus"
3766 + }
3767 + },
3768 + "node_modules/graceful-fs": {
3769 + "version": "4.2.10",
3770 + "dev": true,
3771 + "license": "ISC"
3772 + },
3773 + "node_modules/grapheme-splitter": {
3774 + "version": "1.0.4",
3775 + "dev": true,
3776 + "license": "MIT"
3777 + },
3778 + "node_modules/grid-index": {
3779 + "version": "1.1.0",
3780 + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz",
3781 + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA=="
3782 + },
3783 + "node_modules/has": {
3784 + "version": "1.0.3",
3785 + "license": "MIT",
3786 + "dependencies": {
3787 + "function-bind": "^1.1.1"
3788 + },
3789 + "engines": {
3790 + "node": ">= 0.4.0"
3791 + }
3792 + },
3793 + "node_modules/has-bigints": {
3794 + "version": "1.0.2",
3795 + "dev": true,
3796 + "license": "MIT",
3797 + "funding": {
3798 + "url": "https://github.com/sponsors/ljharb"
3799 + }
3800 + },
3801 + "node_modules/has-flag": {
3802 + "version": "4.0.0",
3803 + "dev": true,
3804 + "license": "MIT",
3805 + "engines": {
3806 + "node": ">=8"
3807 + }
3808 + },
3809 + "node_modules/has-property-descriptors": {
3810 + "version": "1.0.0",
3811 + "license": "MIT",
3812 + "dependencies": {
3813 + "get-intrinsic": "^1.1.1"
3814 + },
3815 + "funding": {
3816 + "url": "https://github.com/sponsors/ljharb"
3817 + }
3818 + },
3819 + "node_modules/has-symbols": {
3820 + "version": "1.0.3",
3821 + "license": "MIT",
3822 + "engines": {
3823 + "node": ">= 0.4"
3824 + },
3825 + "funding": {
3826 + "url": "https://github.com/sponsors/ljharb"
3827 + }
3828 + },
3829 + "node_modules/has-tostringtag": {
3830 + "version": "1.0.0",
3831 + "license": "MIT",
3832 + "dependencies": {
3833 + "has-symbols": "^1.0.2"
3834 + },
3835 + "engines": {
3836 + "node": ">= 0.4"
3837 + },
3838 + "funding": {
3839 + "url": "https://github.com/sponsors/ljharb"
3840 + }
3841 + },
3842 + "node_modules/he": {
3843 + "version": "1.2.0",
3844 + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
3845 + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
3846 + "dev": true,
3847 + "bin": {
3848 + "he": "bin/he"
3849 + }
3850 + },
3851 + "node_modules/highlight.js": {
3852 + "version": "10.7.3",
3853 + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
3854 + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
3855 + "engines": {
3856 + "node": "*"
3857 + }
3858 + },
3859 + "node_modules/hosted-git-info": {
3860 + "version": "2.8.9",
3861 + "dev": true,
3862 + "license": "ISC"
3863 + },
3864 + "node_modules/html-encoding-sniffer": {
3865 + "version": "3.0.0",
3866 + "dev": true,
3867 + "license": "MIT",
3868 + "dependencies": {
3869 + "whatwg-encoding": "^2.0.0"
3870 + },
3871 + "engines": {
3872 + "node": ">=12"
3873 + }
3874 + },
3875 + "node_modules/http-proxy-agent": {
3876 + "version": "5.0.0",
3877 + "dev": true,
3878 + "license": "MIT",
3879 + "dependencies": {
3880 + "@tootallnate/once": "2",
3881 + "agent-base": "6",
3882 + "debug": "4"
3883 + },
3884 + "engines": {
3885 + "node": ">= 6"
3886 + }
3887 + },
3888 + "node_modules/http-signature": {
3889 + "version": "1.3.6",
3890 + "dev": true,
3891 + "license": "MIT",
3892 + "dependencies": {
3893 + "assert-plus": "^1.0.0",
3894 + "jsprim": "^2.0.2",
3895 + "sshpk": "^1.14.1"
3896 + },
3897 + "engines": {
3898 + "node": ">=0.10"
3899 + }
3900 + },
3901 + "node_modules/https-proxy-agent": {
3902 + "version": "5.0.1",
3903 + "dev": true,
3904 + "license": "MIT",
3905 + "dependencies": {
3906 + "agent-base": "6",
3907 + "debug": "4"
3908 + },
3909 + "engines": {
3910 + "node": ">= 6"
3911 + }
3912 + },
3913 + "node_modules/human-signals": {
3914 + "version": "1.1.1",
3915 + "dev": true,
3916 + "license": "Apache-2.0",
3917 + "engines": {
3918 + "node": ">=8.12.0"
3919 + }
3920 + },
3921 + "node_modules/iconv-lite": {
3922 + "version": "0.6.3",
3923 + "dev": true,
3924 + "license": "MIT",
3925 + "dependencies": {
3926 + "safer-buffer": ">= 2.1.2 < 3.0.0"
3927 + },
3928 + "engines": {
3929 + "node": ">=0.10.0"
3930 + }
3931 + },
3932 + "node_modules/ieee754": {
3933 + "version": "1.2.1",
3934 + "funding": [
3935 + {
3936 + "type": "github",
3937 + "url": "https://github.com/sponsors/feross"
3938 + },
3939 + {
3940 + "type": "patreon",
3941 + "url": "https://www.patreon.com/feross"
3942 + },
3943 + {
3944 + "type": "consulting",
3945 + "url": "https://feross.org/support"
3946 + }
3947 + ],
3948 + "license": "BSD-3-Clause"
3949 + },
3950 + "node_modules/ignore": {
3951 + "version": "5.2.0",
3952 + "dev": true,
3953 + "license": "MIT",
3954 + "engines": {
3955 + "node": ">= 4"
3956 + }
3957 + },
3958 + "node_modules/immutable": {
3959 + "version": "4.1.0",
3960 + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
3961 + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
3962 + "dev": true
3963 + },
3964 + "node_modules/import-fresh": {
3965 + "version": "3.3.0",
3966 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
3967 + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
3968 + "dev": true,
3969 + "dependencies": {
3970 + "parent-module": "^1.0.0",
3971 + "resolve-from": "^4.0.0"
3972 + },
3973 + "engines": {
3974 + "node": ">=6"
3975 + },
3976 + "funding": {
3977 + "url": "https://github.com/sponsors/sindresorhus"
3978 + }
3979 + },
3980 + "node_modules/imurmurhash": {
3981 + "version": "0.1.4",
3982 + "dev": true,
3983 + "license": "MIT",
3984 + "engines": {
3985 + "node": ">=0.8.19"
3986 + }
3987 + },
3988 + "node_modules/indent-string": {
3989 + "version": "4.0.0",
3990 + "dev": true,
3991 + "license": "MIT",
3992 + "engines": {
3993 + "node": ">=8"
3994 + }
3995 + },
3996 + "node_modules/inflight": {
3997 + "version": "1.0.6",
3998 + "dev": true,
3999 + "license": "ISC",
4000 + "dependencies": {
4001 + "once": "^1.3.0",
4002 + "wrappy": "1"
4003 + }
4004 + },
4005 + "node_modules/inherits": {
4006 + "version": "2.0.4",
4007 + "dev": true,
4008 + "license": "ISC"
4009 + },
4010 + "node_modules/ini": {
4011 + "version": "2.0.0",
4012 + "dev": true,
4013 + "license": "ISC",
4014 + "engines": {
4015 + "node": ">=10"
4016 + }
4017 + },
4018 + "node_modules/internal-slot": {
4019 + "version": "1.0.3",
4020 + "dev": true,
4021 + "license": "MIT",
4022 + "dependencies": {
4023 + "get-intrinsic": "^1.1.0",
4024 + "has": "^1.0.3",
4025 + "side-channel": "^1.0.4"
4026 + },
4027 + "engines": {
4028 + "node": ">= 0.4"
4029 + }
4030 + },
4031 + "node_modules/is-arguments": {
4032 + "version": "1.1.1",
4033 + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
4034 + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
4035 + "dependencies": {
4036 + "call-bind": "^1.0.2",
4037 + "has-tostringtag": "^1.0.0"
4038 + },
4039 + "engines": {
4040 + "node": ">= 0.4"
4041 + },
4042 + "funding": {
4043 + "url": "https://github.com/sponsors/ljharb"
4044 + }
4045 + },
4046 + "node_modules/is-arrayish": {
4047 + "version": "0.2.1",
4048 + "dev": true,
4049 + "license": "MIT"
4050 + },
4051 + "node_modules/is-bigint": {
4052 + "version": "1.0.4",
4053 + "dev": true,
4054 + "license": "MIT",
4055 + "dependencies": {
4056 + "has-bigints": "^1.0.1"
4057 + },
4058 + "funding": {
4059 + "url": "https://github.com/sponsors/ljharb"
4060 + }
4061 + },
4062 + "node_modules/is-binary-path": {
4063 + "version": "2.1.0",
4064 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
4065 + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
4066 + "dev": true,
4067 + "dependencies": {
4068 + "binary-extensions": "^2.0.0"
4069 + },
4070 + "engines": {
4071 + "node": ">=8"
4072 + }
4073 + },
4074 + "node_modules/is-boolean-object": {
4075 + "version": "1.1.2",
4076 + "dev": true,
4077 + "license": "MIT",
4078 + "dependencies": {
4079 + "call-bind": "^1.0.2",
4080 + "has-tostringtag": "^1.0.0"
4081 + },
4082 + "engines": {
4083 + "node": ">= 0.4"
4084 + },
4085 + "funding": {
4086 + "url": "https://github.com/sponsors/ljharb"
4087 + }
4088 + },
4089 + "node_modules/is-callable": {
4090 + "version": "1.2.4",
4091 + "dev": true,
4092 + "license": "MIT",
4093 + "engines": {
4094 + "node": ">= 0.4"
4095 + },
4096 + "funding": {
4097 + "url": "https://github.com/sponsors/ljharb"
4098 + }
4099 + },
4100 + "node_modules/is-ci": {
4101 + "version": "3.0.1",
4102 + "dev": true,
4103 + "license": "MIT",
4104 + "dependencies": {
4105 + "ci-info": "^3.2.0"
4106 + },
4107 + "bin": {
4108 + "is-ci": "bin.js"
4109 + }
4110 + },
4111 + "node_modules/is-core-module": {
4112 + "version": "2.10.0",
4113 + "dev": true,
4114 + "license": "MIT",
4115 + "dependencies": {
4116 + "has": "^1.0.3"
4117 + },
4118 + "funding": {
4119 + "url": "https://github.com/sponsors/ljharb"
4120 + }
4121 + },
4122 + "node_modules/is-date-object": {
4123 + "version": "1.0.5",
4124 + "license": "MIT",
4125 + "dependencies": {
4126 + "has-tostringtag": "^1.0.0"
4127 + },
4128 + "engines": {
4129 + "node": ">= 0.4"
4130 + },
4131 + "funding": {
4132 + "url": "https://github.com/sponsors/ljharb"
4133 + }
4134 + },
4135 + "node_modules/is-extglob": {
4136 + "version": "2.1.1",
4137 + "dev": true,
4138 + "license": "MIT",
4139 + "engines": {
4140 + "node": ">=0.10.0"
4141 + }
4142 + },
4143 + "node_modules/is-fullwidth-code-point": {
4144 + "version": "3.0.0",
4145 + "dev": true,
4146 + "license": "MIT",
4147 + "engines": {
4148 + "node": ">=8"
4149 + }
4150 + },
4151 + "node_modules/is-glob": {
4152 + "version": "4.0.3",
4153 + "dev": true,
4154 + "license": "MIT",
4155 + "dependencies": {
4156 + "is-extglob": "^2.1.1"
4157 + },
4158 + "engines": {
4159 + "node": ">=0.10.0"
4160 + }
4161 + },
4162 + "node_modules/is-installed-globally": {
4163 + "version": "0.4.0",
4164 + "dev": true,
4165 + "license": "MIT",
4166 + "dependencies": {
4167 + "global-dirs": "^3.0.0",
4168 + "is-path-inside": "^3.0.2"
4169 + },
4170 + "engines": {
4171 + "node": ">=10"
4172 + },
4173 + "funding": {
4174 + "url": "https://github.com/sponsors/sindresorhus"
4175 + }
4176 + },
4177 + "node_modules/is-negative-zero": {
4178 + "version": "2.0.2",
4179 + "dev": true,
4180 + "license": "MIT",
4181 + "engines": {
4182 + "node": ">= 0.4"
4183 + },
4184 + "funding": {
4185 + "url": "https://github.com/sponsors/ljharb"
4186 + }
4187 + },
4188 + "node_modules/is-number": {
4189 + "version": "7.0.0",
4190 + "dev": true,
4191 + "license": "MIT",
4192 + "engines": {
4193 + "node": ">=0.12.0"
4194 + }
4195 + },
4196 + "node_modules/is-number-object": {
4197 + "version": "1.0.7",
4198 + "dev": true,
4199 + "license": "MIT",
4200 + "dependencies": {
4201 + "has-tostringtag": "^1.0.0"
4202 + },
4203 + "engines": {
4204 + "node": ">= 0.4"
4205 + },
4206 + "funding": {
4207 + "url": "https://github.com/sponsors/ljharb"
4208 + }
4209 + },
4210 + "node_modules/is-path-inside": {
4211 + "version": "3.0.3",
4212 + "dev": true,
4213 + "license": "MIT",
4214 + "engines": {
4215 + "node": ">=8"
4216 + }
4217 + },
4218 + "node_modules/is-potential-custom-element-name": {
4219 + "version": "1.0.1",
4220 + "dev": true,
4221 + "license": "MIT"
4222 + },
4223 + "node_modules/is-regex": {
4224 + "version": "1.1.4",
4225 + "license": "MIT",
4226 + "dependencies": {
4227 + "call-bind": "^1.0.2",
4228 + "has-tostringtag": "^1.0.0"
4229 + },
4230 + "engines": {
4231 + "node": ">= 0.4"
4232 + },
4233 + "funding": {
4234 + "url": "https://github.com/sponsors/ljharb"
4235 + }
4236 + },
4237 + "node_modules/is-shared-array-buffer": {
4238 + "version": "1.0.2",
4239 + "dev": true,
4240 + "license": "MIT",
4241 + "dependencies": {
4242 + "call-bind": "^1.0.2"
4243 + },
4244 + "funding": {
4245 + "url": "https://github.com/sponsors/ljharb"
4246 + }
4247 + },
4248 + "node_modules/is-stream": {
4249 + "version": "2.0.1",
4250 + "dev": true,
4251 + "license": "MIT",
4252 + "engines": {
4253 + "node": ">=8"
4254 + },
4255 + "funding": {
4256 + "url": "https://github.com/sponsors/sindresorhus"
4257 + }
4258 + },
4259 + "node_modules/is-string": {
4260 + "version": "1.0.7",
4261 + "dev": true,
4262 + "license": "MIT",
4263 + "dependencies": {
4264 + "has-tostringtag": "^1.0.0"
4265 + },
4266 + "engines": {
4267 + "node": ">= 0.4"
4268 + },
4269 + "funding": {
4270 + "url": "https://github.com/sponsors/ljharb"
4271 + }
4272 + },
4273 + "node_modules/is-symbol": {
4274 + "version": "1.0.4",
4275 + "dev": true,
4276 + "license": "MIT",
4277 + "dependencies": {
4278 + "has-symbols": "^1.0.2"
4279 + },
4280 + "engines": {
4281 + "node": ">= 0.4"
4282 + },
4283 + "funding": {
4284 + "url": "https://github.com/sponsors/ljharb"
4285 + }
4286 + },
4287 + "node_modules/is-typedarray": {
4288 + "version": "1.0.0",
4289 + "dev": true,
4290 + "license": "MIT"
4291 + },
4292 + "node_modules/is-unicode-supported": {
4293 + "version": "0.1.0",
4294 + "dev": true,
4295 + "license": "MIT",
4296 + "engines": {
4297 + "node": ">=10"
4298 + },
4299 + "funding": {
4300 + "url": "https://github.com/sponsors/sindresorhus"
4301 + }
4302 + },
4303 + "node_modules/is-weakref": {
4304 + "version": "1.0.2",
4305 + "dev": true,
4306 + "license": "MIT",
4307 + "dependencies": {
4308 + "call-bind": "^1.0.2"
4309 + },
4310 + "funding": {
4311 + "url": "https://github.com/sponsors/ljharb"
4312 + }
4313 + },
4314 + "node_modules/isexe": {
4315 + "version": "2.0.0",
4316 + "dev": true,
4317 + "license": "ISC"
4318 + },
4319 + "node_modules/isstream": {
4320 + "version": "0.1.2",
4321 + "dev": true,
4322 + "license": "MIT"
4323 + },
4324 + "node_modules/joi": {
4325 + "version": "17.9.1",
4326 + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz",
4327 + "integrity": "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==",
4328 + "dev": true,
4329 + "dependencies": {
4330 + "@hapi/hoek": "^9.0.0",
4331 + "@hapi/topo": "^5.0.0",
4332 + "@sideway/address": "^4.1.3",
4333 + "@sideway/formula": "^3.0.1",
4334 + "@sideway/pinpoint": "^2.0.0"
4335 + }
4336 + },
4337 + "node_modules/js-beautify": {
4338 + "version": "1.14.6",
4339 + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.6.tgz",
4340 + "integrity": "sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==",
4341 + "dev": true,
4342 + "dependencies": {
4343 + "config-chain": "^1.1.13",
4344 + "editorconfig": "^0.15.3",
4345 + "glob": "^8.0.3",
4346 + "nopt": "^6.0.0"
4347 + },
4348 + "bin": {
4349 + "css-beautify": "js/bin/css-beautify.js",
4350 + "html-beautify": "js/bin/html-beautify.js",
4351 + "js-beautify": "js/bin/js-beautify.js"
4352 + },
4353 + "engines": {
4354 + "node": ">=10"
4355 + }
4356 + },
4357 + "node_modules/js-beautify/node_modules/brace-expansion": {
4358 + "version": "2.0.1",
4359 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
4360 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
4361 + "dev": true,
4362 + "dependencies": {
4363 + "balanced-match": "^1.0.0"
4364 + }
4365 + },
4366 + "node_modules/js-beautify/node_modules/glob": {
4367 + "version": "8.1.0",
4368 + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
4369 + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
4370 + "dev": true,
4371 + "dependencies": {
4372 + "fs.realpath": "^1.0.0",
4373 + "inflight": "^1.0.4",
4374 + "inherits": "2",
4375 + "minimatch": "^5.0.1",
4376 + "once": "^1.3.0"
4377 + },
4378 + "engines": {
4379 + "node": ">=12"
4380 + },
4381 + "funding": {
4382 + "url": "https://github.com/sponsors/isaacs"
4383 + }
4384 + },
4385 + "node_modules/js-beautify/node_modules/minimatch": {
4386 + "version": "5.1.6",
4387 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
4388 + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
4389 + "dev": true,
4390 + "dependencies": {
4391 + "brace-expansion": "^2.0.1"
4392 + },
4393 + "engines": {
4394 + "node": ">=10"
4395 + }
4396 + },
4397 + "node_modules/js-sdsl": {
4398 + "version": "4.4.0",
4399 + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz",
4400 + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==",
4401 + "dev": true,
4402 + "funding": {
4403 + "type": "opencollective",
4404 + "url": "https://opencollective.com/js-sdsl"
4405 + }
4406 + },
4407 + "node_modules/js-yaml": {
4408 + "version": "4.1.0",
4409 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
4410 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
4411 + "dev": true,
4412 + "dependencies": {
4413 + "argparse": "^2.0.1"
4414 + },
4415 + "bin": {
4416 + "js-yaml": "bin/js-yaml.js"
4417 + }
4418 + },
4419 + "node_modules/jsbn": {
4420 + "version": "0.1.1",
4421 + "dev": true,
4422 + "license": "MIT"
4423 + },
4424 + "node_modules/jsdom": {
4425 + "version": "21.1.1",
4426 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
4427 + "integrity": "sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==",
4428 + "dev": true,
4429 + "dependencies": {
4430 + "abab": "^2.0.6",
4431 + "acorn": "^8.8.2",
4432 + "acorn-globals": "^7.0.0",
4433 + "cssstyle": "^3.0.0",
4434 + "data-urls": "^4.0.0",
4435 + "decimal.js": "^10.4.3",
4436 + "domexception": "^4.0.0",
4437 + "escodegen": "^2.0.0",
4438 + "form-data": "^4.0.0",
4439 + "html-encoding-sniffer": "^3.0.0",
4440 + "http-proxy-agent": "^5.0.0",
4441 + "https-proxy-agent": "^5.0.1",
4442 + "is-potential-custom-element-name": "^1.0.1",
4443 + "nwsapi": "^2.2.2",
4444 + "parse5": "^7.1.2",
4445 + "rrweb-cssom": "^0.6.0",
4446 + "saxes": "^6.0.0",
4447 + "symbol-tree": "^3.2.4",
4448 + "tough-cookie": "^4.1.2",
4449 + "w3c-xmlserializer": "^4.0.0",
4450 + "webidl-conversions": "^7.0.0",
4451 + "whatwg-encoding": "^2.0.0",
4452 + "whatwg-mimetype": "^3.0.0",
4453 + "whatwg-url": "^12.0.1",
4454 + "ws": "^8.13.0",
4455 + "xml-name-validator": "^4.0.0"
4456 + },
4457 + "engines": {
4458 + "node": ">=14"
4459 + },
4460 + "peerDependencies": {
4461 + "canvas": "^2.5.0"
4462 + },
4463 + "peerDependenciesMeta": {
4464 + "canvas": {
4465 + "optional": true
4466 + }
4467 + }
4468 + },
4469 + "node_modules/jsdom/node_modules/form-data": {
4470 + "version": "4.0.0",
4471 + "dev": true,
4472 + "license": "MIT",
4473 + "dependencies": {
4474 + "asynckit": "^0.4.0",
4475 + "combined-stream": "^1.0.8",
4476 + "mime-types": "^2.1.12"
4477 + },
4478 + "engines": {
4479 + "node": ">= 6"
4480 + }
4481 + },
4482 + "node_modules/jsdom/node_modules/tough-cookie": {
4483 + "version": "4.1.2",
4484 + "dev": true,
4485 + "license": "BSD-3-Clause",
4486 + "dependencies": {
4487 + "psl": "^1.1.33",
4488 + "punycode": "^2.1.1",
4489 + "universalify": "^0.2.0",
4490 + "url-parse": "^1.5.3"
4491 + },
4492 + "engines": {
4493 + "node": ">=6"
4494 + }
4495 + },
4496 + "node_modules/jsdom/node_modules/universalify": {
4497 + "version": "0.2.0",
4498 + "dev": true,
4499 + "license": "MIT",
4500 + "engines": {
4501 + "node": ">= 4.0.0"
4502 + }
4503 + },
4504 + "node_modules/json-parse-better-errors": {
4505 + "version": "1.0.2",
4506 + "dev": true,
4507 + "license": "MIT"
4508 + },
4509 + "node_modules/json-schema": {
4510 + "version": "0.4.0",
4511 + "dev": true,
4512 + "license": "(AFL-2.1 OR BSD-3-Clause)"
4513 + },
4514 + "node_modules/json-schema-traverse": {
4515 + "version": "0.4.1",
4516 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
4517 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
4518 + "dev": true
4519 + },
4520 + "node_modules/json-stable-stringify-without-jsonify": {
4521 + "version": "1.0.1",
4522 + "dev": true,
4523 + "license": "MIT"
4524 + },
4525 + "node_modules/json-stringify-safe": {
4526 + "version": "5.0.1",
4527 + "dev": true,
4528 + "license": "ISC"
4529 + },
4530 + "node_modules/jsonfile": {
4531 + "version": "6.1.0",
4532 + "dev": true,
4533 + "license": "MIT",
4534 + "dependencies": {
4535 + "universalify": "^2.0.0"
4536 + },
4537 + "optionalDependencies": {
4538 + "graceful-fs": "^4.1.6"
4539 + }
4540 + },
4541 + "node_modules/jsprim": {
4542 + "version": "2.0.2",
4543 + "dev": true,
4544 + "engines": [
4545 + "node >=0.6.0"
4546 + ],
4547 + "license": "MIT",
4548 + "dependencies": {
4549 + "assert-plus": "1.0.0",
4550 + "extsprintf": "1.3.0",
4551 + "json-schema": "0.4.0",
4552 + "verror": "1.10.0"
4553 + }
4554 + },
4555 + "node_modules/kdbush": {
4556 + "version": "3.0.0",
4557 + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz",
4558 + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew=="
4559 + },
4560 + "node_modules/lazy-ass": {
4561 + "version": "1.6.0",
4562 + "dev": true,
4563 + "license": "MIT",
4564 + "engines": {
4565 + "node": "> 0.8"
4566 + }
4567 + },
4568 + "node_modules/leaflet": {
4569 + "version": "1.9.3",
4570 + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.3.tgz",
4571 + "integrity": "sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ=="
4572 + },
4573 + "node_modules/levn": {
4574 + "version": "0.4.1",
4575 + "dev": true,
4576 + "license": "MIT",
4577 + "dependencies": {
4578 + "prelude-ls": "^1.2.1",
4579 + "type-check": "~0.4.0"
4580 + },
4581 + "engines": {
4582 + "node": ">= 0.8.0"
4583 + }
4584 + },
4585 + "node_modules/listr2": {
4586 + "version": "3.14.0",
4587 + "dev": true,
4588 + "license": "MIT",
4589 + "dependencies": {
4590 + "cli-truncate": "^2.1.0",
4591 + "colorette": "^2.0.16",
4592 + "log-update": "^4.0.0",
4593 + "p-map": "^4.0.0",
4594 + "rfdc": "^1.3.0",
4595 + "rxjs": "^7.5.1",
4596 + "through": "^2.3.8",
4597 + "wrap-ansi": "^7.0.0"
4598 + },
4599 + "engines": {
4600 + "node": ">=10.0.0"
4601 + },
4602 + "peerDependencies": {
4603 + "enquirer": ">= 2.3.0 < 3"
4604 + },
4605 + "peerDependenciesMeta": {
4606 + "enquirer": {
4607 + "optional": true
4608 + }
4609 + }
4610 + },
4611 + "node_modules/load-json-file": {
4612 + "version": "4.0.0",
4613 + "dev": true,
4614 + "license": "MIT",
4615 + "dependencies": {
4616 + "graceful-fs": "^4.1.2",
4617 + "parse-json": "^4.0.0",
4618 + "pify": "^3.0.0",
4619 + "strip-bom": "^3.0.0"
4620 + },
4621 + "engines": {
4622 + "node": ">=4"
4623 + }
4624 + },
4625 + "node_modules/load-json-file/node_modules/pify": {
4626 + "version": "3.0.0",
4627 + "dev": true,
4628 + "license": "MIT",
4629 + "engines": {
4630 + "node": ">=4"
4631 + }
4632 + },
4633 + "node_modules/local-pkg": {
4634 + "version": "0.4.2",
4635 + "dev": true,
4636 + "license": "MIT",
4637 + "engines": {
4638 + "node": ">=14"
4639 + },
4640 + "funding": {
4641 + "url": "https://github.com/sponsors/antfu"
4642 + }
4643 + },
4644 + "node_modules/locate-path": {
4645 + "version": "6.0.0",
4646 + "dev": true,
4647 + "license": "MIT",
4648 + "dependencies": {
4649 + "p-locate": "^5.0.0"
4650 + },
4651 + "engines": {
4652 + "node": ">=10"
4653 + },
4654 + "funding": {
4655 + "url": "https://github.com/sponsors/sindresorhus"
4656 + }
4657 + },
4658 + "node_modules/lodash": {
4659 + "version": "4.17.21",
4660 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
4661 + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
4662 + },
4663 + "node_modules/lodash-es": {
4664 + "version": "4.17.21",
4665 + "license": "MIT"
4666 + },
4667 + "node_modules/lodash-unified": {
4668 + "version": "1.0.2",
4669 + "license": "MIT",
4670 + "peerDependencies": {
4671 + "@types/lodash-es": "*",
4672 + "lodash": "*",
4673 + "lodash-es": "*"
4674 + }
4675 + },
4676 + "node_modules/lodash.debounce": {
4677 + "version": "4.0.8",
4678 + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
4679 + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
4680 + },
4681 + "node_modules/lodash.merge": {
4682 + "version": "4.6.2",
4683 + "dev": true,
4684 + "license": "MIT"
4685 + },
4686 + "node_modules/lodash.once": {
4687 + "version": "4.1.1",
4688 + "dev": true,
4689 + "license": "MIT"
4690 + },
4691 + "node_modules/log-symbols": {
4692 + "version": "4.1.0",
4693 + "dev": true,
4694 + "license": "MIT",
4695 + "dependencies": {
4696 + "chalk": "^4.1.0",
4697 + "is-unicode-supported": "^0.1.0"
4698 + },
4699 + "engines": {
4700 + "node": ">=10"
4701 + },
4702 + "funding": {
4703 + "url": "https://github.com/sponsors/sindresorhus"
4704 + }
4705 + },
4706 + "node_modules/log-update": {
4707 + "version": "4.0.0",
4708 + "dev": true,
4709 + "license": "MIT",
4710 + "dependencies": {
4711 + "ansi-escapes": "^4.3.0",
4712 + "cli-cursor": "^3.1.0",
4713 + "slice-ansi": "^4.0.0",
4714 + "wrap-ansi": "^6.2.0"
4715 + },
4716 + "engines": {
4717 + "node": ">=10"
4718 + },
4719 + "funding": {
4720 + "url": "https://github.com/sponsors/sindresorhus"
4721 + }
4722 + },
4723 + "node_modules/log-update/node_modules/slice-ansi": {
4724 + "version": "4.0.0",
4725 + "dev": true,
4726 + "license": "MIT",
4727 + "dependencies": {
4728 + "ansi-styles": "^4.0.0",
4729 + "astral-regex": "^2.0.0",
4730 + "is-fullwidth-code-point": "^3.0.0"
4731 + },
4732 + "engines": {
4733 + "node": ">=10"
4734 + },
4735 + "funding": {
4736 + "url": "https://github.com/chalk/slice-ansi?sponsor=1"
4737 + }
4738 + },
4739 + "node_modules/log-update/node_modules/wrap-ansi": {
4740 + "version": "6.2.0",
4741 + "dev": true,
4742 + "license": "MIT",
4743 + "dependencies": {
4744 + "ansi-styles": "^4.0.0",
4745 + "string-width": "^4.1.0",
4746 + "strip-ansi": "^6.0.0"
4747 + },
4748 + "engines": {
4749 + "node": ">=8"
4750 + }
4751 + },
4752 + "node_modules/loupe": {
4753 + "version": "2.3.4",
4754 + "dev": true,
4755 + "license": "MIT",
4756 + "dependencies": {
4757 + "get-func-name": "^2.0.0"
4758 + }
4759 + },
4760 + "node_modules/lru-cache": {
4761 + "version": "6.0.0",
4762 + "dev": true,
4763 + "license": "ISC",
4764 + "dependencies": {
4765 + "yallist": "^4.0.0"
4766 + },
4767 + "engines": {
4768 + "node": ">=10"
4769 + }
4770 + },
4771 + "node_modules/magic-string": {
4772 + "version": "0.25.9",
4773 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
4774 + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
4775 + "dependencies": {
4776 + "sourcemap-codec": "^1.4.8"
4777 + }
4778 + },
4779 + "node_modules/map-stream": {
4780 + "version": "0.1.0",
4781 + "dev": true
4782 + },
4783 + "node_modules/mapbox-gl": {
4784 + "version": "2.14.1",
4785 + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-2.14.1.tgz",
4786 + "integrity": "sha512-KfHYcjzJeEF1UXZQin3vSdyIXoTBBdpNesTMmyzP9Dv8wRg8DnRu078Vr/CJ2A6Xocsvh9UAqTWYtHlrc20nwA==",
4787 + "dependencies": {
4788 + "@mapbox/geojson-rewind": "^0.5.2",
4789 + "@mapbox/jsonlint-lines-primitives": "^2.0.2",
4790 + "@mapbox/mapbox-gl-supported": "^2.0.1",
4791 + "@mapbox/point-geometry": "^0.1.0",
4792 + "@mapbox/tiny-sdf": "^2.0.6",
4793 + "@mapbox/unitbezier": "^0.0.1",
4794 + "@mapbox/vector-tile": "^1.3.1",
4795 + "@mapbox/whoots-js": "^3.1.0",
4796 + "csscolorparser": "~1.0.3",
4797 + "earcut": "^2.2.4",
4798 + "geojson-vt": "^3.2.1",
4799 + "gl-matrix": "^3.4.3",
4800 + "grid-index": "^1.1.0",
4801 + "murmurhash-js": "^1.0.0",
4802 + "pbf": "^3.2.1",
4803 + "potpack": "^2.0.0",
4804 + "quickselect": "^2.0.0",
4805 + "rw": "^1.3.3",
4806 + "supercluster": "^7.1.5",
4807 + "tinyqueue": "^2.0.3",
4808 + "vt-pbf": "^3.1.3"
4809 + }
4810 + },
4811 + "node_modules/marquee-infinite": {
4812 + "version": "0.0.4",
4813 + "resolved": "https://registry.npmjs.org/marquee-infinite/-/marquee-infinite-0.0.4.tgz",
4814 + "integrity": "sha512-6PptmaO9Bs9ay5LEbLT/TGeKtclHiICw+EOMi2fkF/CMkJcsQyDyqBfNseDTIIGq4Pwm2T0n4Fbh6FlHU4rArQ==",
4815 + "dependencies": {
4816 + "lodash.debounce": "^4.0.8"
4817 + }
4818 + },
4819 + "node_modules/mavon-editor": {
4820 + "version": "3.0.1",
4821 + "resolved": "https://registry.npmjs.org/mavon-editor/-/mavon-editor-3.0.1.tgz",
4822 + "integrity": "sha512-973cYCwv+AB+fcecsU6Ua6UXATxDMaY0Q7QzKQ/GmRW1sg+3DolZDnCGXth7XHDgrmqKTO57N42fVYujt0wfFw==",
4823 + "dependencies": {
4824 + "xss": "^1.0.10"
4825 + }
4826 + },
4827 + "node_modules/memoize-one": {
4828 + "version": "6.0.0",
4829 + "license": "MIT"
4830 + },
4831 + "node_modules/memorystream": {
4832 + "version": "0.3.1",
4833 + "dev": true,
4834 + "engines": {
4835 + "node": ">= 0.10.0"
4836 + }
4837 + },
4838 + "node_modules/merge-stream": {
4839 + "version": "2.0.0",
4840 + "dev": true,
4841 + "license": "MIT"
4842 + },
4843 + "node_modules/merge2": {
4844 + "version": "1.4.1",
4845 + "dev": true,
4846 + "license": "MIT",
4847 + "engines": {
4848 + "node": ">= 8"
4849 + }
4850 + },
4851 + "node_modules/micromatch": {
4852 + "version": "4.0.5",
4853 + "dev": true,
4854 + "license": "MIT",
4855 + "dependencies": {
4856 + "braces": "^3.0.2",
4857 + "picomatch": "^2.3.1"
4858 + },
4859 + "engines": {
4860 + "node": ">=8.6"
4861 + }
4862 + },
4863 + "node_modules/mime-db": {
4864 + "version": "1.52.0",
4865 + "dev": true,
4866 + "license": "MIT",
4867 + "engines": {
4868 + "node": ">= 0.6"
4869 + }
4870 + },
4871 + "node_modules/mime-types": {
4872 + "version": "2.1.35",
4873 + "dev": true,
4874 + "license": "MIT",
4875 + "dependencies": {
4876 + "mime-db": "1.52.0"
4877 + },
4878 + "engines": {
4879 + "node": ">= 0.6"
4880 + }
4881 + },
4882 + "node_modules/mimic-fn": {
4883 + "version": "2.1.0",
4884 + "dev": true,
4885 + "license": "MIT",
4886 + "engines": {
4887 + "node": ">=6"
4888 + }
4889 + },
4890 + "node_modules/minimatch": {
4891 + "version": "3.1.2",
4892 + "dev": true,
4893 + "license": "ISC",
4894 + "dependencies": {
4895 + "brace-expansion": "^1.1.7"
4896 + },
4897 + "engines": {
4898 + "node": "*"
4899 + }
4900 + },
4901 + "node_modules/minimist": {
4902 + "version": "1.2.8",
4903 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
4904 + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
4905 + "funding": {
4906 + "url": "https://github.com/sponsors/ljharb"
4907 + }
4908 + },
4909 + "node_modules/ms": {
4910 + "version": "2.1.2",
4911 + "dev": true,
4912 + "license": "MIT"
4913 + },
4914 + "node_modules/muggle-string": {
4915 + "version": "0.2.2",
4916 + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz",
4917 + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==",
4918 + "dev": true
4919 + },
4920 + "node_modules/murmurhash-js": {
4921 + "version": "1.0.0",
4922 + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
4923 + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="
4924 + },
4925 + "node_modules/nanoid": {
4926 + "version": "3.3.6",
4927 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
4928 + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
4929 + "funding": [
4930 + {
4931 + "type": "github",
4932 + "url": "https://github.com/sponsors/ai"
4933 + }
4934 + ],
4935 + "bin": {
4936 + "nanoid": "bin/nanoid.cjs"
4937 + },
4938 + "engines": {
4939 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
4940 + }
4941 + },
4942 + "node_modules/natural-compare": {
4943 + "version": "1.4.0",
4944 + "dev": true,
4945 + "license": "MIT"
4946 + },
4947 + "node_modules/nice-try": {
4948 + "version": "1.0.5",
4949 + "dev": true,
4950 + "license": "MIT"
4951 + },
4952 + "node_modules/nopt": {
4953 + "version": "6.0.0",
4954 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
4955 + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
4956 + "dev": true,
4957 + "dependencies": {
4958 + "abbrev": "^1.0.0"
4959 + },
4960 + "bin": {
4961 + "nopt": "bin/nopt.js"
4962 + },
4963 + "engines": {
4964 + "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
4965 + }
4966 + },
4967 + "node_modules/normalize-package-data": {
4968 + "version": "2.5.0",
4969 + "dev": true,
4970 + "license": "BSD-2-Clause",
4971 + "dependencies": {
4972 + "hosted-git-info": "^2.1.4",
4973 + "resolve": "^1.10.0",
4974 + "semver": "2 || 3 || 4 || 5",
4975 + "validate-npm-package-license": "^3.0.1"
4976 + }
4977 + },
4978 + "node_modules/normalize-package-data/node_modules/semver": {
4979 + "version": "5.7.1",
4980 + "dev": true,
4981 + "license": "ISC",
4982 + "bin": {
4983 + "semver": "bin/semver"
4984 + }
4985 + },
4986 + "node_modules/normalize-path": {
4987 + "version": "3.0.0",
4988 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
4989 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
4990 + "dev": true,
4991 + "engines": {
4992 + "node": ">=0.10.0"
4993 + }
4994 + },
4995 + "node_modules/normalize-wheel-es": {
4996 + "version": "1.2.0",
4997 + "license": "BSD-3-Clause"
4998 + },
4999 + "node_modules/npm-run-all": {

This file is too large to show in full.

package.json new
+84
@@ -0,0 +1,84 @@
1 +{
2 + "name": "pragmatic",
3 + "version": "5.0.0",
4 + "private": true,
5 + "scripts": {
6 + "dev": "vite",
7 + "build": "run-p type-check build-only",
8 + "preview": "vite preview --port 4173",
9 + "test:unit": "vitest --environment jsdom",
10 + "test:e2e": "start-server-and-test preview http://localhost:4173/ 'cypress open --e2e'",
11 + "test:e2e:ci": "start-server-and-test preview http://localhost:4173/ 'cypress run --e2e'",
12 + "build-only": "vite build",
13 + "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false",
14 + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
15 + },
16 + "dependencies": {
17 + "@element-plus/icons-vue": "^2.1.0",
18 + "@fullcalendar/core": "^5.11.4",
19 + "@fullcalendar/daygrid": "^5.11.4",
20 + "@fullcalendar/interaction": "^5.11.4",
21 + "@fullcalendar/list": "^5.11.4",
22 + "@fullcalendar/timegrid": "^5.11.4",
23 + "@fullcalendar/vue3": "^5.11.4",
24 + "@mdi/font": "^7.2.96",
25 + "@vue-leaflet/vue-leaflet": "^0.9.0",
26 + "animate.css": "^4.1.1",
27 + "balloon-css": "^1.2.0",
28 + "chance": "^1.1.11",
29 + "cryptocoins-icons": "^2.9.0",
30 + "dayjs": "^1.11.7",
31 + "detect-browser": "^5.3.0",
32 + "drift-zoom": "^1.5.1",
33 + "echarts": "^5.4.2",
34 + "element-plus": "^2.3.4",
35 + "file-saver": "^2.0.5",
36 + "flag-icon-css": "^4.1.7",
37 + "flex.box": "^3.4.4",
38 + "leaflet": "^1.9.3",
39 + "lodash": "^4.17.21",
40 + "mapbox-gl": "^2.14.1",
41 + "marquee-infinite": "^0.0.4",
42 + "mavon-editor": "^3.0.1",
43 + "papaparse": "^5.4.1",
44 + "pell": "^1.0.6",
45 + "perfect-scrollbar": "^1.5.5",
46 + "pinia": "^2.0.22",
47 + "pinia-plugin-persistedstate": "^2.2.0",
48 + "quill": "^1.3.7",
49 + "tui-grid": "^4.21.9",
50 + "v-click-outside": "^3.2.0",
51 + "v-viewer": "3.0.11",
52 + "vue": "^3.2.47",
53 + "vue-chartkick": "^1.1.0",
54 + "vue-fullscreen": "^3.1.1",
55 + "vue-i18n": "^9.2.2",
56 + "vue-router": "^4.1.6",
57 + "vue-virtual-collection": "^1.5.0",
58 + "vue3-highlightjs": "^1.0.5",
59 + "vue3-tui-grid": "^0.1.51"
60 + },
61 + "devDependencies": {
62 + "@rushstack/eslint-patch": "^1.2.0",
63 + "@types/jsdom": "^21.1.1",
64 + "@types/node": "^18.16.0",
65 + "@vitejs/plugin-vue": "^3.2.0",
66 + "@vue/eslint-config-prettier": "^7.1.0",
67 + "@vue/eslint-config-typescript": "^11.0.2",
68 + "@vue/test-utils": "^2.3.2",
69 + "@vue/tsconfig": "^0.3.2",
70 + "cypress": "^12.10.0",
71 + "eslint": "^8.39.0",
72 + "eslint-plugin-vue": "^9.11.0",
73 + "jsdom": "^21.1.1",
74 + "npm-run-all": "^4.1.5",
75 + "prettier": "^2.8.8",
76 + "sass": "^1.62.0",
77 + "start-server-and-test": "^2.0.0",
78 + "typescript": "~4.9.5",
79 + "url": "^0.11.0",
80 + "vite": "^3.2.6",
81 + "vitest": "^0.23.4",
82 + "vue-tsc": "^1.4.1"
83 + }
84 +}
public/.htaccess new
+8
@@ -0,0 +1,8 @@
1 +<IfModule mod_rewrite.c>
2 +RewriteEngine On
3 +# Send all requests to the index.html unless
4 +# it's a directory or a file that actually exists
5 +RewriteCond %{REQUEST_FILENAME} !-d
6 +RewriteCond %{REQUEST_FILENAME} !-f
7 +RewriteRule ^ index.html [L]
8 +</IfModule>
public/Ripple-2s-100px.svg new
+1
@@ -0,0 +1 @@
1 +<svg width="100px" height="100px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="lds-ripple" style="background: none;"><circle cx="50" cy="50" r="28.6685" fill="none" ng-attr-stroke="{{config.c1}}" ng-attr-stroke-width="{{config.width}}" stroke="#4a596a" stroke-width="2"><animate attributeName="r" calcMode="spline" values="0;30" keyTimes="0;1" dur="2" keySplines="0 0.2 0.8 1" begin="-1s" repeatCount="indefinite"></animate><animate attributeName="opacity" calcMode="spline" values="1;0" keyTimes="0;1" dur="2" keySplines="0.2 0 0.8 1" begin="-1s" repeatCount="indefinite"></animate></circle><circle cx="50" cy="50" r="15.9828" fill="none" ng-attr-stroke="{{config.c2}}" ng-attr-stroke-width="{{config.width}}" stroke="#89ade8" stroke-width="2"><animate attributeName="r" calcMode="spline" values="0;30" keyTimes="0;1" dur="2" keySplines="0 0.2 0.8 1" begin="0s" repeatCount="indefinite"></animate><animate attributeName="opacity" calcMode="spline" values="1;0" keyTimes="0;1" dur="2" keySplines="0.2 0 0.8 1" begin="0s" repeatCount="indefinite"></animate></circle></svg>
public/Ripple-2s-200px.gif
Binary files /dev/null and b/public/Ripple-2s-200px.gif differ
public/browserconfig.xml new
+2
@@ -0,0 +1,2 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<browserconfig><msapplication><tile><square70x70logo src="/static/icons/ms-icon-70x70.png"/><square150x150logo src="/static/icons/ms-icon-150x150.png"/><square310x310logo src="/static/icons/ms-icon-310x310.png"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>
public/favicon.ico
Binary files /dev/null and b/public/favicon.ico differ
public/logo.png
Binary files /dev/null and b/public/logo.png differ
public/logo.svg new
+1
@@ -0,0 +1 @@
1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><circle cx="530.707" cy="386.605" r="355.605" style="fill:#4a596a;"/><path d="M175.101,386.605c57.888,0 111.022,135.83 152.523,169.979c53.577,44.085 87.767,110.895 87.767,185.627c0,132.619 -107.67,240.289 -240.29,240.289c0.746,0 0,-181.97 0,-240.289c0,-58.319 0.006,-222.986 0,-355.606Z" style="fill:#4a596a;"/><g id="Livello1"><clipPath id="_clip1"><circle cx="530.707" cy="386.605" r="355.605"/></clipPath><g clip-path="url(#_clip1)"><clipPath id="_clip2"><path d="M532.586,30c45.078,0 88.256,8.012 128.121,22.658c0.028,0.01 -0.027,180.949 -0.027,333.447c0,152.499 0.436,333.298 0.027,333.448c-39.865,14.645 -83.043,22.658 -128.121,22.658c-41.3,0 -81.005,-6.726 -118.029,-19.116c0.11,0.036 -0.166,-180.8 -0.166,-336.99c0,-156.155 1.192,-337.332 0.072,-336.957c37.051,-12.411 76.788,-19.148 118.123,-19.148Z"/></clipPath><g clip-path="url(#_clip2)"><path d="M414.391,30l0,712.211l246.289,0l0,-712.211l-246.289,0Z" style="fill:url(#_Linear3);"/></g><clipPath id="_clip4"><path d="M532.707,31c43.98,0 86.105,8.035 125,22.721c0.027,0.011 -0.027,181.458 -0.027,334.384c0,152.927 0.425,334.234 0.027,334.384c-38.895,14.687 -81.02,22.722 -125,22.722c-40.294,0 -79.032,-6.745 -115.154,-19.17c0.107,0.037 -0.162,-181.308 -0.162,-337.936c0,-156.593 1.162,-338.279 0.071,-337.904c36.148,-12.445 74.917,-19.201 115.245,-19.201Z"/></clipPath><g clip-path="url(#_clip4)"><path d="M417.391,31l0,714.211l240.289,0l0,-714.211l-240.289,0Z" style="fill:url(#_Linear5);"/></g></g></g><defs><linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1.14532e-13,-712.211,246.289,-3.96063e-14,537.535,742.211)"><stop offset="0%" style="stop-color:#bde9ff;stop-opacity:1"/><stop offset="52%" style="stop-color:#698092;stop-opacity:1"/><stop offset="100%" style="stop-color:#4a596a;stop-opacity:1"/></linearGradient><linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1.14854e-13,-714.211,240.289,-3.86415e-14,537.535,745.211)"><stop offset="0%" style="stop-color:#5f8fdf;stop-opacity:1"/><stop offset="52%" style="stop-color:#506789;stop-opacity:1"/><stop offset="100%" style="stop-color:#4a596a;stop-opacity:1"/></linearGradient></defs></svg>
public/manifest.json new
+48
@@ -0,0 +1,48 @@
1 +{
2 + "name": "Pragmatic - Vue.js Admin Template",
3 + "short_name": "Pragmatic",
4 + "manifest_version": 1,
5 + "version": "1.0.0",
6 + "start_url": ".",
7 + "display": "standalone",
8 + "background_color": "#ffffff",
9 + "theme_color": "#ffffff",
10 + "icons": [
11 + {
12 + "src": "/static/icons/android-icon-36x36.png",
13 + "sizes": "36x36",
14 + "type": "image/png",
15 + "density": "0.75"
16 + },
17 + {
18 + "src": "/static/icons/android-icon-48x48.png",
19 + "sizes": "48x48",
20 + "type": "image/png",
21 + "density": "1.0"
22 + },
23 + {
24 + "src": "/static/icons/android-icon-72x72.png",
25 + "sizes": "72x72",
26 + "type": "image/png",
27 + "density": "1.5"
28 + },
29 + {
30 + "src": "/static/icons/android-icon-96x96.png",
31 + "sizes": "96x96",
32 + "type": "image/png",
33 + "density": "2.0"
34 + },
35 + {
36 + "src": "/static/icons/android-icon-144x144.png",
37 + "sizes": "144x144",
38 + "type": "image/png",
39 + "density": "3.0"
40 + },
41 + {
42 + "src": "/static/icons/android-icon-192x192.png",
43 + "sizes": "192x192",
44 + "type": "image/png",
45 + "density": "4.0"
46 + }
47 + ]
48 +}
public/preview.jpg
Binary files /dev/null and b/public/preview.jpg differ
public/preview.png
Binary files /dev/null and b/public/preview.png differ
public/static/dashboard/bathymetry_bw_composite_4k.jpg
Binary files /dev/null and b/public/static/dashboard/bathymetry_bw_composite_4k.jpg differ
public/static/dashboard/lake.hdr
Binary files /dev/null and b/public/static/dashboard/lake.hdr differ
public/static/dashboard/starfield.jpg
Binary files /dev/null and b/public/static/dashboard/starfield.jpg differ
public/static/icons/android-icon-144x144.png
Binary files /dev/null and b/public/static/icons/android-icon-144x144.png differ
public/static/icons/android-icon-192x192.png
Binary files /dev/null and b/public/static/icons/android-icon-192x192.png differ
public/static/icons/android-icon-36x36.png
Binary files /dev/null and b/public/static/icons/android-icon-36x36.png differ
public/static/icons/android-icon-48x48.png
Binary files /dev/null and b/public/static/icons/android-icon-48x48.png differ
public/static/icons/android-icon-72x72.png
Binary files /dev/null and b/public/static/icons/android-icon-72x72.png differ
public/static/icons/android-icon-96x96.png
Binary files /dev/null and b/public/static/icons/android-icon-96x96.png differ
public/static/icons/apple-icon-114x114.png
Binary files /dev/null and b/public/static/icons/apple-icon-114x114.png differ
public/static/icons/apple-icon-120x120.png
Binary files /dev/null and b/public/static/icons/apple-icon-120x120.png differ
public/static/icons/apple-icon-144x144.png
Binary files /dev/null and b/public/static/icons/apple-icon-144x144.png differ
public/static/icons/apple-icon-152x152.png
Binary files /dev/null and b/public/static/icons/apple-icon-152x152.png differ
public/static/icons/apple-icon-180x180.png
Binary files /dev/null and b/public/static/icons/apple-icon-180x180.png differ
public/static/icons/apple-icon-57x57.png
Binary files /dev/null and b/public/static/icons/apple-icon-57x57.png differ
public/static/icons/apple-icon-60x60.png
Binary files /dev/null and b/public/static/icons/apple-icon-60x60.png differ
public/static/icons/apple-icon-72x72.png
Binary files /dev/null and b/public/static/icons/apple-icon-72x72.png differ
public/static/icons/apple-icon-76x76.png
Binary files /dev/null and b/public/static/icons/apple-icon-76x76.png differ
public/static/icons/apple-icon-precomposed.png
Binary files /dev/null and b/public/static/icons/apple-icon-precomposed.png differ
public/static/icons/apple-icon.png
Binary files /dev/null and b/public/static/icons/apple-icon.png differ
public/static/icons/favicon-16x16.png
Binary files /dev/null and b/public/static/icons/favicon-16x16.png differ
public/static/icons/favicon-32x32.png
Binary files /dev/null and b/public/static/icons/favicon-32x32.png differ
public/static/icons/favicon-96x96.png
Binary files /dev/null and b/public/static/icons/favicon-96x96.png differ
public/static/icons/favicon.ico
Binary files /dev/null and b/public/static/icons/favicon.ico differ
public/static/icons/ms-icon-144x144.png
Binary files /dev/null and b/public/static/icons/ms-icon-144x144.png differ
public/static/icons/ms-icon-150x150.png
Binary files /dev/null and b/public/static/icons/ms-icon-150x150.png differ
public/static/icons/ms-icon-310x310.png
Binary files /dev/null and b/public/static/icons/ms-icon-310x310.png differ
public/static/icons/ms-icon-70x70.png
Binary files /dev/null and b/public/static/icons/ms-icon-70x70.png differ
public/static/images/gallery/photo-0.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-0.jpg differ
public/static/images/gallery/photo-1.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-1.jpg differ
public/static/images/gallery/photo-10.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-10.jpg differ
public/static/images/gallery/photo-11.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-11.jpg differ
public/static/images/gallery/photo-12.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-12.jpg differ
public/static/images/gallery/photo-13.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-13.jpg differ
public/static/images/gallery/photo-14.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-14.jpg differ
public/static/images/gallery/photo-15.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-15.jpg differ
public/static/images/gallery/photo-16.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-16.jpg differ
public/static/images/gallery/photo-17.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-17.jpg differ
public/static/images/gallery/photo-18.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-18.jpg differ
public/static/images/gallery/photo-19.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-19.jpg differ
public/static/images/gallery/photo-2.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-2.jpg differ
public/static/images/gallery/photo-20.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-20.jpg differ
public/static/images/gallery/photo-21.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-21.jpg differ
public/static/images/gallery/photo-22.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-22.jpg differ
public/static/images/gallery/photo-23.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-23.jpg differ
public/static/images/gallery/photo-24.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-24.jpg differ
public/static/images/gallery/photo-25.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-25.jpg differ
public/static/images/gallery/photo-26.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-26.jpg differ
public/static/images/gallery/photo-27.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-27.jpg differ
public/static/images/gallery/photo-28.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-28.jpg differ
public/static/images/gallery/photo-29.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-29.jpg differ
public/static/images/gallery/photo-3.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-3.jpg differ
public/static/images/gallery/photo-30.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-30.jpg differ
public/static/images/gallery/photo-31.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-31.jpg differ
public/static/images/gallery/photo-32.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-32.jpg differ
public/static/images/gallery/photo-33.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-33.jpg differ
public/static/images/gallery/photo-34.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-34.jpg differ
public/static/images/gallery/photo-35.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-35.jpg differ
public/static/images/gallery/photo-36.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-36.jpg differ
public/static/images/gallery/photo-37.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-37.jpg differ
public/static/images/gallery/photo-38.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-38.jpg differ
public/static/images/gallery/photo-39.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-39.jpg differ
public/static/images/gallery/photo-4.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-4.jpg differ
public/static/images/gallery/photo-40.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-40.jpg differ
public/static/images/gallery/photo-41.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-41.jpg differ
public/static/images/gallery/photo-42.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-42.jpg differ
public/static/images/gallery/photo-43.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-43.jpg differ
public/static/images/gallery/photo-44.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-44.jpg differ
public/static/images/gallery/photo-45.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-45.jpg differ
public/static/images/gallery/photo-46.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-46.jpg differ
public/static/images/gallery/photo-47.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-47.jpg differ
public/static/images/gallery/photo-48.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-48.jpg differ
public/static/images/gallery/photo-49.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-49.jpg differ
public/static/images/gallery/photo-5.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-5.jpg differ
public/static/images/gallery/photo-50.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-50.jpg differ
public/static/images/gallery/photo-6.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-6.jpg differ
public/static/images/gallery/photo-7.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-7.jpg differ
public/static/images/gallery/photo-8.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-8.jpg differ
public/static/images/gallery/photo-9.jpg
Binary files /dev/null and b/public/static/images/gallery/photo-9.jpg differ
public/static/images/shop-cat/clothing.jpg
Binary files /dev/null and b/public/static/images/shop-cat/clothing.jpg differ
public/static/images/shop-cat/home.jpg
Binary files /dev/null and b/public/static/images/shop-cat/home.jpg differ
public/static/images/shop-cat/office.jpg
Binary files /dev/null and b/public/static/images/shop-cat/office.jpg differ
public/static/images/shop-cat/tech.jpg
Binary files /dev/null and b/public/static/images/shop-cat/tech.jpg differ
public/static/images/shop-cat/watches.jpg
Binary files /dev/null and b/public/static/images/shop-cat/watches.jpg differ
public/static/images/shop/0.jpg
Binary files /dev/null and b/public/static/images/shop/0.jpg differ
public/static/images/shop/1.jpg
Binary files /dev/null and b/public/static/images/shop/1.jpg differ
public/static/images/shop/10.jpg
Binary files /dev/null and b/public/static/images/shop/10.jpg differ
public/static/images/shop/11.jpg
Binary files /dev/null and b/public/static/images/shop/11.jpg differ
public/static/images/shop/12.jpg
Binary files /dev/null and b/public/static/images/shop/12.jpg differ
public/static/images/shop/13.jpg
Binary files /dev/null and b/public/static/images/shop/13.jpg differ
public/static/images/shop/14.jpg
Binary files /dev/null and b/public/static/images/shop/14.jpg differ
public/static/images/shop/15.jpg
Binary files /dev/null and b/public/static/images/shop/15.jpg differ
public/static/images/shop/16.jpg
Binary files /dev/null and b/public/static/images/shop/16.jpg differ
public/static/images/shop/17.jpg
Binary files /dev/null and b/public/static/images/shop/17.jpg differ
public/static/images/shop/18.jpg
Binary files /dev/null and b/public/static/images/shop/18.jpg differ
public/static/images/shop/19.jpg
Binary files /dev/null and b/public/static/images/shop/19.jpg differ
public/static/images/shop/2.jpg
Binary files /dev/null and b/public/static/images/shop/2.jpg differ
public/static/images/shop/3.jpg
Binary files /dev/null and b/public/static/images/shop/3.jpg differ
public/static/images/shop/4.jpg
Binary files /dev/null and b/public/static/images/shop/4.jpg differ
public/static/images/shop/5.jpg
Binary files /dev/null and b/public/static/images/shop/5.jpg differ
public/static/images/shop/6.jpg
Binary files /dev/null and b/public/static/images/shop/6.jpg differ
public/static/images/shop/7.jpg
Binary files /dev/null and b/public/static/images/shop/7.jpg differ
public/static/images/shop/8.jpg
Binary files /dev/null and b/public/static/images/shop/8.jpg differ
public/static/images/shop/9.jpg
Binary files /dev/null and b/public/static/images/shop/9.jpg differ
public/static/images/users/user-0.jpg
Binary files /dev/null and b/public/static/images/users/user-0.jpg differ
public/static/images/users/user-1.jpg
Binary files /dev/null and b/public/static/images/users/user-1.jpg differ
public/static/images/users/user-10.jpg
Binary files /dev/null and b/public/static/images/users/user-10.jpg differ
public/static/images/users/user-11.jpg
Binary files /dev/null and b/public/static/images/users/user-11.jpg differ
public/static/images/users/user-12.jpg
Binary files /dev/null and b/public/static/images/users/user-12.jpg differ
public/static/images/users/user-13.jpg
Binary files /dev/null and b/public/static/images/users/user-13.jpg differ
public/static/images/users/user-14.jpg
Binary files /dev/null and b/public/static/images/users/user-14.jpg differ
public/static/images/users/user-15.jpg
Binary files /dev/null and b/public/static/images/users/user-15.jpg differ
public/static/images/users/user-16.jpg
Binary files /dev/null and b/public/static/images/users/user-16.jpg differ
public/static/images/users/user-17.jpg
Binary files /dev/null and b/public/static/images/users/user-17.jpg differ
public/static/images/users/user-18.jpg
Binary files /dev/null and b/public/static/images/users/user-18.jpg differ
public/static/images/users/user-19.jpg
Binary files /dev/null and b/public/static/images/users/user-19.jpg differ
public/static/images/users/user-2.jpg
Binary files /dev/null and b/public/static/images/users/user-2.jpg differ
public/static/images/users/user-20.jpg
Binary files /dev/null and b/public/static/images/users/user-20.jpg differ
public/static/images/users/user-21.jpg
Binary files /dev/null and b/public/static/images/users/user-21.jpg differ
public/static/images/users/user-22.jpg
Binary files /dev/null and b/public/static/images/users/user-22.jpg differ
public/static/images/users/user-23.jpg
Binary files /dev/null and b/public/static/images/users/user-23.jpg differ
public/static/images/users/user-24.jpg
Binary files /dev/null and b/public/static/images/users/user-24.jpg differ
public/static/images/users/user-25.jpg
Binary files /dev/null and b/public/static/images/users/user-25.jpg differ
public/static/images/users/user-26.jpg
Binary files /dev/null and b/public/static/images/users/user-26.jpg differ
public/static/images/users/user-27.jpg
Binary files /dev/null and b/public/static/images/users/user-27.jpg differ
public/static/images/users/user-28.jpg
Binary files /dev/null and b/public/static/images/users/user-28.jpg differ
public/static/images/users/user-29.jpg
Binary files /dev/null and b/public/static/images/users/user-29.jpg differ
public/static/images/users/user-3.jpg
Binary files /dev/null and b/public/static/images/users/user-3.jpg differ
public/static/images/users/user-30.jpg
Binary files /dev/null and b/public/static/images/users/user-30.jpg differ
public/static/images/users/user-4.jpg
Binary files /dev/null and b/public/static/images/users/user-4.jpg differ
public/static/images/users/user-5.jpg
Binary files /dev/null and b/public/static/images/users/user-5.jpg differ
public/static/images/users/user-6.jpg
Binary files /dev/null and b/public/static/images/users/user-6.jpg differ
public/static/images/users/user-7.jpg
Binary files /dev/null and b/public/static/images/users/user-7.jpg differ
public/static/images/users/user-8.jpg
Binary files /dev/null and b/public/static/images/users/user-8.jpg differ
public/static/images/users/user-9.jpg
Binary files /dev/null and b/public/static/images/users/user-9.jpg differ
public/static/maps/overlay.png
Binary files /dev/null and b/public/static/maps/overlay.png differ
sonar-project.properties new
+16
@@ -0,0 +1,16 @@
1 +sonar-project.properties
2 +# must be unique in a given SonarQube instance
3 +sonar.projectKey=pragmatic
4 +
5 +# --- optional properties ---
6 +
7 +# defaults to project key
8 +#sonar.projectName=My project
9 +# defaults to 'not provided'
10 +#sonar.projectVersion=1.0
11 +
12 +# Path is relative to the sonar-project.properties file. Defaults to .
13 +#sonar.sources=.
14 +
15 +# Encoding of the source code. Default is default system encoding
16 +#sonar.sourceEncoding=UTF-8
src/App.vue new
+413
@@ -0,0 +1,413 @@
1 +<template>
2 + <div
3 + class="layout-container flex justify-center"
4 + :class="{
5 + column: hasColumn,
6 + boxed: boxed,
7 + 'footer-above': footerAbove,
8 + 'content-only': !navPos
9 + }"
10 + >
11 + <transition name="fade">
12 + <div class="splash-screen" v-if="splashScreen">
13 + <div class="wrap">
14 + <img src="/logo.svg" class="logo" alt="logo" />
15 + <img src="/Ripple-2s-200px.gif" alt="loading-image" />
16 + </div>
17 + </div>
18 + </transition>
19 +
20 + <vertical-nav
21 + :position="navPos"
22 + :collapse-nav="collapseNav"
23 + v-model:open-sidebar="openSidebar"
24 + @collapse-nav-toggle="collapseNav = !collapseNav"
25 + @push-page="closeSidebar"
26 + v-if="navPos === 'left'"
27 + />
28 +
29 + <div class="container flex column box grow">
30 + <div class="header" v-if="toolbar === 'top'">
31 + <Toolbar @toggle-sidebar="openSidebar = !openSidebar" :menu-burger="navPos" />
32 + </div>
33 + <horizontal-nav :position="navPos" @push-page="closeSidebar" v-if="navPos === 'top'" />
34 + <div class="header" v-if="toolbar === 'bottom'">
35 + <Toolbar @toggle-sidebar="openSidebar = !openSidebar" :menu-burger="navPos" />
36 + </div>
37 +
38 + <div class="main box grow flex">
39 + <span class="main-out-border--top-left" v-if="roundedCorners"></span>
40 + <span class="main-out-border--top-right" v-if="roundedCorners"></span>
41 + <span class="main-out-border--bottom-left" v-if="roundedCorners"></span>
42 + <span class="main-out-border--bottom-right" v-if="roundedCorners"></span>
43 +
44 + <router-view v-slot="{ Component }" class="view box grow">
45 + <transition :name="viewAnimation" mode="out-in">
46 + <component :is="Component" />
47 + </transition>
48 + </router-view>
49 + </div>
50 +
51 + <horizontal-nav :position="navPos" @push-page="closeSidebar" v-if="navPos === 'bottom'" style="margin-bottom: 0" />
52 +
53 + <Footer v-if="footer === 'below'" :position="footer" />
54 + </div>
55 +
56 + <vertical-nav
57 + :position="navPos"
58 + :collapse-nav="collapseNav"
59 + v-model:open-sidebar="openSidebar"
60 + @collapse-nav-toggle="collapseNav = !collapseNav"
61 + @push-page="closeSidebar"
62 + v-if="navPos === 'right'"
63 + />
64 +
65 + <Footer v-if="footer === 'above'" :position="footer" />
66 +
67 + <layout-picker :position="navPos" v-if="isLogged" />
68 + </div>
69 +</template>
70 +
71 +<script lang="ts">
72 +import { defineComponent } from "@vue/runtime-core"
73 +import { detect } from "detect-browser"
74 +const browser = detect()
75 +import HorizontalNav from "./core/horizontal-nav.vue"
76 +import VerticalNav from "./core/vertical-nav.vue"
77 +import Toolbar from "./core/toolbar.vue"
78 +import Footer from "./core/footer.vue"
79 +import LayoutPicker from "./components/layout-picker.vue"
80 +import { useMainStore } from "./stores/main"
81 +import { EFooter, ENavPos } from "./types"
82 +
83 +export default defineComponent({
84 + name: "App",
85 + data() {
86 + return {
87 + collapseNav: false,
88 + openSidebar: false,
89 + innerWidth: 0
90 + }
91 + },
92 + computed: {
93 + navPos() {
94 + if (this.innerWidth <= 768 && (useMainStore().navPos === ENavPos.top || useMainStore().navPos === ENavPos.bottom)) {
95 + return "left"
96 + }
97 + return useMainStore().navPos
98 + },
99 + toolbar() {
100 + return useMainStore().toolbar
101 + },
102 + footer() {
103 + return useMainStore().footer
104 + },
105 + boxed() {
106 + return useMainStore().boxed
107 + },
108 + roundedCorners() {
109 + return useMainStore().roundedCorners
110 + },
111 + viewAnimation() {
112 + return useMainStore().viewAnimation || "none"
113 + },
114 + isLogged() {
115 + return useMainStore().isLogged
116 + },
117 + splashScreen() {
118 + return useMainStore().splashScreen
119 + },
120 + footerAbove() {
121 + return useMainStore().footer === EFooter.above
122 + },
123 + hasColumn() {
124 + return useMainStore().navPos === ENavPos.top || useMainStore().navPos === ENavPos.bottom
125 + }
126 + },
127 + methods: {
128 + resizeOpenNav() {
129 + this.innerWidth = window.innerWidth
130 + if (window.innerWidth <= 768) {
131 + this.collapseNav = false
132 + }
133 + },
134 + closeSidebar() {
135 + this.openSidebar = false
136 + }
137 + },
138 + components: {
139 + HorizontalNav,
140 + VerticalNav,
141 + Toolbar,
142 + Footer,
143 + LayoutPicker
144 + },
145 + created() {
146 + if (browser && browser.name) document.getElementsByTagName("html")[0].classList.add(browser.name)
147 + },
148 + mounted() {
149 + this.resizeOpenNav()
150 + window.addEventListener("resize", this.resizeOpenNav)
151 + },
152 + beforeUnmount() {
153 + window.removeEventListener("resize", this.resizeOpenNav)
154 + }
155 +})
156 +</script>
157 +
158 +<style lang="scss">
159 +@import "./assets/scss/_variables";
160 +@import "./assets/scss/_mixins";
161 +
162 +.layout-container {
163 + width: 100%;
164 + height: 100%;
165 + box-sizing: border-box;
166 + overflow: hidden;
167 + background: $background-color;
168 +
169 + .container {
170 + overflow: hidden;
171 +
172 + .header {
173 + height: 60px;
174 + margin-bottom: 20px;
175 + margin-top: 10px;
176 + margin-left: 30px;
177 + margin-right: 30px;
178 + }
179 +
180 + .main {
181 + position: relative;
182 + overflow: hidden;
183 + padding: 0 30px;
184 + }
185 +
186 + .view {
187 + box-sizing: border-box;
188 + transition: all 0.4s cubic-bezier(0.55, 0, 0.1, 1);
189 + backface-visibility: hidden;
190 + /*-webkit-perspective: 1000px;*/
191 +
192 + & > .el-scrollbar__wrap {
193 + padding: 0 20px;
194 + }
195 + }
196 + .fade-right-enter-from {
197 + opacity: 0;
198 + transform: translate(-30px, 0);
199 + }
200 + .fade-right-leave-to {
201 + opacity: 0;
202 + transform: translate(30px, 0);
203 + }
204 + .fade-left-enter-from {
205 + opacity: 0;
206 + transform: translate(30px, 0);
207 + }
208 + .fade-left-leave-to {
209 + opacity: 0;
210 + transform: translate(-30px, 0);
211 + }
212 + .fade-top-enter-from {
213 + opacity: 0;
214 + transform: translate(0, 30px);
215 + }
216 + .fade-top-leave-to {
217 + opacity: 0;
218 + transform: translate(0, -30px);
219 + }
220 + .fade-top-in-out-enter-from,
221 + .fade-top-in-out-leave-to {
222 + opacity: 0;
223 + transform: translate(0, 30px);
224 + }
225 + .fade-bottom-enter-from {
226 + opacity: 0;
227 + transform: translate(0, -30px);
228 + }
229 + .fade-bottom-leave-to {
230 + opacity: 0;
231 + transform: translate(0, 30px);
232 + }
233 + .fade-bottom-in-out-enter-from,
234 + .fade-bottom-in-out-leave-to {
235 + opacity: 0;
236 + transform: translate(0, -30px);
237 + }
238 +
239 + .fade-enter-from,
240 + .fade-leave-to {
241 + opacity: 0;
242 + }
243 +
244 + .main-out-border {
245 + &--top-left,
246 + &--top-right {
247 + background: linear-gradient($background-color, rgba(230, 235, 241, 0));
248 + height: 16px;
249 + position: absolute;
250 + width: 8px;
251 + z-index: 1;
252 + top: 4px;
253 + }
254 + &--bottom-left,
255 + &--bottom-right {
256 + background: linear-gradient(rgba(230, 235, 241, 0), $background-color);
257 + height: 16px;
258 + position: absolute;
259 + width: 8px;
260 + z-index: 1;
261 + bottom: 4px;
262 + }
263 +
264 + &--top-left,
265 + &--bottom-left {
266 + left: 42px;
267 +
268 + &::after {
269 + content: "";
270 + height: 5px;
271 + position: absolute;
272 + right: -4px;
273 + top: -4px;
274 + width: 12px;
275 + box-shadow: 8px 0px 0px 0px $background-color inset;
276 + border-top-left-radius: 5px;
277 + }
278 + }
279 + &--top-right,
280 + &--bottom-right {
281 + right: 42px;
282 +
283 + &::after {
284 + content: "";
285 + height: 5px;
286 + left: -4px;
287 + position: absolute;
288 + top: -4px;
289 + width: 12px;
290 + box-shadow: -8px 0px 0px 0px $background-color inset;
291 + border-top-right-radius: 5px;
292 + }
293 + }
294 +
295 + &--bottom-left:after {
296 + border-radius: 0;
297 + border-bottom-left-radius: 5px;
298 + }
299 + &--bottom-right:after {
300 + border-radius: 0;
301 + border-bottom-right-radius: 5px;
302 + }
303 +
304 + &--bottom-left,
305 + &--bottom-right {
306 + &::after {
307 + top: initial;
308 + bottom: -4px;
309 + }
310 + }
311 + }
312 + }
313 +
314 + &.boxed {
315 + max-width: 1300px;
316 + margin: 0 auto;
317 + box-shadow:
318 + 0px 0px 20px 10px rgba(0, 0, 0, 0.15),
319 + 0px 0px 5px 0px rgba(0, 0, 0, 0.1);
320 + }
321 +
322 + &.footer-above {
323 + padding-bottom: 40px;
324 + position: relative;
325 + }
326 +
327 + &.content-only {
328 + .container {
329 + .main-out-border--top-left,
330 + .main-out-border--top-right,
331 + .main-out-border--bottom-left,
332 + .main-out-border--bottom-right {
333 + display: none;
334 + }
335 + }
336 + }
337 +}
338 +
339 +html:not(.ie) {
340 + .layout-container {
341 + .container {
342 + max-width: 1920px;
343 + }
344 + }
345 +}
346 +
347 +@media (min-width: 1920px) {
348 + .layout-container:not(.boxed) {
349 + &.column {
350 + .container {
351 + margin: 0 auto;
352 + }
353 + }
354 + }
355 +}
356 +
357 +@media (max-width: 768px) {
358 + .layout-container {
359 + .container {
360 + /*width: 100%;
361 + max-width: 100%;
362 + height: 100%;
363 + max-height: 100%;*/
364 +
365 + .header {
366 + height: 50px;
367 + background: #fff;
368 + box-shadow: 0px -20px 10px 20px rgba(0, 0, 0, 0.25);
369 + margin: 0;
370 + margin-bottom: 5px;
371 +
372 + .toggle-sidebar {
373 + box-shadow: none !important;
374 + }
375 +
376 + .search-box {
377 + & > .el-autocomplete {
378 + box-shadow: none !important;
379 + }
380 + }
381 + }
382 +
383 + .main {
384 + padding: 0 5px;
385 + }
386 +
387 + .view {
388 + max-width: 100%;
389 +
390 + & > .el-scrollbar__wrap {
391 + padding: 0 15px;
392 + padding-top: 15px;
393 + }
394 + }
395 + .main-out-border--top-left,
396 + .main-out-border--top-right,
397 + .main-out-border--bottom-left,
398 + .main-out-border--bottom-right {
399 + display: none;
400 + }
401 + }
402 + }
403 +}
404 +
405 +.fade-enter-active,
406 +.fade-leave-active {
407 + transition: opacity 0.5s ease-out;
408 +}
409 +.fade-enter,
410 +.fade-leave-to {
411 + opacity: 0;
412 +}
413 +</style>
src/assets/data/CONTACTS_MOCK_DATA.json new
+802
@@ -0,0 +1,802 @@
1 +[
2 + {
3 + "id": 1,
4 + "starred": false,
5 + "full_name": "Donaugh Barkley",
6 + "email": "dbarkley0@csmonitor.com",
7 + "phone": "579-459-8481",
8 + "avatar": "https://robohash.org/maioreserrorquos.jpg?size=250x250&set=set1"
9 + },
10 + {
11 + "id": 2,
12 + "starred": false,
13 + "full_name": "Kalli Paoli",
14 + "email": "kpaoli1@wsj.com",
15 + "phone": "666-880-1492",
16 + "avatar": "https://robohash.org/cupiditateenimofficia.jpg?size=250x250&set=set1"
17 + },
18 + {
19 + "id": 3,
20 + "starred": false,
21 + "full_name": "Niki Dominetti",
22 + "email": "ndominetti2@cpanel.net",
23 + "phone": "532-175-1909",
24 + "avatar": "https://robohash.org/nullafaceredoloremque.jpg?size=250x250&set=set1"
25 + },
26 + {
27 + "id": 4,
28 + "starred": false,
29 + "full_name": "Clyve Hyatt",
30 + "email": "chyatt3@stumbleupon.com",
31 + "phone": "903-426-6147",
32 + "avatar": "https://robohash.org/consequunturvoluptascumque.jpg?size=250x250&set=set1"
33 + },
34 + {
35 + "id": 5,
36 + "starred": false,
37 + "full_name": "Petra McGonigal",
38 + "email": "pmcgonigal4@sourceforge.net",
39 + "phone": "584-315-0762",
40 + "avatar": "https://robohash.org/occaecatihicaut.jpg?size=250x250&set=set1"
41 + },
42 + {
43 + "id": 6,
44 + "starred": false,
45 + "full_name": "Ursala Colborn",
46 + "email": "ucolborn5@epa.gov",
47 + "phone": "408-717-0956",
48 + "avatar": "https://robohash.org/illoveroest.jpg?size=250x250&set=set1"
49 + },
50 + {
51 + "id": 7,
52 + "starred": true,
53 + "full_name": "Ketti Blay",
54 + "email": "kblay6@spiegel.de",
55 + "phone": "885-159-4510",
56 + "avatar": "https://robohash.org/velitconsequunturipsam.jpg?size=250x250&set=set1"
57 + },
58 + {
59 + "id": 8,
60 + "starred": false,
61 + "full_name": "Winifield Elfleet",
62 + "email": "welfleet7@chicagotribune.com",
63 + "phone": "948-477-9615",
64 + "avatar": "https://robohash.org/etipsummollitia.jpg?size=250x250&set=set1"
65 + },
66 + {
67 + "id": 9,
68 + "starred": false,
69 + "full_name": "Murry Veighey",
70 + "email": "mveighey8@trellian.com",
71 + "phone": "964-506-5858",
72 + "avatar": "https://robohash.org/consequaturnullacum.jpg?size=250x250&set=set1"
73 + },
74 + {
75 + "id": 10,
76 + "starred": false,
77 + "full_name": "Sybille Lefley",
78 + "email": "slefley9@linkedin.com",
79 + "phone": "231-134-8430",
80 + "avatar": "https://robohash.org/earumtemporaqui.jpg?size=250x250&set=set1"
81 + },
82 + {
83 + "id": 11,
84 + "starred": false,
85 + "full_name": "Aryn Agglione",
86 + "email": "aagglionea@nps.gov",
87 + "phone": "476-934-0840",
88 + "avatar": "https://robohash.org/necessitatibusutquibusdam.jpg?size=250x250&set=set1"
89 + },
90 + {
91 + "id": 12,
92 + "starred": false,
93 + "full_name": "Albertina Schuricke",
94 + "email": "aschurickeb@ihg.com",
95 + "phone": "706-235-4727",
96 + "avatar": "https://robohash.org/animiincidunterror.jpg?size=250x250&set=set1"
97 + },
98 + {
99 + "id": 13,
100 + "starred": true,
101 + "full_name": "Sheff Alfuso",
102 + "email": "salfusoc@homestead.com",
103 + "phone": "678-789-3579",
104 + "avatar": "https://robohash.org/sedautexpedita.jpg?size=250x250&set=set1"
105 + },
106 + {
107 + "id": 14,
108 + "starred": false,
109 + "full_name": "Constancia Rowberry",
110 + "email": "crowberryd@biglobe.ne.jp",
111 + "phone": "131-566-9187",
112 + "avatar": "https://robohash.org/delectuslaborumenim.jpg?size=250x250&set=set1"
113 + },
114 + {
115 + "id": 15,
116 + "starred": false,
117 + "full_name": "Gabe Boynton",
118 + "email": "gboyntone@slashdot.org",
119 + "phone": "261-627-0175",
120 + "avatar": "https://robohash.org/quisquamnonlaborum.jpg?size=250x250&set=set1"
121 + },
122 + {
123 + "id": 16,
124 + "starred": false,
125 + "full_name": "Rossy Vonderdell",
126 + "email": "rvonderdellf@soundcloud.com",
127 + "phone": "668-323-0333",
128 + "avatar": "https://robohash.org/exercitationemsitin.jpg?size=250x250&set=set1"
129 + },
130 + {
131 + "id": 17,
132 + "starred": false,
133 + "full_name": "Basil Godly",
134 + "email": "bgodlyg@twitpic.com",
135 + "phone": "207-687-7999",
136 + "avatar": "https://robohash.org/adnihillaudantium.jpg?size=250x250&set=set1"
137 + },
138 + {
139 + "id": 18,
140 + "starred": false,
141 + "full_name": "Myrna Teml",
142 + "email": "mtemlh@imgur.com",
143 + "phone": "198-670-2254",
144 + "avatar": "https://robohash.org/verosedtotam.jpg?size=250x250&set=set1"
145 + },
146 + {
147 + "id": 19,
148 + "starred": false,
149 + "full_name": "Brunhilde Keal",
150 + "email": "bkeali@narod.ru",
151 + "phone": "415-634-1113",
152 + "avatar": "https://robohash.org/quiapossimusquas.jpg?size=250x250&set=set1"
153 + },
154 + {
155 + "id": 20,
156 + "starred": false,
157 + "full_name": "Chelsey Coumbe",
158 + "email": "ccoumbej@census.gov",
159 + "phone": "649-150-4903",
160 + "avatar": "https://robohash.org/praesentiumquolaudantium.jpg?size=250x250&set=set1"
161 + },
162 + {
163 + "id": 21,
164 + "starred": false,
165 + "full_name": "Delilah Chasteney",
166 + "email": "dchasteneyk@aol.com",
167 + "phone": "973-377-5811",
168 + "avatar": "https://robohash.org/distinctiovoluptatea.jpg?size=250x250&set=set1"
169 + },
170 + {
171 + "id": 22,
172 + "starred": true,
173 + "full_name": "Henrie De Mitri",
174 + "email": "hdel@furl.net",
175 + "phone": "941-789-4804",
176 + "avatar": "https://robohash.org/infugitnatus.jpg?size=250x250&set=set1"
177 + },
178 + {
179 + "id": 23,
180 + "starred": false,
181 + "full_name": "Sunshine Goff",
182 + "email": "sgoffm@vkontakte.ru",
183 + "phone": "714-552-6841",
184 + "avatar": "https://robohash.org/iuremodiipsum.jpg?size=250x250&set=set1"
185 + },
186 + {
187 + "id": 24,
188 + "starred": false,
189 + "full_name": "Brett Lusted",
190 + "email": "blustedn@wunderground.com",
191 + "phone": "300-797-4018",
192 + "avatar": "https://robohash.org/suntofficiiseligendi.jpg?size=250x250&set=set1"
193 + },
194 + {
195 + "id": 25,
196 + "starred": false,
197 + "full_name": "Gabriello Huyhton",
198 + "email": "ghuyhtono@google.ca",
199 + "phone": "480-513-7770",
200 + "avatar": "https://robohash.org/atqueveniamdolorum.jpg?size=250x250&set=set1"
201 + },
202 + {
203 + "id": 26,
204 + "starred": false,
205 + "full_name": "Vereno Vedenyapin",
206 + "email": "vvedenyapinp@prlog.org",
207 + "phone": "395-485-5477",
208 + "avatar": "https://robohash.org/voluptatemquasisit.jpg?size=250x250&set=set1"
209 + },
210 + {
211 + "id": 27,
212 + "starred": false,
213 + "full_name": "Ado Dye",
214 + "email": "adyeq@instagram.com",
215 + "phone": "360-994-2217",
216 + "avatar": "https://robohash.org/rerumblanditiisaut.jpg?size=250x250&set=set1"
217 + },
218 + {
219 + "id": 28,
220 + "starred": false,
221 + "full_name": "Vivian Martinets",
222 + "email": "vmartinetsr@ycombinator.com",
223 + "phone": "320-470-0952",
224 + "avatar": "https://robohash.org/ullamperferendisvoluptatibus.jpg?size=250x250&set=set1"
225 + },
226 + {
227 + "id": 29,
228 + "starred": true,
229 + "full_name": "Freida Heberden",
230 + "email": "fheberdens@imageshack.us",
231 + "phone": "675-723-4453",
232 + "avatar": "https://robohash.org/etquiid.jpg?size=250x250&set=set1"
233 + },
234 + {
235 + "id": 30,
236 + "starred": false,
237 + "full_name": "Krishnah Blakeley",
238 + "email": "kblakeleyt@dmoz.org",
239 + "phone": "975-836-3652",
240 + "avatar": "https://robohash.org/maioreslaborequia.jpg?size=250x250&set=set1"
241 + },
242 + {
243 + "id": 31,
244 + "starred": false,
245 + "full_name": "Zsa zsa Ierland",
246 + "email": "zzsau@sourceforge.net",
247 + "phone": "158-636-9601",
248 + "avatar": "https://robohash.org/nesciuntquisunt.jpg?size=250x250&set=set1"
249 + },
250 + {
251 + "id": 32,
252 + "starred": false,
253 + "full_name": "Reeba Siley",
254 + "email": "rsileyv@walmart.com",
255 + "phone": "936-952-9608",
256 + "avatar": "https://robohash.org/consecteturautemincidunt.jpg?size=250x250&set=set1"
257 + },
258 + {
259 + "id": 33,
260 + "starred": true,
261 + "full_name": "Delphine Greet",
262 + "email": "dgreetw@squarespace.com",
263 + "phone": "865-437-4122",
264 + "avatar": "https://robohash.org/consequunturrationecorrupti.jpg?size=250x250&set=set1"
265 + },
266 + {
267 + "id": 34,
268 + "starred": false,
269 + "full_name": "Claresta Boswell",
270 + "email": "cboswellx@is.gd",
271 + "phone": "530-549-7280",
272 + "avatar": "https://robohash.org/doloreseaquis.jpg?size=250x250&set=set1"
273 + },
274 + {
275 + "id": 35,
276 + "starred": false,
277 + "full_name": "Gui Wolfers",
278 + "email": "gwolfersy@wikispaces.com",
279 + "phone": "177-359-9840",
280 + "avatar": "https://robohash.org/sitminusalias.jpg?size=250x250&set=set1"
281 + },
282 + {
283 + "id": 36,
284 + "starred": false,
285 + "full_name": "Ado Eliassen",
286 + "email": "aeliassenz@hostgator.com",
287 + "phone": "238-432-5868",
288 + "avatar": "https://robohash.org/autilloofficia.jpg?size=250x250&set=set1"
289 + },
290 + {
291 + "id": 37,
292 + "starred": false,
293 + "full_name": "Ervin Dufore",
294 + "email": "edufore10@yale.edu",
295 + "phone": "515-145-3760",
296 + "avatar": "https://robohash.org/blanditiisiustoquis.jpg?size=250x250&set=set1"
297 + },
298 + {
299 + "id": 38,
300 + "starred": false,
301 + "full_name": "Pandora Claessens",
302 + "email": "pclaessens11@sitemeter.com",
303 + "phone": "189-826-5413",
304 + "avatar": "https://robohash.org/enimvoluptatequia.jpg?size=250x250&set=set1"
305 + },
306 + {
307 + "id": 39,
308 + "starred": false,
309 + "full_name": "Pierre Hasselby",
310 + "email": "phasselby12@ed.gov",
311 + "phone": "775-122-8323",
312 + "avatar": "https://robohash.org/quifacilisquaerat.jpg?size=250x250&set=set1"
313 + },
314 + {
315 + "id": 40,
316 + "starred": false,
317 + "full_name": "Arvie McClune",
318 + "email": "amcclune13@topsy.com",
319 + "phone": "394-512-0745",
320 + "avatar": "https://robohash.org/nullaperspiciatisquia.jpg?size=250x250&set=set1"
321 + },
322 + {
323 + "id": 41,
324 + "starred": false,
325 + "full_name": "Elden Sandilands",
326 + "email": "esandilands14@xing.com",
327 + "phone": "353-173-5441",
328 + "avatar": "https://robohash.org/remiuredebitis.jpg?size=250x250&set=set1"
329 + },
330 + {
331 + "id": 42,
332 + "starred": false,
333 + "full_name": "Zia Galer",
334 + "email": "zgaler15@com.com",
335 + "phone": "358-290-0053",
336 + "avatar": "https://robohash.org/minusquasidolor.jpg?size=250x250&set=set1"
337 + },
338 + {
339 + "id": 43,
340 + "starred": false,
341 + "full_name": "Connor Kniveton",
342 + "email": "ckniveton16@va.gov",
343 + "phone": "227-970-0415",
344 + "avatar": "https://robohash.org/utrepudiandaeducimus.jpg?size=250x250&set=set1"
345 + },
346 + {
347 + "id": 44,
348 + "starred": false,
349 + "full_name": "Gaspard Sparey",
350 + "email": "gsparey17@mediafire.com",
351 + "phone": "385-829-3871",
352 + "avatar": "https://robohash.org/accusamusporronecessitatibus.jpg?size=250x250&set=set1"
353 + },
354 + {
355 + "id": 45,
356 + "starred": false,
357 + "full_name": "Rube Brasner",
358 + "email": "rbrasner18@1und1.de",
359 + "phone": "830-504-4729",
360 + "avatar": "https://robohash.org/quodnontotam.jpg?size=250x250&set=set1"
361 + },
362 + {
363 + "id": 46,
364 + "starred": true,
365 + "full_name": "Jeramie Simanek",
366 + "email": "jsimanek19@opera.com",
367 + "phone": "682-651-0486",
368 + "avatar": "https://robohash.org/reiciendisquodvoluptatem.jpg?size=250x250&set=set1"
369 + },
370 + {
371 + "id": 47,
372 + "starred": false,
373 + "full_name": "Marius Harrower",
374 + "email": "mharrower1a@merriam-webster.com",
375 + "phone": "846-166-6160",
376 + "avatar": "https://robohash.org/omnisfugaenim.jpg?size=250x250&set=set1"
377 + },
378 + {
379 + "id": 48,
380 + "starred": false,
381 + "full_name": "Fawne Halford",
382 + "email": "fhalford1b@ca.gov",
383 + "phone": "911-570-3814",
384 + "avatar": "https://robohash.org/rerumnonest.jpg?size=250x250&set=set1"
385 + },
386 + {
387 + "id": 49,
388 + "starred": false,
389 + "full_name": "Umeko Scanterbury",
390 + "email": "uscanterbury1c@elegantthemes.com",
391 + "phone": "794-219-4403",
392 + "avatar": "https://robohash.org/veritatisvoluptatemquo.jpg?size=250x250&set=set1"
393 + },
394 + {
395 + "id": 50,
396 + "starred": false,
397 + "full_name": "Conan Bavin",
398 + "email": "cbavin1d@fastcompany.com",
399 + "phone": "602-799-8117",
400 + "avatar": "https://robohash.org/remestodit.jpg?size=250x250&set=set1"
401 + },
402 + {
403 + "id": 51,
404 + "starred": false,
405 + "full_name": "Murry Mazonowicz",
406 + "email": "mmazonowicz1e@constantcontact.com",
407 + "phone": "635-606-9493",
408 + "avatar": "https://robohash.org/doloribusnemooptio.jpg?size=250x250&set=set1"
409 + },
410 + {
411 + "id": 52,
412 + "starred": false,
413 + "full_name": "Orazio Fackney",
414 + "email": "ofackney1f@yellowpages.com",
415 + "phone": "163-622-8509",
416 + "avatar": "https://robohash.org/aliquideaanimi.jpg?size=250x250&set=set1"
417 + },
418 + {
419 + "id": 53,
420 + "starred": false,
421 + "full_name": "Bonnee Haisell",
422 + "email": "bhaisell1g@latimes.com",
423 + "phone": "344-827-6631",
424 + "avatar": "https://robohash.org/repellatametpraesentium.jpg?size=250x250&set=set1"
425 + },
426 + {
427 + "id": 54,
428 + "starred": false,
429 + "full_name": "Alika Rainsdon",
430 + "email": "arainsdon1h@umich.edu",
431 + "phone": "896-104-7010",
432 + "avatar": "https://robohash.org/voluptatemsolutamolestiae.jpg?size=250x250&set=set1"
433 + },
434 + {
435 + "id": 55,
436 + "starred": false,
437 + "full_name": "Dacie Stanislaw",
438 + "email": "dstanislaw1i@nhs.uk",
439 + "phone": "874-820-2769",
440 + "avatar": "https://robohash.org/omniseumperferendis.jpg?size=250x250&set=set1"
441 + },
442 + {
443 + "id": 56,
444 + "starred": false,
445 + "full_name": "Burl Smyley",
446 + "email": "bsmyley1j@youtube.com",
447 + "phone": "301-258-1257",
448 + "avatar": "https://robohash.org/estdoloresamet.jpg?size=250x250&set=set1"
449 + },
450 + {
451 + "id": 57,
452 + "starred": true,
453 + "full_name": "Nanine Bletso",
454 + "email": "nbletso1k@toplist.cz",
455 + "phone": "550-413-1781",
456 + "avatar": "https://robohash.org/omnisaliquidquisquam.jpg?size=250x250&set=set1"
457 + },
458 + {
459 + "id": 58,
460 + "starred": false,
461 + "full_name": "Shelba Collum",
462 + "email": "scollum1l@php.net",
463 + "phone": "144-207-0423",
464 + "avatar": "https://robohash.org/quiadfugit.jpg?size=250x250&set=set1"
465 + },
466 + {
467 + "id": 59,
468 + "starred": false,
469 + "full_name": "Mollie Ply",
470 + "email": "mply1m@upenn.edu",
471 + "phone": "971-653-3054",
472 + "avatar": "https://robohash.org/magniutaut.jpg?size=250x250&set=set1"
473 + },
474 + {
475 + "id": 60,
476 + "starred": false,
477 + "full_name": "Burnaby Howen",
478 + "email": "bhowen1n@sohu.com",
479 + "phone": "751-947-1324",
480 + "avatar": "https://robohash.org/doloremquesedeius.jpg?size=250x250&set=set1"
481 + },
482 + {
483 + "id": 61,
484 + "starred": false,
485 + "full_name": "Zed Faro",
486 + "email": "zfaro1o@ucoz.ru",
487 + "phone": "414-597-7771",
488 + "avatar": "https://robohash.org/cumiurelabore.jpg?size=250x250&set=set1"
489 + },
490 + {
491 + "id": 62,
492 + "starred": false,
493 + "full_name": "Bevin O'Spellissey",
494 + "email": "bospellissey1p@noaa.gov",
495 + "phone": "513-105-6071",
496 + "avatar": "https://robohash.org/itaqueharumvoluptatem.jpg?size=250x250&set=set1"
497 + },
498 + {
499 + "id": 63,
500 + "starred": false,
501 + "full_name": "Pinchas Chaytor",
502 + "email": "pchaytor1q@networksolutions.com",
503 + "phone": "806-227-5134",
504 + "avatar": "https://robohash.org/atqueomnisqui.jpg?size=250x250&set=set1"
505 + },
506 + {
507 + "id": 64,
508 + "starred": false,
509 + "full_name": "Justus Griss",
510 + "email": "jgriss1r@senate.gov",
511 + "phone": "123-155-7039",
512 + "avatar": "https://robohash.org/sedaducimus.jpg?size=250x250&set=set1"
513 + },
514 + {
515 + "id": 65,
516 + "starred": false,
517 + "full_name": "Barbee Jobling",
518 + "email": "bjobling1s@elegantthemes.com",
519 + "phone": "480-152-0568",
520 + "avatar": "https://robohash.org/odioquaevoluptatem.jpg?size=250x250&set=set1"
521 + },
522 + {
523 + "id": 66,
524 + "starred": true,
525 + "full_name": "Kacey Tyndall",
526 + "email": "ktyndall1t@tumblr.com",
527 + "phone": "387-401-1325",
528 + "avatar": "https://robohash.org/utsimiliquevel.jpg?size=250x250&set=set1"
529 + },
530 + {
531 + "id": 67,
532 + "starred": false,
533 + "full_name": "Cesar Rosenstock",
534 + "email": "crosenstock1u@alexa.com",
535 + "phone": "260-473-3492",
536 + "avatar": "https://robohash.org/pariaturlaborerepellendus.jpg?size=250x250&set=set1"
537 + },
538 + {
539 + "id": 68,
540 + "starred": false,
541 + "full_name": "Alastair Tomaskunas",
542 + "email": "atomaskunas1v@discovery.com",
543 + "phone": "749-497-9131",
544 + "avatar": "https://robohash.org/inciduntsedeligendi.jpg?size=250x250&set=set1"
545 + },
546 + {
547 + "id": 69,
548 + "starred": false,
549 + "full_name": "Ervin Faustin",
550 + "email": "efaustin1w@bloglines.com",
551 + "phone": "849-196-0779",
552 + "avatar": "https://robohash.org/liberoquaeratest.jpg?size=250x250&set=set1"
553 + },
554 + {
555 + "id": 70,
556 + "starred": false,
557 + "full_name": "Dan Grinter",
558 + "email": "dgrinter1x@usatoday.com",
559 + "phone": "718-850-9999",
560 + "avatar": "https://robohash.org/quiavoluptatemaut.jpg?size=250x250&set=set1"
561 + },
562 + {
563 + "id": 71,
564 + "starred": false,
565 + "full_name": "Baxter Kindread",
566 + "email": "bkindread1y@simplemachines.org",
567 + "phone": "604-407-2375",
568 + "avatar": "https://robohash.org/autemsuscipitquisquam.jpg?size=250x250&set=set1"
569 + },
570 + {
571 + "id": 72,
572 + "starred": false,
573 + "full_name": "Arlena Maskrey",
574 + "email": "amaskrey1z@ft.com",
575 + "phone": "647-933-3357",
576 + "avatar": "https://robohash.org/voluptasoccaecatiperferendis.jpg?size=250x250&set=set1"
577 + },
578 + {
579 + "id": 73,
580 + "starred": false,
581 + "full_name": "Craig Dresser",
582 + "email": "cdresser20@imdb.com",
583 + "phone": "738-779-7757",
584 + "avatar": "https://robohash.org/voluptatemdictaest.jpg?size=250x250&set=set1"
585 + },
586 + {
587 + "id": 74,
588 + "starred": false,
589 + "full_name": "Jolie Dutnell",
590 + "email": "jdutnell21@barnesandnoble.com",
591 + "phone": "384-527-5999",
592 + "avatar": "https://robohash.org/quisfacereest.jpg?size=250x250&set=set1"
593 + },
594 + {
595 + "id": 75,
596 + "starred": true,
597 + "full_name": "Abigael Bott",
598 + "email": "abott22@rakuten.co.jp",
599 + "phone": "864-774-3935",
600 + "avatar": "https://robohash.org/quibusdametdolores.jpg?size=250x250&set=set1"
601 + },
602 + {
603 + "id": 76,
604 + "starred": false,
605 + "full_name": "Othelia Biggin",
606 + "email": "obiggin23@canalblog.com",
607 + "phone": "169-209-6715",
608 + "avatar": "https://robohash.org/totamquamcum.jpg?size=250x250&set=set1"
609 + },
610 + {
611 + "id": 77,
612 + "starred": false,
613 + "full_name": "Russell Strawbridge",
614 + "email": "rstrawbridge24@rambler.ru",
615 + "phone": "752-133-0115",
616 + "avatar": "https://robohash.org/natusadvoluptatem.jpg?size=250x250&set=set1"
617 + },
618 + {
619 + "id": 78,
620 + "starred": false,
621 + "full_name": "Walther Turton",
622 + "email": "wturton25@hc360.com",
623 + "phone": "205-407-4059",
624 + "avatar": "https://robohash.org/delenitiipsumdoloremque.jpg?size=250x250&set=set1"
625 + },
626 + {
627 + "id": 79,
628 + "starred": false,
629 + "full_name": "Jerad Trustrie",
630 + "email": "jtrustrie26@diigo.com",
631 + "phone": "325-595-8294",
632 + "avatar": "https://robohash.org/molestiaeperspiciatisdeleniti.jpg?size=250x250&set=set1"
633 + },
634 + {
635 + "id": 80,
636 + "starred": false,
637 + "full_name": "Mikey Grinov",
638 + "email": "mgrinov27@prlog.org",
639 + "phone": "646-228-6829",
640 + "avatar": "https://robohash.org/harumetveritatis.jpg?size=250x250&set=set1"
641 + },
642 + {
643 + "id": 81,
644 + "starred": false,
645 + "full_name": "Huntley Bennell",
646 + "email": "hbennell28@tmall.com",
647 + "phone": "716-174-7311",
648 + "avatar": "https://robohash.org/etnobiserror.jpg?size=250x250&set=set1"
649 + },
650 + {
651 + "id": 82,
652 + "starred": false,
653 + "full_name": "Melisse Rollason",
654 + "email": "mrollason29@wired.com",
655 + "phone": "619-100-9285",
656 + "avatar": "https://robohash.org/remvoluptatemodio.jpg?size=250x250&set=set1"
657 + },
658 + {
659 + "id": 83,
660 + "starred": false,
661 + "full_name": "Opal Muro",
662 + "email": "omuro2a@tmall.com",
663 + "phone": "168-104-0346",
664 + "avatar": "https://robohash.org/earumminusest.jpg?size=250x250&set=set1"
665 + },
666 + {
667 + "id": 84,
668 + "starred": false,
669 + "full_name": "Allx Goddard",
670 + "email": "agoddard2b@columbia.edu",
671 + "phone": "279-353-2859",
672 + "avatar": "https://robohash.org/reprehenderitconsecteturimpedit.jpg?size=250x250&set=set1"
673 + },
674 + {
675 + "id": 85,
676 + "starred": false,
677 + "full_name": "Fransisco Jewise",
678 + "email": "fjewise2c@hibu.com",
679 + "phone": "450-179-0659",
680 + "avatar": "https://robohash.org/nesciuntearumenim.jpg?size=250x250&set=set1"
681 + },
682 + {
683 + "id": 86,
684 + "starred": false,
685 + "full_name": "Cicely Hubberstey",
686 + "email": "chubberstey2d@surveymonkey.com",
687 + "phone": "499-530-7445",
688 + "avatar": "https://robohash.org/praesentiumnoneius.jpg?size=250x250&set=set1"
689 + },
690 + {
691 + "id": 87,
692 + "starred": false,
693 + "full_name": "Gerik Dewberry",
694 + "email": "gdewberry2e@go.com",
695 + "phone": "499-605-3212",
696 + "avatar": "https://robohash.org/vitaemagnierror.jpg?size=250x250&set=set1"
697 + },
698 + {
699 + "id": 88,
700 + "starred": true,
701 + "full_name": "Nicol Chastanet",
702 + "email": "nchastanet2f@stanford.edu",
703 + "phone": "142-368-0600",
704 + "avatar": "https://robohash.org/inaba.jpg?size=250x250&set=set1"
705 + },
706 + {
707 + "id": 89,
708 + "starred": false,
709 + "full_name": "Zerk St. Queintain",
710 + "email": "zst2g@mtv.com",
711 + "phone": "741-816-3409",
712 + "avatar": "https://robohash.org/perspiciatisautemquasi.jpg?size=250x250&set=set1"
713 + },
714 + {
715 + "id": 90,
716 + "starred": false,
717 + "full_name": "Evanne Sorley",
718 + "email": "esorley2h@exblog.jp",
719 + "phone": "399-291-4948",
720 + "avatar": "https://robohash.org/iurevoluptatemminus.jpg?size=250x250&set=set1"
721 + },
722 + {
723 + "id": 91,
724 + "starred": false,
725 + "full_name": "Lin Bayford",
726 + "email": "lbayford2i@is.gd",
727 + "phone": "949-498-0241",
728 + "avatar": "https://robohash.org/estveroet.jpg?size=250x250&set=set1"
729 + },
730 + {
731 + "id": 92,
732 + "starred": false,
733 + "full_name": "Bondon Wales",
734 + "email": "bwales2j@google.com.hk",
735 + "phone": "118-736-7999",
736 + "avatar": "https://robohash.org/evenietsedquod.jpg?size=250x250&set=set1"
737 + },
738 + {
739 + "id": 93,
740 + "starred": false,
741 + "full_name": "Henri Dello",
742 + "email": "hdello2k@marketwatch.com",
743 + "phone": "252-293-8401",
744 + "avatar": "https://robohash.org/cumqueetvoluptatem.jpg?size=250x250&set=set1"
745 + },
746 + {
747 + "id": 94,
748 + "starred": false,
749 + "full_name": "Elga Melladew",
750 + "email": "emelladew2l@slideshare.net",
751 + "phone": "328-228-4468",
752 + "avatar": "https://robohash.org/consecteturoccaecatiid.jpg?size=250x250&set=set1"
753 + },
754 + {
755 + "id": 95,
756 + "starred": false,
757 + "full_name": "Hewet Wiggam",
758 + "email": "hwiggam2m@irs.gov",
759 + "phone": "228-447-9945",
760 + "avatar": "https://robohash.org/deseruntquidemvel.jpg?size=250x250&set=set1"
761 + },
762 + {
763 + "id": 96,
764 + "starred": false,
765 + "full_name": "Bethena Patience",
766 + "email": "bpatience2n@ocn.ne.jp",
767 + "phone": "315-618-3829",
768 + "avatar": "https://robohash.org/similiqueautreprehenderit.jpg?size=250x250&set=set1"
769 + },
770 + {
771 + "id": 97,
772 + "starred": true,
773 + "full_name": "Carmelia Hemphall",
774 + "email": "chemphall2o@spotify.com",
775 + "phone": "701-503-1691",
776 + "avatar": "https://robohash.org/autemeligendiomnis.jpg?size=250x250&set=set1"
777 + },
778 + {
779 + "id": 98,
780 + "starred": false,
781 + "full_name": "Korie Myrtle",
782 + "email": "kmyrtle2p@cocolog-nifty.com",
783 + "phone": "439-702-0720",
784 + "avatar": "https://robohash.org/autquaeamet.jpg?size=250x250&set=set1"
785 + },
786 + {
787 + "id": 99,
788 + "starred": false,
789 + "full_name": "Shadow Lauret",
790 + "email": "slauret2q@pbs.org",
791 + "phone": "889-414-0170",
792 + "avatar": "https://robohash.org/sintconsequunturquibusdam.jpg?size=250x250&set=set1"
793 + },
794 + {
795 + "id": 100,
796 + "starred": false,
797 + "full_name": "Stanley Gabbat",
798 + "email": "sgabbat2r@geocities.com",
799 + "phone": "943-300-0090",
800 + "avatar": "https://robohash.org/temporeminimaculpa.jpg?size=250x250&set=set1"
801 + }
802 +]
src/assets/data/USERS_MOCK_DATA.json new
+15002
@@ -0,0 +1,15002 @@
1 +[
2 + {
3 + "id": 1,
4 + "full_name": "Sharline Bugdale",
5 + "email": "sbugdale0@prweb.com",
6 + "gender": "Female",
7 + "job_title": "Safety Technician I",
8 + "company": "Yodoo",
9 + "country": "Japan",
10 + "city": "Tōgane",
11 + "street_address": "5537 Eagle Crest Point",
12 + "phone": "+81 201 600 1213",
13 + "username": "sbugdale0",
14 + "age": 70,
15 + "birth_day": "1993-06-20"
16 + },
17 + {
18 + "id": 2,
19 + "full_name": "Jackie Vasyukhin",
20 + "email": "jvasyukhin1@pbs.org",
21 + "gender": "Male",
22 + "job_title": "GIS Technical Architect",
23 + "company": "Dynabox",
24 + "country": "Cambodia",
25 + "city": "Tbêng Méanchey",
26 + "street_address": "73 Pawling Avenue",
27 + "phone": "+855 966 776 1542",
28 + "username": "jvasyukhin1",
29 + "age": 54,
30 + "birth_day": "1976-05-02"
31 + },
32 + {
33 + "id": 3,
34 + "full_name": "Laetitia Shilston",
35 + "email": "lshilston2@wikia.com",
36 + "gender": "Female",
37 + "job_title": "Software Consultant",
38 + "company": "Browseblab",
39 + "country": "Russia",
40 + "city": "Goyty",
41 + "street_address": "8 Grasskamp Place",
42 + "phone": "+7 812 542 9290",
43 + "username": "lshilston2",
44 + "age": 53,
45 + "birth_day": "1934-11-19"
46 + },
47 + {
48 + "id": 4,
49 + "full_name": "Danila Isacsson",
50 + "email": "disacsson3@nymag.com",
51 + "gender": "Female",
52 + "job_title": "Senior Financial Analyst",
53 + "company": "Youopia",
54 + "country": "French Polynesia",
55 + "city": "Anau",
56 + "street_address": "113 Kipling Center",
57 + "phone": "+689 705 783 8685",
58 + "username": "disacsson3",
59 + "age": 39,
60 + "birth_day": "1942-12-10"
61 + },
62 + {
63 + "id": 5,
64 + "full_name": "Pietrek Adne",
65 + "email": "padne4@imgur.com",
66 + "gender": "Male",
67 + "job_title": "Librarian",
68 + "company": "Avaveo",
69 + "country": "China",
70 + "city": "Bandong",
71 + "street_address": "3 Paget Plaza",
72 + "phone": "+86 969 916 4658",
73 + "username": "padne4",
74 + "age": 70,
75 + "birth_day": "1961-06-29"
76 + },
77 + {
78 + "id": 6,
79 + "full_name": "Clarita Maliffe",
80 + "email": "cmaliffe5@amazon.com",
81 + "gender": "Female",
82 + "job_title": "GIS Technical Architect",
83 + "company": "Twitterbeat",
84 + "country": "Ukraine",
85 + "city": "Molodizhne",
86 + "street_address": "685 Texas Lane",
87 + "phone": "+380 947 886 8033",
88 + "username": "cmaliffe5",
89 + "age": 50,
90 + "birth_day": "1975-07-06"
91 + },
92 + {
93 + "id": 7,
94 + "full_name": "Hephzibah Manger",
95 + "email": "hmanger6@youku.com",
96 + "gender": "Female",
97 + "job_title": "Health Coach III",
98 + "company": "Devcast",
99 + "country": "Indonesia",
100 + "city": "Sumberagung",
101 + "street_address": "69 Namekagon Junction",
102 + "phone": "+62 812 212 2838",
103 + "username": "hmanger6",
104 + "age": 18,
105 + "birth_day": "1947-05-01"
106 + },
107 + {
108 + "id": 8,
109 + "full_name": "Rhett Hall",
110 + "email": "rhall7@howstuffworks.com",
111 + "gender": "Male",
112 + "job_title": "Dental Hygienist",
113 + "company": "Quaxo",
114 + "country": "Philippines",
115 + "city": "San Pedro",
116 + "street_address": "24 Mayfield Point",
117 + "phone": "+63 480 566 1371",
118 + "username": "rhall7",
119 + "age": 48,
120 + "birth_day": "1934-04-14"
121 + },
122 + {
123 + "id": 9,
124 + "full_name": "Abbye McKelvey",
125 + "email": "amckelvey8@bloomberg.com",
126 + "gender": "Female",
127 + "job_title": "Project Manager",
128 + "company": "Dynabox",
129 + "country": "Russia",
130 + "city": "Gudermes",
131 + "street_address": "94766 Morrow Way",
132 + "phone": "+7 154 285 1038",
133 + "username": "amckelvey8",
134 + "age": 62,
135 + "birth_day": "1947-02-21"
136 + },
137 + {
138 + "id": 10,
139 + "full_name": "Ramsey Cowlam",
140 + "email": "rcowlam9@oakley.com",
141 + "gender": "Male",
142 + "job_title": "Director of Sales",
143 + "company": "Gigabox",
144 + "country": "Russia",
145 + "city": "Sosnovyy Bor",
146 + "street_address": "835 Ridgeway Way",
147 + "phone": "+7 549 811 3373",
148 + "username": "rcowlam9",
149 + "age": 53,
150 + "birth_day": "1982-04-21"
151 + },
152 + {
153 + "id": 11,
154 + "full_name": "Farah Muddle",
155 + "email": "fmuddlea@elegantthemes.com",
156 + "gender": "Female",
157 + "job_title": "Technical Writer",
158 + "company": "Topiczoom",
159 + "country": "Portugal",
160 + "city": "Arcos de Valdevez",
161 + "street_address": "41136 Haas Street",
162 + "phone": "+351 485 288 1843",
163 + "username": "fmuddlea",
164 + "age": 80,
165 + "birth_day": "1954-07-13"
166 + },
167 + {
168 + "id": 12,
169 + "full_name": "Humfried Chorlton",
170 + "email": "hchorltonb@ft.com",
171 + "gender": "Male",
172 + "job_title": "Software Test Engineer II",
173 + "company": "Skiptube",
174 + "country": "Philippines",
175 + "city": "Jovellar",
176 + "street_address": "7177 Pepper Wood Plaza",
177 + "phone": "+63 377 490 8110",
178 + "username": "hchorltonb",
179 + "age": 35,
180 + "birth_day": "1994-08-08"
181 + },
182 + {
183 + "id": 13,
184 + "full_name": "Pierce Savidge",
185 + "email": "psavidgec@biglobe.ne.jp",
186 + "gender": "Male",
187 + "job_title": "Actuary",
188 + "company": "Realbridge",
189 + "country": "Canada",
190 + "city": "Duncan",
191 + "street_address": "507 Homewood Road",
192 + "phone": "+1 491 933 9588",
193 + "username": "psavidgec",
194 + "age": 25,
195 + "birth_day": "1952-07-19"
196 + },
197 + {
198 + "id": 14,
199 + "full_name": "Archie Bockin",
200 + "email": "abockind@bloomberg.com",
201 + "gender": "Male",
202 + "job_title": "Analyst Programmer",
203 + "company": "Jabbercube",
204 + "country": "Croatia",
205 + "city": "Zadvorsko",
206 + "street_address": "7320 Nelson Court",
207 + "phone": "+385 533 929 1751",
208 + "username": "abockind",
209 + "age": 39,
210 + "birth_day": "1995-03-15"
211 + },
212 + {
213 + "id": 15,
214 + "full_name": "Neddie Kleinplatz",
215 + "email": "nkleinplatze@histats.com",
216 + "gender": "Male",
217 + "job_title": "Internal Auditor",
218 + "company": "Mycat",
219 + "country": "Peru",
220 + "city": "Chimbote",
221 + "street_address": "7 Mosinee Way",
222 + "phone": "+51 639 991 3337",
223 + "username": "nkleinplatze",
224 + "age": 34,
225 + "birth_day": "1935-03-24"
226 + },
227 + {
228 + "id": 16,
229 + "full_name": "Sylvester Harrigan",
230 + "email": "sharriganf@etsy.com",
231 + "gender": "Male",
232 + "job_title": "Geologist II",
233 + "company": "Pixoboo",
234 + "country": "Russia",
235 + "city": "Arsen’yev",
236 + "street_address": "3 Green Terrace",
237 + "phone": "+7 351 840 0760",
238 + "username": "sharriganf",
239 + "age": 36,
240 + "birth_day": "1935-11-14"
241 + },
242 + {
243 + "id": 17,
244 + "full_name": "Chadd Makinson",
245 + "email": "cmakinsong@ehow.com",
246 + "gender": "Male",
247 + "job_title": "Food Chemist",
248 + "company": "Mynte",
249 + "country": "France",
250 + "city": "Carpentras",
251 + "street_address": "32 Roth Parkway",
252 + "phone": "+33 558 942 1810",
253 + "username": "cmakinsong",
254 + "age": 76,
255 + "birth_day": "1948-10-15"
256 + },
257 + {
258 + "id": 18,
259 + "full_name": "Gladi Wensley",
260 + "email": "gwensleyh@deviantart.com",
261 + "gender": "Female",
262 + "job_title": "Project Manager",
263 + "company": "Brainbox",
264 + "country": "Brazil",
265 + "city": "Uruguaiana",
266 + "street_address": "79722 Victoria Lane",
267 + "phone": "+55 240 823 6409",
268 + "username": "gwensleyh",
269 + "age": 30,
270 + "birth_day": "1964-06-06"
271 + },
272 + {
273 + "id": 19,
274 + "full_name": "Inessa Wareham",
275 + "email": "iwarehami@mapy.cz",
276 + "gender": "Female",
277 + "job_title": "Administrative Assistant I",
278 + "company": "Skippad",
279 + "country": "Indonesia",
280 + "city": "Golek",
281 + "street_address": "9501 Mallory Park",
282 + "phone": "+62 278 722 3667",
283 + "username": "iwarehami",
284 + "age": 55,
285 + "birth_day": "1985-03-05"
286 + },
287 + {
288 + "id": 20,
289 + "full_name": "Marty Schwand",
290 + "email": "mschwandj@webs.com",
291 + "gender": "Male",
292 + "job_title": "GIS Technical Architect",
293 + "company": "Wordify",
294 + "country": "China",
295 + "city": "Hongshi",
296 + "street_address": "151 Kim Circle",
297 + "phone": "+86 488 359 3800",
298 + "username": "mschwandj",
299 + "age": 33,
300 + "birth_day": "1972-03-25"
301 + },
302 + {
303 + "id": 21,
304 + "full_name": "Robina Laxston",
305 + "email": "rlaxstonk@about.com",
306 + "gender": "Female",
307 + "job_title": "Research Assistant II",
308 + "company": "Wordify",
309 + "country": "Bosnia and Herzegovina",
310 + "city": "Brka",
311 + "street_address": "3971 Rigney Parkway",
312 + "phone": "+387 626 126 5606",
313 + "username": "rlaxstonk",
314 + "age": 39,
315 + "birth_day": "1953-09-14"
316 + },
317 + {
318 + "id": 22,
319 + "full_name": "Cornell Tummasutti",
320 + "email": "ctummasuttil@toplist.cz",
321 + "gender": "Male",
322 + "job_title": "Structural Engineer",
323 + "company": "Zoomlounge",
324 + "country": "France",
325 + "city": "Orléans",
326 + "street_address": "7 7th Center",
327 + "phone": "+33 199 897 2731",
328 + "username": "ctummasuttil",
329 + "age": 56,
330 + "birth_day": "1978-10-26"
331 + },
332 + {
333 + "id": 23,
334 + "full_name": "Bettine McLeman",
335 + "email": "bmclemanm@virginia.edu",
336 + "gender": "Female",
337 + "job_title": "Editor",
338 + "company": "Agimba",
339 + "country": "China",
340 + "city": "Lengji",
341 + "street_address": "125 Texas Center",
342 + "phone": "+86 326 469 1313",
343 + "username": "bmclemanm",
344 + "age": 35,
345 + "birth_day": "1964-11-12"
346 + },
347 + {
348 + "id": 24,
349 + "full_name": "Gisella O'Hogertie",
350 + "email": "gohogertien@indiatimes.com",
351 + "gender": "Female",
352 + "job_title": "Office Assistant III",
353 + "company": "Livetube",
354 + "country": "China",
355 + "city": "Yonghe",
356 + "street_address": "4061 Dorton Circle",
357 + "phone": "+86 329 541 0877",
358 + "username": "gohogertien",
359 + "age": 67,
360 + "birth_day": "1964-03-18"
361 + },
362 + {
363 + "id": 25,
364 + "full_name": "Bernie Seers",
365 + "email": "bseerso@dailymail.co.uk",
366 + "gender": "Female",
367 + "job_title": "Account Representative III",
368 + "company": "Voonder",
369 + "country": "Sweden",
370 + "city": "Limmared",
371 + "street_address": "33 Del Sol Point",
372 + "phone": "+46 744 330 4448",
373 + "username": "bseerso",
374 + "age": 29,
375 + "birth_day": "1939-10-04"
376 + },
377 + {
378 + "id": 26,
379 + "full_name": "Cassandre Tuckley",
380 + "email": "ctuckleyp@hibu.com",
381 + "gender": "Female",
382 + "job_title": "Safety Technician II",
383 + "company": "Fanoodle",
384 + "country": "China",
385 + "city": "Samdo",
386 + "street_address": "914 Derek Place",
387 + "phone": "+86 855 416 6099",
388 + "username": "ctuckleyp",
389 + "age": 35,
390 + "birth_day": "1959-11-11"
391 + },
392 + {
393 + "id": 27,
394 + "full_name": "Monroe MacGaughy",
395 + "email": "mmacgaughyq@independent.co.uk",
396 + "gender": "Male",
397 + "job_title": "Media Manager II",
398 + "company": "Blogspan",
399 + "country": "Russia",
400 + "city": "Il’inskiy Pogost",
401 + "street_address": "8 Stuart Way",
402 + "phone": "+7 332 835 1413",
403 + "username": "mmacgaughyq",
404 + "age": 51,
405 + "birth_day": "1985-01-05"
406 + },
407 + {
408 + "id": 28,
409 + "full_name": "Gregorio Cumes",
410 + "email": "gcumesr@yandex.ru",
411 + "gender": "Male",
412 + "job_title": "Safety Technician III",
413 + "company": "LiveZ",
414 + "country": "Colombia",
415 + "city": "Curumaní",
416 + "street_address": "81 Commercial Parkway",
417 + "phone": "+57 996 206 0117",
418 + "username": "gcumesr",
419 + "age": 32,
420 + "birth_day": "1967-03-24"
421 + },
422 + {
423 + "id": 29,
424 + "full_name": "Cassy Atterbury",
425 + "email": "catterburys@deliciousdays.com",
426 + "gender": "Female",
427 + "job_title": "Nurse Practicioner",
428 + "company": "Abata",
429 + "country": "Belarus",
430 + "city": "Vawkavysk",
431 + "street_address": "75640 Delladonna Crossing",
432 + "phone": "+375 778 379 0085",
433 + "username": "catterburys",
434 + "age": 75,
435 + "birth_day": "1960-02-18"
436 + },
437 + {
438 + "id": 30,
439 + "full_name": "Thornie Midner",
440 + "email": "tmidnert@baidu.com",
441 + "gender": "Male",
442 + "job_title": "Systems Administrator I",
443 + "company": "Oodoo",
444 + "country": "Poland",
445 + "city": "Kargowa",
446 + "street_address": "04 Doe Crossing Park",
447 + "phone": "+48 944 177 7489",
448 + "username": "tmidnert",
449 + "age": 55,
450 + "birth_day": "1982-09-02"
451 + },
452 + {
453 + "id": 31,
454 + "full_name": "Shina Ballham",
455 + "email": "sballhamu@rakuten.co.jp",
456 + "gender": "Female",
457 + "job_title": "Actuary",
458 + "company": "Feedfire",
459 + "country": "South Africa",
460 + "city": "eSikhawini",
461 + "street_address": "04 Maple Wood Way",
462 + "phone": "+27 741 492 6682",
463 + "username": "sballhamu",
464 + "age": 70,
465 + "birth_day": "1994-01-11"
466 + },
467 + {
468 + "id": 32,
469 + "full_name": "Seward Robarts",
470 + "email": "srobartsv@bing.com",
471 + "gender": "Male",
472 + "job_title": "Account Executive",
473 + "company": "Vipe",
474 + "country": "Portugal",
475 + "city": "Seixo Alvo",
476 + "street_address": "91 Dorton Trail",
477 + "phone": "+351 150 314 6498",
478 + "username": "srobartsv",
479 + "age": 69,
480 + "birth_day": "1976-05-17"
481 + },
482 + {
483 + "id": 33,
484 + "full_name": "Daphna Frye",
485 + "email": "dfryew@army.mil",
486 + "gender": "Female",
487 + "job_title": "Geologist IV",
488 + "company": "Innotype",
489 + "country": "Ireland",
490 + "city": "Dromiskin",
491 + "street_address": "17 Cascade Alley",
492 + "phone": "+353 496 624 2537",
493 + "username": "dfryew",
494 + "age": 18,
495 + "birth_day": "1955-08-16"
496 + },
497 + {
498 + "id": 34,
499 + "full_name": "Keefer Phillipps",
500 + "email": "kphillippsx@plala.or.jp",
501 + "gender": "Male",
502 + "job_title": "VP Product Management",
503 + "company": "Yamia",
504 + "country": "Peru",
505 + "city": "Jayanca",
506 + "street_address": "2021 Starling Crossing",
507 + "phone": "+51 647 984 6600",
508 + "username": "kphillippsx",
509 + "age": 28,
510 + "birth_day": "1938-03-18"
511 + },
512 + {
513 + "id": 35,
514 + "full_name": "Lyon Filgate",
515 + "email": "lfilgatey@blog.com",
516 + "gender": "Male",
517 + "job_title": "Cost Accountant",
518 + "company": "Trilith",
519 + "country": "Indonesia",
520 + "city": "Leteki",
521 + "street_address": "5 Kipling Terrace",
522 + "phone": "+62 526 712 8927",
523 + "username": "lfilgatey",
524 + "age": 42,
525 + "birth_day": "1955-02-21"
526 + },
527 + {
528 + "id": 36,
529 + "full_name": "Hervey Shrubsall",
530 + "email": "hshrubsallz@vkontakte.ru",
531 + "gender": "Male",
532 + "job_title": "Technical Writer",
533 + "company": "Twitterwire",
534 + "country": "China",
535 + "city": "Ninghai",
536 + "street_address": "6792 Rockefeller Park",
537 + "phone": "+86 201 411 7272",
538 + "username": "hshrubsallz",
539 + "age": 51,
540 + "birth_day": "1956-06-02"
541 + },
542 + {
543 + "id": 37,
544 + "full_name": "Abie Dods",
545 + "email": "adods10@cnbc.com",
546 + "gender": "Male",
547 + "job_title": "Product Engineer",
548 + "company": "Roodel",
549 + "country": "Sweden",
550 + "city": "Stockholm",
551 + "street_address": "245 Cody Park",
552 + "phone": "+46 451 444 2042",
553 + "username": "adods10",
554 + "age": 52,
555 + "birth_day": "1996-09-18"
556 + },
557 + {
558 + "id": 38,
559 + "full_name": "Eleonora Tuminini",
560 + "email": "etuminini11@nyu.edu",
561 + "gender": "Female",
562 + "job_title": "Human Resources Assistant I",
563 + "company": "Vitz",
564 + "country": "Peru",
565 + "city": "Quinocay",
566 + "street_address": "6350 Linden Alley",
567 + "phone": "+51 472 430 1496",
568 + "username": "etuminini11",
569 + "age": 73,
570 + "birth_day": "1993-06-24"
571 + },
572 + {
573 + "id": 39,
574 + "full_name": "Clarice Greatbank",
575 + "email": "cgreatbank12@sohu.com",
576 + "gender": "Female",
577 + "job_title": "Occupational Therapist",
578 + "company": "Aimbu",
579 + "country": "Poland",
580 + "city": "Brzeszcze",
581 + "street_address": "953 Fuller Lane",
582 + "phone": "+48 921 961 6631",
583 + "username": "cgreatbank12",
584 + "age": 71,
585 + "birth_day": "1938-09-06"
586 + },
587 + {
588 + "id": 40,
589 + "full_name": "Chrisy Roadnight",
590 + "email": "croadnight13@ihg.com",
591 + "gender": "Male",
592 + "job_title": "Health Coach III",
593 + "company": "Skyndu",
594 + "country": "Brazil",
595 + "city": "Penalva",
596 + "street_address": "3350 Magdeline Way",
597 + "phone": "+55 708 750 6132",
598 + "username": "croadnight13",
599 + "age": 71,
600 + "birth_day": "1990-05-15"
601 + },
602 + {
603 + "id": 41,
604 + "full_name": "Shellysheldon Cadreman",
605 + "email": "scadreman14@usa.gov",
606 + "gender": "Male",
607 + "job_title": "Occupational Therapist",
608 + "company": "Latz",
609 + "country": "Sri Lanka",
610 + "city": "Shanjeev Home",
611 + "street_address": "111 Debra Point",
612 + "phone": "+94 379 855 2417",
613 + "username": "scadreman14",
614 + "age": 49,
615 + "birth_day": "1957-07-10"
616 + },
617 + {
618 + "id": 42,
619 + "full_name": "Daphna Caser",
620 + "email": "dcaser15@stumbleupon.com",
621 + "gender": "Female",
622 + "job_title": "Senior Quality Engineer",
623 + "company": "Gabvine",
624 + "country": "Indonesia",
625 + "city": "Tlogowetan",
626 + "street_address": "2535 Brown Hill",
627 + "phone": "+62 361 620 6286",
628 + "username": "dcaser15",
629 + "age": 56,
630 + "birth_day": "1952-07-28"
631 + },
632 + {
633 + "id": 43,
634 + "full_name": "Noellyn Haldin",
635 + "email": "nhaldin16@desdev.cn",
636 + "gender": "Female",
637 + "job_title": "Junior Executive",
638 + "company": "Twitterbeat",
639 + "country": "Indonesia",
640 + "city": "Murtajih",
641 + "street_address": "6 Maryland Pass",
642 + "phone": "+62 870 530 9434",
643 + "username": "nhaldin16",
644 + "age": 18,
645 + "birth_day": "1937-02-07"
646 + },
647 + {
648 + "id": 44,
649 + "full_name": "Annabella Ormond",
650 + "email": "aormond17@goo.gl",
651 + "gender": "Female",
652 + "job_title": "Biostatistician IV",
653 + "company": "Linkbuzz",
654 + "country": "China",
655 + "city": "Qinjiang",
656 + "street_address": "7324 Westport Parkway",
657 + "phone": "+86 672 226 5090",
658 + "username": "aormond17",
659 + "age": 67,
660 + "birth_day": "1987-07-21"
661 + },
662 + {
663 + "id": 45,
664 + "full_name": "Saundra Brandreth",
665 + "email": "sbrandreth18@weibo.com",
666 + "gender": "Female",
667 + "job_title": "Automation Specialist I",
668 + "company": "Zoomcast",
669 + "country": "Indonesia",
670 + "city": "Sakerta Timur",
671 + "street_address": "1787 Clarendon Court",
672 + "phone": "+62 155 165 4858",
673 + "username": "sbrandreth18",
674 + "age": 19,
675 + "birth_day": "1967-06-05"
676 + },
677 + {
678 + "id": 46,
679 + "full_name": "Cecil Flecknell",
680 + "email": "cflecknell19@state.tx.us",
681 + "gender": "Female",
682 + "job_title": "Professor",
683 + "company": "Skilith",
684 + "country": "China",
685 + "city": "Guizi",
686 + "street_address": "247 Ruskin Drive",
687 + "phone": "+86 739 630 0019",
688 + "username": "cflecknell19",
689 + "age": 67,
690 + "birth_day": "1956-12-22"
691 + },
692 + {
693 + "id": 47,
694 + "full_name": "Sigvard Archbald",
695 + "email": "sarchbald1a@usda.gov",
696 + "gender": "Male",
697 + "job_title": "Speech Pathologist",
698 + "company": "Trudoo",
699 + "country": "Indonesia",
700 + "city": "Cipasung",
701 + "street_address": "48 Maple Center",
702 + "phone": "+62 950 793 2637",
703 + "username": "sarchbald1a",
704 + "age": 21,
705 + "birth_day": "1931-06-02"
706 + },
707 + {
708 + "id": 48,
709 + "full_name": "Winfred Rattenbury",
710 + "email": "wrattenbury1b@aol.com",
711 + "gender": "Male",
712 + "job_title": "Registered Nurse",
713 + "company": "Wikivu",
714 + "country": "Costa Rica",
715 + "city": "La Virgen",
716 + "street_address": "1 Corscot Way",
717 + "phone": "+506 108 713 9885",
718 + "username": "wrattenbury1b",
719 + "age": 70,
720 + "birth_day": "1986-08-21"
721 + },
722 + {
723 + "id": 49,
724 + "full_name": "Malena Fassan",
725 + "email": "mfassan1c@fema.gov",
726 + "gender": "Female",
727 + "job_title": "Geological Engineer",
728 + "company": "Topiczoom",
729 + "country": "United States",
730 + "city": "Nashville",
731 + "street_address": "922 Kropf Hill",
732 + "phone": "+1 615 547 2150",
733 + "username": "mfassan1c",
734 + "age": 56,
735 + "birth_day": "1937-11-28"
736 + },
737 + {
738 + "id": 50,
739 + "full_name": "Kelby Arnolds",
740 + "email": "karnolds1d@wikispaces.com",
741 + "gender": "Male",
742 + "job_title": "General Manager",
743 + "company": "Kare",
744 + "country": "Finland",
745 + "city": "Ranua",
746 + "street_address": "1876 Ohio Way",
747 + "phone": "+358 226 601 0437",
748 + "username": "karnolds1d",
749 + "age": 40,
750 + "birth_day": "1990-04-10"
751 + },
752 + {
753 + "id": 51,
754 + "full_name": "Liana Knowler",
755 + "email": "lknowler1e@ovh.net",
756 + "gender": "Female",
757 + "job_title": "VP Quality Control",
758 + "company": "Browsetype",
759 + "country": "Colombia",
760 + "city": "San Andrés",
761 + "street_address": "04915 Gulseth Street",
762 + "phone": "+57 465 814 0631",
763 + "username": "lknowler1e",
764 + "age": 67,
765 + "birth_day": "1960-11-10"
766 + },
767 + {
768 + "id": 52,
769 + "full_name": "Pamelina Menauteau",
770 + "email": "pmenauteau1f@csmonitor.com",
771 + "gender": "Female",
772 + "job_title": "Cost Accountant",
773 + "company": "Twinte",
774 + "country": "Benin",
775 + "city": "Kandi",
776 + "street_address": "75791 Arizona Parkway",
777 + "phone": "+229 716 661 4340",
778 + "username": "pmenauteau1f",
779 + "age": 39,
780 + "birth_day": "1984-08-10"
781 + },
782 + {
783 + "id": 53,
784 + "full_name": "Chip Scare",
785 + "email": "cscare1g@samsung.com",
786 + "gender": "Male",
787 + "job_title": "Occupational Therapist",
788 + "company": "Edgewire",
789 + "country": "South Africa",
790 + "city": "Bloemfontein",
791 + "street_address": "369 Welch Junction",
792 + "phone": "+27 729 315 6835",
793 + "username": "cscare1g",
794 + "age": 41,
795 + "birth_day": "1949-09-14"
796 + },
797 + {
798 + "id": 54,
799 + "full_name": "Rebecka Suter",
800 + "email": "rsuter1h@cdc.gov",
801 + "gender": "Female",
802 + "job_title": "Executive Secretary",
803 + "company": "Photolist",
804 + "country": "Philippines",
805 + "city": "Bantog",
806 + "street_address": "1001 Bobwhite Court",
807 + "phone": "+63 167 201 2506",
808 + "username": "rsuter1h",
809 + "age": 34,
810 + "birth_day": "1980-07-25"
811 + },
812 + {
813 + "id": 55,
814 + "full_name": "Dix Boame",
815 + "email": "dboame1i@nps.gov",
816 + "gender": "Female",
817 + "job_title": "Compensation Analyst",
818 + "company": "Voomm",
819 + "country": "Japan",
820 + "city": "Iwanai",
821 + "street_address": "8703 Toban Lane",
822 + "phone": "+81 557 772 5150",
823 + "username": "dboame1i",
824 + "age": 53,
825 + "birth_day": "1934-01-29"
826 + },
827 + {
828 + "id": 56,
829 + "full_name": "Waverley Boyer",
830 + "email": "wboyer1j@nasa.gov",
831 + "gender": "Male",
832 + "job_title": "Sales Representative",
833 + "company": "Oyoloo",
834 + "country": "China",
835 + "city": "Lile",
836 + "street_address": "32763 Sunfield Crossing",
837 + "phone": "+86 280 250 2352",
838 + "username": "wboyer1j",
839 + "age": 49,
840 + "birth_day": "1996-07-09"
841 + },
842 + {
843 + "id": 57,
844 + "full_name": "Janina Tildesley",
845 + "email": "jtildesley1k@auda.org.au",
846 + "gender": "Female",
847 + "job_title": "Analog Circuit Design manager",
848 + "company": "Babbleopia",
849 + "country": "China",
850 + "city": "Tuofeng",
851 + "street_address": "9 Pennsylvania Alley",
852 + "phone": "+86 666 144 7639",
853 + "username": "jtildesley1k",
854 + "age": 44,
855 + "birth_day": "1956-11-18"
856 + },
857 + {
858 + "id": 58,
859 + "full_name": "Betteann Franzewitch",
860 + "email": "bfranzewitch1l@paypal.com",
861 + "gender": "Female",
862 + "job_title": "Associate Professor",
863 + "company": "Rhynyx",
864 + "country": "Serbia",
865 + "city": "Čortanovci",
866 + "street_address": "43 Park Meadow Park",
867 + "phone": "+381 574 227 2556",
868 + "username": "bfranzewitch1l",
869 + "age": 76,
870 + "birth_day": "1997-04-17"
871 + },
872 + {
873 + "id": 59,
874 + "full_name": "Preston Syddon",
875 + "email": "psyddon1m@hugedomains.com",
876 + "gender": "Male",
877 + "job_title": "Assistant Manager",
878 + "company": "Voolia",
879 + "country": "Azerbaijan",
880 + "city": "Kyzyl-Burun",
881 + "street_address": "82 Mesta Road",
882 + "phone": "+994 145 892 2883",
883 + "username": "psyddon1m",
884 + "age": 22,
885 + "birth_day": "1938-07-17"
886 + },
887 + {
888 + "id": 60,
889 + "full_name": "Silvain Binning",
890 + "email": "sbinning1n@wiley.com",
891 + "gender": "Male",
892 + "job_title": "Programmer Analyst I",
893 + "company": "Topicware",
894 + "country": "Poland",
895 + "city": "Koszyce Wielkie",
896 + "street_address": "34 Colorado Trail",
897 + "phone": "+48 955 397 0102",
898 + "username": "sbinning1n",
899 + "age": 27,
900 + "birth_day": "1971-12-19"
901 + },
902 + {
903 + "id": 61,
904 + "full_name": "Karla Yegorev",
905 + "email": "kyegorev1o@wordpress.org",
906 + "gender": "Female",
907 + "job_title": "Marketing Assistant",
908 + "company": "Plajo",
909 + "country": "Russia",
910 + "city": "Bagan",
911 + "street_address": "17611 Sutteridge Avenue",
912 + "phone": "+7 462 752 7238",
913 + "username": "kyegorev1o",
914 + "age": 48,
915 + "birth_day": "1996-08-16"
916 + },
917 + {
918 + "id": 62,
919 + "full_name": "Ashia McGeachie",
920 + "email": "amcgeachie1p@wordpress.com",
921 + "gender": "Female",
922 + "job_title": "Senior Developer",
923 + "company": "Kayveo",
924 + "country": "Colombia",
925 + "city": "Purísima",
926 + "street_address": "51 Burning Wood Lane",
927 + "phone": "+57 515 406 7690",
928 + "username": "amcgeachie1p",
929 + "age": 75,
930 + "birth_day": "1980-01-21"
931 + },
932 + {
933 + "id": 63,
934 + "full_name": "Derron Minister",
935 + "email": "dminister1q@skype.com",
936 + "gender": "Male",
937 + "job_title": "General Manager",
938 + "company": "Trudeo",
939 + "country": "Iran",
940 + "city": "Gorgān",
941 + "street_address": "29650 Spohn Avenue",
942 + "phone": "+98 753 425 8295",
943 + "username": "dminister1q",
944 + "age": 49,
945 + "birth_day": "1977-10-07"
946 + },
947 + {
948 + "id": 64,
949 + "full_name": "Paolo Elphick",
950 + "email": "pelphick1r@biblegateway.com",
951 + "gender": "Male",
952 + "job_title": "Research Associate",
953 + "company": "Mymm",
954 + "country": "China",
955 + "city": "Hongtang",
956 + "street_address": "34449 Susan Crossing",
957 + "phone": "+86 654 915 2503",
958 + "username": "pelphick1r",
959 + "age": 67,
960 + "birth_day": "1944-04-03"
961 + },
962 + {
963 + "id": 65,
964 + "full_name": "Bentley Fumagalli",
965 + "email": "bfumagalli1s@nsw.gov.au",
966 + "gender": "Male",
967 + "job_title": "Media Manager III",
968 + "company": "Buzzshare",
969 + "country": "China",
970 + "city": "Shatian",
971 + "street_address": "1210 Walton Court",
972 + "phone": "+86 467 719 5295",
973 + "username": "bfumagalli1s",
974 + "age": 30,
975 + "birth_day": "1984-07-16"
976 + },
977 + {
978 + "id": 66,
979 + "full_name": "Blinni Echelle",
980 + "email": "bechelle1t@tamu.edu",
981 + "gender": "Female",
982 + "job_title": "Clinical Specialist",
983 + "company": "Kimia",
984 + "country": "Poland",
985 + "city": "Błonie",
986 + "street_address": "6 Morning Circle",
987 + "phone": "+48 620 901 5957",
988 + "username": "bechelle1t",
989 + "age": 52,
990 + "birth_day": "1991-06-07"
991 + },
992 + {
993 + "id": 67,
994 + "full_name": "Albrecht Taylo",
995 + "email": "ataylo1u@miitbeian.gov.cn",
996 + "gender": "Male",
997 + "job_title": "VP Product Management",
998 + "company": "Snaptags",
999 + "country": "Vietnam",
1000 + "city": "Dĩ An",
1001 + "street_address": "8562 Chinook Place",
1002 + "phone": "+84 927 296 3165",
1003 + "username": "ataylo1u",
1004 + "age": 50,
1005 + "birth_day": "1991-02-17"
1006 + },
1007 + {
1008 + "id": 68,
1009 + "full_name": "Langsdon Bertholin",
1010 + "email": "lbertholin1v@webmd.com",
1011 + "gender": "Male",
1012 + "job_title": "Help Desk Operator",
1013 + "company": "Gabspot",
1014 + "country": "Sweden",
1015 + "city": "Stockholm",
1016 + "street_address": "48 Bonner Place",
1017 + "phone": "+46 519 909 9421",
1018 + "username": "lbertholin1v",
1019 + "age": 58,
1020 + "birth_day": "1936-02-27"
1021 + },
1022 + {
1023 + "id": 69,
1024 + "full_name": "Leontyne Corrao",
1025 + "email": "lcorrao1w@jimdo.com",
1026 + "gender": "Female",
1027 + "job_title": "Nurse",
1028 + "company": "Jazzy",
1029 + "country": "China",
1030 + "city": "Dongshe",
1031 + "street_address": "6718 Anniversary Street",
1032 + "phone": "+86 959 279 3672",
1033 + "username": "lcorrao1w",
1034 + "age": 50,
1035 + "birth_day": "1953-04-30"
1036 + },
1037 + {
1038 + "id": 70,
1039 + "full_name": "Raina Mattisssen",
1040 + "email": "rmattisssen1x@blog.com",
1041 + "gender": "Female",
1042 + "job_title": "Financial Advisor",
1043 + "company": "Thoughtstorm",
1044 + "country": "Brazil",
1045 + "city": "Oriximiná",
1046 + "street_address": "7 Sundown Circle",
1047 + "phone": "+55 497 102 0912",
1048 + "username": "rmattisssen1x",
1049 + "age": 36,
1050 + "birth_day": "1934-02-14"
1051 + },
1052 + {
1053 + "id": 71,
1054 + "full_name": "Sayre Erickson",
1055 + "email": "serickson1y@intel.com",
1056 + "gender": "Male",
1057 + "job_title": "Editor",
1058 + "company": "Viva",
1059 + "country": "Sweden",
1060 + "city": "Stockholm",
1061 + "street_address": "2524 Rusk Lane",
1062 + "phone": "+46 756 369 8158",
1063 + "username": "serickson1y",
1064 + "age": 63,
1065 + "birth_day": "1980-07-01"
1066 + },
1067 + {
1068 + "id": 72,
1069 + "full_name": "Herrick Wardingly",
1070 + "email": "hwardingly1z@loc.gov",
1071 + "gender": "Male",
1072 + "job_title": "Senior Cost Accountant",
1073 + "company": "Voomm",
1074 + "country": "China",
1075 + "city": "Ningmute",
1076 + "street_address": "3850 Sunbrook Court",
1077 + "phone": "+86 375 381 9575",
1078 + "username": "hwardingly1z",
1079 + "age": 54,
1080 + "birth_day": "1973-09-11"
1081 + },
1082 + {
1083 + "id": 73,
1084 + "full_name": "Lucienne Macer",
1085 + "email": "lmacer20@hexun.com",
1086 + "gender": "Female",
1087 + "job_title": "Quality Control Specialist",
1088 + "company": "Meetz",
1089 + "country": "Philippines",
1090 + "city": "Tigaon",
1091 + "street_address": "24 Kings Way",
1092 + "phone": "+63 373 528 3732",
1093 + "username": "lmacer20",
1094 + "age": 30,
1095 + "birth_day": "1936-12-05"
1096 + },
1097 + {
1098 + "id": 74,
1099 + "full_name": "Fayina Germann",
1100 + "email": "fgermann21@sina.com.cn",
1101 + "gender": "Female",
1102 + "job_title": "Director of Sales",
1103 + "company": "Livetube",
1104 + "country": "Philippines",
1105 + "city": "Lopez Jaena",
1106 + "street_address": "0 Moose Crossing",
1107 + "phone": "+63 705 112 1136",
1108 + "username": "fgermann21",
1109 + "age": 58,
1110 + "birth_day": "1950-03-24"
1111 + },
1112 + {
1113 + "id": 75,
1114 + "full_name": "Lewiss McGlade",
1115 + "email": "lmcglade22@army.mil",
1116 + "gender": "Male",
1117 + "job_title": "Professor",
1118 + "company": "Riffpedia",
1119 + "country": "Nigeria",
1120 + "city": "Madagali",
1121 + "street_address": "615 Acker Point",
1122 + "phone": "+234 634 632 4227",
1123 + "username": "lmcglade22",
1124 + "age": 77,
1125 + "birth_day": "1989-04-04"
1126 + },
1127 + {
1128 + "id": 76,
1129 + "full_name": "Stacee Berrick",
1130 + "email": "sberrick23@wordpress.org",
1131 + "gender": "Female",
1132 + "job_title": "Structural Engineer",
1133 + "company": "Blogtags",
1134 + "country": "Indonesia",
1135 + "city": "Era",
1136 + "street_address": "6 Superior Road",
1137 + "phone": "+62 577 749 3479",
1138 + "username": "sberrick23",
1139 + "age": 76,
1140 + "birth_day": "1932-03-02"
1141 + },
1142 + {
1143 + "id": 77,
1144 + "full_name": "Sergeant Edbrooke",
1145 + "email": "sedbrooke24@ycombinator.com",
1146 + "gender": "Male",
1147 + "job_title": "Quality Engineer",
1148 + "company": "Tagpad",
1149 + "country": "Indonesia",
1150 + "city": "Panyambungan",
1151 + "street_address": "9139 Westridge Street",
1152 + "phone": "+62 134 709 8407",
1153 + "username": "sedbrooke24",
1154 + "age": 78,
1155 + "birth_day": "1970-01-11"
1156 + },
1157 + {
1158 + "id": 78,
1159 + "full_name": "Dotti Clifford",
1160 + "email": "dclifford25@nbcnews.com",
1161 + "gender": "Female",
1162 + "job_title": "Information Systems Manager",
1163 + "company": "Brainsphere",
1164 + "country": "Ukraine",
1165 + "city": "Chernelytsya",
1166 + "street_address": "973 Monument Hill",
1167 + "phone": "+380 754 500 1895",
1168 + "username": "dclifford25",
1169 + "age": 40,
1170 + "birth_day": "1948-04-22"
1171 + },
1172 + {
1173 + "id": 79,
1174 + "full_name": "Kerry Stratiff",
1175 + "email": "kstratiff26@youku.com",
1176 + "gender": "Male",
1177 + "job_title": "Account Executive",
1178 + "company": "Mita",
1179 + "country": "China",
1180 + "city": "Yaohua",
1181 + "street_address": "45 Redwing Crossing",
1182 + "phone": "+86 939 980 4485",
1183 + "username": "kstratiff26",
1184 + "age": 24,
1185 + "birth_day": "1967-03-30"
1186 + },
1187 + {
1188 + "id": 80,
1189 + "full_name": "Rice Krzyzowski",
1190 + "email": "rkrzyzowski27@amazon.com",
1191 + "gender": "Male",
1192 + "job_title": "VP Quality Control",
1193 + "company": "Oyondu",
1194 + "country": "Russia",
1195 + "city": "Preobrazheniye",
1196 + "street_address": "33 Hayes Lane",
1197 + "phone": "+7 865 864 8172",
1198 + "username": "rkrzyzowski27",
1199 + "age": 31,
1200 + "birth_day": "1937-08-18"
1201 + },
1202 + {
1203 + "id": 81,
1204 + "full_name": "Theresa Duddell",
1205 + "email": "tduddell28@nps.gov",
1206 + "gender": "Female",
1207 + "job_title": "Human Resources Manager",
1208 + "company": "Kaymbo",
1209 + "country": "Ukraine",
1210 + "city": "Bratslav",
1211 + "street_address": "35393 Superior Court",
1212 + "phone": "+380 900 852 7696",
1213 + "username": "tduddell28",
1214 + "age": 78,
1215 + "birth_day": "1984-08-18"
1216 + },
1217 + {
1218 + "id": 82,
1219 + "full_name": "Dasie Easbie",
1220 + "email": "deasbie29@soup.io",
1221 + "gender": "Female",
1222 + "job_title": "Quality Engineer",
1223 + "company": "Vidoo",
1224 + "country": "Colombia",
1225 + "city": "Milán",
1226 + "street_address": "89 Transport Point",
1227 + "phone": "+57 809 857 5095",
1228 + "username": "deasbie29",
1229 + "age": 45,
1230 + "birth_day": "1989-11-02"
1231 + },
1232 + {
1233 + "id": 83,
1234 + "full_name": "Dougy McWhan",
1235 + "email": "dmcwhan2a@cbc.ca",
1236 + "gender": "Male",
1237 + "job_title": "VP Accounting",
1238 + "company": "Realcube",
1239 + "country": "Ukraine",
1240 + "city": "Topory",
1241 + "street_address": "52 School Avenue",
1242 + "phone": "+380 417 371 0626",
1243 + "username": "dmcwhan2a",
1244 + "age": 39,
1245 + "birth_day": "1997-04-25"
1246 + },
1247 + {
1248 + "id": 84,
1249 + "full_name": "Davida Gowling",
1250 + "email": "dgowling2b@posterous.com",
1251 + "gender": "Female",
1252 + "job_title": "Human Resources Manager",
1253 + "company": "Vinder",
1254 + "country": "Vietnam",
1255 + "city": "Buôn Ma Thuột",
1256 + "street_address": "71089 Calypso Terrace",
1257 + "phone": "+84 117 551 4264",
1258 + "username": "dgowling2b",
1259 + "age": 48,
1260 + "birth_day": "1945-03-05"
1261 + },
1262 + {
1263 + "id": 85,
1264 + "full_name": "Caprice Rattery",
1265 + "email": "crattery2c@plala.or.jp",
1266 + "gender": "Female",
1267 + "job_title": "Senior Sales Associate",
1268 + "company": "Livetube",
1269 + "country": "Peru",
1270 + "city": "Tamarindo",
1271 + "street_address": "57 Warbler Court",
1272 + "phone": "+51 362 819 8334",
1273 + "username": "crattery2c",
1274 + "age": 49,
1275 + "birth_day": "1992-09-20"
1276 + },
1277 + {
1278 + "id": 86,
1279 + "full_name": "Hendrika Conyard",
1280 + "email": "hconyard2d@scientificamerican.com",
1281 + "gender": "Female",
1282 + "job_title": "Analog Circuit Design manager",
1283 + "company": "Meemm",
1284 + "country": "Philippines",
1285 + "city": "Barcelona",
1286 + "street_address": "7272 Hoffman Hill",
1287 + "phone": "+63 957 787 7307",
1288 + "username": "hconyard2d",
1289 + "age": 70,
1290 + "birth_day": "1992-12-22"
1291 + },
1292 + {
1293 + "id": 87,
1294 + "full_name": "Abelard Gerrish",
1295 + "email": "agerrish2e@sciencedirect.com",
1296 + "gender": "Male",
1297 + "job_title": "Human Resources Manager",
1298 + "company": "Riffpedia",
1299 + "country": "Poland",
1300 + "city": "Chorkówka",
1301 + "street_address": "3187 Debra Drive",
1302 + "phone": "+48 818 355 6041",
1303 + "username": "agerrish2e",
1304 + "age": 22,
1305 + "birth_day": "1960-04-15"
1306 + },
1307 + {
1308 + "id": 88,
1309 + "full_name": "Maud Cove",
1310 + "email": "mcove2f@issuu.com",
1311 + "gender": "Female",
1312 + "job_title": "Data Coordiator",
1313 + "company": "Yakijo",
1314 + "country": "Indonesia",
1315 + "city": "Tangkil",
1316 + "street_address": "4 Hoffman Way",
1317 + "phone": "+62 960 523 0567",
1318 + "username": "mcove2f",
1319 + "age": 52,
1320 + "birth_day": "1975-03-11"
1321 + },
1322 + {
1323 + "id": 89,
1324 + "full_name": "Brewer Addicott",
1325 + "email": "baddicott2g@tumblr.com",
1326 + "gender": "Male",
1327 + "job_title": "VP Product Management",
1328 + "company": "Rhynoodle",
1329 + "country": "Russia",
1330 + "city": "Velikovechnoye",
1331 + "street_address": "0 Bonner Way",
1332 + "phone": "+7 255 429 5871",
1333 + "username": "baddicott2g",
1334 + "age": 59,
1335 + "birth_day": "1989-04-13"
1336 + },
1337 + {
1338 + "id": 90,
1339 + "full_name": "Richy Oels",
1340 + "email": "roels2h@jigsy.com",
1341 + "gender": "Male",
1342 + "job_title": "Human Resources Assistant III",
1343 + "company": "Photobug",
1344 + "country": "Canada",
1345 + "city": "West End",
1346 + "street_address": "343 Fremont Plaza",
1347 + "phone": "+1 593 132 0737",
1348 + "username": "roels2h",
1349 + "age": 50,
1350 + "birth_day": "1973-06-30"
1351 + },
1352 + {
1353 + "id": 91,
1354 + "full_name": "Egbert Pope",
1355 + "email": "epope2i@rakuten.co.jp",
1356 + "gender": "Male",
1357 + "job_title": "Safety Technician III",
1358 + "company": "Fanoodle",
1359 + "country": "Thailand",
1360 + "city": "Wat Sing",
1361 + "street_address": "15 Parkside Point",
1362 + "phone": "+66 954 911 5456",
1363 + "username": "epope2i",
1364 + "age": 33,
1365 + "birth_day": "1953-11-09"
1366 + },
1367 + {
1368 + "id": 92,
1369 + "full_name": "Eduardo Dugald",
1370 + "email": "edugald2j@stumbleupon.com",
1371 + "gender": "Male",
1372 + "job_title": "Nuclear Power Engineer",
1373 + "company": "Pixonyx",
1374 + "country": "Syria",
1375 + "city": "Khanāşir",
1376 + "street_address": "67162 Logan Junction",
1377 + "phone": "+963 283 416 4458",
1378 + "username": "edugald2j",
1379 + "age": 71,
1380 + "birth_day": "1949-08-15"
1381 + },
1382 + {
1383 + "id": 93,
1384 + "full_name": "Wells Catto",
1385 + "email": "wcatto2k@comsenz.com",
1386 + "gender": "Male",
1387 + "job_title": "Information Systems Manager",
1388 + "company": "Topicshots",
1389 + "country": "Uzbekistan",
1390 + "city": "Mŭynoq",
1391 + "street_address": "82298 Dorton Center",
1392 + "phone": "+998 583 290 8507",
1393 + "username": "wcatto2k",
1394 + "age": 57,
1395 + "birth_day": "1957-10-19"
1396 + },
1397 + {
1398 + "id": 94,
1399 + "full_name": "Anabal Cardillo",
1400 + "email": "acardillo2l@ucla.edu",
1401 + "gender": "Female",
1402 + "job_title": "Research Nurse",
1403 + "company": "Vitz",
1404 + "country": "Indonesia",
1405 + "city": "Robatal",
1406 + "street_address": "05 Bay Terrace",
1407 + "phone": "+62 627 252 9503",
1408 + "username": "acardillo2l",
1409 + "age": 44,
1410 + "birth_day": "1946-07-14"
1411 + },
1412 + {
1413 + "id": 95,
1414 + "full_name": "Thorpe Kesley",
1415 + "email": "tkesley2m@com.com",
1416 + "gender": "Male",
1417 + "job_title": "Environmental Specialist",
1418 + "company": "Jabbertype",
1419 + "country": "Norway",
1420 + "city": "Oslo",
1421 + "street_address": "01906 Almo Place",
1422 + "phone": "+47 389 288 5606",
1423 + "username": "tkesley2m",
1424 + "age": 69,
1425 + "birth_day": "1977-07-01"
1426 + },
1427 + {
1428 + "id": 96,
1429 + "full_name": "Pincus Spavins",
1430 + "email": "pspavins2n@elpais.com",
1431 + "gender": "Male",
1432 + "job_title": "Senior Cost Accountant",
1433 + "company": "Youtags",
1434 + "country": "Russia",
1435 + "city": "Vyshniy Volochëk",
1436 + "street_address": "0 Straubel Terrace",
1437 + "phone": "+7 670 782 9186",
1438 + "username": "pspavins2n",
1439 + "age": 33,
1440 + "birth_day": "1939-05-28"
1441 + },
1442 + {
1443 + "id": 97,
1444 + "full_name": "Ebenezer Patroni",
1445 + "email": "epatroni2o@angelfire.com",
1446 + "gender": "Male",
1447 + "job_title": "Graphic Designer",
1448 + "company": "Jabbertype",
1449 + "country": "China",
1450 + "city": "Tuanjie",
1451 + "street_address": "5 Jana Lane",
1452 + "phone": "+86 723 405 3968",
1453 + "username": "epatroni2o",
1454 + "age": 58,
1455 + "birth_day": "1957-05-07"
1456 + },
1457 + {
1458 + "id": 98,
1459 + "full_name": "Lindsy Gieves",
1460 + "email": "lgieves2p@google.com",
1461 + "gender": "Female",
1462 + "job_title": "Programmer Analyst I",
1463 + "company": "Zazio",
1464 + "country": "Czech Republic",
1465 + "city": "Zborovice",
1466 + "street_address": "28 Gulseth Pass",
1467 + "phone": "+420 627 676 8893",
1468 + "username": "lgieves2p",
1469 + "age": 62,
1470 + "birth_day": "1960-05-28"
1471 + },
1472 + {
1473 + "id": 99,
1474 + "full_name": "Lincoln Alwood",
1475 + "email": "lalwood2q@columbia.edu",
1476 + "gender": "Male",
1477 + "job_title": "Environmental Specialist",
1478 + "company": "Kazio",
1479 + "country": "China",
1480 + "city": "Jixiang",
1481 + "street_address": "93184 Nelson Place",
1482 + "phone": "+86 972 521 6318",
1483 + "username": "lalwood2q",
1484 + "age": 27,
1485 + "birth_day": "1969-12-16"
1486 + },
1487 + {
1488 + "id": 100,
1489 + "full_name": "Lek Heynel",
1490 + "email": "lheynel2r@wunderground.com",
1491 + "gender": "Male",
1492 + "job_title": "Developer III",
1493 + "company": "Devbug",
1494 + "country": "China",
1495 + "city": "Yag La",
1496 + "street_address": "0175 Golf Course Circle",
1497 + "phone": "+86 979 964 9126",
1498 + "username": "lheynel2r",
1499 + "age": 41,
1500 + "birth_day": "1981-01-03"
1501 + },
1502 + {
1503 + "id": 101,
1504 + "full_name": "Doy Chalke",
1505 + "email": "dchalke2s@chicagotribune.com",
1506 + "gender": "Male",
1507 + "job_title": "Nurse Practicioner",
1508 + "company": "Jaxnation",
1509 + "country": "Portugal",
1510 + "city": "Belverde",
1511 + "street_address": "0 Hoffman Parkway",
1512 + "phone": "+351 872 591 2220",
1513 + "username": "dchalke2s",
1514 + "age": 33,
1515 + "birth_day": "1982-12-16"
1516 + },
1517 + {
1518 + "id": 102,
1519 + "full_name": "Jean Priscott",
1520 + "email": "jpriscott2t@facebook.com",
1521 + "gender": "Female",
1522 + "job_title": "Research Assistant II",
1523 + "company": "Fatz",
1524 + "country": "United States",
1525 + "city": "Montgomery",
1526 + "street_address": "6 Monica Point",
1527 + "phone": "+1 334 960 3065",
1528 + "username": "jpriscott2t",
1529 + "age": 39,
1530 + "birth_day": "1964-07-06"
1531 + },
1532 + {
1533 + "id": 103,
1534 + "full_name": "Marty Fagge",
1535 + "email": "mfagge2u@blogger.com",
1536 + "gender": "Male",
1537 + "job_title": "VP Product Management",
1538 + "company": "Edgepulse",
1539 + "country": "Czech Republic",
1540 + "city": "Bořetice",
1541 + "street_address": "8546 Havey Plaza",
1542 + "phone": "+420 231 415 4204",
1543 + "username": "mfagge2u",
1544 + "age": 30,
1545 + "birth_day": "1984-05-01"
1546 + },
1547 + {
1548 + "id": 104,
1549 + "full_name": "Sybilla Cescot",
1550 + "email": "scescot2v@example.com",
1551 + "gender": "Female",
1552 + "job_title": "Tax Accountant",
1553 + "company": "Yakijo",
1554 + "country": "Russia",
1555 + "city": "Shushary",
1556 + "street_address": "87126 Parkside Crossing",
1557 + "phone": "+7 992 756 3564",
1558 + "username": "scescot2v",
1559 + "age": 78,
1560 + "birth_day": "1977-11-28"
1561 + },
1562 + {
1563 + "id": 105,
1564 + "full_name": "Stanleigh Petrushkevich",
1565 + "email": "spetrushkevich2w@apache.org",
1566 + "gender": "Male",
1567 + "job_title": "Structural Analysis Engineer",
1568 + "company": "BlogXS",
1569 + "country": "Malaysia",
1570 + "city": "Rawang",
1571 + "street_address": "452 Express Court",
1572 + "phone": "+60 469 489 6774",
1573 + "username": "spetrushkevich2w",
1574 + "age": 20,
1575 + "birth_day": "1981-11-24"
1576 + },
1577 + {
1578 + "id": 106,
1579 + "full_name": "Hiram Reboul",
1580 + "email": "hreboul2x@hibu.com",
1581 + "gender": "Male",
1582 + "job_title": "Web Developer IV",
1583 + "company": "Npath",
1584 + "country": "China",
1585 + "city": "Huangshan",
1586 + "street_address": "6 David Pass",
1587 + "phone": "+86 671 663 8669",
1588 + "username": "hreboul2x",
1589 + "age": 34,
1590 + "birth_day": "1969-01-06"
1591 + },
1592 + {
1593 + "id": 107,
1594 + "full_name": "Kacey Eales",
1595 + "email": "keales2y@globo.com",
1596 + "gender": "Female",
1597 + "job_title": "Marketing Assistant",
1598 + "company": "Demizz",
1599 + "country": "Philippines",
1600 + "city": "Nagbacalan",
1601 + "street_address": "869 Meadow Valley Plaza",
1602 + "phone": "+63 902 698 6262",
1603 + "username": "keales2y",
1604 + "age": 74,
1605 + "birth_day": "1951-07-28"
1606 + },
1607 + {
1608 + "id": 108,
1609 + "full_name": "Erminia Wombwell",
1610 + "email": "ewombwell2z@ning.com",
1611 + "gender": "Female",
1612 + "job_title": "Recruiter",
1613 + "company": "Voonyx",
1614 + "country": "France",
1615 + "city": "Paris 14",
1616 + "street_address": "45605 Fremont Avenue",
1617 + "phone": "+33 649 568 0631",
1618 + "username": "ewombwell2z",
1619 + "age": 52,
1620 + "birth_day": "1996-08-24"
1621 + },
1622 + {
1623 + "id": 109,
1624 + "full_name": "Vinson Tomaskov",
1625 + "email": "vtomaskov30@ibm.com",
1626 + "gender": "Male",
1627 + "job_title": "Data Coordiator",
1628 + "company": "Photolist",
1629 + "country": "Puerto Rico",
1630 + "city": "San Juan",
1631 + "street_address": "8 Parkside Circle",
1632 + "phone": "+1 134 388 1445",
1633 + "username": "vtomaskov30",
1634 + "age": 76,
1635 + "birth_day": "1956-04-24"
1636 + },
1637 + {
1638 + "id": 110,
1639 + "full_name": "Rachelle Vannuccini",
1640 + "email": "rvannuccini31@ftc.gov",
1641 + "gender": "Female",
1642 + "job_title": "Quality Control Specialist",
1643 + "company": "Quaxo",
1644 + "country": "Azerbaijan",
1645 + "city": "Arıqıran",
1646 + "street_address": "2904 Mcbride Circle",
1647 + "phone": "+994 232 743 2979",
1648 + "username": "rvannuccini31",
1649 + "age": 28,
1650 + "birth_day": "1957-04-25"
1651 + },
1652 + {
1653 + "id": 111,
1654 + "full_name": "Missie Fishburn",
1655 + "email": "mfishburn32@dailymotion.com",
1656 + "gender": "Female",
1657 + "job_title": "Systems Administrator II",
1658 + "company": "Devify",
1659 + "country": "Sweden",
1660 + "city": "Sollefteå",
1661 + "street_address": "28204 Stang Point",
1662 + "phone": "+46 360 234 6823",
1663 + "username": "mfishburn32",
1664 + "age": 45,
1665 + "birth_day": "1948-06-15"
1666 + },
1667 + {
1668 + "id": 112,
1669 + "full_name": "Alden Zumbusch",
1670 + "email": "azumbusch33@ovh.net",
1671 + "gender": "Male",
1672 + "job_title": "Administrative Assistant I",
1673 + "company": "Twimm",
1674 + "country": "Poland",
1675 + "city": "Żarki",
1676 + "street_address": "910 Huxley Avenue",
1677 + "phone": "+48 413 106 3798",
1678 + "username": "azumbusch33",
1679 + "age": 25,
1680 + "birth_day": "1956-12-29"
1681 + },
1682 + {
1683 + "id": 113,
1684 + "full_name": "Minni Dominguez",
1685 + "email": "mdominguez34@fastcompany.com",
1686 + "gender": "Female",
1687 + "job_title": "Software Test Engineer I",
1688 + "company": "Skyba",
1689 + "country": "Ukraine",
1690 + "city": "Velyki Sorochyntsi",
1691 + "street_address": "62071 School Center",
1692 + "phone": "+380 843 165 4352",
1693 + "username": "mdominguez34",
1694 + "age": 73,
1695 + "birth_day": "1972-02-12"
1696 + },
1697 + {
1698 + "id": 114,
1699 + "full_name": "Cindi Mityakov",
1700 + "email": "cmityakov35@aol.com",
1701 + "gender": "Female",
1702 + "job_title": "Quality Engineer",
1703 + "company": "Viva",
1704 + "country": "Portugal",
1705 + "city": "Mourelos",
1706 + "street_address": "67 Sunbrook Alley",
1707 + "phone": "+351 970 974 9837",
1708 + "username": "cmityakov35",
1709 + "age": 73,
1710 + "birth_day": "1941-02-19"
1711 + },
1712 + {
1713 + "id": 115,
1714 + "full_name": "Sapphira Gerring",
1715 + "email": "sgerring36@rakuten.co.jp",
1716 + "gender": "Female",
1717 + "job_title": "Cost Accountant",
1718 + "company": "Vinte",
1719 + "country": "Philippines",
1720 + "city": "Dobdoban",
1721 + "street_address": "4478 Delaware Junction",
1722 + "phone": "+63 873 588 5466",
1723 + "username": "sgerring36",
1724 + "age": 71,
1725 + "birth_day": "1931-05-31"
1726 + },
1727 + {
1728 + "id": 116,
1729 + "full_name": "Sheilakathryn Feaster",
1730 + "email": "sfeaster37@umn.edu",
1731 + "gender": "Female",
1732 + "job_title": "Analyst Programmer",
1733 + "company": "Twiyo",
1734 + "country": "Yemen",
1735 + "city": "Markaz Mudhaykirah",
1736 + "street_address": "6949 Magdeline Place",
1737 + "phone": "+967 351 177 8821",
1738 + "username": "sfeaster37",
1739 + "age": 77,
1740 + "birth_day": "1958-08-21"
1741 + },
1742 + {
1743 + "id": 117,
1744 + "full_name": "Olly Eskell",
1745 + "email": "oeskell38@ca.gov",
1746 + "gender": "Female",
1747 + "job_title": "Quality Engineer",
1748 + "company": "Oyope",
1749 + "country": "Mexico",
1750 + "city": "Chapultepec",
1751 + "street_address": "575 Judy Hill",
1752 + "phone": "+52 655 381 8876",
1753 + "username": "oeskell38",
1754 + "age": 45,
1755 + "birth_day": "1983-08-25"
1756 + },
1757 + {
1758 + "id": 118,
1759 + "full_name": "Linette Pesic",
1760 + "email": "lpesic39@usgs.gov",
1761 + "gender": "Female",
1762 + "job_title": "Research Associate",
1763 + "company": "Trudeo",
1764 + "country": "Sweden",
1765 + "city": "Göteborg",
1766 + "street_address": "11738 Union Court",
1767 + "phone": "+46 669 252 8344",
1768 + "username": "lpesic39",
1769 + "age": 46,
1770 + "birth_day": "1971-05-22"
1771 + },
1772 + {
1773 + "id": 119,
1774 + "full_name": "Pren Parton",
1775 + "email": "pparton3a@addthis.com",
1776 + "gender": "Male",
1777 + "job_title": "Senior Quality Engineer",
1778 + "company": "Jabberstorm",
1779 + "country": "China",
1780 + "city": "Shishan",
1781 + "street_address": "74 Sloan Avenue",
1782 + "phone": "+86 730 651 5984",
1783 + "username": "pparton3a",
1784 + "age": 57,
1785 + "birth_day": "1978-07-09"
1786 + },
1787 + {
1788 + "id": 120,
1789 + "full_name": "Mariam Kimber",
1790 + "email": "mkimber3b@storify.com",
1791 + "gender": "Female",
1792 + "job_title": "Assistant Professor",
1793 + "company": "Jabbertype",
1794 + "country": "Portugal",
1795 + "city": "Samouco",
1796 + "street_address": "432 Mayer Center",
1797 + "phone": "+351 793 950 4582",
1798 + "username": "mkimber3b",
1799 + "age": 70,
1800 + "birth_day": "1944-03-15"
1801 + },
1802 + {
1803 + "id": 121,
1804 + "full_name": "Babara Calkin",
1805 + "email": "bcalkin3c@cbslocal.com",
1806 + "gender": "Female",
1807 + "job_title": "Design Engineer",
1808 + "company": "Centimia",
1809 + "country": "China",
1810 + "city": "Chunmuying",
1811 + "street_address": "2861 Macpherson Circle",
1812 + "phone": "+86 244 491 6166",
1813 + "username": "bcalkin3c",
1814 + "age": 47,
1815 + "birth_day": "1960-12-29"
1816 + },
1817 + {
1818 + "id": 122,
1819 + "full_name": "Analiese Albrook",
1820 + "email": "aalbrook3d@merriam-webster.com",
1821 + "gender": "Female",
1822 + "job_title": "Project Manager",
1823 + "company": "Meembee",
1824 + "country": "China",
1825 + "city": "Hai’an",
1826 + "street_address": "5 Lighthouse Bay Center",
1827 + "phone": "+86 425 488 6276",
1828 + "username": "aalbrook3d",
1829 + "age": 39,
1830 + "birth_day": "1937-10-22"
1831 + },
1832 + {
1833 + "id": 123,
1834 + "full_name": "Meta Crigin",
1835 + "email": "mcrigin3e@go.com",
1836 + "gender": "Female",
1837 + "job_title": "Nurse Practicioner",
1838 + "company": "Zoomlounge",
1839 + "country": "Indonesia",
1840 + "city": "Montor Timur",
1841 + "street_address": "667 Center Point",
1842 + "phone": "+62 289 996 8193",
1843 + "username": "mcrigin3e",
1844 + "age": 53,
1845 + "birth_day": "1995-10-06"
1846 + },
1847 + {
1848 + "id": 124,
1849 + "full_name": "Keen Cantle",
1850 + "email": "kcantle3f@bbb.org",
1851 + "gender": "Male",
1852 + "job_title": "Media Manager IV",
1853 + "company": "Youopia",
1854 + "country": "China",
1855 + "city": "Maoqitun",
1856 + "street_address": "2902 Roth Hill",
1857 + "phone": "+86 106 122 0788",
1858 + "username": "kcantle3f",
1859 + "age": 34,
1860 + "birth_day": "1947-06-18"
1861 + },
1862 + {
1863 + "id": 125,
1864 + "full_name": "Anissa Rannald",
1865 + "email": "arannald3g@sogou.com",
1866 + "gender": "Female",
1867 + "job_title": "Electrical Engineer",
1868 + "company": "Wikizz",
1869 + "country": "Argentina",
1870 + "city": "Berón de Astrada",
1871 + "street_address": "95 Veith Center",
1872 + "phone": "+54 262 737 3474",
1873 + "username": "arannald3g",
1874 + "age": 19,
1875 + "birth_day": "1961-01-09"
1876 + },
1877 + {
1878 + "id": 126,
1879 + "full_name": "Gui Evelyn",
1880 + "email": "gevelyn3h@google.pl",
1881 + "gender": "Female",
1882 + "job_title": "Research Nurse",
1883 + "company": "Leexo",
1884 + "country": "Philippines",
1885 + "city": "Malibong East",
1886 + "street_address": "18 Melby Crossing",
1887 + "phone": "+63 220 122 8332",
1888 + "username": "gevelyn3h",
1889 + "age": 68,
1890 + "birth_day": "1985-06-15"
1891 + },
1892 + {
1893 + "id": 127,
1894 + "full_name": "Jeana Vassar",
1895 + "email": "jvassar3i@usda.gov",
1896 + "gender": "Female",
1897 + "job_title": "Nurse",
1898 + "company": "Oyope",
1899 + "country": "Ethiopia",
1900 + "city": "Āsasa",
1901 + "street_address": "7 Homewood Parkway",
1902 + "phone": "+251 251 631 4687",
1903 + "username": "jvassar3i",
1904 + "age": 48,
1905 + "birth_day": "1936-02-12"
1906 + },
1907 + {
1908 + "id": 128,
1909 + "full_name": "Leanora Jeacocke",
1910 + "email": "ljeacocke3j@bluehost.com",
1911 + "gender": "Female",
1912 + "job_title": "Nurse",
1913 + "company": "Meevee",
1914 + "country": "Peru",
1915 + "city": "Mamara",
1916 + "street_address": "1311 Bartelt Junction",
1917 + "phone": "+51 618 960 5174",
1918 + "username": "ljeacocke3j",
1919 + "age": 65,
1920 + "birth_day": "1987-01-07"
1921 + },
1922 + {
1923 + "id": 129,
1924 + "full_name": "Rog Camamill",
1925 + "email": "rcamamill3k@businessweek.com",
1926 + "gender": "Male",
1927 + "job_title": "Nurse",
1928 + "company": "Voonder",
1929 + "country": "Indonesia",
1930 + "city": "Wolomoni",
1931 + "street_address": "778 Summer Ridge Crossing",
1932 + "phone": "+62 527 248 3862",
1933 + "username": "rcamamill3k",
1934 + "age": 72,
1935 + "birth_day": "1932-05-21"
1936 + },
1937 + {
1938 + "id": 130,
1939 + "full_name": "Cordie Eckart",
1940 + "email": "ceckart3l@vkontakte.ru",
1941 + "gender": "Female",
1942 + "job_title": "Help Desk Operator",
1943 + "company": "Katz",
1944 + "country": "Nigeria",
1945 + "city": "Obollo-Afor",
1946 + "street_address": "516 Fisk Hill",
1947 + "phone": "+234 947 927 6640",
1948 + "username": "ceckart3l",
1949 + "age": 46,
1950 + "birth_day": "1943-04-26"
1951 + },
1952 + {
1953 + "id": 131,
1954 + "full_name": "Ameline Paulazzi",
1955 + "email": "apaulazzi3m@wsj.com",
1956 + "gender": "Female",
1957 + "job_title": "Information Systems Manager",
1958 + "company": "Zazio",
1959 + "country": "Portugal",
1960 + "city": "Rio de Mouro",
1961 + "street_address": "20 Autumn Leaf Alley",
1962 + "phone": "+351 317 868 9617",
1963 + "username": "apaulazzi3m",
1964 + "age": 75,
1965 + "birth_day": "1952-07-06"
1966 + },
1967 + {
1968 + "id": 132,
1969 + "full_name": "Philippine Noyce",
1970 + "email": "pnoyce3n@theguardian.com",
1971 + "gender": "Female",
1972 + "job_title": "Compensation Analyst",
1973 + "company": "Realfire",
1974 + "country": "France",
1975 + "city": "Nantes",
1976 + "street_address": "643 Heffernan Terrace",
1977 + "phone": "+33 673 723 9194",
1978 + "username": "pnoyce3n",
1979 + "age": 43,
1980 + "birth_day": "1979-05-01"
1981 + },
1982 + {
1983 + "id": 133,
1984 + "full_name": "Gareth Poel",
1985 + "email": "gpoel3o@upenn.edu",
1986 + "gender": "Male",
1987 + "job_title": "Recruiting Manager",
1988 + "company": "Twitterworks",
1989 + "country": "Venezuela",
1990 + "city": "Guacara",
1991 + "street_address": "1771 Novick Crossing",
1992 + "phone": "+58 609 322 8997",
1993 + "username": "gpoel3o",
1994 + "age": 79,
1995 + "birth_day": "1938-10-14"
1996 + },
1997 + {
1998 + "id": 134,
1999 + "full_name": "Jennilee Barca",
2000 + "email": "jbarca3p@cpanel.net",
2001 + "gender": "Female",
2002 + "job_title": "Engineer III",
2003 + "company": "Jabbersphere",
2004 + "country": "Indonesia",
2005 + "city": "Nanggela",
2006 + "street_address": "13 Fremont Hill",
2007 + "phone": "+62 969 351 4546",
2008 + "username": "jbarca3p",
2009 + "age": 44,
2010 + "birth_day": "1976-05-15"
2011 + },
2012 + {
2013 + "id": 135,
2014 + "full_name": "Vin Jessup",
2015 + "email": "vjessup3q@businessinsider.com",
2016 + "gender": "Male",
2017 + "job_title": "Database Administrator III",
2018 + "company": "Eimbee",
2019 + "country": "Indonesia",
2020 + "city": "Pasanggrahan",
2021 + "street_address": "04389 Gina Road",
2022 + "phone": "+62 410 924 0391",
2023 + "username": "vjessup3q",
2024 + "age": 51,
2025 + "birth_day": "1984-06-13"
2026 + },
2027 + {
2028 + "id": 136,
2029 + "full_name": "Michail Edgson",
2030 + "email": "medgson3r@jugem.jp",
2031 + "gender": "Male",
2032 + "job_title": "Desktop Support Technician",
2033 + "company": "Youbridge",
2034 + "country": "Sweden",
2035 + "city": "Mora",
2036 + "street_address": "40358 Cambridge Hill",
2037 + "phone": "+46 544 446 6643",
2038 + "username": "medgson3r",
2039 + "age": 75,
2040 + "birth_day": "1966-12-19"
2041 + },
2042 + {
2043 + "id": 137,
2044 + "full_name": "Hamil Ricold",
2045 + "email": "hricold3s@google.es",
2046 + "gender": "Male",
2047 + "job_title": "VP Product Management",
2048 + "company": "Divanoodle",
2049 + "country": "China",
2050 + "city": "Zhangxiang",
2051 + "street_address": "6 Saint Paul Pass",
2052 + "phone": "+86 542 254 3795",
2053 + "username": "hricold3s",
2054 + "age": 29,
2055 + "birth_day": "1935-12-04"
2056 + },
2057 + {
2058 + "id": 138,
2059 + "full_name": "Barbie Patis",
2060 + "email": "bpatis3t@instagram.com",
2061 + "gender": "Female",
2062 + "job_title": "GIS Technical Architect",
2063 + "company": "Livepath",
2064 + "country": "Ivory Coast",
2065 + "city": "Songon",
2066 + "street_address": "67 Loeprich Street",
2067 + "phone": "+225 940 785 9503",
2068 + "username": "bpatis3t",
2069 + "age": 25,
2070 + "birth_day": "1937-07-29"
2071 + },
2072 + {
2073 + "id": 139,
2074 + "full_name": "Fawnia Dawtry",
2075 + "email": "fdawtry3u@hugedomains.com",
2076 + "gender": "Female",
2077 + "job_title": "Senior Editor",
2078 + "company": "Avamba",
2079 + "country": "Russia",
2080 + "city": "Khosta",
2081 + "street_address": "558 Waxwing Drive",
2082 + "phone": "+7 509 711 8569",
2083 + "username": "fdawtry3u",
2084 + "age": 38,
2085 + "birth_day": "1932-06-01"
2086 + },
2087 + {
2088 + "id": 140,
2089 + "full_name": "Adriane Robardey",
2090 + "email": "arobardey3v@usa.gov",
2091 + "gender": "Female",
2092 + "job_title": "Data Coordiator",
2093 + "company": "Feedspan",
2094 + "country": "China",
2095 + "city": "Nanqiao",
2096 + "street_address": "0 La Follette Court",
2097 + "phone": "+86 281 491 2716",
2098 + "username": "arobardey3v",
2099 + "age": 74,
2100 + "birth_day": "1986-01-08"
2101 + },
2102 + {
2103 + "id": 141,
2104 + "full_name": "Conrado Segoe",
2105 + "email": "csegoe3w@tuttocitta.it",
2106 + "gender": "Male",
2107 + "job_title": "VP Quality Control",
2108 + "company": "Feedbug",
2109 + "country": "Sweden",
2110 + "city": "Stockholm",
2111 + "street_address": "6 Reinke Terrace",
2112 + "phone": "+46 609 992 8721",
2113 + "username": "csegoe3w",
2114 + "age": 71,
2115 + "birth_day": "1955-01-09"
2116 + },
2117 + {
2118 + "id": 142,
2119 + "full_name": "Cybill Kruszelnicki",
2120 + "email": "ckruszelnicki3x@freewebs.com",
2121 + "gender": "Female",
2122 + "job_title": "Developer III",
2123 + "company": "Photobug",
2124 + "country": "Brazil",
2125 + "city": "São Mateus",
2126 + "street_address": "608 Union Crossing",
2127 + "phone": "+55 772 919 9202",
2128 + "username": "ckruszelnicki3x",
2129 + "age": 39,
2130 + "birth_day": "1943-10-05"
2131 + },
2132 + {
2133 + "id": 143,
2134 + "full_name": "Carmine Taylder",
2135 + "email": "ctaylder3y@gizmodo.com",
2136 + "gender": "Male",
2137 + "job_title": "Computer Systems Analyst IV",
2138 + "company": "Photospace",
2139 + "country": "Indonesia",
2140 + "city": "Kutacane",
2141 + "street_address": "2 Cordelia Lane",
2142 + "phone": "+62 297 847 9277",
2143 + "username": "ctaylder3y",
2144 + "age": 38,
2145 + "birth_day": "1991-12-18"
2146 + },
2147 + {
2148 + "id": 144,
2149 + "full_name": "Che Hearnshaw",
2150 + "email": "chearnshaw3z@yelp.com",
2151 + "gender": "Male",
2152 + "job_title": "Media Manager I",
2153 + "company": "Jaxspan",
2154 + "country": "Indonesia",
2155 + "city": "Bireun",
2156 + "street_address": "24197 Stephen Avenue",
2157 + "phone": "+62 331 844 6816",
2158 + "username": "chearnshaw3z",
2159 + "age": 59,
2160 + "birth_day": "1954-05-19"
2161 + },
2162 + {
2163 + "id": 145,
2164 + "full_name": "Desi Yakovlev",
2165 + "email": "dyakovlev40@chicagotribune.com",
2166 + "gender": "Male",
2167 + "job_title": "VP Accounting",
2168 + "company": "Meedoo",
2169 + "country": "Czech Republic",
2170 + "city": "Nový Knín",
2171 + "street_address": "838 Hanson Alley",
2172 + "phone": "+420 237 830 7377",
2173 + "username": "dyakovlev40",
2174 + "age": 53,
2175 + "birth_day": "1973-02-26"
2176 + },
2177 + {
2178 + "id": 146,
2179 + "full_name": "Darin Pyper",
2180 + "email": "dpyper41@hao123.com",
2181 + "gender": "Male",
2182 + "job_title": "Nurse Practicioner",
2183 + "company": "Kanoodle",
2184 + "country": "China",
2185 + "city": "Paipu",
2186 + "street_address": "102 Di Loreto Court",
2187 + "phone": "+86 706 618 5810",
2188 + "username": "dpyper41",
2189 + "age": 64,
2190 + "birth_day": "1980-04-23"
2191 + },
2192 + {
2193 + "id": 147,
2194 + "full_name": "Verina Scopham",
2195 + "email": "vscopham42@youtube.com",
2196 + "gender": "Female",
2197 + "job_title": "Developer I",
2198 + "company": "Izio",
2199 + "country": "Japan",
2200 + "city": "Kawanoechō",
2201 + "street_address": "4797 Stone Corner Junction",
2202 + "phone": "+81 659 964 5997",
2203 + "username": "vscopham42",
2204 + "age": 38,
2205 + "birth_day": "1989-01-09"
2206 + },
2207 + {
2208 + "id": 148,
2209 + "full_name": "Korey Feldklein",
2210 + "email": "kfeldklein43@surveymonkey.com",
2211 + "gender": "Male",
2212 + "job_title": "Computer Systems Analyst III",
2213 + "company": "Dynava",
2214 + "country": "Russia",
2215 + "city": "Arsen’yev",
2216 + "street_address": "0 Vermont Center",
2217 + "phone": "+7 251 235 9194",
2218 + "username": "kfeldklein43",
2219 + "age": 76,
2220 + "birth_day": "1954-05-15"
2221 + },
2222 + {
2223 + "id": 149,
2224 + "full_name": "Malynda Tunuy",
2225 + "email": "mtunuy44@shinystat.com",
2226 + "gender": "Female",
2227 + "job_title": "Marketing Assistant",
2228 + "company": "Topicshots",
2229 + "country": "Uganda",
2230 + "city": "Bugembe",
2231 + "street_address": "70 Waubesa Hill",
2232 + "phone": "+256 203 334 9434",
2233 + "username": "mtunuy44",
2234 + "age": 56,
2235 + "birth_day": "1976-01-22"
2236 + },
2237 + {
2238 + "id": 150,
2239 + "full_name": "Adiana Baude",
2240 + "email": "abaude45@sohu.com",
2241 + "gender": "Female",
2242 + "job_title": "Assistant Media Planner",
2243 + "company": "Mymm",
2244 + "country": "China",
2245 + "city": "Fangtai",
2246 + "street_address": "30 Armistice Terrace",
2247 + "phone": "+86 151 853 6155",
2248 + "username": "abaude45",
2249 + "age": 41,
2250 + "birth_day": "1948-11-25"
2251 + },
2252 + {
2253 + "id": 151,
2254 + "full_name": "Jada Orteau",
2255 + "email": "jorteau46@rediff.com",
2256 + "gender": "Female",
2257 + "job_title": "GIS Technical Architect",
2258 + "company": "Pixoboo",
2259 + "country": "Indonesia",
2260 + "city": "Lohong",
2261 + "street_address": "3225 Judy Street",
2262 + "phone": "+62 543 414 8388",
2263 + "username": "jorteau46",
2264 + "age": 48,
2265 + "birth_day": "1994-04-08"
2266 + },
2267 + {
2268 + "id": 152,
2269 + "full_name": "Sergio Stoving",
2270 + "email": "sstoving47@multiply.com",
2271 + "gender": "Male",
2272 + "job_title": "Automation Specialist IV",
2273 + "company": "Browsecat",
2274 + "country": "El Salvador",
2275 + "city": "Ciudad Arce",
2276 + "street_address": "8 Erie Trail",
2277 + "phone": "+503 424 605 2169",
2278 + "username": "sstoving47",
2279 + "age": 24,
2280 + "birth_day": "1960-11-26"
2281 + },
2282 + {
2283 + "id": 153,
2284 + "full_name": "Dasha O'Loughane",
2285 + "email": "doloughane48@marketwatch.com",
2286 + "gender": "Female",
2287 + "job_title": "Programmer II",
2288 + "company": "Rhybox",
2289 + "country": "China",
2290 + "city": "Pingtang",
2291 + "street_address": "08 Fallview Hill",
2292 + "phone": "+86 955 333 3733",
2293 + "username": "doloughane48",
2294 + "age": 19,
2295 + "birth_day": "1955-01-27"
2296 + },
2297 + {
2298 + "id": 154,
2299 + "full_name": "Edsel Roset",
2300 + "email": "eroset49@discovery.com",
2301 + "gender": "Male",
2302 + "job_title": "Account Coordinator",
2303 + "company": "Yozio",
2304 + "country": "Peru",
2305 + "city": "Jayanca",
2306 + "street_address": "3997 Graedel Crossing",
2307 + "phone": "+51 714 199 7123",
2308 + "username": "eroset49",
2309 + "age": 35,
2310 + "birth_day": "1948-02-29"
2311 + },
2312 + {
2313 + "id": 155,
2314 + "full_name": "Thurstan Haizelden",
2315 + "email": "thaizelden4a@craigslist.org",
2316 + "gender": "Male",
2317 + "job_title": "Marketing Assistant",
2318 + "company": "Skyba",
2319 + "country": "China",
2320 + "city": "Hufang",
2321 + "street_address": "938 Barby Point",
2322 + "phone": "+86 438 643 9534",
2323 + "username": "thaizelden4a",
2324 + "age": 34,
2325 + "birth_day": "1955-09-05"
2326 + },
2327 + {
2328 + "id": 156,
2329 + "full_name": "Kendall Conelly",
2330 + "email": "kconelly4b@nhs.uk",
2331 + "gender": "Male",
2332 + "job_title": "Analog Circuit Design manager",
2333 + "company": "Wordware",
2334 + "country": "North Korea",
2335 + "city": "T’ongch’ŏn-ŭp",
2336 + "street_address": "55 Shopko Drive",
2337 + "phone": "+850 901 201 9903",
2338 + "username": "kconelly4b",
2339 + "age": 28,
2340 + "birth_day": "1989-11-07"
2341 + },
2342 + {
2343 + "id": 157,
2344 + "full_name": "Ines Pawlett",
2345 + "email": "ipawlett4c@huffingtonpost.com",
2346 + "gender": "Female",
2347 + "job_title": "Executive Secretary",
2348 + "company": "Riffpedia",
2349 + "country": "Vietnam",
2350 + "city": "Thị Trấn Văn Quan",
2351 + "street_address": "56 Crest Line Crossing",
2352 + "phone": "+84 860 544 5300",
2353 + "username": "ipawlett4c",
2354 + "age": 40,
2355 + "birth_day": "1991-05-12"
2356 + },
2357 + {
2358 + "id": 158,
2359 + "full_name": "Loydie Dalby",
2360 + "email": "ldalby4d@posterous.com",
2361 + "gender": "Male",
2362 + "job_title": "Programmer Analyst II",
2363 + "company": "Aivee",
2364 + "country": "Peru",
2365 + "city": "San Jerónimo",
2366 + "street_address": "4 Ruskin Alley",
2367 + "phone": "+51 625 913 8134",
2368 + "username": "ldalby4d",
2369 + "age": 64,
2370 + "birth_day": "1972-09-02"
2371 + },
2372 + {
2373 + "id": 159,
2374 + "full_name": "Alastair Kubiczek",
2375 + "email": "akubiczek4e@ycombinator.com",
2376 + "gender": "Male",
2377 + "job_title": "Computer Systems Analyst II",
2378 + "company": "Wordpedia",
2379 + "country": "Philippines",
2380 + "city": "Sangali",
2381 + "street_address": "878 Birchwood Center",
2382 + "phone": "+63 786 836 5484",
2383 + "username": "akubiczek4e",
2384 + "age": 49,
2385 + "birth_day": "1980-03-25"
2386 + },
2387 + {
2388 + "id": 160,
2389 + "full_name": "Anna-diane McIlvenny",
2390 + "email": "amcilvenny4f@joomla.org",
2391 + "gender": "Female",
2392 + "job_title": "Cost Accountant",
2393 + "company": "Tekfly",
2394 + "country": "China",
2395 + "city": "Yunmenling",
2396 + "street_address": "56 Springview Crossing",
2397 + "phone": "+86 317 457 9014",
2398 + "username": "amcilvenny4f",
2399 + "age": 44,
2400 + "birth_day": "1955-07-15"
2401 + },
2402 + {
2403 + "id": 161,
2404 + "full_name": "Joshuah Mathys",
2405 + "email": "jmathys4g@merriam-webster.com",
2406 + "gender": "Male",
2407 + "job_title": "Research Associate",
2408 + "company": "Ailane",
2409 + "country": "Philippines",
2410 + "city": "Lunen",
2411 + "street_address": "5333 Monterey Circle",
2412 + "phone": "+63 452 467 6416",
2413 + "username": "jmathys4g",
2414 + "age": 62,
2415 + "birth_day": "1958-08-14"
2416 + },
2417 + {
2418 + "id": 162,
2419 + "full_name": "Ellissa Louiset",
2420 + "email": "elouiset4h@godaddy.com",
2421 + "gender": "Female",
2422 + "job_title": "Biostatistician IV",
2423 + "company": "Trudoo",
2424 + "country": "Tunisia",
2425 + "city": "Qulaybīyah",
2426 + "street_address": "29 Glendale Lane",
2427 + "phone": "+216 707 141 7527",
2428 + "username": "elouiset4h",
2429 + "age": 51,
2430 + "birth_day": "1957-06-19"
2431 + },
2432 + {
2433 + "id": 163,
2434 + "full_name": "Micheline Bockler",
2435 + "email": "mbockler4i@upenn.edu",
2436 + "gender": "Female",
2437 + "job_title": "Help Desk Technician",
2438 + "company": "Kazu",
2439 + "country": "China",
2440 + "city": "Meizhou",
2441 + "street_address": "3 Di Loreto Alley",
2442 + "phone": "+86 757 579 3524",
2443 + "username": "mbockler4i",
2444 + "age": 74,
2445 + "birth_day": "1965-01-02"
2446 + },
2447 + {
2448 + "id": 164,
2449 + "full_name": "Von Espin",
2450 + "email": "vespin4j@deviantart.com",
2451 + "gender": "Male",
2452 + "job_title": "Recruiter",
2453 + "company": "Zoomzone",
2454 + "country": "Philippines",
2455 + "city": "Marsada",
2456 + "street_address": "3626 Bellgrove Avenue",
2457 + "phone": "+63 314 296 4848",
2458 + "username": "vespin4j",
2459 + "age": 43,
2460 + "birth_day": "1940-02-10"
2461 + },
2462 + {
2463 + "id": 165,
2464 + "full_name": "Carmelina Kelso",
2465 + "email": "ckelso4k@tumblr.com",
2466 + "gender": "Female",
2467 + "job_title": "Statistician IV",
2468 + "company": "Meemm",
2469 + "country": "China",
2470 + "city": "Puqian",
2471 + "street_address": "44574 Steensland Street",
2472 + "phone": "+86 152 875 0330",
2473 + "username": "ckelso4k",
2474 + "age": 67,
2475 + "birth_day": "1956-03-18"
2476 + },
2477 + {
2478 + "id": 166,
2479 + "full_name": "Bartholemy Hadgkiss",
2480 + "email": "bhadgkiss4l@illinois.edu",
2481 + "gender": "Male",
2482 + "job_title": "Data Coordiator",
2483 + "company": "Meedoo",
2484 + "country": "Indonesia",
2485 + "city": "Karangturi",
2486 + "street_address": "842 Bellgrove Alley",
2487 + "phone": "+62 838 146 3211",
2488 + "username": "bhadgkiss4l",
2489 + "age": 56,
2490 + "birth_day": "1955-04-10"
2491 + },
2492 + {
2493 + "id": 167,
2494 + "full_name": "Brana Scottini",
2495 + "email": "bscottini4m@4shared.com",
2496 + "gender": "Female",
2497 + "job_title": "Librarian",
2498 + "company": "Realblab",
2499 + "country": "Czech Republic",
2500 + "city": "Chvalšiny",
2501 + "street_address": "854 Loftsgordon Street",
2502 + "phone": "+420 988 273 7304",
2503 + "username": "bscottini4m",
2504 + "age": 31,
2505 + "birth_day": "1981-08-09"
2506 + },
2507 + {
2508 + "id": 168,
2509 + "full_name": "Arri Pennings",
2510 + "email": "apennings4n@github.com",
2511 + "gender": "Male",
2512 + "job_title": "Payment Adjustment Coordinator",
2513 + "company": "Skilith",
2514 + "country": "China",
2515 + "city": "Pingli",
2516 + "street_address": "24 Namekagon Alley",
2517 + "phone": "+86 625 516 4129",
2518 + "username": "apennings4n",
2519 + "age": 33,
2520 + "birth_day": "1969-01-16"
2521 + },
2522 + {
2523 + "id": 169,
2524 + "full_name": "Elsy Foker",
2525 + "email": "efoker4o@aboutads.info",
2526 + "gender": "Female",
2527 + "job_title": "Design Engineer",
2528 + "company": "Photolist",
2529 + "country": "Guatemala",
2530 + "city": "Salamá",
2531 + "street_address": "5 Trailsway Street",
2532 + "phone": "+502 844 535 3946",
2533 + "username": "efoker4o",
2534 + "age": 69,
2535 + "birth_day": "1935-10-25"
2536 + },
2537 + {
2538 + "id": 170,
2539 + "full_name": "Lodovico Mellody",
2540 + "email": "lmellody4p@edublogs.org",
2541 + "gender": "Male",
2542 + "job_title": "Analog Circuit Design manager",
2543 + "company": "Skidoo",
2544 + "country": "France",
2545 + "city": "Nice",
2546 + "street_address": "918 Huxley Trail",
2547 + "phone": "+33 541 127 7979",
2548 + "username": "lmellody4p",
2549 + "age": 68,
2550 + "birth_day": "1993-11-19"
2551 + },
2552 + {
2553 + "id": 171,
2554 + "full_name": "Thayne Marr",
2555 + "email": "tmarr4q@si.edu",
2556 + "gender": "Male",
2557 + "job_title": "Speech Pathologist",
2558 + "company": "Buzzster",
2559 + "country": "Indonesia",
2560 + "city": "Cimrutu",
2561 + "street_address": "6698 Rusk Way",
2562 + "phone": "+62 851 757 6590",
2563 + "username": "tmarr4q",
2564 + "age": 43,
2565 + "birth_day": "1932-05-09"
2566 + },
2567 + {
2568 + "id": 172,
2569 + "full_name": "Carlie Raysdale",
2570 + "email": "craysdale4r@scientificamerican.com",
2571 + "gender": "Female",
2572 + "job_title": "Research Assistant IV",
2573 + "company": "Feedfish",
2574 + "country": "United States",
2575 + "city": "Syracuse",
2576 + "street_address": "51 Sachs Parkway",
2577 + "phone": "+1 315 920 7873",
2578 + "username": "craysdale4r",
2579 + "age": 77,
2580 + "birth_day": "1941-11-14"
2581 + },
2582 + {
2583 + "id": 173,
2584 + "full_name": "Hermina Stretton",
2585 + "email": "hstretton4s@sohu.com",
2586 + "gender": "Female",
2587 + "job_title": "Cost Accountant",
2588 + "company": "Topicware",
2589 + "country": "Finland",
2590 + "city": "Artjärvi",
2591 + "street_address": "33070 Merry Road",
2592 + "phone": "+358 959 391 0060",
2593 + "username": "hstretton4s",
2594 + "age": 31,
2595 + "birth_day": "1946-09-09"
2596 + },
2597 + {
2598 + "id": 174,
2599 + "full_name": "Finley Montrose",
2600 + "email": "fmontrose4t@dmoz.org",
2601 + "gender": "Male",
2602 + "job_title": "Occupational Therapist",
2603 + "company": "Jayo",
2604 + "country": "Colombia",
2605 + "city": "Riosucio",
2606 + "street_address": "9013 Saint Paul Avenue",
2607 + "phone": "+57 885 267 7432",
2608 + "username": "fmontrose4t",
2609 + "age": 70,
2610 + "birth_day": "1936-09-03"
2611 + },
2612 + {
2613 + "id": 175,
2614 + "full_name": "Sib Pringer",
2615 + "email": "springer4u@cnn.com",
2616 + "gender": "Female",
2617 + "job_title": "Geological Engineer",
2618 + "company": "Tagtune",
2619 + "country": "United States",
2620 + "city": "Tallahassee",
2621 + "street_address": "2175 6th Crossing",
2622 + "phone": "+1 850 676 1361",
2623 + "username": "springer4u",
2624 + "age": 48,
2625 + "birth_day": "1967-10-12"
2626 + },
2627 + {
2628 + "id": 176,
2629 + "full_name": "Bobbye O'Corrigane",
2630 + "email": "bocorrigane4v@fda.gov",
2631 + "gender": "Female",
2632 + "job_title": "Quality Engineer",
2633 + "company": "Trudeo",
2634 + "country": "Indonesia",
2635 + "city": "Awilega",
2636 + "street_address": "84697 Coolidge Court",
2637 + "phone": "+62 489 871 6534",
2638 + "username": "bocorrigane4v",
2639 + "age": 34,
2640 + "birth_day": "1990-09-28"
2641 + },
2642 + {
2643 + "id": 177,
2644 + "full_name": "Ernest Ziem",
2645 + "email": "eziem4w@pcworld.com",
2646 + "gender": "Male",
2647 + "job_title": "Programmer III",
2648 + "company": "Agivu",
2649 + "country": "China",
2650 + "city": "Daoxian",
2651 + "street_address": "88 Darwin Drive",
2652 + "phone": "+86 336 381 7314",
2653 + "username": "eziem4w",
2654 + "age": 41,
2655 + "birth_day": "1968-04-13"
2656 + },
2657 + {
2658 + "id": 178,
2659 + "full_name": "Brande Beven",
2660 + "email": "bbeven4x@ucoz.ru",
2661 + "gender": "Female",
2662 + "job_title": "Programmer Analyst IV",
2663 + "company": "Yakijo",
2664 + "country": "China",
2665 + "city": "Eman",
2666 + "street_address": "92256 Westport Pass",
2667 + "phone": "+86 557 515 9843",
2668 + "username": "bbeven4x",
2669 + "age": 39,
2670 + "birth_day": "1949-04-19"
2671 + },
2672 + {
2673 + "id": 179,
2674 + "full_name": "Benedick Dugmore",
2675 + "email": "bdugmore4y@pcworld.com",
2676 + "gender": "Male",
2677 + "job_title": "Technical Writer",
2678 + "company": "Plajo",
2679 + "country": "China",
2680 + "city": "Dongping",
2681 + "street_address": "5673 Warner Court",
2682 + "phone": "+86 389 281 8371",
2683 + "username": "bdugmore4y",
2684 + "age": 76,
2685 + "birth_day": "1993-06-27"
2686 + },
2687 + {
2688 + "id": 180,
2689 + "full_name": "Fidole Tomsa",
2690 + "email": "ftomsa4z@imgur.com",
2691 + "gender": "Male",
2692 + "job_title": "Office Assistant III",
2693 + "company": "Kwimbee",
2694 + "country": "Ukraine",
2695 + "city": "Horodyshche",
2696 + "street_address": "74953 Blackbird Avenue",
2697 + "phone": "+380 187 568 9242",
2698 + "username": "ftomsa4z",
2699 + "age": 60,
2700 + "birth_day": "1954-08-04"
2701 + },
2702 + {
2703 + "id": 181,
2704 + "full_name": "Sephira Petrichat",
2705 + "email": "spetrichat50@macromedia.com",
2706 + "gender": "Female",
2707 + "job_title": "Senior Developer",
2708 + "company": "Fivebridge",
2709 + "country": "Namibia",
2710 + "city": "Ongandjera",
2711 + "street_address": "88564 Bluestem Point",
2712 + "phone": "+264 778 390 3890",
2713 + "username": "spetrichat50",
2714 + "age": 72,
2715 + "birth_day": "1968-12-10"
2716 + },
2717 + {
2718 + "id": 182,
2719 + "full_name": "Gabbi Norley",
2720 + "email": "gnorley51@wordpress.org",
2721 + "gender": "Female",
2722 + "job_title": "Payment Adjustment Coordinator",
2723 + "company": "Realbridge",
2724 + "country": "Venezuela",
2725 + "city": "Papelón",
2726 + "street_address": "9 Tennyson Lane",
2727 + "phone": "+58 321 546 1086",
2728 + "username": "gnorley51",
2729 + "age": 44,
2730 + "birth_day": "1969-06-06"
2731 + },
2732 + {
2733 + "id": 183,
2734 + "full_name": "Meade Older",
2735 + "email": "molder52@amazon.co.uk",
2736 + "gender": "Male",
2737 + "job_title": "Senior Sales Associate",
2738 + "company": "Livetube",
2739 + "country": "Mongolia",
2740 + "city": "Jargalant",
2741 + "street_address": "1011 Arapahoe Hill",
2742 + "phone": "+976 157 948 8057",
2743 + "username": "molder52",
2744 + "age": 18,
2745 + "birth_day": "1958-06-17"
2746 + },
2747 + {
2748 + "id": 184,
2749 + "full_name": "Staford Endrighi",
2750 + "email": "sendrighi53@google.com",
2751 + "gender": "Male",
2752 + "job_title": "Biostatistician II",
2753 + "company": "Yoveo",
2754 + "country": "China",
2755 + "city": "Zhongshangang",
2756 + "street_address": "9131 Lotheville Avenue",
2757 + "phone": "+86 669 463 7648",
2758 + "username": "sendrighi53",
2759 + "age": 41,
2760 + "birth_day": "1951-08-05"
2761 + },
2762 + {
2763 + "id": 185,
2764 + "full_name": "Pia Gould",
2765 + "email": "pgould54@hubpages.com",
2766 + "gender": "Female",
2767 + "job_title": "Occupational Therapist",
2768 + "company": "Abatz",
2769 + "country": "Nigeria",
2770 + "city": "Ringim",
2771 + "street_address": "61 Burning Wood Avenue",
2772 + "phone": "+234 203 552 5313",
2773 + "username": "pgould54",
2774 + "age": 66,
2775 + "birth_day": "1985-07-23"
2776 + },
2777 + {
2778 + "id": 186,
2779 + "full_name": "Broderic Frowing",
2780 + "email": "bfrowing55@accuweather.com",
2781 + "gender": "Male",
2782 + "job_title": "Statistician II",
2783 + "company": "Flashset",
2784 + "country": "Moldova",
2785 + "city": "Biruinţa",
2786 + "street_address": "77 Summerview Parkway",
2787 + "phone": "+373 808 643 4065",
2788 + "username": "bfrowing55",
2789 + "age": 65,
2790 + "birth_day": "1948-08-30"
2791 + },
2792 + {
2793 + "id": 187,
2794 + "full_name": "Elaine Battson",
2795 + "email": "ebattson56@nytimes.com",
2796 + "gender": "Female",
2797 + "job_title": "Human Resources Assistant III",
2798 + "company": "Livefish",
2799 + "country": "Ukraine",
2800 + "city": "Kivertsi",
2801 + "street_address": "854 Old Gate Junction",
2802 + "phone": "+380 895 375 1845",
2803 + "username": "ebattson56",
2804 + "age": 70,
2805 + "birth_day": "1972-09-17"
2806 + },
2807 + {
2808 + "id": 188,
2809 + "full_name": "Linoel Gallafant",
2810 + "email": "lgallafant57@wunderground.com",
2811 + "gender": "Male",
2812 + "job_title": "Analog Circuit Design manager",
2813 + "company": "Rhynoodle",
2814 + "country": "Poland",
2815 + "city": "Brańsk",
2816 + "street_address": "2663 Anzinger Place",
2817 + "phone": "+48 469 207 6782",
2818 + "username": "lgallafant57",
2819 + "age": 34,
2820 + "birth_day": "1951-11-20"
2821 + },
2822 + {
2823 + "id": 189,
2824 + "full_name": "Kelsey Itzig",
2825 + "email": "kitzig58@dot.gov",
2826 + "gender": "Female",
2827 + "job_title": "Web Developer III",
2828 + "company": "Yodo",
2829 + "country": "Kenya",
2830 + "city": "Mumias",
2831 + "street_address": "34 Clemons Court",
2832 + "phone": "+254 788 403 1500",
2833 + "username": "kitzig58",
2834 + "age": 78,
2835 + "birth_day": "1980-10-06"
2836 + },
2837 + {
2838 + "id": 190,
2839 + "full_name": "Bennett Geleman",
2840 + "email": "bgeleman59@deviantart.com",
2841 + "gender": "Male",
2842 + "job_title": "Help Desk Technician",
2843 + "company": "Feednation",
2844 + "country": "Brazil",
2845 + "city": "Nova Russas",
2846 + "street_address": "587 Roth Junction",
2847 + "phone": "+55 557 645 3946",
2848 + "username": "bgeleman59",
2849 + "age": 20,
2850 + "birth_day": "1975-05-10"
2851 + },
2852 + {
2853 + "id": 191,
2854 + "full_name": "Jenine Sprowles",
2855 + "email": "jsprowles5a@i2i.jp",
2856 + "gender": "Female",
2857 + "job_title": "Paralegal",
2858 + "company": "Flashpoint",
2859 + "country": "Russia",
2860 + "city": "Nagornyy",
2861 + "street_address": "1778 Ilene Way",
2862 + "phone": "+7 544 593 4890",
2863 + "username": "jsprowles5a",
2864 + "age": 25,
2865 + "birth_day": "1959-06-17"
2866 + },
2867 + {
2868 + "id": 192,
2869 + "full_name": "Amalle Drewett",
2870 + "email": "adrewett5b@topsy.com",
2871 + "gender": "Female",
2872 + "job_title": "Paralegal",
2873 + "company": "Meemm",
2874 + "country": "Lebanon",
2875 + "city": "Beirut",
2876 + "street_address": "6256 Comanche Lane",
2877 + "phone": "+961 881 811 7115",
2878 + "username": "adrewett5b",
2879 + "age": 72,
2880 + "birth_day": "1930-07-05"
2881 + },
2882 + {
2883 + "id": 193,
2884 + "full_name": "Charis Embling",
2885 + "email": "cembling5c@github.com",
2886 + "gender": "Female",
2887 + "job_title": "Nurse",
2888 + "company": "Avaveo",
2889 + "country": "China",
2890 + "city": "Partang",
2891 + "street_address": "00519 Wayridge Junction",
2892 + "phone": "+86 153 189 8672",
2893 + "username": "cembling5c",
2894 + "age": 49,
2895 + "birth_day": "1948-07-21"
2896 + },
2897 + {
2898 + "id": 194,
2899 + "full_name": "Claiborne Blazy",
2900 + "email": "cblazy5d@umich.edu",
2901 + "gender": "Male",
2902 + "job_title": "Office Assistant I",
2903 + "company": "Eabox",
2904 + "country": "Colombia",
2905 + "city": "La Paz",
2906 + "street_address": "982 Rusk Park",
2907 + "phone": "+57 457 566 5151",
2908 + "username": "cblazy5d",
2909 + "age": 19,
2910 + "birth_day": "1961-02-11"
2911 + },
2912 + {
2913 + "id": 195,
2914 + "full_name": "Naomi Lamyman",
2915 + "email": "nlamyman5e@census.gov",
2916 + "gender": "Female",
2917 + "job_title": "Staff Accountant III",
2918 + "company": "Tazzy",
2919 + "country": "Colombia",
2920 + "city": "Santa Marta",
2921 + "street_address": "2 Truax Parkway",
2922 + "phone": "+57 980 854 6802",
2923 + "username": "nlamyman5e",
2924 + "age": 44,
2925 + "birth_day": "1953-03-17"
2926 + },
2927 + {
2928 + "id": 196,
2929 + "full_name": "Deeyn Smissen",
2930 + "email": "dsmissen5f@businessinsider.com",
2931 + "gender": "Female",
2932 + "job_title": "Human Resources Manager",
2933 + "company": "Myworks",
2934 + "country": "Poland",
2935 + "city": "Dębowiec",
2936 + "street_address": "4415 Mifflin Parkway",
2937 + "phone": "+48 252 794 5047",
2938 + "username": "dsmissen5f",
2939 + "age": 57,
2940 + "birth_day": "1966-09-29"
2941 + },
2942 + {
2943 + "id": 197,
2944 + "full_name": "Mignon Bater",
2945 + "email": "mbater5g@51.la",
2946 + "gender": "Female",
2947 + "job_title": "Pharmacist",
2948 + "company": "Kazu",
2949 + "country": "Japan",
2950 + "city": "Mino",
2951 + "street_address": "52359 Fisk Parkway",
2952 + "phone": "+81 645 195 7066",
2953 + "username": "mbater5g",
2954 + "age": 38,
2955 + "birth_day": "1942-05-04"
2956 + },
2957 + {
2958 + "id": 198,
2959 + "full_name": "Pall Hyman",
2960 + "email": "phyman5h@github.io",
2961 + "gender": "Male",
2962 + "job_title": "Design Engineer",
2963 + "company": "Tagpad",
2964 + "country": "Ukraine",
2965 + "city": "Lebedyn",
2966 + "street_address": "8 Autumn Leaf Court",
2967 + "phone": "+380 690 368 5684",
2968 + "username": "phyman5h",
2969 + "age": 59,
2970 + "birth_day": "1987-07-02"
2971 + },
2972 + {
2973 + "id": 199,
2974 + "full_name": "Gillian Kenforth",
2975 + "email": "gkenforth5i@nydailynews.com",
2976 + "gender": "Female",
2977 + "job_title": "Administrative Assistant II",
2978 + "company": "Snaptags",
2979 + "country": "Paraguay",
2980 + "city": "Yuty",
2981 + "street_address": "6 Waxwing Park",
2982 + "phone": "+595 990 688 0555",
2983 + "username": "gkenforth5i",
2984 + "age": 64,
2985 + "birth_day": "1997-02-12"
2986 + },
2987 + {
2988 + "id": 200,
2989 + "full_name": "Patton Yegorovnin",
2990 + "email": "pyegorovnin5j@odnoklassniki.ru",
2991 + "gender": "Male",
2992 + "job_title": "Payment Adjustment Coordinator",
2993 + "company": "Gabtune",
2994 + "country": "United States",
2995 + "city": "Topeka",
2996 + "street_address": "1 Westerfield Center",
2997 + "phone": "+1 785 527 5776",
2998 + "username": "pyegorovnin5j",
2999 + "age": 58,
3000 + "birth_day": "1993-01-02"
3001 + },
3002 + {
3003 + "id": 201,
3004 + "full_name": "Lucille Marchetti",
3005 + "email": "lmarchetti5k@howstuffworks.com",
3006 + "gender": "Female",
3007 + "job_title": "Computer Systems Analyst I",
3008 + "company": "Chatterbridge",
3009 + "country": "Nigeria",
3010 + "city": "Umunede",
3011 + "street_address": "22 Johnson Street",
3012 + "phone": "+234 201 837 7064",
3013 + "username": "lmarchetti5k",
3014 + "age": 19,
3015 + "birth_day": "1958-06-15"
3016 + },
3017 + {
3018 + "id": 202,
3019 + "full_name": "Devonne Capstaff",
3020 + "email": "dcapstaff5l@paypal.com",
3021 + "gender": "Female",
3022 + "job_title": "VP Marketing",
3023 + "company": "Eabox",
3024 + "country": "Colombia",
3025 + "city": "San Carlos",
3026 + "street_address": "50 2nd Parkway",
3027 + "phone": "+57 905 750 1430",
3028 + "username": "dcapstaff5l",
3029 + "age": 19,
3030 + "birth_day": "1980-11-11"
3031 + },
3032 + {
3033 + "id": 203,
3034 + "full_name": "Ruy Canto",
3035 + "email": "rcanto5m@is.gd",
3036 + "gender": "Male",
3037 + "job_title": "Speech Pathologist",
3038 + "company": "Jabbercube",
3039 + "country": "United States",
3040 + "city": "Washington",
3041 + "street_address": "856 Sage Crossing",
3042 + "phone": "+1 202 793 0191",
3043 + "username": "rcanto5m",
3044 + "age": 45,
3045 + "birth_day": "1981-10-20"
3046 + },
3047 + {
3048 + "id": 204,
3049 + "full_name": "Carlin D'Antoni",
3050 + "email": "cdantoni5n@netscape.com",
3051 + "gender": "Male",
3052 + "job_title": "Structural Analysis Engineer",
3053 + "company": "Realbridge",
3054 + "country": "Argentina",
3055 + "city": "Unquillo",
3056 + "street_address": "7362 Bultman Plaza",
3057 + "phone": "+54 665 704 1851",
3058 + "username": "cdantoni5n",
3059 + "age": 63,
3060 + "birth_day": "1973-09-11"
3061 + },
3062 + {
3063 + "id": 205,
3064 + "full_name": "Maggi Coysh",
3065 + "email": "mcoysh5o@meetup.com",
3066 + "gender": "Female",
3067 + "job_title": "Automation Specialist II",
3068 + "company": "Fiveclub",
3069 + "country": "Ghana",
3070 + "city": "Hohoe",
3071 + "street_address": "12 Tennyson Crossing",
3072 + "phone": "+233 732 969 1071",
3073 + "username": "mcoysh5o",
3074 + "age": 59,
3075 + "birth_day": "1971-10-03"
3076 + },
3077 + {
3078 + "id": 206,
3079 + "full_name": "Nyssa Mulroy",
3080 + "email": "nmulroy5p@dropbox.com",
3081 + "gender": "Female",
3082 + "job_title": "Financial Analyst",
3083 + "company": "Skidoo",
3084 + "country": "Nigeria",
3085 + "city": "Awka",
3086 + "street_address": "5 Weeping Birch Way",
3087 + "phone": "+234 330 473 0001",
3088 + "username": "nmulroy5p",
3089 + "age": 73,
3090 + "birth_day": "1970-01-03"
3091 + },
3092 + {
3093 + "id": 207,
3094 + "full_name": "Raymond Doel",
3095 + "email": "rdoel5q@shop-pro.jp",
3096 + "gender": "Male",
3097 + "job_title": "Sales Representative",
3098 + "company": "Realcube",
3099 + "country": "Bosnia and Herzegovina",
3100 + "city": "Orahovica Donja",
3101 + "street_address": "92783 Anhalt Way",
3102 + "phone": "+387 453 318 7186",
3103 + "username": "rdoel5q",
3104 + "age": 53,
3105 + "birth_day": "1965-09-21"
3106 + },
3107 + {
3108 + "id": 208,
3109 + "full_name": "Coralyn Hawker",
3110 + "email": "chawker5r@hibu.com",
3111 + "gender": "Female",
3112 + "job_title": "Software Test Engineer II",
3113 + "company": "Edgetag",
3114 + "country": "China",
3115 + "city": "Xincheng Chengguanzhen",
3116 + "street_address": "766 Clyde Gallagher Way",
3117 + "phone": "+86 369 742 7251",
3118 + "username": "chawker5r",
3119 + "age": 50,
3120 + "birth_day": "1969-09-14"
3121 + },
3122 + {
3123 + "id": 209,
3124 + "full_name": "Malachi Klimentyonok",
3125 + "email": "mklimentyonok5s@bloglovin.com",
3126 + "gender": "Male",
3127 + "job_title": "Actuary",
3128 + "company": "Wikizz",
3129 + "country": "Greece",
3130 + "city": "Foúrnoi",
3131 + "street_address": "3 Swallow Lane",
3132 + "phone": "+30 144 379 8498",
3133 + "username": "mklimentyonok5s",
3134 + "age": 20,
3135 + "birth_day": "1938-11-26"
3136 + },
3137 + {
3138 + "id": 210,
3139 + "full_name": "Shaina Stivens",
3140 + "email": "sstivens5t@shutterfly.com",
3141 + "gender": "Female",
3142 + "job_title": "Food Chemist",
3143 + "company": "Yacero",
3144 + "country": "China",
3145 + "city": "Chunyang",
3146 + "street_address": "998 Mesta Drive",
3147 + "phone": "+86 753 483 7405",
3148 + "username": "sstivens5t",
3149 + "age": 33,
3150 + "birth_day": "1990-03-09"
3151 + },
3152 + {
3153 + "id": 211,
3154 + "full_name": "Ruddy Colam",
3155 + "email": "rcolam5u@usda.gov",
3156 + "gender": "Male",
3157 + "job_title": "Senior Cost Accountant",
3158 + "company": "Photobean",
3159 + "country": "China",
3160 + "city": "Hongwei",
3161 + "street_address": "354 Bartillon Hill",
3162 + "phone": "+86 606 559 6358",
3163 + "username": "rcolam5u",
3164 + "age": 36,
3165 + "birth_day": "1938-05-09"
3166 + },
3167 + {
3168 + "id": 212,
3169 + "full_name": "Adham Kildahl",
3170 + "email": "akildahl5v@hibu.com",
3171 + "gender": "Male",
3172 + "job_title": "Actuary",
3173 + "company": "Skyba",
3174 + "country": "Russia",
3175 + "city": "Zhireken",
3176 + "street_address": "1414 Shopko Crossing",
3177 + "phone": "+7 270 130 7232",
3178 + "username": "akildahl5v",
3179 + "age": 24,
3180 + "birth_day": "1991-03-18"
3181 + },
3182 + {
3183 + "id": 213,
3184 + "full_name": "Jeremias Caughan",
3185 + "email": "jcaughan5w@over-blog.com",
3186 + "gender": "Male",
3187 + "job_title": "VP Sales",
3188 + "company": "Jaxnation",
3189 + "country": "Colombia",
3190 + "city": "María la Baja",
3191 + "street_address": "88959 Milwaukee Road",
3192 + "phone": "+57 934 349 0681",
3193 + "username": "jcaughan5w",
3194 + "age": 59,
3195 + "birth_day": "1970-12-19"
3196 + },
3197 + {
3198 + "id": 214,
3199 + "full_name": "Otho Fleming",
3200 + "email": "ofleming5x@sogou.com",
3201 + "gender": "Male",
3202 + "job_title": "Nuclear Power Engineer",
3203 + "company": "Agivu",
3204 + "country": "Iran",
3205 + "city": "Nowshahr",
3206 + "street_address": "9 Menomonie Road",
3207 + "phone": "+98 269 562 4697",
3208 + "username": "ofleming5x",
3209 + "age": 74,
3210 + "birth_day": "1977-05-03"
3211 + },
3212 + {
3213 + "id": 215,
3214 + "full_name": "Mill MacIllrick",
3215 + "email": "mmacillrick5y@kickstarter.com",
3216 + "gender": "Male",
3217 + "job_title": "Senior Cost Accountant",
3218 + "company": "Gevee",
3219 + "country": "Iraq",
3220 + "city": "Nāḩiyat Baḩār",
3221 + "street_address": "091 Alpine Crossing",
3222 + "phone": "+964 557 465 2412",
3223 + "username": "mmacillrick5y",
3224 + "age": 46,
3225 + "birth_day": "1996-11-11"
3226 + },
3227 + {
3228 + "id": 216,
3229 + "full_name": "Roderich Critoph",
3230 + "email": "rcritoph5z@nih.gov",
3231 + "gender": "Male",
3232 + "job_title": "Mechanical Systems Engineer",
3233 + "company": "Skipstorm",
3234 + "country": "China",
3235 + "city": "Zhuping",
3236 + "street_address": "9623 Scoville Crossing",
3237 + "phone": "+86 729 954 2903",
3238 + "username": "rcritoph5z",
3239 + "age": 23,
3240 + "birth_day": "1987-04-10"
3241 + },
3242 + {
3243 + "id": 217,
3244 + "full_name": "Arline Arington",
3245 + "email": "aarington60@boston.com",
3246 + "gender": "Female",
3247 + "job_title": "Senior Developer",
3248 + "company": "Twimbo",
3249 + "country": "France",
3250 + "city": "Épinal",
3251 + "street_address": "710 Canary Crossing",
3252 + "phone": "+33 683 523 9103",
3253 + "username": "aarington60",
3254 + "age": 43,
3255 + "birth_day": "1972-06-10"
3256 + },
3257 + {
3258 + "id": 218,
3259 + "full_name": "Alf Herkess",
3260 + "email": "aherkess61@example.com",
3261 + "gender": "Male",
3262 + "job_title": "Web Developer IV",
3263 + "company": "Youopia",
3264 + "country": "North Korea",
3265 + "city": "Najin",
3266 + "street_address": "60 Daystar Center",
3267 + "phone": "+850 414 531 3788",
3268 + "username": "aherkess61",
3269 + "age": 22,
3270 + "birth_day": "1956-07-30"
3271 + },
3272 + {
3273 + "id": 219,
3274 + "full_name": "Adey Fairlem",
3275 + "email": "afairlem62@joomla.org",
3276 + "gender": "Female",
3277 + "job_title": "Assistant Professor",
3278 + "company": "Realpoint",
3279 + "country": "United States",
3280 + "city": "Knoxville",
3281 + "street_address": "4295 North Avenue",
3282 + "phone": "+1 865 228 0918",
3283 + "username": "afairlem62",
3284 + "age": 71,
3285 + "birth_day": "1968-09-12"
3286 + },
3287 + {
3288 + "id": 220,
3289 + "full_name": "Meagan Vlach",
3290 + "email": "mvlach63@nymag.com",
3291 + "gender": "Female",
3292 + "job_title": "Analog Circuit Design manager",
3293 + "company": "Skidoo",
3294 + "country": "China",
3295 + "city": "Luci",
3296 + "street_address": "7357 Everett Road",
3297 + "phone": "+86 417 423 5108",
3298 + "username": "mvlach63",
3299 + "age": 36,
3300 + "birth_day": "1978-06-13"
3301 + },
3302 + {
3303 + "id": 221,
3304 + "full_name": "Virgilio Bearham",
3305 + "email": "vbearham64@fastcompany.com",
3306 + "gender": "Male",
3307 + "job_title": "VP Sales",
3308 + "company": "Thoughtstorm",
3309 + "country": "United States",
3310 + "city": "Tucson",
3311 + "street_address": "22894 Mendota Court",
3312 + "phone": "+1 520 118 8900",
3313 + "username": "vbearham64",
3314 + "age": 20,
3315 + "birth_day": "1946-04-28"
3316 + },
3317 + {
3318 + "id": 222,
3319 + "full_name": "Daron Corness",
3320 + "email": "dcorness65@google.com.br",
3321 + "gender": "Female",
3322 + "job_title": "Marketing Assistant",
3323 + "company": "Shufflester",
3324 + "country": "Japan",
3325 + "city": "Yuza",
3326 + "street_address": "4205 Weeping Birch Way",
3327 + "phone": "+81 635 897 5835",
3328 + "username": "dcorness65",
3329 + "age": 67,
3330 + "birth_day": "1962-03-19"
3331 + },
3332 + {
3333 + "id": 223,
3334 + "full_name": "Cindelyn Osbaldstone",
3335 + "email": "cosbaldstone66@dyndns.org",
3336 + "gender": "Female",
3337 + "job_title": "Cost Accountant",
3338 + "company": "Kwideo",
3339 + "country": "Peru",
3340 + "city": "Quilmaná",
3341 + "street_address": "8 Roth Terrace",
3342 + "phone": "+51 990 180 5667",
3343 + "username": "cosbaldstone66",
3344 + "age": 41,
3345 + "birth_day": "1936-11-28"
3346 + },
3347 + {
3348 + "id": 224,
3349 + "full_name": "Magnum Kemster",
3350 + "email": "mkemster67@parallels.com",
3351 + "gender": "Male",
3352 + "job_title": "Environmental Tech",
3353 + "company": "Youspan",
3354 + "country": "China",
3355 + "city": "Qingxi",
3356 + "street_address": "5152 Melrose Street",
3357 + "phone": "+86 763 302 3431",
3358 + "username": "mkemster67",
3359 + "age": 65,
3360 + "birth_day": "1966-01-27"
3361 + },
3362 + {
3363 + "id": 225,
3364 + "full_name": "Ambrose Hoopper",
3365 + "email": "ahoopper68@dell.com",
3366 + "gender": "Male",
3367 + "job_title": "Assistant Professor",
3368 + "company": "Trilia",
3369 + "country": "Thailand",
3370 + "city": "Phatthaya",
3371 + "street_address": "459 Mayer Park",
3372 + "phone": "+66 852 602 5081",
3373 + "username": "ahoopper68",
3374 + "age": 37,
3375 + "birth_day": "1957-11-28"
3376 + },
3377 + {
3378 + "id": 226,
3379 + "full_name": "Alasdair Isacke",
3380 + "email": "aisacke69@zdnet.com",
3381 + "gender": "Male",
3382 + "job_title": "Registered Nurse",
3383 + "company": "Linkbridge",
3384 + "country": "China",
3385 + "city": "Dahu",
3386 + "street_address": "937 Clarendon Terrace",
3387 + "phone": "+86 447 687 2261",
3388 + "username": "aisacke69",
3389 + "age": 28,
3390 + "birth_day": "1956-03-25"
3391 + },
3392 + {
3393 + "id": 227,
3394 + "full_name": "Kenna Clynman",
3395 + "email": "kclynman6a@google.com.hk",
3396 + "gender": "Female",
3397 + "job_title": "Desktop Support Technician",
3398 + "company": "Centidel",
3399 + "country": "Greece",
3400 + "city": "Agrínio",
3401 + "street_address": "2390 Di Loreto Plaza",
3402 + "phone": "+30 334 867 0906",
3403 + "username": "kclynman6a",
3404 + "age": 48,
3405 + "birth_day": "1930-12-04"
3406 + },
3407 + {
3408 + "id": 228,
3409 + "full_name": "Betsy Blose",
3410 + "email": "bblose6b@msn.com",
3411 + "gender": "Female",
3412 + "job_title": "Senior Editor",
3413 + "company": "Tanoodle",
3414 + "country": "Vietnam",
3415 + "city": "Si Ma Cai",
3416 + "street_address": "644 Warner Court",
3417 + "phone": "+84 459 474 4593",
3418 + "username": "bblose6b",
3419 + "age": 69,
3420 + "birth_day": "1992-08-24"
3421 + },
3422 + {
3423 + "id": 229,
3424 + "full_name": "Noby Spadeck",
3425 + "email": "nspadeck6c@wordpress.com",
3426 + "gender": "Male",
3427 + "job_title": "Senior Editor",
3428 + "company": "Zoombox",
3429 + "country": "Bulgaria",
3430 + "city": "Asen",
3431 + "street_address": "69 Towne Avenue",
3432 + "phone": "+359 825 879 8801",
3433 + "username": "nspadeck6c",
3434 + "age": 42,
3435 + "birth_day": "1967-05-16"
3436 + },
3437 + {
3438 + "id": 230,
3439 + "full_name": "Casar Bleas",
3440 + "email": "cbleas6d@canalblog.com",
3441 + "gender": "Male",
3442 + "job_title": "Environmental Tech",
3443 + "company": "Avamm",
3444 + "country": "China",
3445 + "city": "Gongchang",
3446 + "street_address": "0 Forest Trail",
3447 + "phone": "+86 677 266 1103",
3448 + "username": "cbleas6d",
3449 + "age": 37,
3450 + "birth_day": "1972-05-16"
3451 + },
3452 + {
3453 + "id": 231,
3454 + "full_name": "Basil Nowlan",
3455 + "email": "bnowlan6e@istockphoto.com",
3456 + "gender": "Male",
3457 + "job_title": "Associate Professor",
3458 + "company": "Gabtune",
3459 + "country": "Indonesia",
3460 + "city": "Dukuhtengah",
3461 + "street_address": "21 Longview Pass",
3462 + "phone": "+62 762 774 5983",
3463 + "username": "bnowlan6e",
3464 + "age": 67,
3465 + "birth_day": "1955-03-21"
3466 + },
3467 + {
3468 + "id": 232,
3469 + "full_name": "Lind Rounding",
3470 + "email": "lrounding6f@lulu.com",
3471 + "gender": "Male",
3472 + "job_title": "Chief Design Engineer",
3473 + "company": "Riffpedia",
3474 + "country": "Afghanistan",
3475 + "city": "Gardēz",
3476 + "street_address": "96692 7th Pass",
3477 + "phone": "+93 473 129 2414",
3478 + "username": "lrounding6f",
3479 + "age": 20,
3480 + "birth_day": "1981-03-19"
3481 + },
3482 + {
3483 + "id": 233,
3484 + "full_name": "Ollie McCahey",
3485 + "email": "omccahey6g@ucoz.ru",
3486 + "gender": "Female",
3487 + "job_title": "Cost Accountant",
3488 + "company": "Vidoo",
3489 + "country": "Portugal",
3490 + "city": "Cruz",
3491 + "street_address": "9 John Wall Park",
3492 + "phone": "+351 835 596 6553",
3493 + "username": "omccahey6g",
3494 + "age": 33,
3495 + "birth_day": "1982-07-27"
3496 + },
3497 + {
3498 + "id": 234,
3499 + "full_name": "Aron Phillcock",
3500 + "email": "aphillcock6h@free.fr",
3501 + "gender": "Male",
3502 + "job_title": "Recruiter",
3503 + "company": "Lazz",
3504 + "country": "Poland",
3505 + "city": "Repki",
3506 + "street_address": "177 La Follette Circle",
3507 + "phone": "+48 220 454 8347",
3508 + "username": "aphillcock6h",
3509 + "age": 52,
3510 + "birth_day": "1965-11-15"
3511 + },
3512 + {
3513 + "id": 235,
3514 + "full_name": "Arne Casper",
3515 + "email": "acasper6i@nba.com",
3516 + "gender": "Male",
3517 + "job_title": "Environmental Tech",
3518 + "company": "Fiveclub",
3519 + "country": "China",
3520 + "city": "Daban",
3521 + "street_address": "928 Hallows Court",
3522 + "phone": "+86 608 745 0671",
3523 + "username": "acasper6i",
3524 + "age": 38,
3525 + "birth_day": "1948-04-16"
3526 + },
3527 + {
3528 + "id": 236,
3529 + "full_name": "Allissa O'Giany",
3530 + "email": "aogiany6j@cmu.edu",
3531 + "gender": "Female",
3532 + "job_title": "Paralegal",
3533 + "company": "Dabfeed",
3534 + "country": "Indonesia",
3535 + "city": "Klumbu",
3536 + "street_address": "63784 Birchwood Crossing",
3537 + "phone": "+62 668 637 6902",
3538 + "username": "aogiany6j",
3539 + "age": 41,
3540 + "birth_day": "1959-01-10"
3541 + },
3542 + {
3543 + "id": 237,
3544 + "full_name": "Law Oakwood",
3545 + "email": "loakwood6k@ifeng.com",
3546 + "gender": "Male",
3547 + "job_title": "Web Developer III",
3548 + "company": "Eamia",
3549 + "country": "Portugal",
3550 + "city": "Bombarral",
3551 + "street_address": "87 Mockingbird Hill",
3552 + "phone": "+351 649 129 4097",
3553 + "username": "loakwood6k",
3554 + "age": 41,
3555 + "birth_day": "1938-01-06"
3556 + },
3557 + {
3558 + "id": 238,
3559 + "full_name": "Charmaine Oselton",
3560 + "email": "coselton6l@spiegel.de",
3561 + "gender": "Female",
3562 + "job_title": "Sales Representative",
3563 + "company": "Wordpedia",
3564 + "country": "Saint Kitts and Nevis",
3565 + "city": "Newcastle",
3566 + "street_address": "5 Harbort Parkway",
3567 + "phone": "+1 561 364 4574",
3568 + "username": "coselton6l",
3569 + "age": 54,
3570 + "birth_day": "1982-02-08"
3571 + },
3572 + {
3573 + "id": 239,
3574 + "full_name": "Jamal Gayforth",
3575 + "email": "jgayforth6m@mozilla.org",
3576 + "gender": "Male",
3577 + "job_title": "Web Developer II",
3578 + "company": "Jaxnation",
3579 + "country": "Indonesia",
3580 + "city": "Peranap",
3581 + "street_address": "475 Spohn Court",
3582 + "phone": "+62 487 681 3758",
3583 + "username": "jgayforth6m",
3584 + "age": 32,
3585 + "birth_day": "1949-12-26"
3586 + },
3587 + {
3588 + "id": 240,
3589 + "full_name": "Auroora Shenton",
3590 + "email": "ashenton6n@histats.com",
3591 + "gender": "Female",
3592 + "job_title": "Software Engineer II",
3593 + "company": "Tagcat",
3594 + "country": "El Salvador",
3595 + "city": "Chirilagua",
3596 + "street_address": "618 Northfield Pass",
3597 + "phone": "+503 427 241 9504",
3598 + "username": "ashenton6n",
3599 + "age": 28,
3600 + "birth_day": "1937-09-30"
3601 + },
3602 + {
3603 + "id": 241,
3604 + "full_name": "Chiquita Batie",
3605 + "email": "cbatie6o@wordpress.org",
3606 + "gender": "Female",
3607 + "job_title": "Business Systems Development Analyst",
3608 + "company": "Zoozzy",
3609 + "country": "Spain",
3610 + "city": "Vigo",
3611 + "street_address": "907 Dovetail Park",
3612 + "phone": "+34 188 760 6590",
3613 + "username": "cbatie6o",
3614 + "age": 22,
3615 + "birth_day": "1948-08-05"
3616 + },
3617 + {
3618 + "id": 242,
3619 + "full_name": "Hailey Odam",
3620 + "email": "hodam6p@pcworld.com",
3621 + "gender": "Male",
3622 + "job_title": "Teacher",
3623 + "company": "Dabjam",
3624 + "country": "Puerto Rico",
3625 + "city": "Carolina",
3626 + "street_address": "4026 Namekagon Street",
3627 + "phone": "+1 679 808 1770",
3628 + "username": "hodam6p",
3629 + "age": 33,
3630 + "birth_day": "1932-05-21"
3631 + },
3632 + {
3633 + "id": 243,
3634 + "full_name": "Lindi Pucker",
3635 + "email": "lpucker6q@fotki.com",
3636 + "gender": "Female",
3637 + "job_title": "Nuclear Power Engineer",
3638 + "company": "Bubblebox",
3639 + "country": "Indonesia",
3640 + "city": "Narawayong",
3641 + "street_address": "147 Morning Road",
3642 + "phone": "+62 982 413 7527",
3643 + "username": "lpucker6q",
3644 + "age": 43,
3645 + "birth_day": "1986-07-28"
3646 + },
3647 + {
3648 + "id": 244,
3649 + "full_name": "Wainwright Bilverstone",
3650 + "email": "wbilverstone6r@pbs.org",
3651 + "gender": "Male",
3652 + "job_title": "Cost Accountant",
3653 + "company": "Jaxnation",
3654 + "country": "Indonesia",
3655 + "city": "Sukajadi",
3656 + "street_address": "45 Annamark Court",
3657 + "phone": "+62 103 593 7626",
3658 + "username": "wbilverstone6r",
3659 + "age": 40,
3660 + "birth_day": "1983-10-09"
3661 + },
3662 + {
3663 + "id": 245,
3664 + "full_name": "Jody Ringwood",
3665 + "email": "jringwood6s@about.com",
3666 + "gender": "Male",
3667 + "job_title": "Mechanical Systems Engineer",
3668 + "company": "Leenti",
3669 + "country": "Czech Republic",
3670 + "city": "Uherský Brod",
3671 + "street_address": "13114 Grayhawk Pass",
3672 + "phone": "+420 830 172 5593",
3673 + "username": "jringwood6s",
3674 + "age": 76,
3675 + "birth_day": "1970-05-20"
3676 + },
3677 + {
3678 + "id": 246,
3679 + "full_name": "Zorah Penquet",
3680 + "email": "zpenquet6t@paypal.com",
3681 + "gender": "Female",
3682 + "job_title": "Environmental Specialist",
3683 + "company": "Edgeblab",
3684 + "country": "Afghanistan",
3685 + "city": "Markaz-e Ḩukūmat-e Darwēshān",
3686 + "street_address": "79 Rieder Junction",
3687 + "phone": "+93 161 891 9654",
3688 + "username": "zpenquet6t",
3689 + "age": 20,
3690 + "birth_day": "1958-01-10"
3691 + },
3692 + {
3693 + "id": 247,
3694 + "full_name": "Nickolai Proppers",
3695 + "email": "nproppers6u@wikispaces.com",
3696 + "gender": "Male",
3697 + "job_title": "Analog Circuit Design manager",
3698 + "company": "Topicblab",
3699 + "country": "China",
3700 + "city": "Changtan",
3701 + "street_address": "19915 Cottonwood Crossing",
3702 + "phone": "+86 913 516 5348",
3703 + "username": "nproppers6u",
3704 + "age": 51,
3705 + "birth_day": "1988-07-13"
3706 + },
3707 + {
3708 + "id": 248,
3709 + "full_name": "Edik Camili",
3710 + "email": "ecamili6v@huffingtonpost.com",
3711 + "gender": "Male",
3712 + "job_title": "Product Engineer",
3713 + "company": "Realblab",
3714 + "country": "Indonesia",
3715 + "city": "Terbangan",
3716 + "street_address": "0688 Hermina Parkway",
3717 + "phone": "+62 919 617 4242",
3718 + "username": "ecamili6v",
3719 + "age": 69,
3720 + "birth_day": "1992-06-22"
3721 + },
3722 + {
3723 + "id": 249,
3724 + "full_name": "Janette Britney",
3725 + "email": "jbritney6w@webeden.co.uk",
3726 + "gender": "Female",
3727 + "job_title": "Executive Secretary",
3728 + "company": "Photolist",
3729 + "country": "Poland",
3730 + "city": "Gierłoż",
3731 + "street_address": "6 Jenna Trail",
3732 + "phone": "+48 432 244 1603",
3733 + "username": "jbritney6w",
3734 + "age": 67,
3735 + "birth_day": "1959-09-10"
3736 + },
3737 + {
3738 + "id": 250,
3739 + "full_name": "Cris Paulsson",
3740 + "email": "cpaulsson6x@statcounter.com",
3741 + "gender": "Male",
3742 + "job_title": "Clinical Specialist",
3743 + "company": "Podcat",
3744 + "country": "Russia",
3745 + "city": "Khomutovo",
3746 + "street_address": "6818 Washington Court",
3747 + "phone": "+7 116 797 6728",
3748 + "username": "cpaulsson6x",
3749 + "age": 30,
3750 + "birth_day": "1948-11-23"
3751 + },
3752 + {
3753 + "id": 251,
3754 + "full_name": "Bellanca Cisec",
3755 + "email": "bcisec6y@dailymotion.com",
3756 + "gender": "Female",
3757 + "job_title": "Marketing Assistant",
3758 + "company": "Devpoint",
3759 + "country": "Namibia",
3760 + "city": "Omaruru",
3761 + "street_address": "85 Laurel Road",
3762 + "phone": "+264 232 709 1582",
3763 + "username": "bcisec6y",
3764 + "age": 26,
3765 + "birth_day": "1964-05-31"
3766 + },
3767 + {
3768 + "id": 252,
3769 + "full_name": "Delano Speeks",
3770 + "email": "dspeeks6z@clickbank.net",
3771 + "gender": "Male",
3772 + "job_title": "Compensation Analyst",
3773 + "company": "Tazz",
3774 + "country": "Egypt",
3775 + "city": "Shibīn al Kawm",
3776 + "street_address": "57 Hauk Lane",
3777 + "phone": "+20 720 856 6860",
3778 + "username": "dspeeks6z",
3779 + "age": 26,
3780 + "birth_day": "1995-10-04"
3781 + },
3782 + {
3783 + "id": 253,
3784 + "full_name": "Alexandro Borgnol",
3785 + "email": "aborgnol70@washington.edu",
3786 + "gender": "Male",
3787 + "job_title": "Civil Engineer",
3788 + "company": "Quimm",
3789 + "country": "Vietnam",
3790 + "city": "Vũ Quang",
3791 + "street_address": "101 Mesta Street",
3792 + "phone": "+84 488 860 6720",
3793 + "username": "aborgnol70",
3794 + "age": 45,
3795 + "birth_day": "1945-07-24"
3796 + },
3797 + {
3798 + "id": 254,
3799 + "full_name": "Xerxes Jelk",
3800 + "email": "xjelk71@oakley.com",
3801 + "gender": "Male",
3802 + "job_title": "Legal Assistant",
3803 + "company": "Talane",
3804 + "country": "Indonesia",
3805 + "city": "Ciganaria",
3806 + "street_address": "59 Almo Avenue",
3807 + "phone": "+62 283 208 7994",
3808 + "username": "xjelk71",
3809 + "age": 32,
3810 + "birth_day": "1955-08-01"
3811 + },
3812 + {
3813 + "id": 255,
3814 + "full_name": "Stavro Gynni",
3815 + "email": "sgynni72@github.io",
3816 + "gender": "Male",
3817 + "job_title": "Graphic Designer",
3818 + "company": "Feedfish",
3819 + "country": "Czech Republic",
3820 + "city": "Miřetice",
3821 + "street_address": "59925 Messerschmidt Plaza",
3822 + "phone": "+420 299 851 1049",
3823 + "username": "sgynni72",
3824 + "age": 78,
3825 + "birth_day": "1951-08-13"
3826 + },
3827 + {
3828 + "id": 256,
3829 + "full_name": "Shurwood Scobie",
3830 + "email": "sscobie73@theatlantic.com",
3831 + "gender": "Male",
3832 + "job_title": "Structural Analysis Engineer",
3833 + "company": "Devpoint",
3834 + "country": "Uganda",
3835 + "city": "Kibuku",
3836 + "street_address": "12883 Lukken Lane",
3837 + "phone": "+256 524 288 3921",
3838 + "username": "sscobie73",
3839 + "age": 53,
3840 + "birth_day": "1966-07-21"
3841 + },
3842 + {
3843 + "id": 257,
3844 + "full_name": "Valentine Dunnico",
3845 + "email": "vdunnico74@archive.org",
3846 + "gender": "Female",
3847 + "job_title": "Engineer II",
3848 + "company": "Divanoodle",
3849 + "country": "Lithuania",
3850 + "city": "Jonava",
3851 + "street_address": "11 Mesta Point",
3852 + "phone": "+370 700 381 6121",
3853 + "username": "vdunnico74",
3854 + "age": 70,
3855 + "birth_day": "1960-02-21"
3856 + },
3857 + {
3858 + "id": 258,
3859 + "full_name": "Leicester Bruckental",
3860 + "email": "lbruckental75@zimbio.com",
3861 + "gender": "Male",
3862 + "job_title": "Librarian",
3863 + "company": "Topicblab",
3864 + "country": "Indonesia",
3865 + "city": "Belanting",
3866 + "street_address": "1091 Buena Vista Court",
3867 + "phone": "+62 383 338 3457",
3868 + "username": "lbruckental75",
3869 + "age": 80,
3870 + "birth_day": "1974-12-26"
3871 + },
3872 + {
3873 + "id": 259,
3874 + "full_name": "Cassy Stoffler",
3875 + "email": "cstoffler76@blog.com",
3876 + "gender": "Female",
3877 + "job_title": "Quality Engineer",
3878 + "company": "Skinix",
3879 + "country": "China",
3880 + "city": "Hongqiao",
3881 + "street_address": "089 Badeau Street",
3882 + "phone": "+86 722 516 3873",
3883 + "username": "cstoffler76",
3884 + "age": 46,
3885 + "birth_day": "1996-11-28"
3886 + },
3887 + {
3888 + "id": 260,
3889 + "full_name": "Shaun Cawkill",
3890 + "email": "scawkill77@w3.org",
3891 + "gender": "Female",
3892 + "job_title": "Legal Assistant",
3893 + "company": "Fadeo",
3894 + "country": "Brazil",
3895 + "city": "Tucuruí",
3896 + "street_address": "9 Cordelia Hill",
3897 + "phone": "+55 109 218 7662",
3898 + "username": "scawkill77",
3899 + "age": 46,
3900 + "birth_day": "1971-08-08"
3901 + },
3902 + {
3903 + "id": 261,
3904 + "full_name": "Dorine Blue",
3905 + "email": "dblue78@weibo.com",
3906 + "gender": "Female",
3907 + "job_title": "Engineer II",
3908 + "company": "Tanoodle",
3909 + "country": "Pakistan",
3910 + "city": "Daultāla",
3911 + "street_address": "7 Mallory Place",
3912 + "phone": "+92 949 451 2967",
3913 + "username": "dblue78",
3914 + "age": 52,
3915 + "birth_day": "1974-01-06"
3916 + },
3917 + {
3918 + "id": 262,
3919 + "full_name": "Mildrid Cogzell",
3920 + "email": "mcogzell79@who.int",
3921 + "gender": "Female",
3922 + "job_title": "Geologist II",
3923 + "company": "Rhyloo",
3924 + "country": "France",
3925 + "city": "Briey",
3926 + "street_address": "63474 8th Trail",
3927 + "phone": "+33 133 121 4186",
3928 + "username": "mcogzell79",
3929 + "age": 55,
3930 + "birth_day": "1961-02-17"
3931 + },
3932 + {
3933 + "id": 263,
3934 + "full_name": "Milton Fronks",
3935 + "email": "mfronks7a@theguardian.com",
3936 + "gender": "Male",
3937 + "job_title": "Food Chemist",
3938 + "company": "Rhyzio",
3939 + "country": "Russia",
3940 + "city": "Konobeyevo",
3941 + "street_address": "64 Melrose Way",
3942 + "phone": "+7 967 494 6208",
3943 + "username": "mfronks7a",
3944 + "age": 50,
3945 + "birth_day": "1931-05-08"
3946 + },
3947 + {
3948 + "id": 264,
3949 + "full_name": "Nickolai Codman",
3950 + "email": "ncodman7b@topsy.com",
3951 + "gender": "Male",
3952 + "job_title": "Design Engineer",
3953 + "company": "Wikivu",
3954 + "country": "Portugal",
3955 + "city": "Póvoa do Valado",
3956 + "street_address": "4 Eggendart Terrace",
3957 + "phone": "+351 448 758 4857",
3958 + "username": "ncodman7b",
3959 + "age": 23,
3960 + "birth_day": "1946-08-07"
3961 + },
3962 + {
3963 + "id": 265,
3964 + "full_name": "Trudi Argabrite",
3965 + "email": "targabrite7c@craigslist.org",
3966 + "gender": "Female",
3967 + "job_title": "Editor",
3968 + "company": "Skynoodle",
3969 + "country": "Indonesia",
3970 + "city": "Cisompet",
3971 + "street_address": "9391 Comanche Circle",
3972 + "phone": "+62 269 722 9893",
3973 + "username": "targabrite7c",
3974 + "age": 58,
3975 + "birth_day": "1990-08-03"
3976 + },
3977 + {
3978 + "id": 266,
3979 + "full_name": "Christoper Stokell",
3980 + "email": "cstokell7d@ustream.tv",
3981 + "gender": "Male",
3982 + "job_title": "Environmental Tech",
3983 + "company": "Yotz",
3984 + "country": "China",
3985 + "city": "Niushou",
3986 + "street_address": "962 Caliangt Avenue",
3987 + "phone": "+86 614 463 7362",
3988 + "username": "cstokell7d",
3989 + "age": 29,
3990 + "birth_day": "1975-09-04"
3991 + },
3992 + {
3993 + "id": 267,
3994 + "full_name": "Gustavus Uppett",
3995 + "email": "guppett7e@imgur.com",
3996 + "gender": "Male",
3997 + "job_title": "Project Manager",
3998 + "company": "Yoveo",
3999 + "country": "Dominican Republic",
4000 + "city": "La Romana",
4001 + "street_address": "215 Dayton Center",
4002 + "phone": "+1 933 244 2792",
4003 + "username": "guppett7e",
4004 + "age": 53,
4005 + "birth_day": "1981-07-09"
4006 + },
4007 + {
4008 + "id": 268,
4009 + "full_name": "Nikki Josskowitz",
4010 + "email": "njosskowitz7f@wordpress.com",
4011 + "gender": "Male",
4012 + "job_title": "GIS Technical Architect",
4013 + "company": "Innotype",
4014 + "country": "Portugal",
4015 + "city": "Fortios",
4016 + "street_address": "791 2nd Place",
4017 + "phone": "+351 752 354 7689",
4018 + "username": "njosskowitz7f",
4019 + "age": 24,
4020 + "birth_day": "1972-01-17"
4021 + },
4022 + {
4023 + "id": 269,
4024 + "full_name": "Thomasina Plumridege",
4025 + "email": "tplumridege7g@goo.gl",
4026 + "gender": "Female",
4027 + "job_title": "Human Resources Manager",
4028 + "company": "Thoughtbeat",
4029 + "country": "Guatemala",
4030 + "city": "Huité",
4031 + "street_address": "69 Village Parkway",
4032 + "phone": "+502 746 676 0479",
4033 + "username": "tplumridege7g",
4034 + "age": 66,
4035 + "birth_day": "1955-09-13"
4036 + },
4037 + {
4038 + "id": 270,
4039 + "full_name": "Lombard Emloch",
4040 + "email": "lemloch7h@census.gov",
4041 + "gender": "Male",
4042 + "job_title": "Safety Technician IV",
4043 + "company": "Mybuzz",
4044 + "country": "Russia",
4045 + "city": "Novotitarovskaya",
4046 + "street_address": "33984 Morning Circle",
4047 + "phone": "+7 882 260 6045",
4048 + "username": "lemloch7h",
4049 + "age": 68,
4050 + "birth_day": "1989-05-10"
4051 + },
4052 + {
4053 + "id": 271,
4054 + "full_name": "Roze Tite",
4055 + "email": "rtite7i@jugem.jp",
4056 + "gender": "Female",
4057 + "job_title": "Chief Design Engineer",
4058 + "company": "Quaxo",
4059 + "country": "Colombia",
4060 + "city": "Aguachica",
4061 + "street_address": "53217 Vera Circle",
4062 + "phone": "+57 552 876 1097",
4063 + "username": "rtite7i",
4064 + "age": 58,
4065 + "birth_day": "1987-04-26"
4066 + },
4067 + {
4068 + "id": 272,
4069 + "full_name": "Calli Stump",
4070 + "email": "cstump7j@istockphoto.com",
4071 + "gender": "Female",
4072 + "job_title": "Senior Editor",
4073 + "company": "Realbridge",
4074 + "country": "Bulgaria",
4075 + "city": "Chavdar",
4076 + "street_address": "68 Oakridge Junction",
4077 + "phone": "+359 540 896 3090",
4078 + "username": "cstump7j",
4079 + "age": 76,
4080 + "birth_day": "1946-10-07"
4081 + },
4082 + {
4083 + "id": 273,
4084 + "full_name": "Dallis Pontain",
4085 + "email": "dpontain7k@cdc.gov",
4086 + "gender": "Male",
4087 + "job_title": "Account Executive",
4088 + "company": "Riffpedia",
4089 + "country": "Portugal",
4090 + "city": "Monção",
4091 + "street_address": "6 Nelson Circle",
4092 + "phone": "+351 664 406 9722",
4093 + "username": "dpontain7k",
4094 + "age": 25,
4095 + "birth_day": "1960-02-14"
4096 + },
4097 + {
4098 + "id": 274,
4099 + "full_name": "Cecil Royce",
4100 + "email": "croyce7l@goodreads.com",
4101 + "gender": "Female",
4102 + "job_title": "Web Developer II",
4103 + "company": "Buzzster",
4104 + "country": "Philippines",
4105 + "city": "Siay",
4106 + "street_address": "619 Red Cloud Avenue",
4107 + "phone": "+63 803 132 5899",
4108 + "username": "croyce7l",
4109 + "age": 39,
4110 + "birth_day": "1977-11-07"
4111 + },
4112 + {
4113 + "id": 275,
4114 + "full_name": "Carole Dinzey",
4115 + "email": "cdinzey7m@npr.org",
4116 + "gender": "Female",
4117 + "job_title": "Analyst Programmer",
4118 + "company": "Wikizz",
4119 + "country": "Colombia",
4120 + "city": "El Cocuy",
4121 + "street_address": "650 Tennessee Junction",
4122 + "phone": "+57 467 616 8127",
4123 + "username": "cdinzey7m",
4124 + "age": 18,
4125 + "birth_day": "1982-02-27"
4126 + },
4127 + {
4128 + "id": 276,
4129 + "full_name": "Lonnie Kime",
4130 + "email": "lkime7n@prnewswire.com",
4131 + "gender": "Male",
4132 + "job_title": "Environmental Tech",
4133 + "company": "Meezzy",
4134 + "country": "China",
4135 + "city": "Gaoming",
4136 + "street_address": "983 Starling Park",
4137 + "phone": "+86 398 936 8430",
4138 + "username": "lkime7n",
4139 + "age": 61,
4140 + "birth_day": "1953-06-01"
4141 + },
4142 + {
4143 + "id": 277,
4144 + "full_name": "Perla Bunworth",
4145 + "email": "pbunworth7o@nationalgeographic.com",
4146 + "gender": "Female",
4147 + "job_title": "Assistant Manager",
4148 + "company": "Ntags",
4149 + "country": "Greece",
4150 + "city": "Ágios Efstrátios",
4151 + "street_address": "064 Jenifer Center",
4152 + "phone": "+30 634 150 1836",
4153 + "username": "pbunworth7o",
4154 + "age": 40,
4155 + "birth_day": "1944-09-25"
4156 + },
4157 + {
4158 + "id": 278,
4159 + "full_name": "Zara Lowe",
4160 + "email": "zlowe7p@mysql.com",
4161 + "gender": "Female",
4162 + "job_title": "Analyst Programmer",
4163 + "company": "Linklinks",
4164 + "country": "Indonesia",
4165 + "city": "Purwosari",
4166 + "street_address": "0023 Eastwood Avenue",
4167 + "phone": "+62 908 762 4501",
4168 + "username": "zlowe7p",
4169 + "age": 29,
4170 + "birth_day": "1980-01-20"
4171 + },
4172 + {
4173 + "id": 279,
4174 + "full_name": "Galen Levesque",
4175 + "email": "glevesque7q@google.de",
4176 + "gender": "Male",
4177 + "job_title": "Programmer Analyst II",
4178 + "company": "Skipstorm",
4179 + "country": "China",
4180 + "city": "Yinzhu",
4181 + "street_address": "8020 Bashford Point",
4182 + "phone": "+86 251 295 4665",
4183 + "username": "glevesque7q",
4184 + "age": 63,
4185 + "birth_day": "1964-12-16"
4186 + },
4187 + {
4188 + "id": 280,
4189 + "full_name": "Fae Byfield",
4190 + "email": "fbyfield7r@mediafire.com",
4191 + "gender": "Female",
4192 + "job_title": "Recruiting Manager",
4193 + "company": "Mydeo",
4194 + "country": "Colombia",
4195 + "city": "Soacha",
4196 + "street_address": "9441 Jenifer Way",
4197 + "phone": "+57 664 833 1567",
4198 + "username": "fbyfield7r",
4199 + "age": 76,
4200 + "birth_day": "1988-04-10"
4201 + },
4202 + {
4203 + "id": 281,
4204 + "full_name": "Karisa Sillwood",
4205 + "email": "ksillwood7s@mit.edu",
4206 + "gender": "Female",
4207 + "job_title": "Speech Pathologist",
4208 + "company": "Babbleblab",
4209 + "country": "Japan",
4210 + "city": "Sendai",
4211 + "street_address": "776 Hollow Ridge Place",
4212 + "phone": "+81 331 900 7680",
4213 + "username": "ksillwood7s",
4214 + "age": 59,
4215 + "birth_day": "1958-05-04"
4216 + },
4217 + {
4218 + "id": 282,
4219 + "full_name": "Marybelle Napoleone",
4220 + "email": "mnapoleone7t@ustream.tv",
4221 + "gender": "Female",
4222 + "job_title": "Internal Auditor",
4223 + "company": "Brightdog",
4224 + "country": "Afghanistan",
4225 + "city": "Zerok-Alakadari",
4226 + "street_address": "187 Dorton Center",
4227 + "phone": "+93 602 903 2411",
4228 + "username": "mnapoleone7t",
4229 + "age": 40,
4230 + "birth_day": "1984-03-15"
4231 + },
4232 + {
4233 + "id": 283,
4234 + "full_name": "Quinn Lambricht",
4235 + "email": "qlambricht7u@chicagotribune.com",
4236 + "gender": "Female",
4237 + "job_title": "Analyst Programmer",
4238 + "company": "Innotype",
4239 + "country": "Cyprus",
4240 + "city": "Akaki",
4241 + "street_address": "8145 Sutteridge Circle",
4242 + "phone": "+357 206 411 8996",
4243 + "username": "qlambricht7u",
4244 + "age": 64,
4245 + "birth_day": "1990-03-31"
4246 + },
4247 + {
4248 + "id": 284,
4249 + "full_name": "Rufe Biggans",
4250 + "email": "rbiggans7v@de.vu",
4251 + "gender": "Male",
4252 + "job_title": "Environmental Tech",
4253 + "company": "Linktype",
4254 + "country": "Madagascar",
4255 + "city": "Fort Dauphin",
4256 + "street_address": "669 Pawling Pass",
4257 + "phone": "+261 730 680 4385",
4258 + "username": "rbiggans7v",
4259 + "age": 78,
4260 + "birth_day": "1961-02-13"
4261 + },
4262 + {
4263 + "id": 285,
4264 + "full_name": "Opaline Trigwell",
4265 + "email": "otrigwell7w@twitter.com",
4266 + "gender": "Female",
4267 + "job_title": "Accountant I",
4268 + "company": "Brainverse",
4269 + "country": "Poland",
4270 + "city": "Żernica",
4271 + "street_address": "05 Reinke Trail",
4272 + "phone": "+48 357 477 6154",
4273 + "username": "otrigwell7w",
4274 + "age": 55,
4275 + "birth_day": "1957-12-08"
4276 + },
4277 + {
4278 + "id": 286,
4279 + "full_name": "Euell Gregorin",
4280 + "email": "egregorin7x@microsoft.com",
4281 + "gender": "Male",
4282 + "job_title": "Sales Representative",
4283 + "company": "Meembee",
4284 + "country": "Azerbaijan",
4285 + "city": "Maştağa",
4286 + "street_address": "80 Leroy Circle",
4287 + "phone": "+994 879 512 4829",
4288 + "username": "egregorin7x",
4289 + "age": 39,
4290 + "birth_day": "1996-12-17"
4291 + },
4292 + {
4293 + "id": 287,
4294 + "full_name": "Farrand Yell",
4295 + "email": "fyell7y@pinterest.com",
4296 + "gender": "Female",
4297 + "job_title": "Marketing Assistant",
4298 + "company": "Riffpath",
4299 + "country": "Mexico",
4300 + "city": "Miguel Hidalgo",
4301 + "street_address": "224 Southridge Terrace",
4302 + "phone": "+52 436 825 4216",
4303 + "username": "fyell7y",
4304 + "age": 73,
4305 + "birth_day": "1941-10-07"
4306 + },
4307 + {
4308 + "id": 288,
4309 + "full_name": "Rafe Dowzell",
4310 + "email": "rdowzell7z@elpais.com",
4311 + "gender": "Male",
4312 + "job_title": "Environmental Tech",
4313 + "company": "Viva",
4314 + "country": "Philippines",
4315 + "city": "San Isidro",
4316 + "street_address": "4568 Pierstorff Junction",
4317 + "phone": "+63 163 310 7240",
4318 + "username": "rdowzell7z",
4319 + "age": 33,
4320 + "birth_day": "1957-12-08"
4321 + },
4322 + {
4323 + "id": 289,
4324 + "full_name": "Clarisse Scouse",
4325 + "email": "cscouse80@yale.edu",
4326 + "gender": "Female",
4327 + "job_title": "Technical Writer",
4328 + "company": "Linkbuzz",
4329 + "country": "Indonesia",
4330 + "city": "Karanglincak",
4331 + "street_address": "3230 Buell Junction",
4332 + "phone": "+62 282 239 3196",
4333 + "username": "cscouse80",
4334 + "age": 32,
4335 + "birth_day": "1931-06-22"
4336 + },
4337 + {
4338 + "id": 290,
4339 + "full_name": "Cassey Lumley",
4340 + "email": "clumley81@yahoo.co.jp",
4341 + "gender": "Female",
4342 + "job_title": "Engineer II",
4343 + "company": "Dabfeed",
4344 + "country": "China",
4345 + "city": "Zhishan",
4346 + "street_address": "3 Muir Plaza",
4347 + "phone": "+86 204 383 8210",
4348 + "username": "clumley81",
4349 + "age": 71,
4350 + "birth_day": "1962-06-16"
4351 + },
4352 + {
4353 + "id": 291,
4354 + "full_name": "Kirby Guiett",
4355 + "email": "kguiett82@cnet.com",
4356 + "gender": "Male",
4357 + "job_title": "Electrical Engineer",
4358 + "company": "Meevee",
4359 + "country": "China",
4360 + "city": "Yangshufang",
4361 + "street_address": "8022 Sycamore Lane",
4362 + "phone": "+86 773 465 5650",
4363 + "username": "kguiett82",
4364 + "age": 27,
4365 + "birth_day": "1936-06-13"
4366 + },
4367 + {
4368 + "id": 292,
4369 + "full_name": "Wood Chastey",
4370 + "email": "wchastey83@comsenz.com",
4371 + "gender": "Male",
4372 + "job_title": "Recruiting Manager",
4373 + "company": "Npath",
4374 + "country": "Iran",
4375 + "city": "Khalkhāl",
4376 + "street_address": "1290 Tony Circle",
4377 + "phone": "+98 362 930 9188",
4378 + "username": "wchastey83",
4379 + "age": 56,
4380 + "birth_day": "1968-12-17"
4381 + },
4382 + {
4383 + "id": 293,
4384 + "full_name": "Gabi Ramelet",
4385 + "email": "gramelet84@bloglovin.com",
4386 + "gender": "Male",
4387 + "job_title": "Desktop Support Technician",
4388 + "company": "Yodoo",
4389 + "country": "Afghanistan",
4390 + "city": "Qala i Naw",
4391 + "street_address": "43487 West Circle",
4392 + "phone": "+93 819 484 7009",
4393 + "username": "gramelet84",
4394 + "age": 49,
4395 + "birth_day": "1968-10-15"
4396 + },
4397 + {
4398 + "id": 294,
4399 + "full_name": "Kale Sumshon",
4400 + "email": "ksumshon85@sciencedaily.com",
4401 + "gender": "Male",
4402 + "job_title": "Programmer Analyst I",
4403 + "company": "Topiczoom",
4404 + "country": "China",
4405 + "city": "Zhili",
4406 + "street_address": "44 Cardinal Plaza",
4407 + "phone": "+86 739 294 2559",
4408 + "username": "ksumshon85",
4409 + "age": 50,
4410 + "birth_day": "1997-01-14"
4411 + },
4412 + {
4413 + "id": 295,
4414 + "full_name": "Tulley Bengall",
4415 + "email": "tbengall86@google.pl",
4416 + "gender": "Male",
4417 + "job_title": "Nurse",
4418 + "company": "Twimbo",
4419 + "country": "Indonesia",
4420 + "city": "Bangekdewa",
4421 + "street_address": "76853 Schiller Place",
4422 + "phone": "+62 231 320 6257",
4423 + "username": "tbengall86",
4424 + "age": 75,
4425 + "birth_day": "1987-09-30"
4426 + },
4427 + {
4428 + "id": 296,
4429 + "full_name": "Odey Richardet",
4430 + "email": "orichardet87@cafepress.com",
4431 + "gender": "Male",
4432 + "job_title": "Social Worker",
4433 + "company": "Meedoo",
4434 + "country": "Kazakhstan",
4435 + "city": "Shīeli",
4436 + "street_address": "8 Memorial Lane",
4437 + "phone": "+7 706 507 7931",
4438 + "username": "orichardet87",
4439 + "age": 29,
4440 + "birth_day": "1986-07-11"
4441 + },
4442 + {
4443 + "id": 297,
4444 + "full_name": "Udell Briddock",
4445 + "email": "ubriddock88@tinypic.com",
4446 + "gender": "Male",
4447 + "job_title": "Director of Sales",
4448 + "company": "Babblestorm",
4449 + "country": "Argentina",
4450 + "city": "Intendente Alvear",
4451 + "street_address": "03207 Upham Point",
4452 + "phone": "+54 636 656 6911",
4453 + "username": "ubriddock88",
4454 + "age": 52,
4455 + "birth_day": "1990-06-06"
4456 + },
4457 + {
4458 + "id": 298,
4459 + "full_name": "Jermain Brundrett",
4460 + "email": "jbrundrett89@over-blog.com",
4461 + "gender": "Male",
4462 + "job_title": "Account Executive",
4463 + "company": "Buzzdog",
4464 + "country": "Vietnam",
4465 + "city": "Thị Trấn Nguyên Bình",
4466 + "street_address": "5 Ridge Oak Terrace",
4467 + "phone": "+84 621 685 5117",
4468 + "username": "jbrundrett89",
4469 + "age": 49,
4470 + "birth_day": "1994-10-24"
4471 + },
4472 + {
4473 + "id": 299,
4474 + "full_name": "Adelaida Linch",
4475 + "email": "alinch8a@opensource.org",
4476 + "gender": "Female",
4477 + "job_title": "Internal Auditor",
4478 + "company": "Devpulse",
4479 + "country": "Greece",
4480 + "city": "Karítsa",
4481 + "street_address": "3293 Sullivan Center",
4482 + "phone": "+30 719 997 9180",
4483 + "username": "alinch8a",
4484 + "age": 79,
4485 + "birth_day": "1994-01-31"
4486 + },
4487 + {
4488 + "id": 300,
4489 + "full_name": "Eben Haws",
4490 + "email": "ehaws8b@tumblr.com",
4491 + "gender": "Male",
4492 + "job_title": "VP Marketing",
4493 + "company": "Katz",
4494 + "country": "China",
4495 + "city": "Jangdam",
4496 + "street_address": "51561 Cherokee Road",
4497 + "phone": "+86 555 381 8755",
4498 + "username": "ehaws8b",
4499 + "age": 61,
4500 + "birth_day": "1944-10-07"
4501 + },
4502 + {
4503 + "id": 301,
4504 + "full_name": "Elmo Scullin",
4505 + "email": "escullin8c@cargocollective.com",
4506 + "gender": "Male",
4507 + "job_title": "VP Quality Control",
4508 + "company": "Shufflester",
4509 + "country": "Brazil",
4510 + "city": "Una",
4511 + "street_address": "99453 Bunker Hill Avenue",
4512 + "phone": "+55 919 589 0934",
4513 + "username": "escullin8c",
4514 + "age": 80,
4515 + "birth_day": "1946-06-23"
4516 + },
4517 + {
4518 + "id": 302,
4519 + "full_name": "Veronika Wheater",
4520 + "email": "vwheater8d@wunderground.com",
4521 + "gender": "Female",
4522 + "job_title": "Analog Circuit Design manager",
4523 + "company": "Thoughtbeat",
4524 + "country": "Poland",
4525 + "city": "Gościeradów",
4526 + "street_address": "49 Pond Court",
4527 + "phone": "+48 557 465 4671",
4528 + "username": "vwheater8d",
4529 + "age": 52,
4530 + "birth_day": "1935-12-23"
4531 + },
4532 + {
4533 + "id": 303,
4534 + "full_name": "Rossy Burg",
4535 + "email": "rburg8e@dion.ne.jp",
4536 + "gender": "Male",
4537 + "job_title": "Actuary",
4538 + "company": "Riffwire",
4539 + "country": "China",
4540 + "city": "Pudong",
4541 + "street_address": "64453 Becker Avenue",
4542 + "phone": "+86 481 155 4250",
4543 + "username": "rburg8e",
4544 + "age": 51,
4545 + "birth_day": "1990-12-08"
4546 + },
4547 + {
4548 + "id": 304,
4549 + "full_name": "Conan Jolland",
4550 + "email": "cjolland8f@parallels.com",
4551 + "gender": "Male",
4552 + "job_title": "Operator",
4553 + "company": "Gevee",
4554 + "country": "Russia",
4555 + "city": "Michurinskoye",
4556 + "street_address": "071 Hauk Junction",
4557 + "phone": "+7 754 688 4952",
4558 + "username": "cjolland8f",
4559 + "age": 75,
4560 + "birth_day": "1938-12-27"
4561 + },
4562 + {
4563 + "id": 305,
4564 + "full_name": "Augustin Josebury",
4565 + "email": "ajosebury8g@nba.com",
4566 + "gender": "Male",
4567 + "job_title": "Nurse",
4568 + "company": "Quimba",
4569 + "country": "Philippines",
4570 + "city": "Noveleta",
4571 + "street_address": "41 Muir Lane",
4572 + "phone": "+63 605 860 3184",
4573 + "username": "ajosebury8g",
4574 + "age": 19,
4575 + "birth_day": "1978-12-19"
4576 + },
4577 + {
4578 + "id": 306,
4579 + "full_name": "Dori Suddaby",
4580 + "email": "dsuddaby8h@ow.ly",
4581 + "gender": "Female",
4582 + "job_title": "Assistant Manager",
4583 + "company": "Tagopia",
4584 + "country": "Poland",
4585 + "city": "Szemud",
4586 + "street_address": "202 Redwing Court",
4587 + "phone": "+48 502 317 4209",
4588 + "username": "dsuddaby8h",
4589 + "age": 67,
4590 + "birth_day": "1955-03-28"
4591 + },
4592 + {
4593 + "id": 307,
4594 + "full_name": "Bernardo Tattershaw",
4595 + "email": "btattershaw8i@squarespace.com",
4596 + "gender": "Male",
4597 + "job_title": "Programmer I",
4598 + "company": "Rhycero",
4599 + "country": "Afghanistan",
4600 + "city": "Sang-e Chārak",
4601 + "street_address": "64 Vahlen Parkway",
4602 + "phone": "+93 742 518 1297",
4603 + "username": "btattershaw8i",
4604 + "age": 39,
4605 + "birth_day": "1948-02-02"
4606 + },
4607 + {
4608 + "id": 308,
4609 + "full_name": "Omero Nolin",
4610 + "email": "onolin8j@tripadvisor.com",
4611 + "gender": "Male",
4612 + "job_title": "Editor",
4613 + "company": "Youtags",
4614 + "country": "Indonesia",
4615 + "city": "Cikadu",
4616 + "street_address": "7261 Dapin Plaza",
4617 + "phone": "+62 612 475 6157",
4618 + "username": "onolin8j",
4619 + "age": 25,
4620 + "birth_day": "1931-09-03"
4621 + },
4622 + {
4623 + "id": 309,
4624 + "full_name": "Eudora Duesberry",
4625 + "email": "eduesberry8k@senate.gov",
4626 + "gender": "Female",
4627 + "job_title": "Research Nurse",
4628 + "company": "Linklinks",
4629 + "country": "Jamaica",
4630 + "city": "Morant Bay",
4631 + "street_address": "0 Atwood Way",
4632 + "phone": "+1 785 868 3286",
4633 + "username": "eduesberry8k",
4634 + "age": 70,
4635 + "birth_day": "1931-12-18"
4636 + },
4637 + {
4638 + "id": 310,
4639 + "full_name": "Dorie Jeffreys",
4640 + "email": "djeffreys8l@i2i.jp",
4641 + "gender": "Female",
4642 + "job_title": "General Manager",
4643 + "company": "Buzzshare",
4644 + "country": "Brazil",
4645 + "city": "Piraju",
4646 + "street_address": "6220 Shoshone Drive",
4647 + "phone": "+55 824 255 1130",
4648 + "username": "djeffreys8l",
4649 + "age": 18,
4650 + "birth_day": "1943-01-04"
4651 + },
4652 + {
4653 + "id": 311,
4654 + "full_name": "Crysta Lyfe",
4655 + "email": "clyfe8m@answers.com",
4656 + "gender": "Female",
4657 + "job_title": "Web Developer II",
4658 + "company": "Browsezoom",
4659 + "country": "China",
4660 + "city": "Jun’an",
4661 + "street_address": "0 Michigan Alley",
4662 + "phone": "+86 705 804 1197",
4663 + "username": "clyfe8m",
4664 + "age": 18,
4665 + "birth_day": "1962-07-05"
4666 + },
4667 + {
4668 + "id": 312,
4669 + "full_name": "Charmane Inkin",
4670 + "email": "cinkin8n@sogou.com",
4671 + "gender": "Female",
4672 + "job_title": "Structural Analysis Engineer",
4673 + "company": "Demivee",
4674 + "country": "China",
4675 + "city": "Jiuhua",
4676 + "street_address": "0269 Forest Run Court",
4677 + "phone": "+86 324 698 6452",
4678 + "username": "cinkin8n",
4679 + "age": 26,
4680 + "birth_day": "1996-06-26"
4681 + },
4682 + {
4683 + "id": 313,
4684 + "full_name": "Konstantin Tellenbrok",
4685 + "email": "ktellenbrok8o@google.ru",
4686 + "gender": "Male",
4687 + "job_title": "Automation Specialist I",
4688 + "company": "Browsecat",
4689 + "country": "China",
4690 + "city": "Beitan",
4691 + "street_address": "58439 Kings Way",
4692 + "phone": "+86 199 546 4000",
4693 + "username": "ktellenbrok8o",
4694 + "age": 27,
4695 + "birth_day": "1982-05-03"
4696 + },
4697 + {
4698 + "id": 314,
4699 + "full_name": "Bengt Lebbern",
4700 + "email": "blebbern8p@pagesperso-orange.fr",
4701 + "gender": "Male",
4702 + "job_title": "Graphic Designer",
4703 + "company": "Fatz",
4704 + "country": "Russia",
4705 + "city": "Verkhniye Achaluki",
4706 + "street_address": "262 Bultman Circle",
4707 + "phone": "+7 218 600 8184",
4708 + "username": "blebbern8p",
4709 + "age": 76,
4710 + "birth_day": "1982-11-01"
4711 + },
4712 + {
4713 + "id": 315,
4714 + "full_name": "Grove Stranieri",
4715 + "email": "gstranieri8q@state.tx.us",
4716 + "gender": "Male",
4717 + "job_title": "Registered Nurse",
4718 + "company": "Lazzy",
4719 + "country": "Indonesia",
4720 + "city": "Cihaurbeuti",
4721 + "street_address": "184 Raven Street",
4722 + "phone": "+62 792 876 8950",
4723 + "username": "gstranieri8q",
4724 + "age": 20,
4725 + "birth_day": "1954-02-16"
4726 + },
4727 + {
4728 + "id": 316,
4729 + "full_name": "Henri Fowden",
4730 + "email": "hfowden8r@ted.com",
4731 + "gender": "Male",
4732 + "job_title": "Human Resources Manager",
4733 + "company": "Twinder",
4734 + "country": "Sri Lanka",
4735 + "city": "Matara",
4736 + "street_address": "8368 5th Trail",
4737 + "phone": "+94 537 496 2230",
4738 + "username": "hfowden8r",
4739 + "age": 61,
4740 + "birth_day": "1990-09-13"
4741 + },
4742 + {
4743 + "id": 317,
4744 + "full_name": "Vittorio Camacke",
4745 + "email": "vcamacke8s@vistaprint.com",
4746 + "gender": "Male",
4747 + "job_title": "Recruiting Manager",
4748 + "company": "Quatz",
4749 + "country": "Philippines",
4750 + "city": "Capandanan",
4751 + "street_address": "04 Gulseth Terrace",
4752 + "phone": "+63 632 509 7310",
4753 + "username": "vcamacke8s",
4754 + "age": 46,
4755 + "birth_day": "1932-08-26"
4756 + },
4757 + {
4758 + "id": 318,
4759 + "full_name": "Charmaine Rizzetti",
4760 + "email": "crizzetti8t@w3.org",
4761 + "gender": "Female",
4762 + "job_title": "Geological Engineer",
4763 + "company": "Mydeo",
4764 + "country": "Czech Republic",
4765 + "city": "Bakov nad Jizerou",
4766 + "street_address": "28891 Cambridge Avenue",
4767 + "phone": "+420 973 607 9519",
4768 + "username": "crizzetti8t",
4769 + "age": 33,
4770 + "birth_day": "1966-03-22"
4771 + },
4772 + {
4773 + "id": 319,
4774 + "full_name": "Agnesse Kenderdine",
4775 + "email": "akenderdine8u@prweb.com",
4776 + "gender": "Female",
4777 + "job_title": "Geological Engineer",
4778 + "company": "Pixope",
4779 + "country": "Japan",
4780 + "city": "Takefu",
4781 + "street_address": "8 Dawn Trail",
4782 + "phone": "+81 837 325 7034",
4783 + "username": "akenderdine8u",
4784 + "age": 55,
4785 + "birth_day": "1950-12-08"
4786 + },
4787 + {
4788 + "id": 320,
4789 + "full_name": "Sheffy Junes",
4790 + "email": "sjunes8v@artisteer.com",
4791 + "gender": "Male",
4792 + "job_title": "Operator",
4793 + "company": "Chatterbridge",
4794 + "country": "China",
4795 + "city": "Hekou",
4796 + "street_address": "21769 Buhler Alley",
4797 + "phone": "+86 323 112 0324",
4798 + "username": "sjunes8v",
4799 + "age": 51,
4800 + "birth_day": "1956-05-18"
4801 + },
4802 + {
4803 + "id": 321,
4804 + "full_name": "Xena Maciunas",
4805 + "email": "xmaciunas8w@miitbeian.gov.cn",
4806 + "gender": "Female",
4807 + "job_title": "Environmental Specialist",
4808 + "company": "Brightdog",
4809 + "country": "China",
4810 + "city": "Keli",
4811 + "street_address": "578 Westridge Park",
4812 + "phone": "+86 842 385 7267",
4813 + "username": "xmaciunas8w",
4814 + "age": 48,
4815 + "birth_day": "1989-06-17"
4816 + },
4817 + {
4818 + "id": 322,
4819 + "full_name": "Kinsley Cavanaugh",
4820 + "email": "kcavanaugh8x@rediff.com",
4821 + "gender": "Male",
4822 + "job_title": "Software Consultant",
4823 + "company": "Jamia",
4824 + "country": "China",
4825 + "city": "Dandai",
4826 + "street_address": "0 Jana Place",
4827 + "phone": "+86 179 152 8898",
4828 + "username": "kcavanaugh8x",
4829 + "age": 32,
4830 + "birth_day": "1991-02-26"
4831 + },
4832 + {
4833 + "id": 323,
4834 + "full_name": "Dav McNay",
4835 + "email": "dmcnay8y@ehow.com",
4836 + "gender": "Male",
4837 + "job_title": "Food Chemist",
4838 + "company": "Skyvu",
4839 + "country": "Sweden",
4840 + "city": "Solna",
4841 + "street_address": "194 Monument Point",
4842 + "phone": "+46 423 608 5231",
4843 + "username": "dmcnay8y",
4844 + "age": 22,
4845 + "birth_day": "1939-03-31"
4846 + },
4847 + {
4848 + "id": 324,
4849 + "full_name": "Stacy Blasdale",
4850 + "email": "sblasdale8z@arizona.edu",
4851 + "gender": "Female",
4852 + "job_title": "Project Manager",
4853 + "company": "Ainyx",
4854 + "country": "Turkmenistan",
4855 + "city": "Seydi",
4856 + "street_address": "02 Killdeer Center",
4857 + "phone": "+993 301 142 1515",
4858 + "username": "sblasdale8z",
4859 + "age": 78,
4860 + "birth_day": "1975-06-15"
4861 + },
4862 + {
4863 + "id": 325,
4864 + "full_name": "Reta De Freyne",
4865 + "email": "rde90@people.com.cn",
4866 + "gender": "Female",
4867 + "job_title": "Account Coordinator",
4868 + "company": "Yamia",
4869 + "country": "Czech Republic",
4870 + "city": "Tlučná",
4871 + "street_address": "31594 Glacier Hill Way",
4872 + "phone": "+420 524 920 5988",
4873 + "username": "rde90",
4874 + "age": 20,
4875 + "birth_day": "1932-04-07"
4876 + },
4877 + {
4878 + "id": 326,
4879 + "full_name": "Issi Fallens",
4880 + "email": "ifallens91@cisco.com",
4881 + "gender": "Female",
4882 + "job_title": "Tax Accountant",
4883 + "company": "Kazu",
4884 + "country": "Vietnam",
4885 + "city": "Thị Trấn Yên Thế",
4886 + "street_address": "39 Cherokee Pass",
4887 + "phone": "+84 453 780 6961",
4888 + "username": "ifallens91",
4889 + "age": 59,
4890 + "birth_day": "1949-06-26"
4891 + },
4892 + {
4893 + "id": 327,
4894 + "full_name": "Nikolaos Domotor",
4895 + "email": "ndomotor92@forbes.com",
4896 + "gender": "Male",
4897 + "job_title": "Environmental Specialist",
4898 + "company": "Livefish",
4899 + "country": "Sweden",
4900 + "city": "Partille",
4901 + "street_address": "56647 Milwaukee Street",
4902 + "phone": "+46 402 759 2767",
4903 + "username": "ndomotor92",
4904 + "age": 59,
4905 + "birth_day": "1943-06-07"
4906 + },
4907 + {
4908 + "id": 328,
4909 + "full_name": "Ford Ilive",
4910 + "email": "filive93@accuweather.com",
4911 + "gender": "Male",
4912 + "job_title": "Financial Advisor",
4913 + "company": "Fivespan",
4914 + "country": "Russia",
4915 + "city": "Shali",
4916 + "street_address": "92 Lindbergh Alley",
4917 + "phone": "+7 350 419 3153",
4918 + "username": "filive93",
4919 + "age": 53,
4920 + "birth_day": "1988-04-12"
4921 + },
4922 + {
4923 + "id": 329,
4924 + "full_name": "Marty Kelmere",
4925 + "email": "mkelmere94@shareasale.com",
4926 + "gender": "Female",
4927 + "job_title": "Assistant Professor",
4928 + "company": "Kimia",
4929 + "country": "Kuwait",
4930 + "city": "Bayān",
4931 + "street_address": "82 Sachtjen Park",
4932 + "phone": "+965 996 701 6373",
4933 + "username": "mkelmere94",
4934 + "age": 48,
4935 + "birth_day": "1963-03-04"
4936 + },
4937 + {
4938 + "id": 330,
4939 + "full_name": "Chadwick Lardnar",
4940 + "email": "clardnar95@shop-pro.jp",
4941 + "gender": "Male",
4942 + "job_title": "Nurse",
4943 + "company": "Avamba",
4944 + "country": "Indonesia",
4945 + "city": "Sukaharja",
4946 + "street_address": "8 Drewry Way",
4947 + "phone": "+62 374 321 8762",
4948 + "username": "clardnar95",
4949 + "age": 26,
4950 + "birth_day": "1947-06-30"
4951 + },
4952 + {
4953 + "id": 331,
4954 + "full_name": "Jamal Gloster",
4955 + "email": "jgloster96@cyberchimps.com",
4956 + "gender": "Male",
4957 + "job_title": "Senior Quality Engineer",
4958 + "company": "Quimm",
4959 + "country": "Indonesia",
4960 + "city": "Prengtale",
4961 + "street_address": "1 Stoughton Court",
4962 + "phone": "+62 355 269 6102",
4963 + "username": "jgloster96",
4964 + "age": 28,
4965 + "birth_day": "1937-01-02"
4966 + },
4967 + {
4968 + "id": 332,
4969 + "full_name": "Tatiania Cregg",
4970 + "email": "tcregg97@answers.com",
4971 + "gender": "Female",
4972 + "job_title": "Professor",
4973 + "company": "Mybuzz",
4974 + "country": "Botswana",
4975 + "city": "Mathambgwane",
4976 + "street_address": "1564 Bluestem Terrace",
4977 + "phone": "+267 215 560 7943",
4978 + "username": "tcregg97",
4979 + "age": 59,
4980 + "birth_day": "1966-03-01"
4981 + },
4982 + {
4983 + "id": 333,
4984 + "full_name": "Ferrel MacParlan",
4985 + "email": "fmacparlan98@phoca.cz",
4986 + "gender": "Male",
4987 + "job_title": "Budget/Accounting Analyst II",
4988 + "company": "Yadel",
4989 + "country": "Vietnam",
4990 + "city": "Bình Thủy",
4991 + "street_address": "58625 Kenwood Trail",
4992 + "phone": "+84 112 817 5442",
4993 + "username": "fmacparlan98",
4994 + "age": 30,
4995 + "birth_day": "1970-05-19"
4996 + },
4997 + {
4998 + "id": 334,
4999 + "full_name": "Wheeler Payley",

This file is too large to show in full.

src/assets/data/flights.json new
+25292
@@ -0,0 +1,25292 @@
1 +{
2 + "airportsFields": ["name", "city", "country", "longitude", "latitude"],
3 + "airlineFields": ["name", "country"],
4 + "airports": [
5 + ["Goroka", "Goroka", "Papua New Guinea", 145.391881, -6.081689],
6 + ["Madang", "Madang", "Papua New Guinea", 145.7887, -5.207083],
7 + ["Mount Hagen", "Mount Hagen", "Papua New Guinea", 144.295861, -5.826789],
8 + ["Nadzab", "Nadzab", "Papua New Guinea", 146.726242, -6.569828],
9 + ["Port Moresby Jacksons Intl", "Port Moresby", "Papua New Guinea", 147.22005, -9.443383],
10 + ["Wewak Intl", "Wewak", "Papua New Guinea", 143.669186, -3.583828],
11 + ["Narsarsuaq", "Narssarssuaq", "Greenland", -45.425978, 61.160517],
12 + ["Nuuk", "Godthaab", "Greenland", -51.678064, 64.190922],
13 + ["Sondre Stromfjord", "Sondrestrom", "Greenland", -50.689325, 67.016969],
14 + ["Thule Air Base", "Thule", "Greenland", -68.703161, 76.531203],
15 + ["Akureyri", "Akureyri", "Iceland", -18.072703, 65.659994],
16 + ["Egilsstadir", "Egilsstadir", "Iceland", -14.401389, 65.283333],
17 + ["Hornafjordur", "Hofn", "Iceland", -15.227222, 64.295556],
18 + ["Husavik", "Husavik", "Iceland", -17.425978, 65.952328],
19 + ["Isafjordur", "Isafjordur", "Iceland", -23.135278, 66.058056],
20 + ["Keflavik International Airport", "Keflavik", "Iceland", -22.605556, 63.985],
21 + ["Patreksfjordur", "Patreksfjordur", "Iceland", -23.965, 65.555833],
22 + ["Reykjavik", "Reykjavik", "Iceland", -21.940556, 64.13],
23 + ["Siglufjordur", "Siglufjordur", "Iceland", -18.916667, 66.133333],
24 + ["Vestmannaeyjar", "Vestmannaeyjar", "Iceland", -20.278875, 63.424303],
25 + ["Sault Ste Marie", "Sault Sainte Marie", "Canada", -84.509445, 46.485001],
26 + ["Winnipeg St Andrews", "Winnipeg", "Canada", -97.0325, 50.056389],
27 + ["Shearwater", "Halifax", "Canada", -63.499444, 44.639721],
28 + ["St Anthony", "St. Anthony", "Canada", -56.083056, 51.391944],
29 + ["Tofino", "Tofino", "Canada", -125.7725, 49.082222],
30 + ["Kugaaruk", "Pelly Bay", "Canada", -89.808056, 68.534444],
31 + ["Baie Comeau", "Baie Comeau", "Canada", -68.204444, 49.1325],
32 + ["Bagotville", "Bagotville", "Canada", -70.996391, 48.330555],
33 + ["Baker Lake", "Baker Lake", "Canada", -96.077778, 64.298889],
34 + ["Campbell River", "Campbell River", "Canada", -125.270833, 49.950832],
35 + ["Brandon Muni", "Brandon", "Canada", -99.951944, 49.91],
36 + ["Cambridge Bay", "Cambridge Bay", "Canada", -105.138333, 69.108055],
37 + ["Nanaimo", "Nanaimo", "Canada", -123.870167, 49.052333],
38 + ["Castlegar", "Castlegar", "Canada", -117.6325, 49.296389],
39 + ["Miramichi", "Chatham", "Canada", -65.449167, 47.007778],
40 + ["Charlo", "Charlo", "Canada", -66.330278, 47.990833],
41 + ["Kugluktuk", "Coppermine", "Canada", -115.143889, 67.816667],
42 + ["Coronation", "Coronation", "Canada", -111.445278, 52.075001],
43 + ["Chilliwack", "Chilliwack", "Canada", -121.93889, 49.152779],
44 + ["Clyde River", "Clyde River", "Canada", -68.516667, 70.486111],
45 + ["Fairmont Hot Springs", "Coral Harbour", "Canada", -83.359444, 64.193333],
46 + ["Dawson City", "Dawson", "Canada", -139.127778, 64.043056],
47 + ["Burwash", "Burwash", "Canada", -139.040556, 61.371111],
48 + ["Princeton", "Princeton", "Canada", -120.511389, 49.468056],
49 + ["Deer Lake", "Deer Lake", "Canada", -57.391388, 49.210833],
50 + ["Dease Lake", "Dease Lake", "Canada", -130.032222, 58.422222],
51 + ["Dauphin Barker", "Dauphin", "Canada", -100.0525, 51.100834],
52 + ["Dawson Creek", "Dawson Creek", "Canada", -120.183, 55.742333],
53 + ["Edmonton Intl", "Edmonton", "Canada", -113.579722, 53.309723],
54 + ["Arviat", "Eskimo Point", "Canada", -94.070833, 61.094166],
55 + ["Estevan", "Estevan", "Canada", -102.965833, 49.210278],
56 + ["Edson", "Edson", "Canada", -116.465, 53.578888],
57 + ["Eureka", "Eureka", "Canada", -85.814167, 79.994722],
58 + ["Inuvik Mike Zubko", "Inuvik", "Canada", -133.482778, 68.304167],
59 + ["Iqaluit", "Iqaluit", "Canada", -68.555832, 63.75639],
60 + ["Fredericton", "Fredericton", "Canada", -66.537222, 45.868889],
61 + ["Forestville", "Forestville", "Canada", -69.097222, 48.746111],
62 + ["Flin Flon", "Flin Flon", "Canada", -101.681667, 54.678055],
63 + ["Fort Resolution", "Fort Resolution", "Canada", -113.689722, 61.180832],
64 + ["Fort Simpson", "Fort Simpson", "Canada", -121.236525, 61.760153],
65 + ["Kingston", "Kingston", "Canada", -76.596944, 44.225277],
66 + ["La Grande Riviere", "La Grande Riviere", "Canada", -77.704167, 53.625278],
67 + ["Gaspe", "Gaspe", "Canada", -64.478611, 48.775278],
68 + ["Geraldton Greenstone Regional", "Geraldton", "Canada", -86.939445, 49.778332],
69 + ["Iles De La Madeleine", "Iles De La Madeleine", "Canada", -61.778056, 47.424721],
70 + ["Hudson Bay", "Hudson Bay", "Canada", -102.31139, 52.816666],
71 + ["Dryden Rgnl", "Dryden", "Canada", -92.744167, 49.831667],
72 + ["Ulukhaktok Holman", "Holman Island", "Canada", -117.806111, 70.762778],
73 + ["Gjoa Haven", "Gjoa Haven", "Canada", -95.849722, 68.635556],
74 + ["Hamilton", "Hamilton", "Canada", -79.935, 43.173611],
75 + ["St Hubert", "Montreal", "Canada", -73.416944, 45.5175],
76 + ["Hay River", "Hay River", "Canada", -115.782778, 60.839722],
77 + ["Halifax Intl", "Halifax", "Canada", -63.50861, 44.880833],
78 + ["Atikokan Muni", "Atikokan", "Canada", -91.638611, 48.773888],
79 + ["Pond Inlet", "Pond Inlet", "Canada", -77.966667, 72.683334],
80 + ["St Jean", "St. Jean", "Canada", -73.281111, 45.294445],
81 + ["Stephenville", "Stephenville", "Canada", -58.549999, 48.544167],
82 + ["Kamloops", "Kamloops", "Canada", -120.444444, 50.702222],
83 + ["Waterloo", "Waterloo", "Canada", -80.378611, 43.460833],
84 + ["Schefferville", "Schefferville", "Canada", -66.805278, 54.805278],
85 + ["Kindersley", "Kindersley", "Canada", -109.180833, 51.5175],
86 + ["Buttonville Muni", "Toronto", "Canada", -79.37, 43.862221],
87 + ["Chapleau", "Chapleau", "Canada", -83.346667, 47.82],
88 + ["Meadow Lake", "Meadow Lake", "Canada", -108.522778, 54.125278],
89 + ["Lloydminster", "Lloydminster", "Canada", -110.0725, 53.309166],
90 + ["Alert", "Alert", "Canada", -62.280556, 82.517778],
91 + ["Kelowna", "Kelowna", "Canada", -119.377778, 49.956112],
92 + ["Mayo", "Mayo", "Canada", -135.868333, 63.616389],
93 + ["Moose Jaw Air Vice Marshal C M Mcewen", "Moose Jaw", "Canada", -105.559167, 50.330278],
94 + ["Fort Mcmurray", "Fort Mcmurray", "Canada", -111.221944, 56.653333],
95 + ["Moosonee", "Moosonee", "Canada", -80.607778, 51.291111],
96 + ["Maniwaki", "Maniwaki", "Canada", -75.990556, 46.272778],
97 + ["Montreal Intl Mirabel", "Montreal", "Canada", -74.005278, 45.681944],
98 + ["Natashquan", "Natashquan", "Canada", -61.789167, 50.19],
99 + ["Gatineau", "Gatineau", "Canada", -75.563589, 45.521694],
100 + ["Matagami", "Matagami", "Canada", -77.802778, 49.761667],
101 + ["Old Crow", "Old Crow", "Canada", -139.839167, 67.570556],
102 + ["Cold Lake", "Cold Lake", "Canada", -110.279444, 54.404999],
103 + ["High Level", "High Level", "Canada", -117.164722, 58.621389],
104 + ["Ottawa Macdonald Cartier Intl", "Ottawa", "Canada", -75.669167, 45.3225],
105 + ["Prince Albert Glass Field", "Prince Albert", "Canada", -105.672778, 53.214167],
106 + ["Peace River", "Peace River", "Canada", -117.447222, 56.226944],
107 + ["Southport", "Portage-la-prairie", "Canada", -98.273889, 49.903056],
108 + ["Pitt Meadows", "Pitt Meadows", "Canada", -122.71, 49.21611],
109 + ["Pickle Lake", "Pickle Lake", "Canada", -90.214167, 51.446388],
110 + ["Port Menier", "Port Menier", "Canada", -64.288611, 49.836389],
111 + ["Peterborough", "Peterborough", "Canada", -78.363333, 44.23],
112 + ["Prince Rupert", "Prince Pupert", "Canada", -130.444722, 54.28611],
113 + ["Fort Chipewyan", "Fort Chipewyan", "Canada", -111.117222, 58.767223],
114 + ["Muskoka", "Muskoka", "Canada", -79.303333, 44.974722],
115 + ["Quebec Jean Lesage Intl", "Quebec", "Canada", -71.393333, 46.791111],
116 + ["Red Deer Regional", "Red Deer Industrial", "Canada", -113.894444, 52.182222],
117 + ["Windsor", "Windsor", "Canada", -82.955556, 42.275556],
118 + ["Watson Lake", "Watson Lake", "Canada", -128.8225, 60.116389],
119 + ["Kenora", "Kenora", "Canada", -94.363056, 49.788334],
120 + ["Lethbridge", "Lethbridge", "Canada", -112.799722, 49.630278],
121 + ["Greater Moncton Intl", "Moncton", "Canada", -64.678611, 46.112221],
122 + ["Comox", "Comox", "Canada", -124.886667, 49.710833],
123 + ["Regina Intl", "Regina", "Canada", -104.665833, 50.431944],
124 + ["Thunder Bay", "Thunder Bay", "Canada", -89.323889, 48.371944],
125 + ["Grande Prairie", "Grande Prairie", "Canada", -118.885, 55.179722],
126 + ["Yorkton Muni", "Yorkton", "Canada", -102.461667, 51.264721],
127 + ["North Battleford", "North Battleford", "Canada", -108.24361, 52.769167],
128 + ["Gander Intl", "Gander", "Canada", -54.568056, 48.936944],
129 + ["Sydney", "Sydney", "Canada", -60.047779, 46.161388],
130 + ["Quesnel", "Quesnel", "Canada", -122.510278, 53.026112],
131 + ["Resolute Bay", "Resolute", "Canada", -94.969444, 74.716944],
132 + ["Riviere Du Loup", "Riviere Du Loup", "Canada", -69.584722, 47.764444],
133 + ["Roberval", "Roberval", "Canada", -72.265556, 48.52],
134 + ["Rocky Mountain House", "Rocky Mountain House", "Canada", -114.904167, 52.429722],
135 + ["Rankin Inlet", "Rankin Inlet", "Canada", -92.115833, 62.81139],
136 + ["Sudbury", "Sudbury", "Canada", -80.798889, 46.625],
137 + ["Sherbrooke", "Sherbrooke", "Canada", -71.691389, 45.438611],
138 + ["Saint John", "St. John", "Canada", -65.890278, 45.316111],
139 + ["Fort Smith", "Fort Smith", "Canada", -111.961944, 60.020278],
140 + ["Nanisivik", "Nanisivik", "Canada", -84.613611, 72.982222],
141 + ["Summerside", "Summerside", "Canada", -63.833611, 46.440556],
142 + ["Sachs Harbour", "Sachs Harbour", "Canada", -125.2425, 71.993889],
143 + ["Cape Dorset", "Cape Dorset", "Canada", -76.526667, 64.23],
144 + ["Thompson", "Thompson", "Canada", -97.864166, 55.801111],
145 + ["Trenton", "Trenton", "Canada", -77.528056, 44.118889],
146 + ["Timmins", "Timmins", "Canada", -81.376667, 48.569721],
147 + ["City Centre", "Toronto", "Canada", -79.396167, 43.627499],
148 + ["Tuktoyaktuk", "Tuktoyaktuk", "Canada", -133.026389, 69.433334],
149 + ["Pierre Elliott Trudeau Intl", "Montreal", "Canada", -73.740833, 45.470556],
150 + ["Repulse Bay", "Repulse Bay", "Canada", -86.224722, 66.521389],
151 + ["Hall Beach", "Hall Beach", "Canada", -81.243611, 68.776111],
152 + ["Rouyn Noranda", "Rouyn", "Canada", -78.835556, 48.206111],
153 + ["La Ronge", "La Ronge", "Canada", -105.261944, 55.15139],
154 + ["Vermilion", "Vermillion", "Canada", -110.82389, 53.355833],
155 + ["Qikiqtarjuaq", "Broughton Island", "Canada", -64.031389, 67.545833],
156 + ["Val D Or", "Val D'or", "Canada", -77.782778, 48.053333],
157 + ["Kuujjuaq", "Quujjuaq", "Canada", -68.426944, 58.096111],
158 + ["Norman Wells", "Norman Wells", "Canada", -126.798219, 65.281617],
159 + ["Vancouver Intl", "Vancouver", "Canada", -123.184444, 49.193889],
160 + ["Buffalo Narrows", "Buffalo Narrows", "Canada", -108.4175, 55.841944],
161 + ["Wiarton", "Wiarton", "Canada", -81.107222, 44.745834],
162 + ["Petawawa", "Petawawa", "Canada", -77.319168, 45.952221],
163 + ["Winnipeg Intl", "Winnipeg", "Canada", -97.239886, 49.910036],
164 + ["Wabush", "Wabush", "Canada", -66.864444, 52.921944],
165 + ["Williams Lake", "Williams Lake", "Canada", -122.054167, 52.183056],
166 + ["Wrigley", "Wrigley", "Canada", -123.436667, 63.209444],
167 + ["Canadian Rockies Intl", "Cranbrook", "Canada", -115.781944, 49.612222],
168 + ["Edmonton City Centre", "Edmonton", "Canada", -113.520556, 53.5725],
169 + ["Saskatoon J G Diefenbaker Intl", "Saskatoon", "Canada", -106.699722, 52.170834],
170 + ["Medicine Hat", "Medicine Hat", "Canada", -110.720833, 50.01889],
171 + ["Fort St John", "Fort Saint John", "Canada", -120.740278, 56.238056],
172 + ["Sioux Lookout", "Sioux Lookout", "Canada", -91.905278, 50.113889],
173 + ["Pangnirtung", "Pangnirtung", "Canada", -65.713611, 66.145],
174 + ["Timiskaming Rgnl", "Earlton", "Canada", -79.848889, 47.695],
175 + ["Prince George", "Prince George", "Canada", -122.678889, 53.889444],
176 + ["Terrace", "Terrace", "Canada", -128.576219, 54.468508],
177 + ["London", "London", "Canada", -81.151111, 43.033056],
178 + ["Abbotsford", "Abbotsford", "Canada", -122.360556, 49.025278],
179 + ["Whitehorse Intl", "Whitehorse", "Canada", -135.067269, 60.709553],
180 + ["North Bay", "North Bay", "Canada", -79.422778, 46.363611],
181 + ["Calgary Intl", "Calgary", "Canada", -114.020278, 51.113888],
182 + ["Smithers", "Smithers", "Canada", -127.182778, 54.824722],
183 + ["Fort Nelson", "Fort Nelson", "Canada", -122.596944, 58.836389],
184 + ["Penticton", "Penticton", "Canada", -119.602222, 49.463056],
185 + ["Charlottetown", "Charlottetown", "Canada", -63.121111, 46.290001],
186 + ["Taloyoak", "Spence Bay", "Canada", -93.576667, 69.546667],
187 + ["Victoria Intl", "Victoria", "Canada", -123.425833, 48.646944],
188 + ["Lynn Lake", "Lynn Lake", "Canada", -101.07611, 56.863888],
189 + ["Swift Current", "Swift Current", "Canada", -107.690556, 50.291944],
190 + ["Churchill", "Churchill", "Canada", -94.065, 58.739167],
191 + ["Goose Bay", "Goose Bay", "Canada", -60.425833, 53.319168],
192 + ["St Johns Intl", "St. John's", "Canada", -52.751945, 47.61861],
193 + ["Kapuskasing", "Kapuskasing", "Canada", -82.4675, 49.413889],
194 + ["Armstrong", "Armstrong", "Canada", -88.909721, 50.290279],
195 + ["Mont Joli", "Mont Joli", "Canada", -68.208056, 48.608612],
196 + ["Lester B Pearson Intl", "Toronto", "Canada", -79.630556, 43.677223],
197 + ["Downsview", "Toronto", "Canada", -79.465556, 43.7425],
198 + ["Gore Bay Manitoulin", "Gore Bay", "Canada", -82.567778, 45.885277],
199 + ["Yellowknife", "Yellowknife", "Canada", -114.440278, 62.462778],
200 + ["Slave Lake", "Slave Lake", "Canada", -114.777222, 55.293056],
201 + ["Sandspit", "Sandspit", "Canada", -131.813833, 53.254333],
202 + ["Chris Hadfield", "Sarnia", "Canada", -82.308889, 42.999444],
203 + ["Port Hardy", "Port Hardy", "Canada", -127.366667, 50.680556],
204 + ["Whitecourt", "Whitecourt", "Canada", -115.786667, 54.14389],
205 + ["Sept Iles", "Sept-iles", "Canada", -66.265556, 50.223333],
206 + ["Teslin", "Teslin", "Canada", -132.742778, 60.172779],
207 + ["Greenwood", "Greenwood", "Canada", -64.916944, 44.984444],
208 + ["Faro", "Faro", "Canada", -133.375833, 62.2075],
209 + ["Fort Mcpherson", "Fort Mcpherson", "Canada", -134.860556, 67.4075],
210 + ["Blida", "Blida", "Algeria", 2.814167, 36.503613],
211 + ["Bou Saada", "Bou Saada", "Algeria", 4.206389, 35.3325],
212 + ["Soummam", "Bejaja", "Algeria", 5.069922, 36.711997],
213 + ["Houari Boumediene", "Algier", "Algeria", 3.215408, 36.691014],
214 + ["Tiska", "Djanet", "Algeria", 9.452444, 24.292767],
215 + ["Boufarik", "Boufarik", "Algeria", 2.876111, 36.545834],
216 + ["Reggane", "Reggan", "Algeria", 0.285647, 26.710103],
217 + ["Illizi Takhamalt", "Illizi", "Algeria", 8.622653, 26.723536],
218 + ["Ain Oussera", "Ain Oussera", "Algeria", 2.878714, 35.525414],
219 + ["Tamanrasset", "Tamanrasset", "Algeria", 5.451075, 22.811461],
220 + ["Jijel", "Jijel", "Algeria", 5.873608, 36.795136],
221 + ["Mecheria", "Mecheria", "Algeria", -0.242353, 33.535853],
222 + ["Relizane", "Relizane", "Algeria", 0.626272, 35.752239],
223 + ["Annaba", "Annaba", "Algeria", 7.809167, 36.822225],
224 + ["Mohamed Boudiaf Intl", "Constantine", "Algeria", 6.620386, 36.276028],
225 + ["Cheikh Larbi Tebessi", "Tebessa", "Algeria", 8.120717, 35.431611],
226 + ["Hassi R Mel", "Tilrempt", "Algeria", 3.311542, 32.930431],
227 + ["Bou Chekif", "Tiaret", "Algeria", 1.463147, 35.341136],
228 + ["Bou Sfer", "Bou Sfer", "Algeria", -0.805389, 35.735389],
229 + ["Tindouf", "Tindouf", "Algeria", -8.167103, 27.700372],
230 + ["Ech Cheliff", "Ech-cheliff", "Algeria", 1.331775, 36.212658],
231 + ["Tafaraoui", "Oran", "Algeria", -0.532278, 35.542444],
232 + ["Zenata", "Tlemcen", "Algeria", -1.45, 35.016667],
233 + ["Es Senia", "Oran", "Algeria", -0.621183, 35.623858],
234 + ["Sidi Bel Abbes", "Sidi Bel Abbes", "Algeria", -0.593275, 35.171775],
235 + ["Ghriss", "Ghriss", "Algeria", 0.147142, 35.207725],
236 + ["Touat Cheikh Sidi Mohamed Belkebir", "Adrar", "Algeria", -0.186414, 27.837589],
237 + ["Biskra", "Biskra", "Algeria", 5.738231, 34.793289],
238 + ["El Golea", "El Golea", "Algeria", 2.859586, 30.571294],
239 + ["Noumerat", "Ghardaia", "Algeria", 3.794114, 32.384106],
240 + ["Oued Irara", "Hassi Messaoud", "Algeria", 6.140444, 31.672972],
241 + ["In Salah", "In Salah", "Algeria", 2.512017, 27.251022],
242 + ["Sidi Mahdi", "Touggourt", "Algeria", 6.088672, 33.067803],
243 + ["Laghouat", "Laghouat", "Algeria", 2.928344, 33.764383],
244 + ["Timimoun", "Timimoun", "Algeria", 0.276033, 29.237119],
245 + ["Ouargla", "Ouargla", "Algeria", 5.412778, 31.917223],
246 + ["In Amenas", "Zarzaitine", "Algeria", 9.642911, 28.05155],
247 + ["Cadjehoun", "Cotonou", "Benin", 2.384353, 6.357228],
248 + ["Ouagadougou", "Ouagadougou", "Burkina Faso", -1.512417, 12.353194],
249 + ["Bobo Dioulasso", "Bobo-dioulasso", "Burkina Faso", -4.330969, 11.160056],
250 + ["Kotoka Intl", "Accra", "Ghana", -0.166786, 5.605186],
251 + ["Tamale", "Tamale", "Ghana", -0.863214, 9.557192],
252 + ["Wa", "Wa", "Ghana", -2.507694, 10.082664],
253 + ["Sunyani", "Sunyani", "Ghana", -2.328756, 7.361828],
254 + ["Takoradi", "Takoradi", "Ghana", -1.774756, 4.896056],
255 + ["Abidjan Felix Houphouet Boigny Intl", "Abidjan", "Cote d'Ivoire", -3.926294, 5.261386],
256 + ["Bouake", "Bouake", "Cote d'Ivoire", -5.073667, 7.7388],
257 + ["Daloa", "Daloa", "Cote d'Ivoire", -6.473189, 6.792808],
258 + ["Korhogo", "Korhogo", "Cote d'Ivoire", -5.556664, 9.387183],
259 + ["Man", "Man", "Cote d'Ivoire", -7.587364, 7.272069],
260 + ["San Pedro", "San Pedro", "Cote d'Ivoire", -6.660817, 4.746717],
261 + ["Yamoussoukro", "Yamoussoukro", "Cote d'Ivoire", -5.365581, 6.903167],
262 + ["Nnamdi Azikiwe Intl", "Abuja", "Nigeria", 7.263172, 9.006792],
263 + ["Akure", "Akure", "Nigeria", 5.301008, 7.246739],
264 + ["Benin", "Benin", "Nigeria", 5.599503, 6.316981],
265 + ["Calabar", "Calabar", "Nigeria", 8.347197, 4.976019],
266 + ["Enugu", "Enugu", "Nigeria", 7.561961, 6.474272],
267 + ["Gusau", "Gusau", "Nigeria", 6.696111, 12.171667],
268 + ["Ibadan", "Ibadan", "Nigeria", 3.978333, 7.362458],
269 + ["Ilorin", "Ilorin", "Nigeria", 4.493919, 8.440211],
270 + ["Yakubu Gowon", "Jos", "Nigeria", 8.86905, 9.639828],
271 + ["Kaduna", "Kaduna", "Nigeria", 7.320114, 10.696025],
272 + ["Mallam Aminu Intl", "Kano", "Nigeria", 8.524622, 12.047589],
273 + ["Maiduguri", "Maiduguri", "Nigeria", 13.08095, 11.855347],
274 + ["Makurdi", "Makurdi", "Nigeria", 8.613939, 7.703883],
275 + ["Murtala Muhammed", "Lagos", "Nigeria", 3.321156, 6.577369],
276 + ["Minna New", "Minna", "Nigeria", 6.462256, 9.652172],
277 + ["Port Harcourt Intl", "Port Hartcourt", "Nigeria", 6.949594, 5.015494],
278 + ["Sadiq Abubakar Iii Intl", "Sokoto", "Nigeria", 5.207189, 12.916322],
279 + ["Yola", "Yola", "Nigeria", 12.430422, 9.257553],
280 + ["Zaria", "Zaria", "Nigeria", 7.685806, 11.130192],
281 + ["Maradi", "Maradi", "Niger", 7.126753, 13.502531],
282 + ["Diori Hamani", "Niamey", "Niger", 2.183614, 13.481547],
283 + ["Tahoua", "Tahoua", "Niger", 5.265358, 14.875658],
284 + ["Manu Dayak", "Agadez", "Niger", 8.000114, 16.965997],
285 + ["Dirkou", "Dirkou", "Niger", 12.86865, 18.968703],
286 + ["Diffa", "Diffa", "Niger", 12.626686, 13.372894],
287 + ["Zinder", "Zinder", "Niger", 8.983761, 13.778997],
288 + ["Habib Bourguiba Intl", "Monastir", "Tunisia", 10.754722, 35.758056],
289 + ["Carthage", "Tunis", "Tunisia", 10.227217, 36.851033],
290 + ["Sidi Ahmed Air Base", "Bizerte", "Tunisia", 9.791453, 37.245447],
291 + ["Remada", "Remada", "Tunisia", 10.382108, 32.306156],
292 + ["Gafsa", "Gafsa", "Tunisia", 8.822503, 34.422022],
293 + ["Gabes", "Gabes", "Tunisia", 10.103333, 33.876919],
294 + ["Borj El Amri", "Bordj El Amri", "Tunisia", 9.943147, 36.721339],
295 + ["Zarzis", "Djerba", "Tunisia", 10.775461, 33.875031],
296 + ["El Borma", "El Borma", "Tunisia", 9.254619, 31.704281],
297 + ["Thyna", "Sfax", "Tunisia", 10.690972, 34.717953],
298 + ["Nefta", "Tozeur", "Tunisia", 8.110556, 33.939722],
299 + ["Niamtougou International", "Niatougou", "Togo", 1.09125, 9.767333],
300 + ["Gnassingbe Eyadema Intl", "Lome", "Togo", 1.254511, 6.165611],
301 + ["Deurne", "Antwerp", "Belgium", 4.460278, 51.189444],
302 + ["Beauvechain", "Beauvechain", "Belgium", 4.768333, 50.75861],
303 + ["Kleine Brogel", "Kleine Brogel", "Belgium", 5.47, 51.168333],
304 + ["Brussels Natl", "Brussels", "Belgium", 4.484444, 50.901389],
305 + ["Bertrix", "Bertrix", "Belgium", 5.223889, 49.891667],
306 + ["Brussels South", "Charleroi", "Belgium", 4.453817, 50.459197],
307 + ["Chievres Ab", "Chievres", "Belgium", 3.831, 50.575833],
308 + ["Koksijde", "Koksijde", "Belgium", 2.652778, 51.090278],
309 + ["Florennes", "Florennes", "Belgium", 4.645833, 50.243333],
310 + ["Wevelgem", "Kortrijk-vevelgem", "Belgium", 3.204722, 50.817222],
311 + ["Liege", "Liege", "Belgium", 5.443222, 50.637417],
312 + ["Oostende", "Ostend", "Belgium", 2.862222, 51.198889],
313 + ["Zutendaal", "Zutendaal", "Belgium", 5.590556, 50.9475],
314 + ["Sint Truiden", "Sint-truiden", "Belgium", 5.201667, 50.791944],
315 + ["Saint Hubert Mil", "St.-hubert", "Belgium", 5.404167, 50.035833],
316 + ["Ursel", "Ursel", "Belgium", 3.474361, 51.144133],
317 + ["Weelde", "Weelde", "Belgium", 4.960194, 51.394783],
318 + ["Zoersel", "Zoersel", "Belgium", 4.753333, 51.264722],
319 + ["Bautzen", "Bautzen", "Germany", 14.519747, 51.193531],
320 + ["Altenburg Nobitz", "Altenburg", "Germany", 12.506361, 50.981817],
321 + ["Dessau", "Dessau", "Germany", 12.184033, 51.831828],
322 + ["Eisenhuttenstadt", "Eisenhuettenstadt", "Germany", 14.585667, 52.197333],
323 + ["Putnam County Airport", "Greencastle", "United States", -86.8138056, 39.6335556],
324 + ["Grossenhain", "Suhl", "Germany", 13.554973, 51.308111],
325 + ["Merseburg", "Muehlhausen", "Germany", 11.940833, 51.363],
326 + ["Halle Oppin", "Halle", "Germany", 12.052667, 51.552],
327 + ["Riesa Gohlis", "Riesa", "Germany", 13.356, 51.2935],
328 + ["Rechlin Larz", "Rechlin-laerz", "Germany", 12.753139, 53.306417],
329 + ["Strausberg", "Strausberg", "Germany", 13.915683, 52.579978],
330 + ["Schonhagen", "Schoenhagen", "Germany", 13.158408, 52.203258],
331 + ["Barth", "Barth", "Germany", 12.699705, 54.33754],
332 + ["Jena Schongleina", "Jena", "Germany", 11.714519, 50.915161],
333 + ["Kyritz", "Kyritz", "Germany", 12.425333, 52.918833],
334 + ["Magdeburg", "Magdeburg", "Germany", 11.626467, 52.073658],
335 + ["Rothenburg Gorlitz", "Rothenburg/ol", "Germany", 14.95, 51.363167],
336 + ["Anklam", "Anklam", "Germany", 13.669131, 53.8327],
337 + ["Cottbus Drewitz", "Cottbus", "Germany", 14.531986, 51.889475],
338 + ["Kamenz", "Kamenz", "Germany", 14.129, 51.29625],
339 + ["Schonefeld", "Berlin", "Germany", 13.5225, 52.380001],
340 + ["Dresden", "Dresden", "Germany", 13.767161, 51.132767],
341 + ["Erfurt", "Erfurt", "Germany", 10.958106, 50.979811],
342 + ["Frankfurt Main", "Frankfurt", "Germany", 8.543125, 50.026421],
343 + ["Munster Osnabruck", "Munster", "Germany", 7.684831, 52.134642],
344 + ["Hamburg", "Hamburg", "Germany", 9.988228, 53.630389],
345 + ["Tempelhof", "Berlin", "Germany", 13.403944, 52.473025],
346 + ["Koln Bonn", "Cologne", "Germany", 7.142744, 50.865917],
347 + ["Dusseldorf", "Duesseldorf", "Germany", 6.766775, 51.289453],
348 + ["Franz Josef Strauss", "Munich", "Germany", 11.786086, 48.353783],
349 + ["Nurnberg", "Nuernberg", "Germany", 11.066897, 49.4987],
350 + ["Leipzig Halle", "Leipzig", "Germany", 12.241633, 51.432447],
351 + ["Saarbrucken", "Saarbruecken", "Germany", 7.109508, 49.214553],
352 + ["Stuttgart", "Stuttgart", "Germany", 9.221964, 48.689878],
353 + ["Tegel", "Berlin", "Germany", 13.287711, 52.559686],
354 + ["Hannover", "Hannover", "Germany", 9.685078, 52.461056],
355 + ["Neuenland", "Bremen", "Germany", 8.786667, 53.0475],
356 + ["Egelsbach", "Egelsbach", "Germany", 8.6415, 49.960833],
357 + ["Frankfurt Hahn", "Hahn", "Germany", 7.263892, 49.948672],
358 + ["Mannheim City", "Mannheim", "Germany", 8.514264, 49.472706],
359 + ["Allendorf Eder", "Allendorf", "Germany", 8.680839, 51.034878],
360 + ["Worms", "Worms", "Germany", 8.3684, 49.606511],
361 + ["Mainz Finthen", "Mainz", "Germany", 8.148336, 49.968931],
362 + ["Eisenach Kindel", "Eisenach", "Germany", 10.472711, 50.992797],
363 + ["Siegerland", "Siegerland", "Germany", 8.082969, 50.707658],
364 + ["Hamburg Finkenwerder", "Hamburg", "Germany", 9.837025, 53.535886],
365 + ["Kiel Holtenau", "Kiel", "Germany", 10.145167, 54.3795],
366 + ["Lubeck Blankensee", "Luebeck", "Germany", 10.719222, 53.805367],
367 + ["Dahlemer Binz", "Dahlemer Binz", "Germany", 6.528083, 50.405888],
368 + ["Meinerzhagen", "Meinerzhagen", "Germany", 7.601944, 51.099445],
369 + ["Arnsberg Menden", "Arnsberg", "Germany", 7.899333, 51.483333],
370 + ["Essen Mulheim", "Essen", "Germany", 6.937333, 51.402333],
371 + ["Bielefeld", "Bielefeld", "Germany", 8.544833, 51.964833],
372 + ["Monchengladbach", "Moenchengladbach", "Germany", 6.504494, 51.230356],
373 + ["Paderborn Lippstadt", "Paderborn", "Germany", 8.616317, 51.614089],
374 + ["Stadtlohn Vreden", "Stadtlohn", "Germany", 6.840667, 51.995844],
375 + ["Dortmund", "Dortmund", "Germany", 7.612242, 51.518314],
376 + ["Augsburg", "Augsburg", "Germany", 10.931764, 48.425158],
377 + ["Biberach An Der Riss", "Biberach", "Germany", 9.762833, 48.111],
378 + ["Eggenfelden", "Eggenfelden", "Germany", 12.723667, 48.396167],
379 + ["Mindelheim Mattsies", "Mindelheim", "Germany", 10.524333, 48.108833],
380 + ["Oberpfaffenhofen", "Oberpfaffenhofen", "Germany", 11.283067, 48.081364],
381 + ["Straubing", "Straubing", "Germany", 12.518186, 48.90095],
382 + ["Vilshofen", "Vilshofen", "Germany", 13.195667, 48.635167],
383 + ["Leutkirch Unterzeil", "Leutkirch", "Germany", 10.014572, 47.859117],
384 + ["Friedrichshafen", "Friedrichshafen", "Germany", 9.511486, 47.671317],
385 + ["Schwerin Parchim", "Parchim", "Germany", 11.783436, 53.426997],
386 + ["Stendal Borstel", "Stendal", "Germany", 11.818333, 52.627778],
387 + ["Aalen Heidenheim Elchingen", "Aalen-heidenheim", "Germany", 10.264667, 48.777833],
388 + ["Bayreuth", "Bayreuth", "Germany", 11.638569, 49.984428],
389 + ["Burg Feuerstein", "Burg Feuerstein", "Germany", 11.133167, 49.793833],
390 + ["Hof Plauen", "Hof", "Germany", 11.854919, 50.288836],
391 + ["Hassfurt Schweinfurt", "Hassfurt", "Germany", 10.5295, 50.018],
392 + ["Koblenz Winningen", "Koblenz", "Germany", 7.528667, 50.3255],
393 + ["Trier Fohren", "Trier", "Germany", 6.788167, 49.8635],
394 + ["Speyer", "Speyer", "Germany", 8.451195, 49.302776],
395 + ["Zweibrucken", "Zweibruecken", "Germany", 7.400647, 49.209525],
396 + ["Donaueschingen Villingen", "Donaueschingen", "Germany", 8.522223, 47.973331],
397 + ["Freiburg", "Freiburg", "Germany", 7.832583, 48.022653],
398 + ["Mengen Hohentengen", "Mengen", "Germany", 9.372833, 48.053833],
399 + ["Schwabisch Hall", "Schwaebisch Hall", "Germany", 9.783956, 49.118317],
400 + ["Finsterwalde Schacksdorf", "Soest", "Germany", 13.738, 51.6075],
401 + ["Braunschweig Wolfsburg", "Braunschweig", "Germany", 10.556111, 52.319167],
402 + ["Kassel Calden", "Kassel", "Germany", 9.377631, 51.408394],
403 + ["Hildesheim", "Hildesheim", "Germany", 9.945667, 52.179833],
404 + ["Bremerhaven", "Bremerhaven", "Germany", 8.572878, 53.507081],
405 + ["Emden", "Emden", "Germany", 7.227408, 53.391186],
406 + ["Leer Papenburg", "Leer", "Germany", 7.442344, 53.271592],
407 + ["Wilhelmshaven Mariensiel", "Wilhelmshaven", "Germany", 8.053333, 53.504833],
408 + ["Borkum", "Borkum", "Germany", 6.709167, 53.5955],
409 + ["Norderney", "Norderney", "Germany", 7.230247, 53.706822],
410 + ["Flensburg Schaferhaus", "Flensburg", "Germany", 9.378214, 54.771772],
411 + ["Rendsburg Schachtholm", "Rendsburg", "Germany", 9.600803, 54.220928],
412 + ["Westerland Sylt", "Westerland", "Germany", 8.340472, 54.91325],
413 + ["Amari", "Armari Air Force Base", "Estonia", 24.208467, 59.260286],
414 + ["Kardla", "Kardla", "Estonia", 22.830733, 58.990756],
415 + ["Kuressaare", "Kuressaare", "Estonia", 22.509494, 58.229883],
416 + ["Parnu", "Parnu", "Estonia", 24.472819, 58.419044],
417 + ["Tallinn", "Tallinn-ulemiste International", "Estonia", 24.832844, 59.413317],
418 + ["Tartu", "Tartu", "Estonia", 26.690428, 58.307461],
419 + ["Enontekio", "Enontekio", "Finland", 23.424322, 68.362586],
420 + ["Eura", "Eura", "Finland", 22.201389, 61.116112],
421 + ["Halli", "Halli", "Finland", 24.7866, 61.85605],
422 + ["Helsinki Malmi", "Helsinki", "Finland", 25.042828, 60.254558],
423 + ["Helsinki Vantaa", "Helsinki", "Finland", 24.963333, 60.317222],
424 + ["Hameenkyro", "Hameenkyro", "Finland", 23.073744, 61.689656],
425 + ["Hanko", "Hanko", "Finland", 23.083583, 59.848864],
426 + ["Hyvinkaa", "Hyvinkaa", "Finland", 24.881111, 60.654444],
427 + ["Kiikala", "Kikala", "Finland", 23.6525, 60.462502],
428 + ["Immola", "Immola", "Finland", 28.903711, 61.249172],
429 + ["Kitee", "Kitee", "Finland", 30.073611, 62.166111],
430 + ["Ivalo", "Ivalo", "Finland", 27.405328, 68.607269],
431 + ["Joensuu", "Joensuu", "Finland", 29.60755, 62.662906],
432 + ["Jyvaskyla", "Jyvaskyla", "Finland", 25.678253, 62.399453],
433 + ["Kauhava", "Kauhava", "Finland", 23.051442, 63.127078],
434 + ["Kemi Tornio", "Kemi", "Finland", 24.5991, 65.781889],
435 + ["Kajaani", "Kajaani", "Finland", 27.692414, 64.285472],
436 + ["Kauhajoki", "Kauhajoki", "Finland", 22.393055, 62.462502],
437 + ["Kruunupyy", "Kruunupyy", "Finland", 23.143131, 63.721172],
438 + ["Kemijarvi", "Kemijarvi", "Finland", 27.156786, 66.712883],
439 + ["Kuusamo", "Kuusamo", "Finland", 29.239381, 65.987575],
440 + ["Kittila", "Kittila", "Finland", 24.84685, 67.701022],
441 + ["Kuopio", "Kuopio", "Finland", 27.797756, 63.00715],
442 + ["Lahti Vesivehmaa", "Vesivehmaa", "Finland", 25.693508, 61.144158],
443 + ["Lappeenranta", "Lappeenranta", "Finland", 28.144397, 61.044553],
444 + ["Mariehamn", "Mariehamn", "Finland", 19.898156, 60.122203],
445 + ["Menkijarvi", "Menkijarvi", "Finland", 23.518889, 62.946667],
446 + ["Mikkeli", "Mikkeli", "Finland", 27.201794, 61.6866],
447 + ["Nummela", "Nummela", "Finland", 24.296389, 60.333889],
448 + ["Oulu", "Oulu", "Finland", 25.354564, 64.930061],
449 + ["Piikajarvi", "Piikajarvi", "Finland", 22.193356, 61.245558],
450 + ["Pori", "Pori", "Finland", 21.799983, 61.461686],
451 + ["Pudasjarvi", "Pudasjarvi", "Finland", 26.946944, 65.402222],
452 + ["Pyhasalmi", "Pyhasalmi", "Finland", 25.926306, 63.731917],
453 + ["Raahe Pattijoki", "Pattijoki", "Finland", 24.695833, 64.688056],
454 + ["Rantasalmi", "Rantasalmi", "Finland", 28.356494, 62.065481],
455 + ["Rovaniemi", "Rovaniemi", "Finland", 25.830411, 66.564822],
456 + ["Rayskala", "Rayskala", "Finland", 24.107778, 60.744722],
457 + ["Savonlinna", "Savonlinna", "Finland", 28.945136, 61.943064],
458 + ["Selanpaa", "Selanpaa", "Finland", 26.798861, 61.062389],
459 + ["Sodankyla", "Sodankyla", "Finland", 26.619133, 67.395033],
460 + ["Tampere Pirkkala", "Tampere", "Finland", 23.604392, 61.414147],
461 + ["Teisko", "Teisko", "Finland", 24.027006, 61.77335],
462 + ["Turku", "Turku", "Finland", 22.262808, 60.514142],
463 + ["Utti", "Utti", "Finland", 26.938353, 60.896394],
464 + ["Vaasa", "Vaasa", "Finland", 21.762175, 63.05065],
465 + ["Varkaus", "Varkaus", "Finland", 27.868611, 62.171111],
466 + ["Ylivieska", "Ylivieska-raudaskyla", "Finland", 24.715953, 64.060547],
467 + ["Belfast Intl", "Belfast", "United Kingdom", -6.215833, 54.6575],
468 + ["St Angelo", "Enniskillen", "United Kingdom", -7.651667, 54.398889],
469 + ["Belfast City", "Belfast", "United Kingdom", -5.8725, 54.618056],
470 + ["City of Derry", "Londonderry", "United Kingdom", -7.161111, 55.042778],
471 + ["Birmingham", "Birmingham", "United Kingdom", -1.748028, 52.453856],
472 + ["Coventry", "Coventry", "United Kingdom", -1.479722, 52.369722],
473 + ["Leicester", "Leicester", "United Kingdom", -1.031944, 52.607778],
474 + ["Gloucestershire", "Golouchestershire", "United Kingdom", -2.167222, 51.894167],
475 + ["Wolverhampton", "Halfpenny Green", "United Kingdom", -2.259444, 52.5175],
476 + ["Kemble", "Pailton", "United Kingdom", -2.056944, 51.668056],
477 + ["Turweston", "Turweston", "United Kingdom", -1.095556, 52.040833],
478 + ["Wellesbourne Mountford", "Wellesbourne", "United Kingdom", -1.614444, 52.192222],
479 + ["Manchester", "Manchester", "United Kingdom", -2.27495, 53.353744],
480 + ["Manchester Woodford", "Woodfort", "United Kingdom", -2.148889, 53.338056],
481 + ["Chivenor", "Chivenor", "United Kingdom", -4.150339, 51.087167],
482 + ["St Mawgan", "Newquai", "United Kingdom", -4.995408, 50.440558],
483 + ["Lyneham", "Lyneham", "United Kingdom", -1.993428, 51.505144],
484 + ["Boscombe Down", "Boscombe Down", "United Kingdom", -1.747414, 51.152189],
485 + ["Culdrose", "Culdrose", "United Kingdom", -5.255711, 50.086092],
486 + ["St Athan", "St. Athan", "United Kingdom", -3.43575, 51.404811],
487 + ["Yeovilton", "Yeovilton", "United Kingdom", -2.638819, 51.009358],
488 + ["Haverfordwest", "Haverfordwest", "United Kingdom", -4.961111, 51.833056],
489 + ["Cardiff", "Cardiff", "United Kingdom", -3.343333, 51.396667],
490 + ["Swansea", "Swansea", "United Kingdom", -4.067833, 51.605333],
491 + ["Bristol", "Bristol", "United Kingdom", -2.719089, 51.382669],
492 + ["Liverpool", "Liverpool", "United Kingdom", -2.849722, 53.333611],
493 + ["Luton", "London", "United Kingdom", -0.368333, 51.874722],
494 + ["Plymouth", "Plymouth", "United Kingdom", -4.105833, 50.422778],
495 + ["Bournemouth", "Bournemouth", "United Kingdom", -1.8425, 50.78],
496 + ["Southampton", "Southampton", "United Kingdom", -1.356803, 50.950261],
497 + ["Lasham", "Lasham", "United Kingdom", -1.0335, 51.187167],
498 + ["Alderney", "Alderney", "Guernsey", -2.214722, 49.706111],
499 + ["Guernsey", "Guernsey", "Guernsey", -2.601969, 49.434956],
500 + ["Jersey", "Jersey", "Jersey", -2.195508, 49.207947],
501 + ["Shoreham", "Shoreham By Sea", "United Kingdom", -0.297222, 50.835556],
502 + ["Biggin Hill", "Biggin Hill", "United Kingdom", 0.0325, 51.330833],
503 + ["Gatwick", "London", "United Kingdom", -0.190278, 51.148056],
504 + ["City", "London", "United Kingdom", 0.055278, 51.505278],
505 + ["Farnborough", "Farnborough", "United Kingdom", -0.776333, 51.275833],
506 + ["Chalgrove", "Chalsgrove", "United Kingdom", -1.080833, 51.676111],
507 + ["Blackbushe", "Blackbushe", "United Kingdom", -0.8475, 51.323889],
508 + ["Heathrow", "London", "United Kingdom", -0.461389, 51.4775],
509 + ["Southend", "Southend", "United Kingdom", 0.695556, 51.571389],
510 + ["Lydd", "Lydd", "United Kingdom", 0.939167, 50.956111],
511 + ["Manston", "Manston", "United Kingdom", 1.346111, 51.342222],
512 + ["Brough", "Brough", "United Kingdom", -0.566333, 53.719667],
513 + ["Carlisle", "Carlisle", "United Kingdom", -2.809167, 54.9375],
514 + ["Gamston", "Repton", "United Kingdom", -0.951389, 53.280556],
515 + ["Blackpool", "Blackpool", "United Kingdom", -3.028611, 53.771667],
516 + ["Humberside", "Humberside", "United Kingdom", -0.350833, 53.574444],
517 + ["Walney Island", "Barrow Island", "United Kingdom", -3.263667, 54.131167],
518 + ["Leeds Bradford", "Leeds", "United Kingdom", -1.660569, 53.865897],
519 + ["Warton", "Warton", "United Kingdom", -2.883061, 53.745097],
520 + ["Hawarden", "Hawarden", "United Kingdom", -2.977778, 53.178056],
521 + ["Isle Of Man", "Isle Of Man", "Isle of Man", -4.623889, 54.083333],
522 + ["Newcastle", "Newcastle", "United Kingdom", -1.691667, 55.0375],
523 + ["Durham Tees Valley Airport", "Teesside", "United Kingdom", -1.429406, 54.509189],
524 + ["Nottingham East Midlands", "East Midlands", "United Kingdom", -1.328056, 52.831111],
525 + ["Llanbedr", "Llanbedr", "United Kingdom", -4.123575, 52.811744],
526 + ["Ternhill", "Ternhill", "United Kingdom", -2.533561, 52.871164],
527 + ["Shawbury", "Shawbury", "United Kingdom", -2.668042, 52.798169],
528 + ["Woodvale", "Woodvale", "United Kingdom", -3.055522, 53.581575],
529 + ["Kirkwall", "Kirkwall", "United Kingdom", -2.905, 58.957778],
530 + ["Sumburgh", "Sumburgh", "United Kingdom", -1.295556, 59.878889],
531 + ["Wick", "Wick", "United Kingdom", -3.093056, 58.458889],
532 + ["Dyce", "Aberdeen", "United Kingdom", -2.197778, 57.201944],
533 + ["Inverness", "Inverness", "United Kingdom", -4.0475, 57.5425],
534 + ["Glasgow", "Glasgow", "United Kingdom", -4.433056, 55.871944],
535 + ["Edinburgh", "Edinburgh", "United Kingdom", -3.3725, 55.95],
536 + ["Islay", "Islay", "United Kingdom", -6.256667, 55.681944],
537 + ["Prestwick", "Prestwick", "United Kingdom", -4.586667, 55.509444],
538 + ["Benbecula", "Benbecula", "United Kingdom", -7.362778, 57.481111],
539 + ["Scatsta", "Scatsta", "United Kingdom", -1.296111, 60.432778],
540 + ["Dundee", "Dundee", "United Kingdom", -3.025833, 56.452499],
541 + ["Stornoway", "Stornoway", "United Kingdom", -6.331111, 58.215556],
542 + ["Tiree", "Tiree", "United Kingdom", -6.869167, 56.499167],
543 + ["Leuchars", "Leuchars", "United Kingdom", -2.868444, 56.372889],
544 + ["Lossiemouth", "Lossiemouth", "United Kingdom", -3.339169, 57.705214],
545 + ["Cambridge", "Cambridge", "United Kingdom", 0.175, 52.205],
546 + ["Conington", "Peterborough", "United Kingdom", -0.251111, 52.468056],
547 + ["Norwich", "Norwich", "United Kingdom", 1.282778, 52.675833],
548 + ["Stansted", "London", "United Kingdom", 0.235, 51.885],
549 + ["North Weald", "North Weald", "United Kingdom", 0.154167, 51.721667],
550 + ["Sheffield City", "Fowlmere", "United Kingdom", -1.388486, 53.394256],
551 + ["Cranfield", "Cranfield", "United Kingdom", -0.616667, 52.072222],
552 + ["Exeter", "Exeter", "United Kingdom", -3.413889, 50.734444],
553 + ["Bristol Filton", "Bristol", "United Kingdom", -2.590833, 51.519444],
554 + ["Kidlington", "Oxford", "United Kingdom", -1.32, 51.836944],
555 + ["Benson", "Benson", "United Kingdom", -1.095833, 51.616389],
556 + ["Lakenheath", "Lakenheath", "United Kingdom", 0.561, 52.409333],
557 + ["Mildenhall", "Mildenhall", "United Kingdom", 0.486406, 52.361933],
558 + ["Wattisham", "Wattisham", "United Kingdom", 0.956264, 52.127283],
559 + ["Wyton", "Wyton", "United Kingdom", -0.107833, 52.357167],
560 + ["Fairford", "Fairford", "United Kingdom", -1.790028, 51.682167],
561 + ["Brize Norton", "Brize Norton", "United Kingdom", -1.583617, 51.749964],
562 + ["Odiham", "Odiham", "United Kingdom", -0.942825, 51.234139],
563 + ["Cosford", "Cosford", "United Kingdom", -2.305578, 52.640028],
564 + ["Northolt", "Northolt", "United Kingdom", -0.418167, 51.553],
565 + ["Coningsby", "Coningsby", "United Kingdom", -0.166014, 53.093014],
566 + ["Dishforth", "Dishforth", "United Kingdom", -1.420253, 54.137186],
567 + ["Leeming", "Leeming", "United Kingdom", -1.5354, 54.292383],
568 + ["Church Fenton", "Church Fenton", "United Kingdom", -1.1955, 53.834333],
569 + ["Honington", "Honington", "United Kingdom", 0.772939, 52.342611],
570 + ["Cottesmore", "Cottesmore", "United Kingdom", -0.648769, 52.735711],
571 + ["Scampton", "Scampton", "United Kingdom", -0.550833, 53.307778],
572 + ["Wittering", "Wittering", "United Kingdom", -0.476453, 52.612558],
573 + ["Linton On Ouse", "Linton-on-ouse", "United Kingdom", -1.252747, 54.048911],
574 + ["Waddington", "Waddington", "United Kingdom", -0.523811, 53.166167],
575 + ["Topcliffe", "Topcliffe", "United Kingdom", -1.382094, 54.205522],
576 + ["Cranwell", "Cranwell", "United Kingdom", -0.483242, 53.03035],
577 + ["Barkston Heath", "Barkston Heath", "United Kingdom", -0.561625, 52.962225],
578 + ["Marham", "Marham", "United Kingdom", 0.550692, 52.648353],
579 + ["Mount Pleasant", "Mount Pleasant", "Falkland Islands", -58.447222, -51.822777],
580 + ["Schiphol", "Amsterdam", "Netherlands", 4.763889, 52.308613],
581 + ["Budel", "Weert", "Netherlands", 5.601389, 51.25528],
582 + ["Maastricht", "Maastricht", "Netherlands", 5.770144, 50.911658],
583 + ["Deelen", "Deelen", "Netherlands", 5.873056, 52.060556],
584 + ["Drachten", "Drachten", "Netherlands", 6.129722, 53.119167],
585 + ["Eindhoven", "Eindhoven", "Netherlands", 5.374528, 51.450139],
586 + ["Eelde", "Groningen", "Netherlands", 6.579444, 53.11972],
587 + ["Gilze Rijen", "Gilze-rijen", "Netherlands", 4.931833, 51.567389],
588 + ["De Kooy", "De Kooy", "Netherlands", 4.780625, 52.923353],
589 + ["Lelystad", "Lelystad", "Netherlands", 5.527222, 52.460278],
590 + ["Leeuwarden", "Leeuwarden", "Netherlands", 5.760556, 53.228611],
591 + ["Rotterdam", "Rotterdam", "Netherlands", 4.437222, 51.956944],
592 + ["Soesterberg", "Soesterberg", "Netherlands", 5.27619, 52.1273],
593 + ["Twenthe", "Enschede", "Netherlands", 6.874167, 52.27],
594 + ["Valkenburg", "Valkenburg", "Netherlands", 4.417944, 52.166139],
595 + ["Woensdrecht", "Woensdrecht", "Netherlands", 4.342031, 51.449092],
596 + ["Cork", "Cork", "Ireland", -8.491111, 51.841269],
597 + ["Galway", "Galway", "Ireland", -8.941592, 53.300175],
598 + ["Dublin", "Dublin", "Ireland", -6.270075, 53.421333],
599 + ["Ireland West Knock", "Connaught", "Ireland", -8.818492, 53.910297],
600 + ["Kerry", "Kerry", "Ireland", -9.523783, 52.180878],
601 + ["Casement", "Casement", "Ireland", -6.451333, 53.301667],
602 + ["Shannon", "Shannon", "Ireland", -8.924817, 52.701978],
603 + ["Sligo", "Sligo", "Ireland", -8.599206, 54.280214],
604 + ["Waterford", "Waterford", "Ireland", -7.086964, 52.1872],
605 + ["Aarhus", "Aarhus", "Denmark", 10.619008, 56.300017],
606 + ["Billund", "Billund", "Denmark", 9.151778, 55.740322],
607 + ["Kastrup", "Copenhagen", "Denmark", 12.655972, 55.617917],
608 + ["Esbjerg", "Esbjerg", "Denmark", 8.553403, 55.525942],
609 + ["Gronholt Hillerod", "Gronholt", "Denmark", 12.382222, 55.941387],
610 + ["Karup", "Karup", "Denmark", 9.124628, 56.297458],
611 + ["Laeso", "Laeso", "Denmark", 11.000083, 57.277228],
612 + ["Lolland Falster Maribo", "Maribo", "Denmark", 11.440117, 54.699344],
613 + ["Odense", "Odense", "Denmark", 10.330933, 55.476664],
614 + ["Krusa Padborg", "Krusa-padborg", "Denmark", 9.279014, 54.870306],
615 + ["Roskilde", "Copenhagen", "Denmark", 12.131428, 55.585567],
616 + ["Bornholm Ronne", "Ronne", "Denmark", 14.759558, 55.063267],
617 + ["Sonderborg", "Soenderborg", "Denmark", 9.791731, 54.964367],
618 + ["Skrydstrup", "Skrydstrup", "Denmark", 9.263931, 55.225553],
619 + ["Skive", "Skive", "Denmark", 9.172983, 56.550208],
620 + ["Thisted", "Thisted", "Denmark", 8.705225, 57.0688],
621 + ["Kolding Vamdrup", "Kolding", "Denmark", 9.330925, 55.436283],
622 + ["Vagar", "Vagar", "Faroe Islands", -7.277219, 62.063628],
623 + ["Aars", "Vesthimmerland", "Denmark", 9.458611, 56.846944],
624 + ["Stauning", "Stauning", "Denmark", 8.353906, 55.990122],
625 + ["Aalborg", "Aalborg", "Denmark", 9.849164, 57.092789],
626 + ["Luxembourg", "Luxemburg", "Luxembourg", 6.211517, 49.626575],
627 + ["Vigra", "Alesund", "Norway", 6.110164, 62.560372],
628 + ["Andenes", "Andoya", "Norway", 16.144167, 69.2925],
629 + ["Alta", "Alta", "Norway", 23.371667, 69.976111],
630 + ["Bomoen", "Voss", "Norway", 6.501497, 60.63885],
631 + ["Bronnoy", "Bronnoysund", "Norway", 12.2175, 65.461111],
632 + ["Bodo", "Bodo", "Norway", 14.365278, 67.269167],
633 + ["Flesland", "Bergen", "Norway", 5.218142, 60.293386],
634 + ["Batsfjord", "Batsfjord", "Norway", 29.6925, 70.600278],
635 + ["Kjevik", "Kristiansand", "Norway", 8.085369, 58.204214],
636 + ["Dagali", "Geilo", "Norway", 8.512778, 60.416667],
637 + ["Bardufoss", "Bardufoss", "Norway", 18.540356, 69.055758],
638 + ["Evenes", "Harstad/Narvik", "Norway", 16.678108, 68.4913],
639 + ["Leirin", "Fagernes", "Norway", 9.288056, 61.015556],
640 + ["Floro", "Floro", "Norway", 5.024722, 61.583611],
641 + ["Gardermoen", "Oslo", "Norway", 11.100361, 60.193917],
642 + ["Karmoy", "Haugesund", "Norway", 5.208364, 59.345267],
643 + ["Hasvik", "Hasvik", "Norway", 22.139744, 70.486675],
644 + ["Kvernberget", "Kristiansund", "Norway", 7.824522, 63.111781],
645 + ["Kjeller", "Kjeller", "Norway", 11.036089, 59.969336],
646 + ["Hoybuktmoen", "Kirkenes", "Norway", 29.891295, 69.725781],
647 + ["Lista", "Farsund", "Norway", 6.62605, 58.099486],
648 + ["Aro", "Molde", "Norway", 7.2625, 62.744722],
649 + ["Kjaerstad", "Mosjoen", "Norway", 13.214914, 65.783997],
650 + ["Banak", "Lakselv", "Norway", 24.973489, 70.068814],
651 + ["Notodden", "Notodden", "Norway", 9.212222, 59.565683],
652 + ["Orland", "Orland", "Norway", 9.604003, 63.698908],
653 + ["Roros", "Roros", "Norway", 11.342347, 62.578411],
654 + ["Moss", "Rygge", "Norway", 10.785389, 59.378933],
655 + ["Longyear", "Svalbard", "Norway", 15.465556, 78.246111],
656 + ["Geiteryggen", "Skien", "Norway", 9.566944, 59.185],
657 + ["Sorstokken", "Stord", "Norway", 5.34085, 59.791925],
658 + ["Stokka", "Sandnessjoen", "Norway", 12.468944, 65.956828],
659 + ["Langnes", "Tromso", "Norway", 18.918919, 69.683333],
660 + ["Torp", "Sandefjord", "Norway", 10.258628, 59.186703],
661 + ["Vaernes", "Trondheim", "Norway", 10.92425, 63.457556],
662 + ["Sola", "Stavanger", "Norway", 5.637856, 58.876778],
663 + ["Babice", "Warsaw", "Poland", 20.911047, 52.268494],
664 + ["Lech Walesa", "Gdansk", "Poland", 18.466222, 54.377569],
665 + ["Balice", "Krakow", "Poland", 19.784836, 50.077731],
666 + ["Muchowiec", "Katowice", "Poland", 19.034181, 50.238147],
667 + ["Pyrzowice", "Katowice", "Poland", 19.080019, 50.474253],
668 + ["Mielec", "Mielec", "Poland", 21.462131, 50.322275],
669 + ["Lawica", "Poznan", "Poland", 16.826325, 52.421031],
670 + ["Jasionka", "Rzeszow", "Poland", 22.019, 50.109958],
671 + ["Goleniow", "Szczecin", "Poland", 14.902206, 53.584731],
672 + ["Redzikowo", "Slupsk", "Poland", 17.1075, 54.478889],
673 + ["Swidwin", "Shapaja", "Poland", 15.82625, 53.790639],
674 + ["Okecie", "Warsaw", "Poland", 20.967122, 52.16575],
675 + ["Strachowice", "Wroclaw", "Poland", 16.885836, 51.102683],
676 + ["Babimost", "Zielona Gora", "Poland", 15.798556, 52.138517],
677 + ["Malmen", "Linkoeping", "Sweden", 15.525683, 58.402278],
678 + ["Bravalla", "Norrkoeping", "Sweden", 16.103592, 58.610867],
679 + ["Uppsala", "Uppsala", "Sweden", 17.588581, 59.897328],
680 + ["Ronneby", "Ronneby", "Sweden", 15.265, 56.266667],
681 + ["Rada", "Rada", "Sweden", 13.053231, 58.498136],
682 + ["Landvetter", "Gothenborg", "Sweden", 12.279819, 57.662836],
683 + ["Jonkoping", "Joenkoeping", "Sweden", 14.068731, 57.757594],
684 + ["Falkoping", "Falkoping", "Sweden", 13.587847, 58.169794],
685 + ["Lidkoping", "Lidkoping", "Sweden", 13.174414, 58.465522],
686 + ["Save", "Gothenborg", "Sweden", 11.870372, 57.774722],
687 + ["Skovde", "Skovde", "Sweden", 13.972672, 58.4564],
688 + ["Trollhattan Vanersborg", "Trollhattan", "Sweden", 12.345, 58.318056],
689 + ["Karlsborg", "Karlsborg", "Sweden", 14.507119, 58.513842],
690 + ["Satenas", "Satenas", "Sweden", 12.714389, 58.426445],
691 + ["Barkarby", "Stockholm", "Sweden", 17.890694, 59.418694],
692 + ["Karlskoga", "Karlskoga", "Sweden", 14.495922, 59.345867],
693 + ["Mora", "Mora", "Sweden", 14.511383, 60.957908],
694 + ["Skavsta", "Stockholm", "Sweden", 16.912189, 58.788636],
695 + ["Arvika", "Arvika", "Sweden", 12.639442, 59.675856],
696 + ["Emmaboda", "Emmaboda", "Sweden", 15.604761, 56.610761],
697 + ["Feringe", "Ljungby", "Sweden", 13.921667, 56.950278],
698 + ["Kristianstad", "Kristianstad", "Sweden", 14.085536, 55.921686],
699 + ["Landskrona", "Landskrona", "Sweden", 12.869444, 55.944444],
700 + ["Oskarshamn", "Oskarshamn", "Sweden", 16.497972, 57.350453],
701 + ["Anderstorp", "Anderstorp", "Sweden", 13.599439, 57.264167],
702 + ["Kalmar", "Kalkmar", "Sweden", 16.287578, 56.685531],
703 + ["Sturup", "Malmoe", "Sweden", 13.371639, 55.530193],
704 + ["Halmstad", "Halmstad", "Sweden", 12.820211, 56.691128],
705 + ["Hagshult", "Hagshult", "Sweden", 14.137222, 57.292222],
706 + ["Kronoberg", "Vaxjo", "Sweden", 14.727994, 56.929144],
707 + ["Hallviken", "Hallviken", "Sweden", 15.458333, 63.738333],
708 + ["Hedlanda", "Hede", "Sweden", 13.747222, 62.408889],
709 + ["Sveg", "Sveg", "Sweden", 14.42295, 62.047811],
710 + ["Gallivare", "Gallivare", "Sweden", 20.814636, 67.132408],
711 + ["Hudiksvall", "Hudiksvall", "Sweden", 17.080719, 61.768092],
712 + ["Jokkmokk", "Jokkmokk", "Sweden", 20.147181, 66.496236],
713 + ["Kramfors Solleftea", "Kramfors", "Sweden", 17.768856, 63.048597],
714 + ["Lycksele", "Lycksele", "Sweden", 18.716219, 64.548322],
715 + ["Optand", "Optand", "Sweden", 14.802778, 63.128611],
716 + ["Sundsvall Harnosand", "Sundsvall", "Sweden", 17.443928, 62.528125],
717 + ["Ornskoldsvik", "Ornskoldsvik", "Sweden", 18.990039, 63.408339],
718 + ["Pitea", "Pitea", "Sweden", 21.260833, 65.398333],
719 + ["Kiruna", "Kiruna", "Sweden", 20.336764, 67.821986],
720 + ["Orsa", "Orsa", "Sweden", 14.712567, 61.190033],
721 + ["Skelleftea", "Skelleftea", "Sweden", 21.076892, 64.624772],
722 + ["Sattna", "Sattna", "Sweden", 17.002917, 62.481369],
723 + ["Umea", "Umea", "Sweden", 20.282758, 63.791828],
724 + ["Vilhelmina", "Vilhelmina", "Sweden", 16.833575, 64.579083],
725 + ["Arvidsjaur", "Arvidsjaur", "Sweden", 19.281944, 65.590278],
726 + ["Orebro", "Orebro", "Sweden", 15.037956, 59.223733],
727 + ["Vasteras", "Vasteras", "Sweden", 16.633611, 59.589444],
728 + ["Kallax", "Lulea", "Sweden", 22.121989, 65.543758],
729 + ["Vidsel", "Vidsel", "Sweden", 20.149917, 65.875325],
730 + ["Arboga", "Arboga", "Sweden", 15.924055, 59.386585],
731 + ["Arlanda", "Stockholm", "Sweden", 17.918611, 59.651944],
732 + ["Bromma", "Stockholm", "Sweden", 17.94165, 59.354372],
733 + ["Borlange", "Borlange", "Sweden", 15.515211, 60.422017],
734 + ["Hultsfred", "Hultsfred", "Sweden", 15.823333, 57.525833],
735 + ["Gavle", "Gavle", "Sweden", 16.951389, 60.593333],
736 + ["Saab", "Linkoeping", "Sweden", 15.680508, 58.40615],
737 + ["Kungsangen", "Norrkoeping", "Sweden", 16.250622, 58.586253],
738 + ["Eskilstuna", "Eskilstuna", "Sweden", 16.7084, 59.351078],
739 + ["Visby", "Visby", "Sweden", 18.346211, 57.662797],
740 + ["Kalixfors", "Kalixfors", "Sweden", 20.257228, 67.764789],
741 + ["Spangdahlem Ab", "Spangdahlem", "Germany", 6.6925, 49.972667],
742 + ["Ramstein Ab", "Ramstein", "Germany", 7.600283, 49.436911],
743 + ["Bamberg Aaf", "Bamberg", "Germany", 10.914233, 49.920433],
744 + ["Giebelstadt Aaf", "Giebelstadt", "Germany", 9.966494, 49.648131],
745 + ["Buckeburg", "Brueckeburg", "Germany", 9.082167, 52.2785],
746 + ["Celle", "Celle", "Germany", 10.022133, 52.5912],
747 + ["Rheine Bentlage", "Rheine-brentlange", "Germany", 7.387, 52.291167],
748 + ["Fritzlar", "Fritzlar", "Germany", 9.285833, 51.1145],
749 + ["Laupheim", "Laupheim", "Germany", 9.910019, 48.220297],
750 + ["Mendig", "Mendig", "Germany", 7.315333, 50.366],
751 + ["Niederstetten", "Niederstetten", "Germany", 9.958167, 49.391833],
752 + ["Roth", "Roth", "Germany", 11.100167, 49.2175],
753 + ["Fassberg", "Fassberg", "Germany", 10.197528, 52.919406],
754 + ["Grafenwohr Aaf", "Grafenwoehr", "Germany", 11.940175, 49.698686],
755 + ["Hanau Aaf", "Hanau", "Germany", 8.961586, 50.169189],
756 + ["Hohenfels Aaf", "Hohenfels", "Germany", 11.836111, 49.218056],
757 + ["Kitzingen Aaf", "Kitzingen", "Germany", 10.200556, 49.743057],
758 + ["Nordholz", "Nordholz", "Germany", 8.6585, 53.767667],
759 + ["Diepholz", "Diepholz", "Germany", 8.341014, 52.585514],
760 + ["Geilenkirchen", "Geilenkirchen", "Germany", 6.042422, 50.960817],
761 + ["Hohn", "Hohn", "Germany", 9.538167, 54.312167],
762 + ["Jever", "Jever", "Germany", 7.888667, 53.5335],
763 + ["Laage", "Laage", "Germany", 12.278333, 53.918167],
764 + ["Norvenich", "Noervenich", "Germany", 6.658167, 50.831167],
765 + ["Schleswig", "Schleswig", "Germany", 9.516333, 54.459333],
766 + ["Wittmundhafen", "Wittmundhafen", "Germany", 7.667333, 53.547833],
767 + ["Neubrandenburg", "Neubrandenburg", "Germany", 13.306, 53.602167],
768 + ["Wunstorf", "Wunstorf", "Germany", 9.427167, 52.457333],
769 + ["Vilseck Aaf", "Vilseck", "Germany", 11.767222, 49.63361],
770 + ["Coleman Aaf", "Coleman", "Germany", 8.463392, 49.563569],
771 + ["Wiesbaden Aaf", "Wiesbaden", "Germany", 8.325397, 50.049819],
772 + ["Landsberg Lech", "Landsberg", "Germany", 10.906, 48.0705],
773 + ["Buchel", "Buechel", "Germany", 7.063333, 50.173833],
774 + ["Erding", "Erding", "Germany", 11.948667, 48.322333],
775 + ["Furstenfeldbruck", "Fuerstenfeldbruck", "Germany", 11.267, 48.205667],
776 + ["Holzdorf", "Holzdorf", "Germany", 13.167667, 51.767833],
777 + ["Ingolstadt Manching", "Ingolstadt", "Germany", 11.534, 48.715667],
778 + ["Lechfeld", "Lechfeld", "Germany", 10.861167, 48.1855],
779 + ["Neuburg", "Neuburg", "Germany", 11.2115, 48.711],
780 + ["Gutersloh", "Guetersloh", "Germany", 8.306333, 51.922833],
781 + ["Alexander Bay", "Alexander Bay", "South Africa", 16.533333, -28.575001],
782 + ["Aggeneys", "Aggeneys", "South Africa", 18.813869, -29.281767],
783 + ["Brakpan", "Brakpan", "South Africa", 28.301769, -26.23865],
784 + ["Bhisho", "Bisho", "South Africa", 27.279111, -32.89715],
785 + ["Bloemfontein Intl", "Bloemfontein", "South Africa", 26.302444, -29.092722],
786 + ["Bethlehem", "Bethlehem", "South Africa", 28.336125, -28.248392],
787 + ["Bothaville", "Bothaville", "South Africa", 26.629194, -27.366769],
788 + ["Cape Town Intl", "Cape Town", "South Africa", 18.601667, -33.964806],
789 + ["Calvinia", "Calvinia", "South Africa", 19.725897, -31.500278],
790 + ["Durban Intl", "Durban", "South Africa", 30.950519, -29.970089],
791 + ["East London", "East London", "South Africa", 27.825939, -33.035569],
792 + ["Ermelo", "Ermelo", "South Africa", 29.979764, -26.495644],
793 + ["Ficksburg Sentraoes", "Ficksburg", "South Africa", 27.9089, -28.823119],
794 + ["Grand Central", "Johannesburg", "South Africa", 28.140061, -25.986267],
795 + ["George", "George", "South Africa", 22.378889, -34.005553],
796 + ["Graaff Reinet", "Graaff Reinet", "South Africa", 24.541389, -32.193611],
797 + ["Grahamstown", "Grahamstown", "South Africa", 26.498083, -33.284721],
798 + ["Greytown", "Greytown", "South Africa", 30.586706, -29.122011],
799 + ["Harmony", "Harmony", "South Africa", 26.861178, -28.078694],
800 + ["Harrismith", "Harrismith", "South Africa", 29.106206, -28.235072],
801 + ["Hoedspruit Afb", "Hoedspruit", "South Africa", 31.048744, -24.368642],
802 + ["Gariep Dam", "Hendrik Verwoerddam", "South Africa", 25.528286, -30.562164],
803 + ["Johannesburg Intl", "Johannesburg", "South Africa", 28.246, -26.139166],
804 + ["P C Pelser", "Klerksdorp", "South Africa", 26.718003, -26.871064],
805 + ["Kimberley", "Kimberley", "South Africa", 24.765167, -28.802834],
806 + ["Krugersdorp", "Krugersdorp", "South Africa", 27.725667, -26.080978],
807 + ["Kroonstad", "Kroonstad", "South Africa", 27.315761, -27.660617],
808 + ["Johan Pienaar", "Kuruman", "South Africa", 23.411388, -27.456667],
809 + ["Kleinsee", "Kleinsee", "South Africa", 17.094006, -29.688403],
810 + ["Lanseria", "Johannesburg", "South Africa", 27.926133, -25.938514],
811 + ["Lichtenburg", "Lichtenburg", "South Africa", 26.184575, -26.175672],
812 + ["Makhado Afb", "Lambertsbaai", "South Africa", 29.696544, -23.159911],
813 + ["Langebaanweg", "Langebaanweg", "South Africa", 18.160278, -32.968889],
814 + ["Ladysmith", "Ladysmith", "South Africa", 29.749722, -28.581667],
815 + ["Middelburg", "Middelburg", "South Africa", 29.440158, -25.684775],
816 + ["Margate", "Margate", "South Africa", 30.343019, -30.857408],
817 + ["Marble Hall", "Marble Hall", "South Africa", 29.283122, -24.989114],
818 + ["Majuba Power Station", "Majuba Power Station", "South Africa", 29.778528, -27.079253],
819 + ["Susse", "Kangia", "Greenland", -49.9383, 69.2225],
820 + ["Malelane", "Malalane", "South Africa", 31.565828, -25.473603],
821 + ["Messina", "Musina", "South Africa", 26.908978, -25.704458],
822 + ["Mkuzi", "Mkuze", "South Africa", 32.044275, -27.626086],
823 + ["Newcastle", "Newcastle", "South Africa", 29.976894, -27.770586],
824 + ["Nylstroom", "Nylstroom", "South Africa", 28.434944, -24.686056],
825 + ["Overberg", "Overberg", "South Africa", 20.250681, -34.554861],
826 + ["Oudtshoorn", "Oudtshoorn", "South Africa", 22.188978, -33.606967],
827 + ["Port Elizabeth Intl", "Port Elizabeth", "South Africa", 25.617275, -33.984919],
828 + ["Plettenberg Bay", "Plettenberg Bay", "South Africa", 23.327778, -34.090279],
829 + ["Phalaborwa", "Phalaborwa", "South Africa", 31.15539, -23.937166],
830 + ["Polokwane International", "Polokwane", "South Africa", 29.484422, -23.926089],
831 + ["Port St Johns", "Port Saint Johns", "South Africa", 29.519786, -31.605886],
832 + ["Pietermaritzburg", "Pietermaritzburg", "South Africa", 30.398667, -29.648975],
833 + ["Pilanesberg Intl", "Pilanesberg", "South Africa", 27.173358, -25.333822],
834 + ["Polokwane Intl", "Potgietersrus", "South Africa", 29.458611, -23.845306],
835 + ["Potchefstroom", "Potchefstroom", "South Africa", 27.0819, -26.670994],
836 + ["Parys", "Parys", "South Africa", 27.503417, -26.889344],
837 + ["Queenstown", "Queenstown", "South Africa", 26.882206, -31.920197],
838 + ["Richards Bay", "Richard's Bay", "South Africa", 32.092111, -28.741039],
839 + ["Rustenburg", "Rustenburg", "South Africa", 27.271119, -25.6443],
840 + ["Robertson", "Robertson", "South Africa", 19.902828, -33.812181],
841 + ["Springbok", "Springbok", "South Africa", 17.939611, -29.689333],
842 + ["Secunda", "Secunda", "South Africa", 29.170144, -26.524083],
843 + ["Saldanha Vredenburg", "Saldanha", "South Africa", 17.969331, -32.964067],
844 + ["Springs", "Springs", "South Africa", 28.397508, -26.248411],
845 + ["Swartkop", "Swartkop", "South Africa", 28.164631, -25.809717],
846 + ["Sishen", "Sishen", "South Africa", 22.999278, -27.648606],
847 + ["Hendrik Swellengrebel", "Swellendam", "South Africa", 20.474611, -34.048222],
848 + ["Skukuza", "Skukuza", "South Africa", 31.588731, -24.960944],
849 + ["Tommys Fld", "Tommy's Field", "South Africa", 22.993178, -28.260028],
850 + ["New Tempe", "Bloemfontein", "South Africa", 26.157564, -29.032928],
851 + ["Tutuka Power Station", "Tutuka", "South Africa", 29.338778, -26.776556],
852 + ["Tzaneen", "Tzaneen", "South Africa", 30.329306, -23.824417],
853 + ["Prince Mangosuthu Buthelezi", "Ulundi", "South Africa", 31.416519, -28.320586],
854 + ["Upington", "Upington", "South Africa", 21.260239, -28.399097],
855 + ["Mthatha", "Umtata", "South Africa", 28.674289, -31.547903],
856 + ["Vryburg", "Vryburg", "South Africa", 24.728756, -26.982408],
857 + ["Virginia", "Durban", "South Africa", 31.058406, -29.770606],
858 + ["Vredendal", "Vredendal", "South Africa", 18.544789, -31.640961],
859 + ["Vereeniging", "Vereeniging", "South Africa", 27.960756, -26.566372],
860 + ["Wonderboom", "Pretoria", "South Africa", 28.224231, -25.653858],
861 + ["Witbank", "Witbank", "South Africa", 29.192019, -25.832294],
862 + ["Waterkloof Afb", "Waterkloof", "South Africa", 28.2225, -25.83],
863 + ["Welkom", "Welkom", "South Africa", 26.669586, -27.998],
864 + ["Ysterplaat", "Ysterplaat", "South Africa", 18.498297, -33.900244],
865 + ["Zeerust", "Zeerust", "South Africa", 26.042333, -25.598972],
866 + ["Francistown", "Francistown", "Botswana", 27.474525, -21.159597],
867 + ["Jwaneng", "Jwaneng", "Botswana", 24.690971, -24.602333],
868 + ["Kasane", "Kasane", "Botswana", 25.1624, -17.832875],
869 + ["Maun", "Maun", "Botswana", 23.431086, -19.972564],
870 + ["Sir Seretse Khama Intl", "Gaberone", "Botswana", 25.918208, -24.555225],
871 + ["Selebi Phikwe", "Selebi-phikwe", "Botswana", 27.828767, -22.05835],
872 + ["Maya Maya", "Brazzaville", "Congo (Brazzaville)", 15.253031, -4.2517],
873 + ["Owando", "Owando", "Congo (Kinshasa)", 15.950094, -0.53135],
874 + ["Ouesso", "Ouesso", "Congo (Kinshasa)", 16.037917, 1.615994],
875 + ["Pointe Noire", "Pointe-noire", "Congo (Brazzaville)", 11.886597, -4.816028],
876 + ["Matsapha", "Manzini", "Swaziland", 31.307519, -26.529022],
877 + ["Bangui M Poko", "Bangui", "Central African Republic", 18.518786, 4.398475],
878 + ["Berberati", "Berberati", "Central African Republic", 15.786369, 4.221583],
879 + ["Bata", "Bata", "Equatorial Guinea", 9.805681, 1.905469],
880 + ["Malabo", "Malabo", "Equatorial Guinea", 8.708717, 3.755267],
881 + ["Ascension Aux Af", "Wide Awake", "Saint Helena", -14.393664, -7.969597],
882 + ["Sir Seewoosagur Ramgoolam Intl", "Plaisance", "Mauritius", 57.6836, -20.430235],
883 + ["Plaine Corail", "Rodriguez Island", "Mauritius", 63.360983, -19.757658],
884 + ["Diego Garcia Nsf", "Diego Garcia Island", "British Indian Ocean Territory", 72.411089, -7.313267],
885 + ["Tiko", "Tiko", "Cameroon", 9.360528, 4.089192],
886 + ["Douala", "Douala", "Cameroon", 9.719481, 4.006081],
887 + ["Salak", "Maroua", "Cameroon", 14.257361, 10.451392],
888 + ["Foumban Nkounja", "Foumban", "Cameroon", 10.750817, 5.636919],
889 + ["Ngaoundere", "N'gaoundere", "Cameroon", 13.559242, 7.357011],
890 + ["Garoua", "Garoua", "Cameroon", 13.370103, 9.335892],
891 + ["Bafoussam", "Bafoussam", "Cameroon", 10.354583, 5.536919],
892 + ["Bamenda", "Bamenda", "Cameroon", 10.122639, 6.039239],
893 + ["Yaounde Ville", "Yaounde", "Cameroon", 11.523461, 3.836039],
894 + ["Kasompe", "Kasompe", "Zambia", 27.89395, -12.572778],
895 + ["Livingstone", "Livingstone", "Zambia", 25.822692, -17.821756],
896 + ["Lusaka Intl", "Lusaka", "Zambia", 28.452628, -15.330817],
897 + ["Mfuwe", "Mfuwe", "Zambia", 31.936581, -13.258878],
898 + ["Mongu", "Mongu", "Zambia", 23.162306, -15.254542],
899 + ["Ndola", "Ndola", "Zambia", 28.664944, -12.998139],
900 + ["Southdowns", "Southdowns", "Zambia", 28.149858, -12.900469],
901 + ["Prince Said Ibrahim", "Moroni", "Comoros", 43.27185, -11.533661],
902 + ["Bandaressalam", "Moheli", "Comoros", 43.7664, -12.298108],
903 + ["Ouani", "Anjouan", "Comoros", 44.430279, -12.131667],
904 + ["Dzaoudzi Pamandzi", "Dzaoudzi", "Mayotte", 45.281113, -12.804722],
905 + ["St Denis Gillot", "St.-denis", "Reunion", 55.510308, -20.8871],
906 + ["St Pierre Pierrefonds", "St.-pierre", "Reunion", 55.423581, -21.320039],
907 + ["Ivato", "Antananarivo", "Madagascar", 47.478806, -18.79695],
908 + ["Miandrivazo", "Miandrivazo", "Madagascar", 45.450832, -19.562778],
909 + ["Sainte Marie", "Sainte Marie", "Madagascar", 49.815834, -17.093889],
910 + ["Toamasina", "Toamasina", "Madagascar", 49.392536, -18.109517],
911 + ["Morondava", "Morondava", "Madagascar", 44.317614, -20.28475],
912 + ["Arrachart", "Antsiranana", "Madagascar", 49.291747, -12.3494],
913 + ["Avaratra", "Mananara", "Madagascar", 49.773753, -16.1639],
914 + ["Andapa", "Andapa", "Madagascar", 49.620556, -14.651667],
915 + ["Ambilobe", "Ambilobe", "Madagascar", 48.987978, -13.188431],
916 + ["Antsirabato", "Antalaha", "Madagascar", 50.320233, -14.999411],
917 + ["Analalava", "Analalava", "Madagascar", 47.763783, -14.629694],
918 + ["Philibert Tsiranana", "Mahajanga", "Madagascar", 46.351828, -15.667144],
919 + ["Fascene", "Nosy-be", "Madagascar", 48.314822, -13.312067],
920 + ["Besalampy", "Besalampy", "Madagascar", 44.481388, -16.741945],
921 + ["Maroantsetra", "Maroantsetra", "Madagascar", 49.688332, -15.436666],
922 + ["Sambava", "Sambava", "Madagascar", 50.174721, -14.278611],
923 + ["Vohimarina", "Vohemar", "Madagascar", 50.002777, -13.375834],
924 + ["Ambalabe", "Antsohihy", "Madagascar", 47.993894, -14.89875],
925 + ["Ampampamena", "Ampampamena", "Madagascar", 48.632739, -13.484814],
926 + ["Tolagnaro", "Tolagnaro", "Madagascar", 46.956111, -25.038056],
927 + ["Fianarantsoa", "Fianarantsoa", "Madagascar", 47.111736, -21.441558],
928 + ["Farafangana", "Farafangana", "Madagascar", 47.820614, -22.805286],
929 + ["Manakara", "Manakara", "Madagascar", 48.021667, -22.119722],
930 + ["Mananjary", "Mananjary", "Madagascar", 48.358317, -21.201772],
931 + ["Morombe", "Morombe", "Madagascar", 43.375533, -21.753867],
932 + ["Toliara", "Toliara", "Madagascar", 43.728453, -23.383369],
933 + ["Mbanza Congo", "M'banza-congo", "Angola", 14.247025, -6.269897],
934 + ["Benguela", "Benguela", "Angola", 13.403711, -12.609025],
935 + ["Cabinda", "Cabinda", "Angola", 12.188353, -5.596992],
936 + ["Culebra Airport", "Culebra Island", "Puerto Rico", -65.3034, 18.3127],
937 + ["Huambo", "Huambo", "Angola", 15.760547, -12.808878],
938 + ["Kuito", "Kuito", "Angola", 16.947414, -12.404633],
939 + ["Lobito", "Lobito", "Angola", 13.536625, -12.371233],
940 + ["Luanda 4 De Fevereiro", "Luanda", "Angola", 13.231178, -8.858375],
941 + ["Malanje", "Malanje", "Angola", 16.312406, -9.525086],
942 + ["Menongue", "Menongue", "Angola", 17.719833, -14.657583],
943 + ["Negage", "Negage", "Angola", 15.287728, -7.754506],
944 + ["Porto Amboim", "Porto Amboim", "Angola", 13.765528, -10.721956],
945 + ["Saurimo", "Saurimo", "Angola", 20.431875, -9.689067],
946 + ["Soyo", "Soyo", "Angola", 12.371764, -6.141086],
947 + ["Lubango", "Lubango", "Angola", 13.575022, -14.924733],
948 + ["Luena", "Luena", "Angola", 19.897672, -11.768086],
949 + ["Uige", "Uige", "Angola", 15.027822, -7.603067],
950 + ["Xangongo", "Xangongo", "Angola", 14.965344, -16.755417],
951 + ["Oyem", "Oyem", "Gabon", 11.581361, 1.543108],
952 + ["Okondja", "Okondja", "Gabon", 13.673133, -0.665214],
953 + ["Lambarene", "Lambarene", "Gabon", 10.245722, -0.704389],
954 + ["Bitam", "Bitam", "Gabon", 11.493195, 2.075639],
955 + ["Port Gentil", "Port Gentil", "Gabon", 8.754383, -0.711739],
956 + ["Omboue Hopital", "Omboue Hospial", "Gabon", 9.262694, -1.574733],
957 + ["Makokou", "Makokou", "Gabon", 12.890908, 0.579211],
958 + ["Leon M Ba", "Libreville", "Gabon", 9.412283, 0.4586],
959 + ["Mvengue", "Franceville", "Gabon", 13.438036, -1.656156],
960 + ["Principe", "Principe", "Sao Tome and Principe", 7.411742, 1.662936],
961 + ["Sao Tome Intl", "Sao Tome", "Sao Tome and Principe", 6.712153, 0.378175],
962 + ["Beira", "Beira", "Mozambique", 34.907556, -19.796419],
963 + ["Inhambane", "Inhambane", "Mozambique", 35.408544, -23.876431],
964 + ["Lichinga", "Lichinga", "Mozambique", 35.266262, -13.273986],
965 + ["Lumbo", "Lumbo", "Mozambique", 40.671728, -15.033058],
966 + ["Maputo", "Maputo", "Mozambique", 32.572606, -25.920836],
967 + ["Mueda", "Mueda", "Mozambique", 39.563142, -11.672922],
968 + ["Mocimboa Da Praia", "Mocimboa Da Praia", "Mozambique", 40.354875, -11.361789],
969 + ["Marrupa", "Marrupa", "Mozambique", 37.552067, -13.225053],
970 + ["Nacala", "Nacala", "Mozambique", 40.71225, -14.488233],
971 + ["Nampula", "Nampula", "Mozambique", 39.2818, -15.105611],
972 + ["Pemba", "Pemba", "Mozambique", 40.522492, -12.986753],
973 + ["Quelimane", "Quelimane", "Mozambique", 36.869106, -17.8555],
974 + ["Songo", "Songo", "Mozambique", 32.773189, -15.602694],
975 + ["Tete Chingodzi", "Tete", "Mozambique", 33.640181, -16.104817],
976 + ["Ulongwe", "Ulongwe", "Mozambique", 34.352369, -14.704617],
977 + ["Vilankulo", "Vilankulu", "Mozambique", 35.313297, -22.018431],
978 + ["Alphonse", "Alphonse", "Seychelles", 52.726247, -7.004783],
979 + ["Desroches", "Desroches", "Seychelles", 53.655844, -5.696697],
980 + ["Farquhar", "Farquhar", "Seychelles", 51.176119, -10.109611],
981 + ["Seychelles Intl", "Mahe", "Seychelles", 55.521839, -4.674342],
982 + ["Praslin", "Praslin", "Seychelles", 55.691417, -4.319292],
983 + ["Coetivy", "Coetivy", "Seychelles", 56.278239, -7.134567],
984 + ["Abeche", "Abeche", "Chad", 20.844333, 13.847],
985 + ["Moundou", "Moundou", "Chad", 16.071419, 8.624406],
986 + ["Ndjamena Hassan Djamous", "N'djamena", "Chad", 15.034019, 12.133689],
987 + ["Faya Largeau", "Faya-largeau", "Chad", 19.111078, 17.917053],
988 + ["J M Nkomo Intl", "Bulawayo", "Zimbabwe", 28.617869, -20.017431],
989 + ["Charles Prince", "Harare", "Zimbabwe", 30.924706, -17.751561],
990 + ["Buffalo Range", "Chiredzi", "Zimbabwe", 31.57855, -21.008083],
991 + ["Victoria Falls Intl", "Victoria Falls", "Zimbabwe", 25.839006, -18.095881],
992 + ["Harare Intl", "Harare", "Zimbabwe", 31.092847, -17.931806],
993 + ["Kariba Intl", "Kariba", "Zimbabwe", 28.884981, -16.519761],
994 + ["Mutoko", "Mutoko", "Zimbabwe", 32.184502, -17.431917],
995 + ["Mutare", "Mutare", "Zimbabwe", 32.627224, -18.997499],
996 + ["Masvingo Intl", "Masvingo", "Zimbabwe", 30.859111, -20.055333],
997 + ["Zvishavane", "Zvishavane", "Zimbabwe", 30.088228, -20.289497],
998 + ["Gweru Thornhill", "Gwert", "Zimbabwe", 29.861911, -19.436394],
999 + ["Hwange National Park", "Hwange National Park", "Zimbabwe", 27.021042, -18.629872],
1000 + ["Chileka Intl", "Blantyre", "Malawi", 34.974014, -15.679053],
1001 + ["Karonga", "Karonga", "Malawi", 33.893022, -9.953569],
1002 + ["Kasungu", "Kasungu", "Malawi", 33.468597, -13.014631],
1003 + ["Kamuzu Intl", "Lilongwe", "Malawi", 33.781, -13.789378],
1004 + ["Mzuzu", "Mzuzu", "Malawi", 34.011776, -11.44475],
1005 + ["Moshoeshoe I Intl", "Maseru", "Lesotho", 27.552503, -29.462256],
1006 + ["Mejametalana", "Maseru", "Lesotho", 27.503458, -29.304053],
1007 + ["Ndjili Intl", "Kinshasa", "Congo (Kinshasa)", 15.444569, -4.38575],
1008 + ["Ndolo", "Kinshasa", "Congo (Kinshasa)", 15.327342, -4.326689],
1009 + ["Muanda", "Muanda", "Congo (Kinshasa)", 12.351789, -5.930858],
1010 + ["Kitona Base", "Kitona Base", "Congo (Kinshasa)", 12.447694, -5.918056],
1011 + ["Bandundu", "Bandoundu", "Congo (Kinshasa)", 17.381683, -3.311319],
1012 + ["Kikwit", "Kikwit", "Congo (Kinshasa)", 18.785631, -5.035767],
1013 + ["Mbandaka", "Mbandaka", "Congo (Kinshasa)", 18.288744, 0.0226],
1014 + ["Gbadolite", "Gbadolite", "Congo (Kinshasa)", 20.975283, 4.253206],
1015 + ["Gemena", "Gemena", "Congo (Kinshasa)", 19.771258, 3.235369],
1016 + ["Kotakoli", "Kotakoli", "Congo (Kinshasa)", 21.650917, 4.157639],
1017 + ["Lisala", "Lisala", "Congo (Kinshasa)", 21.496906, 2.170658],
1018 + ["Kisangani Simisini", "Kisangani", "Congo (Kinshasa)", 25.155014, 0.5175],
1019 + ["Matari", "Isiro", "Congo (Kinshasa)", 27.588253, 2.827606],
1020 + ["Bunia", "Bunia", "Congo (Kinshasa)", 30.220833, 1.565719],
1021 + ["Buta Zega", "Buta Zega", "Congo (Kinshasa)", 24.793706, 2.818347],
1022 + ["Bukavu Kavumu", "Bukavu/kavumu", "Congo (Kinshasa)", 28.808803, -2.308978],
1023 + ["Goma", "Goma", "Congo (Kinshasa)", 29.238464, -1.670814],
1024 + ["Kindu", "Kindu", "Congo (Kinshasa)", 25.915361, -2.919178],
1025 + ["Lubumbashi Intl", "Lubumashi", "Congo (Kinshasa)", 27.530889, -11.591333],
1026 + ["Kolwezi", "Kolwezi", "Congo (Kinshasa)", 25.505714, -10.765886],
1027 + ["Kalemie", "Kalemie", "Congo (Kinshasa)", 29.25, -5.875556],
1028 + ["Kamina Base", "Kamina Base", "Congo (Kinshasa)", 25.252897, -8.642025],
1029 + ["Kananga", "Kananga", "Congo (Kinshasa)", 22.469166, -5.900055],
1030 + ["Mbuji Mayi", "Mbuji-mayi", "Congo (Kinshasa)", 23.569008, -6.121236],
1031 + ["Senou", "Bamako", "Mali", -7.949944, 12.533544],
1032 + ["Gao", "Gao", "Mali", -0.005456, 16.248433],
1033 + ["Kayes Dag Dag", "Kayes", "Mali", -11.404397, 14.481233],
1034 + ["Ambodedjo", "Mopti", "Mali", -4.079561, 14.512803],
1035 + ["Tombouctou", "Tombouctou", "Mali", -3.007583, 16.730458],
1036 + ["Tessalit", "Tessalit", "Mali", 0.977308, 20.242983],
1037 + ["Banjul Intl", "Banjul", "Gambia", -16.652206, 13.337961],
1038 + ["Fuerteventura", "Fuerteventura", "Spain", -13.863761, 28.452717],
1039 + ["Hierro", "Hierro", "Spain", -17.887056, 27.814847],
1040 + ["La Palma", "Santa Cruz De La Palma", "Spain", -17.755611, 28.626478],
1041 + ["Gran Canaria", "Gran Canaria", "Spain", -15.386586, 27.931886],
1042 + ["Lanzarote", "Las Palmas", "Spain", -13.605225, 28.945464],
1043 + ["Tenerife Sur", "Tenerife", "Spain", -16.572489, 28.044475],
1044 + ["Tenerife Norte", "Tenerife", "Spain", -16.341536, 28.482653],
1045 + ["Melilla", "Melilla", "Spain", -2.956256, 35.279817],
1046 + ["Freetown Lungi", "Freetown", "Sierra Leone", -13.195489, 8.616444],
1047 + ["Cufar", "Cufar", "Guinea-Bissau", -15.1805, 11.287917],
1048 + ["Monrovia Spriggs Payne", "Monrovia", "Liberia", -10.758722, 6.289061],
1049 + ["Monrovia Roberts Intl", "Monrovia", "Liberia", -10.362311, 6.233789],
1050 + ["Inezgane", "Agadir", "Morocco", -9.546311, 30.381353],
1051 + ["Plage Blanche", "Tan Tan", "Morocco", -11.161347, 28.448194],
1052 + ["Saiss", "Fes", "Morocco", -4.977958, 33.927261],
1053 + ["Ifrane", "Ifrane", "Morocco", -5.152903, 33.505319],
1054 + ["Moulay Ali Cherif", "Er-rachidia", "Morocco", -4.398333, 31.9475],
1055 + ["Bassatine", "Meknes", "Morocco", -5.515125, 33.879067],
1056 + ["Angads", "Oujda", "Morocco", -1.923986, 34.78715],
1057 + ["Ben Slimane", "Ben Slimane", "Morocco", -7.22145, 33.655422],
1058 + ["Sale", "Rabat", "Morocco", -6.751519, 34.051467],
1059 + ["Mohammed V Intl", "Casablanca", "Morocco", -7.589967, 33.367467],
1060 + ["Menara", "Marrakech", "Morocco", -8.0363, 31.606886],
1061 + ["Kenitra", "Kentira", "Morocco", -6.595878, 34.298864],
1062 + ["Ouarzazate", "Ouarzazate", "Morocco", -6.909431, 30.939053],
1063 + ["Cherif El Idrissi", "Al Hociema", "Morocco", -3.839525, 35.177103],
1064 + ["Saniat Rmel", "Tetouan", "Morocco", -5.320019, 35.594333],
1065 + ["Ibn Batouta", "Tanger", "Morocco", -5.916889, 35.726917],
1066 + ["Ziguinchor", "Ziguinchor", "Senegal", -16.281783, 12.555617],
1067 + ["Cap Skiring", "Cap Skiring", "Senegal", -16.746125, 12.4102],
1068 + ["Kaolack", "Kaolack", "Senegal", -16.051297, 14.146881],
1069 + ["Leopold Sedar Senghor Intl", "Dakar", "Senegal", -17.490225, 14.739708],
1070 + ["Saint Louis", "St. Louis", "Senegal", -16.463172, 16.050761],
1071 + ["Bakel", "Bakel", "Senegal", -12.468264, 14.847256],
1072 + ["Kedougou", "Kedougou", "Senegal", -12.220333, 12.572292],
1073 + ["Tambacounda", "Tambacounda", "Senegal", -13.653122, 13.736817],
1074 + ["Aioun El Atrouss", "Aioun El Atrouss", "Mauritania", -9.637883, 16.711294],
1075 + ["Tidjikja", "Tidjikja", "Mauritania", -11.423547, 18.570103],
1076 + ["Kiffa", "Kiffa", "Mauritania", -11.406208, 16.589983],
1077 + ["Nema", "Nema", "Mauritania", -7.316567, 16.622],
1078 + ["Kaedi", "Kaedi", "Mauritania", -13.507617, 16.159547],
1079 + ["Nouakchott", "Nouakschott", "Mauritania", -15.947956, 18.097856],
1080 + ["Selibady", "Selibabi", "Mauritania", -12.207272, 15.179692],
1081 + ["Atar", "Atar", "Mauritania", -13.043194, 20.506828],
1082 + ["Nouadhibou", "Nouadhibou", "Mauritania", -17.029956, 20.933067],
1083 + ["Bir Moghrein", "Bir Moghrein", "Mauritania", -11.588697, 25.236697],
1084 + ["Fria", "Fira", "Guinea", -13.569167, 10.350556],
1085 + ["Faranah", "Faranah", "Guinea", -10.769825, 10.035467],
1086 + ["Labe", "Labe", "Guinea", -12.28685, 11.326058],
1087 + ["Amilcar Cabral Intl", "Amilcar Cabral", "Cape Verde", -22.949444, 16.741389],
1088 + ["Rabil", "Boa Vista", "Cape Verde", -22.888897, 16.136531],
1089 + ["Maio", "Maio", "Cape Verde", -23.213703, 15.155928],
1090 + ["Preguica", "Sao Nocolau Island", "Cape Verde", -24.284656, 16.588356],
1091 + ["Sao Pedro", "Sao Vicente Island", "Cape Verde", -25.054661, 16.833689],
1092 + ["Bole Intl", "Addis Ababa", "Ethiopia", 38.799319, 8.977889],
1093 + ["Lideta", "Addis Ababa", "Ethiopia", 38.726019, 9.003681],
1094 + ["Arba Minch", "Arba Minch", "Ethiopia", 37.590453, 6.039389],
1095 + ["Axum", "Axum", "Ethiopia", 38.772833, 14.14675],
1096 + ["Bahir Dar", "Bahar Dar", "Ethiopia", 37.321644, 11.608075],
1097 + ["Dire Dawa Intl", "Dire Dawa", "Ethiopia", 41.854203, 9.6247],
1098 + ["Gambella", "Gambella", "Ethiopia", 34.563131, 8.128764],
1099 + ["Gondar", "Gondar", "Ethiopia", 37.434047, 12.5199],
1100 + ["South Ari Atoll", "Paradies Island", "Maldives", 72.8369, 3.4833],
1101 + ["Jimma", "Jimma", "Ethiopia", 36.816639, 7.666094],
1102 + ["Lalibella", "Lalibella", "Ethiopia", 38.979969, 11.975014],
1103 + ["Makale", "Makale", "Ethiopia", 39.533464, 13.467367],
1104 + ["Asosa", "Asosa", "Ethiopia", 34.586253, 10.01855],
1105 + ["Bujumbura Intl", "Bujumbura", "Burundi", 29.318519, -3.324019],
1106 + ["Egal Intl", "Hargeisa", "Somalia", 44.088758, 9.518167],
1107 + ["Berbera", "Berbera", "Somalia", 44.941106, 10.389167],
1108 + ["Kisimayu", "Kismayu", "Somalia", 42.459233, -0.377353],
1109 + ["Dowagiac Municipal Airport", "Dowagiac", "United States", -86.1280125, 41.9929342],
1110 + ["Alexandria Intl", "Alexandria", "Egypt", 29.948889, 31.183903],
1111 + ["Abu Simbel", "Abu Simbel", "Egypt", 31.611722, 22.375953],
1112 + ["Cairo Intl", "Cairo", "Egypt", 31.405556, 30.121944],
1113 + ["Cairo West", "Cairo", "Egypt", 30.915445, 30.116362],
1114 + ["Hurghada Intl", "Hurghada", "Egypt", 33.799436, 27.178317],
1115 + ["El Gora", "El Gorah", "Egypt", 34.129194, 31.068975],
1116 + ["Luxor Intl", "Luxor", "Egypt", 32.706583, 25.671028],
1117 + ["Mersa Matruh", "Mersa-matruh", "Egypt", 27.221689, 31.325356],
1118 + ["Port Said", "Port Said", "Egypt", 32.24, 31.279444],
1119 + ["St Catherine Intl", "St. Catherine", "Egypt", 34.0625, 28.685278],
1120 + ["Aswan Intl", "Aswan", "Egypt", 32.819975, 23.964356],
1121 + ["El Tor", "El-tor", "Egypt", 33.645517, 28.209028],
1122 + ["Eldoret Intl", "Eldoret", "Kenya", 35.238928, 0.404458],
1123 + ["Kakamega", "Kakamega", "Kenya", 34.787297, 0.271342],
1124 + ["Kisumu", "Kisumu", "Kenya", 34.728892, -0.086139],
1125 + ["Kitale", "Kitale", "Kenya", 34.958556, 0.971989],
1126 + ["Cambridge Municipal Airport", "Cambridge", "United States", -81.5775833, 39.9750278],
1127 + ["Lodwar", "Lodwar", "Kenya", 35.608692, 3.121967],
1128 + ["Lamu Manda", "Lamu", "Kenya", 40.913097, -2.252417],
1129 + ["Mombasa Moi Intl", "Mombasa", "Kenya", 39.59425, -4.034833],
1130 + ["Naivasha", "Naivasha", "Kenya", 36.433528, -0.787953],
1131 + ["Nairobi Wilson", "Nairobi", "Kenya", 36.814833, -1.321719],
1132 + ["Eastleigh", "Nairobi", "Kenya", 36.862339, -1.277267],
1133 + ["Wajir", "Wajir", "Kenya", 40.091606, 1.733239],
1134 + ["Bu Attifel", "Buattifel", "Libya", 22.080939, 28.795372],
1135 + ["Warehouse 59e", "Giallo", "Libya", 21.438042, 28.638458],
1136 + ["Ghat", "Ghat", "Libya", 10.142647, 25.145564],
1137 + ["Kufra", "Kufra", "Libya", 23.313958, 24.178728],
1138 + ["Benina", "Benghazi", "Libya", 20.269472, 32.096786],
1139 + ["Sebha", "Sebha", "Libya", 14.472525, 26.986964],
1140 + ["Tripoli Intl", "Tripoli", "Libya", 13.159011, 32.663544],
1141 + ["Marsa Brega", "Marsa Brega", "Libya", 19.576444, 30.378139],
1142 + ["Ras Lanuf Oil", "Ras Lanouf V 40", "Libya", 18.527161, 30.500013],
1143 + ["Hon", "Hon", "Libya", 15.965567, 29.110106],
1144 + ["Dahra", "Dahra", "Libya", 17.934936, 29.472567],
1145 + ["Ghadames East", "Ghadames", "Libya", 9.715305, 30.151695],
1146 + ["Zella 74", "Zella 74", "Libya", 17.293858, 28.589878],
1147 + ["Gisenyi", "Gisenyi", "Rwanda", 29.258875, -1.677203],
1148 + ["Kigali Intl", "Kigali", "Rwanda", 30.13945, -1.968628],
1149 + ["Kamembe", "Kamembe", "Rwanda", 28.90795, -2.462242],
1150 + ["Dongola", "Dongola", "Sudan", 30.430094, 19.153867],
1151 + ["Damazin", "Damazin", "Sudan", 34.336656, 11.785889],
1152 + ["El Fashir", "El Fasher", "Sudan", 25.32465, 13.614892],
1153 + ["Kassala", "Kassala", "Sudan", 36.328842, 15.387494],
1154 + ["Kadugli", "Kadugli", "Sudan", 29.701122, 11.138028],
1155 + ["El Obeid", "El Obeid", "Sudan", 30.232675, 13.153219],
1156 + ["Juba", "Juba", "South Sudan", 31.601117, 4.872006],
1157 + ["Malakal", "Malakal", "Sudan", 31.652242, 9.558969],
1158 + ["Khartoum", "Khartoum", "Sudan", 32.553161, 15.589497],
1159 + ["Arusha", "Arusha", "Tanzania", 36.633333, -3.367794],
1160 + ["Mwalimu Julius K Nyerere Intl", "Dar Es Salaam", "Tanzania", 39.202625, -6.878111],
1161 + ["Dodoma", "Dodoma", "Tanzania", 35.752578, -6.170436],
1162 + ["Iringa", "Iringa", "Tanzania", 35.752114, -7.668633],
1163 + ["Kilimanjaro Intl", "Kilimanjaro", "Tanzania", 37.074461, -3.429406],
1164 + ["Lake Manyara", "Lake Manyara", "Tanzania", 35.818278, -3.376306],
1165 + ["Mtwara", "Mtwara", "Tanzania", 40.181781, -10.339058],
1166 + ["Mwanza", "Mwanza", "Tanzania", 32.932667, -2.444486],
1167 + ["Pemba", "Pemba", "Tanzania", 39.811417, -5.257264],
1168 + ["Tanga", "Tanga", "Tanzania", 39.071158, -5.092358],
1169 + ["Zanzibar", "Zanzibar", "Tanzania", 39.224886, -6.222025],
1170 + ["Entebbe Intl", "Entebbe", "Uganda", 32.443503, 0.042386],
1171 + ["Dusseldorf Hauptbahnhof", "Dusseldorf", "Germany", 6.792778, 51.220278],
1172 + ["Soroti", "Soroti", "Uganda", 33.622861, 1.727578],
1173 + ["Tirana Rinas", "Tirana", "Albania", 19.720561, 41.414742],
1174 + ["Burgas", "Bourgas", "Bulgaria", 27.515236, 42.569583],
1175 + ["Gorna Oryahovitsa", "Gorna Orechovica", "Bulgaria", 25.712889, 43.151444],
1176 + ["Plovdiv", "Plovdiv", "Bulgaria", 24.850833, 42.067806],
1177 + ["Sofia", "Sofia", "Bulgaria", 23.406167, 42.695194],
1178 + ["Stara Zagora", "Stara Zagora", "Bulgaria", 25.655195, 42.376667],
1179 + ["Varna", "Varna", "Bulgaria", 27.825106, 43.232072],
1180 + ["Larnaca", "Larnaca", "Cyprus", 33.62485, 34.875117],
1181 + ["Pafos Intl", "Paphos", "Cyprus", 32.485731, 34.718039],
1182 + ["Akrotiri", "Akrotiri", "Cyprus", 32.987861, 34.590416],
1183 + ["Dubrovnik", "Dubrovnik", "Croatia", 18.268244, 42.561353],
1184 + ["Cepin", "Cepin", "Croatia", 18.636233, 45.542169],
1185 + ["Osijek", "Osijek", "Croatia", 18.810156, 45.462667],
1186 + ["Pula", "Pula", "Croatia", 13.922192, 44.893533],
1187 + ["Grobnicko Polje", "Grobnik", "Croatia", 14.503756, 45.379483],
1188 + ["Rijeka", "Rijeka", "Croatia", 14.570267, 45.216889],
1189 + ["Split", "Split", "Croatia", 16.297964, 43.538944],
1190 + ["Varazdin", "Varazdin", "Croatia", 16.38125, 46.294724],
1191 + ["Zagreb", "Zagreb", "Croatia", 16.068778, 45.742931],
1192 + ["Zadar", "Zadar", "Croatia", 15.346697, 44.108269],
1193 + ["Udbina", "Udbina", "Croatia", 15.774361, 44.55761],
1194 + ["Albacete", "Albacete", "Spain", -1.863517, 38.948528],
1195 + ["Alicante", "Alicante", "Spain", -0.558156, 38.282169],
1196 + ["Almeria", "Almeria", "Spain", -2.370097, 36.843936],
1197 + ["Asturias", "Aviles", "Spain", -6.034622, 43.563567],
1198 + ["Cordoba", "Cordoba", "Spain", -4.848878, 37.842006],
1199 + ["Bilbao", "Bilbao", "Spain", -2.910608, 43.301097],
1200 + ["Barcelona", "Barcelona", "Spain", 2.078464, 41.297078],
1201 + ["Talavera La Real", "Badajoz", "Spain", -6.821333, 38.89125],
1202 + ["A Coruna", "La Coruna", "Spain", -8.377256, 43.302061],
1203 + ["Armilla", "Granada", "Spain", -3.635694, 37.133222],
1204 + ["Girona", "Gerona", "Spain", 2.760547, 41.900969],
1205 + ["Granada", "Granada", "Spain", -3.777356, 37.188731],
1206 + ["Getafe", "Madrid", "Spain", -3.723833, 40.294139],
1207 + ["Ibiza", "Ibiza", "Spain", 1.373117, 38.872858],
1208 + ["Jerez", "Jerez", "Spain", -6.060111, 36.744622],
1209 + ["Murcia San Javier", "Murcia", "Spain", -0.812389, 37.774972],
1210 + ["Alexion", "Porto Heli", "Greece", 23.148986, 37.298792],
1211 + ["Barajas", "Madrid", "Spain", -3.566764, 40.493556],
1212 + ["Malaga", "Malaga", "Spain", -4.499106, 36.6749],
1213 + ["Menorca", "Menorca", "Spain", 4.218647, 39.862597],
1214 + ["Moron Ab", "Sevilla", "Spain", -5.615944, 37.174917],
1215 + ["Ocana", "Ocana", "Spain", -3.503333, 39.9375],
1216 + ["Pamplona", "Pamplona", "Spain", -1.646331, 42.770039],
1217 + ["Alcantarilla", "Murcia", "Spain", -1.230319, 37.951111],
1218 + ["Reus", "Reus", "Spain", 1.167172, 41.147392],
1219 + ["Rota Ns", "Rota", "Spain", -6.349458, 36.645211],
1220 + ["Salamanca", "Salamanca", "Spain", -5.501986, 40.952117],
1221 + ["Son Bonet", "Son Bonet", "Spain", 2.702778, 39.598889],
1222 + ["Palma De Mallorca", "Palma De Mallorca", "Spain", 2.738808, 39.551675],
1223 + ["San Luis", "San Luis", "Spain", 4.258333, 39.862222],
1224 + ["San Sebastian", "San Sebastian", "Spain", -1.790611, 43.356519],
1225 + ["Santiago", "Santiago", "Spain", -8.415144, 42.896333],
1226 + ["Seo De Urgel", "Seo De Urgel", "Spain", 1.409167, 42.338611],
1227 + ["Torrejon", "Madrid", "Spain", -3.445872, 40.496747],
1228 + ["Valencia", "Valencia", "Spain", -0.481625, 39.489314],
1229 + ["Valladolid", "Valladolid", "Spain", -4.851944, 41.706111],
1230 + ["Cuatro Vientos", "Madrid", "Spain", -3.785144, 40.370678],
1231 + ["Vitoria", "Vitoria", "Spain", -2.724469, 42.882836],
1232 + ["Vigo", "Vigo", "Spain", -8.626775, 42.2318],
1233 + ["Santander", "Santander", "Spain", -3.820006, 43.427064],
1234 + ["Zaragoza Ab", "Zaragoza", "Spain", -1.041553, 41.666242],
1235 + ["Sevilla", "Sevilla", "Spain", -5.893106, 37.418],
1236 + ["Calais Dunkerque", "Calais", "France", 1.954764, 50.962097],
1237 + ["Peronne St Quentin", "Peronne", "France", 3.029578, 49.868547],
1238 + ["Les Loges", "Nangis", "France", 3.006786, 48.596219],
1239 + ["Couterne", "Bagnole-de-l'orne", "France", -0.387444, 48.545836],
1240 + ["Bray", "Albert", "France", 2.697661, 49.971531],
1241 + ["Le Touquet Paris Plage", "Le Tourquet", "France", 1.620587, 50.517385],
1242 + ["Denain", "Valenciennes", "France", 3.461264, 50.325808],
1243 + ["Glisy", "Amiens", "France", 2.387075, 49.873019],
1244 + ["La Garenne", "Agen", "France", 0.590556, 44.174721],
1245 + ["Cazaux", "Cazaux", "France", -1.125, 44.533333],
1246 + ["Merignac", "Bordeaux", "France", -0.715556, 44.828335],
1247 + ["Roumaniere", "Bergerac", "France", 0.518611, 44.825279],
1248 + ["Francazal", "Toulouse", "France", 1.3675, 43.545555],
1249 + ["Chateaubernard", "Cognac", "France", -0.3175, 45.658333],
1250 + ["Biard", "Poitiers", "France", 0.306666, 46.587745],
1251 + ["Montlucon Gueret", "Montlucon-gueret", "France", 2.363964, 46.222644],
1252 + ["Bellegarde", "Limoges", "France", 1.179444, 45.862778],
1253 + ["Mont De Marsan", "Mont-de-marsan", "France", -0.5075, 43.911667],
1254 + ["Souche", "Niort", "France", -0.401503, 46.311303],
1255 + ["Blagnac", "Toulouse", "France", 1.363819, 43.629075],
1256 + ["Pau Pyrenees", "Pau", "France", -0.418611, 43.38],
1257 + ["Lherm", "La Rochelle", "France", 1.263333, 43.448891],
1258 + ["Lourdes", "Tarbes", "France", -0.006439, 43.178675],
1259 + ["Brie Champniers", "Angouleme", "France", 0.221456, 45.729247],
1260 + ["La Roche", "Brive", "France", 1.469167, 45.150833],
1261 + ["Bassillac", "Perigueux", "France", 0.815556, 45.198055],
1262 + ["Anglet", "Biarritz-bayonne", "France", -1.523325, 43.468419],
1263 + ["Lalbenque", "Cahors", "France", 1.475278, 44.351387],
1264 + ["Antichan", "St.-girons", "France", 1.10315, 43.007764],
1265 + ["La Teste De Buch", "Arcachon", "France", -1.110833, 44.59639],
1266 + ["Le Sequestre", "Albi", "France", 2.113056, 43.913887],
1267 + ["Mazamet", "Castres", "France", 2.289183, 43.55625],
1268 + ["Lasbordes", "Toulouse", "France", 1.499167, 43.586113],
1269 + ["Larzac", "Millau", "France", 3.183, 43.989342],
1270 + ["Montdragon", "Graulhet", "France", 2.010833, 43.771111],
1271 + ["Marcillac", "Rodez", "France", 2.482672, 44.407869],
1272 + ["Thalamy", "Ussel", "France", 2.423889, 45.534721],
1273 + ["Villeneuve Sur Lot", "Villeneuve-sur-lot", "France", 0.758889, 44.396946],
1274 + ["Medis", "Royan", "France", -0.9725, 45.628056],
1275 + ["Mimizan", "Mimizan", "France", -1.174444, 44.146111],
1276 + ["Aire Sur L Adour", "Aire-sur-l'adour", "France", -0.245278, 43.709444],
1277 + ["Montauban", "Montauban", "France", 1.378042, 44.025694],
1278 + ["Lamothe", "Auch", "France", 0.601667, 43.687778],
1279 + ["Artigues De Lussac", "Libourne", "France", -0.134722, 44.982498],
1280 + ["Les Pujols", "Pamiers", "France", 1.695833, 43.090556],
1281 + ["Virazeil", "Marmande", "France", 0.200514, 44.498919],
1282 + ["St Agnant", "Rochefort", "France", -0.983056, 45.887779],
1283 + ["Pontivy", "Pontivy", "France", -2.921244, 48.056789],
1284 + ["Aubigny Sur Nere", "Aubigny-sur-nere", "France", 2.393055, 47.474167],
1285 + ["Scaer", "Guiscriff-scaer", "France", -3.664717, 48.052508],
1286 + ["Ancenis", "Ancenis", "France", -1.1775, 47.408056],
1287 + ["Brienne Le Chateau", "Brienne-le Chateau", "France", 4.482222, 48.429764],
1288 + ["Houssen", "Colmar", "France", 7.359011, 48.109853],
1289 + ["Challanges", "Beaune", "France", 4.893425, 47.005886],
1290 + ["Tavaux", "Dole", "France", 5.42725, 47.039014],
1291 + ["Joigny", "Joigny", "France", 3.392222, 47.992222],
1292 + ["Le Rozelier", "Verdun", "France", 5.469047, 49.122383],
1293 + ["Ardeche Meridionale", "Aubenas-vals-lanas", "France", 4.372192, 44.544236],
1294 + ["Loudes", "Le Puy", "France", 3.762889, 45.080689],
1295 + ["Coltines", "St.-flour", "France", 2.993611, 45.076389],
1296 + ["Ceyzeriat", "Bourg", "France", 5.292028, 46.20089],
1297 + ["Tarare", "Vilefrance", "France", 4.634906, 45.901947],
1298 + ["Montbeugny", "Moulins", "France", 3.423725, 46.534581],
1299 + ["Belmont", "St.-afrique-belmont", "France", 2.745278, 43.823334],
1300 + ["Cassagnes Begonhes", "Cassagnes-beghones", "France", 2.515, 44.177776],
1301 + ["Metz Nancy Lorraine", "Metz", "France", 6.251319, 48.982142],
1302 + ["Poretta", "Bastia", "France", 9.483731, 42.552664],
1303 + ["Saint Catherine", "Calvi", "France", 8.793189, 42.530753],
1304 + ["Sud Corse", "Figari", "France", 9.097777, 41.500557],
1305 + ["Campo Dell Oro", "Ajaccio", "France", 8.802917, 41.923637],
1306 + ["Propriano", "Propriano", "France", 8.889747, 41.660558],
1307 + ["Solenzara", "Solenzara", "France", 9.406, 41.924416],
1308 + ["Corte", "Corte", "France", 9.193055, 42.29361],
1309 + ["Branches", "Auxerre", "France", 3.497111, 47.850193],
1310 + ["Aix Les Bains", "Chambery", "France", 5.880225, 45.63805],
1311 + ["Auvergne", "Clermont-Ferrand", "France", 3.169169, 45.786661],
1312 + ["Bourges", "Bourges", "France", 2.370278, 47.058056],
1313 + ["Challes Les Eaux", "Chambery", "France", 5.975761, 45.56105],
1314 + ["Champforgeuil", "Chalon", "France", 4.817633, 46.826108],
1315 + ["Annemasse", "Annemasse", "France", 6.268386, 46.191972],
1316 + ["Saint Exupery", "Lyon", "France", 5.090833, 45.726387],
1317 + ["Charnay", "Macon", "France", 4.795767, 46.295103],
1318 + ["Saint Yan", "St.-yan", "France", 4.013264, 46.412536],
1319 + ["Renaison", "Roanne", "France", 4.001389, 46.058334],
1320 + ["Meythet", "Annecy", "France", 6.098764, 45.929233],
1321 + ["Saint Geoirs", "Grenoble", "France", 5.329375, 45.362944],
1322 + ["Domerat", "Montlucon", "France", 2.570486, 46.352525],
1323 + ["Chabeuil", "Valence", "France", 4.9699, 44.921594],
1324 + ["Charmeil", "Vichy", "France", 3.403736, 46.169689],
1325 + ["Aurillac", "Aurillac", "France", 2.421944, 44.891388],
1326 + ["Deols", "Chateauroux", "France", 1.730667, 46.862194],
1327 + ["Bron", "Lyon", "France", 4.944275, 45.727172],
1328 + ["Aix Les Milles", "Aix-les-milles", "France", 5.367778, 43.505554],
1329 + ["Le Cannet", "Le Luc", "France", 6.387139, 43.384672],
1330 + ["Mandelieu", "Cannes", "France", 6.953478, 43.54205],
1331 + ["Boutheon", "St-Etienne", "France", 4.296389, 45.540554],
1332 + ["Le Tube", "Istres", "France", 4.923844, 43.522736],
1333 + ["Salvaza", "Carcassonne", "France", 2.306317, 43.215978],
1334 + ["Provence", "Marseille", "France", 5.213611, 43.435555],
1335 + ["Cote D\\\\'Azur", "Nice", "France", 7.215872, 43.658411],
1336 + ["Caritat", "Orange", "France", 4.866717, 44.140481],
1337 + ["Rivesaltes", "Perpignan", "France", 2.870667, 42.740442],
1338 + ["Le Castellet", "Le Castellet", "France", 5.785189, 43.252506],
1339 + ["Deaux", "Ales", "France", 4.142122, 44.069656],
1340 + ["Mediterranee", "Montpellier", "France", 3.963014, 43.576194],
1341 + ["Vias", "Beziers", "France", 3.353903, 43.323522],
1342 + ["Caumont", "Avignon", "France", 4.901831, 43.9073],
1343 + ["Salon", "Salon", "France", 5.10925, 43.606415],
1344 + ["Lezignan Corbieres", "Lezignan-corbieres", "France", 2.734167, 43.175835],
1345 + ["Brenoux", "Mende", "France", 3.532819, 44.502108],
1346 + ["Carpentras", "Carpentras", "France", 5.078058, 44.029847],
1347 + ["Avord", "Avord", "France", 2.6325, 47.053333],
1348 + ["Tille", "Beauvais", "France", 2.112778, 49.454444],
1349 + ["Chateaudun", "Chateaudun", "France", 1.376625, 48.058142],
1350 + ["St Florent", "Saumur", "France", -0.115142, 47.256839],
1351 + ["Fauville", "Evreux", "France", 1.219864, 49.028669],
1352 + ["Octeville", "Le Havre", "France", 0.088056, 49.533889],
1353 + ["Abbeville", "Abbeville", "France", 1.831892, 50.143492],
1354 + ["Bricy", "Orleans", "France", 1.760556, 47.987778],
1355 + ["Vatry", "Chalons", "France", 4.184492, 48.776072],
1356 + ["Vallee De Seine", "Rouen", "France", 1.1748, 49.384172],
1357 + ["Val De Loire", "Tours", "France", 0.727606, 47.432222],
1358 + ["Le Pontreau", "Cholet", "France", -0.877064, 47.082136],
1359 + ["Entrammes", "Laval", "France", -0.742986, 48.031361],
1360 + ["St Denis De L Hotel", "Orleans", "France", 2.163333, 47.896946],
1361 + ["Le Bourget", "Paris", "France", 2.441389, 48.969444],
1362 + ["Creil", "Creil", "France", 2.519139, 49.253547],
1363 + ["Charles De Gaulle", "Paris", "France", 2.55, 49.012779],
1364 + ["Voisins", "Coulommiers", "France", 3.016117, 48.837653],
1365 + ["Villaroche", "Melun", "France", 2.671119, 48.604725],
1366 + ["Toussus Le Noble", "Toussous-le-noble", "France", 2.106189, 48.751922],
1367 + ["Orly", "Paris", "France", 2.359444, 48.725278],
1368 + ["Cormeilles En Vexin", "Pontoise", "France", 2.040833, 49.096647],
1369 + ["Velizy", "Villacoublay", "France", 2.201536, 48.774406],
1370 + ["Prunay", "Reims", "France", 4.156581, 49.208689],
1371 + ["Barberey", "Troyes", "France", 4.016703, 48.322136],
1372 + ["Croismare", "Luneville", "France", 6.543456, 48.593275],
1373 + ["Rouvres", "Etain", "France", 5.672219, 49.226917],
1374 + ["Bellevue", "Autun", "France", 4.260572, 46.967283],
1375 + ["Fourchambault", "Nevers", "France", 3.113333, 47.002625],
1376 + ["Epinoy", "Cambrai", "France", 3.154236, 50.221814],
1377 + ["Elesmes", "Maubeuge", "France", 4.033119, 50.310467],
1378 + ["La Veze", "Besancon-la-veze", "France", 6.083681, 47.206567],
1379 + ["Bourscheid", "Phalsbourg", "France", 7.200519, 48.76625],
1380 + ["Lesquin", "Lille", "France", 3.089444, 50.561942],
1381 + ["Calonne", "Merville", "France", 2.642242, 50.618394],
1382 + ["Charleville Mezieres", "Charleville", "France", 4.647078, 49.783942],
1383 + ["Frotey", "Vesoul-frotey", "France", 6.203922, 47.637611],
1384 + ["Guipavas", "Brest", "France", -4.418539, 48.447911],
1385 + ["Maupertus", "Cherbourg", "France", -1.470281, 49.650106],
1386 + ["Pleurtuit", "Dinard", "France", -2.079958, 48.587683],
1387 + ["Escoublac", "La Baule", "France", -2.346389, 47.289444],
1388 + ["Granville", "Granville", "France", -1.564167, 48.883057],
1389 + ["St Gatien", "Deauville", "France", 0.154306, 49.365339],
1390 + ["Lann Bihoue", "Lorient", "France", -3.44, 47.760555],
1391 + ["Les Ajoncs", "La Roche-sur-yon", "France", -1.378625, 46.701944],
1392 + ["Landivisiau", "Landivisiau", "France", -4.151642, 48.530258],
1393 + ["Carpiquet", "Caen", "France", -0.45, 49.173333],
1394 + ["Poulmic", "Lanvedoc", "France", -4.445017, 48.281703],
1395 + ["Arnage", "Le Mans", "France", 0.201667, 47.948611],
1396 + ["St Jacques", "Rennes", "France", -1.734794, 48.069508],
1397 + ["Lannion", "Lannion", "France", -3.471656, 48.754378],
1398 + ["Pluguffan", "Quimper", "France", -4.167786, 47.974981],
1399 + ["Nantes Atlantique", "Nantes", "France", -1.610725, 47.153189],
1400 + ["Armor", "St.-brieuc Armor", "France", -2.854445, 48.537777],
1401 + ["Ploujean", "Morlaix", "France", -3.815783, 48.603222],
1402 + ["Meucon", "Vannes", "France", -2.718561, 47.723303],
1403 + ["Montoir", "St.-nazaire", "France", -2.149181, 47.312189],
1404 + ["Bale Mulhouse", "Mulhouse", "France", 7.529914, 47.589583],
1405 + ["Meyenheim", "Colmar", "France", 7.399669, 47.921978],
1406 + ["Longvic", "Dijon", "France", 5.09, 47.26889],
1407 + ["Frescaty", "Metz", "France", 6.131667, 49.071667],
1408 + ["Mirecourt", "Epinal", "France", 6.069983, 48.324961],
1409 + ["Haguenau", "Haguenau", "France", 7.817613, 48.794331],
1410 + ["Robinson", "St.-dizier", "France", 4.899417, 48.636008],
1411 + ["Courcelles", "Montbeliard", "France", 6.790536, 47.487],
1412 + ["Essey", "Nancy", "France", 6.230458, 48.692069],
1413 + ["Ochey", "Nancy", "France", 5.955, 48.583056],
1414 + ["Pontarlier", "Pontarlier", "France", 6.327367, 46.903958],
1415 + ["Champagne", "Reims", "France", 4.05, 49.31],
1416 + ["Entzheim", "Strasbourg", "France", 7.628233, 48.538319],
1417 + ["Saint Sauveur", "Luxeuil", "France", 6.364056, 47.783131],
1418 + ["Pierrefeu", "Cuers", "France", 6.126697, 43.247803],
1419 + ["Le Palyvestre", "Hyeres", "France", 6.14603, 43.0973],
1420 + ["Garons", "Nimes", "France", 4.416347, 43.757444],
1421 + ["Miquelon", "Miquelon", "Saint Pierre and Miquelon", -56.380278, 47.095472],
1422 + ["St Pierre", "St.-pierre", "Saint Pierre and Miquelon", -56.173088, 46.762904],
1423 + ["Amberieu", "Amberieu", "France", 5.328445, 45.987335],
1424 + ["Damblain", "Damblain", "France", 5.664058, 48.086325],
1425 + ["Andravida", "Andravida", "Greece", 21.292583, 37.920708],
1426 + ["Agrinion", "Agrinion", "Greece", 21.351208, 38.602022],
1427 + ["Dimokritos", "Alexandroupolis", "Greece", 25.956264, 40.855869],
1428 + ["Alexandria", "Alexandria", "Greece", 22.488739, 40.651128],
1429 + ["Nea Anchialos", "Nea Anghialos", "Greece", 22.794339, 39.219619],
1430 + ["Elefsis", "Elefsis", "Greece", 23.556011, 38.063831],
1431 + ["Chios", "Chios", "Greece", 26.140572, 38.343175],
1432 + ["Ioannina", "Ioannina", "Greece", 20.8225, 39.696388],
1433 + ["Nikos Kazantzakis", "Heraklion", "Greece", 25.180297, 35.339719],
1434 + ["Aristotelis", "Kastoria", "Greece", 21.282186, 40.446294],
1435 + ["Kithira", "Kithira", "Greece", 23.016978, 36.274258],
1436 + ["Kefallinia", "Keffallinia", "Greece", 20.500481, 38.120069],
1437 + ["Kalamata", "Kalamata", "Greece", 22.025525, 37.068319],
1438 + ["Amigdhaleon", "Kavala", "Greece", 24.341417, 40.972775],
1439 + ["Kos", "Kos", "Greece", 27.091667, 36.793335],
1440 + ["Karpathos", "Karpathos", "Greece", 27.146008, 35.421408],
1441 + ["Ioannis Kapodistrias Intl", "Kerkyra/corfu", "Greece", 19.911667, 39.601944],
1442 + ["Kasos", "Kasos", "Greece", 26.910047, 35.421358],
1443 + ["Megas Alexandros Intl", "Kavala", "Greece", 24.619223, 40.913306],
1444 + ["Filippos", "Kozani", "Greece", 21.840834, 40.28611],
1445 + ["Leros", "Leros", "Greece", 26.800289, 37.184903],
1446 + ["Limnos", "Limnos", "Greece", 25.236308, 39.917072],
1447 + ["Larisa", "Larissa", "Greece", 22.4655, 39.650253],
1448 + ["Megara", "Megara", "Greece", 23.365422, 37.981114],
1449 + ["Mikonos", "Mykonos", "Greece", 25.348103, 37.435128],
1450 + ["Mitilini", "Mytilini", "Greece", 26.598333, 39.056667],
1451 + ["Aktio", "Preveza", "Greece", 20.765311, 38.925467],
1452 + ["Maritsa", "Rhodos", "Greece", 28.108889, 36.383056],
1453 + ["Rhodes Diagoras", "Rhodos", "Greece", 28.086192, 36.405419],
1454 + ["Araxos", "Patras", "Greece", 21.425556, 38.151111],
1455 + ["Souda", "Chania", "Greece", 24.149678, 35.531747],
1456 + ["Alexandros Papadiamantis", "Skiathos", "Greece", 23.503675, 39.1771],
1457 + ["Samos", "Samos", "Greece", 26.911667, 37.689999],
1458 + ["Ashford", "Lympne", "United Kingdom", 1.016667, 51.083333],
1459 + ["Sparti", "Sparti", "Greece", 22.526292, 36.973892],
1460 + ["Santorini", "Thira", "Greece", 25.479333, 36.399169],
1461 + ["Sitia", "Sitia", "Greece", 26.101325, 35.216108],
1462 + ["Stefanovikion", "Stefanovikion", "Greece", 22.767222, 39.48],
1463 + ["Skiros", "Skiros", "Greece", 24.487228, 38.967553],
1464 + ["Tanagra", "Tanagra", "Greece", 23.564958, 38.339847],
1465 + ["Kasteli", "Kasteli", "Greece", 25.327, 35.192019],
1466 + ["Tripolis", "Tripolis", "Greece", 22.403633, 37.530567],
1467 + ["Makedonia", "Thessaloniki", "Greece", 22.97095, 40.519725],
1468 + ["Tatoi", "Dekelia", "Greece", 23.783836, 38.108928],
1469 + ["Dionysios Solomos", "Zakynthos", "Greece", 20.88425, 37.750853],
1470 + ["Ferihegy", "Budapest", "Hungary", 19.255592, 47.436933],
1471 + ["Debrecen", "Debrecen", "Hungary", 21.615333, 47.488917],
1472 + ["Kecskemet", "Kecskemet", "Hungary", 19.749222, 46.9175],
1473 + ["Nyiregyhaza", "Nyirregyhaza", "Hungary", 21.692317, 47.983892],
1474 + ["Ocseny", "Ocseny", "Hungary", 18.769167, 46.303889],
1475 + ["Door County Cherryland Airport", "Sturgeon Bay", "United States", -87.4215556, 44.8436667],
1476 + ["Szentkiralyszabadja", "Azentkilyszabadja", "Hungary", 17.968444, 47.077861],
1477 + ["Szolnok", "Szolnok", "Hungary", 20.2355, 47.122861],
1478 + ["Amendola", "Amendola", "Italy", 15.718083, 41.541392],
1479 + ["Crotone", "Crotone", "Italy", 17.080169, 38.997225],
1480 + ["Bari", "Bari", "Italy", 16.760594, 41.138856],
1481 + ["Gino Lisa", "Foggia", "Italy", 15.535028, 41.432917],
1482 + ["Grottaglie", "Grottaglie", "Italy", 17.403212, 40.517514],
1483 + ["Lecce", "Lecce", "Italy", 18.133325, 40.239228],
1484 + ["Pescara", "Pescara", "Italy", 14.181067, 42.431656],
1485 + ["Casale", "Brindisi", "Italy", 17.947033, 40.657633],
1486 + ["Gioia Del Colle", "Gioia Del Colle", "Italy", 16.933333, 40.767833],
1487 + ["Lamezia Terme", "Lamezia", "Italy", 16.242269, 38.905394],
1488 + ["Catania Fontanarossa", "Catania", "Italy", 15.0664, 37.466781],
1489 + ["Lampedusa", "Lampedusa", "Italy", 12.618083, 35.497914],
1490 + ["Pantelleria", "Pantelleria", "Italy", 11.968864, 36.816519],
1491 + ["Palermo", "Palermo", "Italy", 13.091019, 38.175958],
1492 + ["Boccadifalco", "Palermo", "Italy", 13.313333, 38.110833],
1493 + ["Reggio Calabria", "Reggio Calabria", "Italy", 15.651556, 38.071206],
1494 + ["Trapani Birgi", "Trapani", "Italy", 12.487961, 37.911403],
1495 + ["Sigonella", "Sigonella", "Italy", 14.922358, 37.401664],
1496 + ["Alghero", "Alghero", "Italy", 8.290772, 40.632133],
1497 + ["Decimomannu", "Decimomannu", "Italy", 8.972481, 39.354222],
1498 + ["Elmas", "Cagliari", "Italy", 9.054283, 39.251469],
1499 + ["Olbia Costa Smeralda", "Olbia", "Italy", 9.517628, 40.898661],
1500 + ["Tortoli", "Tortoli", "Italy", 9.682981, 39.918761],
1501 + ["Aeritalia", "Turin", "Italy", 7.603375, 45.086353],
1502 + ["Bresso", "Milano", "Italy", 9.203333, 45.542222],
1503 + ["Malpensa", "Milano", "Italy", 8.728111, 45.630606],
1504 + ["Bergamo Orio Al Serio", "Bergamo", "Italy", 9.704166, 45.673889],
1505 + ["Torino", "Torino", "Italy", 7.649631, 45.200761],
1506 + ["Albenga", "Albenga", "Italy", 8.127428, 44.050608],
1507 + ["Genova Sestri", "Genoa", "Italy", 8.8375, 44.413333],
1508 + ["Linate", "Milan", "Italy", 9.276739, 45.445103],
1509 + ["Cameri", "Cameri", "Italy", 8.669225, 45.529592],
1510 + ["Parma", "Parma", "Italy", 10.296367, 44.824483],
1511 + ["Piacenza", "Piacenza", "Italy", 9.723333, 44.913055],
1512 + ["Shoestring Aviation Airfield", "Stewartstown", "United States", -76.6471914, 39.7948244],
1513 + ["Levaldigi", "Cuneo", "Italy", 7.623217, 44.547019],
1514 + ["Aviano Ab", "Aviano", "Italy", 12.596472, 46.031889],
1515 + ["Bolzano", "Bolzano", "Italy", 11.326383, 46.460194],
1516 + ["Cervia", "Cervia", "Italy", 12.307203, 44.224175],
1517 + ["Bologna", "Bologna", "Italy", 11.288667, 44.535444],
1518 + ["Treviso", "Treviso", "Italy", 12.194422, 45.6484],
1519 + ["Rivolto", "Rivolto", "Italy", 13.049331, 45.97875],
1520 + ["Forli", "Forli", "Italy", 12.070094, 44.194753],
1521 + ["Ghedi", "Ghedi", "Italy", 10.267667, 45.432167],
1522 + ["Verona Boscomantico", "Verona", "Italy", 10.927919, 45.472017],
1523 + ["Montichiari", "Brescia", "Italy", 10.330556, 45.428889],
1524 + ["Ronchi Dei Legionari", "Ronchi De Legionari", "Italy", 13.472222, 45.8275],
1525 + ["Rimini", "Rimini", "Italy", 12.611747, 44.020292],
1526 + ["Istrana", "Treviso", "Italy", 12.082881, 45.684867],
1527 + ["Vicenza", "Vicenza", "Italy", 11.52955, 45.573411],
1528 + ["Padova", "Padova", "Italy", 11.847903, 45.395767],
1529 + ["Villafranca", "Villafranca", "Italy", 10.888533, 45.395706],
1530 + ["Venezia Tessera", "Venice", "Italy", 12.351944, 45.505278],
1531 + ["Ampugnano", "Siena", "Italy", 11.255036, 43.256286],
1532 + ["Ciampino", "Rome", "Italy", 12.594936, 41.799361],
1533 + ["Pratica Di Mare", "Pratica Di Mare", "Italy", 12.445183, 41.654522],
1534 + ["Fiumicino", "Rome", "Italy", 12.250797, 41.804475],
1535 + ["Guidonia", "Guidonia", "Italy", 12.740833, 41.990278],
1536 + ["Marina Di Campo", "Marina Di Campo", "Italy", 10.239445, 42.760277],
1537 + ["Latina", "Latina", "Italy", 12.909019, 41.542436],
1538 + ["Grazzanise", "Grazzanise", "Italy", 14.081944, 41.060833],
1539 + ["Capodichino", "Naples", "Italy", 14.290781, 40.886033],
1540 + ["Pisa", "Pisa", "Italy", 10.39275, 43.683917],
1541 + ["Firenze", "Florence", "Italy", 11.2051, 43.809953],
1542 + ["Grosseto", "Grosseto", "Italy", 11.071897, 42.759747],
1543 + ["Urbe", "Rome", "Italy", 12.498889, 41.951946],
1544 + ["Viterbo", "Viterbo", "Italy", 12.064156, 42.430183],
1545 + ["Perugia", "Perugia", "Italy", 12.513222, 43.095906],
1546 + ["Cerklje", "Cerklje", "Slovenia", 15.530194, 45.899971],
1547 + ["Ljubljana", "Ljubljana", "Slovenia", 14.457611, 46.223686],
1548 + ["Maribor", "Maribor", "Slovenia", 15.686131, 46.479861],
1549 + ["Portoroz", "Portoroz", "Slovenia", 13.614978, 45.473353],
1550 + ["Slovenj Gradec", "Slovenj Gradec", "Slovenia", 15.116997, 46.471975],
1551 + ["Ceske Budejovice", "Ceske Budejovice", "Czech Republic", 14.427464, 48.946381],
1552 + ["Caslav", "Caslav", "Czech Republic", 15.381808, 49.939653],
1553 + ["Hradec Kralove", "Hradec Kralove", "Czech Republic", 15.845228, 50.2532],
1554 + ["Horovice", "Horovice", "Czech Republic", 13.893506, 49.848111],
1555 + ["Kbely", "Praha", "Czech Republic", 14.543642, 50.121367],
1556 + ["Kunovice", "Kunovice", "Czech Republic", 17.439722, 49.029444],
1557 + ["Karlovy Vary", "Karlovy Vary", "Czech Republic", 12.914983, 50.202978],
1558 + ["Plzen Line", "Line", "Czech Republic", 13.274617, 49.675172],
1559 + ["Mnichovo Hradiste", "Mnichovo Hradiste", "Czech Republic", 15.006592, 50.540211],
1560 + ["Mosnov", "Ostrava", "Czech Republic", 18.111053, 49.696292],
1561 + ["Namest", "Namest", "Czech Republic", 16.124925, 49.165833],
1562 + ["Pardubice", "Pardubice", "Czech Republic", 15.738647, 50.013419],
1563 + ["Pribram", "Pribram", "Czech Republic", 14.100567, 49.720078],
1564 + ["Prerov", "Prerov", "Czech Republic", 17.404722, 49.425833],
1565 + ["Ruzyne", "Prague", "Czech Republic", 14.26, 50.100833],
1566 + ["Turany", "Brno", "Czech Republic", 16.694433, 49.151269],
1567 + ["Vodochody", "Vodochody", "Czech Republic", 14.395806, 50.216581],
1568 + ["Ben Gurion", "Tel-aviv", "Israel", 34.886667, 32.011389],
1569 + ["Teyman", "Beer-sheba", "Israel", 34.722953, 31.287003],
1570 + ["Tel Nov", "Tel-nof", "Israel", 34.821844, 31.839472],
1571 + ["Eyn Shemer", "Eyn-shemer", "Israel", 35.007661, 32.440814],
1572 + ["Eilat", "Elat", "Israel", 34.960081, 29.561281],
1573 + ["En Yahav", "Eyn-yahav", "Israel", 35.203325, 30.621656],
1574 + ["Haifa", "Haifa", "Israel", 35.043056, 32.809444],
1575 + ["Hatzor", "Haztor", "Israel", 34.727222, 31.7625],
1576 + ["Mahanaim I Ben Yaakov", "Rosh Pina", "Israel", 35.571908, 32.981047],
1577 + ["Megiddo", "Megido Airstrip", "Israel", 35.228803, 32.597139],
1578 + ["I Bar Yehuda", "Metzada", "Israel", 35.388608, 31.328169],
1579 + ["Nevatim Ab", "Nevatim", "Israel", 35.0123, 31.208347],
1580 + ["Ovda", "Ovda", "Israel", 34.93585, 29.94025],
1581 + ["Ramat David", "Ramat David", "Israel", 35.179458, 32.665142],
1582 + ["Ramon", "Ramon", "Israel", 34.666769, 30.776061],
1583 + ["Sde Dov", "Tel-aviv", "Israel", 34.782239, 32.114661],
1584 + ["Luqa", "Malta", "Malta", 14.4775, 35.857497],
1585 + ["Wiener Neustadt East", "Wiener Neustadt Ost", "Austria", 16.260139, 47.843333],
1586 + ["Wels", "Wels", "Austria", 14.040861, 48.183304],
1587 + ["Graz", "Graz", "Austria", 15.439628, 46.991067],
1588 + ["Innsbruck", "Innsbruck", "Austria", 11.343964, 47.260219],
1589 + ["Linz", "Linz", "Austria", 14.187511, 48.233219],
1590 + ["Salzburg", "Salzburg", "Austria", 13.004333, 47.793304],
1591 + ["Schwechat", "Vienna", "Austria", 16.569722, 48.110278],
1592 + ["Klagenfurt", "Klagenfurt", "Austria", 14.337739, 46.642514],
1593 + ["Zeltweg", "Zeltweg", "Austria", 14.744223, 47.202751],
1594 + ["Alverca", "Alverca", "Portugal", -9.030097, 38.883278],
1595 + ["Santa Maria", "Santa Maria (island)", "Portugal", -25.170639, 36.97139],
1596 + ["Braganca", "Braganca", "Portugal", -6.707125, 41.8578],
1597 + ["Beja", "Beja (madeira)", "Portugal", -7.932397, 38.078903],
1598 + ["Braga", "Braga", "Portugal", -8.445139, 41.587058],
1599 + ["Coimbra", "Coimba", "Portugal", -8.47, 40.157223],
1600 + ["Cascais", "Cascais", "Portugal", -9.355231, 38.725025],
1601 + ["Covilha", "Covilha", "Portugal", -7.479958, 40.264772],
1602 + ["Evora", "Evora", "Portugal", -7.889639, 38.533472],
1603 + ["Flores", "Flores", "Portugal", -31.131361, 39.455272],
1604 + ["Faro", "Faro", "Portugal", -7.965911, 37.014425],
1605 + ["Graciosa", "Graciosa Island", "Portugal", -28.029847, 39.092169],
1606 + ["Horta", "Horta", "Portugal", -28.715872, 38.519894],
1607 + ["Lajes", "Lajes (terceira Island)", "Portugal", -27.090797, 38.761842],
1608 + ["Monte Real", "Monte Real", "Portugal", -8.887261, 39.831244],
1609 + ["Montijo", "Montijo", "Portugal", -9.035916, 38.703861],
1610 + ["Ovar", "Ovar", "Portugal", -8.645919, 40.915867],
1611 + ["Ponta Delgada", "Ponta Delgada", "Portugal", -25.69787, 37.741184],
1612 + ["Pico", "Pico", "Portugal", -28.441333, 38.554333],
1613 + ["Portimao", "Portimao", "Portugal", -8.583961, 37.149331],
1614 + ["Porto", "Porto", "Portugal", -8.681389, 41.248055],
1615 + ["Porto Santo", "Porto Santo", "Portugal", -16.349975, 33.073386],
1616 + ["Lisboa", "Lisbon", "Portugal", -9.135919, 38.781311],
1617 + ["Sao Jorge", "Sao Jorge Island", "Portugal", -28.175817, 38.6655],
1618 + ["Sintra", "Sintra", "Portugal", -9.339553, 38.831053],
1619 + ["Tancos", "Tancos", "Portugal", -8.364583, 39.47514],
1620 + ["Vila Real", "Vila Real", "Portugal", -7.720472, 41.274334],
1621 + ["Viseu", "Viseu", "Portugal", -7.888992, 40.725539],
1622 + ["Eastern Oregon Regional Airport", "Pendleton", "United States", -118.841389, 45.695],
1623 + ["Mostar", "Mostar", "Bosnia and Herzegovina", 17.845878, 43.2829],
1624 + ["Sarajevo", "Sarajevo", "Bosnia and Herzegovina", 18.331467, 43.824583],
1625 + ["Arad", "Arad", "Romania", 21.262022, 46.17655],
1626 + ["Bacau", "Bacau", "Romania", 26.910278, 46.521946],
1627 + ["Tautii Magheraus", "Baia Mare", "Romania", 23.470022, 47.658389],
1628 + ["Aurel Vlaicu", "Bucharest", "Romania", 26.102111, 44.503194],
1629 + ["Mihail Kogalniceanu", "Constanta", "Romania", 28.488333, 44.362222],
1630 + ["Cluj Napoca", "Cluj-napoca", "Romania", 23.686167, 46.785167],
1631 + ["Caransebes", "Caransebes", "Romania", 22.253333, 45.42],
1632 + ["Craiova", "Craiova", "Romania", 23.888611, 44.318139],
1633 + ["Iasi", "Iasi", "Romania", 27.620631, 47.178492],
1634 + ["Oradea", "Oradea", "Romania", 21.9025, 47.025278],
1635 + ["Henri Coanda", "Bucharest", "Romania", 26.102178, 44.572161],
1636 + ["Sibiu", "Sibiu", "Romania", 24.091342, 45.785597],
1637 + ["Satu Mare", "Satu Mare", "Romania", 22.8857, 47.703275],
1638 + ["Stefan Cel Mare", "Suceava", "Romania", 26.354056, 47.6875],
1639 + ["Cataloi", "Tulcea", "Romania", 28.714311, 45.062486],
1640 + ["Transilvania Targu Mures", "Tirgu Mures", "Romania", 24.412525, 46.467714],
1641 + ["Traian Vuia", "Timisoara", "Romania", 21.337861, 45.809861],
1642 + ["Les Eplatures", "Les Eplatures", "Switzerland", 6.792836, 47.08385],
1643 + ["Geneve Cointrin", "Geneva", "Switzerland", 6.10895, 46.238064],
1644 + ["Saanen", "Saanen", "Switzerland", 7.250834, 46.487499],
1645 + ["Sion", "Sion", "Switzerland", 7.326764, 46.219592],
1646 + ["Alpnach", "Alpnach", "Switzerland", 8.284167, 46.943889],
1647 + ["Dubendorf", "Dubendorf", "Switzerland", 8.648231, 47.398644],
1648 + ["Emmen", "Emmen", "Switzerland", 8.305117, 47.092369],
1649 + ["Mollis", "Mollis", "Switzerland", 9.064831, 47.078872],
1650 + ["Meiringen", "Meiringen", "Switzerland", 8.11, 46.743333],
1651 + ["Payerne", "Payerne", "Switzerland", 6.915058, 46.843208],
1652 + ["Buochs", "Buochs", "Switzerland", 8.39915, 46.974914],
1653 + ["Lugano", "Lugano", "Switzerland", 8.910578, 46.004275],
1654 + ["Bern Belp", "Bern", "Switzerland", 7.497153, 46.9141],
1655 + ["Grenchen", "Grenchen", "Switzerland", 7.417189, 47.181628],
1656 + ["Zurich", "Zurich", "Switzerland", 8.549167, 47.464722],
1657 + ["St Gallen Altenrhein", "Altenrhein", "Switzerland", 9.560775, 47.485033],
1658 + ["Samedan", "Samedan", "Switzerland", 9.884106, 46.534075],
1659 + ["Guvercinlik", "Ankara", "Turkey", 32.740775, 39.93495],
1660 + ["Esenboga", "Ankara", "Turkey", 32.995083, 40.128082],
1661 + ["Etimesgut", "Ankara", "Turkey", 32.688622, 39.949831],
1662 + ["Akinci", "Ankara", "Turkey", 32.565625, 40.078919],
1663 + ["Adana", "Adana", "Turkey", 35.280388, 36.982166],
1664 + ["Incirlik Ab", "Adana", "Turkey", 35.425894, 37.0021],
1665 + ["Afyon", "Afyon", "Turkey", 30.601114, 38.726425],
1666 + ["Antalya", "Antalya", "Turkey", 30.800461, 36.898731],
1667 + ["Oguzeli", "Gaziantep", "Turkey", 37.478683, 36.947183],
1668 + ["Iskenderun", "Iskenderun", "Turkey", 36.154, 36.573472],
1669 + ["Konya", "Konya", "Turkey", 32.561861, 37.979],
1670 + ["Tulga", "Malatya", "Turkey", 38.253944, 38.35375],
1671 + ["Merzifon", "Merzifon", "Turkey", 35.521992, 40.829375],
1672 + ["Sivas", "Sivas", "Turkey", 36.903497, 39.813828],
1673 + ["Erhac", "Malatya", "Turkey", 38.091006, 38.435347],
1674 + ["Erkilet", "Kayseri", "Turkey", 35.495428, 38.770386],
1675 + ["Sivrihisar", "Sivrihisar", "Turkey", 31.365308, 39.451469],
1676 + ["Tokat", "Tokat", "Turkey", 36.371089, 40.306281],
1677 + ["Cardak", "Denizli", "Turkey", 29.701297, 37.785567],
1678 + ["Ataturk", "Istanbul", "Turkey", 28.814606, 40.976922],
1679 + ["Balikesir", "Balikesir", "Turkey", 27.925958, 39.619258],
1680 + ["Bandirma", "Bandirma", "Turkey", 27.977694, 40.317972],
1681 + ["Tyonek Airport", "Tyonek", "United States", -151.138056, 61.076667],
1682 + ["Eskisehir", "Eskisehir", "Turkey", 30.582111, 39.784138],
1683 + ["Adnan Menderes", "Izmir", "Turkey", 27.156953, 38.292392],
1684 + ["Gaziemir", "Izmir", "Turkey", 27.159353, 38.319106],
1685 + ["Cigli", "Izmir", "Turkey", 27.010053, 38.513022],
1686 + ["Isparta", "Isparta", "Turkey", 30.581817, 37.785369],
1687 + ["Kutahya", "Kutahya", "Turkey", 30.016872, 39.426708],
1688 + ["Yalova", "Yalova", "Turkey", 29.375728, 40.684353],
1689 + ["Topel", "Topel", "Turkey", 30.083336, 40.735028],
1690 + ["Dalaman", "Dalaman", "Turkey", 28.7925, 36.713056],
1691 + ["Akhisar", "Akhisar", "Turkey", 27.83386, 38.808887],
1692 + ["Riverton Regional", "Riverton WY", "United States", -108.459722, 43.064167],
1693 + ["Imsik", "Bodrum", "Turkey", 27.669717, 37.140144],
1694 + ["Samandira", "Istanbul", "Turkey", 29.216539, 40.992975],
1695 + ["Elazig", "Elazig", "Turkey", 39.291417, 38.606925],
1696 + ["Diyarbakir", "Diyabakir", "Turkey", 40.201019, 37.893897],
1697 + ["Erzincan", "Erzincan", "Turkey", 39.527003, 39.710203],
1698 + ["Erzurum", "Erzurum", "Turkey", 41.170166, 39.956501],
1699 + ["Trabzon", "Trabzon", "Turkey", 39.789728, 40.995108],
1700 + ["Montrose Regional Airport", "Montrose CO", "United States", -107.894242, 38.509794],
1701 + ["Van", "Van", "Turkey", 43.3323, 38.468219],
1702 + ["Batman", "Batman", "Turkey", 41.116583, 37.928969],
1703 + ["Siirt", "Siirt", "Turkey", 41.840436, 37.978886],
1704 + ["Kaklic", "Izmir", "Turkey", 26.977406, 38.517608],
1705 + ["Efes", "Izmir", "Turkey", 27.329014, 37.950747],
1706 + ["Balti Intl", "Saltsy", "Moldova", 27.781475, 47.838114],
1707 + ["Chisinau Intl", "Chisinau", "Moldova", 28.930978, 46.927744],
1708 + ["Ohrid", "Ohrid", "Macedonia", 20.742325, 41.179956],
1709 + ["Skopje", "Skopje", "Macedonia", 21.621381, 41.961622],
1710 + ["Gibraltar", "Gibraltar", "Gibraltar", -5.349664, 36.151219],
1711 + ["Beograd", "Belgrade", "Serbia", 20.309139, 44.818444],
1712 + ["Nis", "Nis", "Serbia", 21.853722, 43.337289],
1713 + ["Podgorica", "Podgorica", "Montenegro", 19.251894, 42.359392],
1714 + ["Pristina", "Pristina", "Serbia", 21.035833, 42.572778],
1715 + ["Tivat", "Tivat", "Montenegro", 18.723286, 42.404664],
1716 + ["Vrsac", "Vrsac", "Serbia", 21.309889, 45.146889],
1717 + ["M R Stefanik", "Bratislava", "Slovakia", 17.212667, 48.170167],
1718 + ["Kosice", "Kosice", "Slovakia", 21.241112, 48.663055],
1719 + ["Malacky", "Malacky", "Slovakia", 17.118389, 48.402028],
1720 + ["Piestany", "Piestany", "Slovakia", 17.828444, 48.625247],
1721 + ["Sliac", "Sliac", "Slovakia", 19.134108, 48.637839],
1722 + ["Trencin", "Trencin", "Slovakia", 17.99225, 48.865003],
1723 + ["Tatry", "Poprad", "Slovakia", 20.241142, 49.073594],
1724 + ["Clow International Airport", "Bolingbrook", "United States", -88.1292306, 41.6959744],
1725 + ["North Caicos", "North Caicos", "Turks and Caicos Islands", -71.939561, 21.917475],
1726 + ["Providenciales", "Providenciales", "Turks and Caicos Islands", -72.265886, 21.773625],
1727 + ["South Caicos", "South Caicos", "Turks and Caicos Islands", -71.528528, 21.515739],
1728 + ["Arroyo Barril Intl", "Samana", "Dominican Republic", -69.429772, 19.198586],
1729 + ["Maria Montez Intl", "Barahona", "Dominican Republic", -71.1204, 18.251464],
1730 + ["Cabo Rojo", "Cabo Rojo", "Dominican Republic", -71.644769, 17.928981],
1731 + ["Casa De Campo Intl", "La Romana", "Dominican Republic", -68.911833, 18.450711],
1732 + ["Punta Cana Intl", "Punta Cana", "Dominican Republic", -68.363431, 18.567367],
1733 + ["Gregorio Luperon Intl", "Puerto Plata", "Dominican Republic", -70.570033, 19.7579],
1734 + ["Las Americas Intl", "Santo Domingo", "Dominican Republic", -69.668925, 18.429664],
1735 + ["San Isidro Ab", "San Isidoro", "Dominican Republic", -69.761706, 18.503706],
1736 + ["Cibao Intl", "Santiago", "Dominican Republic", -70.604689, 19.406092],
1737 + ["Bananera", "Bananera", "Guatemala", -88.837222, 15.473528],
1738 + ["Coban", "Coban", "Guatemala", -90.406742, 15.468958],
1739 + ["La Aurora", "Guatemala City", "Guatemala", -90.527475, 14.583272],
1740 + ["Retalhuleu", "Retalhuleu", "Guatemala", -91.697256, 14.521017],
1741 + ["San Jose", "San Jose", "Guatemala", -90.835833, 13.936192],
1742 + ["Goloson Intl", "La Ceiba", "Honduras", -86.853036, 15.742481],
1743 + ["La Mesa Intl", "San Pedro Sula", "Honduras", -87.923556, 15.452639],
1744 + ["Guanaja", "Guanaja", "Honduras", -85.906611, 16.445367],
1745 + ["Juan Manuel Galvez Intl", "Roatan", "Honduras", -86.522961, 16.316814],
1746 + ["Tela", "Tela", "Honduras", -87.475847, 15.775864],
1747 + ["Toncontin Intl", "Tegucigalpa", "Honduras", -87.217197, 14.060883],
1748 + ["Trujillo", "Trujillo", "Honduras", -85.93825, 15.926847],
1749 + ["Boscobel", "Ocho Rios", "Jamaica", -76.969017, 18.404247],
1750 + ["Norman Manley Intl", "Kingston", "Jamaica", -76.7875, 17.935667],
1751 + ["Sangster Intl", "Montego Bay", "Jamaica", -77.913358, 18.503717],
1752 + ["Ken Jones", "Port Antonio", "Jamaica", -76.534528, 18.198806],
1753 + ["Tinson Pen", "Kingston", "Jamaica", -76.823761, 17.988558],
1754 + ["General Juan N Alvarez Intl", "Acapulco", "Mexico", -99.753953, 16.757061],
1755 + ["Del Norte Intl", "Monterrey", "Mexico", -100.237239, 25.865572],
1756 + ["Jesus Teran Intl", "Aguascalientes", "Mexico", -102.317858, 21.705558],
1757 + ["Bahias De Huatulco Intl", "Huatulco", "Mexico", -96.262572, 15.775317],
1758 + ["General Mariano Matamoros", "Cuernavaca", "Mexico", -99.2613, 18.834764],
1759 + ["Ciudad Acuna Intl New", "Ciudad Acuna", "Mexico", -101.100892, 29.333917],
1760 + ["Ciudad Del Carmen Intl", "Ciudad Del Carmen", "Mexico", -91.799017, 18.653739],
1761 + ["Nuevo Casas Grandes", "Nuevo Casas Grandes", "Mexico", -107.874969, 30.397439],
1762 + ["Chilpancingo", "Chilpancingo", "Mexico", -99.514339, 17.573767],
1763 + ["Culiacan Intl", "Culiacan", "Mexico", -107.474717, 24.764547],
1764 + ["Chetumal Intl", "Chetumal", "Mexico", -88.326847, 18.504667],
1765 + ["Ciudad Obregon Intl", "Ciudad Obregon", "Mexico", -109.833111, 27.392639],
1766 + ["Ingeniero Alberto Acuna Ongay Intl", "Campeche", "Mexico", -90.500314, 19.816794],
1767 + ["Abraham Gonzalez Intl", "Ciudad Juarez", "Mexico", -106.428667, 31.636133],
1768 + ["General R Fierro Villalobos Intl", "Chihuahua", "Mexico", -105.964567, 28.702875],
1769 + ["General Pedro Jose Mendez Intl", "Ciudad Victoria", "Mexico", -98.956486, 23.703336],
1770 + ["Kenosha Regional Airport", "Kenosha", "United States", -87.9278056, 42.5956944],
1771 + ["Cozumel Intl", "Cozumel", "Mexico", -86.925644, 20.522403],
1772 + ["Durango Intl", "Durango", "Mexico", -104.528014, 24.124194],
1773 + ["Tepic", "Tepic", "Mexico", -104.842581, 21.419453],
1774 + ["Ensenada", "Ensenada", "Mexico", -116.602772, 31.795281],
1775 + ["Don Miguel Hidalgo Y Costilla Intl", "Guadalajara", "Mexico", -103.311167, 20.5218],
1776 + ["General Jose Maria Yanez Intl", "Guaymas", "Mexico", -110.925169, 27.968983],
1777 + ["Tehuacan", "Tehuacan", "Mexico", -97.419942, 18.497189],
1778 + ["General Ignacio P Garcia Intl", "Hermosillo", "Mexico", -111.047858, 29.095858],
1779 + ["Colima", "Colima", "Mexico", -103.577397, 19.277011],
1780 + ["Isla Mujeres", "Isla Mujeres", "Mexico", -86.739967, 21.245033],
1781 + ["Plan De Guadalupe Intl", "Saltillo", "Mexico", -100.928669, 25.549497],
1782 + ["Ixtepec", "Iztepec", "Mexico", -95.093697, 16.449336],
1783 + ["Lazaro Cardenas", "Lazard Cardenas", "Mexico", -102.220525, 18.001731],
1784 + ["Valle Del Fuerte Intl", "Los Mochis", "Mexico", -109.080806, 25.685194],
1785 + ["Guanajuato Intl", "Del Bajio", "Mexico", -101.480847, 20.993464],
1786 + ["General Manuel Marquez De Leon Intl", "La Paz", "Mexico", -110.362475, 24.072694],
1787 + ["Loreto Intl", "Loreto", "Mexico", -111.348361, 25.989194],
1788 + ["General Servando Canales Intl", "Matamoros", "Mexico", -97.525311, 25.769894],
1789 + ["Licenciado Manuel Crescencio Rejon Int", "Merida", "Mexico", -89.657672, 20.936981],
1790 + ["General Rodolfo Sanchez Taboada Intl", "Mexicali", "Mexico", -115.241637, 32.630634],
1791 + ["General Francisco J Mujica Intl", "Morelia", "Mexico", -101.0255, 19.849944],
1792 + ["Minatitlan", "Minatitlan", "Mexico", -94.580681, 18.103419],
1793 + ["Monclova Intl", "Monclova", "Mexico", -101.470136, 26.955733],
1794 + ["Licenciado Benito Juarez Intl", "Mexico City", "Mexico", -99.072097, 19.436303],
1795 + ["General Mariano Escobedo Intl", "Monterrey", "Mexico", -100.106878, 25.778489],
1796 + ["General Rafael Buelna Intl", "Mazatlan", "Mexico", -106.266072, 23.161356],
1797 + ["Nogales Intl", "Nogales", "Mexico", -110.975831, 31.226083],
1798 + ["Quetzalcoatl Intl", "Nuevo Laredo", "Mexico", -99.57046, 27.443918],
1799 + ["Xoxocotlan Intl", "Oaxaca", "Mexico", -96.726639, 16.999906],
1800 + ["Tajin", "Poza Rico", "Mexico", -97.460839, 20.602671],
1801 + ["Hermanos Serdan Intl", "Puebla", "Mexico", -98.371447, 19.158144],
1802 + ["Ingeniero Juan Guillermo Villasana", "Pachuca", "Mexico", -98.782814, 20.0772],
1803 + ["Puerto Penasco", "Punta Penasco", "Mexico", -113.525728, 31.351878],
1804 + ["Piedras Negras Intl", "Piedras Negras", "Mexico", -100.535211, 28.627394],
1805 + ["Licenciado Y Gen Ignacio Lopez Rayon", "Uruapan", "Mexico", -102.039056, 19.396692],
1806 + ["Licenciado Gustavo Diaz Ordaz Intl", "Puerto Vallarta", "Mexico", -105.254167, 20.680083],
1807 + ["Puerto Escondido Intl", "Puerto Escondido", "Mexico", -97.089117, 15.876861],
1808 + ["Queretaro Intercontinental", "Queretaro", "Mexico", -100.185658, 20.617289],
1809 + ["General Lucio Blanco Intl", "Reynosa", "Mexico", -98.228513, 26.008908],
1810 + ["Los Cabos Intl", "San Jose Del Cabo", "Mexico", -109.721044, 23.15185],
1811 + ["San Felipe Intl", "San Filipe", "Mexico", -114.808639, 30.930222],
1812 + ["Ponciano Arriaga Intl", "San Luis Potosi", "Mexico", -100.930806, 22.254303],
1813 + ["Tlaxcala", "Tlaxcala", "Mexico", -98.173467, 19.537964],
1814 + ["General Div P A Angel H Corzo Molina", "Tuxtla Gutierrez", "Mexico", -93.173297, 16.739919],
1815 + ["Torreon Intl", "Torreon", "Mexico", -103.410583, 25.568278],
1816 + ["Angel Albino Corzo", "Tuxtla Gutierrez", "Mexico", -93.026081, 16.561822],
1817 + ["General Abelardo L Rodriguez Intl", "Tijuana", "Mexico", -116.970158, 32.541064],
1818 + ["General Francisco Javier Mina Intl", "Tampico", "Mexico", -97.865931, 22.29645],
1819 + ["Tamuin", "Tamuin", "Mexico", -98.806503, 22.038292],
1820 + ["Licenciado Adolfo Lopez Mateos Intl", "Toluca", "Mexico", -99.566008, 19.337072],
1821 + ["Tapachula Intl", "Tapachula", "Mexico", -92.370025, 14.794339],
1822 + ["Cancun Intl", "Cancun", "Mexico", -86.877083, 21.036528],
1823 + ["C P A Carlos Rovirosa Intl", "Villahermosa", "Mexico", -92.817361, 17.997],
1824 + ["General Heriberto Jara Intl", "Vera Cruz", "Mexico", -96.187267, 19.145931],
1825 + ["General Leobardo C Ruiz Intl", "Zacatecas", "Mexico", -102.68689, 22.897112],
1826 + ["Ixtapa Zihuatanejo Intl", "Zihuatanejo", "Mexico", -101.460536, 17.601569],
1827 + ["Zamora", "Zamora", "Mexico", -102.275955, 20.045036],
1828 + ["Playa De Oro Intl", "Manzanillo", "Mexico", -104.558631, 19.144778],
1829 + ["Zapopan", "Zapopan", "Mexico", -103.465278, 20.755833],
1830 + ["Bluefields", "Bluefields", "Nicaragua", -83.774086, 11.990961],
1831 + ["Los Brasiles", "Los Brasiles", "Nicaragua", -86.353872, 12.190044],
1832 + ["Leon", "Leon", "Nicaragua", -86.902361, 12.428028],
1833 + ["Managua Intl", "Managua", "Nicaragua", -86.168178, 12.141494],
1834 + ["Puerto Cabezas", "Puerto Cabezas", "Nicaragua", -83.386722, 14.047194],
1835 + ["Bocas Del Toro Intl", "Bocas Del Toro", "Panama", -82.250842, 9.340853],
1836 + ["Cap Manuel Nino Intl", "Changuinola", "Panama", -82.516806, 9.458636],
1837 + ["Enrique Malek Intl", "David", "Panama", -82.434992, 8.391003],
1838 + ["Howard", "Howard", "Panama", -79.599633, 8.914794],
1839 + ["Marcos A Gelabert Intl", "Panama", "Panama", -79.555583, 8.973339],
1840 + ["Ruben Cantu", "Santiago", "Panama", -80.945253, 8.085597],
1841 + ["Tocumen Intl", "Panama City", "Panama", -79.383453, 9.071364],
1842 + ["Buenos Aires", "Buenos Aires", "Costa Rica", -83.329872, 9.163606],
1843 + ["North Las Vegas Airport", "Las Vegas", "United States", -115.1944444, 36.2106944],
1844 + ["Coto 47", "Coto 47", "Costa Rica", -82.968614, 8.601556],
1845 + ["Chacarita", "Chacarita", "Costa Rica", -84.772736, 9.981408],
1846 + ["Brown County Airport", "Georgetown", "United States", -83.8827367, 38.8819456],
1847 + ["El Carmen De Siquirres", "El Carmen", "Costa Rica", -83.472167, 10.202033],
1848 + ["Nuevo Palmar Sur", "Finca 10", "Costa Rica", -83.507267, 8.916347],
1849 + ["Golfito", "Golfito", "Costa Rica", -83.180544, 8.653775],
1850 + ["Guapiles", "Guapiles", "Costa Rica", -83.797003, 10.217194],
1851 + ["Daniel Oduber Quiros Intl", "Liberia", "Costa Rica", -85.544408, 10.593289],
1852 + ["Los Chiles", "Los Chiles", "Costa Rica", -84.706108, 11.035277],
1853 + ["Limon Intl", "Limon", "Costa Rica", -83.022006, 9.957961],
1854 + ["Nosara", "Nosara Beach", "Costa Rica", -85.653, 9.97649],
1855 + ["Juan Santamaria Intl", "San Jose", "Costa Rica", -84.208806, 9.993861],
1856 + ["Pandora", "Pandora", "Costa Rica", -82.983214, 9.732169],
1857 + ["Palmar Sur", "Palmar Sur", "Costa Rica", -83.468583, 8.951025],
1858 + ["La Managua", "Quepos", "Costa Rica", -84.129772, 9.443164],
1859 + ["Santa Clara De Guapiles", "Santa Clara", "Costa Rica", -83.713519, 10.288278],
1860 + ["San Vito De Java", "San Vito De Jaba", "Costa Rica", -82.958885, 8.826111],
1861 + ["El Salvador Intl", "San Salvador", "El Salvador", -89.055728, 13.440947],
1862 + ["Ilopango Intl", "San Salvador", "El Salvador", -89.119861, 13.699492],
1863 + ["Cayes", "Cayes", "Haiti", -73.788289, 18.271103],
1864 + ["Cap Haitien Intl", "Cap Haitien", "Haiti", -72.194739, 19.732989],
1865 + ["Jacmel", "Jacmel", "Haiti", -72.5185, 18.241083],
1866 + ["Toussaint Louverture Intl", "Port-au-prince", "Haiti", -72.292542, 18.58005],
1867 + ["Gustavo Rizo", "Baracoa Playa", "Cuba", -74.506206, 20.365317],
1868 + ["Carlos Manuel De Cespedes", "Bayamo", "Cuba", -76.621494, 20.396331],
1869 + ["Maximo Gomez", "Ciego De Avila", "Cuba", -78.789617, 22.027053],
1870 + ["Jardines Del Rey", "Cunagua", "Cuba", -78.328422, 22.460986],
1871 + ["Jaime Gonzalez", "Cienfuegos", "Cuba", -80.414167, 22.15],
1872 + ["Vilo Acuna Intl", "Cayo Largo del Sur", "Cuba", -81.545989, 21.616453],
1873 + ["Ignacio Agramonte Intl", "Camaguey", "Cuba", -77.847433, 21.420428],
1874 + ["Antonio Maceo Intl", "Santiago De Cuba", "Cuba", -75.835414, 19.969769],
1875 + ["Florida", "Florida", "Cuba", -78.202778, 21.499722],
1876 + ["Guantanamo Bay Ns", "Guantanamo", "Cuba", -75.207056, 19.906458],
1877 + ["Mariana Grajales", "Guantanamo", "Cuba", -75.158328, 20.085419],
1878 + ["Jose Marti Intl", "Havana", "Cuba", -82.409086, 22.989153],
1879 + ["Frank Pais Intl", "Holguin", "Cuba", -76.315108, 20.785589],
1880 + ["La Coloma", "La Coloma", "Cuba", -83.642111, 22.336261],
1881 + ["Orestes Acosta", "Moa", "Cuba", -74.922114, 20.654114],
1882 + ["Sierra Maestra", "Manzanillo", "Cuba", -77.0893, 20.288172],
1883 + ["Rafael Cabrera", "Nueva Gerona", "Cuba", -82.783819, 21.834689],
1884 + ["Playa Baracoa", "Baracoa Playa", "Cuba", -82.579444, 23.032778],
1885 + ["Pinar Del Rio", "Pinar Del Rio Norte", "Cuba", -83.678428, 22.421356],
1886 + ["San Antonio De Los Banos", "San Antonio De Banos", "Cuba", -82.509308, 22.871529],
1887 + ["Abel Santamaria", "Santa Clara", "Cuba", -79.943611, 22.492192],
1888 + ["Santa Lucia", "Santa Lucia", "Cuba", -77.020375, 21.509453],
1889 + ["Siguanea", "Siguanea", "Cuba", -82.955114, 21.642525],
1890 + ["Sancti Spiritus", "Sancti Spiritus", "Cuba", -79.442692, 21.969969],
1891 + ["Grand Geneva Resort Airport", "Lake Geneva", "United States", -88.3895833, 42.6149167],
1892 + ["Juan Gualberto Gomez Intl", "Varadero", "Cuba", -81.435278, 23.034445],
1893 + ["Hermanos Ameijeiras", "Las Tunas", "Cuba", -76.9358, 20.987642],
1894 + ["Gerrard Smith Intl", "Cayman Barac", "Cayman Islands", -79.882789, 19.686981],
1895 + ["Owen Roberts Intl", "Georgetown", "Cayman Islands", -81.35775, 19.292778],
1896 + ["Clarence A Bain", "Clarence Bain", "Bahamas", -77.684614, 24.287664],
1897 + ["Fresh Creek", "Andros Town", "Bahamas", -77.795611, 24.698283],
1898 + ["Marsh Harbour", "Marsh Harbor", "Bahamas", -77.083472, 26.511406],
1899 + ["San Andros", "San Andros", "Bahamas", -78.048997, 25.053814],
1900 + ["Spring Point", "Spring Point", "Bahamas", -73.970858, 22.441828],
1901 + ["Sandy Point", "Sandy Point", "Bahamas", -77.395483, 26.004639],
1902 + ["Treasure Cay", "Treasure Cay", "Bahamas", -77.391269, 26.745336],
1903 + ["Chub Cay", "Chub Cay", "Bahamas", -77.88085, 25.417108],
1904 + ["Great Harbour Cay", "Bullocks Harbour", "Bahamas", -77.840114, 25.738331],
1905 + ["South Bimini", "Alice Town", "Bahamas", -79.264656, 25.699881],
1906 + ["De Kalb Taylor Municipal Airport", "De Kalb", "United States", -88.7056864, 41.9338342],
1907 + ["Exuma Intl", "Great Exuma", "Bahamas", -75.877958, 23.562631],
1908 + ["George Town", "George Town", "Bahamas", -75.78167, 23.466667],
1909 + ["North Eleuthera", "North Eleuthera", "Bahamas", -76.683489, 25.474861],
1910 + ["Governors Harbour", "Governor's Harbor", "Bahamas", -76.331011, 25.284706],
1911 + ["Normans Cay", "Norman's Cay", "Bahamas", -76.820214, 24.594258],
1912 + ["Rock Sound", "Rock Sound", "Bahamas", -76.177739, 24.8917],
1913 + ["Staniel Cay", "Staniel Cay", "Bahamas", -76.439056, 24.169083],
1914 + ["Grand Bahama Intl", "Freeport", "Bahamas", -78.695553, 26.558686],
1915 + ["Matthew Town", "Matthew Town", "Bahamas", -73.666862, 20.975],
1916 + ["Deadmans Cay", "Dead Man's Cay", "Bahamas", -75.093597, 23.179014],
1917 + ["Stella Maris", "Stella Maris", "Bahamas", -75.270475, 23.581444],
1918 + ["Mayaguana", "Mayaguana", "Bahamas", -73.0135, 22.379528],
1919 + ["Lynden Pindling Intl", "Nassau", "Bahamas", -77.466231, 25.038958],
1920 + ["Duncan Town", "Duncan Town", "Bahamas", -75.729456, 22.181803],
1921 + ["New Port Nelson", "Port Nelson", "Bahamas", -74.836186, 23.684378],
1922 + ["San Salvador", "Cockburn Town", "Bahamas", -74.523967, 24.063275],
1923 + ["Philip S W Goldson Intl", "Belize City", "Belize", -88.308203, 17.539144],
1924 + ["Aitutaki", "Aitutaki", "Cook Islands", -159.764233, -18.830922],
1925 + ["Rarotonga Intl", "Avarua", "Cook Islands", -159.805556, -21.202739],
1926 + ["Nadi Intl", "Nandi", "Fiji", 177.443378, -17.755392],
1927 + ["Nausori Intl", "Nausori", "Fiji", 178.559228, -18.043267],
1928 + ["Fua Amotu Intl", "Tongatapu", "Tonga", -175.149644, -21.241214],
1929 + ["Vavau Intl", "Vava'u", "Tonga", -173.961717, -18.585336],
1930 + ["Bonriki Intl", "Tarawa", "Kiribati", 173.147036, 1.381636],
1931 + ["Tabiteuea North", "Tabiteuea North", "Kiribati", 174.775614, -1.224469],
1932 + ["Maitland Airport", "Maitland", "Australia", 151.488, -32.7033],
1933 + ["Wallis", "Wallis", "Wallis and Futuna", -176.199228, -13.238281],
1934 + ["Faleolo Intl", "Faleolo", "Samoa", -172.008336, -13.829969],
1935 + ["Pago Pago Intl", "Pago Pago", "American Samoa", -170.7105, -14.331],
1936 + ["Rurutu", "Rurutu", "French Polynesia", -151.360614, -22.434069],
1937 + ["Tubuai", "Tubuai", "French Polynesia", -149.524072, -23.365353],
1938 + ["Anaa", "Anaa", "French Polynesia", -145.509956, -17.352606],
1939 + ["Fangatau", "Fangatau", "French Polynesia", -140.88715, -15.819928],
1940 + ["Tikehau", "Tikehau", "French Polynesia", -148.230697, -15.119617],
1941 + ["Reao", "Reao", "French Polynesia", -136.439706, -18.465861],
1942 + ["Fakarava", "Fakarava", "French Polynesia", -145.656994, -16.05415],
1943 + ["Manihi", "Manihi", "French Polynesia", -146.070056, -14.436764],
1944 + ["Totegegie", "Totegegie", "French Polynesia", -134.890333, -23.079861],
1945 + ["Kaukura", "Kaukura Atoll", "French Polynesia", -146.884769, -15.663333],
1946 + ["Makemo", "Makemo", "French Polynesia", -143.658369, -16.583919],
1947 + ["Puka Puka", "Puka Puka", "French Polynesia", -138.812811, -14.809458],
1948 + ["Takapoto", "Takapoto", "French Polynesia", -145.245814, -14.709544],
1949 + ["Arutua", "Arutua", "French Polynesia", -146.616708, -15.248289],
1950 + ["Mataiva", "Mataiva", "French Polynesia", -148.717225, -14.868055],
1951 + ["Takaroa", "Takaroa", "French Polynesia", -145.024542, -14.455781],
1952 + ["Nuku Hiva", "Nuku Hiva", "French Polynesia", -140.228789, -8.795603],
1953 + ["Purude University Airport", "Lafayette", "United States", -86.9368889, 40.4123056],
1954 + ["Bora Bora", "Bora Bora", "French Polynesia", -151.751286, -16.444378],
1955 + ["Rangiroa", "Rangiroa", "French Polynesia", -147.6608, -14.954283],
1956 + ["Huahine", "Huahine Island", "French Polynesia", -151.021667, -16.687242],
1957 + ["Moorea", "Moorea", "French Polynesia", -149.761869, -17.489972],
1958 + ["Hao", "Hao Island", "French Polynesia", -140.945886, -18.074814],
1959 + ["Maupiti", "Maupiti", "French Polynesia", -152.243669, -16.426486],
1960 + ["Raiatea", "Raiatea Island", "French Polynesia", -151.465856, -16.722861],
1961 + ["Port Vila Bauerfield", "Port-vila", "Vanuatu", 168.319794, -17.699325],
1962 + ["Kone", "Kone", "New Caledonia", 164.837806, -21.053428],
1963 + ["Koumac", "Koumac", "New Caledonia", 164.255625, -20.546314],
1964 + ["Lifou", "Lifou", "New Caledonia", 167.239864, -20.7748],
1965 + ["Magenta", "Noumea", "New Caledonia", 166.472806, -22.258278],
1966 + ["Mare", "Mare", "New Caledonia", 168.037508, -21.481678],
1967 + ["Touho", "Touho", "New Caledonia", 165.259486, -20.790028],
1968 + ["Ouvea", "Ouvea", "New Caledonia", 166.572778, -20.640556],
1969 + ["La Tontouta", "Noumea", "New Caledonia", 166.212972, -22.014553],
1970 + ["Auckland Intl", "Auckland", "New Zealand", 174.791667, -37.008056],
1971 + ["Taupo", "Taupo", "New Zealand", 176.084444, -38.739723],
1972 + ["Ardmore", "Ardmore", "New Zealand", 174.973333, -37.029722],
1973 + ["Christchurch Intl", "Christchurch", "New Zealand", 172.532225, -43.489358],
1974 + ["Chatham Islands", "Chatham Island", "New Zealand", -176.457222, -43.81],
1975 + ["Dunedin", "Dunedin", "New Zealand", 170.198333, -45.928055],
1976 + ["Gisborne", "Gisborne", "New Zealand", 177.978333, -38.663333],
1977 + ["Glentanner", "Glentanner", "New Zealand", 170.128333, -43.906666],
1978 + ["Hokitika", "Hokitika", "New Zealand", 170.985278, -42.713611],
1979 + ["Hamilton", "Hamilton", "New Zealand", 175.332056, -37.866661],
1980 + ["Hastings", "Hastings", "New Zealand", 176.766944, -39.646667],
1981 + ["Kerikeri", "Kerikeri", "New Zealand", 173.911944, -35.262779],
1982 + ["Kaitaia", "Kaitaia", "New Zealand", 173.285278, -35.07],
1983 + ["Alexandra", "Alexandra", "New Zealand", 169.373333, -45.211666],
1984 + ["Mount Cook", "Mount Cook", "New Zealand", 170.133333, -43.764999],
1985 + ["Manapouri", "Manapouri", "New Zealand", 167.65, -45.533056],
1986 + ["Masterton", "Masterton", "New Zealand", 175.633611, -40.973333],
1987 + ["New Plymouth", "New Plymouth", "New Zealand", 174.179167, -39.008611],
1988 + ["Nelson", "Nelson", "New Zealand", 173.221111, -41.298333],
1989 + ["Invercargill", "Invercargill", "New Zealand", 168.312992, -46.412408],
1990 + ["Ohakea", "Ohakea", "New Zealand", 175.387808, -40.206039],
1991 + ["Oamaru", "Oamaru", "New Zealand", 171.081667, -44.97],
1992 + ["Palmerston North", "Palmerston North", "New Zealand", 175.616944, -40.320556],
1993 + ["Paraparaumu", "Paraparaumu", "New Zealand", 174.989167, -40.904722],
1994 + ["Queenstown", "Queenstown International", "New Zealand", 168.739167, -45.021111],
1995 + ["Rotorua", "Rotorua", "New Zealand", 176.317222, -38.109167],
1996 + ["Waiouru", "Waiouru", "New Zealand", 175.658333, -39.446389],
1997 + ["South Pole Station", "Stephen's Island", "Antarctica", 0, -89.999997],
1998 + ["Tauranga", "Tauranga", "New Zealand", 176.19611, -37.671944],
1999 + ["Timaru", "Timaru", "New Zealand", 171.225278, -44.302778],
2000 + ["Pukaki", "Pukaki", "New Zealand", 170.118333, -44.235],
2001 + ["Woodbourne", "Woodbourne", "New Zealand", 173.870278, -41.518333],
2002 + ["Mcmurdo Station", "Weydon", "Antarctica", 167.056572, -77.867358],
2003 + ["Wanaka", "Wanaka", "New Zealand", 169.245556, -44.722222],
2004 + ["Wigram", "Wigram", "New Zealand", 172.552778, -43.551111],
2005 + ["Whakatane", "Whakatane", "New Zealand", 176.914167, -37.920556],
2006 + ["Wellington Intl", "Wellington", "New Zealand", 174.805278, -41.327221],
2007 + ["Wairoa", "Wairoa", "New Zealand", 177.406667, -39.006944],
2008 + ["Whenuapai", "Whenuapai", "New Zealand", 174.630278, -36.787777],
2009 + ["Whangarei", "Whangarei", "New Zealand", 174.365, -35.768333],
2010 + ["Westport", "Westport", "New Zealand", 171.580833, -41.738056],
2011 + ["Wanganui", "Wanganui", "New Zealand", 175.025278, -39.962222],
2012 + ["Herat", "Herat", "Afghanistan", 62.2283, 34.210017],
2013 + ["Jalalabad", "Jalalabad", "Afghanistan", 70.498625, 34.399842],
2014 + ["Kabul Intl", "Kabul", "Afghanistan", 69.212328, 34.565853],
2015 + ["Kandahar", "Kandahar", "Afghanistan", 65.847822, 31.505756],
2016 + ["Maimana", "Maimama", "Afghanistan", 64.760917, 35.930789],
2017 + ["Mazar I Sharif", "Mazar-i-sharif", "Afghanistan", 67.209678, 36.706914],
2018 + ["Shindand", "Shindand", "Afghanistan", 62.260975, 33.391331],
2019 + ["Sheberghan", "Sheberghan", "Afghanistan", 65.913164, 36.750783],
2020 + ["Konduz", "Kunduz", "Afghanistan", 68.910833, 36.665111],
2021 + ["Bahrain Intl", "Bahrain", "Bahrain", 50.63361, 26.270834],
2022 + ["Shaikh Isa", "Bahrain", "Bahrain", 50.590557, 25.918362],
2023 + ["Abha", "Abha", "Saudi Arabia", 42.656625, 18.240367],
2024 + ["Al Ahsa", "Al-ahsa", "Saudi Arabia", 49.485189, 25.285306],
2025 + ["Al Baha", "El-baha", "Saudi Arabia", 41.634277, 20.296139],
2026 + ["Bisha", "Bisha", "Saudi Arabia", 42.620881, 19.98435],
2027 + ["Abqaiq", "Abqaiq", "Saudi Arabia", 49.591231, 25.911281],
2028 + ["King Fahd Intl", "Dammam", "Saudi Arabia", 49.79789, 26.471161],
2029 + ["King Abdulaziz Ab", "Dhahran", "Saudi Arabia", 50.152027, 26.265417],
2030 + ["King Abdullah Bin Abdulaziz", "Gizan", "Saudi Arabia", 42.585833, 16.901111],
2031 + ["Gassim", "Gassim", "Saudi Arabia", 43.773911, 26.302822],
2032 + ["Guriat", "Guriat", "Saudi Arabia", 37.279469, 31.411942],
2033 + ["Hail", "Hail", "Saudi Arabia", 41.686292, 27.437917],
2034 + ["Jubail", "Jubail", "Saudi Arabia", 49.405083, 27.039028],
2035 + ["King Faisal Naval Base", "Jeddah", "Saudi Arabia", 39.173033, 21.3481],
2036 + ["King Abdulaziz Intl", "Jeddah", "Saudi Arabia", 39.156536, 21.679564],
2037 + ["King Khaled Military City", "King Khalid Mil.city", "Saudi Arabia", 45.528194, 27.900917],
2038 + ["Prince Mohammad Bin Abdulaziz", "Madinah", "Saudi Arabia", 39.705061, 24.553422],
2039 + ["Nejran", "Nejran", "Saudi Arabia", 44.419169, 17.611436],
2040 + ["Qaisumah", "Hafr Al-batin", "Saudi Arabia", 46.125069, 28.335192],
2041 + ["Pump Station 3", "Petroline 3", "Saudi Arabia", 47.488431, 25.174547],
2042 + ["Pump Station 6", "Petroline 6", "Saudi Arabia", 44.964527, 24.710333],
2043 + ["Pump Station 10", "Petroline 10", "Saudi Arabia", 41.036047, 24.107339],
2044 + ["Rabigh", "Rabigh", "Saudi Arabia", 39.069842, 22.702608],
2045 + ["Rafha", "Rafha", "Saudi Arabia", 43.490614, 29.626419],
2046 + ["King Khaled Intl", "Riyadh", "Saudi Arabia", 46.698776, 24.95764],
2047 + ["Ras Mishab", "Rash Mishab", "Saudi Arabia", 48.610973, 28.079584],
2048 + ["Arar", "Arar", "Saudi Arabia", 41.138217, 30.906589],
2049 + ["Ras Tanura", "Ras Tanura", "Saudi Arabia", 50.030814, 26.723108],
2050 + ["Sharurah", "Sharurah", "Saudi Arabia", 47.121431, 17.466875],
2051 + ["Mudgee Airport", "Mudgee", "Australia", 149.611, -32.5625],
2052 + ["Sulayel", "Sulayel", "Saudi Arabia", 45.619644, 20.464744],
2053 + ["Tabuk", "Tabuk", "Saudi Arabia", 36.618889, 28.365417],
2054 + ["Taif", "Taif", "Saudi Arabia", 40.544334, 21.483418],
2055 + ["Thumamah", "Thumamah", "Saudi Arabia", 46.640978, 25.212986],
2056 + ["Ras Tanajib", "Ras Tanajib", "Saudi Arabia", 48.76915, 27.867844],
2057 + ["Turaif", "Turaif", "Saudi Arabia", 38.7312, 31.692683],
2058 + ["Miami University Airport", "Oxford", "United States", -84.7843814, 39.5022607],
2059 + ["Wejh", "Wejh", "Saudi Arabia", 36.476381, 26.198553],
2060 + ["Yenbo", "Yenbo", "Saudi Arabia", 38.06335, 24.144244],
2061 + ["Abadan", "Abadan", "Iran", 48.228333, 30.371111],
2062 + ["Dezful", "Dezful", "Iran", 48.39764, 32.434444],
2063 + ["Aghajari", "Aghajari", "Iran", 49.677183, 30.74445],
2064 + ["Gachsaran", "Gachsaran", "Iran", 50.827964, 30.337567],
2065 + ["Shahid Asyaee", "Masjed Soleiman", "Iran", 49.270364, 32.002372],
2066 + ["Omidiyeh", "Omidyeh", "Iran", 49.534916, 30.835167],
2067 + ["Mahshahr", "Bandar Mahshahr", "Iran", 49.151879, 30.556192],
2068 + ["Ahwaz", "Ahwaz", "Iran", 48.76195, 31.337431],
2069 + ["Abumusa Island", "Abumusa I.", "Iran", 55.032994, 25.875742],
2070 + ["Bushehr", "Bushehr", "Iran", 50.834637, 28.944811],
2071 + ["Bastak", "Bastak", "Iran", 54.318592, 27.212678],
2072 + ["Asaloyeh", "Golbandi", "Iran", 52.615483, 27.481425],
2073 + ["Kish Island", "Kish Island", "Iran", 53.980211, 26.526156],
2074 + ["Bandar Lengeh", "Bandar Lengeh", "Iran", 54.824847, 26.532],
2075 + ["Khark Island", "Khark Island", "Iran", 50.323889, 29.260278],
2076 + ["Sirri Island", "Siri Island", "Iran", 54.5394, 25.908869],
2077 + ["Lavan Island", "Lavan Island", "Iran", 53.356289, 26.8103],
2078 + ["Shahid Ashrafi Esfahani", "Bakhtaran", "Iran", 47.158128, 34.345853],
2079 + ["Sanandaj", "Sanandaj", "Iran", 47.009247, 35.245856],
2080 + ["Hesa", "Daran", "Iran", 51.561111, 32.928889],
2081 + ["Shahid Vatan Pour Air Base", "Esfahan", "Iran", 51.691594, 32.567039],
2082 + ["Kashan", "Kashan", "Iran", 51.577044, 33.895333],
2083 + ["Esfahan Shahid Beheshti Intl", "Esfahan", "Iran", 51.861267, 32.750836],
2084 + ["Badr Air Base", "Sepah", "Iran", 51.697017, 32.621108],
2085 + ["Rasht", "Rasht", "Iran", 49.605817, 37.325314],
2086 + ["Delaware County Airport", "Muncie", "United States", -85.39575, 40.2424722],
2087 + ["Arak", "Arak", "Iran", 49.847292, 34.138147],
2088 + ["Ghazvin Azadi", "Abe-ali", "Iran", 50.450778, 35.952097],
2089 + ["Kushke Nosrat", "Kushke Nosrat", "Iran", 50.806219, 34.98395],
2090 + ["Doshan Tappeh", "Teheran", "Iran", 51.475131, 35.702983],
2091 + ["Imam Khomeini Intl", "Abyek", "Iran", 51.152222, 35.416111],
2092 + ["Ghale Morghi", "Teheran", "Iran", 51.380695, 35.644806],
2093 + ["Mehrabad Intl", "Teheran", "Iran", 51.313416, 35.689167],
2094 + ["Ghazvin", "Ghazvin", "Iran", 50.047153, 36.240061],
2095 + ["Naja", "Khoram Dareh", "Iran", 50.881014, 35.776286],
2096 + ["Bandar Abbass Intl", "Bandar Abbas", "Iran", 56.37785, 27.218317],
2097 + ["Jiroft", "Jiroft", "Iran", 57.670269, 28.726925],
2098 + ["Kerman", "Kerman", "Iran", 56.951111, 30.274444],
2099 + ["Havadarya", "Bandar Abbas", "Iran", 56.172461, 27.158251],
2100 + ["Dayrestan", "Gheshm I.", "Iran", 55.902353, 26.754639],
2101 + ["Sirjan", "Sirjan", "Iran", 55.672708, 29.550933],
2102 + ["Birjand", "Birjand", "Iran", 59.266111, 32.898056],
2103 + ["Sarakhs", "Sarakhs", "Iran", 61.064903, 36.501178],
2104 + ["Shahroud", "Emam Shahr", "Iran", 55.104833, 36.425094],
2105 + ["Whitsunday Airstrip", "Airlie Beach", "Australia", 148.755, -20.276],
2106 + ["Tabas", "Tabas", "Iran", 56.892675, 33.66775],
2107 + ["Kalaleh", "Kalaleh", "Iran", 55.452008, 37.383272],
2108 + ["Ramsar", "Ramsar", "Iran", 50.679589, 36.909908],
2109 + ["Aeropuerto de Rafaela", "Rafaela", "Argentina", -61.501594, -31.282072],
2110 + ["Fasa", "Fasa", "Iran", 53.723339, 28.891756],
2111 + ["Jahrom", "Jahrom", "Iran", 53.579144, 28.586675],
2112 + ["Lamerd", "Lamerd", "Iran", 53.188794, 27.372744],
2113 + ["Shiraz Shahid Dastghaib Intl", "Shiraz", "Iran", 52.589786, 29.539242],
2114 + ["Khoy", "Khoy", "Iran", 44.973575, 38.427453],
2115 + ["Sabadell Airport", "Sabadell", "Spain", 2.10508, 41.5209],
2116 + ["Tabriz Intl", "Tabriz", "Iran", 46.235, 38.133889],
2117 + ["Zanjan", "Zanjan", "Iran", 48.359422, 36.77365],
2118 + ["Yazd Shahid Sadooghi", "Yazd", "Iran", 54.276503, 31.904908],
2119 + ["Zabol", "Zabol", "Iran", 61.543889, 31.098333],
2120 + ["Chah Bahar", "Chah Bahar", "Iran", 60.382114, 25.44335],
2121 + ["Zahedan Intl", "Zahedan", "Iran", 60.906189, 29.475686],
2122 + ["Iran Shahr", "Iran Shahr", "Iran", 60.720039, 27.236117],
2123 + ["Saravan", "Saravan", "Iran", 62.315789, 27.419261],
2124 + ["Queen Alia Intl", "Amman", "Jordan", 35.993214, 31.722556],
2125 + ["Marka Intl", "Amman", "Jordan", 35.991569, 31.972703],
2126 + ["Aqaba King Hussein Intl", "Aqaba", "Jordan", 35.018067, 29.611619],
2127 + ["Prince Hasan", "Hotel Four", "Jordan", 37.149383, 32.160747],
2128 + ["Jerusalem", "Jerusalem", "West Bank", 35.219167, 31.864722],
2129 + ["King Hussein", "Mafraq", "Jordan", 36.259181, 32.356353],
2130 + ["Kuwait Intl", "Kuwait", "Kuwait", 47.968928, 29.226567],
2131 + ["Rafic Hariri Intl", "Beirut", "Lebanon", 35.488389, 33.820931],
2132 + ["Rene Mouawad", "Kleiat", "Lebanon", 36.011322, 34.589333],
2133 + ["Abu Dhabi Intl", "Abu Dhabi", "United Arab Emirates", 54.651138, 24.432972],
2134 + ["Bateen", "Abu Dhabi", "United Arab Emirates", 54.458084, 24.428333],
2135 + ["Al Hamra Aux", "Al Hamra", "United Arab Emirates", 52.463644, 24.073981],
2136 + ["Jebel Dhana", "Jebel Dhana", "United Arab Emirates", 52.614, 24.187428],
2137 + ["Reykjahlid Airport", "Myvatn", "Iceland", -16.9181, 65.6558],
2138 + ["Al Dhafra", "Abu Dhabi", "United Arab Emirates", 54.547722, 24.248249],
2139 + ["Arzanah", "Arzana", "United Arab Emirates", 52.559944, 24.780528],
2140 + ["Das Island", "Das Island", "United Arab Emirates", 52.873711, 25.146219],
2141 + ["Zirku", "Zirku", "United Arab Emirates", 53.077833, 24.861542],
2142 + ["Dubai Intl", "Dubai", "United Arab Emirates", 55.364444, 25.252778],
2143 + ["Fujairah Intl", "Fujeirah", "United Arab Emirates", 56.323964, 25.112225],
2144 + ["Ras Al Khaimah Intl", "Ras Al Khaimah", "United Arab Emirates", 55.938817, 25.613483],
2145 + ["Sharjah Intl", "Sharjah", "United Arab Emirates", 55.51715, 25.328575],
2146 + ["Khasab", "Khasab", "Oman", 56.240569, 26.170986],
2147 + ["Masirah", "Masirah", "Oman", 58.890467, 20.675434],
2148 + ["Seeb Intl", "Muscat", "Oman", 58.284444, 23.593278],
2149 + ["Salalah", "Salalah", "Oman", 54.091297, 17.038719],
2150 + ["Thumrait", "Thumrait", "Oman", 54.024612, 17.666],
2151 + ["Bhagatanwala", "Bhagtanwala", "Pakistan", 72.9484, 32.056108],
2152 + ["Spray View Airport", "Spray View", "Zimbabwe", 25.817, -17.917],
2153 + ["Lyon Part-Dieu Railway", "Lyon", "France", 5, 46],
2154 + ["Faisalabad Intl", "Faisalabad", "Pakistan", 72.994842, 31.365014],
2155 + ["Gwadar", "Gwadar", "Pakistan", 62.329494, 25.233308],
2156 + ["Gilgit", "Gilgit", "Pakistan", 74.333644, 35.918786],
2157 + ["Shahbaz Ab", "Jacobsbad", "Pakistan", 68.449711, 28.284167],
2158 + ["Jinnah Intl", "Karachi", "Pakistan", 67.160797, 24.906547],
2159 + ["Allama Iqbal Intl", "Lahore", "Pakistan", 74.403594, 31.521564],
2160 + ["Walton", "Lahore", "Pakistan", 74.346239, 31.494794],
2161 + ["Mangla", "Mangla", "Pakistan", 73.638381, 33.050086],
2162 + ["Muzaffarabad", "Muzaffarabad", "Pakistan", 73.508639, 34.339022],
2163 + ["Mianwali", "Mianwali", "Pakistan", 71.570681, 32.563089],
2164 + ["Moenjodaro", "Moenjodaro", "Pakistan", 68.143053, 27.335156],
2165 + ["Masroor", "Karachi", "Pakistan", 66.938753, 24.893564],
2166 + ["Multan Intl", "Multan", "Pakistan", 71.419111, 30.203222],
2167 + ["Nawabshah", "Nawabshah", "Pakistan", 68.390053, 26.219442],
2168 + ["Okara", "Okara", "Pakistan", 73.357736, 30.741025],
2169 + ["Panjgur", "Panjgur", "Pakistan", 64.132517, 26.954547],
2170 + ["Pasni", "Pasni", "Pakistan", 63.345083, 25.290487],
2171 + ["Peshawar Intl", "Peshawar", "Pakistan", 71.514581, 33.993911],
2172 + ["Qasim", "Qasim", "Pakistan", 73.033217, 33.560153],
2173 + ["Quetta", "Quetta", "Pakistan", 66.937764, 30.251369],
2174 + ["Sheikh Zayed", "Rahim Yar Khan", "Pakistan", 70.279572, 28.3839],
2175 + ["Chaklala", "Islamabad", "Pakistan", 73.099233, 33.616653],
2176 + ["Risalpur", "Risalpur", "Pakistan", 71.972583, 34.081112],
2177 + ["Rawalakot", "Rawala Kot", "Pakistan", 73.798147, 33.849658],
2178 + ["Point Roberts Airpark", "Point Roberts", "United States", -123.0788889, 48.9797222],
2179 + ["Sukkur", "Sukkur", "Pakistan", 68.791683, 27.721989],
2180 + ["Saidu Sharif", "Saidu Sharif", "Pakistan", 72.352814, 34.813556],
2181 + ["Sui", "Sui", "Pakistan", 69.176917, 28.645142],
2182 + ["Talhar", "Talhar", "Pakistan", 68.838408, 24.841519],
2183 + ["Wana", "Wana", "Pakistan", 69.570433, 32.304664],
2184 + ["Zhob", "Zhob", "Pakistan", 69.463606, 31.358381],
2185 + ["Basrah Intl", "Basrah", "Iraq", 47.662142, 30.549069],
2186 + ["Aleppo Intl", "Aleppo", "Syria", 37.224358, 36.180675],
2187 + ["Damascus Intl", "Damascus", "Syria", 36.514267, 33.410636],
2188 + ["Deir Zzor", "Deire Zor", "Syria", 40.175961, 35.285374],
2189 + ["Bassel Al Assad Intl", "Latakia", "Syria", 35.948681, 35.401094],
2190 + ["Palmyra", "Palmyra", "Syria", 38.316889, 34.557361],
2191 + ["Doha Intl", "Doha", "Qatar", 51.565056, 25.261125],
2192 + ["Canton", "Canton Island", "Kiribati", -171.710394, -2.768122],
2193 + ["Rota Intl", "Rota", "Northern Mariana Islands", 145.242536, 14.174308],
2194 + ["Francisco C Ada Saipan Intl", "Saipan", "Northern Mariana Islands", 145.729356, 15.119003],
2195 + ["Andersen Afb", "Andersen", "Guam", 144.930025, 13.583953],
2196 + ["Guam Intl", "Agana", "Guam", 144.795983, 13.48345],
2197 + ["Tinian Intl", "West Tinian", "Northern Mariana Islands", 145.61935, 14.999203],
2198 + ["Scone Airport", "Scone", "Australia", 150.832, -32.0372],
2199 + ["Marshall Islands Intl", "Majuro", "Marshall Islands", 171.272022, 7.064758],
2200 + ["Dyess Aaf", "Kwajalein", "Marshall Islands", 167.470869, 9.396886],
2201 + ["Bucholz Aaf", "Kwajalein", "Marshall Islands", 167.731661, 8.720122],
2202 + ["Cassidy Intl", "Kiritimati", "Kiribati", -157.349778, 1.986161],
2203 + ["Midway Atoll", "Midway", "Midway Islands", -177.380636, 28.201725],
2204 + ["Chuuk Intl", "Chuuk", "Micronesia", 151.843006, 7.461869],
2205 + ["Pohnpei Intl", "Pohnpei", "Micronesia", 158.208989, 6.9851],
2206 + ["Babelthuap", "Babelthuap", "Palau", 134.544278, 7.367303],
2207 + ["Kosrae", "Kosrae", "Micronesia", 162.958386, 5.356975],
2208 + ["Yap Intl", "Yap", "Micronesia", 138.082497, 9.498911],
2209 + ["Shang Yi", "Kinmen", "Taiwan", 118.359197, 24.427892],
2210 + ["Pingtung South", "Pingtung", "Taiwan", 120.461728, 22.672367],
2211 + ["Longtan", "Longtang", "Taiwan", 121.237636, 24.855136],
2212 + ["Fengnin", "Fengnin", "Taiwan", 121.101681, 22.754986],
2213 + ["Lyudao", "Green Island", "Taiwan", 121.466481, 22.673853],
2214 + ["Kaohsiung Intl", "Kaohsiung", "Taiwan", 120.350006, 22.577094],
2215 + ["Chiayi", "Chiayi", "Taiwan", 120.39283, 23.461779],
2216 + ["Lanyu", "Lanyu", "Taiwan", 121.533642, 22.028842],
2217 + ["Ching Chuang Kang", "Taichung", "Taiwan", 120.62058, 24.264668],
2218 + ["Cessnock Airport", "Cessnock", "Australia", 151.342, -32.7875],
2219 + ["Tainan", "Tainan", "Taiwan", 120.205778, 22.950361],
2220 + ["Hsinchu", "Hsinchu", "Taiwan", 120.939394, 24.818033],
2221 + ["Magong", "Makung", "Taiwan", 119.628311, 23.568669],
2222 + ["Jhihhang", "Taitung", "Taiwan", 121.181975, 22.793117],
2223 + ["Pingtung North", "Pingtung", "Taiwan", 120.482, 22.700239],
2224 + ["Sungshan", "Taipei", "Taiwan", 121.5525, 25.069722],
2225 + ["Taoyuan Intl", "Taipei", "Taiwan", 121.232822, 25.077731],
2226 + ["Wang An", "Wang An", "Taiwan", 119.494444, 23.370833],
2227 + ["Hualien", "Hualien", "Taiwan", 121.616906, 24.023725],
2228 + ["Narita Intl", "Tokyo", "Japan", 140.386389, 35.764722],
2229 + ["Matsumoto", "Matsumoto", "Japan", 137.922669, 36.166758],
2230 + ["Hyakuri", "Ibaraki", "Japan", 140.415444, 36.181083],
2231 + ["Minami Torishima", "Minami Tori Shima", "Japan", 153.979119, 24.289697],
2232 + ["Iwo Jima", "Iwojima", "Japan", 141.322722, 24.784],
2233 + ["Nanki Shirahama", "Nanki-shirahama", "Japan", 135.364444, 33.662222],
2234 + ["Kohnan", "Kohnan", "Japan", 133.933225, 34.590836],
2235 + ["Obihiro", "Obihiro", "Japan", 143.217222, 42.733333],
2236 + ["New Chitose", "Sapporo", "Japan", 141.692283, 42.7752],
2237 + ["Hakodate", "Hakodate", "Japan", 140.821944, 41.77],
2238 + ["Chitose", "Chitose", "Japan", 141.666447, 42.794475],
2239 + ["Memanbetsu", "Memanbetsu", "Japan", 144.164053, 43.880606],
2240 + ["Nakashibetsu", "Nakashibetsu", "Japan", 144.96, 43.5775],
2241 + ["Tokachi", "Tokachi", "Japan", 143.158475, 42.890544],
2242 + ["Wakkanai", "Wakkanai", "Japan", 141.800833, 45.404167],
2243 + ["Iki", "Iki", "Japan", 129.785417, 33.749027],
2244 + ["Yamaguchi Ube", "Yamaguchi", "Japan", 131.278611, 33.93],
2245 + ["Tsushima", "Tsushima", "Japan", 129.33055, 34.284889],
2246 + ["Monbetsu", "Monbetsu", "Japan", 143.404028, 44.303914],
2247 + ["Asahikawa", "Asahikawa", "Japan", 142.4475, 43.670833],
2248 + ["Okushiri", "Okushiri", "Japan", 139.432911, 42.071667],
2249 + ["Rishiri", "Rishiri Island", "Japan", 141.186431, 45.242006],
2250 + ["Ashiya", "Ashiya", "Japan", 130.653, 33.883083],
2251 + ["Yakushima", "Yakushima", "Japan", 130.659017, 30.385569],
2252 + ["Fukue", "Fukue", "Japan", 128.832808, 32.666269],
2253 + ["Fukuoka", "Fukuoka", "Japan", 130.450686, 33.585942],
2254 + ["New Tanegashima", "Tanegashima", "Japan", 130.991231, 30.605067],
2255 + ["Kagoshima", "Kagoshima", "Japan", 130.719408, 31.803397],
2256 + ["Miyazaki", "Miyazaki", "Japan", 131.448611, 31.877222],
2257 + ["Nyutabaru", "Nyutabaru", "Japan", 131.451389, 32.083611],
2258 + ["Oita", "Oita", "Japan", 131.737222, 33.479444],
2259 + ["New Kitakyushu", "Kitakyushu", "Japan", 131.034689, 33.845942],
2260 + ["Kumamoto", "Kumamoto", "Japan", 130.85505, 32.837319],
2261 + ["Nagasaki", "Nagasaki", "Japan", 129.913611, 32.916944],
2262 + ["Kanoya", "Kanoya", "Japan", 130.845456, 31.367608],
2263 + ["Tsuiki", "Tsuiki", "Japan", 131.040278, 33.685],
2264 + ["Amami", "Amami", "Japan", 129.712542, 28.430633],
2265 + ["Okierabu", "Okierabu", "Japan", 128.700903, 27.425522],
2266 + ["Tokunoshima", "Tokunoshima", "Japan", 128.881253, 27.836381],
2267 + ["Fukui", "Fukui", "Japan", 136.223922, 36.142847],
2268 + ["Gifu", "Gifu", "Japan", 136.869667, 35.394078],
2269 + ["Hamamatsu", "Hamamatsu", "Japan", 137.703083, 34.750239],
2270 + ["Komatsu", "Kanazawa", "Japan", 136.406544, 36.394611],
2271 + ["Oki", "Oki Island", "Japan", 133.324844, 36.181125],
2272 + ["Toyama", "Toyama", "Japan", 137.1875, 36.648333],
2273 + ["Shizuhama", "Yaizu", "Japan", 138.298056, 34.812778],
2274 + ["Hiroshima", "Hiroshima", "Japan", 132.919444, 34.436111],
2275 + ["Okayama", "Okayama", "Japan", 133.855278, 34.756944],
2276 + ["Izumo", "Izumo", "Japan", 132.89, 35.413611],
2277 + ["Hofu", "Hofu", "Japan", 131.549194, 34.034667],
2278 + ["Yonago Kitaro", "Miho", "Japan", 133.236389, 35.492222],
2279 + ["Iwakuni Mcas", "Iwakuni", "Japan", 132.23575, 34.14386],
2280 + ["Kochi", "Kochi", "Japan", 133.669444, 33.546111],
2281 + ["Matsuyama", "Matsuyama", "Japan", 132.699722, 33.827222],
2282 + ["Osaka Intl", "Osaka", "Japan", 135.438222, 34.785528],
2283 + ["Tottori", "Tottori", "Japan", 134.166553, 35.530069],
2284 + ["Tokushima", "Tokushima", "Japan", 134.606639, 34.132808],
2285 + ["Takamatsu", "Takamatsu", "Japan", 134.015556, 34.214167],
2286 + ["Yao", "Osaka", "Japan", 135.602944, 34.596311],
2287 + ["Ozuki", "Ozuki", "Japan", 131.052144, 34.045322],
2288 + ["Aomori", "Aomori", "Japan", 140.690833, 40.734722],
2289 + ["Yamagata", "Yamagata", "Japan", 140.371331, 38.411894],
2290 + ["Sado", "Sado", "Japan", 138.413928, 38.060181],
2291 + ["Hachinohe", "Hachinoe", "Japan", 141.466325, 40.556447],
2292 + ["Hanamaki", "Hanamaki", "Japan", 141.135278, 39.428611],
2293 + ["Akita", "Akita", "Japan", 140.218611, 39.615556],
2294 + ["Misawa Ab", "Misawa", "Japan", 141.368364, 40.703222],
2295 + ["Sendai", "Sendai", "Japan", 140.916944, 38.139722],
2296 + ["Matsushima", "Matsushima", "Japan", 141.219572, 38.404919],
2297 + ["Sazena", "Sazena", "Czech Republic", 14.1532, 50.1929],
2298 + ["Atsugi Naf", "Atsugi", "Japan", 139.450167, 35.454611],
2299 + ["Tateyama", "Tateyama", "Japan", 139.829208, 34.987053],
2300 + ["Hachijojima", "Hachijojima", "Japan", 139.785833, 33.115],
2301 + ["Iruma", "Iruma", "Japan", 139.410556, 35.841944],
2302 + ["Kisarazu", "Kisarazu", "Japan", 139.909936, 35.398272],
2303 + ["Shimofusa", "Shimofusa", "Japan", 140.011111, 35.798944],
2304 + ["Oshima", "Oshima", "Japan", 139.360306, 34.782033],
2305 + ["Kastner Aaf", "Zama", "Japan", 139.393675, 35.513769],
2306 + ["Tokyo Intl", "Tokyo", "Japan", 139.779694, 35.552258],
2307 + ["Yokota Ab", "Yokota", "Japan", 139.348483, 35.748492],
2308 + ["Gwangju", "Kwangju", "South Korea", 126.808889, 35.126389],
2309 + ["Jeon Ju", "Jhunju", "South Korea", 127.11955, 35.878436],
2310 + ["Yeosu", "Yeosu", "South Korea", 127.61685, 34.842328],
2311 + ["Sokcho", "Sokch'o", "South Korea", 128.598556, 38.142614],
2312 + ["Gangneung", "Kangnung", "South Korea", 128.943625, 37.753561],
2313 + ["Macomb Municipal Airport", "Macomb", "United States", -90.6523889, 40.5200833],
2314 + ["Jeju Intl", "Cheju", "South Korea", 126.493028, 33.511306],
2315 + ["Jinhae", "Chinhae", "South Korea", 128.695792, 35.141175],
2316 + ["Gimhae Intl", "Busan", "South Korea", 128.938222, 35.179528],
2317 + ["Bungle Bungle Airport", "Bungle Bungle", "Australia", 128.307, -17.5453],
2318 + ["Ulsan", "Ulsan", "South Korea", 129.351722, 35.593494],
2319 + ["A 511", "Pyongtaek", "South Korea", 127.031072, 36.962214],
2320 + ["Seoul Ab", "Seoul East", "South Korea", 127.113889, 37.445833],
2321 + ["Osan Ab", "Osan", "South Korea", 127.029594, 37.090617],
2322 + ["Gimpo", "Seoul", "South Korea", 126.790586, 37.558311],
2323 + ["Suwon", "Suwon", "South Korea", 127.007053, 37.239406],
2324 + ["Pohang", "Pohang", "South Korea", 129.420486, 35.987858],
2325 + ["Daegu Ab", "Taegu", "South Korea", 128.658856, 35.894108],
2326 + ["Yecheon", "Yechon", "South Korea", 128.35485, 36.631933],
2327 + ["Naha", "Okinawa", "Japan", 127.645869, 26.195814],
2328 + ["Ie Shima Aux Ab", "Iejima", "Japan", 127.761775, 26.728775],
2329 + ["Kadena Ab", "Kadena", "Japan", 127.767633, 26.355612],
2330 + ["Ishigaki", "Ishigaki", "Japan", 124.186983, 24.344525],
2331 + ["Kumejima", "Kumejima", "Japan", 126.713806, 26.363506],
2332 + ["Minami Daito", "Minami Daito", "Japan", 131.263494, 25.846533],
2333 + ["Miyako", "Miyako", "Japan", 125.295111, 24.782833],
2334 + ["Kitadaito", "Kitadaito", "Japan", 131.326944, 25.944722],
2335 + ["Shimojishima", "Shimojishima", "Japan", 125.144722, 24.826667],
2336 + ["Tarama", "Tarama", "Japan", 124.675278, 24.653889],
2337 + ["Yoron", "Yoron", "Japan", 128.401517, 27.043964],
2338 + ["Futenma Mcas", "Futema", "Japan", 127.756494, 26.274275],
2339 + ["Yonaguni", "Yonaguni Jima", "Japan", 122.977778, 24.466944],
2340 + ["Ninoy Aquino Intl", "Manila", "Philippines", 121.019581, 14.508647],
2341 + ["Mary Airport", "Mary", "Turkmenistan", 61.8967, 37.6194],
2342 + ["Cotabato", "Cotabato", "Philippines", 124.209619, 7.165242],
2343 + ["Cagayan De Oro", "Ladag", "Philippines", 124.611219, 8.415619],
2344 + ["Pagadian", "Pagadian", "Philippines", 123.458294, 7.827197],
2345 + ["Tambler", "Romblon", "Philippines", 125.096033, 6.058003],
2346 + ["Crocodile Camp", "Tsavo East", "Kenya", 39.2194305555556, -3.070875],
2347 + ["Zamboanga Intl", "Zamboanga", "Philippines", 122.059633, 6.922419],
2348 + ["Baguio", "Baguio", "Philippines", 120.619636, 16.375103],
2349 + ["Daet", "Daet", "Philippines", 122.980181, 14.129167],
2350 + ["Basa Ab", "Floridablanca", "Philippines", 120.4925, 14.986527],
2351 + ["Lingayen", "Lingayen", "Philippines", 120.241106, 16.034786],
2352 + ["San Jose", "San Jose", "Philippines", 121.046639, 12.361517],
2353 + ["Fernando Ab", "Lipa", "Philippines", 121.124925, 13.955017],
2354 + ["Mamburao", "Mamburao", "Philippines", 120.60535, 13.208092],
2355 + ["Vigan", "Vigan", "Philippines", 120.355797, 17.555331],
2356 + ["Baler", "Baler", "Philippines", 121.500133, 15.729836],
2357 + ["Kimana", "Kimana", "Kenya", 37.5333333333333, -2.8],
2358 + ["Solio Ranch Airport", "Solio", "Kenya", 36.8849, -0.245167],
2359 + ["Kalundborg Flyveplads", "Kalundborg", "Denmark", 11.2549, 55.7001],
2360 + ["Bagabag", "Bagabag", "Philippines", 121.252319, 16.619194],
2361 + ["Daniel Z Romualdez", "Tacloban", "Philippines", 125.027758, 11.227628],
2362 + ["Bacolod", "Bacolod", "Philippines", 122.929617, 10.642511],
2363 + ["Gardermoen Airport", "Oslo", "Norway", 11.1004, 60.1939],
2364 + ["Dumaguete", "Dumaguete", "Philippines", 123.300472, 9.333714],
2365 + ["Caticlan", "Caticlan", "Philippines", 121.95405, 11.924503],
2366 + ["Guiuan", "Guiuan", "Philippines", 125.741594, 11.035544],
2367 + ["Iloilo", "Iloilo", "Philippines", 122.545297, 10.713044],
2368 + ["Kalibo", "Kalibo", "Philippines", 122.376294, 11.679431],
2369 + ["Mactan Cebu Intl", "Masbate", "Philippines", 123.979439, 10.307542],
2370 + ["Wausau Downtown Airport", "Wausau", "United States", -89.6270018, 44.9262845],
2371 + ["Puerto Princesa", "Puerto Princesa", "Philippines", 118.758731, 9.742119],
2372 + ["Antique", "San Jose", "Philippines", 121.933439, 10.766044],
2373 + ["Comodoro Pierrestegui", "Concordia", "Argentina", -57.996631, -31.296944],
2374 + ["Gualeguaychu", "Gualeguaychu", "Argentina", -58.613056, -33.010278],
2375 + ["Junin", "Junin", "Argentina", -60.930556, -34.545889],
2376 + ["General Urquiza", "Parana", "Argentina", -60.480361, -31.794778],
2377 + ["Rosario", "Rosario", "Argentina", -60.785, -32.903611],
2378 + ["Sauce Viejo", "Santa Fe", "Argentina", -60.811668, -31.711666],
2379 + ["Aeroparque Jorge Newbery", "Buenos Aires", "Argentina", -58.415606, -34.559175],
2380 + ["Ambrosio L V Taravella", "Cordoba", "Argentina", -64.207953, -31.323619],
2381 + ["Chamical", "Gobernador Gordillo", "Argentina", -66.29361, -30.345278],
2382 + ["San Fernando", "San Fernando", "Argentina", -58.589644, -34.453189],
2383 + ["Mariano Moreno", "Jose C. Paz", "Argentina", -58.789564, -34.56065],
2384 + ["La Plata", "La Plata", "Argentina", -57.894694, -34.972222],
2385 + ["Moron", "Moron", "Argentina", -58.642756, -34.676317],
2386 + ["El Palomar", "El Palomar", "Argentina", -58.612592, -34.609939],
2387 + ["Chos Malal", "Chosmadal", "Argentina", -70.222469, -37.444692],
2388 + ["General Roca", "Fuerte Gral Roca", "Argentina", -67.620514, -39.000672],
2389 + ["El Plumerillo", "Mendoza", "Argentina", -68.792856, -32.831717],
2390 + ["Malargue", "Malargue", "Argentina", -69.574267, -35.493597],
2391 + ["San Rafael", "San Rafael", "Argentina", -68.403854, -34.588314],
2392 + ["Catamarca", "Catamarca", "Argentina", -65.750925, -28.593214],
2393 + ["Santiago Del Estero", "Santiago Del Estero", "Argentina", -64.310122, -27.765617],
2394 + ["Tinogasta", "Tinogasta", "Argentina", -67.580314, -28.03775],
2395 + ["La Rioja", "La Rioja", "Argentina", -66.795839, -29.381636],
2396 + ["Chilecito", "Chilecito", "Argentina", -67.438889, -29.223888],
2397 + ["Teniente Benjamin Matienzo", "Tucuman", "Argentina", -65.104944, -26.840861],
2398 + ["San Juan", "San Julian", "Argentina", -68.418194, -31.571472],
2399 + ["Rio Cuarto Area De Material", "Rio Cuarto", "Argentina", -64.261314, -33.085128],
2400 + ["Villa Dolores", "Villa Dolores", "Argentina", -65.146283, -31.945183],
2401 + ["Laboulaye", "Laboulaye", "Argentina", -63.36225, -34.135444],
2402 + ["Marcos Juarez", "Marcos Juarez", "Argentina", -62.157792, -32.683639],
2403 + ["Villa Reynolds", "Villa Reynolds", "Argentina", -65.378086, -33.725144],
2404 + ["San Luis", "San Luis", "Argentina", -66.356422, -33.273192],
2405 + ["Corrientes", "Corrientes", "Argentina", -58.761864, -27.445503],
2406 + ["Resistencia", "Resistencia", "Argentina", -59.056125, -27.449986],
2407 + ["Formosa", "Formosa", "Argentina", -58.228111, -26.212722],
2408 + ["Cataratas Del Iguazu", "Iguazu Falls", "Argentina", -54.473444, -25.737281],
2409 + ["Paso De Los Libres", "Paso De Los Libres", "Argentina", -57.152078, -29.689425],
2410 + ["Monte Caseros", "Monte Caseros", "Argentina", -57.640231, -30.271922],
2411 + ["Posadas", "Posadas", "Argentina", -55.970728, -27.385839],
2412 + ["Termal", "Presidencia R.s.pena", "Argentina", -60.493103, -26.756519],
2413 + ["Salta", "Salta", "Argentina", -65.486169, -24.855978],
2414 + ["Jujuy", "Jujuy", "Argentina", -65.097778, -24.392778],
2415 + ["Oran", "Oran", "Argentina", -64.32917, -23.152779],
2416 + ["La Quiaca", "La Quiaca", "Argentina", -65.5775, -22.150556],
2417 + ["Portage Municipal Airport", "Portage", "United States", -89.4828607, 43.5603136],
2418 + ["Eldorado", "El Dorado", "Argentina", -54.574722, -26.397499],
2419 + ["Goya", "Goya", "Argentina", -59.250583, -29.099472],
2420 + ["Obera", "Obera", "Argentina", -55.124156, -27.518156],
2421 + ["Reconquista", "Reconquista", "Argentina", -59.68, -29.210278],
2422 + ["Curuzu Cuatia", "Curuzu Cuatia", "Argentina", -57.978889, -29.770555],
2423 + ["El Bolson", "El Bolson", "Argentina", -71.532289, -41.943189],
2424 + ["Comodoro Rivadavia", "Comodoro Rivadavia", "Argentina", -67.465508, -45.785347],
2425 + ["Esquel", "Esquel", "Argentina", -71.139472, -42.90795],
2426 + ["Almirante Zar", "Trelew", "Argentina", -65.270319, -43.2105],
2427 + ["Gobernador Castello", "Viedma", "Argentina", -63.000389, -40.869222],
2428 + ["El Tehuelche", "Puerto Madryn", "Argentina", -65.102725, -42.759161],
2429 + ["Base Marambio", "Marambio Base", "Antarctica", -56.630833, -64.238335],
2430 + ["Puerto Deseado", "Puerto Deseado", "Argentina", -65.904097, -47.735292],
2431 + ["Rio Grande", "Rio Grande", "Argentina", -67.749389, -53.777667],
2432 + ["Rio Gallegos", "Rio Gallegos", "Argentina", -69.312636, -51.608875],
2433 + ["Ushuaia Malvinas Argentinas", "Ushuaia", "Argentina", -68.29575, -54.843278],
2434 + ["San Julian", "San Julian", "Argentina", -67.802589, -49.306775],
2435 + ["Perito Moreno", "Perito Moreno", "Argentina", -70.978689, -46.537911],
2436 + ["Santa Cruz", "Santa Cruz", "Argentina", -68.579197, -50.01655],
2437 + ["Comandante Espora", "Bahia Blanca", "Argentina", -62.169317, -38.724967],
2438 + ["Coronel Suarez", "Colonel Suarez", "Argentina", -61.889297, -37.446111],
2439 + ["Olavarria", "Olavarria", "Argentina", -60.216619, -36.890039],
2440 + ["General Pico", "General Pico", "Argentina", -63.758286, -35.696183],
2441 + ["Tres Arroyos", "Tres Arroyos", "Argentina", -60.329711, -38.386911],
2442 + ["Bolivar", "Bolivar", "Argentina", -61.076367, -36.186594],
2443 + ["Gogebic Iron County Airport", "Ironwood", "United States", -90.1313967, 46.5274747],
2444 + ["Mar Del Plata", "Mar Del Plata", "Argentina", -57.573333, -37.934167],
2445 + ["Presidente Peron", "Neuquen", "Argentina", -68.155711, -38.949],
2446 + ["Mackinac Island Airport", "Mackinac Island", "United States", -84.637344, 45.8649344],
2447 + ["Comodoro P Zanni", "Pehuajo", "Argentina", -61.857553, -35.844592],
2448 + ["Santa Rosa", "Santa Rosa", "Argentina", -64.275694, -36.588322],
2449 + ["San Carlos De Bariloche", "San Carlos De Bariloche", "Argentina", -71.157542, -41.151172],
2450 + ["Tandil", "Tandil", "Argentina", -59.227922, -37.237392],
2451 + ["Villa Gesell", "Villa Gesell", "Argentina", -57.029239, -37.235408],
2452 + ["Cutralco", "Cutralco", "Argentina", -69.264642, -38.939683],
2453 + ["Aviador C Campos", "San Martin Des Andes", "Argentina", -71.137294, -40.075383],
2454 + ["Conceicao Do Araguaia", "Conceicao Do Araguaia", "Brazil", -49.301528, -8.348347],
2455 + ["Campo Delio Jardim De Mattos", "Rio De Janeiro", "Brazil", -43.384708, -22.875083],
2456 + ["Amapa", "Amapa", "Brazil", -50.858236, 2.077511],
2457 + ["Araraquara", "Araracuara", "Brazil", -48.133028, -21.812],
2458 + ["Santa Maria", "Aracaju", "Brazil", -37.070333, -10.984],
2459 + ["Assis", "Assis", "Brazil", -50.455914, -22.638564],
2460 + ["Alta Floresta", "Alta Floresta", "Brazil", -56.106206, -9.866092],
2461 + ["Aracatuba", "Aracatuba", "Brazil", -50.424722, -21.141342],
2462 + ["Val De Cans Intl", "Belem", "Brazil", -48.476292, -1.37925],
2463 + ["Comandante Gustavo Kraemer", "Bage", "Brazil", -54.112244, -31.390528],
2464 + ["Pampulha Carlos Drummond De Andrade", "Belo Horizonte", "Brazil", -43.950628, -19.851181],
2465 + ["Bacacheri", "Curitiba", "Brazil", -49.232036, -25.405078],
2466 + ["Major Brigadeiro Doorgal Borges", "Barbacena", "Brazil", -43.761056, -21.267167],
2467 + ["Presidente Juscelino Kubitschek", "Brasilia", "Brazil", -47.918625, -15.8711],
2468 + ["Bauru", "Bauru", "Brazil", -49.0538, -22.345042],
2469 + ["Boa Vista", "Boa Vista", "Brazil", -60.690069, 2.846311],
2470 + ["Barra Do Garcas", "Barra Do Garcas", "Brazil", -52.388894, -15.861344],
2471 + ["Cascavel", "Cascavel", "Brazil", -53.500764, -25.000339],
2472 + ["Cachimbo", "Itaituba", "Brazil", -54.965422, -9.333936],
2473 + ["Tancredo Neves Intl", "Belo Horizonte", "Brazil", -43.968856, -19.63375],
2474 + ["Campo Grande", "Campo Grande", "Brazil", -54.6725, -20.468667],
2475 + ["Chapeco", "Chapeco", "Brazil", -52.656553, -27.134219],
2476 + ["Carolina", "Carolina", "Brazil", -47.458667, -7.320444],
2477 + ["Forquilhinha", "Criciuma", "Brazil", -49.424739, -28.725817],
2478 + ["Canoas", "Porto Alegre", "Brazil", -51.144367, -29.945944],
2479 + ["Bartolomeu Lisandro", "Campos", "Brazil", -41.301669, -21.698333],
2480 + ["Corumba Intl", "Corumba", "Brazil", -57.673053, -19.011931],
2481 + ["Afonso Pena", "Curitiba", "Brazil", -49.175775, -25.528475],
2482 + ["Caravelas", "Caravelas", "Brazil", -39.253069, -17.652283],
2483 + ["Campo Dos Bugres", "Caxias Do Sul", "Brazil", -51.187536, -29.197064],
2484 + ["Marechal Rondon", "Cuiaba", "Brazil", -56.116719, -15.652931],
2485 + ["Cruzeiro do Sul", "Cruzeiro do Sul", "Brazil", -72.769489, -7.599906],
2486 + ["Presidente Prudente", "President Prudente", "Brazil", -51.424639, -22.175056],
2487 + ["Eduardo Gomes Intl", "Manaus", "Brazil", -60.049721, -3.038611],
2488 + ["Jacareacanga", "Jacare-acanga", "Brazil", -57.776869, -6.233156],
2489 + ["Sao Pedro Da Aldeia", "Sao Pedro Da Aldeia", "Brazil", -42.092633, -22.812872],
2490 + ["Cataratas Intl", "Foz Do Iguacu", "Brazil", -54.487206, -25.59615],
2491 + ["Hercilio Luz", "Florianopolis", "Brazil", -48.547181, -27.670489],
2492 + ["Fernando De Noronha", "Fernando Do Noronha", "Brazil", -32.423336, -3.854928],
2493 + ["Fronteira", "Fronteira", "Brazil", -49.187472, -20.278483],
2494 + ["Furnas", "Alpinopolis", "Brazil", -46.335264, -20.702817],
2495 + ["Pinto Martins Intl", "Fortaleza", "Brazil", -38.532556, -3.776283],
2496 + ["Galeao Antonio Carlos Jobim", "Rio De Janeiro", "Brazil", -43.243647, -22.808903],
2497 + ["Guajara Mirim", "Guajara-mirim", "Brazil", -65.284792, -10.786375],
2498 + ["Santa Genoveva", "Goiania", "Brazil", -49.220686, -16.632033],
2499 + ["Embraer Unidade Gaviao Peixoto", "Macae", "Brazil", -48.405078, -21.773683],
2500 + ["Guarulhos Gov Andre Franco Montouro", "Sao Paulo", "Brazil", -46.469511, -23.432075],
2501 + ["Guaratingueta", "Guaratingueta", "Brazil", -45.204778, -22.791608],
2502 + ["Altamira", "Altamira", "Brazil", -52.253978, -3.253906],
2503 + ["Itacoatiara", "Itaituba", "Brazil", -58.481186, -3.127256],
2504 + ["Itaituba", "Itaituba", "Brazil", -56.000669, -4.242342],
2505 + ["Ilheus", "Ilheus", "Brazil", -39.033197, -14.815964],
2506 + ["Usiminas", "Ipatinga", "Brazil", -42.487583, -19.470722],
2507 + ["Hidroeletrica", "Itumbiara", "Brazil", -49.213361, -18.444661],
2508 + ["Prefeito Renato Moreira", "Imperatriz", "Brazil", -47.46005, -5.531292],
2509 + ["Julio Cesar", "Belem", "Brazil", -48.460739, -1.414158],
2510 + ["Francisco De Assis", "Juiz De Fora", "Brazil", -43.386778, -21.7915],
2511 + ["Presidente Castro Pinto", "Joao Pessoa", "Brazil", -34.950681, -7.148381],
2512 + ["Lauro Carneiro De Loyola", "Joinville", "Brazil", -48.797364, -26.224453],
2513 + ["Presidente Joao Suassuna", "Campina Grande", "Brazil", -35.896364, -7.269917],
2514 + ["Viracopos", "Campinas", "Brazil", -47.134444, -23.0075],
2515 + ["Lages", "Lajes", "Brazil", -50.281486, -27.782142],
2516 + ["Lins", "Lins", "Brazil", -49.730519, -21.664039],
2517 + ["Londrina", "Londrina", "Brazil", -51.130072, -23.333625],
2518 + ["Bom Jesus Da Lapa", "Bom Jesus Da Lapa", "Brazil", -43.408114, -13.262086],
2519 + ["Lagoa Santa", "Lagoa Santa", "Brazil", -43.896403, -19.661611],
2520 + ["Maraba", "Maraba", "Brazil", -49.138025, -5.368589],
2521 + ["Monte Dourado", "Almeirim", "Brazil", -52.60225, -0.889839],
2522 + ["Regional De Maringa Silvio Name Junior", "Maringa", "Brazil", -52.016406, -23.476392],
2523 + ["Mario Ribeiro", "Montes Claros", "Brazil", -43.8189, -16.706925],
2524 + ["Grand Marais Cook County Airport", "Grand Marais", "United States", -90.3829444, 47.8383333],
2525 + ["Ponta Pelada", "Manaus", "Brazil", -59.9863, -3.146042],
2526 + ["Zumbi Dos Palmares", "Maceio", "Brazil", -35.791678, -9.510808],
2527 + ["Macapa", "Macapa", "Brazil", -51.072178, 0.050664],
2528 + ["Dix Sept Rosado", "Mocord", "Brazil", -37.364347, -5.201919],
2529 + ["Marte", "Sao Paulo", "Brazil", -46.637753, -23.509119],
2530 + ["Manicore", "Manicore", "Brazil", -61.278319, -5.811381],
2531 + ["Ministro Victor Konder Intl", "Navegantes", "Brazil", -48.65139, -26.879999],
2532 + ["Santo Angelo", "Santo Angelo", "Brazil", -54.169139, -28.281683],
2533 + ["Augusto Severo", "Natal", "Brazil", -35.247717, -5.911417],
2534 + ["Oiapoque", "Oioiapoque", "Brazil", -51.796867, 3.855486],
2535 + ["Salgado Filho", "Porto Alegre", "Brazil", -51.171428, -29.994428],
2536 + ["Prefeito Doutor Joao Silva Filho", "Parnaiba", "Brazil", -41.731961, -2.893747],
2537 + ["Pocos De Caldas", "Pocos De Caldas", "Brazil", -46.567917, -21.843014],
2538 + ["Lauro Kurtz", "Passo Fundo", "Brazil", -52.326558, -28.243989],
2539 + ["Pelotas", "Pelotas", "Brazil", -52.327689, -31.718353],
2540 + ["Senador Nilo Coelho", "Petrolina", "Brazil", -40.569097, -9.362411],
2541 + ["Porto Nacional", "Porto Nacional", "Brazil", -48.399736, -10.719417],
2542 + ["Ponta Pora", "Ponta Pora", "Brazil", -55.702614, -22.549639],
2543 + ["Governador Jorge Teixeira De Oliveira", "Porto Velho", "Brazil", -63.902281, -8.709294],
2544 + ["Porter County Municipal Airport", "Valparaiso", "United States", -87.0070833, 41.4539722],
2545 + ["Plácido de Castro", "Rio Branco", "Brazil", -67.4836, -9.583],
2546 + ["Guararapes Gilberto Freyre Intl", "Recife", "Brazil", -34.923039, -8.126794],
2547 + ["Rio Grande", "Rio Grande", "Brazil", -52.166542, -32.082617],
2548 + ["Santos Dumont", "Rio De Janeiro", "Brazil", -43.163133, -22.910461],
2549 + ["Leite Lopes", "Ribeirao Preto", "Brazil", -47.774189, -21.134167],
2550 + ["Santa Cruz", "Rio De Janeiro", "Brazil", -43.719092, -22.93235],
2551 + ["Professor Urbano Ernesto Stumpf", "Sao Jose Dos Campos", "Brazil", -45.862739, -23.228172],
2552 + ["Marechal Cunha Machado Intl", "Sao Luis", "Brazil", -44.234139, -2.585361],
2553 + ["Congonhas", "Sao Paulo", "Brazil", -46.655375, -23.626692],
2554 + ["Sao Jose Do Rio Preto", "Sao Jose Do Rio Preto", "Brazil", -49.406511, -20.816567],
2555 + ["Base Aerea De Santos", "Santos", "Brazil", -46.2875, -23.925206],
2556 + ["Deputado Luis Eduardo Magalhaes", "Salvador", "Brazil", -38.331044, -12.910994],
2557 + ["Trombetas", "Oriximina", "Brazil", -56.396803, -1.4896],
2558 + ["Senador Petronio Portella", "Teresina", "Brazil", -42.823478, -5.059942],
2559 + ["Tefe", "Tefe", "Brazil", -64.724056, -3.382944],
2560 + ["Tarauaca", "Tarauaca", "Brazil", -70.783269, -8.155256],
2561 + ["Telemaco Borba", "Telemaco Borba", "Brazil", -50.651592, -24.317775],
2562 + ["Tirios", "Obidos Tirios", "Brazil", -55.946056, 2.223472],
2563 + ["Tabatinga", "Tabatinga", "Brazil", -69.935828, -4.255669],
2564 + ["Tucurui", "Tucurui", "Brazil", -49.720267, -3.786008],
2565 + ["Sao Gabriel Da Cachoeira", "Sao Gabriel", "Brazil", -66.985589, -0.148419],
2566 + ["Paulo Afonso", "Paulo Alfonso", "Brazil", -38.250575, -9.400878],
2567 + ["Rubem Berta", "Uruguaiana", "Brazil", -57.038189, -29.782178],
2568 + ["Ten Cel Av Cesar Bombonato", "Uberlandia", "Brazil", -48.225594, -18.882844],
2569 + ["Urubupunga", "Castilho", "Brazil", -51.564761, -20.777067],
2570 + ["Uberaba", "Uberaba", "Brazil", -47.964778, -19.765],
2571 + ["Major Brigadeiro Trompowsky", "Varginha", "Brazil", -45.473342, -21.590067],
2572 + ["Vilhena", "Vilhena", "Brazil", -60.098269, -12.694375],
2573 + ["Goiabeiras", "Vitoria", "Brazil", -40.286389, -20.258056],
2574 + ["Iauarete", "Iauarete", "Brazil", -69.185837, 0.6075],
2575 + ["Campo Fontenelle", "Piracununga", "Brazil", -47.334764, -21.984561],
2576 + ["Chacalluta", "Arica", "Chile", -70.338742, -18.348531],
2577 + ["Balmaceda", "Balmaceda", "Chile", -71.689475, -45.916058],
2578 + ["El Bosque", "Santiago", "Chile", -70.6884, -33.5618],
2579 + ["Chile Chico", "Chile Chico", "Chile", -71.687405, -46.583341],
2580 + ["El Loa", "Calama", "Chile", -68.903575, -22.498175],
2581 + ["General Bernardo O Higgins", "Chillan", "Chile", -72.031367, -36.582497],
2582 + ["Carlos Ibanez Del Campo Intl", "Punta Arenas", "Chile", -70.854586, -53.002642],
2583 + ["Teniente Vidal", "Coyhaique", "Chile", -72.106133, -45.594211],
2584 + ["Diego Aracena Intl", "Iquique", "Chile", -70.181275, -20.535222],
2585 + ["Arturo Merino Benitez Intl", "Santiago", "Chile", -70.785803, -33.392975],
2586 + ["Cerro Moreno Intl", "Antofagasta", "Chile", -70.4451, -23.444478],
2587 + ["Capitan Fuentes Martinez", "Porvenir", "Chile", -70.319228, -53.2537],
2588 + ["Futaleufu", "Futaleufu", "Chile", -71.851112, -43.189167],
2589 + ["Maria Dolores", "Los Angeles", "Chile", -72.425444, -37.401731],
2590 + ["Guardiamarina Zanartu", "Puerto Williams", "Chile", -67.626261, -54.931072],
2591 + ["Carriel Sur Intl", "Concepcion", "Chile", -73.063106, -36.77265],
2592 + ["Mataveri Intl", "Easter Island", "Chile", -109.421831, -27.164792],
2593 + ["Canal Bajo Carlos Hott Siebert", "Osorno", "Chile", -73.061042, -40.611208],
2594 + ["Vallenar", "Vallenar", "Chile", -70.755997, -28.596403],
2595 + ["De La Independencia", "Rancagua", "Chile", -70.775694, -34.173694],
2596 + ["Teniente Rodolfo Marsh Martin", "Isla Rey Jorge", "Antarctica", -58.986667, -62.190833],
2597 + ["La Florida", "La Serena", "Chile", -71.199522, -29.916233],
2598 + ["Eulogio Sanchez", "Santiago", "Chile", -70.546667, -33.456278],
2599 + ["Maquehue", "Temuco", "Chile", -72.637097, -38.766819],
2600 + ["El Tepual Intl", "Puerto Montt", "Chile", -73.093953, -41.438886],
2601 + ["Chaiten", "Chaiten", "Chile", -72.699114, -42.932808],
2602 + ["Pichoy", "Valdivia", "Chile", -73.086111, -39.649956],
2603 + ["Chachoan", "Ambato", "Ecuador", -78.574636, -1.212067],
2604 + ["Hacienda Clementina", "Clementia", "Ecuador", -79.378936, -1.706275],
2605 + ["Francisco De Orellana", "Coca", "Ecuador", -76.986842, -0.462886],
2606 + ["Mariscal Lamar", "Cuenca", "Ecuador", -78.984397, -2.889467],
2607 + ["Seymour", "Galapagos", "Ecuador", -90.265914, -0.453758],
2608 + ["Jose Joaquin De Olmedo Intl", "Guayaquil", "Ecuador", -79.883558, -2.157419],
2609 + ["Gualaquiza", "Gualaquiza", "Ecuador", -78.566994, -3.423214],
2610 + ["Atahualpa", "Ibarra", "Ecuador", -78.136422, 0.338419],
2611 + ["Km 192", "Km-192", "Ecuador", -79.391956, 0.184203],
2612 + ["Hacienda La Julia", "La Julia", "Ecuador", -79.552261, -1.704381],
2613 + ["Cotopaxi Intl", "Latacunga", "Ecuador", -78.615756, -0.906833],
2614 + ["Jose Maria Velasco Ibarra", "Macara", "Ecuador", -79.941022, -4.378231],
2615 + ["Coronel E Carvajal", "Macas", "Ecuador", -78.12075, -2.299167],
2616 + ["General Manuel Serrano", "Machala", "Ecuador", -79.961572, -3.268903],
2617 + ["Montalvo", "Montalvo", "Ecuador", -76.975742, -2.067014],
2618 + ["Eloy Alfaro Intl", "Manta", "Ecuador", -80.678808, -0.946078],
2619 + ["Maragrosa", "Maragrosa", "Ecuador", -79.803619, -2.851097],
2620 + ["Amable Calle Gutierrez", "Pasaje", "Ecuador", -79.769165, -3.319667],
2621 + ["Reales Tamarindos", "Portoviejo", "Ecuador", -80.472206, -1.041647],
2622 + ["Quevedo", "Quevedo", "Ecuador", -79.465114, -0.9894],
2623 + ["Mariscal Sucre Intl", "Quito", "Ecuador", -78.488214, -0.141144],
2624 + ["Chimborazo", "Riobamba", "Ecuador", -78.656142, -1.653433],
2625 + ["Coronel Artilleria Victor Larrea", "Santa Rosa", "Ecuador", -79.977817, -3.435161],
2626 + ["General Ulpiano Paez", "Salinas", "Ecuador", -80.988878, -2.204994],
2627 + ["Santo Domingo Los Colorados", "Santo Domingo", "Ecuador", -79.214447, -0.248222],
2628 + ["Taura", "Taura", "Ecuador", -79.680169, -2.261036],
2629 + ["Mayor Galo Torres", "Tena", "Ecuador", -77.819447, -0.986767],
2630 + ["Tarapoa", "Tarapoa", "Ecuador", -76.33775, -0.122956],
2631 + ["Teniente Coronel Luis A Mantilla", "Tulcan", "Ecuador", -77.708056, 0.809506],
2632 + ["Silverton", "Silverton", "United States", -107.662994, 37.812545],
2633 + ["Silvio Pettirossi Intl", "Asuncion", "Paraguay", -57.519133, -25.23985],
2634 + ["Juan De Ayolas", "Ayolas", "Paraguay", -56.853944, -27.37065],
2635 + ["Teniente Col Carmelo Peralta", "Conception", "Paraguay", -57.427122, -23.44175],
2636 + ["Itaipu", "Itaipu", "Paraguay", -54.619417, -25.407853],
2637 + ["Dr Luis Maria Argana Intl", "Mariscal Estigarribia", "Paraguay", -60.621694, -22.044986],
2638 + ["Carlos Miguel Gimenez", "Pilar", "Paraguay", -58.318036, -26.881467],
2639 + ["El Eden", "Armenia", "Colombia", -75.766447, 4.452775],
2640 + ["Tres De Mayo", "Puerto Asis", "Colombia", -76.500836, 0.505228],
2641 + ["Las Flores", "El Banco", "Colombia", -73.974931, 9.045542],
2642 + ["Palonegro", "Bucaramanga", "Colombia", -73.184778, 7.1265],
2643 + ["Eldorado Intl", "Bogota", "Colombia", -74.146947, 4.701594],
2644 + ["Ernesto Cortissoz", "Barranquilla", "Colombia", -74.780819, 10.889589],
2645 + ["Jose Celestino Mutis", "Bahia Solano", "Colombia", -77.394675, 6.202917],
2646 + ["Gerardo Tobar Lopez", "Buenaventura", "Colombia", -76.989767, 3.819628],
2647 + ["Camilo Daza", "Cucuta", "Colombia", -72.511547, 7.927567],
2648 + ["Rafael Nunez", "Cartagena", "Colombia", -75.512961, 10.442381],
2649 + ["Alfonso Bonilla Aragon Intl", "Cali", "Colombia", -76.381583, 3.543222],
2650 + ["La Florida", "Tumaco", "Colombia", -78.749228, 1.814417],
2651 + ["Las Brujas", "Corozal", "Colombia", -75.285594, 9.332742],
2652 + ["Yariguies", "Barrancabermeja", "Colombia", -73.8068, 7.024331],
2653 + ["Gustavo Artunduaga Paredes", "Florencia", "Colombia", -75.564372, 1.589189],
2654 + ["Santiago Vila", "Girardot", "Colombia", -74.796692, 4.276242],
2655 + ["McCarthy Airport", "McCarthy", "United States", -142.90307372, 61.4370608],
2656 + ["Juan Casiano", "Guapi", "Colombia", -77.8986, 2.570133],
2657 + ["Guaymaral", "Guaymaral", "Colombia", -74.064919, 4.812333],
2658 + ["Perales", "Ibague", "Colombia", -75.1333, 4.421608],
2659 + ["San Luis", "Ipiales", "Colombia", -77.671764, 0.861925],
2660 + ["Antonio Roldan Betancourt", "Carepa", "Colombia", -76.716428, 7.811956],
2661 + ["La Mina", "La Mina", "Colombia", -72.490139, 11.232528],
2662 + ["Alfredo Vasquez Cobo", "Leticia", "Colombia", -69.943163, -4.193549],
2663 + ["Olaya Herrera", "Medellin", "Colombia", -75.590519, 6.219958],
2664 + ["Baracoa", "Magangue", "Colombia", -74.846092, 9.284739],
2665 + ["Los Garzones", "Monteria", "Colombia", -75.825831, 8.823744],
2666 + ["Fabio Alberto Leon Bentley", "Mitu", "Colombia", -70.233878, 1.253664],
2667 + ["La Nubia", "Manizales", "Colombia", -75.464708, 5.029597],
2668 + ["Benito Salas", "Neiva", "Colombia", -75.294, 2.95015],
2669 + ["Aguas Claras", "Ocana", "Colombia", -73.358331, 8.315061],
2670 + ["Otu", "Otu", "Colombia", -74.715497, 7.010369],
2671 + ["Puerto Bolivar", "Puerto Bolivar", "Colombia", -71.984817, 12.221483],
2672 + ["Puerto Carreno", "Puerto Carreno", "Colombia", -67.493164, 6.184717],
2673 + ["Matecana", "Pereira", "Colombia", -75.739519, 4.812675],
2674 + ["Pitalito", "Pitalito", "Colombia", -76.085719, 1.857769],
2675 + ["Guillermo Leon Valencia", "Popayan", "Colombia", -76.609319, 2.4544],
2676 + ["Antonio Narino", "Pasto", "Colombia", -77.291478, 1.396247],
2677 + ["El Embrujo", "Providencia", "Colombia", -81.35833, 13.356944],
2678 + ["Mariquita", "Mariquita", "Colombia", -74.883647, 5.212556],
2679 + ["Jose Maria Cordova", "Rio Negro", "Colombia", -75.423119, 6.164536],
2680 + ["Almirante Padilla", "Rio Hacha", "Colombia", -72.925958, 11.526222],
2681 + ["Jorge E Gonzalez Torres", "San Jose Del Guaviare", "Colombia", -72.639358, 2.579694],
2682 + ["Simon Bolivar", "Santa Marta", "Colombia", -74.230647, 11.11965],
2683 + ["Gustavo Rojas Pinilla", "San Andres Island", "Colombia", -81.711192, 12.583594],
2684 + ["Eduardo Falla Solano", "San Vincente De Caguan", "Colombia", -74.76635, 2.152175],
2685 + ["Tame", "Tame", "Colombia", -71.760261, 6.451081],
2686 + ["Santiago Perez", "Arauca", "Colombia", -70.736925, 7.068881],
2687 + ["El Carano", "Quibdo", "Colombia", -76.641181, 5.690758],
2688 + ["Farfan", "Tulua", "Colombia", -76.235133, 4.088358],
2689 + ["Alfonso Lopez Pumarejo", "Valledupar", "Colombia", -73.249506, 10.435042],
2690 + ["Vanguardia", "Villavicencio", "Colombia", -73.613761, 4.167875],
2691 + ["Bermejo", "Bermejo", "Bolivia", -64.312881, -22.773336],
2692 + ["Jorge Wilsterman", "Cochabamba", "Bolivia", -66.177114, -17.421058],
2693 + ["Chimore", "Chapacura", "Bolivia", -65.141533, -16.990019],
2694 + ["Heroes Del Acre", "Cobija", "Bolivia", -68.782972, -11.040436],
2695 + ["El Alto Intl", "La Paz", "Bolivia", -68.192256, -16.513339],
2696 + ["Juan Mendoza", "Oruro", "Bolivia", -67.076236, -17.962589],
2697 + ["Capitan Nicolas Rojas", "Potosi", "Bolivia", -65.723706, -19.543069],
2698 + ["Tte De Av Salvador Ogaya G", "Puerto Suarez", "Bolivia", -57.820586, -18.975281],
2699 + ["Santa Ana Del Yacuma", "Santa Ana", "Bolivia", -65.435158, -13.762208],
2700 + ["Juana Azurduy De Padilla", "Sucre", "Bolivia", -65.288747, -19.007083],
2701 + ["Capitan Oriel Lea Plaza", "Tarija", "Bolivia", -64.701325, -21.555736],
2702 + ["Tte Av Jorge Henrich Arauz", "Trinidad", "Bolivia", -64.918019, -14.818739],
2703 + ["Tcnl Rafael Pabon", "Villa Montes", "Bolivia", -63.405611, -21.255231],
2704 + ["Viru Viru Intl", "Santa Cruz", "Bolivia", -63.135364, -17.644756],
2705 + ["Yacuiba", "Yacuiba", "Bolivia", -63.651669, -21.960925],
2706 + ["Johan A Pengel Intl", "Zandery", "Suriname", -55.187783, 5.452831],
2707 + ["Rochambeau", "Cayenne", "French Guiana", -52.360447, 4.819808],
2708 + ["St Georges De L Oyapock", "St.-georges Oyapock", "French Guiana", -51.804083, 3.8976],
2709 + ["Huancabamba", "Huancabamba", "Peru", -79.442856, -5.256767],
2710 + ["Alferez Vladimir Sara Bauer", "Andoas", "Peru", -76.466617, -2.796128],
2711 + ["Atalaya", "Atalaya", "Peru", -73.766503, -10.729117],
2712 + ["Seward Airport", "Seward", "United States", -149.4188122, 60.1269383],
2713 + ["Iberia", "Iberia", "Peru", -69.488711, -11.411578],
2714 + ["Cap Fap David Abenzur Rengifo Intl", "Pucallpa", "Peru", -74.574297, -8.377939],
2715 + ["Teniente Jaime A De Montreuil Morales", "Chimbote", "Peru", -78.52385, -9.149614],
2716 + ["Puerto Esperanza", "Puerto Esperanza", "Peru", -70.706456, -9.768131],
2717 + ["Cesar Torke Podesta", "Moquegua", "Peru", -70.930803, -17.178961],
2718 + ["Capt Jose A Quinones Gonzales Intl", "Chiclayo", "Peru", -79.828097, -6.787475],
2719 + ["Coronel Fap Alfredo Mendivil Duarte", "Ayacucho", "Peru", -74.204417, -13.154819],
2720 + ["Andahuaylas", "Andahuaylas", "Peru", -73.350378, -13.706408],
2721 + ["Comandante Fap German Arias Graziani", "Anta", "Peru", -77.598392, -9.347444],
2722 + ["Jorge Chavez Intl", "Lima", "Peru", -77.114319, -12.021889],
2723 + ["Juanjui", "Juanjui", "Peru", -76.728561, -7.1691],
2724 + ["Francisco Carle", "Jauja", "Peru", -75.473394, -11.783144],
2725 + ["Juliaca", "Juliaca", "Peru", -70.158169, -15.467103],
2726 + ["Michigan City Municipal Airport", "Michigan City", "United States", -86.8211, 41.7033],
2727 + ["Ilo", "Ilo", "Peru", -71.343964, -17.695036],
2728 + ["Las Palmas", "Las Palmas", "Peru", -76.998942, -12.160708],
2729 + ["Pedro Canga", "Tumbes", "Peru", -80.381356, -3.552528],
2730 + ["Moises Benzaquen Rengifo", "Yurimaguas", "Peru", -76.118211, -5.893772],
2731 + ["Collique", "Collique", "Peru", -77.061139, -11.9287],
2732 + ["Chachapoyas", "Chachapoyas", "Peru", -77.856064, -6.201806],
2733 + ["Coronel Francisco Secada Vignetta Intl", "Iquitos", "Peru", -73.308806, -3.784739],
2734 + ["Rodriguez Ballon", "Arequipa", "Peru", -71.583083, -16.341072],
2735 + ["San Ramon", "San Ramon", "Peru", -75.3505, -11.128639],
2736 + ["Capitan Carlos Martinez De Pinillos", "Trujillo", "Peru", -79.108761, -8.081411],
2737 + ["Pisco Intl", "Pisco", "Peru", -76.220284, -13.744864],
2738 + ["Cadete Guillermo Del Castillo Paredes", "Tarapoto", "Peru", -76.373247, -6.508742],
2739 + ["Coronel Carlos Ciriani Santa Rosa Intl", "Tacna", "Peru", -70.275833, -18.053333],
2740 + ["Padre Aldamiz", "Puerto Maldonado", "Peru", -69.228611, -12.613611],
2741 + ["Capitan Fap Guillermo Concha Iberico", "Piura", "Peru", -80.616444, -5.20575],
2742 + ["Capitan Montes", "Talara", "Peru", -81.254139, -4.576639],
2743 + ["Niijima Airport", "Niijima", "Japan", 139.268611, 34.366944],
2744 + ["Teniente Alejandro Velasco Astete Intl", "Cuzco", "Peru", -71.938781, -13.535722],
2745 + ["Angel S Adami", "Montevideo", "Uruguay", -56.264703, -34.789208],
2746 + ["Santa Bernardina Intl", "Durazno", "Uruguay", -56.499172, -33.358867],
2747 + ["East Glacier Park Amtrak Station", "East Glacier", "United States", -113.218556, 48.443965],
2748 + ["Carrasco Intl", "Montevideo", "Uruguay", -56.030806, -34.838417],
2749 + ["Nueva Hesperides Intl", "Salto", "Uruguay", -57.985294, -31.438481],
2750 + ["Oswaldo Guevara Mujica", "Acarigua", "Venezuela", -69.237536, 9.553422],
2751 + ["Anaco", "Anaco", "Venezuela", -64.470725, 9.430225],
2752 + ["San Fernando De Atabapo", "San Fernando Deatabapo", "Venezuela", -67.701072, 4.051819],
2753 + ["General Jose Antonio Anzoategui Intl", "Barcelona", "Venezuela", -64.689161, 10.107139],
2754 + ["Barinas", "Barinas", "Venezuela", -70.220825, 8.619575],
2755 + ["El Libertador Ab", "Maracaibo", "Venezuela", -67.557319, 10.183375],
2756 + ["Barquisimeto Intl", "Barquisimeto", "Venezuela", -69.358619, 10.042747],
2757 + ["Ciudad Bolivar", "Ciudad Bolivar", "Venezuela", -63.537353, 8.121898],
2758 + ["Caicara Del Orinoco", "Caicara De Orinoco", "Venezuela", -66.164917, 7.626078],
2759 + ["San Carlos", "San Carlos", "Venezuela", -68.574656, 9.647722],
2760 + ["Calabozo", "Calabozo", "Venezuela", -67.417094, 8.924656],
2761 + ["Canaima", "Canaima", "Venezuela", -62.854433, 6.231989],
2762 + ["Carora", "Carora", "Venezuela", -70.065214, 10.175603],
2763 + ["General Jose Francisco Bermudez", "Carupano", "Venezuela", -63.261681, 10.660014],
2764 + ["Jose Leonardo Chirinos", "Coro", "Venezuela", -69.681656, 11.414867],
2765 + ["Oscar Machado Zuloaga", "Caracas", "Venezuela", -66.816219, 10.286589],
2766 + ["Antonio Jose De Sucre", "Cumana", "Venezuela", -64.130472, 10.450333],
2767 + ["Capitan Manuel Rios Guarico Airbase", "Carrizal", "Venezuela", -66.922989, 9.372167],
2768 + ["El Dorado", "El Dorado", "Venezuela", -61.639219, 6.715438],
2769 + ["Elorza", "Elorza", "Venezuela", -69.496694, 7.059722],
2770 + ["Guasdualito", "Guasdualito", "Venezuela", -70.75645, 7.211081],
2771 + ["Guiria", "Guiria", "Venezuela", -62.312667, 10.574078],
2772 + ["Guanare", "Guanare", "Venezuela", -69.75515, 9.026944],
2773 + ["Higuerote", "Higuerote", "Venezuela", -66.092758, 10.462453],
2774 + ["Andres Miguel Salazar Marcano", "Isla De Coche", "Venezuela", -63.981589, 10.794406],
2775 + ["Josefa Camejo", "Paraguana", "Venezuela", -70.151497, 11.780775],
2776 + ["San Juan De Los Morros", "San Juan De Los Morros", "Venezuela", -67.379639, 9.906953],
2777 + ["La Fria", "La Fria", "Venezuela", -72.271028, 8.239167],
2778 + ["La Orchila", "La Orchila", "Venezuela", -66.179214, 11.808822],
2779 + ["La Chinita Intl", "Maracaibo", "Venezuela", -71.727856, 10.558208],
2780 + ["Alberto Carnevalli", "Merida", "Venezuela", -71.161186, 8.582294],
2781 + ["Del Caribe Intl Gen Santiago Marino", "Porlamar", "Venezuela", -63.967581, 10.912926],
2782 + ["Simon Bolivar Intl", "Caracas", "Venezuela", -66.990583, 10.603117],
2783 + ["Maturin", "Maturin", "Venezuela", -63.1534, 9.749067],
2784 + ["Casique Aramare", "Puerto Ayacucho", "Venezuela", -67.606103, 5.619992],
2785 + ["General Bartolome Salom Intl", "Puerto Cabello", "Venezuela", -68.073025, 10.4805],
2786 + ["Paramillo", "San Cristobal", "Venezuela", -72.202847, 7.801317],
2787 + ["General Manuel Carlos Piar", "Guayana", "Venezuela", -62.760361, 8.288528],
2788 + ["Palmarito", "Palmarito", "Venezuela", -70.174328, 7.575706],
2789 + ["San Antonio Del Tachira", "San Antonio", "Venezuela", -72.439742, 7.840831],
2790 + ["Santa Barbara De Barinas", "Santa Barbara", "Venezuela", -71.165717, 7.803514],
2791 + ["Santa Elena De Uairen", "Santa Ana De Uairen", "Venezuela", -61.144922, 4.554722],
2792 + ["Mayor Buenaventura Vivas", "Santo Domingo", "Venezuela", -72.035125, 7.565111],
2793 + ["Sub Teniente Nestor Arias", "San Felipe", "Venezuela", -68.755211, 10.278728],
2794 + ["San Fernando De Apure", "San Fernando De Apure", "Venezuela", -67.444025, 7.883317],
2795 + ["San Tome", "San Tome", "Venezuela", -64.151083, 8.945147],
2796 + ["Santa Barbara Del Zulia", "Santa Barbara", "Venezuela", -71.943014, 8.974425],
2797 + ["Tucupita", "Tucupita", "Venezuela", -62.094175, 9.088994],
2798 + ["Tumeremo", "Tumeremo", "Venezuela", -61.528933, 7.249381],
2799 + ["Arturo Michelena Intl", "Valencia", "Venezuela", -67.9284, 10.149733],
2800 + ["Flugplatz Hoexter Holzminden", "Hoexter Holzminden", "Germany", 9.2259, 51.4838],
2801 + ["Dr Antonio Nicolas Briceno", "Valera", "Venezuela", -70.584089, 9.340797],
2802 + ["Valle De La Pascua", "Valle De La Pascua", "Venezuela", -65.993583, 9.222028],
2803 + ["Linden", "Linden", "Guyana", -58.270336, 5.965922],
2804 + ["Lethem", "Lethem", "Guyana", -59.789439, 3.372761],
2805 + ["V C Bird Intl", "Antigua", "Antigua and Barbuda", -61.792667, 17.136749],
2806 + ["Grantley Adams Intl", "Bridgetown", "Barbados", -59.492456, 13.074603],
2807 + ["Canefield", "Canefield", "Dominica", -61.392211, 15.336719],
2808 + ["Melville Hall", "Dominica", "Dominica", -61.3, 15.547028],
2809 + ["Le Lamentin", "Fort-de-france", "Martinique", -61.003175, 14.591033],
2810 + ["Grand Case", "St. Martin", "Guadeloupe", -63.047197, 18.099914],
2811 + ["Le Raizet", "Pointe-a-pitre", "Guadeloupe", -61.531806, 16.265306],
2812 + ["Point Salines Intl", "Point Salines", "Grenada", -61.786192, 12.004247],
2813 + ["Cyril E King", "St. Thomas", "Virgin Islands", -64.973361, 18.337306],
2814 + ["Henry E Rohlsen", "St. Croix Island", "Virgin Islands", -64.798556, 17.701889],
2815 + ["Rafael Hernandez", "Aguadilla", "Puerto Rico", -67.129444, 18.494861],
2816 + ["Diego Jimenez Torres", "Fajardo", "Puerto Rico", -65.661861, 18.308889],
2817 + ["Fernando Luis Ribas Dominicci", "San Juan", "Puerto Rico", -66.098139, 18.456828],
2818 + ["Eugenio Maria De Hostos", "Mayaguez", "Puerto Rico", -67.148472, 18.255694],
2819 + ["Mercedita", "Ponce", "Puerto Rico", -66.563028, 18.008306],
2820 + ["Luis Munoz Marin Intl", "San Juan", "Puerto Rico", -66.001833, 18.439417],
2821 + ["Robert L Bradshaw", "Basse Terre", "Saint Kitts and Nevis", -62.718667, 17.311194],
2822 + ["Dinslaken Schwarze-Heide", "Dinslaken", "Germany", 6.5155, 51.3659],
2823 + ["George F L Charles", "Castries", "Saint Lucia", -60.992936, 14.020228],
2824 + ["Hewanorra Intl", "Hewandorra", "Saint Lucia", -60.952597, 13.733194],
2825 + ["Reina Beatrix Intl", "Oranjestad", "Aruba", -70.015221, 12.501389],
2826 + ["Flamingo", "Kralendijk", "Netherlands Antilles", -68.268511, 12.131044],
2827 + ["Hato", "Willemstad", "Netherlands Antilles", -68.959803, 12.188853],
2828 + ["F D Roosevelt", "Oranjestad", "Netherlands Antilles", -62.979439, 17.496492],
2829 + ["Princess Juliana Intl", "Philipsburg", "Netherlands Antilles", -63.1089, 18.040953],
2830 + ["Wallblake", "The Valley", "Anguilla", -63.055084, 18.204834],
2831 + ["Crown Point", "Scarborough", "Trinidad and Tobago", -60.832194, 11.149658],
2832 + ["Piarco", "Port-of-spain", "Trinidad and Tobago", -61.337242, 10.595369],
2833 + ["Terrance B Lettsome Intl", "Tortola", "British Virgin Islands", -64.542975, 18.444834],
2834 + ["Allakaket Airport", "Allakaket", "United States", -152.6222, 66.5519],
2835 + ["Canouan", "Canouan Island", "Saint Vincent and the Grenadines", -61.342431, 12.699042],
2836 + ["Mustique", "Mustique", "Saint Vincent and the Grenadines", -61.180161, 12.887947],
2837 + ["E T Joshua", "Kingstown", "Saint Vincent and the Grenadines", -61.210861, 13.144306],
2838 + ["Almaty", "Alma-ata", "Kazakhstan", 77.040508, 43.352072],
2839 + ["Balkhash", "Balkhash", "Kazakhstan", 75.005, 46.893333],
2840 + ["Astana Intl", "Tselinograd", "Kazakhstan", 71.466944, 51.022222],
2841 + ["Taraz", "Dzhambul", "Kazakhstan", 71.303611, 42.853611],
2842 + ["Manas", "Bishkek", "Kyrgyzstan", 74.477556, 43.061306],
2843 + ["Osh", "Osh", "Kyrgyzstan", 72.793269, 40.608989],
2844 + ["Shymkent", "Chimkent", "Kazakhstan", 69.478889, 42.364167],
2845 + ["Yakutat", "Yakutat", "United States", -139.3937, 59.3012],
2846 + ["Uralsk", "Uralsk", "Kazakhstan", 51.543056, 51.150833],
2847 + ["Pavlodar", "Pavlodar", "Kazakhstan", 77.073889, 52.195],
2848 + ["Semipalatinsk", "Semiplatinsk", "Kazakhstan", 80.2344, 50.3513],
2849 + ["Aktau", "Shevchenko", "Kazakhstan", 51.091978, 43.86005],
2850 + ["Aktyubinsk", "Aktyubinsk", "Kazakhstan", 57.206667, 50.245833],
2851 + ["Heydar Aliyev", "Baku", "Azerbaijan", 50.046667, 40.4675],
2852 + ["Yakutsk", "Yakutsk", "Russia", 129.770672, 62.09325],
2853 + ["Mirny", "Mirnyj", "Russia", 114.038928, 62.534689],
2854 + ["Ignatyevo", "Blagoveschensk", "Russia", 127.412478, 50.425394],
2855 + ["Novy", "Khabarovsk", "Russia", 135.188361, 48.528044],
2856 + ["Sawyer International Airport", "Marquette", "United States", -87.395278, 46.353611],
2857 + ["Provideniya Bay", "Provideniya Bay", "Russia", -173.243306, 64.378139],
2858 + ["Sokol", "Magadan", "Russia", 150.720439, 59.910989],
2859 + ["Pevek", "Pevek", "Russia", 170.597006, 69.783283],
2860 + ["Yelizovo", "Petropavlovsk", "Russia", 158.453669, 53.167889],
2861 + ["Khomutovo", "Yuzhno-sakhalinsk", "Russia", 142.717531, 46.888672],
2862 + ["Knevichi", "Vladivostok", "Russia", 132.148017, 43.398953],
2863 + ["Kadala", "Chita", "Russia", 113.305556, 52.026317],
2864 + ["Bratsk", "Bratsk", "Russia", 101.698331, 56.370556],
2865 + ["Irkutsk", "Irkutsk", "Russia", 104.388975, 52.268028],
2866 + ["Mukhino", "Ulan-ude", "Russia", 107.437644, 51.807764],
2867 + ["Boryspil Intl", "Kiev", "Ukraine", 30.894722, 50.345],
2868 + ["Donetsk Intl", "Donetsk", "Ukraine", 37.739722, 48.073611],
2869 + ["Dnipropetrovsk Intl", "Dnepropetrovsk", "Ukraine", 35.100556, 48.357222],
2870 + ["Simferopol Intl", "Simferopol", "Ukraine", 33.975139, 45.052222],
2871 + ["Zhuliany Intl", "Kiev", "Ukraine", 30.449697, 50.401694],
2872 + ["Lviv Intl", "Lvov", "Ukraine", 23.956111, 49.8125],
2873 + ["Ford Airport", "Iron Mountain", "United States", -88.1145556, 45.8183611],
2874 + ["Odesa Intl", "Odessa", "Ukraine", 30.676464, 46.426767],
2875 + ["Pulkovo", "St. Petersburg", "Russia", 30.262503, 59.800292],
2876 + ["Murmansk", "Murmansk", "Russia", 32.750822, 68.781672],
2877 + ["Gomel", "Gomel", "Belarus", 31.016692, 52.527022],
2878 + ["Vitebsk", "Vitebsk", "Belarus", 30.349639, 55.1265],
2879 + ["Khrabrovo", "Kaliningrad", "Russia", 20.592633, 54.89005],
2880 + ["Minsk 1", "Minsk", "Belarus", 27.539683, 53.864472],
2881 + ["Minsk 2", "Minsk 2", "Belarus", 28.030731, 53.882469],
2882 + ["Abakan", "Abakan", "Russia", 91.385, 53.74],
2883 + ["Barnaul", "Barnaul", "Russia", 83.538533, 53.363775],
2884 + ["Kemerovo", "Kemorovo", "Russia", 86.107208, 55.270094],
2885 + ["Omsk", "Omsk", "Russia", 73.310514, 54.967042],
2886 + ["Pashkovskiy", "Krasnodar", "Russia", 39.170539, 45.034689],
2887 + ["Uytash", "Makhachkala", "Russia", 47.652294, 42.816822],
2888 + ["Mineralnyye Vody", "Mineralnye Vody", "Russia", 43.081889, 44.225072],
2889 + ["Shpakovskoye", "Stavropol", "Russia", 42.112778, 45.109165],
2890 + ["Rostov Na Donu", "Rostov", "Russia", 39.818089, 47.258208],
2891 + ["Sochi", "Sochi", "Russia", 39.956589, 43.449928],
2892 + ["Astrakhan", "Astrakhan", "Russia", 48.006278, 46.283333],
2893 + ["Gumrak", "Volgograd", "Russia", 44.345544, 48.782528],
2894 + ["Balandino", "Chelyabinsk", "Russia", 61.503333, 55.305836],
2895 + ["Magnitogorsk", "Magnetiogorsk", "Russia", 58.755661, 53.393131],
2896 + ["Great Barrier Island", "Claris", "New Zealand", 175.2819, -36.1429],
2897 + ["Nizhnevartovsk", "Nizhnevartovsk", "Russia", 76.483617, 60.949272],
2898 + ["Bolshoye Savino", "Perm", "Russia", 56.021214, 57.914517],
2899 + ["Surgut", "Surgut", "Russia", 73.401842, 61.343694],
2900 + ["Koltsovo", "Yekaterinburg", "Russia", 60.802728, 56.743108],
2901 + ["Ashgabat", "Ashkhabad", "Turkmenistan", 58.360967, 37.986814],
2902 + ["Turkmenbashi", "Krasnovodsk", "Turkmenistan", 53.007222, 40.063333],
2903 + ["Turkmenabat", "Chardzhou", "Turkmenistan", 63.613333, 39.083333],
2904 + ["Dushanbe", "Dushanbe", "Tajikistan", 68.825, 38.543333],
2905 + ["Bukhara", "Bukhara", "Uzbekistan", 64.483333, 39.775],
2906 + ["Samarkand", "Samarkand", "Uzbekistan", 66.983829, 39.700547],
2907 + ["Al Udeid AB", "Doha", "Qatar", 51.3228, 25.1174],
2908 + ["Yuzhny", "Tashkent", "Uzbekistan", 69.281186, 41.257861],
2909 + ["Bryansk", "Bryansk", "Russia", 34.176447, 53.214194],
2910 + ["Sheremetyevo", "Moscow", "Russia", 37.414589, 55.972642],
2911 + ["Migalovo", "Tver", "Russia", 35.757678, 56.824736],
2912 + ["Chertovitskoye", "Voronezh", "Russia", 39.229589, 51.814211],
2913 + ["Vnukovo", "Moscow", "Russia", 37.261486, 55.591531],
2914 + ["Syktyvkar", "Syktyvkar", "Russia", 50.84505, 61.64705],
2915 + ["Kazan", "Kazan", "Russia", 49.278728, 55.606186],
2916 + ["Orenburg", "Orenburg", "Russia", 55.456744, 51.795786],
2917 + ["Ufa", "Ufa", "Russia", 55.874417, 54.557511],
2918 + ["Kurumoch", "Samara", "Russia", 50.164336, 53.504858],
2919 + ["Ahmedabad", "Ahmedabad", "India", 72.63465, 23.077242],
2920 + ["Akola", "Akola", "India", 77.058628, 20.699006],
2921 + ["Aurangabad", "Aurangabad", "India", 75.398114, 19.862728],
2922 + ["Chhatrapati Shivaji Intl", "Mumbai", "India", 72.867919, 19.088686],
2923 + ["Bilaspur", "Bilaspur", "India", 82.110983, 21.9884],
2924 + ["Bhuj", "Bhuj", "India", 69.670147, 23.287828],
2925 + ["Belgaum", "Belgaum", "India", 74.618292, 15.859286],
2926 + ["Vadodara", "Baroda", "India", 73.226289, 22.336164],
2927 + ["Bhopal", "Bhopal", "India", 77.337375, 23.287467],
2928 + ["Bhavnagar", "Bhaunagar", "India", 72.185181, 21.752206],
2929 + ["Daman", "Daman", "India", 72.843206, 20.434364],
2930 + ["Deesa", "Deesa", "India", 72.204433, 24.267936],
2931 + ["Guna", "Guna", "India", 77.347347, 24.654681],
2932 + ["Goa", "Goa", "India", 73.831422, 15.380833],
2933 + ["Devi Ahilyabai Holkar", "Indore", "India", 75.801086, 22.721786],
2934 + ["Jabalpur", "Jabalpur", "India", 80.052047, 23.177817],
2935 + ["Jamnagar", "Jamnagar", "India", 70.012556, 22.465522],
2936 + ["Kandla", "Kandla", "India", 70.100289, 23.112719],
2937 + ["Khajuraho", "Khajuraho", "India", 79.918597, 24.817197],
2938 + ["Kolhapur", "Kolhapur", "India", 74.289353, 16.664658],
2939 + ["Keshod", "Keshod", "India", 70.270403, 21.317069],
2940 + ["Dr Ambedkar Intl", "Nagpur", "India", 79.047183, 21.092192],
2941 + ["Nasik Road", "Nasik Road", "India", 73.807644, 19.963739],
2942 + ["Pune", "Pune", "India", 73.919697, 18.582111],
2943 + ["Porbandar", "Porbandar", "India", 69.657219, 21.648675],
2944 + ["Rajkot", "Rajkot", "India", 70.779525, 22.309183],
2945 + ["Raipur", "Raipur", "India", 81.738753, 21.180406],
2946 + ["Sholapur", "Sholapur", "India", 75.934842, 17.627958],
2947 + ["Surat", "Surat", "India", 72.741792, 21.114061],
2948 + ["Udaipur", "Udaipur", "India", 73.8961, 24.617697],
2949 + ["Bandaranaike Intl Colombo", "Colombo", "Sri Lanka", 79.884117, 7.180756],
2950 + ["Anuradhapura", "Anuradhapura", "Sri Lanka", 80.4279, 8.301486],
2951 + ["Batticaloa", "Batticaloa", "Sri Lanka", 81.678783, 7.705756],
2952 + ["Colombo Ratmalana", "Colombo", "Sri Lanka", 79.886208, 6.821994],
2953 + ["Amparai", "Galoya", "Sri Lanka", 81.625881, 7.337081],
2954 + ["Kankesanturai", "Jaffna", "Sri Lanka", 80.070089, 9.792331],
2955 + ["China Bay", "Trinciomalee", "Sri Lanka", 81.181853, 8.538514],
2956 + ["Kirkuk AB", "Kirkuk", "Iraq", 44.3483, 35.17],
2957 + ["Kampong Chhnang", "Kompong Chnang", "Cambodia", 104.563875, 12.255236],
2958 + ["Phnom Penh Intl", "Phnom-penh", "Cambodia", 104.844139, 11.546556],
2959 + ["Siem Reap", "Siem-reap", "Cambodia", 103.81284, 13.410666],
2960 + ["Stung Treng", "Stung Treng", "Cambodia", 106.014531, 13.531897],
2961 + ["Along", "Along", "India", 94.802036, 28.175317],
2962 + ["Agartala", "Agartala", "India", 91.24045, 23.886978],
2963 + ["Aizawl", "Aizwal", "India", 92.802767, 23.746603],
2964 + ["Bagdogra", "Baghdogra", "India", 88.328567, 26.681206],
2965 + ["Bokaro", "Bokaro", "India", 86.148886, 23.643489],
2966 + ["Bhubaneshwar", "Bhubaneswar", "India", 85.817781, 20.244364],
2967 + ["Netaji Subhash Chandra Bose Intl", "Kolkata", "India", 88.446722, 22.654739],
2968 + ["Cooch Behar", "Cooch-behar", "India", 89.467203, 26.330508],
2969 + ["Dhanbad", "Dhanbad", "India", 86.425261, 23.834044],
2970 + ["Delta County Airport", "Escanaba", "United States", -87.093611, 45.722778],
2971 + ["Lauf-Lillinghof", "Lillinghof", "Germany", 11.6539, 49.6543],
2972 + ["Gaya", "Gaya", "India", 84.951175, 24.744308],
2973 + ["Hirakud", "Hirakud", "India", 84.005728, 21.580231],
2974 + ["Imphal", "Imphal", "India", 93.896697, 24.75995],
2975 + ["Jharsuguda", "Jharsuguda", "India", 84.050383, 21.913536],
2976 + ["Jamshedpur", "Jamshedpur", "India", 86.168844, 22.813211],
2977 + ["Jorhat", "Jorhat", "India", 94.175536, 26.731528],
2978 + ["Kailashahar", "Kailashahar", "India", 92.007156, 24.308192],
2979 + ["Silchar", "Silchar", "India", 92.978742, 24.912928],
2980 + ["Lilabari", "Lilabari", "India", 94.09765, 27.295494],
2981 + ["Dibrugarh", "Mohanbari", "India", 95.016922, 27.483853],
2982 + ["Muzaffarpur", "Mazuffarpur", "India", 85.313664, 26.119089],
2983 + ["Nawapara", "Nawapara", "India", 82.519553, 20.870036],
2984 + ["Panagarh", "Panagarh", "India", 87.427508, 23.474336],
2985 + ["Patna", "Patina", "India", 85.087992, 25.591317],
2986 + ["Purnea", "Purnea", "India", 87.410011, 25.759594],
2987 + ["Birsa Munda", "Ranchi", "India", 85.321675, 23.31425],
2988 + ["Rourkela", "Rourkela", "India", 84.814567, 22.25665],
2989 + ["Utkela", "Utkela", "India", 83.183797, 20.097411],
2990 + ["Vishakhapatnam", "Vishakhapatnam", "India", 83.224483, 17.721167],
2991 + ["Zero", "Zero", "India", 93.828061, 27.588283],
2992 + ["Coxs Bazar", "Cox's Bazar", "Bangladesh", 91.963889, 21.452194],
2993 + ["Shah Amanat Intl", "Chittagong", "Bangladesh", 91.813286, 22.249611],
2994 + ["Ishurdi", "Ishurdi", "Bangladesh", 89.049446, 24.1525],
2995 + ["Jessore", "Jessore", "Bangladesh", 89.160833, 23.1838],
2996 + ["Shah Mokhdum", "Rajshahi", "Bangladesh", 88.616511, 24.437219],
2997 + ["Saidpur", "Saidpur", "Bangladesh", 88.908869, 25.759228],
2998 + ["Osmany Intl", "Sylhet Osmani", "Bangladesh", 91.866783, 24.963242],
2999 + ["Tejgaon", "Dhaka", "Bangladesh", 90.382689, 23.778783],
3000 + ["Zia Intl", "Dhaka", "Bangladesh", 90.397781, 23.843333],
3001 + ["Hong Kong Intl", "Hong Kong", "Hong Kong", 113.914603, 22.308919],
3002 + ["Sek Kong", "Sek Kong", "Hong Kong", 114.080397, 22.436592],
3003 + ["Agra", "Agra", "India", 77.960892, 27.155831],
3004 + ["Allahabad", "Allahabad", "India", 81.733872, 25.440064],
3005 + ["Amritsar", "Amritsar", "India", 74.797264, 31.709594],
3006 + ["Nal", "Bikaner", "India", 73.207161, 28.070606],
3007 + ["Bakshi Ka Talab", "Bakshi Ka Talab", "India", 80.893117, 26.988339],
3008 + ["Varanasi", "Varanasi", "India", 82.859342, 25.452358],
3009 + ["Kullu Manali", "Kulu", "India", 77.154367, 31.876706],
3010 + ["Bhatinda", "Bhatinda", "India", 74.755772, 30.270139],
3011 + ["Bhiwani", "Bhiwani", "India", 76.179094, 28.837039],
3012 + ["Bareilly", "Bareilly", "India", 79.450842, 28.422061],
3013 + ["Chandigarh", "Chandigarh", "India", 76.788542, 30.673469],
3014 + ["Kanpur Chakeri", "Kanpur", "India", 80.410119, 26.4043],
3015 + ["Safdarjung", "Delhi", "India", 77.205783, 28.584511],
3016 + ["Dehradun", "Dehra Dun", "India", 78.180256, 30.189689],
3017 + ["Indira Gandhi Intl", "Delhi", "India", 77.103088, 28.5665],
3018 + ["Gwalior", "Gwalior", "India", 78.227753, 26.293336],
3019 + ["Hissar", "Hissar", "India", 75.755336, 29.179444],
3020 + ["Jhansi", "Jhansi", "India", 78.558422, 25.491172],
3021 + ["Jodhpur", "Jodhpur", "India", 73.048869, 26.251092],
3022 + ["Jaipur", "Jaipur", "India", 75.812161, 26.824192],
3023 + ["Jaisalmer", "Jaisalmer", "India", 70.864967, 26.888653],
3024 + ["Jammu", "Jammu", "India", 74.837389, 32.689142],
3025 + ["Kanpur", "Kanpur", "India", 80.364864, 26.441444],
3026 + ["Kota", "Kota", "India", 75.845631, 25.160219],
3027 + ["Ludhiana", "Ludhiaha", "India", 75.952592, 30.854681],
3028 + ["Leh", "Leh", "India", 77.546514, 34.135872],
3029 + ["Lucknow", "Lucknow", "India", 80.889339, 26.760594],
3030 + ["Pathankot", "Pathankot", "India", 75.634628, 32.233778],
3031 + ["Patiala", "Patiala", "India", 76.364469, 30.314847],
3032 + ["Pantnagar", "Nainital", "India", 79.473744, 29.033408],
3033 + ["Fursatganj", "Raibarelli", "India", 81.380506, 26.248489],
3034 + ["Sarsawa", "Saharanpur", "India", 77.425311, 29.993919],
3035 + ["Srinagar", "Srinagar", "India", 74.77425, 33.987139],
3036 + ["Satna", "Satna", "India", 80.854933, 24.562319],
3037 + ["Balkhash Airport", "Balkhash", "Kazakhstan", 75.005, 46.8933],
3038 + ["Luang Phabang Intl", "Luang Prabang", "Laos", 102.160764, 19.897914],
3039 + ["Pakse", "Pakse", "Laos", 105.781417, 15.132053],
3040 + ["Phonesavanh", "Phong Savanh", "Laos", 103.218208, 19.454864],
3041 + ["Savannakhet", "Savannakhet", "Laos", 104.759531, 16.556594],
3042 + ["Sam Neua", "Sam Neua", "Laos", 104.066583, 20.418358],
3043 + ["Wattay Intl", "Vientiane", "Laos", 102.563256, 17.988322],
3044 + ["Macau Intl", "Macau", "Macau", 113.591558, 22.149556],
3045 + ["Bhairahawa", "Bhairawa", "Nepal", 83.41625, 27.505703],
3046 + ["Nastaetten", "Nastaetten", "Germany", 7.8916, 50.1972],
3047 + ["Janakpur", "Janakpur", "Nepal", 85.922394, 26.708806],
3048 + ["Tribhuvan Intl", "Kathmandu", "Nepal", 85.3591, 27.696583],
3049 + ["Pokhara", "Pokhara", "Nepal", 83.982056, 28.200881],
3050 + ["Simara", "Simara", "Nepal", 84.980122, 27.159456],
3051 + ["Biratnagar", "Biratnagar", "Nepal", 87.264036, 26.481453],
3052 + ["Agatti", "Agatti Island", "India", 72.176042, 10.823656],
3053 + ["Bangalore", "Bangalore", "India", 77.668206, 12.949986],
3054 + ["Bellary", "Bellary", "India", 76.882775, 15.162783],
3055 + ["Bidar", "Bidar", "India", 77.487142, 17.908081],
3056 + ["Vijayawada", "Vijayawada", "India", 80.796847, 16.530433],
3057 + ["Coimbatore", "Coimbatore", "India", 77.043383, 11.030031],
3058 + ["Cochin", "Kochi", "India", 76.391389, 10.155556],
3059 + ["Calicut", "Calicut", "India", 75.9553, 11.136839],
3060 + ["Cuddapah", "Cuddapah", "India", 78.772833, 14.509961],
3061 + ["Carnicobar", "Carnicobar", "India", 92.819628, 9.152508],
3062 + ["Dundigul", "Dundigul", "India", 78.403361, 17.627178],
3063 + ["Hyderabad", "Hyderabad", "India", 78.467586, 17.453117],
3064 + ["Madurai", "Madurai", "India", 78.093378, 9.834508],
3065 + ["Mangalore", "Mangalore", "India", 74.890069, 12.961267],
3066 + ["Chennai Intl", "Madras", "India", 80.180517, 12.994414],
3067 + ["Nagarjuna Sagar", "Nagarjunsagar", "India", 79.318714, 16.542653],
3068 + ["Port Blair", "Port Blair", "India", 92.729744, 11.641161],
3069 + ["Pondicherry", "Pendicherry", "India", 79.810058, 11.968722],
3070 + ["Rajahmundry", "Rajahmundry", "India", 81.818208, 17.110361],
3071 + ["Salem", "Salem", "India", 78.065606, 11.783314],
3072 + ["Tanjore", "Tanjore", "India", 79.101567, 10.722428],
3073 + ["Tirupati", "Tirupeti", "India", 79.543256, 13.632492],
3074 + ["Trichy", "Tiruchirappalli", "India", 78.709722, 10.765364],
3075 + ["Thiruvananthapuram Intl", "Trivandrum", "India", 76.920114, 8.482122],
3076 + ["Tambaram", "Tambaram", "India", 80.121861, 12.907214],
3077 + ["Paro", "Thimphu", "Bhutan", 89.424606, 27.403192],
3078 + ["Male Intl", "Male", "Maldives", 73.529128, 4.191833],
3079 + ["Don Muang Intl", "Bangkok", "Thailand", 100.60675, 13.912583],
3080 + ["Kamphaeng Saen", "Nakhon Pathom", "Thailand", 99.917219, 14.101975],
3081 + ["Khok Kathiam", "Lop Buri", "Thailand", 100.663367, 14.874561],
3082 + ["Naha", "Naha", "Indonesia", 125.528019, 3.683214],
3083 + ["U Taphao Intl", "Pattaya", "Thailand", 101.005028, 12.679944],
3084 + ["Watthana Nakhon", "Prachin Buri", "Thailand", 102.315492, 13.7688],
3085 + ["Lampang", "Lampang", "Thailand", 99.504167, 18.270933],
3086 + ["Phrae", "Phrae", "Thailand", 100.164664, 18.132169],
3087 + ["Hua Hin", "Prachuap Khiri Khan", "Thailand", 99.951533, 12.636225],
3088 + ["Takhli", "Nakhon Sawan", "Thailand", 100.295861, 15.277306],
3089 + ["Sak Long", "Phetchabun", "Thailand", 101.251389, 16.824322],
3090 + ["Nakhon Sawan", "Nakhon Sawan", "Thailand", 100.136794, 15.672997],
3091 + ["Phitsanulok", "Phitsanulok", "Thailand", 100.279122, 16.782939],
3092 + ["Khunan Phumipol", "Tak", "Thailand", 99.057911, 17.234211],
3093 + ["Khoun Khan", "Satun", "Thailand", 100.080317, 6.661403],
3094 + ["Narathiwat", "Narathiwat", "Thailand", 101.7434, 6.519922],
3095 + ["Krabi", "Krabi", "Thailand", 98.988764, 8.095969],
3096 + ["Songkhla", "Songkhla", "Thailand", 100.608031, 7.186564],
3097 + ["Pattani", "Pattani", "Thailand", 101.153569, 6.785458],
3098 + ["Samui", "Ko Samui", "Thailand", 100.062272, 9.547794],
3099 + ["Cha Ian", "Nakhon Si Thammarat", "Thailand", 99.955625, 8.471147],
3100 + ["Phuket Intl", "Phuket", "Thailand", 98.316872, 8.1132],
3101 + ["Ranong", "Ranong", "Thailand", 98.585483, 9.777622],
3102 + ["Hat Yai Intl", "Hat Yai", "Thailand", 100.392975, 6.933206],
3103 + ["Trang", "Trang", "Thailand", 99.616578, 7.508744],
3104 + ["Udon Thani", "Udon Thani", "Thailand", 102.788247, 17.386436],
3105 + ["Sakon Nakhon", "Sakon Nakhon", "Thailand", 104.118625, 17.195142],
3106 + ["Surin", "Surin", "Thailand", 103.498256, 14.868264],
3107 + ["Loei", "Loei", "Thailand", 101.722064, 17.439133],
3108 + ["Khorat", "Nakhon Ratchasima", "Thailand", 102.078639, 14.934514],
3109 + ["Rob Muang", "Roi Et", "Thailand", 103.6459, 16.07035],
3110 + ["Finsterwalde-Heinrichsruh", "Finsterwalde", "Germany", 13.2419, 51.6377],
3111 + ["Orchid Beach", "Fraser Island", "Australia", 153.3145, -24.95841],
3112 + ["Mara Lodges", "Mara Lodges", "Kenya", 35.099931, -1.183581],
3113 + ["Danang Intl", "Danang", "Vietnam", 108.19937, 16.043917],
3114 + ["Hanoi Gia Lam", "Hanoi", "Vietnam", 105.886011, 21.040975],
3115 + ["Kep", "Kep", "Vietnam", 106.261083, 21.394639],
3116 + ["Noibai Intl", "Hanoi", "Vietnam", 105.807178, 21.221192],
3117 + ["Nhatrang", "Nhatrang", "Vietnam", 109.192322, 12.227467],
3118 + ["Phubai", "Hue", "Vietnam", 107.702614, 16.4015],
3119 + ["Namanga", "Namanga", "Kenya", 36.7833333, -2.55],
3120 + ["Phu Quoc", "Phuquoc", "Vietnam", 103.967169, 10.227025],
3121 + ["Tansonnhat Intl", "Ho Chi Minh City", "Vietnam", 106.651856, 10.818797],
3122 + ["Ann", "Ann", "Burma", 94.026133, 19.769156],
3123 + ["Anisakan", "Anisakan", "Burma", 96.40605, 21.955433],
3124 + ["Bagan", "Bagan", "Burma", 94.930169, 21.178756],
3125 + ["Bamburi", "Bamburi", "Kenya", 39.7308972222222, -3.98268888888889],
3126 + ["Coco Island", "Coco Island", "Burma", 93.368531, 14.141517],
3127 + ["Heho", "Heho", "Burma", 96.792044, 20.747036],
3128 + ["Hommalinn", "Hommalin", "Burma", 94.914033, 24.899597],
3129 + ["Kengtung", "Kengtung", "Burma", 99.635997, 21.301611],
3130 + ["Williamson Country Regional Airport", "Marion", "United States", -89.0110936, 37.7549569],
3131 + ["Kyaukpyu", "Kyaukpyu", "Burma", 93.534836, 19.426447],
3132 + ["Lommis Airport", "Lommis", "Switzerland", 9.00306, 47.5244],
3133 + ["Lashio", "Lashio", "Burma", 97.752183, 22.977881],
3134 + ["Lanywa", "Lanywa", "Burma", 94.822617, 20.940361],
3135 + ["Mandalay Intl", "Mandalay", "Burma", 95.977928, 21.702156],
3136 + ["Myeik", "Myeik", "Burma", 98.621478, 12.439797],
3137 + ["Myitkyina", "Myitkyina", "Burma", 97.351919, 25.383636],
3138 + ["Momeik", "Momeik", "Burma", 96.645272, 23.092525],
3139 + ["Mong Hsat", "Mong Hsat", "Burma", 99.256825, 20.516758],
3140 + ["Nampong", "Nampong", "Burma", 97.29515, 25.354375],
3141 + ["Namsang", "Namsang", "Burma", 97.735922, 20.890492],
3142 + ["Hpa An", "Hpa-an", "Burma", 97.674581, 16.893714],
3143 + ["Amlikon Glider Airport", "Amlikon", "Switzerland", 9.0475, 47.5742],
3144 + ["Putao", "Putao", "Burma", 97.426269, 27.329922],
3145 + ["Pyay", "Pyay", "Burma", 95.266003, 18.824478],
3146 + ["Shante", "Shante", "Burma", 95.914497, 20.941668],
3147 + ["Sittwe", "Sittwe", "Burma", 92.872628, 20.132708],
3148 + ["Thandwe", "Thandwe", "Burma", 94.300119, 18.460731],
3149 + ["Tachileik", "Tachilek", "Burma", 99.935353, 20.483831],
3150 + ["Taungoo", "Taungoo", "Burma", 96.401239, 19.031275],
3151 + ["Yangon Intl", "Yangon", "Burma", 96.133222, 16.907305],
3152 + ["Hasanuddin", "Ujung Pandang", "Indonesia", 119.554042, -5.061631],
3153 + ["Frans Kaisiepo", "Biak", "Indonesia", 136.107997, -1.190017],
3154 + ["Nabire", "Nabire", "Indonesia", 135.496406, -3.368183],
3155 + ["Moses Kilangin", "Timika", "Indonesia", 136.887375, -4.528275],
3156 + ["Sentani", "Jayapura", "Indonesia", 140.516372, -2.576953],
3157 + ["Wamena", "Wamena", "Indonesia", 138.957372, -4.102511],
3158 + ["Mopah", "Merauke", "Indonesia", 140.418453, -8.520294],
3159 + ["Jalaluddin", "Gorontalo", "Indonesia", 122.849858, 0.637119],
3160 + ["Incheon Intl", "Seoul", "South Korea", 126.450517, 37.469075],
3161 + ["Mutiara", "Palu", "Indonesia", 119.909642, -0.918542],
3162 + ["Sam Ratulangi", "Manado", "Indonesia", 124.925878, 1.549447],
3163 + ["Kasiguncu", "Poso", "Indonesia", 120.657669, -1.416753],
3164 + ["Pitu", "Morotai Island", "Indonesia", 128.324708, 2.045992],
3165 + ["Sultan Babullah", "Ternate", "Indonesia", 127.381486, 0.831414],
3166 + ["Bubung", "Luwuk", "Indonesia", 122.771906, -1.038919],
3167 + ["Mukachevo Air Base", "Mukacheve", "Ukraine", 22.6833, 48.4],
3168 + ["Pattimura", "Ambon", "Indonesia", 128.089136, -3.710264],
3169 + ["Fak Fak", "Fak Fak", "Indonesia", 132.267031, -2.920192],
3170 + ["Kaimana", "Kaimana", "Indonesia", 133.695553, -3.644517],
3171 + ["Babo", "Babo", "Indonesia", 133.438894, -2.532242],
3172 + ["Rendani", "Manokwari", "Indonesia", 134.049183, -0.891833],
3173 + ["Jefman", "Sorong", "Indonesia", 131.121194, -0.926358],
3174 + ["Bintulu", "Bintulu", "Malaysia", 113.020472, 3.12385],
3175 + ["Kuching Intl", "Kuching", "Malaysia", 110.346933, 1.484697],
3176 + ["Limbang", "Limbang", "Malaysia", 115.010439, 4.808303],
3177 + ["Marudi", "Marudi", "Malaysia", 114.321944, 4.1775],
3178 + ["Miri", "Miri", "Malaysia", 113.986806, 4.322014],
3179 + ["Sibu", "Sibu", "Malaysia", 111.985322, 2.261603],
3180 + ["Lahad Datu", "Lahad Datu", "Malaysia", 118.324036, 5.032247],
3181 + ["Kota Kinabalu Intl", "Kota Kinabalu", "Malaysia", 116.051181, 5.937208],
3182 + ["Labuan", "Labuan", "Malaysia", 115.250181, 5.300683],
3183 + ["Tawau", "Tawau", "Malaysia", 118.121953, 4.313369],
3184 + ["Brunei Intl", "Bandar Seri Begawan", "Brunei", 114.928353, 4.9442],
3185 + ["Sultan Syarif Kasim Ii", "Pekanbaru", "Indonesia", 101.444539, 0.460786],
3186 + ["Pinang Kampai", "Dumai", "Indonesia", 101.433558, 1.609194],
3187 + ["Soekarno Hatta Intl", "Jakarta", "Indonesia", 106.655897, -6.125567],
3188 + ["Binaka", "Gunung Sitoli", "Indonesia", 97.704681, 1.166381],
3189 + ["Aek Godang", "Padang Sidempuan", "Indonesia", 99.430453, 1.400103],
3190 + ["Minangkabau", "Padang", "Indonesia", 100.351881, -0.874989],
3191 + ["Polonia", "Medan", "Indonesia", 98.671722, 3.558056],
3192 + ["Dr Ferdinand Lumban Tobing", "Sibolga", "Indonesia", 98.888908, 1.555944],
3193 + ["Nanga Pinoh I", "Nangapinoh", "Indonesia", 111.747606, -0.348869],
3194 + ["Rahadi Usman", "Ketapang", "Indonesia", 109.963483, -1.816639],
3195 + ["Mukachevo", "Mukacheve", "Ukraine", 22.683, 48.4],
3196 + ["Supadio", "Pontianak", "Indonesia", 109.403892, -0.150711],
3197 + ["Borovaya Airfield", "Minsk", "Belarus", 27.39, 53.57],
3198 + ["Weser-Wuemme", "Hellwege", "Germany", 9.208667, 53.054],
3199 + ["Sultan Thaha", "Jambi", "Indonesia", 103.644378, -1.638017],
3200 + ["Fatmawati Soekarno", "Bengkulu", "Indonesia", 102.339036, -3.8637],
3201 + ["Sultan Mahmud Badaruddin Ii", "Palembang", "Indonesia", 104.699903, -2.89825],
3202 + ["Japura", "Rengat", "Indonesia", 102.334917, -0.352808],
3203 + ["Lhok Sukon", "Lhok Sukon", "Indonesia", 97.259192, 5.069506],
3204 + ["Balti International Airport", "Strymba", "Moldova", 27.7815, 47.8381],
3205 + ["Sultan Iskandarmuda", "Banda Aceh", "Indonesia", 95.420372, 5.523522],
3206 + ["Kluang", "Kluang", "Malaysia", 103.307394, 2.041394],
3207 + ["Sultan Abdul Halim", "Alor Setar", "Malaysia", 100.398183, 6.189667],
3208 + ["Butterworth", "Butterworth", "Malaysia", 100.391167, 5.465917],
3209 + ["Sultan Ismail Petra", "Kota Bahru", "Malaysia", 102.293014, 6.16685],
3210 + ["Kuantan", "Kuantan", "Malaysia", 103.209056, 3.775389],
3211 + ["Kerteh", "Kerteh", "Malaysia", 103.426756, 4.537222],
3212 + ["Simpang", "Simpang", "Malaysia", 101.70275, 3.11225],
3213 + ["Sultan Azlan Shah", "Ipoh", "Malaysia", 101.092194, 4.567972],
3214 + ["Sultan Ismail", "Johor Bahru", "Malaysia", 103.669619, 1.641308],
3215 + ["Kuala Lumpur Intl", "Kuala Lumpur", "Malaysia", 101.709917, 2.745578],
3216 + ["Langkawi Intl", "Pulau", "Malaysia", 99.728667, 6.329728],
3217 + ["Malacca", "Malacca", "Malaysia", 102.251553, 2.263361],
3218 + ["Sultan Mahmud", "Kuala Terengganu", "Malaysia", 103.10336, 5.382639],
3219 + ["Penang Intl", "Penang", "Malaysia", 100.276864, 5.297139],
3220 + ["Suai", "Suai", "East Timor", 125.286753, -9.303306],
3221 + ["Presidente Nicolau Lobato Intl", "Dili", "East Timor", 125.524719, -8.546553],
3222 + ["Cakung", "Baucau", "East Timor", 126.399389, -8.485547],
3223 + ["Sembawang", "Sembawang", "Singapore", 103.812806, 1.425264],
3224 + ["Paya Lebar", "Paya Lebar", "Singapore", 103.90953, 1.360417],
3225 + ["Tengah", "Tengah", "Singapore", 103.708719, 1.387258],
3226 + ["Seletar", "Singapore", "Singapore", 103.867653, 1.41695],
3227 + ["Changi Intl", "Singapore", "Singapore", 103.994433, 1.350189],
3228 + ["Brisbane Archerfield", "Brisbane", "Australia", 153.008056, -27.570278],
3229 + ["Bamaga Injinoo", "Amberley", "Australia", 142.459444, -10.950833],
3230 + ["Alice Springs", "Alice Springs", "Australia", 133.902222, -23.806667],
3231 + ["Brisbane Intl", "Brisbane", "Australia", 153.1175, -27.384167],
3232 + ["Gold Coast", "Coolangatta", "Australia", 153.504722, -28.164444],
3233 + ["Cairns Intl", "Cairns", "Australia", 145.755278, -16.885833],
3234 + ["Charleville", "Charlieville", "Australia", 146.2625, -26.413334],
3235 + ["Mount Isa", "Mount Isa", "Australia", 139.488611, -20.663889],
3236 + ["Sunshine Coast", "Maroochydore", "Australia", 153.091111, -26.603333],
3237 + ["Mackay", "Mackay", "Australia", 149.179722, -21.171667],
3238 + ["Proserpine Whitsunday Coast", "Prosserpine", "Australia", 148.552222, -20.495],
3239 + ["Rockhampton", "Rockhampton", "Australia", 150.475278, -23.381944],
3240 + ["Townsville", "Townsville", "Australia", 146.765278, -19.2525],
3241 + ["Weipa", "Weipa", "Australia", 141.925278, -12.678611],
3242 + ["Avalon", "Avalon", "Australia", 144.469444, -38.039444],
3243 + ["Albury", "Albury", "Australia", 146.958056, -36.067778],
3244 + ["Melbourne Essendon", "Melbourne", "Australia", 144.901944, -37.728056],
3245 + ["East Sale", "East Sale", "Australia", 147.149444, -38.098889],
3246 + ["Hobart", "Hobart", "Australia", 147.510278, -42.836111],
3247 + ["Launceston", "Launceston", "Australia", 147.214167, -41.545278],
3248 + ["Melbourne Moorabbin", "Melbourne", "Australia", 145.102222, -37.975833],
3249 + ["Melbourne Intl", "Melbourne", "Australia", 144.843333, -37.673333],
3250 + ["Point Cook", "Point Cook", "Australia", 144.753333, -37.932222],
3251 + ["Adelaide Intl", "Adelaide", "Australia", 138.530556, -34.945],
3252 + ["Edinburgh", "Edinburgh", "Australia", 138.620833, -34.7025],
3253 + ["Perth Jandakot", "Perth", "Australia", 115.881111, -32.0975],
3254 + ["Karratha", "Karratha", "Australia", 116.773333, -20.712222],
3255 + ["Kalgoorlie Boulder", "Kalgoorlie", "Australia", 121.461667, -30.789444],
3256 + ["Kununurra", "Kununurra", "Australia", 128.7075, -15.778056],
3257 + ["Learmonth", "Learmonth", "Australia", 114.088611, -22.235556],
3258 + ["Port Hedland Intl", "Port Hedland", "Australia", 118.626389, -20.377778],
3259 + ["Adelaide Parafield", "Adelaide", "Australia", 138.633056, -34.793333],
3260 + ["Perth Intl", "Perth", "Australia", 115.966944, -31.940278],
3261 + ["Woomera", "Woomera", "Australia", 136.816944, -31.144167],
3262 + ["Christmas Island", "Christmas Island", "Christmas Island", 105.690278, -10.450556],
3263 + ["Sydney Bankstown", "Sydney", "Australia", 150.988333, -33.924444],
3264 + ["Canberra", "Canberra", "Australia", 149.195, -35.306944],
3265 + ["Coffs Harbour", "Coff's Harbour", "Australia", 153.116389, -30.320556],
3266 + ["Camden", "Camden", "Australia", 150.687222, -34.040278],
3267 + ["Dubbo", "Dubbo", "Australia", 148.574722, -32.216667],
3268 + ["Norfolk Island Intl", "Norfolk Island", "Norfolk Island", 167.938742, -29.041625],
3269 + ["Richmond", "Richmond", "Australia", 150.780833, -33.600556],
3270 + ["Sydney Intl", "Sydney", "Australia", 151.177222, -33.946111],
3271 + ["Tamworth", "Tamworth", "Australia", 150.846667, -31.083889],
3272 + ["Wagga Wagga", "Wagga Wagga", "Australia", 147.466389, -35.165278],
3273 + ["Capital Intl", "Beijing", "China", 116.584556, 40.080111],
3274 + ["Hongyuan Airfield", "Hongyuan", "China", 102.534785, 32.800428],
3275 + ["Dongshan", "Hailar", "China", 119.825, 49.204997],
3276 + ["Binhai", "Tianjin", "China", 117.346183, 39.124353],
3277 + ["Wusu", "Taiyuan", "China", 112.628428, 37.746897],
3278 + ["Baiyun Intl", "Guangzhou", "China", 113.298786, 23.392436],
3279 + ["Huanghua", "Changcha", "China", 113.219633, 28.189158],
3280 + ["Liangjiang", "Guilin", "China", 110.039197, 25.218106],
3281 + ["Wuxu", "Nanning", "China", 108.172442, 22.608267],
3282 + ["Baoan Intl", "Shenzhen", "China", 113.810664, 22.639258],
3283 + ["Xinzheng", "Zhengzhou", "China", 113.840889, 34.519672],
3284 + ["Tianhe", "Wuhan", "China", 114.2081, 30.783758],
3285 + ["Pyongyang Intl", "Pyongyang", "Korea", 125.67015, 39.224061],
3286 + ["Zhongchuan", "Lanzhou", "China", 103.620775, 36.515242],
3287 + ["Xianyang", "Xi'an", "China", 108.751592, 34.447119],
3288 + ["Chinggis Khaan Intl", "Ulan Bator", "Mongolia", 106.766639, 47.843056],
3289 + ["Gasa", "Jinghonggasa", "China", 100.759611, 21.973914],
3290 + ["Wujiaba", "Kunming", "China", 102.743536, 24.992364],
3291 + ["Gaoqi", "Xiamen", "China", 118.127739, 24.544036],
3292 + ["Changbei Intl", "Nanchang", "China", 115.9, 28.865],
3293 + ["Changle", "Fuzhou", "China", 119.663272, 25.935064],
3294 + ["Xiaoshan", "Hangzhou", "China", 120.434453, 30.229503],
3295 + ["Lishe", "Ninbo", "China", 121.461906, 29.826683],
3296 + ["Lukou", "Nanjing", "China", 118.862025, 31.742042],
3297 + ["Luogang", "Hefei", "China", 117.298436, 31.780019],
3298 + ["Liuting", "Qingdao", "China", 120.374436, 36.266108],
3299 + ["Hongqiao Intl", "Shanghai", "China", 121.336319, 31.197875],
3300 + ["Laishan", "Yantai", "China", 121.371667, 37.401667],
3301 + ["Jiangbei", "Chongqing", "China", 106.641678, 29.719217],
3302 + ["Longdongbao", "Guiyang", "China", 106.800703, 26.538522],
3303 + ["Shuangliu", "Chengdu", "China", 103.947086, 30.578528],
3304 + ["Qingshan", "Xichang", "China", 102.184361, 27.989083],
3305 + ["Kashi", "Kashi", "China", 76.019956, 39.542922],
3306 + ["Hotan", "Hotan", "China", 79.864933, 37.038522],
3307 + ["Diwopu", "Urumqi", "China", 87.474244, 43.907106],
3308 + ["Taiping", "Harbin", "China", 126.250328, 45.623403],
3309 + ["Hohenems", "Hohenems", "Austria", 9.7, 47.385],
3310 + ["Hailang", "Mudanjiang", "China", 129.568972, 44.524072],
3311 + ["Zhoushuizi", "Dalian", "China", 121.5386, 38.965667],
3312 + ["Pudong", "Shanghai", "China", 121.805214, 31.143378],
3313 + ["Pulau Tioman", "Tioman", "Malaysia", 104.160019, 2.818183],
3314 + ["Subang-Sultan Abdul Aziz Shah Intl", "Kuala Lumpur", "Malaysia", 101.549333, 3.130583],
3315 + ["Noto", "Wajima", "Japan", 136.961853, 37.293097],
3316 + ["Borg El Arab Intl", "Alexandria", "Egypt", 29.696408, 30.917669],
3317 + ["Barter Island Lrrs", "Barter Island", "United States", -143.581867, 70.133989],
3318 + ["Wainwright As", "Fort Wainwright", "United States", -159.86035, 70.613378],
3319 + ["Cape Lisburne Lrrs", "Cape Lisburne", "United States", -166.110022, 68.875133],
3320 + ["Point Lay Lrrs", "Point Lay", "United States", -163.005342, 69.732875],
3321 + ["Hilo Intl", "Hilo", "United States", -155.048469, 19.721375],
3322 + ["Executive", "Orlando", "United States", -81.332936, 28.545464],
3323 + ["Bettles", "Bettles", "United States", -151.529056, 66.913944],
3324 + ["Clear", "Clear Mews", "United States", -149.120144, 64.301203],
3325 + ["Indian Mountain Lrrs", "Indian Mountains", "United States", -153.704289, 65.992794],
3326 + ["Fort Yukon", "Fort Yukon", "United States", -145.250417, 66.571492],
3327 + ["Sparrevohn Lrrs", "Sparrevohn", "United States", -155.574228, 61.097369],
3328 + ["Bryant Ahp", "Fort Richardson", "United States", -149.653119, 61.266381],
3329 + ["Tatalina Lrrs", "Tatalina", "United States", -155.976525, 62.894369],
3330 + ["Cape Romanzof Lrrs", "Cape Romanzof", "United States", -166.038747, 61.780297],
3331 + ["Laurence G Hanscom Fld", "Bedford", "United States", -71.289031, 42.469953],
3332 + ["St Paul Island", "St. Paul Island", "United States", -170.220444, 57.167333],
3333 + ["Cape Newenham Lrrs", "Cape Newenham", "United States", -162.062778, 58.646428],
3334 + ["St George", "Point Barrow", "United States", -169.661611, 56.578344],
3335 + ["Iliamna", "Iliamna", "United States", -154.910961, 59.754356],
3336 + ["Platinum", "Port Moller", "United States", -161.819664, 59.011356],
3337 + ["Big Mountain Afs", "Big Mountain", "United States", -155.258822, 59.361247],
3338 + ["Oscoda Wurtsmith", "Oscoda", "United States", -83.394053, 44.451558],
3339 + ["Marina Muni", "Fort Ord", "United States", -121.762347, 36.681878],
3340 + ["Sacramento Mather", "Sacramento", "United States", -121.297592, 38.553897],
3341 + ["Bicycle Lake Aaf", "Fort Irwin", "United States", -116.630031, 35.280531],
3342 + ["Twentynine Palms Eaf", "Twenty Nine Palms", "United States", -116.162203, 34.296161],
3343 + ["Fort Smith Rgnl", "Fort Smith", "United States", -94.367444, 35.336583],
3344 + ["Merrill Fld", "Anchorage", "United States", -149.844447, 61.213544],
3345 + ["Grants Milan Muni", "Grants", "United States", -107.901989, 35.167286],
3346 + ["Ponca City Rgnl", "Ponca City", "United States", -97.099781, 36.731958],
3347 + ["Hunter Aaf", "Hunter Aaf", "United States", -81.145683, 32.01],
3348 + ["Grand Forks Intl", "Grand Forks", "United States", -97.176111, 47.949256],
3349 + ["Grider Fld", "Pine Bluff", "United States", -91.935597, 34.173142],
3350 + ["Whiting Fld Nas North", "Milton", "United States", -87.021944, 30.724167],
3351 + ["Hana", "Hana", "United States", -156.014439, 20.795636],
3352 + ["Ernest A Love Fld", "Prescott", "United States", -112.419583, 34.654472],
3353 + ["Trenton Mercer", "Trenton", "United States", -74.813469, 40.276692],
3354 + ["General Edward Lawrence Logan Intl", "Boston", "United States", -71.005181, 42.364347],
3355 + ["Travis Afb", "Fairfield", "United States", -121.927464, 38.262692],
3356 + ["Griffiss Afld", "Rome", "United States", -75.407033, 43.2338],
3357 + ["Wendover", "Wendover", "United States", -114.030889, 40.718694],
3358 + ["Mobile Downtown", "Mobile", "United States", -88.068092, 30.626783],
3359 + ["Metropolitan Oakland Intl", "Oakland", "United States", -122.220722, 37.721278],
3360 + ["Eppley Afld", "Omaha", "United States", -95.894069, 41.303167],
3361 + ["Port Angeles Cgas", "Port Angeles", "United States", -123.414075, 48.141481],
3362 + ["Kahului", "Kahului", "United States", -156.430458, 20.89865],
3363 + ["Wichita Mid Continent", "Wichita", "United States", -97.433056, 37.649944],
3364 + ["Kansas City Intl", "Kansas City", "United States", -94.713905, 39.297606],
3365 + ["Dane Co Rgnl Truax Fld", "Madison", "United States", -89.337514, 43.139858],
3366 + ["Dillingham", "Dillingham", "United States", -158.5055, 59.044667],
3367 + ["Boone Co", "Harrison", "United States", -93.154728, 36.261519],
3368 + ["Phoenix Sky Harbor Intl", "Phoenix", "United States", -112.011583, 33.434278],
3369 + ["Bangor Intl", "Bangor", "United States", -68.828139, 44.807444],
3370 + ["Fort Lauderdale Executive", "Fort Lauderdale", "United States", -80.170706, 26.197281],
3371 + ["East Texas Rgnl", "Longview", "United States", -94.711486, 32.384014],
3372 + ["Anderson Rgnl", "Andersen", "United States", -82.709389, 34.494583],
3373 + ["Spokane Intl", "Spokane", "United States", -117.533833, 47.619861],
3374 + ["North Perry", "Hollywood", "United States", -80.240722, 26.001222],
3375 + ["San Francisco Intl", "San Francisco", "United States", -122.374889, 37.618972],
3376 + ["Cut Bank Muni", "Cutbank", "United States", -112.376144, 48.608353],
3377 + ["Acadiana Rgnl", "Louisiana", "United States", -91.883896, 30.037758],
3378 + ["Gainesville Rgnl", "Gainesville", "United States", -82.271778, 29.690056],
3379 + ["Memphis Intl", "Memphis", "United States", -89.976667, 35.042417],
3380 + ["Bisbee Douglas Intl", "Douglas", "United States", -109.603667, 31.469028],
3381 + ["Allen Aaf", "Delta Junction", "United States", -145.721642, 63.994547],
3382 + ["Tstc Waco", "Waco", "United States", -97.074139, 31.637831],
3383 + ["Annette Island", "Annette Island", "United States", -131.572233, 55.042436],
3384 + ["Caribou Muni", "Caribou", "United States", -68.017917, 46.8715],
3385 + ["Little Rock Afb", "Jacksonville", "United States", -92.149722, 34.916944],
3386 + ["Redstone Aaf", "Redstone", "United States", -86.684781, 34.678653],
3387 + ["Pope Field", "Fort Bragg", "United States", -79.014472, 35.170883],
3388 + ["Dalhart Muni", "Dalhart", "United States", -102.547278, 36.022586],
3389 + ["Laughlin Afb", "Del Rio", "United States", -100.777975, 29.359486],
3390 + ["Los Angeles Intl", "Los Angeles", "United States", -118.408075, 33.942536],
3391 + ["Anniston Metro", "Anniston", "United States", -85.858111, 33.588167],
3392 + ["Cleveland Hopkins Intl", "Cleveland", "United States", -81.849794, 41.411689],
3393 + ["Dover Afb", "Dover", "United States", -75.465958, 39.129539],
3394 + ["Cincinnati Northern Kentucky Intl", "Cincinnati", "United States", -84.667822, 39.048836],
3395 + ["Tipton", "Fort Meade", "United States", -76.759414, 39.085386],
3396 + ["China Lake Naws", "China", "United States", -117.692039, 35.685422],
3397 + ["Huron Rgnl", "Huron", "United States", -98.228542, 44.3852],
3398 + ["Juneau Intl", "Juneau", "United States", -134.576278, 58.354972],
3399 + ["Lafayette Rgnl", "Lafayette", "United States", -91.987611, 30.205278],
3400 + ["Newark Liberty Intl", "Newark", "United States", -74.168667, 40.6925],
3401 + ["Boise Air Terminal", "Boise", "United States", -116.222861, 43.564361],
3402 + ["Creech Afb", "Indian Springs", "United States", -115.673353, 36.587183],
3403 + ["Garden City Rgnl", "Garden City", "United States", -100.724417, 37.927528],
3404 + ["Minot Intl", "Minot", "United States", -101.280333, 48.259378],
3405 + ["Wheeler Aaf", "Wahiawa", "United States", -158.039667, 21.4835],
3406 + ["Maxwell Afb", "Montgomery", "United States", -86.365778, 32.382944],
3407 + ["Robinson Aaf", "Robinson", "United States", -92.300153, 34.850089],
3408 + ["Dallas Love Fld", "Dallas", "United States", -96.851778, 32.847111],
3409 + ["Butts Aaf", "Fort Carson", "United States", -104.756581, 38.678394],
3410 + ["Helena Rgnl", "Helena", "United States", -111.98275, 46.606806],
3411 + ["Miramar Mcas", "Miramar", "United States", -117.14175, 32.867694],
3412 + ["Luke Afb", "Phoenix", "United States", -112.38306, 33.535],
3413 + ["Hurlburt Fld", "Mary Esther", "United States", -86.689278, 30.427803],
3414 + ["Jack Northrop Fld Hawthorne Muni", "Hawthorne", "United States", -118.335186, 33.922839],
3415 + ["Houlton Intl", "Houlton", "United States", -67.792056, 46.123083],
3416 + ["Vance Afb", "Enid", "United States", -97.9165, 36.339167],
3417 + ["Point Mugu Nas", "Point Mugu", "United States", -119.12094, 34.120285],
3418 + ["Edwards Afb", "Edwards Afb", "United States", -117.883739, 34.905417],
3419 + ["Lake Charles Rgnl", "Lake Charles", "United States", -93.223335, 30.126112],
3420 + ["Kona Intl At Keahole", "Kona", "United States", -156.045631, 19.738767],
3421 + ["Myrtle Beach Intl", "Myrtle Beach", "United States", -78.928333, 33.67975],
3422 + ["Lemoore Nas", "Lemoore", "United States", -119.95208, 36.333012],
3423 + ["Nantucket Mem", "Nantucket", "United States", -70.060181, 41.253053],
3424 + ["Felker Aaf", "Fort Eustis", "United States", -76.608841, 37.1325],
3425 + ["Campbell Aaf", "Hopkinsville", "United States", -87.496183, 36.668567],
3426 + ["Ronald Reagan Washington Natl", "Washington", "United States", -77.037722, 38.852083],
3427 + ["Patuxent River Nas", "Patuxent River", "United States", -76.411781, 38.285981],
3428 + ["Palacios Muni", "Palacios", "United States", -96.250958, 28.727508],
3429 + ["Arkansas Intl", "Blytheville", "United States", -89.943956, 35.964347],
3430 + ["Atlantic City Intl", "Atlantic City", "United States", -74.577167, 39.457583],
3431 + ["Tinker Afb", "Oklahoma City", "United States", -97.386633, 35.414739],
3432 + ["Elizabeth City Cgas Rgnl", "Elizabeth City", "United States", -76.174572, 36.260581],
3433 + ["Pueblo Memorial", "Pueblo", "United States", -104.496572, 38.289085],
3434 + ["Northern Maine Rgnl At Presque Isle", "Presque Isle", "United States", -68.044797, 46.688958],
3435 + ["Kirtland Air Force Base", "Kirtland A.f.b.", "United States", -106.609194, 35.040222],
3436 + ["Gray Aaf", "Fort Lewis", "United States", -122.580783, 47.079217],
3437 + ["Kodiak", "Kodiak", "United States", -152.493856, 57.749967],
3438 + ["Upolu", "Opolu", "United States", -155.859989, 20.265256],
3439 + ["Fort Lauderdale Hollywood Intl", "Fort Lauderdale", "United States", -80.15275, 26.072583],
3440 + ["Davis Fld", "Muskogee", "United States", -95.366656, 35.656489],
3441 + ["Falls Intl", "International Falls", "United States", -93.403067, 48.566186],
3442 + ["Salt Lake City Intl", "Salt Lake City", "United States", -111.977772, 40.788389],
3443 + ["Childress Muni", "Childress", "United States", -100.287992, 34.433781],
3444 + ["Keesler Afb", "Biloxi", "United States", -88.924433, 30.410425],
3445 + ["Lawson Aaf", "Fort Benning", "United States", -84.991283, 32.337322],
3446 + ["Kingsville Nas", "Kingsville", "United States", -97.809723, 27.507223],
3447 + ["Marshall Aaf", "Fort Riley", "United States", -96.764453, 39.055275],
3448 + ["Harrisburg Intl", "Harrisburg", "United States", -76.763403, 40.193494],
3449 + ["Lincoln", "Lincoln", "United States", -96.75925, 40.850971],
3450 + ["Capital City", "Lansing", "United States", -84.587357, 42.7787],
3451 + ["Waimea Kohala", "Kamuela", "United States", -155.668108, 20.001328],
3452 + ["Massena Intl Richards Fld", "Massena", "United States", -74.845547, 44.935833],
3453 + ["Hickory Rgnl", "Hickory", "United States", -81.38955, 35.741147],
3454 + ["Albert Whitted", "St. Petersburg", "United States", -82.626972, 27.765111],
3455 + ["Page Fld", "Fort Myers", "United States", -81.86325, 26.586611],
3456 + ["George Bush Intercontinental", "Houston", "United States", -95.341442, 29.984433],
3457 + ["Millinocket Muni", "Millinocket", "United States", -68.685561, 45.647836],
3458 + ["Andrews Afb", "Camp Springs", "United States", -76.867028, 38.810806],
3459 + ["Smith Reynolds", "Winston-salem", "United States", -80.222, 36.133722],
3460 + ["Southern California Logistics", "Victorville", "United States", -117.382997, 34.597453],
3461 + ["Bob Sikes", "Crestview", "United States", -86.522111, 30.778833],
3462 + ["Wheeler Sack Aaf", "Fort Drum", "United States", -75.719458, 44.055619],
3463 + ["St Clair Co Intl", "Port Huron", "United States", -82.528862, 42.910957],
3464 + ["Meadows Fld", "Bakersfield", "United States", -119.05677, 35.433598],
3465 + ["El Paso Intl", "El Paso", "United States", -106.377583, 31.80725],
3466 + ["Valley Intl", "Harlingen", "United States", -97.654389, 26.2285],
3467 + ["Columbia Metropolitan", "Columbia", "United States", -81.119528, 33.938833],
3468 + ["Davis Monthan Afb", "Tucson", "United States", -110.883144, 32.166467],
3469 + ["Pensacola Nas", "Pensacola", "United States", -87.318647, 30.352656],
3470 + ["Pensacola Rgnl", "Pensacola", "United States", -87.186611, 30.473425],
3471 + ["Grand Forks Afb", "Red River", "United States", -97.401194, 47.961098],
3472 + ["William P Hobby", "Houston", "United States", -95.278889, 29.645419],
3473 + ["Buckley Afb", "Buckley", "United States", -104.75166, 39.701668],
3474 + ["Northway", "Northway", "United States", -141.929136, 62.961334],
3475 + ["Palmer Muni", "Palmer", "United States", -149.088711, 61.594914],
3476 + ["Pittsburgh Intl", "Pittsburgh", "United States", -80.232872, 40.491467],
3477 + ["Wiley Post Will Rogers Mem", "Barrow", "United States", -156.766003, 71.285446],
3478 + ["Ellington Fld", "Houston", "United States", -95.15875, 29.607333],
3479 + ["Whidbey Island Nas", "Whidbey Island", "United States", -122.655906, 48.351803],
3480 + ["Alice Intl", "Alice", "United States", -98.026944, 27.740889],
3481 + ["Moody Afb", "Valdosta", "United States", -83.193, 30.967833],
3482 + ["Miami Intl", "Miami", "United States", -80.290556, 25.79325],
3483 + ["Seattle Tacoma Intl", "Seattle", "United States", -122.309306, 47.449],
3484 + ["Lovell Fld", "Chattanooga", "United States", -85.203808, 35.035278],
3485 + ["Igor I Sikorsky Mem", "Stratford", "United States", -73.126167, 41.163472],
3486 + ["Jackson Evers Intl", "Jackson", "United States", -90.075889, 32.311167],
3487 + ["Scholes Intl At Galveston", "Galveston", "United States", -94.860406, 29.265322],
3488 + ["Long Beach", "Long Beach", "United States", -118.151611, 33.817722],
3489 + ["Dillingham", "Dillingham", "United States", -158.197281, 21.579475],
3490 + ["Williamsport Rgnl", "Williamsport", "United States", -76.921094, 41.241836],
3491 + ["Indianapolis Intl", "Indianapolis", "United States", -86.294383, 39.717331],
3492 + ["Whiteman Afb", "Knobnoster", "United States", -93.547864, 38.730306],
3493 + ["Akron Fulton Intl", "Akron", "United States", -81.466917, 41.0375],
3494 + ["Greenwood Leflore", "Greenwood", "United States", -90.084706, 33.494328],
3495 + ["Westchester Co", "White Plains", "United States", -73.707575, 41.066959],
3496 + ["Francis S Gabreski", "West Hampton Beach", "United States", -72.631789, 40.843656],
3497 + ["Jonesboro Muni", "Jonesboro", "United States", -90.646417, 35.831708],
3498 + ["Tonopah Test Range", "Tonopah", "United States", -116.78075, 37.798836],
3499 + ["Palm Beach Co Park", "West Palm Beach", "United States", -80.085056, 26.593],
3500 + ["North Island Nas", "San Diego", "United States", -117.21531, 32.699219],
3501 + ["Biggs Aaf", "El Paso", "United States", -106.380039, 31.849528],
3502 + ["Yuma Mcas Yuma Intl", "Yuma", "United States", -114.60598, 32.656578],
3503 + ["Cavern City Air Terminal", "Carlsbad", "United States", -104.263278, 32.337472],
3504 + ["Duluth Intl", "Duluth", "United States", -92.193649, 46.842091],
3505 + ["Bethel", "Bethel", "United States", -161.838, 60.779778],
3506 + ["Bowman Fld", "Louisville", "United States", -85.663722, 38.228],
3507 + ["Sierra Vista Muni Libby Aaf", "Fort Huachuca", "United States", -110.344389, 31.588472],
3508 + ["Lihue", "Lihue", "United States", -159.338958, 21.975983],
3509 + ["Terre Haute Intl Hulman Fld", "Terre Haute", "United States", -87.307561, 39.451464],
3510 + ["Havre City Co", "Havre", "United States", -109.762342, 48.542983],
3511 + ["Grant Co Intl", "Grant County Airport", "United States", -119.32019, 47.207708],
3512 + ["Edward F Knapp State", "Montpelier", "United States", -72.562328, 44.203503],
3513 + ["San Nicolas Island Nolf", "San Nicolas Island", "United States", -119.45816, 33.239765],
3514 + ["Richmond Intl", "Richmond", "United States", -77.319667, 37.505167],
3515 + ["Shreveport Rgnl", "Shreveport", "United States", -93.8256, 32.446629],
3516 + ["Merle K Mudhole Smith", "Cordova", "United States", -145.477556, 60.491778],
3517 + ["Norfolk Intl", "Norfolk", "United States", -76.201222, 36.894611],
3518 + ["Southeast Texas Rgnl", "Beaumont", "United States", -94.020694, 29.950833],
3519 + ["Savannah Hilton Head Intl", "Savannah", "United States", -81.202139, 32.127583],
3520 + ["Hill Afb", "Ogden", "United States", -111.973039, 41.123939],
3521 + ["Nome", "Nome", "United States", -165.445247, 64.512203],
3522 + ["Scappoose Industrial Airpark", "San Luis", "United States", -122.861833, 45.771028],
3523 + ["St Petersburg Clearwater Intl", "St. Petersburg", "United States", -82.687389, 27.910167],
3524 + ["Menominee Marinette Twin Co", "Macon", "United States", -87.638443, 45.12665],
3525 + ["Lone Star Executive", "Conroe", "United States", -95.414467, 30.351833],
3526 + ["Deadhorse", "Deadhorse", "United States", -148.465167, 70.19475],
3527 + ["San Antonio Intl", "San Antonio", "United States", -98.469778, 29.533694],
3528 + ["Greater Rochester Intl", "Rochester", "United States", -77.672389, 43.118866],
3529 + ["Patrick Afb", "Coco Beach", "United States", -80.610125, 28.234922],
3530 + ["Teterboro", "Teterboro", "United States", -74.060837, 40.850103],
3531 + ["Ellsworth Afb", "Rapid City", "United States", -103.103567, 44.145042],
3532 + ["Raleigh Durham Intl", "Raleigh-durham", "United States", -78.787472, 35.877639],
3533 + ["James M Cox Dayton Intl", "Dayton", "United States", -84.219375, 39.902375],
3534 + ["Kenai Muni", "Kenai", "United States", -151.245, 60.573111],
3535 + ["Mc Alester Rgnl", "Mcalester", "United States", -95.783463, 34.882403],
3536 + ["Niagara Falls Intl", "Niagara Falls", "United States", -78.946194, 43.107333],
3537 + ["Coulter Fld", "Bryan", "United States", -96.331361, 30.715694],
3538 + ["Wright Aaf", "Wright", "United States", -81.562333, 31.889097],
3539 + ["Newport News Williamsburg Intl", "Newport News", "United States", -76.492989, 37.131894],
3540 + ["Esler Rgnl", "Alexandria", "United States", -92.295772, 31.394903],
3541 + ["Altus Afb", "Altus", "United States", -99.266681, 34.667067],
3542 + ["Tucson Intl", "Tucson", "United States", -110.941028, 32.116083],
3543 + ["Minot Afb", "Minot", "United States", -101.357661, 48.415572],
3544 + ["Beale Afb", "Marysville", "United States", -121.436567, 39.136089],
3545 + ["Greater Kankakee", "Kankakee", "United States", -87.846278, 41.071389],
3546 + ["Seymour Johnson Afb", "Goldsboro", "United States", -77.960589, 35.339383],
3547 + ["Theodore Francis Green State", "Providence", "United States", -71.420383, 41.732581],
3548 + ["Salisbury Ocean City Wicomico Rgnl", "Salisbury", "United States", -75.510289, 38.340525],
3549 + ["Rancho Murieta", "Rancho Murieta", "United States", -121.102778, 38.486778],
3550 + ["Bob Hope", "Burbank", "United States", -118.358667, 34.200667],
3551 + ["Detroit Metro Wayne Co", "Detroit", "United States", -83.353389, 42.212444],
3552 + ["Tampa Intl", "Tampa", "United States", -82.53325, 27.975472],
3553 + ["Pembina Muni", "Pembina", "United States", -97.240833, 48.942501],
3554 + ["Polk Aaf", "Fort Polk", "United States", -93.191667, 31.044833],
3555 + ["Eielson Afb", "Fairbanks", "United States", -147.1015, 64.665667],
3556 + ["Chisholm Hibbing", "Hibbing", "United States", -92.838994, 47.3866],
3557 + ["Angelina Co", "Lufkin", "United States", -94.75, 31.234014],
3558 + ["Midland Intl", "Midland", "United States", -102.201914, 31.942528],
3559 + ["Austin Straubel Intl", "Green Bay", "United States", -88.129589, 44.485072],
3560 + ["Ardmore Muni", "Ardmore", "United States", -97.008889, 34.300833],
3561 + ["Mc Guire Afb", "Wrightstown", "United States", -74.591667, 40.015556],
3562 + ["Cherry Point Mcas", "Cherry Point", "United States", -76.880733, 34.900872],
3563 + ["Emanuel Co", "Santa Barbara", "United States", -82.369944, 32.609139],
3564 + ["Augusta Rgnl At Bush Fld", "Bush Field", "United States", -81.9645, 33.369944],
3565 + ["Sloulin Fld Intl", "Williston", "United States", -103.642347, 48.177939],
3566 + ["Adams Fld", "Little Rock", "United States", -92.224306, 34.729444],
3567 + ["Stewart Intl", "Newburgh", "United States", -74.104839, 41.504094],
3568 + ["Baudette Intl", "Baudette", "United States", -94.612222, 48.728444],
3569 + ["Sacramento Executive", "Sacramento", "United States", -121.49347, 38.512524],
3570 + ["Homer", "Homer", "United States", -151.476583, 59.645556],
3571 + ["Waynesville Rgnl Arpt At Forney Fld", "Fort Leonardwood", "United States", -92.140736, 37.741631],
3572 + ["Dobbins Arb", "Marietta", "United States", -84.516319, 33.915382],
3573 + ["Fairchild Afb", "Spokane", "United States", -117.655772, 47.615058],
3574 + ["Roscommon Co", "Houghton Lake", "United States", -84.671112, 44.359806],
3575 + ["Tyndall Afb", "Panama City", "United States", -85.575417, 30.069567],
3576 + ["Dallas Fort Worth Intl", "Dallas-Fort Worth", "United States", -97.037997, 32.896828],
3577 + ["Melbourne Intl", "Melbourne", "United States", -80.645258, 28.102753],
3578 + ["Mc Chord Afb", "Tacoma", "United States", -122.476475, 47.137678],
3579 + ["Austin Bergstrom Intl", "Austin", "United States", -97.669889, 30.194528],
3580 + ["Rickenbacker Intl", "Columbus", "United States", -82.927822, 39.813786],
3581 + ["Sawyer Intl", "Gwinn", "United States", -87.395353, 46.353625],
3582 + ["Mc Ghee Tyson", "Knoxville", "United States", -83.994028, 35.810972],
3583 + ["Hood Aaf", "Fort Hood", "United States", -97.714469, 31.138731],
3584 + ["Lambert St Louis Intl", "St. Louis", "United States", -90.370028, 38.748697],
3585 + ["Millville Muni", "Millville", "United States", -75.072222, 39.367806],
3586 + ["Sheppard Afb Wichita Falls Muni", "Wichita Falls", "United States", -98.491894, 33.988797],
3587 + ["Cincinnati Muni Lunken Fld", "Cincinnati", "United States", -84.418611, 39.103333],
3588 + ["Hartsfield Jackson Atlanta Intl", "Atlanta", "United States", -84.428067, 33.636719],
3589 + ["Castle", "Merced", "United States", -120.568189, 37.380481],
3590 + ["Mc Clellan Afld", "Sacramento", "United States", -121.400611, 38.667639],
3591 + ["Gerald R Ford Intl", "Grand Rapids", "United States", -85.522806, 42.880833],
3592 + ["Winkler Co", "Wink", "United States", -103.201361, 31.779628],
3593 + ["Fresno Yosemite Intl", "Fresno", "United States", -119.71814, 36.776194],
3594 + ["Vero Beach Muni", "Vero Beach", "United States", -80.417944, 27.655556],
3595 + ["Imperial Co", "Imperial", "United States", -115.578744, 32.834219],
3596 + ["Nashville Intl", "Nashville", "United States", -86.678194, 36.124472],
3597 + ["Laredo Intl", "Laredo", "United States", -99.461556, 27.54375],
3598 + ["Elmendorf Afb", "Anchorage", "United States", -149.806503, 61.250986],
3599 + ["Ralph Wien Mem", "Kotzebue", "United States", -162.59855, 66.884678],
3600 + ["Altoona Blair Co", "Altoona", "United States", -78.320022, 40.296372],
3601 + ["Dyess Afb", "Abilene", "United States", -99.8546, 32.420756],
3602 + ["South Arkansas Rgnl At Goodwin Fld", "El Dorado", "United States", -92.813278, 33.220972],
3603 + ["La Guardia", "New York", "United States", -73.872608, 40.777245],
3604 + ["Tallahassee Rgnl", "Tallahassee", "United States", -84.350333, 30.396528],
3605 + ["Dupage", "West Chicago", "United States", -88.248611, 41.907778],
3606 + ["Waco Rgnl", "Waco", "United States", -97.230519, 31.611289],
3607 + ["Augusta State", "Augusta", "United States", -69.797317, 44.320647],
3608 + ["Hillsboro Muni", "Hillsboro", "United States", -97.097228, 32.083486],
3609 + ["Jacksonville Nas", "Jacksonville", "United States", -81.680556, 30.235834],
3610 + ["Mc Kellar Sipes Rgnl", "Jackson", "United States", -88.915611, 35.599889],
3611 + ["Molokai", "Molokai", "United States", -157.096256, 21.152886],
3612 + ["Godman Aaf", "Fort Knox", "United States", -85.972106, 37.907058],
3613 + ["New River Mcas", "Jacksonville", "United States", -77.439667, 34.708417],
3614 + ["San Angelo Rgnl Mathis Fld", "San Angelo", "United States", -100.496306, 31.35775],
3615 + ["Calexico Intl", "Calexico", "United States", -115.51333, 32.669502],
3616 + ["Chico Muni", "Chico", "United States", -121.858422, 39.795383],
3617 + ["Burlington Intl", "Burlington", "United States", -73.153278, 44.471861],
3618 + ["Jacksonville Intl", "Jacksonville", "United States", -81.687861, 30.494056],
3619 + ["Durango La Plata Co", "Durango", "United States", -107.75377, 37.151516],
3620 + ["Washington Dulles Intl", "Washington", "United States", -77.455811, 38.944533],
3621 + ["Easterwood Fld", "College Station", "United States", -96.363833, 30.588583],
3622 + ["Felts Fld", "Spokane", "United States", -117.322558, 47.682819],
3623 + ["General Mitchell Intl", "Milwaukee", "United States", -87.896583, 42.947222],
3624 + ["Abilene Rgnl", "Abilene", "United States", -99.681897, 32.411319],
3625 + ["Columbia Rgnl", "Columbia", "United States", -92.219631, 38.818094],
3626 + ["Portland Intl", "Portland", "United States", -122.5975, 45.588722],
3627 + ["Dade Collier Training And Transition", "Miami", "United States", -80.897, 25.861806],
3628 + ["Palm Beach Intl", "West Palm Beach", "United States", -80.095589, 26.683161],
3629 + ["Fort Worth Meacham Intl", "Fort Worth", "United States", -97.362444, 32.819778],
3630 + ["Ogdensburg Intl", "Ogdensburg", "United States", -75.4655, 44.681854],
3631 + ["Otis Angb", "Falmouth", "United States", -70.521417, 41.658439],
3632 + ["Boeing Fld King Co Intl", "Seattle", "United States", -122.301947, 47.53],
3633 + ["Lackland Afb Kelly Fld Annex", "San Antonio", "United States", -98.581108, 29.384228],
3634 + ["Honolulu Intl", "Honolulu", "United States", -157.922428, 21.318681],
3635 + ["Des Moines Intl", "Des Moines", "United States", -93.663083, 41.533972],
3636 + ["Craven Co Rgnl", "New Bern", "United States", -77.042944, 35.072972],
3637 + ["San Diego Intl", "San Diego", "United States", -117.189667, 32.733556],
3638 + ["Monroe Rgnl", "Monroe", "United States", -92.037689, 32.510864],
3639 + ["Shaw Afb", "Sumter", "United States", -80.470564, 33.972719],
3640 + ["Ontario Intl", "Ontario", "United States", -117.601194, 34.056],
3641 + ["Majors", "Greenvile", "United States", -96.065333, 33.067839],
3642 + ["Roswell Intl Air Center", "Roswell", "United States", -104.530556, 33.301556],
3643 + ["Coleman A Young Muni", "Detroit", "United States", -83.009861, 42.409195],
3644 + ["Brownsville South Padre Island Intl", "Brownsville", "United States", -97.425861, 25.906833],
3645 + ["Dothan Rgnl", "Dothan", "United States", -85.449628, 31.321339],
3646 + ["Cape May Co", "Wildwood", "United States", -74.908275, 39.008507],
3647 + ["Fallon Nas", "Fallon", "United States", -118.70098, 39.416584],
3648 + ["Selfridge Angb", "Mount Clemens", "United States", -82.8355, 42.608333],
3649 + ["Four Corners Rgnl", "Farmington", "United States", -108.229944, 36.74125],
3650 + ["Corpus Christi Intl", "Corpus Christi", "United States", -97.501222, 27.770361],
3651 + ["Syracuse Hancock Intl", "Syracuse", "United States", -76.106311, 43.111187],
3652 + ["Key West Nas", "Key West", "United States", -81.688889, 24.575834],
3653 + ["Chicago Midway Intl", "Chicago", "United States", -87.752417, 41.785972],
3654 + ["Norman Y Mineta San Jose Intl", "San Jose", "United States", -121.929022, 37.3626],
3655 + ["Lea Co Rgnl", "Hobbs", "United States", -103.217028, 32.687528],
3656 + ["Northeast Philadelphia", "Philadelphia", "United States", -75.010586, 40.081944],
3657 + ["Denver Intl", "Denver", "United States", -104.673178, 39.861656],
3658 + ["Philadelphia Intl", "Philadelphia", "United States", -75.241139, 39.871944],
3659 + ["Sioux Gateway Col Bud Day Fld", "Sioux City", "United States", -96.384367, 42.402603],
3660 + ["Middle Georgia Rgnl", "Macon", "United States", -83.649211, 32.69285],
3661 + ["Truth Or Consequences Muni", "Truth Or Consequences", "United States", -107.27175, 33.236944],
3662 + ["Palmdale Rgnl Usaf Plt 42", "Palmdale", "United States", -118.08456, 34.629391],
3663 + ["Randolph Afb", "San Antonio", "United States", -98.2789, 29.529675],
3664 + ["El Centro Naf", "El Centro", "United States", -115.671667, 32.829222],
3665 + ["Port Columbus Intl", "Columbus", "United States", -82.891889, 39.997972],
3666 + ["Drake Fld", "Fayetteville", "United States", -94.170059, 36.005094],
3667 + ["Henry Post Aaf", "Fort Sill", "United States", -98.402167, 34.649833],
3668 + ["Princeton Muni", "Princeton", "United States", -93.608217, 45.559868],
3669 + ["Wright Patterson Afb", "Dayton", "United States", -84.048332, 39.826111],
3670 + ["Edward G Pitka Sr", "Galena", "United States", -156.937417, 64.736178],
3671 + ["Chandler Muni", "Chandler", "United States", -111.811111, 33.269111],
3672 + ["Mineral Wells", "Mineral Wells", "United States", -98.060175, 32.781606],
3673 + ["Mc Connell Afb", "Wichita", "United States", -97.268192, 37.621853],
3674 + ["New Orleans Nas Jrb", "New Orleans", "United States", -90.035, 29.825333],
3675 + ["Beaufort", "Beaufort", "United States", -80.723161, 32.477411],
3676 + ["Texarkana Rgnl Webb Fld", "Texarkana", "United States", -93.991028, 33.453722],
3677 + ["Plattsburgh Intl", "Plattsburgh", "United States", -73.468139, 44.650944],
3678 + ["Phillips Aaf", "Aberdeen", "United States", -76.168808, 39.466219],
3679 + ["Tucumcari Muni", "Tucumcari", "United States", -103.603186, 35.182777],
3680 + ["Ted Stevens Anchorage Intl", "Anchorage", "United States", -149.996361, 61.174361],
3681 + ["Robert Gray Aaf", "Killeen", "United States", -97.828917, 31.06725],
3682 + ["Black Rock", "Zuni Pueblo", "United States", -108.791778, 35.083228],
3683 + ["Bellingham Intl", "Bellingham", "United States", -122.537528, 48.792694],
3684 + ["Millington Rgnl Jetport", "Millington", "United States", -89.870278, 35.356667],
3685 + ["Elkins Randolph Co Jennings Randolph", "Elkins", "United States", -79.857139, 38.889444],
3686 + ["Hartford Brainard", "Hartford", "United States", -72.649444, 41.736722],
3687 + ["North Central State", "Smithfield", "United States", -71.491381, 41.920764],
3688 + ["Mobile Rgnl", "Mobile", "United States", -88.242814, 30.691231],
3689 + ["Moffett Federal Afld", "Mountain View", "United States", -122.049139, 37.416142],
3690 + ["Santa Fe Muni", "Santa Fe", "United States", -106.089422, 35.617108],
3691 + ["Barking Sands Pmrf", "Barking Sands", "United States", -159.785, 22.022833],
3692 + ["Beauregard Rgnl", "Deridder", "United States", -93.339917, 30.831722],
3693 + ["Bradshaw Aaf", "Bradshaw Field", "United States", -155.553717, 19.760056],
3694 + ["Nogales Intl", "Nogales", "United States", -110.84789, 31.417722],
3695 + ["Macdill Afb", "Tampa", "United States", -82.521214, 27.849339],
3696 + ["Scott Afb Midamerica", "Belleville", "United States", -89.835183, 38.545178],
3697 + ["Opa Locka", "Miami", "United States", -80.278389, 25.907],
3698 + ["Del Rio Intl", "Del Rio", "United States", -100.927158, 29.374208],
3699 + ["Southwest Florida Intl", "Fort Myers", "United States", -81.755167, 26.536167],
3700 + ["King Salmon", "King Salmon", "United States", -156.649278, 58.676778],
3701 + ["Muir Aaf", "Muir", "United States", -76.569411, 40.434811],
3702 + ["Kapalua", "Lahania-kapalua", "United States", -156.673031, 20.962936],
3703 + ["John F Kennedy Intl", "New York", "United States", -73.778925, 40.639751],
3704 + ["Homestead Arb", "Homestead", "United States", -80.383567, 25.48855],
3705 + ["Riverside Muni", "Riverside", "United States", -117.445103, 33.951875],
3706 + ["Sherman Aaf", "Fort Leavenworth", "United States", -94.914686, 39.368332],
3707 + ["Wallops Flight Facility", "Wallops Island", "United States", -75.466389, 37.940194],
3708 + ["Holloman Afb", "Alamogordo", "United States", -106.106525, 32.852519],
3709 + ["Willow Grove Nas Jrb", "Willow Grove", "United States", -75.148167, 40.199833],
3710 + ["Cheyenne Rgnl Jerry Olson Fld", "Cheyenne", "United States", -104.811839, 41.155722],
3711 + ["Stockton Metropolitan", "Stockton", "United States", -121.238306, 37.894167],
3712 + ["Charleston Afb Intl", "Charleston", "United States", -80.040528, 32.898647],
3713 + ["Reno Tahoe Intl", "Reno", "United States", -119.768108, 39.499108],
3714 + ["Ketchikan Intl", "Ketchikan", "United States", -131.71375, 55.355556],
3715 + ["Willow Run", "Detroit", "United States", -83.530408, 42.237928],
3716 + ["Vandenberg Afb", "Lompoc", "United States", -120.584306, 34.737333],
3717 + ["Birmingham Intl", "Birmingham", "United States", -86.75355, 33.562942],
3718 + ["Lakehurst Naes", "Lakehurst", "United States", -74.353333, 40.033333],
3719 + ["Eareckson As", "Shemya", "United States", 174.11362, 52.712275],
3720 + ["Nellis Afb", "Las Vegas", "United States", -115.034253, 36.236197],
3721 + ["March Arb", "Riverside", "United States", -117.259453, 33.880711],
3722 + ["Modesto City Co Harry Sham", "Modesto", "United States", -120.954422, 37.625817],
3723 + ["Sacramento Intl", "Sacramento", "United States", -121.590778, 38.695417],
3724 + ["Waukegan Rgnl", "Chicago", "United States", -87.867908, 42.422161],
3725 + ["City Of Colorado Springs Muni", "Colorado Springs", "United States", -104.700778, 38.805805],
3726 + ["Buffalo Niagara Intl", "Buffalo", "United States", -78.732167, 42.940525],
3727 + ["Griffing Sandusky", "Sandusky", "United States", -82.652333, 41.433361],
3728 + ["Snohomish Co", "Everett", "United States", -122.281564, 47.906342],
3729 + ["Mountain Home Afb", "Mountain Home", "United States", -115.872431, 43.043603],
3730 + ["Cedar City Rgnl", "Cedar City", "United States", -113.098847, 37.700967],
3731 + ["Bradley Intl", "Windsor Locks", "United States", -72.683222, 41.938889],
3732 + ["Mc Allen Miller Intl", "Mcallen", "United States", -98.238611, 26.175833],
3733 + ["Norfolk Ns", "Norfolk", "United States", -76.289289, 36.937644],
3734 + ["Westover Arb Metropolitan", "Chicopee Falls", "United States", -72.534783, 42.194014],
3735 + ["Lubbock Preston Smith Intl", "Lubbock", "United States", -101.822778, 33.663639],
3736 + ["Chicago Ohare Intl", "Chicago", "United States", -87.904842, 41.978603],
3737 + ["Boca Raton", "Boca Raton", "United States", -80.107694, 26.3785],
3738 + ["Fairbanks Intl", "Fairbanks", "United States", -147.856267, 64.815114],
3739 + ["Quantico Mcaf", "Quantico", "United States", -77.305333, 38.501683],
3740 + ["Cannon Afb", "Clovis", "United States", -103.322147, 34.382775],
3741 + ["Kaneohe Bay Mcaf", "Kaneohe Bay", "United States", -157.768, 21.450453],
3742 + ["Offutt Afb", "Omaha", "United States", -95.912511, 41.118332],
3743 + ["Gulkana", "Gulkana", "United States", -145.456639, 62.154888],
3744 + ["Watertown Intl", "Watertown", "United States", -76.021739, 43.991922],
3745 + ["Palm Springs Intl", "Palm Springs", "United States", -116.506694, 33.829667],
3746 + ["Rick Husband Amarillo Intl", "Amarillo", "United States", -101.705931, 35.219369],
3747 + ["Fort Dodge Rgnl", "Fort Dodge", "United States", -94.191842, 42.5512],
3748 + ["Barksdale Afb", "Shreveport", "United States", -93.662674, 32.50182],
3749 + ["Forbes Fld", "Topeka", "United States", -95.663611, 38.950944],
3750 + ["Cotulla Lasalle Co", "Cotulla", "United States", -99.220294, 28.456694],
3751 + ["Wilmington Intl", "Wilmington", "United States", -77.902569, 34.270615],
3752 + ["Baton Rouge Metro Ryan Fld", "Baton Rouge", "United States", -91.149639, 30.533167],
3753 + ["Meridian Nas", "Meridian", "United States", -88.555557, 32.552083],
3754 + ["Tyler Pounds Rgnl", "Tyler", "United States", -95.402386, 32.354139],
3755 + ["Baltimore Washington Intl", "Baltimore", "United States", -76.668333, 39.175361],
3756 + ["Hobart Muni", "Hobart", "United States", -99.051353, 34.991308],
3757 + ["Lanai", "Lanai", "United States", -156.951419, 20.785611],
3758 + ["Alexandria Intl", "Alexandria", "United States", -92.549833, 31.3274],
3759 + ["Condron Aaf", "White Sands", "United States", -106.40277, 32.341484],
3760 + ["Cold Bay", "Cold Bay", "United States", -162.725436, 55.206061],
3761 + ["Tulsa Intl", "Tulsa", "United States", -95.888111, 36.198389],
3762 + ["Sitka Rocky Gutierrez", "Sitka", "United States", -135.361611, 57.047138],
3763 + ["Long Island Mac Arthur", "Islip", "United States", -73.100222, 40.79525],
3764 + ["Minneapolis St Paul Intl", "Minneapolis", "United States", -93.221767, 44.881956],
3765 + ["New Castle", "Wilmington", "United States", -75.606528, 39.678722],
3766 + ["Unalaska", "Unalaska", "United States", -166.5435, 53.900139],
3767 + ["Louis Armstrong New Orleans Intl", "New Orleans", "United States", -90.258028, 29.993389],
3768 + ["Portland Intl Jetport", "Portland", "United States", -70.309281, 43.646161],
3769 + ["Will Rogers World", "Oklahoma City", "United States", -97.600733, 35.393089],
3770 + ["Albany Intl", "Albany", "United States", -73.801692, 42.748267],
3771 + ["Valdez Pioneer Fld", "Valdez", "United States", -146.248342, 61.133949],
3772 + ["Langley Afb", "Hampton", "United States", -76.360547, 37.082881],
3773 + ["John Wayne Arpt Orange Co", "Santa Ana", "United States", -117.868222, 33.675667],
3774 + ["Columbus Afb", "Colombus", "United States", -88.443833, 33.643833],
3775 + ["Kendall Tamiami Executive", "Kendall-tamiami", "United States", -80.432777, 25.647889],
3776 + ["Oceana Nas", "Oceana", "United States", -76.033542, 36.820703],
3777 + ["Grissom Arb", "Peru", "United States", -86.152119, 40.648094],
3778 + ["Natrona Co Intl", "Casper", "United States", -106.464417, 42.908],
3779 + ["Eglin Afb", "Valparaiso", "United States", -86.5254, 30.48325],
3780 + ["Craig Fld", "Selma", "United States", -86.987803, 32.343947],
3781 + ["Key West Intl", "Key West", "United States", -81.759556, 24.556111],
3782 + ["Charlotte Douglas Intl", "Charlotte", "United States", -80.943139, 35.214],
3783 + ["Mc Carran Intl", "Las Vegas", "United States", -115.15225, 36.080056],
3784 + ["Orlando Intl", "Orlando", "United States", -81.308994, 28.429394],
3785 + ["Florence Rgnl", "Florence", "United States", -79.723889, 34.185361],
3786 + ["Great Falls Intl", "Great Falls", "United States", -111.370689, 47.482],
3787 + ["Youngstown Warren Rgnl", "Youngstown", "United States", -80.679097, 41.260736],
3788 + ["Ladd Aaf", "Fort Wainwright", "United States", -147.614444, 64.8375],
3789 + ["Mc Minnville Muni", "Mackminnville", "United States", -123.135944, 45.194444],
3790 + ["Robins Afb", "Macon", "United States", -83.59185, 32.640144],
3791 + ["Suvarnabhumi Intl", "Bangkok", "Thailand", 100.747283, 13.681108],
3792 + ["Andi Jemma", "Masamba", "Indonesia", 120.324383, -2.558044],
3793 + ["Soroako", "Soroako", "Indonesia", 121.357639, -2.531203],
3794 + ["Pongtiku", "Makale", "Indonesia", 119.821536, -3.044736],
3795 + ["Wolter Monginsidi", "Kendari", "Indonesia", 122.418231, -4.081608],
3796 + ["Maimun Saleh", "Sabang", "Indonesia", 95.339672, 5.874131],
3797 + ["Cibeureum", "Tasikmalaya", "Indonesia", 108.246092, -7.346603],
3798 + ["Iswahyudi", "Madiun", "Indonesia", 111.434117, -7.615767],
3799 + ["Abdul Rachman Saleh", "Malang", "Indonesia", 112.714514, -7.926556],
3800 + ["Budiarto", "Tangerang", "Indonesia", 106.5699, -6.293169],
3801 + ["Husein Sastranegara", "Bandung", "Indonesia", 107.576294, -6.900625],
3802 + ["Penggung", "Cirebon", "Indonesia", 108.539672, -6.756144],
3803 + ["Adi Sutjipto", "Yogyakarta", "Indonesia", 110.431758, -7.788181],
3804 + ["Tunggul Wulung", "Cilacap", "Indonesia", 109.033911, -7.645056],
3805 + ["Pondok Cabe", "Jakarta", "Indonesia", 106.764561, -6.336964],
3806 + ["Achmad Yani", "Semarang", "Indonesia", 110.374122, -6.971447],
3807 + ["Hang Nadim", "Batam", "Indonesia", 104.118753, 1.121028],
3808 + ["H As Hanandjoeddin", "Tanjung Pandan", "Indonesia", 107.754917, -2.745722],
3809 + ["Depati Amir", "Pangkal Pinang", "Indonesia", 106.139064, -2.1622],
3810 + ["Kijang", "Tanjung Pinang", "Indonesia", 104.532311, 0.922683],
3811 + ["Dabo", "Singkep", "Indonesia", 104.579283, -0.479189],
3812 + ["Syamsudin Noor", "Banjarmasin", "Indonesia", 114.762553, -3.442356],
3813 + ["Batu Licin", "Batu Licin", "Indonesia", 115.995136, -3.412408],
3814 + ["Iskandar", "Pangkalan Bun", "Indonesia", 111.673208, -2.705197],
3815 + ["Tjilik Riwut", "Palangkaraya", "Indonesia", 113.942661, -2.225128],
3816 + ["Militaerlager", "S-Chanf", "Switzerland", 9.9833, 46.6166],
3817 + ["Wai Oti", "Maumere", "Indonesia", 122.236889, -8.640647],
3818 + ["H Hasan Aroeboesman", "Ende", "Indonesia", 121.660644, -8.849294],
3819 + ["Satar Tacik", "Ruteng", "Indonesia", 120.477061, -8.597011],
3820 + ["El Tari", "Kupang", "Indonesia", 123.671136, -10.171583],
3821 + ["Mutiara Ii", "Labuhan Bajo", "Indonesia", 119.88905, -8.486656],
3822 + ["Sepinggan", "Balikpapan", "Indonesia", 116.894478, -1.268272],
3823 + ["Juwata", "Taraken", "Indonesia", 117.565569, 3.326694],
3824 + ["Temindung", "Samarinda", "Indonesia", 117.157111, -0.484531],
3825 + ["Tanjung Santan", "Tanjung Santan", "Indonesia", 117.439292, -0.093215],
3826 + ["Selaparang", "Mataram", "Indonesia", 116.094656, -8.560708],
3827 + ["Muhammad Salahuddin", "Bima", "Indonesia", 118.687322, -8.539647],
3828 + ["Krems Langenlois", "Krems", "Austria", 15.631243, 48.446075],
3829 + ["Mau Hau", "Waingapu", "Indonesia", 120.302006, -9.669217],
3830 + ["Juanda", "Surabaya", "Indonesia", 112.786858, -7.379831],
3831 + ["Adi Sumarmo Wiryokusumo", "Solo City", "Indonesia", 110.756892, -7.516089],
3832 + ["Chiang Mai Intl", "Chiang Mai", "Thailand", 98.962644, 18.766847],
3833 + ["Chiang Rai Intl", "Chiang Rai", "Thailand", 99.882928, 19.952342],
3834 + ["Nakhon Si Thammarat", "Nakhon Si Thammarat", "Thailand", 99.944725, 8.539617],
3835 + ["Bali Ngurah Rai", "Denpasar", "Indonesia", 115.167172, -8.748169],
3836 + ["Nakhon Ratchasima", "Nakhon Ratchasima", "Thailand", 102.312736, 14.949497],
3837 + ["Nakhon Phanom", "Nakhon Phanom", "Thailand", 104.643022, 17.383794],
3838 + ["Ubon Ratchathani", "Ubon Ratchathani", "Thailand", 104.870231, 15.251278],
3839 + ["Khon Kaen", "Khon Kaen", "Thailand", 102.783661, 16.466628],
3840 + ["Sukhothai", "Sukhothai", "Thailand", 99.818183, 17.237992],
3841 + ["Eleftherios Venizelos Intl", "Athens", "Greece", 23.944467, 37.936358],
3842 + ["Chubu Centrair Intl", "Nagoya", "Japan", 136.805408, 34.858414],
3843 + ["Kobe", "Kobe", "Japan", 135.223889, 34.632778],
3844 + ["Pullman-Moscow Rgnl", "Pullman", "United States", -117.109583, 46.743861],
3845 + ["Lewiston Nez Perce Co", "Lewiston", "United States", -117.015389, 46.3745],
3846 + ["Elmira Corning Rgnl", "Elmira", "United States", -76.891611, 42.159889],
3847 + ["Ithaca Tompkins Rgnl", "Ithaca", "United States", -76.458444, 42.491028],
3848 + ["Monterey Peninsula", "Monterey", "United States", -121.842944, 36.587],
3849 + ["Santa Barbara Muni", "Santa Barbara", "United States", -119.840372, 34.426211],
3850 + ["Daytona Beach Intl", "Daytona Beach", "United States", -81.058056, 29.179917],
3851 + ["Taoyuan Station", "Zhongli", "Taiwan", 121.215216, 25.013092],
3852 + ["Liepaja Intl", "Liepaja", "Latvia", 21.096944, 56.5175],
3853 + ["Riga Intl", "Riga", "Latvia", 23.971111, 56.923611],
3854 + ["Siauliai Intl", "Siauliai", "Lithuania", 23.394975, 55.893886],
3855 + ["Barysiai", "Barysiai", "Lithuania", 23.558056, 56.070556],
3856 + ["Kaunas Intl", "Kaunas", "Lithuania", 24.084778, 54.963919],
3857 + ["S. Darius", "Kaunas", "Lithuania", 23.881511, 54.879792],
3858 + ["Palanga Intl", "Palanga", "Lithuania", 21.093856, 55.973228],
3859 + ["Vilnius Intl", "Vilnius", "Lithuania", 25.285767, 54.634133],
3860 + ["Pajuostis", "Panevezys", "Lithuania", 24.460833, 55.729444],
3861 + ["Erebuni", "Yerevan", "Armenia", 44.464992, 40.122114],
3862 + ["Stepanavan", "Stepanavan", "Armenia", 44.337172, 41.04845],
3863 + ["Zvartnots", "Yerevan", "Armenia", 44.395881, 40.147275],
3864 + ["Gyumri", "Gyumri", "Armenia", 43.859342, 40.750369],
3865 + ["Assab Intl", "Assab", "Eritrea", 42.645006, 13.071783],
3866 + ["Asmara Intl", "Asmara", "Eritrea", 38.910667, 15.291853],
3867 + ["Massawa Intl", "Massawa", "Eritrea", 39.370103, 15.669989],
3868 + ["Yasser Arafat Intl", "Gaza", "Palestine", 34.276111, 31.246389],
3869 + ["Riyan", "Mukalla", "Yemen", 49.375028, 14.662639],
3870 + ["Batumi", "Batumi", "Georgia", 41.599694, 41.610278],
3871 + ["Kopitnari", "Kutaisi", "Georgia", 42.482583, 42.176653],
3872 + ["Tbilisi", "Tbilisi", "Georgia", 44.954722, 41.669167],
3873 + ["Taiz Intl", "Taiz", "Yemen", 44.139056, 13.685964],
3874 + ["Hodeidah Intl", "Hodeidah", "Yemen", 42.976336, 14.753],
3875 + ["Aden Intl", "Aden", "Yemen", 45.028792, 12.829542],
3876 + ["Ataq", "Ataq", "Yemen", 46.826183, 14.551322],
3877 + ["Al Ghaidah Intl", "Al Ghaidah Intl", "Yemen", 52.175, 16.191667],
3878 + ["Sanaa Intl", "Sanaa", "Yemen", 44.219739, 15.476258],
3879 + ["Allgau", "Memmingen", "Germany", 10.2395, 47.988758],
3880 + ["Beihan", "Beihan", "Yemen", 45.720083, 14.781972],
3881 + ["RK Heliplex", "Panorama", "Canada", -116.14, 50.2735],
3882 + ["Socotra Intl", "Socotra", "Yemen", 53.905778, 12.630672],
3883 + ["Al Badie", "Al Badie", "Yemen", 50.836911, 18.719311],
3884 + ["Kapadokya", "Nevsehir", "Turkey", 34.53455, 38.771867],
3885 + ["Ministro Pistarini", "Buenos Aires", "Argentina", -58.535833, -34.822222],
3886 + ["Erbil Intl", "Erbil", "Iraq", 43.963158, 36.237611],
3887 + ["Emerald", "Emerald", "Australia", 148.179167, -23.5675],
3888 + ["Ellinikon International Airport", "Athens", "Greece", 23.4346, 37.5354],
3889 + ["Kansai", "Osaka", "Japan", 135.244167, 34.4347222],
3890 + ["Wall Street Heliport", "New York", "United States", -74.009028, 40.701214],
3891 + ["Tagbilaran", "Tagbilaran", "Philippines", 123.853247, 9.66408056],
3892 + ["Ilulissat", "Ilulissat", "Greenland", -51.05111, 69.23444],
3893 + ["Qasigiannguit", "Qasigiannguit", "Greenland", -51, 68.833336],
3894 + ["Aasiaat", "Aasiaat", "Greenland", -52.75, 68.7],
3895 + ["Son Sant Joan", "Palma de Mallorca", "Spain", 2.727778, 39.55361],
3896 + ["Darwin Intl", "Darwin", "Australia", 130.87266, -12.4083333],
3897 + ["Surat Thani", "Surat Thani", "Thailand", 99.135556, 9.1325],
3898 + ["Bagan Intl", "Nyuang U", "Burma", 94.9246666, 21.173833266],
3899 + ["Godofredo P", "Caticlan", "Philippines", 121.953, 11.9214999],
3900 + ["Bimini North Seaplane Base", "Bimini", "Bahamas", -79.25, 25.767],
3901 + ["Talkeetna", "Talkeetna", "United States", -150.093694, 62.3205],
3902 + ["Xewkija Heliport", "Gozo", "Malta", 14.272778, 36.027222],
3903 + ["Tweed-New Haven Airport", "New Haven", "United States", -72.886806, 41.26375],
3904 + ["Asheville Regional Airport", "Asheville", "United States", -82.541806, 35.436194],
3905 + ["Piedmont Triad", "Greensboro", "United States", -79.937306, 36.09775],
3906 + ["Sioux Falls", "Sioux Falls", "United States", -96.741914, 43.582014],
3907 + ["Ayers Rock", "Uluru", "Australia", 130.975556, -25.186111],
3908 + ["Manchester Regional Airport", "Manchester NH", "United States", -71.435667, 42.932556],
3909 + ["Naples Muni", "Naples", "United States", -81.775294, 26.152619],
3910 + ["Redang", "Redang", "Malaysia", 103.007, 5.76528],
3911 + ["Louisville International Airport", "Louisville", "United States", -85.7364989, 38.1740858],
3912 + ["Charlottesville-Albemarle", "Charlottesville VA", "United States", -78.452861, 38.138639],
3913 + ["Roanoke Regional", "Roanoke VA", "United States", -79.975417, 37.325472],
3914 + ["Blue Grass", "Lexington KY", "United States", -84.605889, 38.0365],
3915 + ["Evansville Regional", "Evansville", "United States", -87.532364, 38.036997],
3916 + ["Albuquerque International Sunport", "Albuquerque", "United States", -106.6091944, 35.0402222],
3917 + ["Gallatin Field", "Bozeman", "United States", -111.160151, 45.777643],
3918 + ["Billings Logan International Airport", "Billings", "United States", -108.537654, 45.80921],
3919 + ["Bert Mooney Airport", "Butte", "United States", -112.497472, 45.954806],
3920 + ["Cherry Capital Airport", "Traverse City", "United States", -85.582235, 44.741445],
3921 + ["Mundo Maya International", "Flores", "Guatemala", -89.866383, 16.913819],
3922 + ["Hancock County - Bar Harbor", "Bar Harbor", "United States", -68.3615653, 44.4497689],
3923 + ["Knox County Regional Airport", "Rockland", "United States", -69.0992303, 44.0601111],
3924 + ["Jackson Hole Airport", "Jacksn Hole", "United States", -110.73775, 43.607333333],
3925 + ["Chicago Rockford International Airport ", "Rockford", "United States", -89.0972222, 42.1953611],
3926 + ["Domododevo", "Moscow", "Russia", 37.906111, 55.408611],
3927 + ["Phoenix International", "Sanya", "China", 109.412272, 18.302897],
3928 + ["Milford Sound Airport", "Milford Sound", "New Zealand", 167.92333, -44.67333],
3929 + ["East 34th Street Heliport", "New York", "United States", -73.971944, 40.7425],
3930 + ["Lijiang Airport", "Lijiang", "China", 100.23333, 26.883333],
3931 + ["Greenville-Spartanburg International", "Greenville", "United States", -82.218889, 34.895556],
3932 + ["Cologne Railway", "Cologne", "Germany", 6.958056, 50.9425],
3933 + ["Stuttgart Railway Station", "Stuttgart", "Germany", 9.181667, 48.783611],
3934 + ["Central Illinois Rgnl", "Bloomington", "United States", -88.915917, 40.477111],
3935 + ["Gulfport-Biloxi", "Gulfport", "United States", -89.070111, 30.407278],
3936 + ["Kalamazoo", "Kalamazoo", "United States", -85.552058, 42.234875],
3937 + ["Toledo", "Toledo", "United States", -83.807833, 41.586806],
3938 + ["Fort Wayne", "Fort Wayne", "United States", -85.195139, 40.978472],
3939 + ["Decatur", "Decatur", "United States", -88.865689, 39.834564],
3940 + ["Cedar Rapids", "Cedar Rapids", "United States", -91.710806, 41.884694],
3941 + ["La Crosse Municipal", "La Crosse", "United States", -91.256711, 43.878986],
3942 + ["Central Wisconsin", "Wassau", "United States", -89.646635, 44.772726],
3943 + ["Peoria Regional", "Peoria", "United States", -89.693258, 40.664203],
3944 + ["Appleton", "Appleton", "United States", -88.507576, 44.257526],
3945 + ["Rochester", "Rochester", "United States", -92.500014, 43.908283],
3946 + ["Champaign", "Champaign", "United States", -88.278056, 40.03925],
3947 + ["Manhattan Reigonal", "Manhattan", "United States", -96.670833, 39.140972],
3948 + ["Kingscote Airport", "Kingscote", "Australia", 137.521389, -35.713889],
3949 + ["Hervey Bay Airport", "Hervey Bay", "Australia", 152.880278, -25.318889],
3950 + ["EuroAirport Basel-Mulhouse-Freiburg", "Basel", "Switzerland", 7.529167, 47.59],
3951 + ["Dali", "Dali", "China", 100.319444, 25.649444],
3952 + ["Jinghong", "Jinghong", "China", 100.759611, 21.973914],
3953 + ["Mulu", "Mulu", "Malaysia", 114.805, 4.048333],
3954 + ["Sharm El Sheikh Intl", "Sharm El Sheikh", "Egypt", 34.394722, 27.977222],
3955 + ["Franklin", "Franklin", "United States", -79.860362, 41.377874],
3956 + ["Jomo Kenyatta International", "Nairobi", "Kenya", 36.9275, -1.319167],
3957 + ["Seronera", "Seronera", "Tanzania", 34.8225, -2.458056],
3958 + ["El Calafate", "El Calafate", "Argentina", -72.053103, -50.280322],
3959 + ["Armidale", "Armidale", "Australia", 151.617222, -30.528056],
3960 + ["Grand Junction Regional", "Grand Junction", "United States", -108.526735, 39.122413],
3961 + ["St George Muni", "Saint George", "United States", -113.593056, 37.090583],
3962 + ["David Wayne Hooks Field", "Houston", "United States", -95.554276, 30.063746],
3963 + ["Port O\\\\'Connor Airfield", "Port O\\\\'Connor", "United States", -96.442859, 28.429977],
3964 + ["Sarasota Bradenton Intl", "Sarasota", "United States", -82.554389, 27.395444],
3965 + ["Van Nuys", "Van Nuys", "United States", -118.489972, 34.209811],
3966 + ["Bermuda Intl", "Bermuda", "Bermuda", -64.678703, 32.364042],
3967 + ["Arthur Dunn Airpark", "Titusville", "United States", -80.83541, 28.622552],
3968 + ["Quad City Intl", "Moline", "United States", -90.507539, 41.448528],
3969 + ["Panama City Bay Co Intl", "Panama City", "United States", -85.682806, 30.212083],
3970 + ["Honiara International", "Honiara", "Solomon Islands", 160.054789, -9.428],
3971 + ["Faa\\\\'a International", "Papeete", "French Polynesia", -149.611389, -17.556667],
3972 + ["Nauru Intl", "Nauru", "Nauru", 166.9191, -0.547458],
3973 + ["Funafuti International", "Funafuti", "Tuvalu", 179.196389, -8.525],
3974 + ["Tolmachevo", "Novosibirsk", "Russia", 82.650656, 55.012622],
3975 + ["Orlando", "Orlando", "United States", -81.57, 28.398],
3976 + ["Stavns", "Samsoe", "Denmark", 10.62, 55.89],
3977 + ["Xieng Khouang", "Phon Savan", "Laos", 103.158333, 19.449997],
3978 + ["Phu Bai", "Hue", "Vietnam", 107.702614, 16.401499],
3979 + ["Bismarck Municipal Airport", "Bismarck", "United States", -100.757931, 46.775842],
3980 + ["Telluride", "Telluride", "United States", -107.90848, 37.953759],
3981 + ["Yinchuan", "Yinchuan", "China", 106.009167, 38.481944],
3982 + ["Mae Hong Son", "Mae Hong Son", "Thailand", 97.975, 19.301667],
3983 + ["Rapid City Regional Airport", "Rapid City", "United States", -103.057222, 44.045278],
3984 + ["McClellan-Palomar Airport", "Carlsbad", "United States", -117.1648, 33.0742],
3985 + ["Bishop International", "Flint", "United States", -83.743629, 42.965424],
3986 + ["Francisco Bangoy International", "Davao", "Philippines", 125.645778, 7.125522],
3987 + ["Madeira", "Funchal", "Portugal", -16.774453, 32.697889],
3988 + ["Santarem", "Santarem", "Brazil", -54.792789, -2.422431],
3989 + ["Sihanoukville", "Sihanoukville", "Cambodia", 103.636828, 10.579686],
3990 + ["Ekati", "Ekati", "Canada", -110.614722, 64.698889],
3991 + ["Napier", "NAPIER", "New Zealand", 176.87, -39.465833],
3992 + ["Levuka Airfield", "Levuka", "Fiji", 178.83333, -17.68333],
3993 + ["Lhasa-Gonggar", "Lhasa", "China", 90.911944, 29.297778],
3994 + ["Redding Muni", "Redding", "United States", -122.293389, 40.509],
3995 + ["Mahlon Sweet Fld", "Eugene", "United States", -123.211972, 44.124583],
3996 + ["Idaho Falls Rgnl", "Idaho Falls", "United States", -112.07075, 43.514556],
3997 + ["Rogue Valley Intl Medford", "Medford", "United States", -122.8735, 42.374228],
3998 + ["Kaikoura", "Kaikoura", "New Zealand", 173.68333, -42.416668],
3999 + ["Roberts Fld", "Redmond-Bend", "United States", -121.149964, 44.254066],
4000 + ["Koromiko", "Picton", "New Zealand", 173.955278, -41.348333],
4001 + ["Windhoek Hosea Kutako International Airport ", "Windhoek", "Namibia", 17.4625, -22.486667],
4002 + ["Victoria Inner Harbour Airport", "Victoria", "Canada", -123.3875, 48.422778],
4003 + ["Vancouver Coal Harbour", "Vancouver", "Canada", -123.115833, 49.289722],
4004 + ["Jinan", "Jinan", "China", 117.215992, 36.857214],
4005 + ["Changzhou", "Changzhou", "China", 119.711667, 31.941667],
4006 + ["Yibin", "Yibin", "China", 104.544444, 28.800278],
4007 + ["Roschino", "Tyumen", "Russia", 65.3243, 57.189567],
4008 + ["Akron Canton Regional Airport", "Akron", "United States", -81.4421944, 40.9160833],
4009 + ["Huntsville International Airport-Carl T Jones Field", "Huntsville", "United States", -86.7750556, 34.6371944],
4010 + ["Mid-Ohio Valley Regional Airport", "PARKERSBURG", "United States", -81.4392031, 39.3451039],
4011 + ["Montgomery Regional Airport ", "MONTGOMERY", "United States", -86.3939722, 32.3006389],
4012 + ["Tri-Cities Regional Airport", "BRISTOL", "United States", -82.4074167, 36.4752222],
4013 + ["Barkley Regional Airport", "PADUCAH", "United States", -88.7729583, 37.0602875],
4014 + ["Kurumoch", "Samara", "Russia", 50.15, 53.5],
4015 + ["Ambouli International Airport", "Djibouti", "Djibouti", 43.1594, 11.5472],
4016 + ["Meilan", "Haikou", "China", 110.458961, 19.934856],
4017 + ["Mafia", "Mafia Island", "Tanzania", 39.665, -7.913889],
4018 + ["Glacier Park Intl", "Kalispell", "United States", -114.256, 48.310472],
4019 + ["Mtemere Airstrip", "Selous", "Tanzania", 38.2032814025878, -7.75093364715576],
4020 + ["Page Municipal Airport", "Page", "United States", -111.4483, 36.9261],
4021 + ["Utila Airport", "Utila", "Honduras", -86.8875, 16.091667],
4022 + ["Santa Elena Airport", "Santa Elena de Uairen", "Venezuela", -61.144922, 4.554722],
4023 + ["Mbs Intl", "Saginaw", "United States", -84.079647, 43.532913],
4024 + ["Greater Binghamton Edwin A Link Fld", "Binghamton", "United States", -75.979839, 42.208689],
4025 + ["Baghdad International Airport", "Baghdad", "Iraq", 44.234578, 33.262539],
4026 + ["Nan", "Nan", "Thailand", 100.783419, 18.807914],
4027 + ["Roi Et", "Roi Et", "Thailand", 103.773797, 16.116761],
4028 + ["Buri Ram", "Buri Ram", "Thailand", 103.253231, 15.229539],
4029 + ["Ranong", "Ranong", "Thailand", 98.585483, 9.777622],
4030 + ["Trat", "Trat", "Thailand", 102.318958, 12.274572],
4031 + ["Blythe Airport", "Blythe", "United States", -114.716889, 33.619167],
4032 + ["Al Asad Airbase", "Al Asad", "Iraq", 42.4412, 33.785608],
4033 + ["Al Taqaddum Airbase", "Al Taqaddum", "Iraq", 43.597072, 33.338053],
4034 + ["Balad Southeast Airport", "Al Bakr", "Iraq", 44.361583, 33.940194],
4035 + ["Diosdado Macapagal International", "Angeles City", "Philippines", 120.560278, 15.185833],
4036 + ["Sandakan", "Sandakan", "Malaysia", 118.059486, 5.900897],
4037 + ["Luang Namtha", "Luang Namtha", "Laos", 101.4025, 20.960556],
4038 + ["Oudomxay", "Muang Xay", "Laos", 101.994, 20.6827],
4039 + ["Shenyang Taoxian International Airport", "Shenyang", "China", 123.2901, 41.3824],
4040 + ["Dongying Airport", "Dongying", "China", 118.2819, 37.2716],
4041 + ["John A. Osborne Airport", "Geralds", "Montserrat", -62.193333, 16.791389],
4042 + ["Petersburg James A. Johnson", "Petersburg", "United States", -132.945278, 56.801667],
4043 + ["Luoyang Airport", "Luoyang", "China", 112.28, 34.41],
4044 + ["Xuzhou Guanyin Airport", "Xuzhou", "China", 117.11, 34.16],
4045 + ["Esfahan Shahid Beheshti Intl", "Isfahan", "Iran", 51.861267, 32.750836],
4046 + ["Magwe", "Magwe", "Burma", 94.941185, 20.165453],
4047 + ["Khamti", "Khamti", "Burma", 95.674444, 25.988333],
4048 + ["Dalat", "Dalat", "Vietnam", 108.367, 11.75],
4049 + ["Dong Hoi", "Dong Hoi", "Vietnam", 106.590556, 17.515],
4050 + ["Rach Gia", "Rach Gia", "Vietnam", 105.133659, 9.949676],
4051 + ["Ca Mau", "Ca Mau", "Vietnam", 105.174721, 9.188049],
4052 + ["Chu Lai", "Chu Lai", "Vietnam", 108.705889, 15.405944],
4053 + ["Dong Tac", "Tuy Hoa", "Vietnam", 109.333706, 13.04955],
4054 + ["Pai", "Pai", "Thailand", 98.437, 19.372],
4055 + ["Brac", "Brac", "Croatia", 16.679719, 43.285719],
4056 + ["Yaounde Nsimalen", "Yaounde", "Cameroon", 11.553269, 3.722556],
4057 + ["Conakry", "Conakry", "Guinea", -13.611961, 9.576889],
4058 + ["Bergrestaurant", "Trogen", "Switzerland", 8.390315, 46.992094],
4059 + ["Uetliberg", "Zuerich", "Switzerland", 8.47805, 47.36029],
4060 + ["Flugplatz Merzbrueck", "Aachen", "Germany", 6.186389, 50.823194],
4061 + ["Baden Airpark", "Karlsruhe/Baden-Baden", "Germany", 8.08048, 48.7793],
4062 + ["Orlando Sanford Intl", "Sanford", "United States", -81.237489, 28.777639],
4063 + ["Duong Dong Airport", "Phu Quoc", "Vietnam", 103.967169, 10.227025],
4064 + ["John Murtha Johnstown-Cambria County Airport", "Johnstown", "United States", -78.833889, 40.316111],
4065 + ["Lukla", "Lukla", "Nepal", 86.731389, 27.687778],
4066 + ["Bhojpur", "Bhojpur", "Nepal", 87.050819, 27.14743],
4067 + ["Lamidanda", "Lamidanda", "Nepal", 86.670044, 27.253117],
4068 + ["Jomsom", "Jomsom", "Nepal", 83.7225, 28.782222],
4069 + ["Manang", "Manang", "Nepal", 84, 28.633],
4070 + ["Phaplu", "Phaplu", "Nepal", 86.6, 27.517],
4071 + ["Thamkharka", "Thamkharka", "Nepal", 86.861944, 27.052222],
4072 + ["Rumjatar", "Rumjatar", "Nepal", 86.55043, 27.303509],
4073 + ["Tulsipur", "Dang", "Nepal", 82.294167, 28.111111],
4074 + ["Rukumkot", "Rukumkot", "Nepal", 82.195, 28.627],
4075 + ["Jumla", "Jumla", "Nepal", 82.193333, 29.274167],
4076 + ["Chaurjhari", "Chaurjhari", "Nepal", 83.833, 28],
4077 + ["Taplejung", "Taplejung", "Nepal", 84.667, 27.35],
4078 + ["Tumling Tar", "Tumling Tar", "Nepal", 87.193333, 27.315],
4079 + ["Surkhet", "Surkhet", "Nepal", 81.636, 28.586],
4080 + ["Simikot", "Simikot", "Nepal", 81.818932, 29.971064],
4081 + ["Dolpa", "Dolpa", "Nepal", 82.819145, 28.985718],
4082 + ["Bajhang", "Bajhang", "Nepal", 81.185364, 29.53896],
4083 + ["Dhangarhi", "Dhangarhi", "Nepal", 80.581944, 28.753333],
4084 + ["Muan", "Muan", "South Korea", 126.382778, 34.991389],
4085 + ["Astypalaia", "Astypalaia", "Greece", 26.375822, 36.579886],
4086 + ["Ikaria", "Ikaria", "Greece", 26.347061, 37.682717],
4087 + ["Kalymnos Island", "Kalymnos", "Greece", 26.940556, 36.963333],
4088 + ["Milos", "Milos", "Greece", 24.4775, 36.696111],
4089 + ["Naxos", "Cyclades Islands", "Greece", 25.368056, 37.080556],
4090 + ["Paros", "Paros", "Greece", 25.127778, 37.010278],
4091 + ["Kastelorizo", "Kastelorizo", "Greece", 29.566656, 36.127777],
4092 + ["Marsa Alam Intl", "Marsa Alam", "Egypt", 34.583711, 25.557111],
4093 + ["Niederrhein", "Weeze", "Germany", 6.141944, 51.602222],
4094 + ["Busuanga", "Busuanga", "Philippines", 120.100031, 12.121458],
4095 + ["Butuan", "Butuan", "Philippines", 125.477972, 8.951322],
4096 + ["Dipolog", "Dipolog", "Philippines", 123.334481, 8.601261],
4097 + ["Laoag Intl", "Laoag", "Philippines", 120.531522, 18.178092],
4098 + ["Legazpi", "Legazpi", "Philippines", 123.746247, 13.157064],
4099 + ["Ozamis", "Ozamis", "Philippines", 123.841731, 8.178508],
4100 + ["Zweibruecken", "Zweibruecken", "Germany", 7.401323, 49.209445],
4101 + ["Mactan Cebu Intl", "Cebu", "Philippines", 123.979439, 10.307542],
4102 + ["Sonderlandeplatz Norden-Norddeich", "Norden", "Germany", 7.191389, 53.632221],
4103 + ["Verkehrslandeplatz Juist", "Juist", "Germany", 7.055731, 53.681572],
4104 + ["Aeroporto de Porto Seguro", "Porto Seguro", "Brazil", -39.080833, -16.438611],
4105 + ["Gounda Airport", "Gounda", "Central African Republic", 21.197222, 9.272222],
4106 + ["Heliport Hotel das Cataratas", "Cataratas National Park", "Brazil", -54.44024, -25.684],
4107 + ["Iguatu", "Iguatu", "Brazil", -39.293777, -6.346639],
4108 + ["Palmas", "Palmas", "Brazil", -48.35278, -10.241667],
4109 + ["Caldas Novas", "Caldas Novas", "Brazil", -48.6114, -17.7267],
4110 + ["Missoula Intl", "Missoula", "United States", -114.090556, 46.916306],
4111 + ["Blackall", "Blackall", "Australia", 145.428611, -24.427778],
4112 + ["Bundaberg", "Bundaberg", "Australia", 152.318611, -24.903889],
4113 + ["Grand Canyon National Park Airport", "Grand Canyon", "United States", -112.1469722, 35.9523611],
4114 + ["Sugar Land Regional Airport", "Sugar Land", "United States", -95.6565278, 29.62225],
4115 + ["Hayman Island Airport", "Hayman Island", "Australia", 148.86667, -20.066668],
4116 + ["Centennial", "Denver", "United States", -104.849294, 39.570129],
4117 + ["Clovis Muni", "Clovis", "United States", -103.079278, 34.425139],
4118 + ["Fort Stockton Pecos Co", "Fort Stockton", "United States", -102.916139, 30.915667],
4119 + ["Las Vegas Muni", "Las Vegas", "United States", -105.142389, 35.654222],
4120 + ["West Houston", "Houston", "United States", -95.672611, 29.818194],
4121 + ["La Junta Muni", "La Junta", "United States", -103.509431, 38.049719],
4122 + ["Las Cruces Intl", "Las Cruces", "United States", -106.921972, 32.289417],
4123 + ["Stephens Co", "Breckenridge", "United States", -98.891, 32.719047],
4124 + ["Draughon Miller Central Texas Rgnl", "Temple", "United States", -97.407778, 31.1525],
4125 + ["Ozona Muni", "Ozona", "United States", -101.202972, 30.735281],
4126 + ["Hong Kong Kai Tak", "Hong Kong", "Hong Kong", 114.195349, 22.315365],
4127 + ["Athen Helenikon Airport", "Athens", "Greece", 23.7261, 37.8933],
4128 + ["Waikoloa Heliport", "Waikoloa Village", "United States", -155.864, 19.9136],
4129 + ["Kaadedhdhoo", "Kaadedhdhoo", "Maldives", 72.995556, 0.4880555],
4130 + ["Aklavik", "Aklavik", "Canada", -135.005833, 68.223333],
4131 + ["Deline", "Deline", "Canada", -125.41666667, 65.1833333],
4132 + ["Tulita", "Tulita", "Canada", -125.5833333, 64.0833333],
4133 + ["Fort Good Hope", "Fort Good Hope", "Canada", -128.65, 66.26666667],
4134 + ["Inuvik Town", "Inuvik", "Canada", -133.7594, 66.3676],
4135 + ["INAWR", "Inuvik", "Canada", -133.7594, 68.3676],
4136 + ["Tanna island", "Tanna", "Vanuatu", 169.22394, -19.455198],
4137 + ["Sun Island", "Sun Island", "Maldives", 72.8060746192932, 3.48596289680953],
4138 + ["Paulatuk", "Paulatuk", "Canada", -124.3333, 62.35],
4139 + ["Nicholson Peninsula", "Nicholson Peninsula", "Canada", -128.95, 69.917],
4140 + ["Santa Cruz", "Santa Cruz", "Bolivia", -63.166667, -17.8],
4141 + ["Kulusuk", "Kulusuk", "Greenland", -37.1166667, 65.566667],
4142 + ["Juancho E. Yrausquin", "Saba", "Netherlands Antilles", -63.220556, 17.645278],
4143 + ["Eagle Co Rgnl", "Vail", "United States", -106.917694, 39.642556],
4144 + ["Stapleton", "Denver", "United States", -104.88184, 39.779255],
4145 + ["Skagen", "Stokmarknes", "Norway", 15.026111, 68.580833],
4146 + ["Cuyahoga County", "Richmond Heights", "United States", -81.4863555, 41.565124],
4147 + ["Mansfield Lahm Regional", "Mansfield", "United States", -82.5166389, 40.8214167],
4148 + ["Columbus Metropolitan Airport", "Columbus", "United States", -84.9388611, 32.5163333],
4149 + ["Lawton-Fort Sill Regional Airport", "Lawton", "United States", -98.4166367, 34.5677144],
4150 + ["Fort Collins Loveland Muni", "Fort Collins", "United States", -105.011336, 40.451828],
4151 + ["Gouvia Marina", "Gouvia", "Greece", 19.855771, 39.648682],
4152 + ["Paxos Marina", "Paxos", "Greece", 20.187968, 39.202676],
4153 + ["Flagstaff Pulliam Airport", "Flagstaff", "United States", -111.6692392, 35.140318],
4154 + ["Lake Tahoe Airport", "South Lake Tahoe", "United States", -119.995278, 38.893889],
4155 + ["Magic Valley Regional Airport", "Twin Falls", "United States", -114.487733, 42.481803],
4156 + ["Monaco", "Monaco", "Monaco", 7.41666666, 43.73333333],
4157 + ["Martha\\\\'s Vineyard", "Vineyard Haven MA", "United States", -70.615278, 41.391667],
4158 + ["Newport State", "Newport RI", "United States", -71.282222, 41.533056],
4159 + ["Hartness State", "Springfield VT", "United States", -72.517222, 43.343333],
4160 + ["Concord Municipal", "Concord NH", "United States", -71.50233, 43.20267],
4161 + ["Sanford Regional", "Sanford ME", "United States", -70.708, 43.39383],
4162 + ["Groton New London", "Groton CT", "United States", -72.045139, 41.330056],
4163 + ["Saint Cloud Regional Airport", "Saint Cloud", "United States", -94.059889, 45.546556],
4164 + ["Bagan", "Bagan", "Burma", 94.9246666, 21.17383327],
4165 + ["Golden Triangle Regional Airport", "Columbus Mississippi", "United States", -88.591361, 33.450333],
4166 + ["Nizhny Novgorod", "Nizhniy Novgorod", "Russia", 43.784042, 56.230119],
4167 + ["Bowerman Field", "Hoquiam", "United States", -123.9365556, 46.9711944],
4168 + ["Erie Intl Tom Ridge Fld", "Erie", "United States", -80.176217, 42.082022],
4169 + ["Conrad Maldives Resort", "Rangali Island", "Maldives", 72.7167, 3.5833],
4170 + ["Barnstable Muni Boardman Polando Fld", "Barnstable", "United States", -70.280356, 41.669336],
4171 + ["San Pedro", "San Pedro", "Belize", -87.971075, 17.913936],
4172 + ["Sedona", "Sedona", "United States", -111.788472, 34.848628],
4173 + ["Dry Tortugas", "Dry Tortugas", "United States", -82.87, 24.62],
4174 + ["Dry Tortugas", "Dry Tortugas", "United States", 24.62, 24.62],
4175 + ["Dry Tortugas", "Dry Tortugas", "United States", 82.873, 24.628],
4176 + ["Morgantown Muni Walter L Bill Hart Fld", "Morgantown", "United States", -79.916314, 39.642908],
4177 + ["Yeager", "Charleston", "United States", -81.593189, 38.373147],
4178 + ["Wilkes Barre Scranton Intl", "Scranton", "United States", -75.723403, 41.338478],
4179 + ["Bemidji Regional Airport", "Bemidji", "United States", -94.934722, 47.510722],
4180 + ["Heydar Aliyev", "Baku", "Azerbaijan", 50.046667, 40.4675],
4181 + ["Thangool", "Biloela", "Australia", 150.576111, -24.493889],
4182 + ["Fagali\\\\'i", "Apia", "Samoa", -171.74083333, -13.84861111],
4183 + ["Ballina Byron Gateway", "Ballina Byron Bay", "Australia", 153.5625, -28.833889],
4184 + ["Hector International Airport", "Fargo", "United States", -96.8157639, 46.92065],
4185 + ["Downtown", "Kansas City", "United States", -94.598889, 39.1275],
4186 + ["Phoenix-Mesa Gateway", "Mesa", "United States", -111.655, 33.307833],
4187 + ["Ratanakiri", "Ratanakiri", "Cambodia", 106.987, 13.73],
4188 + ["Gillette-Campbell County Airport", "Gillette", "United States", -105.5393611, 44.3489167],
4189 + ["Tomsk Bogashevo Airport", "Tomsk", "Russia", 85.208333, 56.380278],
4190 + ["El Toro", "Santa Ana", "United States", -117.731164, 33.676132],
4191 + ["Phetchabun", "Phetchabun", "Thailand", 101.195108, 16.676028],
4192 + ["Chumphon", "Chumphon", "Thailand", 99.361706, 10.7112],
4193 + ["Jiuzhaigou Huanglong", "Jiuzhaigou", "China", 103.683, 32.857],
4194 + ["Wai Sha Airport", "Shantou", "China", 116.683, 23.4],
4195 + ["Les Ailerons", "Enghien-moisselles", "France", 0, 0],
4196 + ["Cheddi Jagan Intl", "Georgetown", "Guyana", -58.254119, 6.498553],
4197 + ["Ciudad del Este", "Ciudad del Este", "Paraguay", -54.843592, -25.4555],
4198 + ["Ogle", "Georgetown", "Guyana", -58.104444, 6.806944],
4199 + ["Kaieteur", "Kaieteur", "Guyana", -59.483, 5.167],
4200 + ["Dunhuang Airport", "Dunhuang", "China", 94.4818, 40.094],
4201 + ["Falconara", "Ancona", "Italy", 13.362222, 43.616389],
4202 + ["Samjiyon", "Samjiyon", "South Korea", 128.243571, 41.542301],
4203 + ["Iosco County", "East Tawas", "United States", -83.422, 44.311],
4204 + ["Copiapo", "Copiapo", "Chile", -70, -27],
4205 + ["Taba Intl", "Taba", "Egypt", 34.778056, 29.587778],
4206 + ["Edward Bodden Airfield", "Little Cayman", "Cayman Islands", -80.09083333, 19.6591666667],
4207 + ["Bodrum - Milas", "Bodrum", "Turkey", 27.667, 37.249],
4208 + ["7 Novembre", "Tabarka", "Tunisia", 8.876389, 36.978333],
4209 + ["Sabiha Gokcen", "Istanbul", "Turkey", 29.309219, 40.898553],
4210 + ["University Park Airport", "State College Pennsylvania", "United States", -77.848694, 40.849278],
4211 + ["Broome", "Broome", "Australia", 122.2, -17.8],
4212 + ["Newcastle Airport", "Newcastle", "Australia", 151.83, -32.78],
4213 + ["Bakki Airport", "Bakki", "Iceland", -20.14833, 63.55805],
4214 + ["Woerthersee International Airport", "Klagenfurt", "Austria", 14.337739, 46.642514],
4215 + ["General Manuel Carlos Piar", "Ciudad Guayana", "Venezuela", -62.760361, 8.288527],
4216 + ["Flugplatz Hoepen", "Schneverdingen", "Germany", 9.8, 53.1167],
4217 + ["Hammerfest Airport", "Hammerfest", "Norway", 23.668889, 70.679722],
4218 + ["Valan", "Honningsvag", "Norway", 25.83, 70.99],
4219 + ["Mehamn", "Mehamn", "Norway", 27.826667, 71.029722],
4220 + ["Airport", "Vadso", "Norway", 29.844, 70.065],
4221 + ["Riem", "Munich", "Germany", 11.690278, 48.137778],
4222 + ["Imam Khomeini", "Tehran", "Iran", 51.152222, 35.416111],
4223 + ["Mashhad", "Mashhad", "Iran", 59.643, 36.234],
4224 + ["Egelsbach", "Egelsbach", "Germany", 8.64361, 49.9608],
4225 + ["Ust-Ilimsk", "Ust Ilimsk", "Russia", 102.566, 58.135],
4226 + ["Mudanjiang", "Mudanjiang", "China", 129.568889, 44.523889],
4227 + ["Key Field", "Meridian", "United States", -88.751868, 32.332624],
4228 + ["Abraham Lincoln Capital", "Springfield", "United States", -89.677889, 39.8441],
4229 + ["Uzundzhovo", "Haskovo", "Bulgaria", 25.589817, 41.976375],
4230 + ["Cortez Muni", "Cortez", "United States", -108.628056, 37.303],
4231 + ["Yampa Valley", "Hayden", "United States", -107.21766, 40.481181],
4232 + ["Gallup Muni", "Gallup", "United States", -108.789308, 35.511058],
4233 + ["Liberal Muni", "Liberal", "United States", -100.95986, 37.044222],
4234 + ["Lamar Muni", "Lamar", "United States", -102.6885, 38.069694],
4235 + ["Renner Fld", "Goodland", "United States", -101.698992, 39.370621],
4236 + ["Yellowstone Rgnl", "Cody", "United States", -109.023806, 44.520194],
4237 + ["Hovden", "Orsta-Volda", "Norway", 6.0742, 62.18],
4238 + ["RNAS WATTON", "WATTON", "United Kingdom", 0.51, 52.33],
4239 + ["ISLES OF SCILLY", "ST MARY\\\\'S", "United Kingdom", -6.3075, 49.919],
4240 + ["Springfield Branson Natl", "Springfield", "United States", -93.388639, 37.245667],
4241 + ["Framnes", "Narvik", "Norway", 17.388056, 68.435833],
4242 + ["Berlevag", "Berlevag", "Norway", 29, 70.866667],
4243 + ["Fornebu", "Oslo", "Norway", 10.616667, 59.883333],
4244 + ["Alykel", "Norilsk", "Russia", 87.332183, 69.311053],
4245 + ["Vityazevo", "Anapa", "Russia", 37.347272, 45.002097],
4246 + ["Joplin Rgnl", "Joplin", "United States", -94.498269, 37.151814],
4247 + ["Lehigh Valley Intl", "Allentown", "United States", -75.440806, 40.652083],
4248 + ["NW Arkansas Regional", "Bentonville", "United States", -94.3068111, 36.2818694],
4249 + ["Atyrau", "Atyrau", "Kazakhstan", 51.821389, 47.121944],
4250 + ["Kzyl-Orda", "Kzyl-Orda", "Kazakhstan", 65.591, 44.709],
4251 + ["South Bend Rgnl", "South Bend", "United States", -86.31725, 41.708661],
4252 + ["Bykovo", "Moscow", "Russia", 38.059999, 55.617222],
4253 + ["Chintheche", "Chintheche", "Malawi", 34.1667, -11.8333],
4254 + ["Talagi", "Arkhangelsk", "Russia", 40.430167, 64.360281],
4255 + ["Central", "Saratov", "Russia", 46.022952, 51.334366],
4256 + ["Novyi Urengoy", "Novy Urengoy", "Russia", 76.313938, 66.041811],
4257 + ["Noyabrsk", "Noyabrsk", "Russia", 75.162243, 63.110079],
4258 + ["Washington Union Station", "Washington", "United States", -77.00643, 38.89746],
4259 + ["Aktau", "Aktau", "Kazakhstan", 51.091978, 43.86005],
4260 + ["Ukhta", "Ukhta", "Russia", 53.482592, 63.340297],
4261 + ["Usinsk", "Usinsk", "Russia", 57.221113, 66.00077],
4262 + ["Pechora", "Pechora", "Russia", 57.082045, 65.070387],
4263 + ["Naryan-Mar", "Naryan-Mar", "Russia", 53.051016, 67.380537],
4264 + ["Kresty", "Pskov", "Russia", 28.395614, 57.783917],
4265 + ["Kogalym International", "Kogalym", "Russia", 74.53, 62.18],
4266 + ["Emelyanovo", "Krasnoyarsk", "Russia", 92.475, 56.18],
4267 + ["Sary-Arka", "Karaganda", "Kazakhstan", 73.334444, 49.670833],
4268 + ["Severny", "Novosibirsk", "Russia", 82.9, 55.1],
4269 + ["Uraj", "Uraj", "Russia", 64.83, 60.1],
4270 + ["Turkmenabat", "Turkmenabat", "Turkmenistan", 63.602222, 39.083333],
4271 + ["Yuzhny", "Ivanovo", "Russia", 40.940833, 56.939444],
4272 + ["Changchun", "Changchun", "China", 125.1201, 43.5412],
4273 + ["Niigata", "Niigata", "Japan", 139.0646, 37.5711],
4274 + ["Johnston Atoll", "Johnston Island", "Johnston Atoll", -169.534, 16.7286],
4275 + ["Smith Fld", "Fort Wayne IN", "United States", -85.152778, 41.143353],
4276 + ["Arcata", "Arcata CA", "United States", -124.108611, 40.978111],
4277 + ["Camp Mabry Austin City", "Austin TX", "United States", -97.7666, 30.31666],
4278 + ["Albert J Ellis", "Jacksonville NC", "United States", -77.612139, 34.829164],
4279 + ["Tuscaloosa Rgnl", "Tuscaloosa AL", "United States", -87.611403, 33.220627],
4280 + ["Dubuque Rgnl", "Dubuque IA", "United States", -90.709472, 42.402],
4281 + ["Forde Bringeland", "Forde", "Norway", 5.763, 61.392],
4282 + ["Shun Tak Heliport", "Hong Kong", "Hong Kong", 114.152153, 22.289372],
4283 + ["Poliarny Airport", "Yakutia", "Russia", 112.030325, 66.400431],
4284 + ["Nakhchivan Airport", "Nakhchivan", "Azerbaijan", 45.4584, 39.1888],
4285 + ["Ganja Airport", "Ganja", "Azerbaijan", 46.3176, 40.7377],
4286 + ["Torp", "Sandefjord", "Norway", 10.258628, 59.186703],
4287 + ["Ust Kamenogorsk Airport", "Ust Kamenogorsk", "Kazakhstan", 82.4942, 50.0366],
4288 + ["Petropavlosk South Airport", "Petropavlosk", "Kazakhstan", 69.1839, 54.7747],
4289 + ["Les Bases Airport", "Grand Bourg", "Guadeloupe", -61.270022, 15.86875],
4290 + ["St-François Airport", "St-François", "Guadeloupe", -61.2625, 16.2578],
4291 + ["Codrington Airport", "Codrington", "Antigua and Barbuda", -61.8286, 17.6358],
4292 + ["Ji-Paraná Airport", "Ji-Paraná", "Brazil", -61.8465, -10.8708],
4293 + ["Escuela Mariscal Sucre Airport", "Maracay", "Venezuela", -67.649419, 10.249978],
4294 + ["Maria Reiche Neuman Airport", "Nazca", "Peru", -74.961811, -14.854192],
4295 + ["Mayor General FAP Armando Revoredo Iglesias Airport", "Cajamarca", "Peru", -78.4894, -7.139183],
4296 + ["Gatokae Airport", "Gatokae", "Solomon Islands", 158.2, -8.75],
4297 + ["Boorama Airport", "Boorama", "Somalia", 43.15, 9.933],
4298 + ["Mucuri Airport", "Mucuri", "Brazil", -39.8642, -18.0489],
4299 + ["Zorg en Hoop Airport", "Paramaribo", "Suriname", -55.1907, 5.81108],
4300 + ["Reyes Airport", "Reyes", "Bolivia", -67.3534, -14.3044],
4301 + ["Puerto Rico Airport", "Puerto Rico/Manuripi", "Bolivia", -67.5512, -11.1077],
4302 + ["El Alcaraván Airport", "Yopal", "Colombia", -72.383975, 5.319114],
4303 + ["General Rivadeneira Airport", "Esmeraldas", "Ecuador", -79.6266, 0.978519],
4304 + ["Pucón Airport", "Pucon", "Chile", -71.9159, -39.2928],
4305 + ["Toledo Airport", "Toledo", "Brazil", -53.6975, -24.6863],
4306 + ["Santa Maria Airport", "Santa Maria", "Brazil", -53.688153, -29.711358],
4307 + ["Chapada Diamantina Airport", "Lençóis", "Brazil", -41.277, -12.4823],
4308 + ["Goulburn Airport", "Goulburn", "Australia", 149.726, -34.8103],
4309 + ["Orlando Bezerra de Menezes Airport", "Juazeiro Do Norte", "Brazil", -39.2701, -7.218958],
4310 + ["Santa Teresita Airport", "Santa Teresita", "Argentina", -56.721756, -36.542317],
4311 + ["Gobernador Gregores Airport", "Gobernador Gregores", "Argentina", -70.15, -48.7831],
4312 + ["Antoine De St Exupery Airport", "San Antonio Oeste", "Argentina", -65.0343, -40.7512],
4313 + ["Las Heras Airport", "Las Heras", "Argentina", -68.951111, -46.533056],
4314 + ["General Enrique Mosconi Airport", "Tartagal", "Argentina", -63.793189, -22.619167],
4315 + ["Masbate Airport", "Masbate", "Philippines", 123.629, 12.3694],
4316 + ["Catarman National Airport", "Catarman", "Philippines", 124.635778, 12.502417],
4317 + ["Jolo Airport", "Jolo", "Philippines", 121.011, 6.05367],
4318 + ["Camiguin Airport", "Camiguin", "Philippines", 124.707, 9.25352],
4319 + ["Cuyo Airport", "Cuyo", "Philippines", 121.069, 10.8581],
4320 + ["Cheongju International Airport", "Chongju", "South Korea", 127.499119, 36.7166],
4321 + ["Sacheon Air Base", "Sacheon", "South Korea", 128.07037, 35.088543],
4322 + ["Wonju Airport", "Wonju", "South Korea", 127.960383, 37.438081],
4323 + ["Mokpo Airport", "Mokpo", "South Korea", 126.379872, 34.758906],
4324 + ["Kunsan Air Base", "Kunsan", "South Korea", 126.615906, 35.903756],
4325 + ["Miyakejima Airport", "Miyakejima", "Japan", 139.56, 34.0736],
4326 + ["Shonai Airport", "Shonai", "Japan", 139.787222, 38.812222],
4327 + ["Odate Noshiro Airport", "Odate Noshiro", "Japan", 140.371, 40.1919],
4328 + ["Fukushima Airport", "Fukushima", "Japan", 140.431, 37.2274],
4329 + ["Iwami Airport", "Iwami", "Japan", 131.79, 34.6764],
4330 + ["Nagoya Airport", "Nagoya", "Japan", 136.924, 35.255],
4331 + ["Saga Airport", "Saga", "Japan", 130.302, 33.1497],
4332 + ["Okadama Airport", "Sapporo", "Japan", 141.38, 43.1161],
4333 + ["Kushiro Airport", "Kushiro", "Japan", 144.193, 43.041],
4334 + ["Matsu Beigan Airport", "Matsu Islands", "Taiwan", 120.00275, 26.224153],
4335 + ["Hengchun Airport", "Hengchun", "Taiwan", 120.730208, 22.041075],
4336 + ["Matsu Nangan Airport", "Matsu Islands", "Taiwan", 119.958, 26.1598],
4337 + ["Eniwetok Airport", "Eniwetok Atoll", "Marshall Islands", 162.327861, 11.34075],
4338 + ["Kalaupapa Airport", "Molokai", "United States", -156.974, 21.211],
4339 + ["El Nido Airport", "El Nido", "Philippines", 119.417, 11.202],
4340 + ["Wipim Airport", "Wipim", "Papua New Guinea", 142.882, -8.78822],
4341 + ["Baimuru Airport", "Baimuru", "Papua New Guinea", 144.82, -7.49686],
4342 + ["Nuku Airport", "Nuku", "Papua New Guinea", 142.483, -3.667],
4343 + ["Tufi Airport", "Tufi", "Papua New Guinea", 149.32, -9.07595],
4344 + ["Suki Airport", "Suki", "Papua New Guinea", 141.717, -8.033],
4345 + ["Balimo Airport", "Balimo", "Papua New Guinea", 142.933, -8.05],
4346 + ["Obo Airport", "Obo", "Papua New Guinea", 141.317, -7.583],
4347 + ["Losuia Airport", "Losuia", "Papua New Guinea", 151.081, -8.50582],
4348 + ["Londolovit Airport", "Londolovit", "Papua New Guinea", 152.629, -3.04361],
4349 + ["Lake Murray Airport", "Lake Murray", "Papua New Guinea", 141.494, -7.00992],
4350 + ["Kamusi Airport", "Kamusi", "Papua New Guinea", 143.122, -7.42035],
4351 + ["Kokoda Airport", "Kokoda", "Papua New Guinea", 147.731, -8.88468],
4352 + ["Kandrian Airport", "Kandrian", "Papua New Guinea", 149.533, -6.183],
4353 + ["Jacquinot Bay Airport", "Jacquinot Bay", "Papua New Guinea", 151.507, -5.6525],
4354 + ["Nissan Island Airport", "Nissan Island", "Papua New Guinea", 154.226, -4.49972],
4355 + ["Ihu Airport", "Ihu", "Papua New Guinea", 145.396, -7.89756],
4356 + ["Gasmata Island Airport", "Gasmata Island", "Papua New Guinea", 150.331, -6.27111],
4357 + ["Tadji Airport", "Aitape", "Papua New Guinea", 142.43, -3.18985],
4358 + ["Wrangell Airport", "Wrangell", "United States", -132.37, 56.4843],
4359 + ["Chevak Airport", "Chevak", "United States", -165.584, 61.5338],
4360 + ["Aniak Airport", "Aniak", "United States", -159.543, 61.5816],
4361 + ["Mountain Village Airport", "Mountain Village", "United States", -163.682, 62.0954],
4362 + ["McGrath Airport", "Mcgrath", "United States", -155.606, 62.9529],
4363 + ["Kalskag Airport", "Kalskag", "United States", -160.341, 61.5363],
4364 + ["Haines Airport", "Haines", "United States", -135.524, 59.2438],
4365 + ["Holy Cross Airport", "Holy Cross", "United States", -159.775, 62.1883],
4366 + ["Skagway Airport", "Skagway", "United States", -135.316, 59.4601],
4367 + ["Gustavus Airport", "Gustavus", "United States", -135.707, 58.4253],
4368 + ["Adak Airport", "Adak Island", "United States", -176.646, 51.878],
4369 + ["Sambu Airport", "Boca de Sábalo", "Panama", -78.2, 8.017],
4370 + ["Contadora Airport", "Contadora Island", "Panama", -79.0347, 8.62876],
4371 + ["EL Real Airport", "El Real", "Panama", -77.7, 8.133],
4372 + ["Bahia Piña Airport", "Bahia Piña", "Panama", -78.2, 7.583],
4373 + ["Sayun International Airport", "Sayun Intl", "Yemen", 48.7883, 15.966111],
4374 + ["Kamishly Airport", "Kamishly", "Syria", 41.191394, 37.020625],
4375 + ["Sulaymaniyah International Airport", "Sulaymaniyah", "Iraq", 45.3147, 35.5608],
4376 + ["Turbat International Airport", "Turbat", "Pakistan", 63.030167, 25.986369],
4377 + ["Sehwan Sharif Airport", "Sehwan Sharif", "Pakistan", 67.7172, 26.4731],
4378 + ["Skardu Airport", "Skardu", "Pakistan", 75.536047, 35.335508],
4379 + ["Parachinar Airport", "Parachinar", "Pakistan", 70.0716, 33.9021],
4380 + ["Ormara Airport", "Ormara Raik", "Pakistan", 64.586, 25.2747],
4381 + ["Khuzdar Airport", "Khuzdar", "Pakistan", 66.6473, 27.7906],
4382 + ["Hyderabad Airport", "Hyderabad", "Pakistan", 68.3661, 25.3181],
4383 + ["Jiwani Airport", "Jiwani", "Pakistan", 61.8054, 25.0678],
4384 + ["Dera Ismael Khan Airport", "Dera Ismael Khan", "Pakistan", 70.896639, 31.909422],
4385 + ["Dera Ghazi Khan Airport", "Dera Ghazi Khan", "Pakistan", 70.485925, 29.961011],
4386 + ["Dalbandin Airport", "Dalbandin", "Pakistan", 64.3998, 28.8783],
4387 + ["Chitral Airport", "Chitral", "Pakistan", 71.800578, 35.886592],
4388 + ["Bahawalpur Airport", "Bahawalpur", "Pakistan", 71.717981, 29.3481],
4389 + ["Bannu Airport", "Bannu", "Pakistan", 70.5279, 32.9729],
4390 + ["Al Ain International Airport", "Al Ain", "United Arab Emirates", 55.609167, 24.261667],
4391 + ["Uromiyeh Airport", "Uromiyeh", "Iran", 45.0687, 37.6681],
4392 + ["Ardabil Airport", "Ardabil", "Iran", 48.424356, 38.325678],
4393 + ["Lar Airport", "Lar", "Iran", 54.383278, 27.674725],
4394 + ["Sari Dasht E Naz Airport", "Dasht-e-naz", "Iran", 53.193611, 36.635833],
4395 + ["Noshahr Airport", "Noshahr", "Iran", 51.464722, 36.663333],
4396 + ["Sabzevar National Airport", "Sabzevar", "Iran", 57.595183, 36.168083],
4397 + ["Bojnourd Airport", "Bojnourd", "Iran", 57.308219, 37.492958],
4398 + ["Rafsanjan Airport", "Rafsanjan", "Iran", 56.051139, 30.297714],
4399 + ["Bam Airport", "Bam", "Iran", 58.450042, 29.084169],
4400 + ["Khoram Abad Airport", "Khorram Abad", "Iran", 48.282889, 33.435378],
4401 + ["Wadi Al Dawasir Airport", "Wadi-al-dawasir", "Saudi Arabia", 45.199556, 20.504275],
4402 + ["Al-Jawf Domestic Airport", "Al-Jawf", "Saudi Arabia", 40.100006, 29.785133],
4403 + ["Dawadmi Domestic Airport", "Dawadmi", "Saudi Arabia", 44.4, 24.5],
4404 + ["Saul Airport", "Saul", "French Guiana", -53.2042, 3.61361],
4405 + ["Faizabad Airport", "Faizabad", "Afghanistan", 70.5181, 37.1211],
4406 + ["Île des Pins Airport", "Île des Pins", "New Caledonia", 167.456, -22.5889],
4407 + ["Belep Islands Airport", "Waala", "New Caledonia", 163.661, -19.7206],
4408 + ["Tiga Airport", "Tiga", "New Caledonia", 167.804, -21.0961],
4409 + ["Ipota Airport", "Ipota", "Vanuatu", 169.308, -18.8783],
4410 + ["Futuna Airport", "Futuna Island", "Vanuatu", 170.232, -19.5164],
4411 + ["Dillon's Bay Airport", "Dillon's Bay", "Vanuatu", 169.001, -18.7694],
4412 + ["Aniwa Airport", "Aniwa", "Vanuatu", 169.605, -19.24],
4413 + ["Anelghowhat Airport", "Anelghowhat", "Vanuatu", 169.771, -20.2492],
4414 + ["North West Santo Airport", "Olpoi", "Vanuatu", 166.558, -14.8817],
4415 + ["Southwest Bay Airport", "Malekula Island", "Vanuatu", 167.438, -16.495],
4416 + ["Valesdir Airport", "Valesdir", "Vanuatu", 168.177, -16.7961],
4417 + ["Uléi Airport", "Ambryn Island", "Vanuatu", 168.283, -16.333],
4418 + ["Tongoa Island Airport", "Tongoa Island", "Vanuatu", 168.551, -16.8911],
4419 + ["Santo Pekoa International Airport", "Santo", "Vanuatu", 167.219742, -15.505033],
4420 + ["Redcliffe Airport", "Redcliffe", "Vanuatu", 167.835, -15.472],
4421 + ["Gaua Island Airport", "Gaua Island", "Vanuatu", 167.587, -14.2181],
4422 + ["Norsup Airport", "Norsup", "Vanuatu", 167.401, -16.0797],
4423 + ["Lonorore Airport", "Lonorore", "Vanuatu", 168.172, -15.8656],
4424 + ["Naone Airport", "Maewo Island", "Vanuatu", 168.083, -15],
4425 + ["Lamen Bay Airport", "Lamen Bay", "Vanuatu", 168.159, -16.5842],
4426 + ["Lamap Airport", "Lamap", "Vanuatu", 167.823, -16.454],
4427 + ["Tavie Airport", "Paama Island", "Vanuatu", 168.257, -16.439],
4428 + ["Sara Airport", "Pentecost Island", "Vanuatu", 168.152, -15.4708],
4429 + ["Longana Airport", "Longana", "Vanuatu", 167.967, -15.3067],
4430 + ["Craig Cove Airport", "Craig Cove", "Vanuatu", 167.924, -16.265],
4431 + ["Sangafa Airport", "Sangafa", "Vanuatu", 168.343, -17.0903],
4432 + ["Torres Airstrip", "Loh/Linua", "Vanuatu", 166.638, -13.328],
4433 + ["Sola Airport", "Sola", "Vanuatu", 167.537, -13.8517],
4434 + ["Mota Lava Airport", "Ablow", "Vanuatu", 167.712, -13.666],
4435 + ["Ua Huka Airport", "Ua Huka", "French Polynesia", -139.552, -8.93611],
4436 + ["Ua Pou Airport", "Ua Pou", "French Polynesia", -140.078, -9.35167],
4437 + ["Hiva Oa-Atuona Airport", "Hiva-oa", "French Polynesia", -139.011256, -9.768794],
4438 + ["Ahe Airport", "Ahe", "French Polynesia", -146.257, -14.4281],
4439 + ["Apataki Airport", "Apataki", "French Polynesia", -146.415, -15.5736],
4440 + ["Maota Airport", "Savaii Island", "Samoa", -172.3, -13.733],
4441 + ["Mountain Airport", "Mountain", "Nepal", 85.333, 28],
4442 + ["Pointe Vele Airport", "Futuna Island", "Wallis and Futuna", -178.066, -14.3114],
4443 + ["Niue International Airport", "Alofi", "Niue", -169.925639, -19.080028],
4444 + ["Vanua Balavu Airport", "Vanua Balavu", "Fiji", -178.976, -17.269],
4445 + ["Kuini Lavenia Airport", "Niuatoputapu", "Tonga", -173.755, -15.9767],
4446 + ["Mata'aho Airport", "Angaha", " Niuafo'ou Island", -15.5708, null],
4447 + ["Lifuka Island Airport", "Lifuka", "Tonga", -174.341, -19.777],
4448 + ["Kaufana Airport", "Eua Island", "Tonga", -174.958, -21.3783],
4449 + ["Savusavu Airport", "Savusavu", "Fiji", 179.341, -16.8028],
4450 + ["Rotuma Airport", "Rotuma", "Fiji", 177.071, -12.4825],
4451 + ["Koro Island Airport", "Koro Island", "Fiji", 179.422, -17.3458],
4452 + ["Matei Airport", "Matei", "Fiji", -179.877, -16.6906],
4453 + ["Labasa Airport", "Lambasa", "Fiji", 179.33986, -16.466749],
4454 + ["Lakeba Island Airport", "Lakeba Island", "Fiji", -178.817, -18.1992],
4455 + ["Ngau Airport", "Ngau", "Fiji", 179.34, -18.1156],
4456 + ["Moala Airport", "Moala", "Fiji", 179.951, -18.5667],
4457 + ["Mana Island Airport", "Mana Island", "Fiji", 177.098, -17.6731],
4458 + ["Vunisea Airport", "Vunisea", "Fiji", 178.157, -19.0581],
4459 + ["Malolo Lailai Island Airport", "Malolo Lailai Island", "Fiji", 177.197, -17.7779],
4460 + ["Cicia Airport", "Cicia", "Fiji", -179.342, -17.7433],
4461 + ["Penrhyn Island Airport", "Penrhyn Island", "Cook Islands", -158.037, -9.00667],
4462 + ["Mitiaro Island Airport", "Mitiaro Island", "Cook Islands", -157.703, -19.8425],
4463 + ["Mauke Airport", "Mauke Island", "Cook Islands", -157.345, -20.1361],
4464 + ["Manihiki Island Airport", "Manihiki Island", "Cook Islands", -161.002, -10.3767],
4465 + ["Mangaia Island Airport", "Mangaia Island", "Cook Islands", -157.905, -21.8956],
4466 + ["Atiu Island Airport", "Atiu Island", "Cook Islands", -158.119, -19.9678],
4467 + ["Nassau Paradise Island Airport", "Nassau", "Bahamas", -77.3, 25.083],
4468 + ["Colonel Hill Airport", "Colonel Hill", "Bahamas", -74.182353, 22.745561],
4469 + ["New Bight Airport", "Cat Island", "Bahamas", -75.452331, 24.315292],
4470 + ["Arthurs Town Airport", "Arthur's Town", "Bahamas", -75.673775, 24.629417],
4471 + ["Congo Town Airport", "Andros", "Bahamas", -77.589758, 24.158933],
4472 + ["Long Banga Airport", "Long Banga", "Malaysia", 115.454, 3.18495],
4473 + ["Salina Cruz Naval Air Station", "Salina Cruz", "Mexico", -95.2016, 16.2126],
4474 + ["Alberto Delgado Airport", "Trinidad", "Cuba", -79.997203, 21.788461],
4475 + ["Cayo Coco Airport", "Cayo Coco", "Cuba", -78.511, 22.5132],
4476 + ["Port-de-Paix Airport", "Port-de-Paix", "Haiti", -72.8486, 19.9336],
4477 + ["Jeremie Airport", "Jeremie", "Haiti", -74.1703, 18.6631],
4478 + ["Playa Samara Airport", "Playa Samara", "Costa Rica", -85.417, 10.25],
4479 + ["Tobias Bolanos International Airport", "San Jose", "Costa Rica", -84.139797, 9.957053],
4480 + ["Puerto Jimenez Airport", "Puerto Jimenez", "Costa Rica", -83.3, 8.53333],
4481 + ["Islita Airport", "Nandayure", "Costa Rica", -85.3708, 9.85611],
4482 + ["Cabo Velas Airport", "Nicoya", "Costa Rica", -85.852892, 10.3557],
4483 + ["Barra del Colorado Airport", "Pococi", "Costa Rica", -83.585614, 10.768736],
4484 + ["Aerotortuguero Airport", "Roxana", "Costa Rica", -83.5148, 10.569],
4485 + ["Captain Ramon Xatruch Airport", "La Palma", "Panama", -78.1417, 8.40667],
4486 + ["Jaqué Airport", "Jaqué", "Panama", -78.1572, 7.51778],
4487 + ["Enrique Adolfo Jimenez Airport", "Colón", "Panama", -79.8674, 9.35664],
4488 + ["Alonso Valderrama Airport", "Chitré", "Panama", -80.4097, 7.98784],
4489 + ["Lencero Airport", "Jalapa", "Mexico", -96.797506, 19.475083],
4490 + ["Guerrero Negro Airport", "Guerrero Negro", "Mexico", -114.024, 28.0261],
4491 + ["Ciudad Constitución Airport", "Ciudad Constitución", "Mexico", -111.615, 25.0538],
4492 + ["Captain Rogelio Castillo National Airport", "Celaya", "Mexico", -100.88655, 20.545994],
4493 + ["Mili Island Airport", "Mili Island", "Marshall Islands", 171.733, 6.08333],
4494 + ["Puerto Lempira Airport", "Puerto Lempira", "Honduras", -83.7812, 15.2622],
4495 + ["Ahuas Airport", "Ahuas", "Honduras", -84.3522, 15.4722],
4496 + ["Wotho Island Airport", "Wotho Island", "Marshall Islands", 166.003, 10.1733],
4497 + ["Wotje Atoll Airport", "Wotje Atoll", "Marshall Islands", 170.233, 9.46667],
4498 + ["Woja Airport", "Majuro Atoll", "Marshall Islands", 171.133, 7.083],
4499 + ["Jaluit Airport", "Jabor Jaluit Atoll", "Marshall Islands", 169.637, 5.90924],
4500 + ["Rongelap Island Airport", "Rongelap Island", "Marshall Islands", 166.887, 11.1572],
4501 + ["Namorik Atoll Airport", "Namorik Atoll", "Marshall Islands", 168.125, 5.63167],
4502 + ["Majkin Airport", "Majkin", "Marshall Islands", 168.167, 7.833],
4503 + ["Mejit Atoll Airport", "Mejit Atoll", "Marshall Islands", 170.883, 10.2833],
4504 + ["Maloelap Island Airport", "Maloelap Island", "Marshall Islands", 171.23, 8.70444],
4505 + ["Likiep Airport", "Likiep Island", "Marshall Islands", 169.308, 9.82316],
4506 + ["Kaben Airport", "Kaben", "Marshall Islands", 170.844, 8.90056],
4507 + ["Jeh Airport", "Ailinglapalap Atoll", "Marshall Islands", 168.962, 7.56535],
4508 + ["Jabot Airport", "Ailinglapalap Atoll", "Marshall Islands", 168.552, 7.45235],
4509 + ["Enyu Airfield", "Bikini Atoll", "Marshall Islands", 165.565, 11.5225],
4510 + ["Aur Island Airport", "Aur Atoll", "Marshall Islands", 171.173, 8.14528],
4511 + ["Ailuk Airport", "Ailuk Island", "Marshall Islands", 169.983, 10.2168],
4512 + ["Utirik Airport", "Utirik Island", "Marshall Islands", 169.852, 11.222],
4513 + ["Quezaltenango Airport", "Quezaltenango", "Guatemala", -91.502, 14.8656],
4514 + ["Puerto Barrios Airport", "Puerto Barrios", "Guatemala", -88.583767, 15.730878],
4515 + ["Dr Joaquin Balaguer International Airport", "La Isabela", "Dominican Republic", -69.9856, 18.5725],
4516 + ["Samaná El Catey International Airport", "Samana", "Dominican Republic", -69.742, 19.267],
4517 + ["Salt Cay Airport", "Salt Cay", "Turks and Caicos Islands", -71.2, 21.333],
4518 + ["Middle Caicos Airport", "Middle Caicos", "Turks and Caicos Islands", -71.817, 21.833],
4519 + ["JAGS McCartney International Airport", "Cockburn Town", "Turks and Caicos Islands", -71.1423, 21.4445],
4520 + ["Žilina Airport", "Žilina", "Slovakia", 18.6135, 49.231528],
4521 + ["Ubari Airport", "Ubari", "Libya", 12.8231, 26.5675],
4522 + ["Misratah Airport", "Misratah", "Libya", 15.061, 32.325],
4523 + ["Samsun-Çarşamba Airport", "Samsun", "Turkey", 36.5671, 41.2545],
4524 + ["Balikesir Korfez Airport", "Balikesir Korfez", "Turkey", 27.0138, 39.5546],
4525 + ["Isparta Süleyman Demirel Airport", "Isparta", "Turkey", 30.3684, 37.8554],
4526 + ["Adiyaman Airport", "Adiyaman", "Turkey", 38.4689, 37.7314],
4527 + ["Agri Airport", "Agri", "Turkey", 43.0271, 39.6546],
4528 + ["Kahramanmaras Airport", "Kahramanmaras", "Turkey", 36.9534, 37.539],
4529 + ["Sanliurfa Airport", "Sanliurfa", "Turkey", 38.847103, 37.094261],
4530 + ["Kars Airport", "Kars", "Turkey", 43.115002, 40.562222],
4531 + ["Usak Airport", "Usak", "Turkey", 29.471675, 38.681478],
4532 + ["Banja Luka International Airport", "Banja Luka", "Bosnia and Herzegovina", 17.297501, 44.941444],
4533 + ["Corvo Airport", "Corvo", "Portugal", -31.1136, 39.6715],
4534 + ["Salerno Pontecagnano Airport", "Salerno", "Italy", 14.911294, 40.6204],
4535 + ["Aosta Airport", "Aosta", "Italy", 7.368719, 45.738456],
4536 + ["Sármellék International Airport", "Sármellék", "Hungary", 17.159056, 46.686389],
4537 + ["Győr-Pér International Airport", "Győr", "Hungary", 17.808347, 47.627097],
4538 + ["Pécs-Pogány Airport", "Pécs-Pogány", "Hungary", 18.240983, 45.990928],
4539 + ["Syros Airport", "Syros Island", "Greece", 24.950936, 37.422792],
4540 + ["La Môle Airport", "La Môle", "France", 6.482, 43.2054],
4541 + ["EuroAirport", "Mulhouse", "France", 7.529914, 47.589583],
4542 + ["Tekapo", "Lake Tekapo", "New Zealand", 170.28, -44],
4543 + ["Angers-Loire Airport", "Angers/Marcé", "France", -0.312222, 47.5603],
4544 + ["Île d'Yeu Airport", "Île d'Yeu", "France", -2.391111, 46.718611],
4545 + ["Logroño-Agoncillo Airport", "Logroño-Agoncillo", "Spain", -2.32083, 42.4542],
4546 + ["Ercan International Airport", "Nicosia", "Cyprus", 33.4961, 35.1547],
4547 + ["Yakima Air Terminal McAllister Field", "Yakima", "United States", -120.544, 46.5682],
4548 + ["Kiwayu (Mkononi) Airport", "Kiwayu", "Kenya", 41.2975, -1.96056],
4549 + ["Worland Municipal Airport", "Worland", "United States", -107.951, 43.9657],
4550 + ["Valdosta Regional Airport", "Valdosta", "United States", -83.2767, 30.7825],
4551 + ["Victoria Regional Airport", "Victoria", "United States", -96.9185, 28.8526],
4552 + ["Quincy Regional Baldwin Field", "Quincy", "United States", -91.1946, 39.9427],
4553 + ["Tupelo Regional Airport", "Tupelo", "United States", -88.7699, 34.2681],
4554 + ["Santa Maria Pub Cpt G Allan Hancock Airport", "Santa Maria", "United States", -120.457, 34.8989],
4555 + ["Salina Municipal Airport", "Salina", "United States", -97.6522, 38.791],
4556 + ["Adirondack Regional Airport", "Saranac Lake", "United States", -74.2062, 44.3853],
4557 + ["Sheridan County Airport", "Sheridan", "United States", -106.98, 44.7692],
4558 + ["San Luis County Regional Airport", "San Luis Obispo", "United States", -120.642, 35.2368],
4559 + ["Rutland State Airport", "Rutland", "United States", -72.9496, 43.5294],
4560 + ["Rock Springs Sweetwater County Airport", "Rock Springs", "United States", -109.065, 41.5942],
4561 + ["Rhinelander Oneida County Airport", "Rhinelander", "United States", -89.4675, 45.6312],
4562 + ["Reading Regional Carl A Spaatz Field", "Reading", "United States", -75.9652, 40.3785],
4563 + ["Pease International Tradeport", "Portsmouth", "United States", -70.8233, 43.0779],
4564 + ["Pellston Regional Airport of Emmet County Airport", "Pellston", "United States", -84.7967, 45.5709],
4565 + ["Pierre Regional Airport", "Pierre", "United States", -100.286, 44.3827],
4566 + ["Pocatello Regional Airport", "Pocatello", "United States", -112.596, 42.9098],
4567 + ["Hattiesburg Laurel Regional Airport", "Hattiesburg/Laurel", "United States", -89.3371, 31.4671],
4568 + ["Owensboro Daviess County Airport", "Owensboro", "United States", -87.1668, 37.7401],
4569 + ["Southwest Oregon Regional Airport", "North Bend", "United States", -124.246, 43.4171],
4570 + ["Northwest Alabama Regional Airport", "Muscle Shoals", "United States", -87.6102, 34.7453],
4571 + ["Frank Wiley Field", "Miles City", "United States", -105.886, 46.428],
4572 + ["Muskegon County Airport", "Muskegon", "United States", -86.2382, 43.1695],
4573 + ["Lynchburg Regional Preston Glenn Field", "Lynchburg", "United States", -79.2004, 37.3267],
4574 + ["Lewistown Municipal Airport", "Lewistown", "United States", -109.467, 47.0493],
4575 + ["Lancaster Airport", "Lancaster", "United States", -76.2961, 40.1217],
4576 + ["Klamath Falls Airport", "Klamath Falls", "United States", -121.733, 42.1561],
4577 + ["Lebanon Municipal Airport", "Lebanon", "United States", -72.3042, 43.6261],
4578 + ["North Platte Regional Airport Lee Bird Field", "North Platte", "United States", -100.684, 41.1262],
4579 + ["Arnold Palmer Regional Airport", "Latrobe", "United States", -79.4048, 40.2759],
4580 + ["Laramie Regional Airport", "Laramie", "United States", -105.675, 41.3121],
4581 + ["Jamestown Regional Airport", "Jamestown", "United States", -98.6782, 46.9297],
4582 + ["Kirksville Regional Airport", "Kirksville", "United States", -92.5449, 40.0935],
4583 + ["Kili Airport", "Kili Island", "Marshall Islands", 169.12, 5.64452],
4584 + ["Tri State Milton J Ferguson Field", "Huntington", "United States", -82.558, 38.3667],
4585 + ["Memorial Field", "Hot Springs", "United States", -93.0962, 34.478],
4586 + ["Central Nebraska Regional Airport", "Grand Island", "United States", -98.3096, 40.9675],
4587 + ["Wokal Field Glasgow International Airport", "Glasgow", "United States", -106.615, 48.2125],
4588 + ["Fayetteville Regional Grannis Field", "Fayetteville", "United States", -78.8803, 34.9912],
4589 + ["New Bedford Regional Airport", "New Bedford", "United States", -70.9569, 41.6761],
4590 + ["Elko Regional Airport", "Elko", "United States", -115.792, 40.8249],
4591 + ["Chippewa Valley Regional Airport", "Eau Claire", "United States", -91.4843, 44.8658],
4592 + ["DuBois Regional Airport", "Du Bois", "United States", -78.8987, 41.1783],
4593 + ["Dodge City Regional Airport", "Dodge City", "United States", -99.9656, 37.7634],
4594 + ["Houghton County Memorial Airport", "Hancock", "United States", -88.4891, 47.1684],
4595 + ["William R Fairchild International Airport", "Port Angeles", "United States", -123.5, 48.1202],
4596 + ["Harrison Marion Regional Airport", "Clarksburg", "United States", -80.2281, 39.2966],
4597 + ["Chippewa County International Airport", "Sault Ste Marie", "United States", -84.4724, 46.2508],
4598 + ["Cape Girardeau Regional Airport", "Cape Girardeau", "United States", -89.5708, 37.2253],
4599 + ["Del Norte County Airport", "Crescent City", "United States", -124.237, 41.7802],
4600 + ["Southeast Iowa Regional Airport", "Burlington", "United States", -91.1255, 40.7832],
4601 + ["Brunswick Golden Isles Airport", "Brunswick", "United States", -81.4665, 31.2588],
4602 + ["Raleigh County Memorial Airport", "Beckley", "United States", -81.1242, 37.7873],
4603 + ["Western Nebraska Regional Airport", "Scottsbluff", "United States", -103.596, 41.874],
4604 + ["Bradford Regional Airport", "Bradford", "United States", -78.6401, 41.8031],
4605 + ["Watertown Regional Airport", "Watertown", "United States", -97.1547, 44.914],
4606 + ["Alpena County Regional Airport", "Alpena", "United States", -83.5603, 45.0781],
4607 + ["Walla Walla Regional Airport", "Walla Walla", "United States", -118.288, 46.0949],
4608 + ["Waterloo Regional Airport", "Waterloo", "United States", -92.4003, 42.5571],
4609 + ["Alamogordo White Sands Regional Airport", "Alamogordo", "United States", -105.991, 32.8399],
4610 + ["Athens Ben Epps Airport", "Athens", "United States", -83.3263, 33.9486],
4611 + ["Southwest Georgia Regional Airport", "Albany", "United States", -84.1945, 31.5355],
4612 + ["Aberdeen Regional Airport", "Aberdeen", "United States", -98.4218, 45.4491],
4613 + ["San Domino Island Heliport", "Tremiti Islands", "Italy", 15.488, 42.1025],
4614 + ["Gheshm Airport", "Gheshm", "Iran", 56.2688, 26.9487],
4615 + ["Diu Airport", "Diu", "India", 70.9211, 20.7131],
4616 + ["Gulu Airport", "Gulu", "Uganda", 32.271792, 2.805556],
4617 + ["Arua Airport", "Arua", "Uganda", 30.917, 3.05],
4618 + ["Tabora Airport", "Tabora", "Tanzania", 32.8333, -5.07639],
4619 + ["Shinyanga Airport", "Shinyanga", "Tanzania", 33.417, -3.667],
4620 + ["Musoma Airport", "Musoma", "Tanzania", 33.8, -1.483],
4621 + ["Kikwetu Airport", "Lindi", "Tanzania", 39.7578, -9.85111],
4622 + ["Kigoma Airport", "Kigoma", "Tanzania", 29.633, -4.883],
4623 + ["Bukoba Airport", "Bukoba", "Tanzania", 31.8, -1.3],
4624 + ["Port Sudan New International Airport", "Port Sudan", "Sudan", 37.2341, 19.4336],
4625 + ["Nyala Airport", "Nyala", "Sudan", 24.9562, 12.0535],
4626 + ["Atbara Airport", "Atbara", "Sudan", 33.967, 17.7],
4627 + ["La Abraq Airport", "Al Bayda'", "Libya", 21.964333, 32.788673],
4628 + ["Mitiga Airport", "Tripoli", "Libya", 13.276, 32.8941],
4629 + ["Gamal Abdel Nasser Airport", "Tobruk", "Libya", 23.907, 31.861],
4630 + ["Gardabya Airport", "Sirt", "Libya", 16.595, 31.0635],
4631 + ["Nanyuki Civil Airport", "Nanyuki", "Kenya", 37.033, -0.067],
4632 + ["Malindi Airport", "Malindi", "Kenya", 40.1017, -3.22931],
4633 + ["Lokichoggio Airport", "Lokichoggio", "Kenya", 34.348186, 4.204117],
4634 + ["Amboseli Airport", "Amboseli National Park", "Kenya", 37.2531, -2.64505],
4635 + ["Asyut International Airport", "Asyut", "Egypt", 31.011983, 27.046508],
4636 + ["El Arish International Airport", "El Arish", "Egypt", 33.835833, 31.073333],
4637 + ["Burao Airport", "Burao", "Somalia", 45.567, 9.517],
4638 + ["Galcaio Airport", "Galcaio", "Somalia", 47.4547, 6.78083],
4639 + ["Aden Adde International Airport", "Mogadishu", "Somalia", 45.3047, 2.01444],
4640 + ["Bosaso Airport", "Bosaso", "Somalia", 49.1494, 11.2753],
4641 + ["Alula Airport", "Alula", "Somalia", 50.733, 11.95],
4642 + ["Tippi Airport", "Tippi", "Ethiopia", 35.383, 7.117],
4643 + ["Mizan Teferi Airport", "Mizan Teferi", "Ethiopia", 35.533, 6.967],
4644 + ["Kabri Dehar Airport", "Kabri Dehar", "Ethiopia", 44.253, 6.734],
4645 + ["Gore Airport", "Gore", "Ethiopia", 35.55, 8.167],
4646 + ["Gode Airport", "Gode", "Ethiopia", 43.578567, 5.935128],
4647 + ["Dembidollo Airport", "Dembidollo", "Ethiopia", 34.858, 8.554],
4648 + ["Combolcha Airport", "Dessie", "Ethiopia", 39.7114, 11.0825],
4649 + ["Beica Airport", "Beica", "Ethiopia", 34.5219, 9.38639],
4650 + ["Baco Airport", "Baco", "Ethiopia", 36.562, 5.78287],
4651 + ["Sao Filipe Airport", "Sao Filipe", " Fogo Island", 14.885, null],
4652 + ["Praia International Airport", "Praia", " Santiago Island", 14.9245, null],
4653 + ["El Aroui Airport", "El Aroui", "Morocco", -3.02821, 34.9888],
4654 + ["Hassan I Airport", "El Aaiún", "Western Sahara", -13.2192, 27.1517],
4655 + ["Mogador Airport", "Essadouira", "Morocco", -9.681667, 31.3975],
4656 + ["Dakhla Airport", "Dakhla", "Western Sahara", -15.932, 23.7183],
4657 + ["Smara Airport", "Smara", "Western Sahara", -11.6847, 26.7318],
4658 + ["Iginniarfik Heliport", "Iginniarfik", "Greenland", -52.9667, 68.7],
4659 + ["Akunnaaq Heliport", "Akunnaaq", "Greenland", -52.3333, 68.75],
4660 + ["Groennedal Heliport", "Groennedal", "Greenland", -48.1, 61.2333],
4661 + ["Osvaldo Vieira International Airport", "Bissau", "Guinea-Bissau", -15.653681, 11.89485],
4662 + ["Kenema Airport", "Kenema", "Sierra Leone", -11.1766, 7.89129],
4663 + ["Bo Airport", "Bo", "Sierra Leone", -11.761, 7.9444],
4664 + ["Sherbro International Airport", "Bonthe", "Sierra Leone", -12.5189, 7.53242],
4665 + ["Ceuta Heliport", "Ceuta", "Spain", -5.29908, 35.8969],
4666 + ["Lauriston Airport", "Carriacou Island", "Grenada", -61.4728, 12.4761],
4667 + ["La Gomera Airport", "La Gomera", "Spain", -17.2146, 28.0296],
4668 + ["Papa Stour Airport", "Papa Stour", "United Kingdom", -1.69306, 60.3217],
4669 + ["Outer Skerries Airport", "Outer Skerries", "United Kingdom", -0.75, 60.417],
4670 + ["Foula Airport", "Foula", "United Kingdom", -2.052, 60.121],
4671 + ["Gamba", "Gamba", "Gabon", 9.96062, -2.71016],
4672 + ["Ilebo Airport", "Ilebo", "Congo (Kinshasa)", 20.583, -4.333],
4673 + ["Lodja Airport", "Lodja", "Congo (Kinshasa)", 23.45, -3.417],
4674 + ["Tshikapa Airport", "Tshikapa", "Congo (Kinshasa)", 20.7947, -6.43833],
4675 + ["Basankusu Airport", "Basankusu", "Congo (Kinshasa)", 19.7889, 1.22472],
4676 + ["Basango Mboliasa Airport", "Kiri", "Congo (Kinshasa)", 19.024, -1.435],
4677 + ["Nioki Airport", "Nioki", "Congo (Kinshasa)", 17.6847, -2.7175],
4678 + ["Inongo Airport", "Inongo", "Congo (Kinshasa)", 18.2858, -1.94722],
4679 + ["Tshimpi Airport", "Matadi", "Congo (Kinshasa)", 13.4404, -5.79961],
4680 + ["Boma Airport", "Boma", "Congo (Kinshasa)", 13.064, -5.854],
4681 + ["Eros Airport", "Windhoek", "Namibia", 17.0804, -22.6122],
4682 + ["Swakopmund Airport", "Swakopmund", "Namibia", 14.5681, -22.6619],
4683 + ["Oranjemund Airport", "Oranjemund", "Namibia", 16.4467, -28.5847],
4684 + ["Ondangwa Airport", "Ondangwa", "Namibia", 15.9526, -17.8782],
4685 + ["Luderitz Airport", "Luderitz", "Namibia", 15.2429, -26.6874],
4686 + ["Club Makokola Airport", "Club Makokola", "Malawi", 35.1325, -14.3069],
4687 + ["Sarh Airport", "Sarh", "Chad", 18.3744, 9.14444],
4688 + ["Croisette Heliport", "Cannes", "France", 7.03736, 43.536],
4689 + ["Chimoio Airport", "Chimoio", "Mozambique", 33.428958, -19.151267],
4690 + ["Tchibanga Airport", "Tchibanga", "Gabon", 11.017, -2.85],
4691 + ["Mouilla Ville Airport", "Mouila", "Gabon", 11.0567, -1.84514],
4692 + ["Koulamoutou Airport", "Koulamoutou", "Gabon", 12.4413, -1.18461],
4693 + ["Namibe Airport", "Mocamedes", "Angola", 12.146756, -15.261222],
4694 + ["Ondjiva Pereira Airport", "Ondjiva", "Angola", 15.683822, -17.043464],
4695 + ["Dundo Airport", "Dundo", "Angola", 20.8185, -7.40089],
4696 + ["Catumbela Airport", "Catumbela", "Angola", 13.4869, -12.4792],
4697 + ["Manja Airport", "Manja", "Madagascar", 44.317, -21.417],
4698 + ["Mandritsara Airport", "Mandritsara", "Madagascar", 48.833, -15.817],
4699 + ["Tsaratanana Airport", "Tsaratanana", "Madagascar", 47.617, -16.75],
4700 + ["Mampikony Airport", "Mampikony", "Madagascar", 47.622, -16.049],
4701 + ["Soalala Airport", "Soalala", "Madagascar", 45.367, -16.083],
4702 + ["Ambanja Airport", "Ambanja", "Madagascar", 48.467, -13.65],
4703 + ["Port Bergé Airport", "Port Bergé", "Madagascar", 47.617, -15.583],
4704 + ["Ambatondrazaka Airport", "Ambatondrazaka", "Madagascar", 48.433, -17.8],
4705 + ["Tsiroanomandidy Airport", "Tsiroanomandidy", "Madagascar", 46.05, -18.75],
4706 + ["Tambohorano Airport", "Tambohorano", "Madagascar", 43.9728, -17.4761],
4707 + ["Morafenobe Airport", "Morafenobe", "Madagascar", 44.917, -17.85],
4708 + ["Maintirano Airport", "Maintirano", "Madagascar", 44.033, -18.05],
4709 + ["Belo sur Tsiribihina Airport", "Belo sur Tsiribihina", "Madagascar", 44.5419, -19.6867],
4710 + ["Ankavandra Airport", "Ankavandra", "Madagascar", 45.283, -18.8],
4711 + ["Antsalova Airport", "Antsalova", "Madagascar", 44.617, -18.7],
4712 + ["Iconi Airport", "Moroni", "Comoros", 43.2439, -11.7108],
4713 + ["Solwesi Airport", "Solwesi", "Zambia", 26.3651, -12.1737],
4714 + ["Chipata Airport", "Chipata", "Zambia", 32.5872, -13.5583],
4715 + ["Loubomo Airport", "Loubomo", "Congo (Brazzaville)", 12.7, -4.2],
4716 + ["Limpopo Valley Airport", "Tuli Lodge", "Botswana", 29.1269, -22.1892],
4717 + ["Shakawe Airport", "Shakawe", "Botswana", 21.8326, -18.3739],
4718 + ["Orapa Airport", "Orapa", "Botswana", 25.3167, -21.2667],
4719 + ["Ghanzi Airport", "Ghanzi", "Botswana", 21.6581, -21.6925],
4720 + ["Mmabatho International Airport", "Mafeking", "South Africa", 25.548028, -25.798444],
4721 + ["Malamala Airport", "Malamala", "South Africa", 31.544584, -24.818111],
4722 + ["Kruger Mpumalanga International Airport", "Mpumalanga", "South Africa", 31.1056, -25.3832],
4723 + ["Rand Airport", "Johannesburg", "South Africa", 28.151169, -26.242506],
4724 + ["Ventspils International Airport", "Ventspils", "Latvia", 21.544167, 57.357778],
4725 + ["Shire Inda Selassie Airport", "Shire Indasilase", "Ethiopia", 38.2725, 14.0781],
4726 + ["Shilavo Airport", "Shilavo", "Ethiopia", 44.7667, 6.08333],
4727 + ["Hemavan Airport", "Hemavan", "Sweden", 15.082778, 65.806111],
4728 + ["Storuman Airport", "Mohed", "Sweden", 17.696583, 64.960894],
4729 + ["Ängelholm-Helsingborg Airport", "Ängelholm", "Sweden", 12.8471, 56.2961],
4730 + ["Torsby Airport", "Torsby", "Sweden", 12.991269, 60.157622],
4731 + ["Karlstad Airport", "Karlstad", "Sweden", 13.3374, 59.4447],
4732 + ["Hagfors Airport", "Hagfors", "Sweden", 13.578908, 60.020064],
4733 + ["Östersund Airport", "Östersund", "Sweden", 14.5003, 63.1944],
4734 + ["Łódź Władysław Reymont Airport", "Lodz", "Poland", 19.398133, 51.721881],
4735 + ["Bydgoszcz Ignacy Jan Paderewski Airport", "Bydgoszcz", "Poland", 17.9777, 53.0968],
4736 + ["Værøy Heliport", "Værøy", "Norway", 12.6833, 67.6667],
4737 + ["Svartnes Airport", "Vardø", "Norway", 31.044889, 70.355392],
4738 + ["Sorkjosen Airport", "Sorkjosen", "Norway", 20.9594, 69.7868],
4739 + ["Svolvær Helle Airport", "Svolvær", "Norway", 14.6692, 68.2433],
4740 + ["Sogndal Airport", "Sogndal", "Norway", 7.13778, 61.1561],
4741 + ["Anda Airport", "Sandane", "Norway", 6.10583, 61.83],
4742 + ["Røst Airport", "Røst", "Norway", 12.1033, 67.5278],
4743 + ["Ryum Airport", "Rørvik", "Norway", 11.1461, 64.8383],
4744 + ["Røssvoll Airport", "Mo i Rana", "Norway", 14.3014, 66.3639],
4745 + ["Namsos Høknesøra Airport", "Namsos", "Norway", 11.5786, 64.4722],
4746 + ["Leknes Airport", "Leknes", "Norway", 13.6094, 68.1525],
4747 + ["Sindal Airport", "Sindal", "Denmark", 10.229372, 57.503525],
4748 + ["Weston Airport", "Leixlip", "Ireland", -6.4875, 53.351333],
4749 + ["Donegal Airport", "Dongloe", "Ireland", -8.341, 55.044192],
4750 + ["Raron Airport", "Raron", "Switzerland", 7.82333, 46.3036],
4751 + ["Barra Airport", "Barra", "United Kingdom", -7.44306, 57.0228],
4752 + ["Anglesey Airport", "Angelsey", "United Kingdom", -4.535339, 53.248097],
4753 + ["Penzance Heliport", "Penzance", "United Kingdom", -5.51845, 50.1281],
4754 + ["Land's End / St. Just Airport", "Land's End", "United Kingdom", -5.67056, 50.1028],
4755 + ["Westray Airport", "Westray", "United Kingdom", -2.95, 59.3503],
4756 + ["Lerwick / Tingwall Airport", "Lerwick", "United Kingdom", -1.24361, 60.1922],
4757 + ["Sanday Airport", "Sanday", "United Kingdom", -2.57667, 59.2503],
4758 + ["Stronsay Airport", "Stronsay", "United Kingdom", -2.64139, 59.1553],
4759 + ["Papa Westray Airport", "Papa Westray", "United Kingdom", -2.90028, 59.3517],
4760 + ["North Ronaldsay Airport", "North Ronaldsay", "United Kingdom", -2.43444, 59.3675],
4761 + ["Fair Isle Airport", "Fair Isle", "United Kingdom", -1.62806, 59.5358],
4762 + ["Eday Airport", "Eday", "United Kingdom", -2.77222, 59.1906],
4763 + ["Campbeltown Airport", "Campbeltown", "United Kingdom", -5.68639, 55.4372],
4764 + ["Robin Hood Doncaster Sheffield Airport", "Doncaster", " Sheffield", 53.474722, null],
4765 + ["Nottingham Airport", "Nottingham", "United Kingdom", -1.079167, 52.92],
4766 + ["Seinäjoki Airport", "Seinäjoki / Ilmajoki", "Finland", 22.8323, 62.6921],
4767 + ["Helgoland-Düne Airport", "Helgoland", "Germany", 7.91583, 54.1853],
4768 + ["Heide-Büsum Airport", "Büsum", "Germany", 8.90167, 54.1533],
4769 + ["Heringsdorf Airport", "Heringsdorf", "Germany", 14.152347, 53.878706],
4770 + ["Kumasi Airport", "Kumasi", "Ghana", -1.59082, 6.71456],
4771 + ["Guemar Airport", "Guemar", "Algeria", 6.77679, 33.5114],
4772 + ["Bordj Badji Mokhtar Airport", "Bordj Badji Mokhtar", "Algeria", 0.923889, 21.375],
4773 + ["Béchar Boudghene Ben Ali Lotfi Airport", "Béchar", "Algeria", -2.26986, 31.6457],
4774 + ["Batna Airport", "Batna", "Algeria", 6.308589, 35.752106],
4775 + ["Wollaston Lake Airport", "Wollaston Lake", "Canada", -103.172, 58.1069],
4776 + ["Churchill Falls Airport", "Churchill Falls", "Canada", -64.1064, 53.5619],
4777 + ["Shamattawa Airport", "Shamattawa", "Canada", -92.0814, 55.8656],
4778 + ["Sandy Lake Airport", "Sandy Lake", "Canada", -93.3444, 53.0642],
4779 + ["Round Lake (Weagamow Lake) Airport", "Round Lake", "Canada", -91.3128, 52.9436],
4780 + ["Sachigo Lake Airport", "Sachigo Lake", "Canada", -92.1964, 53.8911],
4781 + ["Masset Airport", "Masset", "Canada", -132.125, 54.0275],
4782 + ["Muskrat Dam Airport", "Muskrat Dam", "Canada", -91.7628, 53.4414],
4783 + ["Kashechewan Airport", "Kashechewan", "Canada", -81.6778, 52.2825],
4784 + ["Swan River Airport", "Swan River", "Canada", -101.236, 52.1206],
4785 + ["Gods River Airport", "Gods River", "Canada", -94.0786, 54.8397],
4786 + ["Fond-Du-Lac Airport", "Fond-Du-Lac", "Canada", -107.182, 59.3344],
4787 + ["Eastmain River Airport", "Eastmain River", "Canada", -78.5225, 52.2264],
4788 + ["Bathurst Airport", "Bathurst", "Canada", -65.7389, 47.6297],
4789 + ["Ilford Airport", "Ilford", "Canada", -95.6139, 56.0614],
4790 + ["York Landing Airport", "York Landing", "Canada", -96.0892, 56.0894],
4791 + ["Salluit Airport", "Salluit", "Canada", -75.6672, 62.1794],
4792 + ["Whale Cove Airport", "Whale Cove", "Canada", -92.5981, 62.24],
4793 + ["Webequie Airport", "Webequie", "Canada", -87.3689, 52.9597],
4794 + ["Deer Lake Airport", "Deer Lake", "Canada", -94.0614, 52.6558],
4795 + ["Big Trout Lake Airport", "Big Trout Lake", "Canada", -89.8969, 53.8178],
4796 + ["St. Theresa Point Airport", "St. Theresa Point", "Canada", -94.8519, 53.8456],
4797 + ["Sanikiluaq Airport", "Sanikiluaq", "Canada", -79.2467, 56.5378],
4798 + ["Stony Rapids Airport", "Stony Rapids", "Canada", -105.841, 59.2503],
4799 + ["Red Lake Airport", "Red Lake", "Canada", -93.7931, 51.0669],
4800 + ["Rae Lakes Airport", "Gamètì", "Canada", -117.31, 64.1161],
4801 + ["Nakina Airport", "Nakina", "Canada", -86.696388, 50.182777],
4802 + ["The Pas Airport", "The Pas", "Canada", -101.091, 53.9714],
4803 + ["Powell River Airport", "Powell River", "Canada", -124.5, 49.8342],
4804 + ["Peawanuck Airport", "Peawanuck", "Canada", -85.4433, 54.9881],
4805 + ["Pikangikum Airport", "Pikangikum", "Canada", -93.9733, 51.8197],
4806 + ["Inukjuak Airport", "Inukjuak", "Canada", -78.0769, 58.4719],
4807 + ["Oxford House Airport", "Oxford House", "Canada", -95.2789, 54.9333],
4808 + ["Points North Landing Airport", "Points North Landing", "Canada", -104.082, 58.2767],
4809 + ["Norway House Airport", "Norway House", "Canada", -97.8442, 53.9583],
4810 + ["Wemindji Airport", "Wemindji", "Canada", -78.8311, 53.0106],
4811 + ["Umiujaq Airport", "Umiujaq", "Canada", -76.5183, 56.5361],
4812 + ["Chapais Airport", "Chibougamau", "Canada", -74.5281, 49.7719],
4813 + ["Mary's Harbour Airport", "Mary's Harbour", "Canada", -55.8472, 52.3028],
4814 + ["Kangiqsualujjuaq (Georges River) Airport", "Kangiqsualujjuaq", "Canada", -65.9928, 58.7114],
4815 + ["Lutselk'e Airport", "Lutselk'e", "Canada", -110.682, 62.4183],
4816 + ["Lansdowne House Airport", "Lansdowne House", "Canada", -87.9342, 52.1956],
4817 + ["Kimmirut Airport", "Kimmirut", "Canada", -69.8833, 62.85],
4818 + ["Aupaluk Airport", "Aupaluk", "Canada", -69.5997, 59.2967],
4819 + ["Waskaganish Airport", "Waskaganish", "Canada", -78.7583, 51.4733],
4820 + ["Akulivik Airport", "Akulivik", "Canada", -78.1486, 60.8186],
4821 + ["Island Lake Airport", "Island Lake", "Canada", -94.6536, 53.8572],
4822 + ["Ivujivik Airport", "Ivujivik", "Canada", -77.9253, 62.4173],
4823 + ["Chevery Airport", "Chevery", "Canada", -59.6367, 50.4689],
4824 + ["Hopedale Airport", "Hopedale", "Canada", -60.2286, 55.4483],
4825 + ["Nemiscau Airport", "Nemiscau", "Canada", -76.1356, 51.6911],
4826 + ["Vancouver Harbour Water Airport", "Vancouver", "Canada", -123.111, 49.2944],
4827 + ["Quaqtaq Airport", "Quaqtaq", "Canada", -69.6178, 61.0464],
4828 + ["Grise Fiord Airport", "Grise Fiord", "Canada", -82.9092, 76.4261],
4829 + ["Gillam Airport", "Gillam", "Canada", -94.7106, 56.3575],
4830 + ["Kuujjuarapik Airport", "Kuujjuarapik", "Canada", -77.7653, 55.2819],
4831 + ["Igloolik Airport", "Igloolik", "Canada", -81.8161, 69.3647],
4832 + ["Gods Lake Narrows Airport", "Gods Lake Narrows", "Canada", -94.4914, 54.5589],
4833 + ["Texada Gillies Bay Airport", "Texada", "Canada", -124.518, 49.6942],
4834 + ["Makkovik Airport", "Makkovik", "Canada", -59.1864, 55.0769],
4835 + ["Fort Hope Airport", "Fort Hope", "Canada", -87.9078, 51.5619],
4836 + ["Fort Albany Airport", "Fort Albany", "Canada", -81.6969, 52.2014],
4837 + ["Fort Severn Airport", "Fort Severn", "Canada", -87.6761, 56.0189],
4838 + ["Nain Airport", "Nain", "Canada", -61.6803, 56.5492],
4839 + ["Chesterfield Inlet Airport", "Chesterfield Inlet", "Canada", -90.7311, 63.3469],
4840 + ["Cartwright Airport", "Cartwright", "Canada", -57.0419, 53.6828],
4841 + ["Lourdes De Blanc Sablon Airport", "Lourdes-De-Blanc-Sablon", "Canada", -57.1853, 51.4436],
4842 + ["Uranium City Airport", "Uranium City", "Canada", -108.481, 59.5614],
4843 + ["Lac Du Bonnet Airport", "Lac Du Bonnet", "Canada", -96.01, 50.2944],
4844 + ["Attawapiskat Airport", "Attawapiskat", "Canada", -82.4319, 52.9275],
4845 + ["Kangirsuk Airport", "Kangirsuk", "Canada", -69.9992, 60.0272],
4846 + ["Kasabonika Airport", "Kasabonika", "Canada", -88.6428, 53.5247],
4847 + ["Fort Frances Municipal Airport", "Fort Frances", "Canada", -93.4397, 48.6542],
4848 + ["Cat Lake Airport", "Cat Lake", "Canada", -91.8244, 51.7272],
4849 + ["Tarapacá Airport", "Tarapacá", "Colombia", -69.733, -2.867],
4850 + ["Apartadó Airport", "Apartadó", "Colombia", -77.2, 7.033],
4851 + ["Nantong Airport", "Nantong", "China", 120.976, 32.0708],
4852 + ["La Tabatière Airport", "La Tabatière", "Canada", -58.9756, 50.8308],
4853 + ["Tête-à-la-Baleine Airport", "Tête-à-la-Baleine", "Canada", -59.3836, 50.6744],
4854 + ["Chisasibi Airport", "Chisasibi", "Canada", -78.9169, 53.8056],
4855 + ["Poplar Hill Airport", "Poplar Hill", "Canada", -94.2556, 52.1133],
4856 + ["Ogoki Post Airport", "Ogoki Post", "Canada", -85.9017, 51.6586],
4857 + ["Kingfisher Lake Airport", "Kingfisher Lake", "Canada", -89.8553, 53.0125],
4858 + ["Bearskin Lake Airport", "Bearskin Lake", "Canada", -91.0272, 53.9656],
4859 + ["North Spirit Lake Airport", "North Spirit Lake", "Canada", -92.9711, 52.49],
4860 + ["Wunnumin Lake Airport", "Wunnumin Lake", "Canada", -89.2892, 52.8939],
4861 + ["Wapekeka Airport", "Angling Lake", "Canada", -89.5794, 53.8492],
4862 + ["Summer Beaver Airport", "Summer Beaver", "Canada", -88.5419, 52.7086],
4863 + ["Whatì Airport", "Whatì", "Canada", -117.246, 63.1317],
4864 + ["Colville Lake Airport", "Colville Lake", "Canada", -126.083, 67.0333],
4865 + ["Rigolet Airport", "Rigolet", "Canada", -58.4575, 54.1797],
4866 + ["Port Hope Simpson Airport", "Port Hope Simpson", "Canada", -56.2861, 52.5281],
4867 + ["St. Lewis (Fox Harbour) Airport", "St. Lewis", "Canada", -55.6739, 52.3728],
4868 + ["Williams Harbour Airport", "Williams Harbour", "Canada", -55.7847, 52.5669],
4869 + ["Anahim Lake Airport", "Anahim Lake", "Canada", -125.303, 52.4525],
4870 + ["Whistler/Green Lake Water Aerodrome", "Whistler", "Canada", -122.949, 50.1436],
4871 + ["Punta Gorda Airport", "Punta Gorda", "Belize", -88.8083, 16.1024],
4872 + ["Caye Caulker Airport", "Caye Caulker", "Belize", -88.0325, 17.7347],
4873 + ["Vopnafjörður Airport", "Vopnafjörður", "Iceland", -14.8506, 65.7206],
4874 + ["Thorshofn Airport", "Thorshofn", "Iceland", -15.3356, 66.2185],
4875 + ["Drake Bay Airport", "Puntarenas", "Costa Rica", -83.6417, 8.71889],
4876 + ["Grímsey Airport", "Grímsey", "Iceland", -18.0175, 66.5547],
4877 + ["Qaarsut Airport", "Uummannaq", "Greenland", -52.6962, 70.7342],
4878 + ["Upernavik Airport", "Upernavik", "Greenland", -56.1306, 72.7902],
4879 + ["Sisimiut Airport", "Sisimiut", "Greenland", -53.7293, 66.9513],
4880 + ["Qaanaaq Airport", "Qaanaaq", "Greenland", -69.3887, 77.4886],
4881 + ["Narsaq Heliport", "Narsaq", "Greenland", -46.0586, 60.9167],
4882 + ["Nanortalik Heliport", "Nanortalik", "Greenland", -45.2317, 60.14],
4883 + ["Maniitsoq Airport", "Maniitsoq", "Greenland", -52.9394, 65.4125],
4884 + ["Qaqortoq Heliport", "Qaqortoq", "Greenland", -46.0294, 60.7158],
4885 + ["Qeqertarsuaq Heliport", "Qeqertarsuaq Airport", "Greenland", -53.5381, 69.2511],
4886 + ["Paamiut Heliport", "Paamiut", "Greenland", -49.6625, 61.9922],
4887 + ["Neerlerit Inaat Airport", "Neerlerit Inaat", "Greenland", -22.6606, 70.7433],
4888 + ["Alluitsup Paa Heliport", "Alluitsup Paa", "Greenland", -45.5778, 60.4644],
4889 + ["Wapenamanda Airport", "Wapenamanda", "Papua New Guinea", 143.895, -5.6433],
4890 + ["Vanimo Airport", "Vanimo", "Papua New Guinea", 141.302, -2.69717],
4891 + ["Tokua Airport", "Tokua", "Papua New Guinea", 152.38, -4.34046],
4892 + ["Tabubil Airport", "Tabubil", "Papua New Guinea", 141.226, -5.27861],
4893 + ["Tari Airport", "Tari", "Papua New Guinea", 142.948, -5.845],
4894 + ["Misima Island Airport", "Misima Island", "Papua New Guinea", 152.838, -10.6892],
4895 + ["Moro Airport", "Moro", "Papua New Guinea", 143.238, -6.36333],
4896 + ["Momote Airport", "Momote", "Papua New Guinea", 147.424, -2.06189],
4897 + ["Mendi Airport", "Mendi", "Papua New Guinea", 143.657, -6.14774],
4898 + ["Kavieng Airport", "Kavieng", "Papua New Guinea", 150.808, -2.5794],
4899 + ["Kerema Airport", "Kerema", "Papua New Guinea", 145.771, -7.96361],
4900 + ["Kikori Airport", "Kikori", "Papua New Guinea", 144.25, -7.42438],
4901 + ["Kiunga Airport", "Kiunga", "Papua New Guinea", 141.282, -6.12571],
4902 + ["Kimbe Airport", "Hoskins", "Papua New Guinea", 150.405, -5.46217],
4903 + ["Girua Airport", "Girua", "Papua New Guinea", 148.309, -8.80454],
4904 + ["Gurney Airport", "Gurney", "Papua New Guinea", 150.334, -10.3115],
4905 + ["Daru Airport", "Daru", "Papua New Guinea", 143.208, -9.08676],
4906 + ["Chimbu Airport", "Kundiawa", "Papua New Guinea", 144.971, -6.02429],
4907 + ["Buka Airport", "Buka Island", "Papua New Guinea", 154.673, -5.42232],
4908 + ["Ramata Airport", "Ramata", "Solomon Islands", 157.643, -8.16806],
4909 + ["Kagau Island Airport", "Kagau Island", "Solomon Islands", 157.583, -7.333],
4910 + ["Suavanao Airport", "Suavanao", "Solomon Islands", 158.731, -7.58556],
4911 + ["Marau Airport", "Marau", "Solomon Islands", 160.825, -9.86167],
4912 + ["Rennell/Tingoa Airport", "Rennell Island", "Solomon Islands", 160.063, -11.5339],
4913 + ["Mono Airport", "Stirling Island", "Solomon Islands", 155.565, -7.41694],
4914 + ["Nusatupe Airport", "Gizo", "Solomon Islands", 156.864, -8.09778],
4915 + ["Munda Airport", "Munda", "Solomon Islands", 157.263, -8.32797],
4916 + ["Santa Cruz/Graciosa Bay/Luova Airport", "Santa Cruz/Graciosa Bay/Luova", "Solomon Islands", 165.795, -10.7203],
4917 + ["Ngorangora Airport", "Kirakira", "Solomon Islands", 161.898, -10.4497],
4918 + ["Babanakira Airport", "Mbambanakira", "Solomon Islands", 159.839, -9.7475],
4919 + ["Fera/Maringe Airport", "Fera Island", "Solomon Islands", 159.577, -8.1075],
4920 + ["Ballalae Airport", "Ballalae", "Solomon Islands", 155.883, -6.967],
4921 + ["Auki Airport", "Auki", "Solomon Islands", 160.682, -8.70257],
4922 + ["Uru Harbour Airport", "Atoifi", "Solomon Islands", 161.011, -8.87333],
4923 + ["Komsomolsk-on-Amur Airport", "Komsomolsk-on-Amur", "Russia", 136.934, 50.4094],
4924 + ["Moyo Airport", "Moyo", "Uganda", 31.75, 3.633],
4925 + ["Tiksi Airport", "Tiksi", "Russia", 128.903, 71.6977],
4926 + ["Cherskiy Airport", "Cherskiy", "Russia", 161.338, 68.7406],
4927 + ["Chokurdakh Airport", "Chokurdah", "Russia", 147.902, 70.6231],
4928 + ["Chulman", "Neryungri", "Russia", 124.914, 56.9139],
4929 + ["Kostanay West Airport", "Kostanay", "Kazakhstan", 63.550278, 53.206944],
4930 + ["Zhezkazgan Airport", "Zhezkazgan", "Kazakhstan", 67.733333, 47.708333],
4931 + ["Kokshetau Airport", "Kokshetau", "Kazakhstan", 69.5946, 53.3291],
4932 + ["Union Island International Airport", "Union Island", "Saint Vincent and the Grenadines", -61.417, 12.583],
4933 + ["J F Mitchell Airport", "Bequia", "Saint Vincent and the Grenadines", -61.262033, 12.988444],
4934 + ["Virgin Gorda Airport", "Spanish Town", "British Virgin Islands", -64.4275, 18.4464],
4935 + ["Vance Winkworth Amory International Airport", "Charlestown", "Saint Kitts and Nevis", -62.589869, 17.205678],
4936 + ["Baillif Airport", "Basse Terre", "Guadeloupe", -61.7422, 16.0133],
4937 + ["La Désirade Airport", "Grande Anse", "Guadeloupe", -61.0844, 16.2969],
4938 + ["Juan Pablo Pérez Alfonso Airport", "El Vigía", "Venezuela", -71.672819, 8.6241],
4939 + ["El Jaguel / Punta del Este Airport", "Maldonado", "Uruguay", -54.917, -34.917],
4940 + ["Santa Rosa Airport", "Santa Rosa", "Brazil", -54.5204, -27.9067],
4941 + ["Alferez Fap David Figueroa Fernandini Airport", "Huánuco", "Peru", -76.204797, -9.878811],
4942 + ["Caballococha Airport", "Caballococha", "Peru", -70.508225, -3.916858],
4943 + ["Capitán Av. German Quiroga G. Airport", "San Borja", "Bolivia", -66.7375, -14.8592],
4944 + ["Capitán Av. Selin Zeitun Lopez Airport", "Riberalta", "Bolivia", -66, -11],
4945 + ["Capitán de Av. Emilio Beltrán Airport", "Guayaramerín", "Bolivia", -65.3456, -10.8206],
4946 + ["Obando Airport", "Puerto Inírida", "Colombia", -67.91, 3.85],
4947 + ["Reyes Murillo Airport", "Nuquí", "Colombia", -77.28, 5.7],
4948 + ["La Pedrera Airport", "La Pedrera", "Colombia", -69.58, -1.33],
4949 + ["Caucaya Airport", "Puerto Leguízamo", "Colombia", -74.77, -0.18],
4950 + ["La Jagua Airport", "Garzón", "Colombia", -75.67, 2.17],
4951 + ["Santa Ana Airport", "Cartago", "Colombia", -75.955753, 4.758181],
4952 + ["Stanley Airport", "Stanley", "Falkland Islands", -57.777644, -51.685672],
4953 + ["Camilo Ponce Enriquez Airport", "La Toma (Catamayo)", "Ecuador", -79.3719, -3.99589],
4954 + ["San Cristóbal Airport", "San Cristóbal", "Ecuador", -89.61745, -0.910206],
4955 + ["Sorocaba Airport", "Sorocaba", "Brazil", -47.49, -23.478],
4956 + ["Ricardo García Posada Airport", "El Salvador", "Chile", -69.7652, -26.3111],
4957 + ["Vitória da Conquista Airport", "Vitória Da Conquista", "Brazil", -40.863106, -14.862761],
4958 + ["Marília Airport", "Marília", "Brazil", -49.9264, -22.196892],
4959 + ["Macaé Airport", "Macaé", "Brazil", -41.766, -22.343],
4960 + ["Necochea Airport", "Necochea", "Argentina", -58.817222, -38.483056],
4961 + ["Lago Argentino Airport", "El Calafate", "Argentina", -72.2486, -50.3361],
4962 + ["Roxas Airport", "Roxas City", "Philippines", 122.751669, 11.597669],
4963 + ["Calbayog Airport", "Calbayog City", "Philippines", 124.545092, 12.072706],
4964 + ["Virac Airport", "Virac", "Philippines", 124.205672, 13.576439],
4965 + ["Tuguegarao Airport", "Tuguegarao", "Philippines", 121.730614, 17.638311],
4966 + ["San Fernando Airport", "San Fernando", "Philippines", 120.303219, 16.595589],
4967 + ["Basco Airport", "Basco", "Philippines", 121.979883, 20.451322],
4968 + ["Naga Airport", "Naga", "Philippines", 123.270239, 13.584886],
4969 + ["Tandag Airport", "Tandag", "Philippines", 126.171, 9.07211],
4970 + ["Surigao Airport", "Sangley Point", "Philippines", 125.479328, 9.757567],
4971 + ["Fremont Airport", "Fremont", "United States", -83.1612, 41.3331],
4972 + ["Sanga Sanga Airport", "Sanga Sanga", "Philippines", 119.743, 5.04699],
4973 + ["General Santos International Airport", "General Santos City", "Philippines", 125.2353, 6.106439],
4974 + ["Subic Bay International Airport", "Olongapo City", "Philippines", 120.271, 14.7944],
4975 + ["Yangyang International Airport", "Sokcho / Gangneung", "South Korea", 128.669164, 38.061311],
4976 + ["Ugolny Airport", "Anadyr", "Russia", 177.741483, 64.73495],
4977 + ["Okhotsk Airport", "Okhotsk", "Russia", 143.057, 59.4101],
4978 + ["Ujae Atoll Airport", "Ujae Atoll", "Marshall Islands", 165.762, 8.92806],
4979 + ["Mariupol International Airport", "Mariupol International", "Ukraine", 37.4496, 47.0761],
4980 + ["Luhansk International Airport", "Lugansk", "Ukraine", 39.3741, 48.4174],
4981 + ["Zaporizhzhia International Airport", "Zaporozhye", "Ukraine", 35.3157, 47.867],
4982 + ["Lozuvatka International Airport", "Krivoy Rog", "Ukraine", 33.21, 48.0433],
4983 + ["Osnova International Airport", "Kharkov", "Ukraine", 36.289986, 49.924786],
4984 + ["Ivano Frankivsk International Airport", "Ivano-Frankivsk", "Ukraine", 24.686111, 48.884167],
4985 + ["Chernivtsi International Airport", "Chernovtsk", "Ukraine", 25.980831, 48.259322],
4986 + ["Rivne International Airport", "Rivne", "Ukraine", 26.1416, 50.6071],
4987 + ["Uzhhorod International Airport", "Uzhgorod", "Ukraine", 22.263356, 48.634278],
4988 + ["Solovki Airport", "Solovetsky Islands", "Russia", 35.7333, 65.03],
4989 + ["Cherepovets Airport", "Cherepovets", "Russia", 38.0158, 59.2736],
4990 + ["Amderma Airport", "Amderma", "Russia", 61.5564, 69.7633],
4991 + ["Kotlas Airport", "Kotlas", "Russia", 46.6975, 61.2358],
4992 + ["Petrozavodsk Airport", "Petrozavodsk", "Russia", 34.1547, 61.8852],
4993 + ["Hrodno Airport", "Hrodna", "Belarus", 24.0538, 53.602],
4994 + ["Mogilev Airport", "Mogilev", "Belarus", 30.0951, 53.9549],
4995 + ["Yeniseysk Airport", "Yeniseysk", "Russia", 92.1125, 58.4742],
4996 + ["Kyzyl Airport", "Kyzyl", "Russia", 94.4006, 51.6694],
4997 + ["Spichenkovo Airport", "Novokuznetsk", "Russia", 86.8772, 53.8114],
4998 + ["Khatanga Airport", "Khatanga", "Russia", 102.490514, 71.978058],
4999 + ["Igarka Airport", "Igarka", "Russia", 86.6219, 67.4372],

This file is too large to show in full.

src/assets/data/map.js new
+251
@@ -0,0 +1,251 @@
1 +export default {
2 + title: "learn anything - programming - programming languages - python",
3 + nodes: [
4 + {
5 + text: "python",
6 + url: "http://www.wikiwand.com/en/Python_(programming_language)",
7 + fx: -13.916222252976013,
8 + fy: -659.1641376795345,
9 + nodes: [
10 + {
11 + text: "",
12 + url: "https://www.reddit.com/r/Python/",
13 + fx: 176.083777747024,
14 + fy: -665.1641376795345,
15 + nodes: [],
16 + category: "reddit",
17 + color: "rgba(255, 189, 10, 1.0)"
18 + },
19 + {
20 + text: "source",
21 + note: "original python implementation in c, compiles python code into byte code and interprets the byte code in a evaluation loop",
22 + url: "https://github.com/python/cpython",
23 + fx: 176.083777747024,
24 + fy: -625.1641376795345,
25 + nodes: [],
26 + category: "github",
27 + color: "rgba(36, 170, 255, 1.0)"
28 + }
29 + ],
30 + category: "wiki"
31 + },
32 + {
33 + text: "help",
34 + url: "",
35 + fx: 154.3247731601375,
36 + fy: -429.73700786748157,
37 + nodes: [
38 + {
39 + text: "awesome python",
40 + url: "https://github.com/vinta/awesome-python",
41 + fx: 291.3247731601375,
42 + fy: -546.2370078674815,
43 + nodes: [],
44 + category: "github",
45 + color: "rgba(175, 54, 242, 1.0)"
46 + },
47 + {
48 + text: "awesome asyncio",
49 + url: "https://github.com/timofurrer/awesome-asyncio",
50 + fx: 291.3247731601375,
51 + fy: -506.23700786748157,
52 + nodes: [],
53 + category: "github",
54 + color: "rgba(36, 170, 255, 1.0)"
55 + },
56 + {
57 + text: "python data model",
58 + url: "https://docs.python.org/3/reference/datamodel.html",
59 + fx: 291.3247731601375,
60 + fy: -466.23700786748157,
61 + nodes: [],
62 + color: "rgba(255, 189, 10, 1.0)"
63 + },
64 + {
65 + text: "python testing",
66 + url: "http://pythontesting.net/framework/pytest/pytest-introduction/",
67 + fx: 291.3247731601375,
68 + fy: -432.23700786748157,
69 + nodes: [],
70 + category: "free book",
71 + color: "rgba(34, 205, 224, 1.0)"
72 + },
73 + {
74 + text: "scientific python cheat sheet",
75 + url: "https://ipgp.github.io/scientific_python_cheat_sheet/",
76 + fx: 291.3247731601375,
77 + fy: -392.23700786748157,
78 + nodes: [],
79 + color: "rgba(209, 21, 88, 1.0)"
80 + },
81 + {
82 + text: "structuring your project",
83 + url: "http://python-guide-pt-br.readthedocs.io/en/latest/writing/structure/",
84 + fx: 291.3247731601375,
85 + fy: -358.23700786748157,
86 + nodes: [],
87 + color: "rgba(49, 187, 71, 1.0)"
88 + },
89 + {
90 + text: "style guide for python code",
91 + url: "https://www.python.org/dev/peps/pep-0008/",
92 + fx: 291.3247731601375,
93 + fy: -324.23700786748157,
94 + nodes: [],
95 + color: "rgba(175, 54, 242, 1.0)"
96 + },
97 + {
98 + text: "cpython internals ️",
99 + url: "http://pgbovine.net/cpython-internals.htm",
100 + fx: 291.3247731601375,
101 + fy: -290.23700786748157,
102 + nodes: [],
103 + category: "article",
104 + color: "rgba(36, 170, 255, 1.0)"
105 + }
106 + ]
107 + },
108 + {
109 + text: "articles",
110 + url: "",
111 + fx: 455.7839253819375,
112 + fy: -183.5539283546699,
113 + nodes: [
114 + {
115 + text: "16: the history behind the decision to move python to github ️",
116 + url: "https://snarky.ca/the-history-behind-the-decision-to-move-python-to-github/",
117 + fx: 617.7839253819375,
118 + fy: -245.0539283546699,
119 + nodes: [],
120 + category: "article",
121 + color: "rgba(175, 54, 242, 1.0)"
122 + },
123 + {
124 + text: "15: a modern python development toolchain ️",
125 + url: "http://www.chriskrycho.com/2015/a-modern-python-development-toolchain.html",
126 + fx: 617.7839253819375,
127 + fy: -183.0539283546699,
128 + nodes: [],
129 + category: "article",
130 + color: "rgba(36, 170, 255, 1.0)"
131 + },
132 + {
133 + text: "17: pythons instance, class, and static methods demystified",
134 + url: "https://realpython.com/blog/python/instance-class-and-static-methods-demystified/",
135 + fx: 617.7839253819375,
136 + fy: -121.05392835466989,
137 + nodes: [],
138 + category: "article",
139 + color: "rgba(255, 189, 10, 1.0)"
140 + }
141 + ]
142 + },
143 + {
144 + text: "basics",
145 + note: "",
146 + url: "",
147 + fx: -98.5231997717085,
148 + fy: -60.07462866512333,
149 + nodes: [
150 + {
151 + text: "1. the python tutorial",
152 + url: "https://docs.python.org/3/tutorial/",
153 + fx: 83.4768002282915,
154 + fy: -96.57462866512333,
155 + nodes: [],
156 + color: "rgba(255, 189, 10, 1.0)"
157 + },
158 + {
159 + text: "1. dive into python 3",
160 + url: "http://www.diveintopython3.net",
161 + fx: 83.4768002282915,
162 + fy: -62.57462866512333,
163 + nodes: [],
164 + category: "free book",
165 + color: "rgba(175, 54, 242, 1.0)"
166 + },
167 + {
168 + text: "1. automate the boring stuff with python",
169 + url: "https://automatetheboringstuff.com/",
170 + fx: 83.4768002282915,
171 + fy: -22.574628665123328,
172 + nodes: [],
173 + category: "free book",
174 + color: "rgba(36, 170, 255, 1.0)"
175 + }
176 + ]
177 + },
178 + {
179 + text: "package manager",
180 + url: "http://www.wikiwand.com/en/Package_manager",
181 + fx: -346.2056231217888,
182 + fy: 39.035120728630204,
183 + nodes: [],
184 + category: "wiki"
185 + },
186 + {
187 + text: "python libraries ️",
188 + fx: -78.69331502906573,
189 + fy: 100.14771605920942,
190 + nodes: [],
191 + category: "mindmap"
192 + },
193 + {
194 + text: "pip",
195 + url: "https://pypi.python.org/pypi/pip",
196 + fx: -317.77054724755226,
197 + fy: 153.56934975958518,
198 + nodes: []
199 + }
200 + ],
201 + connections: [
202 + {
203 + source: "python",
204 + target: "basics",
205 + curve: {
206 + x: -43.5535,
207 + y: 299.545
208 + }
209 + },
210 + {
211 + source: "help",
212 + target: "python",
213 + curve: {
214 + x: -78.1206,
215 + y: -114.714
216 + }
217 + },
218 + {
219 + source: "basics",
220 + target: "python libraries ️",
221 + curve: {
222 + x: 29.6649,
223 + y: 80.1111
224 + }
225 + },
226 + {
227 + source: "basics",
228 + target: "package manager",
229 + curve: {
230 + x: -103.841,
231 + y: 49.5548
232 + }
233 + },
234 + {
235 + source: "package manager",
236 + target: "pip",
237 + curve: {
238 + x: -19.7824,
239 + y: 57.2671
240 + }
241 + },
242 + {
243 + source: "articles",
244 + target: "help",
245 + curve: {
246 + x: -238.287,
247 + y: -54.4818
248 + }
249 + }
250 + ]
251 +}
src/assets/fonts/Nunito-Sans.css new
+181
@@ -0,0 +1,181 @@
1 +/* latin */
2 +@font-face {
3 + font-family: "Nunito Sans";
4 + font-style: italic;
5 + font-weight: 200;
6 + src:
7 + local("Nunito Sans ExtraLight Italic"),
8 + local("NunitoSans-ExtraLightItalic"),
9 + url(NunitoSans-ExtraLightItalic.woff2) format("woff2");
10 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
11 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
12 +}
13 +
14 +/* latin */
15 +@font-face {
16 + font-family: "Nunito Sans";
17 + font-style: italic;
18 + font-weight: 300;
19 + src:
20 + local("Nunito Sans Light Italic"),
21 + local("NunitoSans-LightItalic"),
22 + url(NunitoSans-LightItalic.woff2) format("woff2");
23 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
24 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
25 +}
26 +
27 +/* latin */
28 +@font-face {
29 + font-family: "Nunito Sans";
30 + font-style: italic;
31 + font-weight: 400;
32 + src:
33 + local("Nunito Sans Italic"),
34 + local("NunitoSans-Italic"),
35 + url(NunitoSans-Italic.woff2) format("woff2");
36 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
37 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
38 +}
39 +
40 +/* latin */
41 +@font-face {
42 + font-family: "Nunito Sans";
43 + font-style: italic;
44 + font-weight: 600;
45 + src:
46 + local("Nunito Sans SemiBold Italic"),
47 + local("NunitoSans-SemiBoldItalic"),
48 + url(NunitoSans-SemiBoldItalic.woff2) format("woff2");
49 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
50 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
51 +}
52 +
53 +/* latin */
54 +@font-face {
55 + font-family: "Nunito Sans";
56 + font-style: italic;
57 + font-weight: 700;
58 + src:
59 + local("Nunito Sans Bold Italic"),
60 + local("NunitoSans-BoldItalic"),
61 + url(NunitoSans-BoldItalic.woff2) format("woff2");
62 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
63 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
64 +}
65 +
66 +/* latin */
67 +@font-face {
68 + font-family: "Nunito Sans";
69 + font-style: italic;
70 + font-weight: 800;
71 + src:
72 + local("Nunito Sans ExtraBold Italic"),
73 + local("NunitoSans-ExtraBoldItalic"),
74 + url(NunitoSans-ExtraBoldItalic.woff2) format("woff2");
75 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
76 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
77 +}
78 +
79 +/* latin */
80 +@font-face {
81 + font-family: "Nunito Sans";
82 + font-style: italic;
83 + font-weight: 900;
84 + src:
85 + local("Nunito Sans Black Italic"),
86 + local("NunitoSans-BlackItalic"),
87 + url(NunitoSans-BlackItalic.woff2) format("woff2");
88 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
89 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
90 +}
91 +
92 +/* latin */
93 +@font-face {
94 + font-family: "Nunito Sans";
95 + font-style: normal;
96 + font-weight: 200;
97 + src:
98 + local("Nunito Sans ExtraLight"),
99 + local("NunitoSans-ExtraLight"),
100 + url(NunitoSans-ExtraLight.woff2) format("woff2");
101 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
102 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
103 +}
104 +
105 +/* latin */
106 +@font-face {
107 + font-family: "Nunito Sans";
108 + font-style: normal;
109 + font-weight: 300;
110 + src:
111 + local("Nunito Sans Light"),
112 + local("NunitoSans-Light"),
113 + url(NunitoSans-Light.woff2) format("woff2");
114 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
115 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
116 +}
117 +
118 +/* latin */
119 +@font-face {
120 + font-family: "Nunito Sans";
121 + font-style: normal;
122 + font-weight: 400;
123 + src:
124 + local("Nunito Sans Regular"),
125 + local("NunitoSans-Regular"),
126 + url(NunitoSans-Regular.woff2) format("woff2");
127 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
128 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
129 +}
130 +
131 +/* latin */
132 +@font-face {
133 + font-family: "Nunito Sans";
134 + font-style: normal;
135 + font-weight: 600;
136 + src:
137 + local("Nunito Sans SemiBold"),
138 + local("NunitoSans-SemiBold"),
139 + url(NunitoSans-SemiBold.woff2) format("woff2");
140 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
141 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
142 +}
143 +
144 +/* latin */
145 +@font-face {
146 + font-family: "Nunito Sans";
147 + font-style: normal;
148 + font-weight: 700;
149 + src:
150 + local("Nunito Sans Bold"),
151 + local("NunitoSans-Bold"),
152 + url(NunitoSans-Bold.woff2) format("woff2");
153 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
154 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
155 +}
156 +
157 +/* latin */
158 +@font-face {
159 + font-family: "Nunito Sans";
160 + font-style: normal;
161 + font-weight: 800;
162 + src:
163 + local("Nunito Sans ExtraBold"),
164 + local("NunitoSans-ExtraBold"),
165 + url(NunitoSans-ExtraBold.woff2) format("woff2");
166 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
167 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
168 +}
169 +
170 +/* latin */
171 +@font-face {
172 + font-family: "Nunito Sans";
173 + font-style: normal;
174 + font-weight: 900;
175 + src:
176 + local("Nunito Sans Black"),
177 + local("NunitoSans-Black"),
178 + url(NunitoSans-Black.woff2) format("woff2");
179 + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
180 + U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
181 +}
src/assets/fonts/NunitoSans-Black.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-Black.woff2 differ
src/assets/fonts/NunitoSans-BlackItalic.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-BlackItalic.woff2 differ
src/assets/fonts/NunitoSans-Bold.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-Bold.woff2 differ
src/assets/fonts/NunitoSans-BoldItalic.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-BoldItalic.woff2 differ
src/assets/fonts/NunitoSans-ExtraBold.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-ExtraBold.woff2 differ
src/assets/fonts/NunitoSans-ExtraBoldItalic.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-ExtraBoldItalic.woff2 differ
src/assets/fonts/NunitoSans-ExtraLight.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-ExtraLight.woff2 differ
src/assets/fonts/NunitoSans-ExtraLightItalic.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-ExtraLightItalic.woff2 differ
src/assets/fonts/NunitoSans-Italic.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-Italic.woff2 differ
src/assets/fonts/NunitoSans-Light.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-Light.woff2 differ
src/assets/fonts/NunitoSans-LightItalic.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-LightItalic.woff2 differ
src/assets/fonts/NunitoSans-Regular.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-Regular.woff2 differ
src/assets/fonts/NunitoSans-SemiBold.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-SemiBold.woff2 differ
src/assets/fonts/NunitoSans-SemiBoldItalic.woff2
Binary files /dev/null and b/src/assets/fonts/NunitoSans-SemiBoldItalic.woff2 differ
src/assets/images/Grace-Hopper.png
Binary files /dev/null and b/src/assets/images/Grace-Hopper.png differ
src/assets/images/Ripple-2s-100px.svg new
+1
@@ -0,0 +1 @@
1 +<svg width="100px" height="100px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="lds-ripple" style="background: none;"><circle cx="50" cy="50" r="28.6685" fill="none" ng-attr-stroke="{{config.c1}}" ng-attr-stroke-width="{{config.width}}" stroke="#4a596a" stroke-width="2"><animate attributeName="r" calcMode="spline" values="0;30" keyTimes="0;1" dur="2" keySplines="0 0.2 0.8 1" begin="-1s" repeatCount="indefinite"></animate><animate attributeName="opacity" calcMode="spline" values="1;0" keyTimes="0;1" dur="2" keySplines="0.2 0 0.8 1" begin="-1s" repeatCount="indefinite"></animate></circle><circle cx="50" cy="50" r="15.9828" fill="none" ng-attr-stroke="{{config.c2}}" ng-attr-stroke-width="{{config.width}}" stroke="#89ade8" stroke-width="2"><animate attributeName="r" calcMode="spline" values="0;30" keyTimes="0;1" dur="2" keySplines="0 0.2 0.8 1" begin="0s" repeatCount="indefinite"></animate><animate attributeName="opacity" calcMode="spline" values="1;0" keyTimes="0;1" dur="2" keySplines="0.2 0 0.8 1" begin="0s" repeatCount="indefinite"></animate></circle></svg>
src/assets/images/avatar-2.jpg
Binary files /dev/null and b/src/assets/images/avatar-2.jpg differ
src/assets/images/avatar-3.jpg
Binary files /dev/null and b/src/assets/images/avatar-3.jpg differ
src/assets/images/avatar.jpg
Binary files /dev/null and b/src/assets/images/avatar.jpg differ
src/assets/images/cover-2.jpg
Binary files /dev/null and b/src/assets/images/cover-2.jpg differ
src/assets/images/cover-3.jpg
Binary files /dev/null and b/src/assets/images/cover-3.jpg differ
src/assets/images/cover.jpg
Binary files /dev/null and b/src/assets/images/cover.jpg differ
src/assets/images/img-not-found.svg new
+1
@@ -0,0 +1 @@
1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 600 600" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.41421;"><rect x="0" y="0" width="600" height="600" style="fill:#e2e3e5;"/><circle cx="300" cy="300" r="155" style="fill:none;stroke-width:47px;stroke:#bcbdbf;"/><rect x="160" y="223" width="275" height="166" style="fill:#e3e5e4;"/><path d="M440.5,394.5l-286,0l0,-177l286,0l0,177ZM165.5,228.5l0,155l264,0l0,-155l-264,0Z" style="fill:#fff;"/><path d="M404.434,170.877l-232.94,232.941l35.355,35.355l232.941,-232.94l-35.356,-35.356Z" style="fill:#bcbdbf;"/></svg>
src/assets/images/login2.jpg
Binary files /dev/null and b/src/assets/images/login2.jpg differ
src/assets/images/logo.png
Binary files /dev/null and b/src/assets/images/logo.png differ
src/assets/images/logo.svg new
+1
@@ -0,0 +1 @@
1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><circle cx="530.707" cy="386.605" r="355.605" style="fill:#4a596a;"/><path d="M175.101,386.605c57.888,0 111.022,135.83 152.523,169.979c53.577,44.085 87.767,110.895 87.767,185.627c0,132.619 -107.67,240.289 -240.29,240.289c0.746,0 0,-181.97 0,-240.289c0,-58.319 0.006,-222.986 0,-355.606Z" style="fill:#4a596a;"/><g id="Livello1"><clipPath id="_clip1"><circle cx="530.707" cy="386.605" r="355.605"/></clipPath><g clip-path="url(#_clip1)"><clipPath id="_clip2"><path d="M532.586,30c45.078,0 88.256,8.012 128.121,22.658c0.028,0.01 -0.027,180.949 -0.027,333.447c0,152.499 0.436,333.298 0.027,333.448c-39.865,14.645 -83.043,22.658 -128.121,22.658c-41.3,0 -81.005,-6.726 -118.029,-19.116c0.11,0.036 -0.166,-180.8 -0.166,-336.99c0,-156.155 1.192,-337.332 0.072,-336.957c37.051,-12.411 76.788,-19.148 118.123,-19.148Z"/></clipPath><g clip-path="url(#_clip2)"><path d="M414.391,30l0,712.211l246.289,0l0,-712.211l-246.289,0Z" style="fill:url(#_Linear3);"/></g><clipPath id="_clip4"><path d="M532.707,31c43.98,0 86.105,8.035 125,22.721c0.027,0.011 -0.027,181.458 -0.027,334.384c0,152.927 0.425,334.234 0.027,334.384c-38.895,14.687 -81.02,22.722 -125,22.722c-40.294,0 -79.032,-6.745 -115.154,-19.17c0.107,0.037 -0.162,-181.308 -0.162,-337.936c0,-156.593 1.162,-338.279 0.071,-337.904c36.148,-12.445 74.917,-19.201 115.245,-19.201Z"/></clipPath><g clip-path="url(#_clip4)"><path d="M417.391,31l0,714.211l240.289,0l0,-714.211l-240.289,0Z" style="fill:url(#_Linear5);"/></g></g></g><defs><linearGradient id="_Linear3" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1.14532e-13,-712.211,246.289,-3.96063e-14,537.535,742.211)"><stop offset="0%" style="stop-color:#bde9ff;stop-opacity:1"/><stop offset="52%" style="stop-color:#698092;stop-opacity:1"/><stop offset="100%" style="stop-color:#4a596a;stop-opacity:1"/></linearGradient><linearGradient id="_Linear5" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-1.14854e-13,-714.211,240.289,-3.86415e-14,537.535,745.211)"><stop offset="0%" style="stop-color:#5f8fdf;stop-opacity:1"/><stop offset="52%" style="stop-color:#506789;stop-opacity:1"/><stop offset="100%" style="stop-color:#4a596a;stop-opacity:1"/></linearGradient></defs></svg>
src/assets/images/photo1.jpg
Binary files /dev/null and b/src/assets/images/photo1.jpg differ
src/assets/images/photo2.jpg
Binary files /dev/null and b/src/assets/images/photo2.jpg differ
src/assets/images/photo3.jpg
Binary files /dev/null and b/src/assets/images/photo3.jpg differ
src/assets/images/theme-a.png
Binary files /dev/null and b/src/assets/images/theme-a.png differ
src/assets/images/theme-b.png
Binary files /dev/null and b/src/assets/images/theme-b.png differ
src/assets/images/theme-c.png
Binary files /dev/null and b/src/assets/images/theme-c.png differ
src/assets/images/theme-d.png
Binary files /dev/null and b/src/assets/images/theme-d.png differ
src/assets/scss/_mixins.scss new
+104
@@ -0,0 +1,104 @@
1 +@import "_variables";
2 +
3 +/// Convert angle
4 +/// @author Chris Eppstein
5 +/// @param {Number} $value - Value to convert
6 +/// @param {String} $unit - Unit to convert to
7 +/// @return {Number} Converted angle
8 +@function convert-angle($value, $unit) {
9 + $convertable-units: deg grad turn rad;
10 + $conversion-factors: 1 (10grad/9deg) (1turn/360deg) (3.1415926rad/180deg);
11 + @if index($convertable-units, unit($value)) and index($convertable-units, $unit) {
12 + @return $value / nth($conversion-factors, index($convertable-units, unit($value))) *
13 + nth($conversion-factors, index($convertable-units, $unit));
14 + }
15 +
16 + @warn "Cannot convert `#{unit($value)}` to `#{$unit}`.";
17 +}
18 +
19 +/// Test if `$value` is an angle
20 +/// @param {*} $value - Value to test
21 +/// @return {Bool}
22 +@function is-direction($value) {
23 + $is-direction: index(
24 + (
25 + to top,
26 + to top right,
27 + to right top,
28 + to right,
29 + to bottom right,
30 + to right bottom,
31 + to bottom,
32 + to bottom left,
33 + to left bottom,
34 + to left,
35 + to left top,
36 + to top left
37 + ),
38 + $value
39 + );
40 + $is-angle: type-of($value) == "number" and index("deg" "grad" "turn" "rad", unit($value));
41 +
42 + @return $is-direction or $is-angle;
43 +}
44 +
45 +/// Convert a direction to legacy syntax
46 +/// @param {Keyword | Angle} $value - Value to convert
47 +/// @require {function} is-direction
48 +/// @require {function} convert-angle
49 +@function legacy-direction($value) {
50 + @if is-direction($value) == false {
51 + @warn "Cannot convert `#{$value}` to legacy syntax because it doesn't seem to be an angle or a direction";
52 + }
53 +
54 + $conversion-map: (
55 + to top: bottom,
56 + to top right: bottom left,
57 + to right top: left bottom,
58 + to right: left,
59 + to bottom right: top left,
60 + to right bottom: left top,
61 + to bottom: top,
62 + to bottom left: top right,
63 + to left bottom: right top,
64 + to left: right,
65 + to left top: right bottom,
66 + to top left: bottom right
67 + );
68 +
69 + @if map-has-key($conversion-map, $value) {
70 + @return map-get($conversion-map, $value);
71 + }
72 +
73 + @return 90deg - convert-angle($value, "deg");
74 +}
75 +
76 +/// Mixin printing a linear-gradient
77 +/// as well as a plain color fallback
78 +/// and the `-webkit-` prefixed declaration
79 +/// @access public
80 +/// @param {String | List | Angle} $direction - Linear gradient direction
81 +/// @param {Arglist} $color-stops - List of color-stops composing the gradient
82 +@mixin linear-gradient($direction, $color-stops...) {
83 + @if is-direction($direction) == false {
84 + $color-stops: ($direction, $color-stops);
85 + $direction: 180deg;
86 + }
87 +
88 + background: nth(nth($color-stops, 1), 1);
89 + background: -webkit-linear-gradient(legacy-direction($direction), $color-stops);
90 + background: linear-gradient($direction, $color-stops);
91 +}
92 +
93 +@mixin text-bordered-shadow() {
94 + text-shadow:
95 + 0px 0px 1px lighten($background-color, 0%),
96 + 0px 0px 1px lighten($background-color, 0%),
97 + 0px 0px 1px lighten($background-color, 0%),
98 + 0px 0px 1px lighten($background-color, 0%),
99 + 0px 0px 1px lighten($background-color, 0%),
100 + 0px 0px 1px lighten($background-color, 0%),
101 + 0px 0px 1px lighten($background-color, 0%),
102 + 0px 1px 2px rgba(0, 0, 0, 0.3),
103 + 0px 3px 9px rgba(0, 0, 0, 0.1);
104 +}
src/assets/scss/_variables.scss new
+37
@@ -0,0 +1,37 @@
1 +$background-color: #f3f7fa; //#e8ecee //#F0F5FA //#f6f9fc
2 +$text-color-primary: #4a596a; //#0d2b3e //#34495e
3 +$text-color-accent: #5f8fdf; //#409EFF
4 +$text-color-success: #13ce66;
5 +$text-color-warning: #f7ba2a;
6 +$text-color-danger: #ec205f;
7 +$text-color-info: #909399;
8 +
9 +/* theme-default
10 +$background-color: #f3f7fa;
11 +$text-color-primary: #4a596a;
12 +$text-color-accent: #5f8fdf;
13 +*/
14 +
15 +/* theme-a
16 +$background-color: #ffffff;
17 +$text-color-primary: #000000;
18 +$text-color-accent: #D7195D;
19 +*/
20 +
21 +/* theme-b
22 +$background-color: #8794A3;
23 +$text-color-primary: #ffffff;
24 +$text-color-accent: #52F17E;
25 +*/
26 +
27 +/* theme-c
28 +$background-color: #191d24;
29 +$text-color-primary: #ffffff;
30 +$text-color-accent: #52f17e;
31 +*/
32 +
33 +/* theme-d
34 +$background-color: #2B80F6;
35 +$text-color-primary: #ffffff;
36 +$text-color-accent: #1B2738;
37 +*/
src/assets/scss/card-shadow.scss new
+26
@@ -0,0 +1,26 @@
1 +.card-base {
2 + background-color: #fff;
3 + border-radius: 5px;
4 + overflow: hidden;
5 +}
6 +.card-shadow--small {
7 + box-shadow:
8 + 0 3px 6px 0 rgba(40, 40, 90, 0.09),
9 + 0 1px 1px 0 rgba(0, 0, 0, 0.065);
10 +}
11 +.card-shadow--medium {
12 + box-shadow:
13 + 0 8px 16px 0 rgba(40, 40, 90, 0.09),
14 + 0 3px 6px 0 rgba(0, 0, 0, 0.065);
15 +}
16 +.card-shadow--large {
17 + box-shadow:
18 + 0 13px 30px 0 rgba(40, 40, 90, 0.09),
19 + 0 4px 13px 0 rgba(0, 0, 0, 0.065);
20 +}
21 +.card-shadow--extraLarge {
22 + box-shadow:
23 + 0 40px 90px 0 rgba(40, 40, 90, 0.09),
24 + 0 13px 30px 0 rgba(40, 40, 90, 0.09),
25 + 0 4px 13px 0 rgba(0, 0, 0, 0.065);
26 +}
src/assets/scss/color-schemes.scss new
+206
@@ -0,0 +1,206 @@
1 +//@import '_variables';
2 +
3 +body.theme-a {
4 + .card-base {
5 + background: darken($background-color, 3%);
6 + }
7 +}
8 +
9 +body.theme-b {
10 + .bg-primary {
11 + background-color: $background-color !important;
12 + }
13 + .bg-primary-light {
14 + background-color: lighten($background-color, 15%) !important;
15 + }
16 + .bg-primary-lighter {
17 + background-color: lighten($background-color, 35%) !important;
18 + }
19 +
20 + .card-base {
21 + background: darken($background-color, 15%);
22 + }
23 + .layout-container .footer {
24 + background: darken($background-color, 15%);
25 + }
26 +
27 + .main-navigation-submenu .el-menu,
28 + .main-navigation-submenu .el-menu .el-menu-item:not(.is-active) {
29 + color: #000;
30 + }
31 + .main-navigation-menu.el-menu--horizontal .el-submenu__title,
32 + .main-navigation-menu.el-menu--horizontal .el-menu-item:not(.is-active),
33 + .main-navigation-menu.el-menu--horizontal .el-submenu__title i,
34 + .main-navigation-menu.el-menu--horizontal .el-menu-item:not(.is-active) i {
35 + color: #000;
36 + }
37 + .main-navigation-menu.el-menu--horizontal:not(.el-menu--collapse) .el-menu-item-group__title {
38 + color: rgba(0, 0, 0, 0.35);
39 + }
40 +
41 + .page-header {
42 + &.header-primary {
43 + h1,
44 + h4 {
45 + color: #000;
46 + text-shadow: none;
47 + }
48 +
49 + .el-breadcrumb {
50 + .el-breadcrumb__inner,
51 + .el-breadcrumb__inner a {
52 + color: #000;
53 + }
54 + .el-breadcrumb__separator {
55 + color: transparentize(#000, 0.7);
56 + }
57 + .el-breadcrumb__item:last-child .el-breadcrumb__inner,
58 + .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,
59 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a,
60 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover {
61 + color: transparentize(#000, 0.4);
62 + }
63 + }
64 + }
65 + }
66 + .toolbar .toggle-sidebar {
67 + color: $background-color;
68 + }
69 +}
70 +
71 +body.theme-c {
72 + .bg-primary {
73 + background-color: $background-color !important;
74 + }
75 + .bg-primary-light {
76 + background-color: lighten($background-color, 15%) !important;
77 + }
78 + .bg-primary-lighter {
79 + background-color: lighten($background-color, 35%) !important;
80 + }
81 +
82 + .card-base {
83 + background: lighten($background-color, 5%);
84 + }
85 + .layout-container .footer {
86 + background: lighten($background-color, 5%);
87 + }
88 +
89 + .main-navigation-submenu .el-menu,
90 + .main-navigation-submenu .el-menu .el-menu-item:not(.is-active) {
91 + color: #000;
92 + }
93 + .main-navigation-menu.el-menu--horizontal .el-submenu__title,
94 + .main-navigation-menu.el-menu--horizontal .el-menu-item:not(.is-active),
95 + .main-navigation-menu.el-menu--horizontal .el-submenu__title i,
96 + .main-navigation-menu.el-menu--horizontal .el-menu-item:not(.is-active) i {
97 + color: #000;
98 + }
99 + .main-navigation-menu.el-menu--horizontal:not(.el-menu--collapse) .el-menu-item-group__title {
100 + color: rgba(0, 0, 0, 0.35);
101 + }
102 +
103 + .page-header {
104 + &.header-primary {
105 + h1,
106 + h4 {
107 + color: #000;
108 + text-shadow: none;
109 + }
110 +
111 + .el-breadcrumb {
112 + .el-breadcrumb__inner,
113 + .el-breadcrumb__inner a {
114 + color: #000;
115 + }
116 + .el-breadcrumb__separator {
117 + color: transparentize(#000, 0.7);
118 + }
119 + .el-breadcrumb__item:last-child .el-breadcrumb__inner,
120 + .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,
121 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a,
122 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover {
123 + color: transparentize(#000, 0.4);
124 + }
125 + }
126 + }
127 + }
128 + .toolbar .toggle-sidebar {
129 + color: $background-color;
130 + }
131 +}
132 +
133 +body.theme-d {
134 + .bg-primary {
135 + background-color: $background-color !important;
136 + }
137 + .bg-primary-light {
138 + background-color: lighten($background-color, 15%) !important;
139 + }
140 + .bg-primary-lighter {
141 + background-color: lighten($background-color, 35%) !important;
142 + }
143 +
144 + .card-base {
145 + background: darken($background-color, 25%);
146 + }
147 + .layout-container .footer {
148 + color: darken($background-color, 25%);
149 + }
150 +
151 + .main-navigation-submenu .el-menu,
152 + .main-navigation-submenu .el-menu .el-menu-item:not(.is-active) {
153 + color: #000;
154 + }
155 + .main-navigation-menu.el-menu--horizontal .el-submenu__title,
156 + .main-navigation-menu.el-menu--horizontal .el-menu-item:not(.is-active),
157 + .main-navigation-menu.el-menu--horizontal .el-submenu__title i,
158 + .main-navigation-menu.el-menu--horizontal .el-menu-item:not(.is-active) i {
159 + color: #000;
160 + }
161 + .main-navigation-menu.el-menu--horizontal:not(.el-menu--collapse) .el-menu-item-group__title {
162 + color: rgba(0, 0, 0, 0.35);
163 + }
164 +
165 + .page-header {
166 + &.header-primary {
167 + h1,
168 + h4 {
169 + color: #000;
170 + text-shadow: none;
171 + }
172 +
173 + .el-breadcrumb {
174 + .el-breadcrumb__inner,
175 + .el-breadcrumb__inner a {
176 + color: #000;
177 + }
178 + .el-breadcrumb__separator {
179 + color: transparentize(#000, 0.7);
180 + }
181 + .el-breadcrumb__item:last-child .el-breadcrumb__inner,
182 + .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,
183 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a,
184 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover {
185 + color: transparentize(#000, 0.4);
186 + }
187 + }
188 + }
189 + }
190 + .toolbar .toggle-sidebar {
191 + color: $background-color;
192 + }
193 + .page-calendar .calendar-wrap {
194 + background: darken($background-color, 10%);
195 + }
196 + .fc .fc-month-view .fc-widget-header .fc-day-header,
197 + .fc .fc-agenda-view .fc-head .fc-head-container,
198 + .fc .fc-list-view .fc-list-heading .fc-widget-header {
199 + background: lighten($background-color, 20%);
200 + }
201 +
202 + a {
203 + color: darken($text-color-primary, 10%);
204 + text-decoration-color: transparentize($text-color-primary, 0.7);
205 + }
206 +}
src/assets/scss/ele-table.scss new
+124
@@ -0,0 +1,124 @@
1 +.el-table {
2 + background-color: lighten($background-color, 5%);
3 + color: $text-color-primary;
4 +
5 + &::before,
6 + .el-table--group::after,
7 + .el-table--border::after,
8 + .el-table__fixed::before,
9 + .el-table__fixed-right::before {
10 + background-color: transparentize($background-color, 0.5);
11 + }
12 +
13 + .el-table__body {
14 + tr {
15 + &.hover-row {
16 + & > td,
17 + &.current-row > td,
18 + &.el-table__row--striped > td,
19 + &.el-table__row--striped.current-row > td {
20 + background-color: darken($background-color, 1%);
21 + }
22 + }
23 + }
24 + }
25 +
26 + tr {
27 + background-color: lighten($background-color, 5%);
28 + }
29 +
30 + th {
31 + background-color: lighten(darken($background-color, 0.3%), 2%);
32 +
33 + &.is-leaf {
34 + border-bottom: 1px solid transparentize($background-color, 0.5);
35 + }
36 + }
37 +
38 + td {
39 + border-bottom: 1px solid transparentize($background-color, 0.5);
40 + }
41 +
42 + .el-table-column--selection .cell {
43 + padding-left: 10px;
44 + padding-right: 10px;
45 + }
46 +
47 + .el-checkbox {
48 + .el-checkbox__input {
49 + .el-checkbox__inner {
50 + background: transparent;
51 + }
52 +
53 + &.is-checked,
54 + &.is-indeterminate {
55 + .el-checkbox__inner {
56 + &::after {
57 + border-color: $text-color-accent;
58 + }
59 + &::before {
60 + background-color: $text-color-accent;
61 + }
62 + }
63 + }
64 + }
65 + }
66 +}
67 +.el-pagination {
68 + padding: 8px;
69 + color: $text-color-primary;
70 +
71 + button {
72 + background-color: transparent;
73 + &.btn-next,
74 + &.btn-prev {
75 + background-color: transparent;
76 + color: $text-color-primary;
77 + }
78 + &:disabled {
79 + background-color: transparent;
80 + color: transparentize($text-color-primary, 0.5);
81 + }
82 + }
83 +
84 + .el-pager {
85 + li {
86 + background-color: transparent;
87 +
88 + &.btn-quicknext,
89 + &.btn-quickprev {
90 + color: $text-color-primary;
91 + }
92 + }
93 + }
94 +
95 + .el-pagination__jump {
96 + color: transparentize($text-color-primary, 0.5);
97 +
98 + .el-input__inner {
99 + //background-color: transparentize($background-color, 0.35);
100 + border-color: transparent;
101 + margin-left: 3px;
102 + color: $text-color-primary;
103 + }
104 + }
105 +
106 + .el-pagination__sizes {
107 + margin: 0;
108 +
109 + .el-input {
110 + margin-right: 0;
111 +
112 + .el-input__inner {
113 + //background-color: transparentize($background-color, 0.35);
114 + border-color: transparent;
115 + color: $text-color-primary;
116 + }
117 + }
118 + }
119 +
120 + .el-pagination__total {
121 + padding-left: 6px;
122 + color: transparentize($text-color-primary, 0.5);
123 + }
124 +}
src/assets/scss/element-variables.scss new
+135
@@ -0,0 +1,135 @@
1 +/*
2 +@import "_variables";
3 +complete variables list in: node_modules/element-ui/packages/theme-chalk/src/common/var.scss
4 +*/
5 +
6 +/* icon font path, required
7 +$--font-path: "~element-ui/lib/theme-chalk/fonts";
8 +*/
9 +@use "element-plus/theme-chalk/src/index.scss" as *;
10 +@use "element-plus/theme-chalk/src/display.scss" as *;
11 +//@use "element-plus/theme-chalk/src/common/var.scss" as *;
12 +
13 +/* theme color */
14 +@forward "element-plus/theme-chalk/src/common/var.scss" with (
15 + $colors: (
16 + "primary": (
17 + "base": $text-color-accent
18 + ),
19 + "success": (
20 + "base": $text-color-success
21 + ),
22 + "warning": (
23 + "base": $text-color-warning
24 + ),
25 + "danger": (
26 + "base": $text-color-danger
27 + ),
28 + "info": (
29 + "base": $text-color-info
30 + )
31 + )
32 +);
33 +
34 +.el-form--label-top .el-form-item__label {
35 + padding: 0;
36 + line-height: 30px;
37 +}
38 +.el-upload.el-upload--text {
39 + max-width: 100%;
40 +
41 + .el-upload-dragger {
42 + max-width: 100%;
43 + }
44 +}
45 +.el-message {
46 + min-width: 310px;
47 +}
48 +.el-notification {
49 + width: 290px;
50 +}
51 +.el-message-box {
52 + max-width: 95%;
53 + box-sizing: border-box;
54 +}
55 +
56 +.el-menu--horizontal {
57 + min-height: 35px;
58 +
59 + &.limit-height {
60 + max-height: 60%;
61 + overflow-x: hidden;
62 + overflow-y: auto;
63 + }
64 +
65 + &[x-placement="top-start"],
66 + &[x-placement="top-start"] .el-menu--horizontal,
67 + &[x-placement="top-start"] .el-menu--horizontal > .el-menu--popup {
68 + position: fixed !important;
69 + bottom: 45px !important;
70 + top: initial !important;
71 + transform: none !important;
72 + }
73 +}
74 +.el-menu--vertical {
75 + &.limit-height {
76 + max-height: 90%;
77 + overflow-x: hidden;
78 + overflow-y: auto;
79 + }
80 +
81 + /*&[x-placement="left-start"] {
82 + position: fixed !important;
83 + right: 75px !important;
84 + left: initial !important;
85 + transform: none !important;
86 +
87 + .el-menu--vertical {
88 + position: fixed !important;
89 + right: 280px !important;
90 + left: initial !important;
91 + transform: none !important;
92 +
93 + .el-menu--vertical > .el-menu--popup {
94 + position: fixed !important;
95 + right: 485px !important;
96 + left: initial !important;
97 + transform: none !important;
98 + }
99 + }
100 + }*/
101 +}
102 +
103 +.el-popper {
104 + max-height: 90%;
105 + overflow-x: hidden;
106 + overflow-y: auto;
107 +}
108 +.el-select-dropdown.el-popper,
109 +.el-picker-panel.el-popper,
110 +.el-time-panel.el-popper {
111 + max-height: inherit;
112 + overflow: initial;
113 +}
114 +
115 +.el-tooltip__popper.is-light {
116 + color: #000;
117 +}
118 +
119 +.el-progress .el-progress__text {
120 + color: $text-color-primary;
121 +}
122 +
123 +.el-checkbox .el-checkbox__label {
124 + color: $text-color-primary;
125 +}
126 +
127 +.el-tabs:not(.el-tabs--border-card) {
128 + .el-tabs__item:not(.is-active) {
129 + color: $text-color-primary;
130 + }
131 +}
132 +
133 +.el-dialog {
134 + min-width: 310px;
135 +}
src/assets/scss/float-label.scss new
+49
@@ -0,0 +1,49 @@
1 +//@import '_variables';
2 +
3 +.vfl-has-label.styled {
4 + width: 100%;
5 + max-width: 300px;
6 + margin-top: 16px;
7 + padding-bottom: 16px;
8 +
9 + .vfl-label {
10 + left: 0;
11 + width: 100%;
12 + height: 12px;
13 + line-height: 12px;
14 + font-size: 10px;
15 + text-transform: uppercase;
16 + color: transparentize($text-color-primary, 0.6);
17 +
18 + &.vfl-label-on-input {
19 + left: 0;
20 + top: initial;
21 + bottom: 100%;
22 +
23 + & + input {
24 + border-color: transparentize($text-color-primary, 0.3);
25 + }
26 + }
27 +
28 + &.vfl-label-on-focus {
29 + color: $text-color-accent;
30 +
31 + & + input {
32 + border-color: $text-color-accent;
33 + }
34 + }
35 + }
36 +
37 + .vfl-label + input {
38 + border: none;
39 + border-bottom: 2px solid transparentize($text-color-primary, 0.85);
40 + width: 100%;
41 + padding: 0;
42 + padding-bottom: 4px;
43 + font-size: 16px;
44 + transition: all 0.2s ease-out;
45 + border-radius: 0px;
46 + color: $text-color-primary;
47 + background: transparent;
48 + }
49 +}
src/assets/scss/fullcalendar.scss new
+227
@@ -0,0 +1,227 @@
1 +//@import '_variables';
2 +
3 +.fc {
4 + .fc-toolbar.fc-header-toolbar {
5 + padding: 15px;
6 + margin: 0;
7 + box-sizing: border-box;
8 + //border-bottom: 2px solid $background-color;
9 + margin-bottom: 0 !important;
10 +
11 + h2 {
12 + font-size: 1.5em;
13 + }
14 +
15 + .fc-button {
16 + background: transparent;
17 + border-color: $text-color-accent !important;
18 + color: $text-color-accent;
19 + box-shadow: none;
20 + text-shadow: none;
21 + outline: none;
22 + height: 2.1em;
23 + padding: 0 0.6em;
24 + font-size: 1em;
25 +
26 + &:hover {
27 + background: transparentize($text-color-accent, 0.8);
28 + }
29 +
30 + &.fc-state-disabled {
31 + cursor: not-allowed;
32 + opacity: 0.4;
33 +
34 + &:hover {
35 + background: transparent;
36 + }
37 + }
38 +
39 + &.fc-button-active {
40 + background: $text-color-accent;
41 + color: white;
42 + }
43 + }
44 +
45 + .fc-toolbar-chunk {
46 + margin: 10px;
47 + }
48 + }
49 +
50 + .fc-event {
51 + padding: 3px 7px;
52 + box-sizing: border-box;
53 + background-color: $text-color-primary;
54 + color: $background-color;
55 + border: none;
56 +
57 + &:not(.fc-event-start) {
58 + border-left: 1px dashed $background-color !important;
59 + }
60 + &:not(.fc-event-end) {
61 + border-right: 1px dashed $background-color !important;
62 + }
63 + }
64 +
65 + .fc-daygrid-event-harness[style*="margin-top"] {
66 + padding-top: 4px;
67 + }
68 +
69 + .fc-daygrid-dot-event:hover,
70 + .fc-daygrid-dot-event.fc-event-mirror {
71 + background: transparentize($text-color-primary, 0.25);
72 + }
73 +
74 + .fc-daygrid {
75 + table,
76 + tr,
77 + td,
78 + th {
79 + border: 0;
80 + }
81 +
82 + .fc-col-header-cell {
83 + padding: 15px 0;
84 + background-color: $background-color;
85 + border-bottom: 1px solid lighten($text-color-primary, 60%);
86 +
87 + a {
88 + cursor: default;
89 + color: $text-color-primary;
90 + text-decoration: none;
91 + }
92 + }
93 +
94 + .fc-daygrid-day-number {
95 + font-weight: bold;
96 + padding: 2px 0px;
97 + margin-top: 1px;
98 + background: $background-color;
99 + border-bottom-left-radius: 4px;
100 + border-bottom-right-radius: 4px;
101 + margin: 0 auto;
102 + display: block;
103 + float: inherit !important;
104 + width: 30px;
105 + text-align: center;
106 + }
107 +
108 + .fc-day {
109 + border-top: 1px solid lighten($text-color-primary, 60%);
110 + }
111 +
112 + .fc-more {
113 + font-size: 12px;
114 + line-height: 12px;
115 + display: inline-block;
116 + }
117 +
118 + .fc-more-popover {
119 + .fc-widget-header {
120 + background-color: $background-color;
121 + }
122 + }
123 + }
124 +
125 + .fc-timegrid {
126 + .fc-scrollgrid {
127 + border: none;
128 + }
129 +
130 + .fc-scrollgrid-shrink {
131 + font-weight: bold;
132 + border-color: lighten($text-color-primary, 60%);
133 + }
134 +
135 + .fc-timegrid-slot,
136 + .fc-daygrid-day,
137 + .fc-timegrid-col {
138 + border-color: lighten($text-color-primary, 60%);
139 + }
140 +
141 + .fc-col-header {
142 + background-color: $background-color;
143 +
144 + .fc-col-header-cell {
145 + padding: 15px 0;
146 + border-color: lighten($text-color-primary, 60%);
147 + }
148 +
149 + .fc-timegrid-axis {
150 + border: none;
151 + }
152 + }
153 +
154 + .fc-timegrid-divider {
155 + background: $background-color;
156 + border-color: lighten($text-color-primary, 60%);
157 + padding-bottom: 3px;
158 + }
159 +
160 + .fc-body {
161 + & > tr > .fc-widget-content {
162 + border: none;
163 + }
164 + .fc-widget-content {
165 + border-color: lighten($text-color-primary, 60%);
166 +
167 + .fc-axis {
168 + font-weight: bold;
169 + border-color: lighten($text-color-primary, 60%);
170 + }
171 +
172 + .fc-divider {
173 + background: $background-color;
174 + border-color: lighten($text-color-primary, 60%);
175 + padding-bottom: 3px;
176 + }
177 +
178 + .fc-event-container {
179 + .fc-event {
180 + border: 1px solid $text-color-primary;
181 +
182 + .fc-content {
183 + .fc-time {
184 + font-weight: bold;
185 + }
186 + }
187 + }
188 + }
189 + }
190 + }
191 + }
192 +
193 + .fc-list-view {
194 + border: none;
195 +
196 + .fc-list-heading {
197 + .fc-widget-header {
198 + background-color: $background-color;
199 + border: none;
200 + }
201 + }
202 +
203 + .fc-list-item {
204 + & > * {
205 + border-color: lighten($text-color-primary, 60%);
206 + }
207 +
208 + &:hover {
209 + & > * {
210 + background: transparentize($text-color-primary, 0.9);
211 + }
212 + }
213 + }
214 +
215 + .fc-event-dot {
216 + background-color: $text-color-primary;
217 + }
218 + }
219 +}
220 +
221 +@media (max-width: 768px) {
222 + .fc {
223 + .fc-toolbar.fc-header-toolbar {
224 + font-size: 85%;
225 + }
226 + }
227 +}
src/assets/scss/global.scss new
+153
@@ -0,0 +1,153 @@
1 +@import "_variables";
2 +@import "_mixins";
3 +@import "element-variables";
4 +@import "card-shadow";
5 +@import "helpers";
6 +@import "typography";
7 +@import "status-indicator";
8 +@import "color-schemes";
9 +@import "float-label";
10 +//@import "vuebar";
11 +//@import "perfect-scrollbar";
12 +@import "tables";
13 +//@import 'vue-good-table-v1';
14 +@import "vue-good-table-v2";
15 +@import "ele-table";
16 +@import "v2-table";
17 +@import "fullcalendar";
18 +@import "../fonts/Nunito-Sans.css";
19 +
20 +html,
21 +body {
22 + font-family: "Nunito Sans", Helvetica, Arial, sans-serif;
23 + -webkit-font-smoothing: antialiased;
24 + -moz-osx-font-smoothing: grayscale;
25 + line-height: 1.4;
26 +
27 + height: 100%;
28 + //height: 100vh;
29 + width: 100%;
30 + //width: 100vw;
31 + margin: 0;
32 + padding: 0;
33 + box-sizing: border-box;
34 + overflow: hidden;
35 + position: fixed;
36 +
37 + background: darken($background-color, 30%);
38 + color: $text-color-primary;
39 +}
40 +
41 +[v-cloak] {
42 + display: none !important;
43 +}
44 +
45 +::selection {
46 + background-color: $text-color-accent;
47 + color: #fff;
48 +}
49 +
50 +::placeholder {
51 + /* Chrome, Firefox, Opera, Safari 10.1+ */
52 + color: transparentize($text-color-primary, 0.5);
53 + opacity: 1; /* Firefox */
54 +}
55 +:-ms-input-placeholder {
56 + /* Internet Explorer 10-11 */
57 + color: transparentize($text-color-primary, 0.5);
58 +}
59 +::-ms-input-placeholder {
60 + /* Microsoft Edge */
61 + color: transparentize($text-color-primary, 0.5);
62 +}
63 +
64 +#app {
65 + height: 100vh;
66 +}
67 +
68 +.page-header {
69 + margin-bottom: 45px;
70 +
71 + h1 {
72 + margin: 0;
73 + @include text-bordered-shadow();
74 + }
75 +
76 + h4 {
77 + margin: 0;
78 + margin-top: 10px;
79 + opacity: 0.5;
80 + }
81 +
82 + .el-breadcrumb {
83 + margin-top: 10px;
84 + line-height: 1.3;
85 +
86 + .el-breadcrumb__inner,
87 + .el-breadcrumb__inner a {
88 + color: $text-color-primary;
89 + }
90 + .el-breadcrumb__separator {
91 + color: transparentize($text-color-primary, 0.7);
92 + }
93 + .el-breadcrumb__item:last-child .el-breadcrumb__inner,
94 + .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,
95 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a,
96 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover {
97 + color: transparentize($text-color-primary, 0.4);
98 + }
99 + }
100 +
101 + &.card-base {
102 + padding: 24px;
103 + }
104 + &.header-accent {
105 + background: $text-color-accent !important;
106 + }
107 + &.header-primary {
108 + background: $text-color-primary !important;
109 + }
110 + &.header-accent-gradient {
111 + background: $text-color-accent;
112 + background: linear-gradient(45deg, $text-color-accent 0%, lighten($text-color-accent, 20%) 100%) !important;
113 + }
114 + &.header-accent,
115 + &.header-primary,
116 + &.header-accent-gradient {
117 + h1,
118 + h4 {
119 + color: white;
120 + text-shadow: none;
121 + }
122 +
123 + .el-breadcrumb {
124 + .el-breadcrumb__inner,
125 + .el-breadcrumb__inner a {
126 + color: white;
127 + }
128 + .el-breadcrumb__separator {
129 + color: transparentize(white, 0.7);
130 + }
131 + .el-breadcrumb__item:last-child .el-breadcrumb__inner,
132 + .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,
133 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a,
134 + .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover {
135 + color: transparentize(white, 0.4);
136 + }
137 + }
138 + }
139 +}
140 +
141 +/* fix Vuetify flex problem */
142 +.flex {
143 + flex: initial;
144 +}
145 +.container {
146 + padding: initial;
147 +}
148 +
149 +/*@media (max-width: 768px) {
150 + .page-header:not(.card-base) {
151 + padding: 0 10px;
152 + }
153 +}*/
src/assets/scss/helpers.scss new
+329
@@ -0,0 +1,329 @@
1 +//@import '_variables';
2 +//@import "~element-ui/packages/theme-chalk/src/common/var";
3 +
4 +// Div scrollable
5 +.scrollable {
6 + overflow-x: auto;
7 + overflow-y: auto;
8 + -webkit-overflow-scrolling: touch !important;
9 +
10 + &.only-x {
11 + overflow-x: auto !important;
12 + overflow-y: hidden !important;
13 + }
14 +
15 + &.only-y {
16 + overflow-x: hidden !important;
17 + overflow-y: auto !important;
18 + }
19 +}
20 +@media (min-width: 769px) {
21 + .scrollable {
22 + &::-webkit-scrollbar {
23 + width: 5px;
24 + height: 5px;
25 + }
26 + &::-webkit-scrollbar-thumb,
27 + &::-webkit-scrollbar-track {
28 + background: transparent;
29 + border-radius: 5px;
30 + }
31 + &::-webkit-scrollbar-thumb {
32 + background: transparentize($text-color-primary, 0.95);
33 + }
34 + &:hover::-webkit-scrollbar-thumb {
35 + background: transparentize($text-color-primary, 0.85);
36 +
37 + &:hover {
38 + background: transparentize($text-color-primary, 0.75);
39 + }
40 + }
41 + &:hover::-webkit-scrollbar-track {
42 + background: transparentize($text-color-primary, 0.95);
43 + }
44 + }
45 +}
46 +
47 +// Classic vertical align
48 +.align-vertical {
49 + &:before {
50 + display: inline-block;
51 + height: 100%;
52 + content: "";
53 + vertical-align: middle;
54 + }
55 +
56 + .align-vertical-top,
57 + .align-vertical-middle,
58 + .align-vertical-bottom {
59 + display: inline-block;
60 + }
61 + .align-vertical-top {
62 + vertical-align: top;
63 + }
64 + .align-vertical-middle {
65 + vertical-align: middle;
66 + }
67 + .align-vertical-bottom {
68 + vertical-align: bottom;
69 + }
70 +}
71 +
72 +// Padding / Margin helpers
73 +.no-p {
74 + padding: 0 !important;
75 +}
76 +.no-m {
77 + margin: 0 !important;
78 +}
79 +@for $i from 0 through 200 {
80 + //padding
81 + .padding-#{$i},
82 + .p-#{$i} {
83 + padding: #{($i) + "px"};
84 + }
85 + .padding-top-#{$i},
86 + .pt-#{$i} {
87 + padding-top: #{($i) + "px"};
88 + }
89 + .padding-right-#{$i},
90 + .pr-#{$i} {
91 + padding-right: #{($i) + "px"};
92 + }
93 + .padding-bottom-#{$i},
94 + .pb-#{$i} {
95 + padding-bottom: #{($i) + "px"};
96 + }
97 + .padding-left-#{$i},
98 + .pl-#{$i} {
99 + padding-left: #{($i) + "px"};
100 + }
101 + .padding-horizontal-#{$i},
102 + .ph-#{$i} {
103 + padding-left: #{($i) + "px"};
104 + padding-right: #{($i) + "px"};
105 + }
106 + .padding-vertical-#{$i},
107 + .pv-#{$i} {
108 + padding-top: #{($i) + "px"};
109 + padding-bottom: #{($i) + "px"};
110 + }
111 +
112 + //margin
113 + .margin-#{$i},
114 + .m-#{$i} {
115 + margin: #{($i) + "px"};
116 + }
117 + .margin-top-#{$i},
118 + .mt-#{$i} {
119 + margin-top: #{($i) + "px"};
120 + }
121 + .margin-right-#{$i},
122 + .mr-#{$i} {
123 + margin-right: #{($i) + "px"};
124 + }
125 + .margin-bottom-#{$i},
126 + .mb-#{$i} {
127 + margin-bottom: #{($i) + "px"};
128 + }
129 + .margin-left-#{$i},
130 + .ml-#{$i} {
131 + margin-left: #{($i) + "px"};
132 + }
133 + .margin-horizontal-#{$i},
134 + .mh-#{$i} {
135 + margin-left: #{($i) + "px"};
136 + margin-right: #{($i) + "px"};
137 + }
138 + .margin-vertical-#{$i},
139 + .mv-#{$i} {
140 + margin-top: #{($i) + "px"};
141 + margin-bottom: #{($i) + "px"};
142 + }
143 +}
144 +
145 +// Border helpers
146 +$border-style: 1px solid transparentize($text-color-primary, 0.85);
147 +.border,
148 +.b {
149 + border: $border-style;
150 +}
151 +.border-top,
152 +.bt {
153 + border-top: $border-style;
154 +}
155 +.border-right,
156 +.br {
157 + border-right: $border-style;
158 +}
159 +.border-bottom,
160 +.bb {
161 + border-bottom: $border-style;
162 +}
163 +.border-left,
164 +.bl {
165 + border-left: $border-style;
166 +}
167 +.border-horizontal,
168 +.bh {
169 + border-left: $border-style;
170 + border-right: $border-style;
171 +}
172 +.border-vertical,
173 +.bv {
174 + border-top: $border-style;
175 + border-bottom: $border-style;
176 +}
177 +
178 +// Border-radius helpers
179 +.no-b-rad {
180 + border-radius: 0;
181 +}
182 +@for $i from 1 through 50 {
183 + .b-rad-#{$i} {
184 + border-radius: #{$i + "px"};
185 + }
186 +}
187 +
188 +// Opacity helpers
189 +.o-0 {
190 + opacity: 0;
191 +}
192 +.o-005 {
193 + opacity: 0.05;
194 +}
195 +.o-010 {
196 + opacity: 0.1;
197 +}
198 +.o-015 {
199 + opacity: 0.15;
200 +}
201 +.o-020 {
202 + opacity: 0.2;
203 +}
204 +.o-025 {
205 + opacity: 0.25;
206 +}
207 +.o-030 {
208 + opacity: 0.3;
209 +}
210 +.o-035 {
211 + opacity: 0.35;
212 +}
213 +.o-040 {
214 + opacity: 0.4;
215 +}
216 +.o-045 {
217 + opacity: 0.45;
218 +}
219 +.o-050 {
220 + opacity: 0.5;
221 +}
222 +.o-055 {
223 + opacity: 0.55;
224 +}
225 +.o-060 {
226 + opacity: 0.6;
227 +}
228 +.o-065 {
229 + opacity: 0.65;
230 +}
231 +.o-070 {
232 + opacity: 0.7;
233 +}
234 +.o-075 {
235 + opacity: 0.75;
236 +}
237 +.o-080 {
238 + opacity: 0.8;
239 +}
240 +.o-085 {
241 + opacity: 0.85;
242 +}
243 +.o-090 {
244 + opacity: 0.9;
245 +}
246 +.o-095 {
247 + opacity: 0.95;
248 +}
249 +.o-1 {
250 + opacity: 1;
251 +}
252 +
253 +.bg-primary {
254 + background-color: $text-color-primary !important;
255 +}
256 +.bg-primary-light {
257 + background-color: lighten($text-color-primary, 20%) !important;
258 +}
259 +.bg-primary-lighter {
260 + background-color: lighten($text-color-primary, 45%) !important;
261 +}
262 +.bg-accent {
263 + background-color: $text-color-accent !important;
264 +}
265 +.bg-accent-light {
266 + background-color: lighten($text-color-accent, 20%) !important;
267 +}
268 +.bg-accent-lighter {
269 + background-color: lighten($text-color-accent, 30%) !important;
270 +}
271 +.bg-white {
272 + background-color: $color-white !important;
273 +}
274 +.bg-black {
275 + background-color: $color-black !important;
276 +}
277 +.bg-success,
278 +.bg-green {
279 + background-color: $color-success !important;
280 +}
281 +.bg-warning,
282 +.bg-orange {
283 + background-color: $color-warning !important;
284 +}
285 +.bg-danger,
286 +.bg-red {
287 + background-color: $color-danger !important;
288 +}
289 +.bg-info,
290 +.bg-grey {
291 + background-color: $color-info !important;
292 +}
293 +.bg-success-light,
294 +.bg-green-light {
295 + background-color: lighten($color-success, 25%) !important;
296 +}
297 +.bg-warning-light,
298 +.bg-orange-light {
299 + background-color: lighten($color-warning, 25%) !important;
300 +}
301 +.bg-danger-light,
302 +.bg-red-light {
303 + background-color: lighten($color-danger, 20%) !important;
304 +}
305 +.bg-info-light,
306 +.bg-grey-light {
307 + background-color: lighten($color-info, 15%) !important;
308 +}
309 +.bg-success-lighter,
310 +.bg-green-lighter {
311 + background-color: lighten($color-success, 35%) !important;
312 +}
313 +.bg-warning-lighter,
314 +.bg-orange-lighter {
315 + background-color: lighten($color-warning, 35%) !important;
316 +}
317 +.bg-danger-lighter,
318 +.bg-red-lighter {
319 + background-color: lighten($color-danger, 30%) !important;
320 +}
321 +.bg-info-lighter,
322 +.bg-grey-lighter {
323 + background-color: lighten($color-info, 25%) !important;
324 +}
325 +
326 +.bg-accent-gradient {
327 + background: $text-color-accent;
328 + background: linear-gradient(45deg, $text-color-accent 0%, lighten($text-color-accent, 20%) 100%) !important;
329 +}
src/assets/scss/perfect-scrollbar.scss new
+59
@@ -0,0 +1,59 @@
1 +//@import '_variables';
2 +@import "perfect-scrollbar/css/perfect-scrollbar.css";
3 +
4 +.ps:hover > .ps__scrollbar-y-rail:hover,
5 +.ps.ps--in-scrolling.ps--y > .ps__scrollbar-y-rail,
6 +.ps:hover.ps--in-scrolling.ps--y > .ps__scrollbar-y-rail,
7 +.ps:hover > .ps__scrollbar-x-rail:hover,
8 +.ps.ps--in-scrolling.ps--x > .ps__scrollbar-x-rail,
9 +.ps:hover.ps--in-scrolling.ps--x > .ps__scrollbar-x-rail {
10 + background-color: transparentize($text-color-primary, 0.9) !important;
11 + opacity: 1 !important;
12 +}
13 +.ps > .ps__scrollbar-y-rail > .ps__scrollbar-y,
14 +.ps > .ps__rail-y > .ps__thumb-y {
15 + right: 0 !important;
16 + background-color: transparentize($text-color-primary, 0.7) !important;
17 + transition:
18 + width 0.5s,
19 + transform 0.5s !important;
20 + transform: translateX(-4px) !important;
21 + width: 4px !important;
22 +}
23 +.ps.ps--in-scrolling.ps--y > .ps__scrollbar-y-rail > .ps__scrollbar-y,
24 +.ps:hover.ps--in-scrolling.ps--y > .ps__scrollbar-y-rail > .ps__scrollbar-y,
25 +.ps:hover > .ps__scrollbar-y-rail:hover > .ps__scrollbar-y,
26 +.ps:hover > .ps__rail-y:hover > .ps__thumb-y {
27 + right: 0 !important;
28 + background-color: transparentize($text-color-primary, 0.5) !important;
29 + transform: translateX(-2px) !important;
30 + width: 8px !important;
31 +}
32 +.ps > .ps__scrollbar-y-rail,
33 +.ps > .ps__rail-y {
34 + width: 12px !important;
35 +}
36 +
37 +.ps > .ps__scrollbar-x-rail > .ps__scrollbar-x,
38 +.ps > .ps__rail-x > .ps__thumb-x {
39 + bottom: 0 !important;
40 + background-color: transparentize($text-color-primary, 0.7) !important;
41 + transition:
42 + height 0.5s,
43 + transform 0.5s !important;
44 + transform: translateY(-4px) !important;
45 + height: 4px !important;
46 +}
47 +.ps.ps--in-scrolling.ps--x > .ps__scrollbar-x-rail > .ps__scrollbar-x,
48 +.ps:hover.ps--in-scrolling.ps--x > .ps__scrollbar-x-rail > .ps__scrollbar-x,
49 +.ps:hover > .ps__scrollbar-x-rail:hover > .ps__scrollbar-x,
50 +.ps:hover > .ps__rail-x:hover > .ps__thumb-x {
51 + bottom: 0 !important;
52 + background-color: transparentize($text-color-primary, 0.5) !important;
53 + transform: translateY(-2px) !important;
54 + height: 8px !important;
55 +}
56 +.ps > .ps__scrollbar-x-rail,
57 +.ps > .ps__rail-x {
58 + height: 12px !important;
59 +}
src/assets/scss/status-indicator.scss new
+118
@@ -0,0 +1,118 @@
1 +:root {
2 + --status-indicator-size: 10px;
3 + --status-indicator-animation-duration: 2s;
4 + --status-indicator-color: rgb(216, 226, 233);
5 + --status-indicator-color-semi: rgba(216, 226, 233, 0.5);
6 + --status-indicator-color-transparent: rgba(216, 226, 233, 0);
7 + --status-indicator-color-active: rgb(0, 149, 255);
8 + --status-indicator-color-active-semi: rgba(0, 149, 255, 0.5);
9 + --status-indicator-color-active-transparent: rgba(0, 149, 255, 0);
10 + --status-indicator-color-positive: rgb(75, 210, 143);
11 + --status-indicator-color-positive-semi: rgba(75, 210, 143, 0.5);
12 + --status-indicator-color-positive-transparent: rgba(75, 210, 143, 0);
13 + --status-indicator-color-intermediary: rgb(255, 170, 0);
14 + --status-indicator-color-intermediary-semi: rgba(255, 170, 0, 0.5);
15 + --status-indicator-color-intermediary-transparent: rgba(255, 170, 0, 0);
16 + --status-indicator-color-negative: rgb(255, 77, 77);
17 + --status-indicator-color-negative-semi: rgba(255, 77, 77, 0.5);
18 + --status-indicator-color-negative-transparent: rgba(255, 77, 77, 0);
19 +}
20 +
21 +@keyframes status-indicator-pulse {
22 + 0% {
23 + box-shadow: 0 0 0 0 var(--status-indicator-color-semi);
24 + }
25 + 70% {
26 + box-shadow: 0 0 0 var(--status-indicator-size) var(--status-indicator-color-transparent);
27 + }
28 + 100% {
29 + box-shadow: 0 0 0 0 var(--status-indicator-color-transparent);
30 + }
31 +}
32 +@keyframes status-indicator-pulse-active {
33 + 0% {
34 + box-shadow: 0 0 0 0 var(--status-indicator-color-active-semi);
35 + }
36 + 70% {
37 + box-shadow: 0 0 0 var(--status-indicator-size) var(--status-indicator-color-active-transparent);
38 + }
39 + 100% {
40 + box-shadow: 0 0 0 0 var(--status-indicator-color-active-transparent);
41 + }
42 +}
43 +@keyframes status-indicator-pulse-positive {
44 + 0% {
45 + box-shadow: 0 0 0 0 var(--status-indicator-color-positive-semi);
46 + }
47 + 70% {
48 + box-shadow: 0 0 0 var(--status-indicator-size) var(--status-indicator-color-positive-transparent);
49 + }
50 + 100% {
51 + box-shadow: 0 0 0 0 var(--status-indicator-color-positive-transparent);
52 + }
53 +}
54 +@keyframes status-indicator-pulse-intermediary {
55 + 0% {
56 + box-shadow: 0 0 0 0 var(--status-indicator-color-intermediary-semi);
57 + }
58 + 70% {
59 + box-shadow: 0 0 0 var(--status-indicator-size) var(--status-indicator-color-intermediary-transparent);
60 + }
61 + 100% {
62 + box-shadow: 0 0 0 0 var(--status-indicator-color-intermediary-transparent);
63 + }
64 +}
65 +@keyframes status-indicator-pulse-negative {
66 + 0% {
67 + box-shadow: 0 0 0 0 var(--status-indicator-color-negative-semi);
68 + }
69 + 70% {
70 + box-shadow: 0 0 0 var(--status-indicator-size) var(--status-indicator-color-negative-transparent);
71 + }
72 + 100% {
73 + box-shadow: 0 0 0 0 var(--status-indicator-color-negative-transparent);
74 + }
75 +}
76 +.status-indicator {
77 + display: inline-block;
78 + border-radius: 50%;
79 + cursor: pointer;
80 + width: var(--status-indicator-size);
81 + height: var(--status-indicator-size);
82 + background-color: var(--status-indicator-color);
83 +}
84 +.status-indicator.pulse {
85 + animation-name: status-indicator-pulse;
86 + animation-duration: var(--status-indicator-animation-duration);
87 + animation-timing-function: ease-in-out;
88 + animation-iteration-count: infinite;
89 + animation-direction: normal;
90 + animation-delay: 0;
91 + animation-fill-mode: none;
92 +}
93 +.status-indicator.active {
94 + background-color: var(--status-indicator-color-active);
95 +}
96 +.status-indicator.active.pulse {
97 + animation-name: status-indicator-pulse-active;
98 +}
99 +.status-indicator.positive {
100 + background-color: var(--status-indicator-color-positive);
101 + animation-name: status-indicator-pulse-positive;
102 +}
103 +.status-indicator.positive.pulse {
104 + animation-name: status-indicator-pulse-positive;
105 +}
106 +.status-indicator.intermediary {
107 + background-color: var(--status-indicator-color-intermediary);
108 +}
109 +.status-indicator.intermediary.pulse {
110 + animation-name: status-indicator-pulse-intermediary;
111 +}
112 +.status-indicator.negative {
113 + background-color: var(--status-indicator-color-negative);
114 + animation-name: status-indicator-pulse-negative;
115 +}
116 +.status-indicator.negative.pulse {
117 + animation-name: status-indicator-pulse-negative;
118 +}
src/assets/scss/tables.scss new
+57
@@ -0,0 +1,57 @@
1 +table.styled {
2 + width: 100%;
3 + border: none;
4 + border-collapse: collapse;
5 + text-align: left;
6 +
7 + thead {
8 + background: transparentize($background-color, 0.7);
9 + border-bottom: 2px solid transparentize($background-color, 0.5);
10 +
11 + tr {
12 + th {
13 + padding: 12px 20px;
14 + color: transparentize($text-color-primary, 0.6);
15 + }
16 + }
17 + }
18 +
19 + tbody tr td {
20 + padding: 12px 20px;
21 + }
22 +
23 + &.striped {
24 + tbody tr:nth-child(even) {
25 + background: transparentize($background-color, 0.6);
26 + }
27 + }
28 +
29 + &.fixed-header {
30 + width: 100%;
31 + height: 100%;
32 + table-layout: fixed;
33 +
34 + tr {
35 + display: -webkit-box;
36 + display: -ms-flexbox;
37 + display: flex;
38 + --flex-grid: 12;
39 +
40 + th,
41 + td {
42 + word-wrap: break-word;
43 + overflow: hidden;
44 + -webkit-box-flex: 1;
45 + -ms-flex: 1 0;
46 + flex: 1 0;
47 + }
48 + }
49 +
50 + tbody {
51 + display: block;
52 + overflow: auto;
53 + width: calc(100% + 6px);
54 + height: 100%;
55 + }
56 + }
57 +}
src/assets/scss/typography.scss new
+367
@@ -0,0 +1,367 @@
1 +//@import '_variables';
2 +//@import "~element-ui/packages/theme-chalk/src/common/var";
3 +//@import "element-variables";
4 +
5 +//hr
6 +hr.styled {
7 + border: none;
8 + border-top: 1px solid transparentize($text-color-primary, 0.8);
9 + border-bottom: 1px solid transparentize($text-color-primary, 0.9);
10 +}
11 +
12 +//header 1
13 +h1 {
14 + font-size: 2em;
15 +}
16 +h1.h-big {
17 + font-size: 3.5em;
18 +}
19 +h2.h-big {
20 + font-size: 3em;
21 +}
22 +h3.h-big {
23 + font-size: 2.5em;
24 +}
25 +
26 +//blockquote
27 +blockquote {
28 + font-style: italic;
29 + padding: 5px 20px;
30 + margin: 0 0 20px;
31 +
32 + > p {
33 + margin-top: 0;
34 + }
35 +
36 + &:not(.reverse) {
37 + border-left: 5px solid transparentize($text-color-primary, 0.9);
38 +
39 + .small::before,
40 + footer::before,
41 + small::before {
42 + content: "\2014 \00A0";
43 + }
44 + }
45 + &.reverse {
46 + border-right: 5px solid transparentize($text-color-primary, 0.9);
47 + text-align: right;
48 +
49 + .small::after,
50 + footer::after,
51 + small::after {
52 + content: "\2014 \00A0";
53 + }
54 + }
55 +}
56 +
57 +//definition lists
58 +dl {
59 + dt {
60 + font-weight: 700;
61 + }
62 + dd {
63 + margin: 4px 0 16px;
64 + }
65 +
66 + &.horizontal {
67 + dt {
68 + float: left;
69 + width: 25%;
70 + clear: left;
71 + text-align: right;
72 + overflow: hidden;
73 + text-overflow: ellipsis;
74 + white-space: nowrap;
75 + }
76 +
77 + dd {
78 + margin-left: 30%;
79 + }
80 + }
81 +}
82 +
83 +//code
84 +pre {
85 + background: transparentize($text-color-primary, 0.95);
86 + padding: 10px;
87 + border-radius: 3px;
88 +}
89 +
90 +//list
91 +ul,
92 +ol,
93 +li {
94 + &.list-unstyled {
95 + list-style: none;
96 + }
97 +}
98 +ul,
99 +ol {
100 + &.list-unstyled {
101 + padding: 0;
102 + }
103 +}
104 +ul.styled,
105 +ul.styled ul {
106 + padding: 0;
107 + list-style-type: none;
108 +
109 + li {
110 + padding-left: 1.3rem;
111 + padding-bottom: 0.2rem;
112 +
113 + &::before {
114 + content: "";
115 + display: inline-block;
116 + width: 0.5rem;
117 + height: 0.5rem;
118 + position: relative;
119 + right: 1.1rem;
120 + top: -0.05rem;
121 + margin-right: -0.5em;
122 + border-radius: 50%;
123 + background-color: $text-color-accent;
124 + box-sizing: border-box;
125 + }
126 +
127 + li:before {
128 + background-color: #fff;
129 + border: 2px solid $text-color-accent;
130 + }
131 + }
132 +}
133 +ol.styled,
134 +ol.styled ol {
135 + padding: 0;
136 + counter-reset: a;
137 +
138 + li {
139 + list-style: none;
140 + padding-left: 1.3rem;
141 + padding-bottom: 0.2rem;
142 +
143 + &::before {
144 + counter-increment: a;
145 + content: counter(a);
146 + display: inline-block;
147 + width: 0.9rem;
148 + height: 0.9rem;
149 + position: relative;
150 + right: 1.1rem;
151 + top: -0.15rem;
152 + margin-right: -0.5em;
153 + text-align: center;
154 + line-height: 0.95rem;
155 + background: $text-color-accent;
156 + color: white;
157 + font-size: 0.5rem;
158 + border-radius: 50%;
159 + }
160 +
161 + li:before {
162 + background-color: #fff;
163 + border: 1px solid $text-color-accent;
164 + color: $text-color-accent;
165 + }
166 + }
167 +}
168 +
169 +//abbreviation
170 +abbr[title] {
171 + border-bottom: none;
172 + text-decoration: underline;
173 + -webkit-text-decoration: underline dashed;
174 + text-decoration: underline dashed;
175 + text-decoration-color: transparentize($text-color-primary, 0.5);
176 +}
177 +abbr {
178 + cursor: help;
179 + border-bottom: 1px dashed transparentize($text-color-primary, 0.5);
180 +}
181 +
182 +//marked text
183 +mark {
184 + background-color: transparentize($text-color-accent, 0.8);
185 + padding: 0 3px;
186 + border-radius: 3px;
187 +}
188 +
189 +//link
190 +a {
191 + color: $text-color-accent;
192 + cursor: pointer;
193 + text-decoration: underline;
194 + text-decoration-color: transparentize($text-color-accent, 0.7);
195 +}
196 +
197 +//selected text
198 +.text-selected {
199 + background-color: $text-color-accent;
200 + color: white;
201 + padding: 0 3px;
202 +}
203 +
204 +.text-capitalized {
205 + text-transform: capitalize;
206 +}
207 +.text-uppercase {
208 + text-transform: uppercase;
209 +}
210 +.text-lowercase {
211 + text-transform: lowercase;
212 +}
213 +
214 +.primary-text {
215 + color: $text-color-primary;
216 +}
217 +.secondary-text {
218 + color: transparentize($text-color-primary, 0.4);
219 +}
220 +.hint-text {
221 + color: transparentize($text-color-primary, 0.7);
222 +}
223 +.accent-text {
224 + color: $text-color-accent;
225 +}
226 +.white-text {
227 + color: $color-white;
228 +}
229 +.black-text {
230 + color: $color-black;
231 +}
232 +.success-text {
233 + color: $color-success;
234 +}
235 +.warning-text {
236 + color: $color-warning;
237 +}
238 +.danger-text {
239 + color: $color-danger;
240 +}
241 +.info-text {
242 + color: $color-info;
243 +}
244 +.success-light-text {
245 + color: lighten($color-success, 25%);
246 +}
247 +.warning-light-text {
248 + color: lighten($color-warning, 25%);
249 +}
250 +.danger-light-text {
251 + color: lighten($color-danger, 20%);
252 +}
253 +.info-light-text {
254 + color: lighten($color-info, 15%);
255 +}
256 +.success-lighter-text {
257 + color: lighten($color-success, 35%);
258 +}
259 +.warning-lighter-text {
260 + color: lighten($color-warning, 35%);
261 +}
262 +.danger-lighter-text {
263 + color: lighten($color-danger, 30%);
264 +}
265 +.info-lighter-text {
266 + color: lighten($color-info, 25%);
267 +}
268 +
269 +/* text align */
270 +.text-left {
271 + text-align: left;
272 +}
273 +.text-right {
274 + text-align: right;
275 +}
276 +.text-center {
277 + text-align: center;
278 +}
279 +.text-justify {
280 + text-align: justify;
281 +}
282 +
283 +/* text divider */
284 +.text-divider {
285 + display: -ms-flexbox;
286 + display: flex;
287 + -ms-flex-direction: row;
288 + flex-direction: row;
289 + -ms-flex-pack: center;
290 + justify-content: center;
291 + -ms-flex-align: center;
292 + align-items: center;
293 +
294 + &::before {
295 + content: "";
296 + height: 1px;
297 + background: transparentize($text-color-primary, 0.7);
298 + -ms-flex: 1 1 100%;
299 + flex: 1;
300 + margin: 0 10px 0 0;
301 + }
302 + &::after {
303 + content: "";
304 + height: 1px;
305 + background: transparentize($text-color-primary, 0.7);
306 + -ms-flex: 1 1 100%;
307 + flex: 1;
308 + margin: 0 0 0 10px;
309 + }
310 +}
311 +
312 +//font weight
313 +.font-weight-100,
314 +.fw-100 {
315 + font-weight: 100;
316 +}
317 +.font-weight-200,
318 +.fw-200 {
319 + font-weight: 200;
320 +}
321 +.font-weight-300,
322 +.fw-300 {
323 + font-weight: 300;
324 +}
325 +.font-weight-400,
326 +.fw-400 {
327 + font-weight: 400;
328 +}
329 +.font-weight-500,
330 +.fw-500 {
331 + font-weight: 500;
332 +}
333 +.font-weight-600,
334 +.fw-600 {
335 + font-weight: 600;
336 +}
337 +.font-weight-700,
338 +.fw-700 {
339 + font-weight: 700;
340 +}
341 +.font-weight-800,
342 +.fw-800 {
343 + font-weight: 800;
344 +}
345 +.font-weight-900,
346 +.fw-900 {
347 + font-weight: 900;
348 +}
349 +
350 +// FontSize / LineHeight
351 +@for $i from 0 through 200 {
352 + .font-size-#{$i},
353 + .fs-#{$i} {
354 + font-size: #{($i) + "px"};
355 + }
356 + .line-height-#{$i},
357 + .lh-#{$i} {
358 + line-height: #{($i) + "px"};
359 + }
360 +}
361 +
362 +//text-truncate
363 +.text-truncate {
364 + overflow: hidden;
365 + text-overflow: ellipsis;
366 + white-space: nowrap;
367 +}
src/assets/scss/v2-table.scss new
+195
@@ -0,0 +1,195 @@
1 +.v2-table.styled {
2 + background: transparent;
3 + color: $text-color-primary;
4 +
5 + $v2-table-header-tmp: darken($background-color, 1%);
6 + $v2-table-header: lighten($v2-table-header-tmp, 2%);
7 +
8 + .v2-table__row {
9 + background-color: lighten($background-color, 5%);
10 +
11 + &.row-hover {
12 + background-color: darken($background-color, 1%);
13 + }
14 + }
15 +
16 + .v2-table__cell {
17 + border-bottom-color: transparentize($background-color, 0.6);
18 + }
19 + .v2-table__cell.v2-table__row-cell {
20 + color: $text-color-primary;
21 + }
22 + .v2-table__cell.v2-table__column-cell {
23 + background-color: $v2-table-header;
24 + font-weight: bold;
25 + color: transparentize($text-color-primary, 0.6);
26 + }
27 + .v2-table__body.v2-table__header-border,
28 + .v2-table__footer.v2-table__header-border,
29 + .v2-table__header.v2-table__header-border {
30 + border-top: none;
31 + }
32 + .v2-table-fixed.v2-table__fixed-left .v2-table__cell:first-child {
33 + border-left-color: transparent;
34 + }
35 + .v2-table-fixed.v2-table__fixed-right .v2-table__cell:last-child {
36 + border-right-color: transparent;
37 + }
38 + .v2-table__header-row .v2-table__cell:first-child {
39 + border-left-color: transparent !important;
40 + }
41 + .v2-table__header-row .v2-table__cell:last-child {
42 + border-right-color: transparent !important;
43 + }
44 + .v2-table__table-tbody .v2-table__row .v2-table__cell:first-child {
45 + border-left-color: transparent !important;
46 + }
47 + .v2-table__table-tbody .v2-table__row .v2-table__cell:last-child {
48 + border-right-color: transparent !important;
49 + }
50 + .v2-table__sort-caret.descending-caret {
51 + border-top: 5px solid transparentize($text-color-primary, 0.9);
52 + }
53 + .v2-table__cell.v2-table__column-cell.descending .descending-caret {
54 + border-top: 5px solid $text-color-accent;
55 + }
56 + .v2-table__sort-caret.ascending-caret {
57 + border-bottom: 5px solid transparentize($text-color-primary, 0.9);
58 + }
59 + .v2-table__cell.v2-table__column-cell.ascending .ascending-caret {
60 + border-bottom: 5px solid $text-color-accent;
61 + }
62 + .v2-checkbox__input.is-checked .v2-checkbox__inner {
63 + border-color: $text-color-accent !important;
64 + }
65 + .v2-checkbox__inner::after {
66 + border-color: $text-color-accent !important;
67 + }
68 + .v2-checkbox__input.is-indeterminate .v2-checkbox__inner {
69 + background-color: $text-color-accent !important;
70 + border-color: $text-color-accent !important;
71 + }
72 + .v2-checkbox-list-wrap {
73 + border-left: none !important;
74 + border-top: none !important;
75 + background-color: lighten($background-color, 5%);
76 + }
77 + .v2-checkbox-item.checked-all {
78 + background: $v2-table-header;
79 + border-bottom-color: transparentize($background-color, 0.7);
80 + }
81 + .v2-checkbox-item {
82 + border-bottom-color: transparentize($background-color, 0.7) !important;
83 +
84 + &.checkbox-hover {
85 + background-color: darken($background-color, 1%);
86 + }
87 + }
88 + .v2-checkbox__input {
89 + background: transparent;
90 + }
91 +
92 + .v2-table__pagination-box {
93 + margin: 0;
94 + padding: 8px;
95 + box-sizing: border-box;
96 + user-select: none;
97 + height: 40px;
98 + border-top: 1px solid transparentize($background-color, 0.5);
99 + }
100 + .v2-table__pagination-box .pagination-text-info {
101 + left: 10px;
102 + top: 4px;
103 + color: transparentize($text-color-primary, 0.6);
104 +
105 + strong {
106 + color: transparentize($text-color-primary, 0.3);
107 + }
108 + }
109 + .v2-table__pagination .page {
110 + border-radius: 5px;
111 + height: 24px;
112 + line-height: 24px;
113 + border: none;
114 + font-weight: bold;
115 + color: $text-color-primary;
116 + background: transparent;
117 +
118 + &.next-page,
119 + &.prev-page {
120 + font-size: 20px;
121 + }
122 + }
123 + .v2-table__pagination ul .cur-page {
124 + //border-color: $text-color-accent;
125 + //background-color: $text-color-accent;
126 + background: transparent;
127 + color: $text-color-accent;
128 + }
129 + .v2-table__pagination ul .cur-page:hover {
130 + border-color: $text-color-accent;
131 + color: $text-color-accent;
132 + opacity: 0.7;
133 + }
134 + .v2-table__pagination .page:hover {
135 + color: $text-color-accent;
136 + border-color: $text-color-accent;
137 + opacity: 0.7;
138 + }
139 + .v2-table__pagination .page.disabled {
140 + color: transparentize($text-color-primary, 0.7);
141 + }
142 + .v2-table__data-loading .path {
143 + stroke: $text-color-accent;
144 + }
145 +
146 + .v2-scroll__x-thumb,
147 + .v2-scroll__y-thumb {
148 + border-radius: 5px;
149 + background-color: transparentize($text-color-primary, 0.7);
150 + opacity: 0;
151 + -webkit-transition: none;
152 + transition: none;
153 + }
154 + .beautify-scroll__x-thumb,
155 + .beautify-scroll__y-thumb {
156 + border-radius: 5px;
157 + background-color: transparentize($text-color-primary, 0.7);
158 + opacity: 0;
159 + -webkit-transition: none;
160 + transition: none;
161 + }
162 +
163 + &.mobile {
164 + .v2-table__table-container {
165 + overflow: scroll !important;
166 + }
167 + .v2-checkbox-list-wrap {
168 + display: none !important;
169 + }
170 + .v2-table__pagination-box {
171 + .pagination-text-info {
172 + top: 0;
173 + left: 6px;
174 + font-size: 10px;
175 + line-height: 23px;
176 + }
177 +
178 + .v2-table__pagination {
179 + bottom: -10px;
180 +
181 + .page {
182 + height: 14px;
183 + line-height: 14px;
184 + font-size: 12px;
185 + padding: 0 6px;
186 + }
187 +
188 + .page.next-page,
189 + .page.prev-page {
190 + font-size: 18px;
191 + }
192 + }
193 + }
194 + }
195 +}
src/assets/scss/vue-good-table-v1.scss new
+102
@@ -0,0 +1,102 @@
1 +.good-table.styled {
2 + .global-search {
3 + padding: 0;
4 + //padding-left: .75rem;
5 +
6 + .global-search-icon {
7 + display: none;
8 + }
9 +
10 + .global-search-input {
11 + outline: none;
12 + padding: 0;
13 + border: none;
14 + box-shadow: none;
15 + color: $text-color-primary;
16 + background: transparent;
17 + }
18 + }
19 +
20 + .table {
21 + td {
22 + border-top: 1px solid transparentize($background-color, 0.7);
23 + }
24 + tr:first-child {
25 + td {
26 + border: none;
27 + }
28 + }
29 + th.line-numbers {
30 + opacity: 0.5;
31 + background: transparent;
32 + }
33 + thead th {
34 + background: transparentize($background-color, 0.7) !important;
35 + border-bottom-color: transparentize($background-color, 0.5);
36 + border-top: 0;
37 + opacity: 1 !important;
38 + color: transparentize($text-color-primary, 0.6);
39 +
40 + &.sorting-asc,
41 + &.sorting-desc {
42 + color: $text-color-primary;
43 + }
44 + }
45 +
46 + .sorting {
47 + cursor: pointer;
48 +
49 + input {
50 + outline: none;
51 + padding: 0;
52 + border: none;
53 + box-shadow: none;
54 + background: transparent;
55 + border-bottom: 1px solid $background-color;
56 + border-radius: 0;
57 + }
58 + }
59 +
60 + .text-disabled {
61 + color: transparentize($text-color-primary, 0.6);
62 + }
63 + }
64 +
65 + .table-footer {
66 + border: 0;
67 + background-color: transparentize($background-color, 0.5);
68 + color: transparentize($text-color-primary, 0.6);
69 +
70 + .browser-default {
71 + color: transparentize($text-color-primary, 0.3);
72 + }
73 +
74 + .info {
75 + color: transparentize($text-color-primary, 0.3);
76 + }
77 + }
78 +
79 + .page-btn {
80 + outline: none;
81 + color: transparentize($text-color-primary, 0.3);
82 +
83 + .chevron.left::after {
84 + border-right-color: transparentize($text-color-primary, 0.3);
85 + }
86 + .chevron.right::after {
87 + border-left-color: transparentize($text-color-primary, 0.3);
88 + }
89 +
90 + &.disabled {
91 + .chevron.left::after {
92 + border-right-color: transparentize($text-color-primary, 0.6);
93 + }
94 + .chevron.right::after {
95 + border-left-color: transparentize($text-color-primary, 0.6);
96 + }
97 + }
98 + }
99 + .datatable-length select {
100 + outline: none;
101 + }
102 +}
src/assets/scss/vue-good-table-v2.scss new
+112
@@ -0,0 +1,112 @@
1 +.vgt-wrap.styled {
2 + .vgt-global-search {
3 + padding: 10px;
4 + border: none;
5 + background: transparent;
6 +
7 + .vgt-global-search__input {
8 + outline: none;
9 + padding: 0;
10 + border: none;
11 + box-shadow: none;
12 + color: $text-color-primary;
13 + background: transparent;
14 +
15 + .input__icon {
16 + display: none;
17 + }
18 +
19 + .vgt-input {
20 + border: none;
21 + color: $text-color-primary;
22 + }
23 + }
24 +
25 + .vgt-global-search__actions {
26 + display: none;
27 + }
28 + }
29 +
30 + .vgt-table {
31 + border: none;
32 +
33 + td {
34 + border: none;
35 + border-top: 1px solid transparentize($background-color, 0.7);
36 + }
37 + tr:first-child {
38 + td {
39 + border: none;
40 + }
41 + }
42 + th.line-numbers {
43 + opacity: 0.5;
44 + background: transparent;
45 + }
46 + thead th {
47 + border: none;
48 + background: transparentize($background-color, 0.7) !important;
49 + border-bottom: 2px solid transparentize($background-color, 0.5);
50 + border-top: 0;
51 + opacity: 1 !important;
52 + color: transparentize($text-color-primary, 0.6);
53 +
54 + &.sorting-asc,
55 + &.sorting-desc {
56 + color: $text-color-primary;
57 + }
58 + }
59 +
60 + .sorting {
61 + cursor: pointer;
62 +
63 + input {
64 + outline: none;
65 + padding: 0;
66 + border: none;
67 + box-shadow: none;
68 + background: transparent;
69 + border-bottom: 1px solid $background-color;
70 + border-radius: 0;
71 + }
72 + }
73 +
74 + .text-disabled {
75 + color: transparentize($text-color-primary, 0.6);
76 + }
77 + }
78 +
79 + .vgt-wrap__footer {
80 + border: 0;
81 + background: transparentize($background-color, 0.5);
82 + color: transparentize($text-color-primary, 0.6);
83 +
84 + .footer__navigation__info {
85 + color: transparentize($text-color-primary, 0.3);
86 + }
87 + }
88 +
89 + .footer__navigation__page-btn {
90 + outline: none;
91 + color: transparentize($text-color-primary, 0.3);
92 +
93 + .chevron.left::after {
94 + border-right-color: transparentize($text-color-primary, 0.3);
95 + }
96 + .chevron.right::after {
97 + border-left-color: transparentize($text-color-primary, 0.3);
98 + }
99 +
100 + &.disabled {
101 + .chevron.left::after {
102 + border-right-color: transparentize($text-color-primary, 0.6);
103 + }
104 + .chevron.right::after {
105 + border-left-color: transparentize($text-color-primary, 0.6);
106 + }
107 + }
108 + }
109 + .datatable-length select {
110 + outline: none;
111 + }
112 +}
src/assets/scss/vuebar.scss new
+53
@@ -0,0 +1,53 @@
1 +.vb {
2 + & > .vb-dragger {
3 + z-index: 5;
4 + width: 9px;
5 + right: 0;
6 +
7 + & > .vb-dragger-styler {
8 + backface-visibility: hidden;
9 + transform: rotate3d(0, 0, 0, 0);
10 + transition:
11 + background-color 100ms ease-out,
12 + margin 100ms ease-out,
13 + height 100ms ease-out;
14 + background-color: transparentize($text-color-primary, 0.9);
15 + margin: 5px 5px 5px 0;
16 + border-radius: 20px;
17 + height: calc(100% - 10px);
18 + display: block;
19 + }
20 +
21 + &:hover {
22 + & > .vb-dragger-styler {
23 + background-color: transparentize($text-color-primary, 0.7);
24 + margin: 0px;
25 + height: 100%;
26 + }
27 + }
28 + }
29 +
30 + &.vb-scrolling-phantom {
31 + & > .vb-dragger {
32 + & > .vb-dragger-styler {
33 + background-color: transparentize($text-color-primary, 0.5);
34 + }
35 + }
36 + }
37 + &.vb-dragging {
38 + & > .vb-dragger {
39 + & > .vb-dragger-styler {
40 + background-color: transparentize($text-color-primary, 0.5);
41 + margin: 0px;
42 + height: 100%;
43 + }
44 + }
45 + }
46 + &.vb-dragging-phantom {
47 + & > .vb-dragger {
48 + & > .vb-dragger-styler {
49 + background-color: transparentize($text-color-primary, 0.5);
50 + }
51 + }
52 + }
53 +}
src/components/Affix.vue new
+143
@@ -0,0 +1,143 @@
1 +<template>
2 + <div class="affix-placeholder" :style="wrapStyle">
3 + <div :class="{ affix: affixed }" :style="styles">
4 + <slot></slot>
5 + </div>
6 + </div>
7 +</template>
8 +<script>
9 +import { defineComponent } from "@vue/runtime-core"
10 +
11 +export default defineComponent({
12 + props: {
13 + offset: {
14 + type: Number,
15 + default: 0
16 + },
17 + onAffix: {
18 + type: Function,
19 + default() {}
20 + },
21 + boundary: {
22 + type: String,
23 + default: ""
24 + },
25 + scrollerid: {
26 + type: String,
27 + default: ""
28 + }
29 + },
30 +
31 + data() {
32 + return {
33 + scroller: window,
34 + scrollerIsWindow: true,
35 + affixed: false,
36 + styles: {},
37 + affixedClientHeight: 0,
38 + affixedClientWidth: 0,
39 + wrapStyle: {}
40 + }
41 + },
42 +
43 + methods: {
44 + getScroll(w, top) {
45 + let prop = this.scrollerIsWindow || w === window ? `page${top ? "Y" : "X"}Offset` : `scroll${top ? "Top" : "Left"}`
46 +
47 + return this.scroller[prop]
48 + },
49 + getOffset(element) {
50 + const rect = element.getBoundingClientRect()
51 + const body = document.body
52 + //console.log(rect, element.clientTop, body.clientTop)
53 + const clientTop = element.clientTop || body.clientTop || 0
54 + const clientLeft = element.clientLeft || body.clientLeft || 0
55 + //const clientHeight = element.clientHeight || 0;
56 + const scrollTop = this.getScroll(this.scroller, true)
57 + const scrollLeft = this.getScroll(this.scroller)
58 + return {
59 + top: rect.bottom + scrollTop - clientTop - this.affixedClientHeight,
60 + left: rect.left + scrollLeft - clientLeft
61 + }
62 + },
63 +
64 + handleScroll() {
65 + const scrollTop = this.getScroll(this.scroller, true) + this.offsets // handle setting offset
66 + const elementOffset = this.getOffset(this.$el)
67 +
68 + const scrollerOffset = 60
69 +
70 + if (!this.affixed && scrollTop + scrollerOffset > elementOffset.top) {
71 + this.affixed = true
72 + this.styles = {
73 + top: `${this.offsets + scrollerOffset}px`,
74 + left: `${elementOffset.left}px`,
75 + width: `${this.$el.offsetWidth}px`
76 + }
77 + this.onAffix(this.affixed)
78 + }
79 +
80 + // if setting boundary
81 + if (this.boundary && scrollTop > elementOffset.top) {
82 + const el = window.document.getElementById(this.boundary)
83 + if (el) {
84 + const boundaryOffset = this.getOffset(el)
85 + if (scrollTop + this.offsets + scrollerOffset > boundaryOffset.top) {
86 + //const top = scrollTop - boundaryOffset.top;
87 + const top = boundaryOffset.top - scrollTop
88 + this.styles.top = `${top}px`
89 + }
90 + }
91 + }
92 +
93 + if (this.affixed && scrollTop + scrollerOffset < elementOffset.top) {
94 + this.affixed = false
95 + this.styles = {}
96 + this.onAffix(this.affixed)
97 + }
98 +
99 + if (this.affixed && this.boundary) {
100 + const el = window.document.getElementById(this.boundary)
101 + if (el) {
102 + const boundaryOffset = this.getOffset(el)
103 + if (scrollTop + this.offsets + scrollerOffset <= boundaryOffset.top) {
104 + //this.styles.top = 0 ;
105 + this.styles.top = `${0 + scrollerOffset}px`
106 + }
107 + }
108 + }
109 + }
110 + },
111 +
112 + computed: {
113 + offsets() {
114 + if (this.boundary) return 0
115 + return this.offset
116 + }
117 + },
118 +
119 + mounted() {
120 + if (this.scrollerid) {
121 + this.scrollerIsWindow = false
122 + this.scroller = window.document.getElementById(this.scrollerid)
123 + }
124 +
125 + this.affixedClientHeight = this.$el.children[0].clientHeight
126 + this.affixedClientWidth = this.$el.children[0].clientWidth
127 +
128 + this.wrapStyle = { height: `${this.affixedClientHeight}px`, width: `${this.affixedClientWidth}px` }
129 + this.scroller.addEventListener("scroll", this.handleScroll)
130 + this.scroller.addEventListener("resize", this.handleScroll)
131 + },
132 +
133 + beforeUnmount() {
134 + this.scroller.removeEventListener("scroll", this.handleScroll)
135 + this.scroller.removeEventListener("resize", this.handleScroll)
136 + }
137 +})
138 +</script>
139 +<style lang="scss" scoped>
140 +.affix {
141 + position: fixed;
142 +}
143 +</style>
src/components/NotificationBox.vue new
+99
@@ -0,0 +1,99 @@
1 +<template>
2 + <div class="notification-box">
3 + <div class="notify" v-for="n of notifications" :key="n.id">
4 + <div class="flex">
5 + <div class="n-title box grow">
6 + <strong><i :class="n.icon"></i> {{ n.title }}</strong>
7 + </div>
8 + <div class="n-date">{{ n.date }} <i class="mdi mdi-clock-outline"></i></div>
9 + </div>
10 + <div class="n-desc">{{ n.desc }}</div>
11 + </div>
12 + <div class="see-all">See all notifications</div>
13 + </div>
14 +</template>
15 +
16 +<script>
17 +import { defineComponent } from "@vue/runtime-core"
18 +
19 +export default defineComponent({
20 + name: "NotificationBox",
21 + data() {
22 + return {
23 + notifications: [
24 + {
25 + id: 1,
26 + title: "New order",
27 + icon: "mdi mdi-cart-outline",
28 + desc: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in diam sit amet felis ultricies ultricies vitae et tortor. Proin dapibus justo felis, ut imperdiet lacus accumsan quis.",
29 + date: "Just now!"
30 + },
31 + {
32 + id: 2,
33 + title: "New Schedule Realease",
34 + icon: "mdi mdi-calendar",
35 + desc: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in diam sit amet felis ultricies ultricies vitae et tortor. Proin dapibus justo felis, ut imperdiet lacus accumsan quis.",
36 + date: "2 Min Ago"
37 + },
38 + {
39 + id: 3,
40 + title: "New message from David",
41 + icon: "mdi mdi-email-outline",
42 + desc: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in diam sit amet felis ultricies ultricies vitae et tortor. Proin dapibus justo felis, ut imperdiet lacus accumsan quis.",
43 + date: "30 Min Ago"
44 + }
45 + ]
46 + }
47 + }
48 +})
49 +</script>
50 +
51 +<!-- Add "scoped" attribute to limit CSS to this component only -->
52 +<style lang="scss" scoped>
53 +@import "../assets/scss/_variables";
54 +
55 +.notification-box {
56 + color: $text-color-primary;
57 +
58 + .notify {
59 + margin-bottom: 20px;
60 + max-height: 70px;
61 + overflow: hidden;
62 + position: relative;
63 +
64 + &::after {
65 + content: "";
66 + display: block;
67 + position: absolute;
68 + bottom: 0;
69 + left: 0;
70 + right: 0;
71 + width: 100%;
72 + height: 20px;
73 + box-shadow: 0px -20px 20px -10px $background-color inset;
74 + }
75 +
76 + .n-title {
77 + text-align: left;
78 + padding-right: 10px;
79 + }
80 + .n-desc {
81 + color: transparentize($text-color-primary, 0.5);
82 + }
83 +
84 + &:hover {
85 + color: $text-color-accent;
86 +
87 + .n-desc {
88 + color: transparentize($text-color-accent, 0.5);
89 + }
90 + }
91 + }
92 +
93 + .see-all {
94 + &:hover {
95 + color: $text-color-accent;
96 + }
97 + }
98 +}
99 +</style>
src/components/Profile/ProfileEdit.vue new
+231
@@ -0,0 +1,231 @@
1 +<template>
2 + <div class="page-profile-edit">
3 + <div class="label-switch-box">
4 + <span>label: </span>
5 + <el-radio-group v-model="labelPosition" size="small">
6 + <el-radio-button label="left">Left</el-radio-button>
7 + <el-radio-button label="right">Right</el-radio-button>
8 + <el-radio-button label="top">Top</el-radio-button>
9 + </el-radio-group>
10 + </div>
11 +
12 + <el-form ref="form" :model="form" label-width="120px" :label-position="labelPosition">
13 + <el-col>
14 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
15 + <el-form-item label="Username">
16 + <el-input v-model="form.username" />
17 + </el-form-item>
18 + </el-col>
19 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
20 + <el-form-item label="Email">
21 + <el-input v-model="form.email" type="email" />
22 + </el-form-item>
23 + </el-col>
24 + </el-col>
25 + <el-col>
26 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
27 + <el-form-item label="First name">
28 + <el-input v-model="form.firstName" />
29 + </el-form-item>
30 + </el-col>
31 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
32 + <el-form-item label="Last name">
33 + <el-input v-model="form.lastName" />
34 + </el-form-item>
35 + </el-col>
36 + </el-col>
37 + <el-col>
38 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
39 + <el-form-item label="Birthday">
40 + <el-date-picker type="date" placeholder="Pick a date" v-model="form.birthday" style="width: 100%"></el-date-picker>
41 + </el-form-item>
42 + </el-col>
43 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
44 + <el-form-item label="Gender">
45 + <el-radio-group v-model="form.gender">
46 + <el-radio label="Male" border></el-radio>
47 + <el-radio label="Female" border></el-radio>
48 + </el-radio-group>
49 + </el-form-item>
50 + </el-col>
51 + </el-col>
52 + <el-col>
53 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
54 + <el-form-item label="Phone">
55 + <el-input v-model="form.phone" placeholder="+xx xxx xxx xxxx" />
56 + </el-form-item>
57 + </el-col>
58 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
59 + <el-form-item label="Website">
60 + <el-input v-model="form.website" placeholder="https://" />
61 + </el-form-item>
62 + </el-col>
63 + </el-col>
64 + <el-col>
65 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
66 + <el-form-item label="Address">
67 + <el-input v-model="form.address" />
68 + </el-form-item>
69 + </el-col>
70 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
71 + <el-form-item label="Postal code">
72 + <el-input v-model="form.postalCode" />
73 + </el-form-item>
74 + </el-col>
75 + </el-col>
76 + <el-col>
77 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
78 + <el-form-item label="City">
79 + <el-input v-model="form.city" />
80 + </el-form-item>
81 + </el-col>
82 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
83 + <el-form-item label="Country">
84 + <el-input v-model="form.country" />
85 + </el-form-item>
86 + </el-col>
87 + </el-col>
88 + <el-col>
89 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
90 + <el-form-item label="Hobbies">
91 + <el-select
92 + class="select-wide"
93 + v-model="form.hobbies"
94 + multiple
95 + filterable
96 + allow-create
97 + default-first-option
98 + placeholder="Choose tags for your hobbies"
99 + >
100 + <el-option v-for="item in hobbies" :key="item.value" :label="item.label" :value="item.value"> </el-option>
101 + </el-select>
102 + </el-form-item>
103 + </el-col>
104 + <el-col :span="12" :md="12" :sm="24" :xs="24" class="col-p">
105 + <el-form-item label="Skills">
106 + <el-select
107 + class="select-wide"
108 + v-model="form.skills"
109 + multiple
110 + filterable
111 + allow-create
112 + default-first-option
113 + placeholder="Choose tags for your skills"
114 + >
115 + <el-option v-for="item in skills" :key="item.value" :label="item.label" :value="item.value"> </el-option>
116 + </el-select>
117 + </el-form-item>
118 + </el-col>
119 + </el-col>
120 +
121 + <el-col class="col-p">
122 + <el-form-item label="About me">
123 + <el-input type="textarea" v-model="form.aboutMe" autosize></el-input>
124 + </el-form-item>
125 + </el-col>
126 + <el-col class="col-p">
127 + <el-form-item>
128 + <el-button type="primary" @click="onSubmit">Save</el-button>
129 + <el-button>Cancel</el-button>
130 + </el-form-item>
131 + </el-col>
132 + </el-form>
133 + </div>
134 +</template>
135 +
136 +<script>
137 +import { defineComponent } from "@vue/runtime-core"
138 +
139 +export default defineComponent({
140 + name: "ProfileEdit",
141 + data() {
142 + return {
143 + form: {
144 + username: "aShenton",
145 + email: "ashenton@mail.com",
146 + firstName: "Aurora",
147 + lastName: "Shenton",
148 + birthday: "1991-02-13T23:00:00.000Z",
149 + phone: "",
150 + website: "",
151 + hobbies: [],
152 + skills: ["JavaScript", "HTML", "CSS", "Vue.js"],
153 + gender: "Female",
154 + address: "",
155 + city: "",
156 + country: "",
157 + postalCode: "",
158 + aboutMe:
159 + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec dapibus posuere libero, nec convallis arcu ullamcorper a. Vestibulum diam neque, egestas scelerisque arcu a, fermentum ornare mauris. Ut venenatis vulputate maximus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur scelerisque quis turpis ac tempus. Quisque dolor dolor, fermentum nec magna eget, fringilla auctor lacus. Aenean sagittis est ac ligula pharetra, quis imperdiet ante dignissim. Ut vehicula nec nisl a pretium. Quisque faucibus auctor viverra. Sed ultricies convallis magna. In blandit eros id efficitur vulputate. Duis efficitur sollicitudin dui non vehicula. Nullam ut eros fermentum, dapibus metus non, accumsan neque. Mauris sed pellentesque felis. Suspendisse viverra risus sit amet congue consectetur."
160 + },
161 + hobbies: [
162 + {
163 + value: "Model building",
164 + label: "Model building"
165 + },
166 + {
167 + value: "Drawing",
168 + label: "Drawing"
169 + },
170 + {
171 + value: "Snowboarding",
172 + label: "Snowboarding"
173 + }
174 + ],
175 + skills: [
176 + {
177 + value: "HTML",
178 + label: "HTML"
179 + },
180 + {
181 + value: "CSS",
182 + label: "CSS"
183 + },
184 + {
185 + value: "JavaScript",
186 + label: "JavaScript"
187 + }
188 + ],
189 + labelPosition: "right"
190 + }
191 + },
192 + methods: {
193 + onSubmit() {
194 + console.log("submit!")
195 + },
196 + resizeLabelPosition() {
197 + if (window.innerWidth <= 768) {
198 + this.labelPosition = "top"
199 + }
200 + }
201 + },
202 + mounted() {
203 + this.resizeLabelPosition()
204 + window.addEventListener("resize", this.resizeLabelPosition)
205 + },
206 + beforeUnmount() {
207 + window.removeEventListener("resize", this.resizeLabelPosition)
208 + }
209 +})
210 +</script>
211 +
212 +<style lang="scss" scoped>
213 +@import "../../assets/scss/_variables";
214 +
215 +.page-profile-edit {
216 + .label-switch-box {
217 + display: block;
218 + clear: both;
219 + width: 100%;
220 + text-align: right;
221 + margin-bottom: 20px;
222 + }
223 + .col-p {
224 + padding: 0 10px;
225 + box-sizing: border-box;
226 + }
227 + .select-wide {
228 + width: 100%;
229 + }
230 +}
231 +</style>
src/components/Profile/ProfileGallery.vue new
+124
@@ -0,0 +1,124 @@
1 +<template>
2 + <div class="profile-gallery">
3 + <viewer :images="images" class="images-list" :class="{ ['box-margins']: !!boxMargins }">
4 + <!--<img v-for="i in 50" :key="i" v-lazy="'/static/images/gallery/photo-'+i+'.jpg'" alt="gallery image">-->
5 + <!-- lazy load -->
6 + <img v-for="i in 50" :key="i" :src="'/static/images/gallery/photo-' + i + '.jpg'" alt="gallery image" />
7 + </viewer>
8 + </div>
9 +</template>
10 +
11 +<script>
12 +import { defineComponent } from "@vue/runtime-core"
13 +
14 +export default defineComponent({
15 + name: "ProfileGallery",
16 + props: ["boxMargins"],
17 + data() {
18 + return {
19 + images: []
20 + }
21 + }
22 +})
23 +</script>
24 +
25 +<style lang="scss" scoped>
26 +@import "../../assets/scss/_variables";
27 +
28 +.profile-gallery {
29 + /*.images-list {
30 + margin: 0 -10px;
31 + margin-top: -10px;
32 +
33 + img {
34 + cursor: pointer;
35 + width: calc(50% - 20px);
36 + border-radius: 10px;
37 + max-width: 278px;
38 + float: left;
39 + box-sizing: border-box;
40 + margin: 10px;
41 + border: 5px solid #fff;
42 + box-shadow: 0px 7px 20px -7px rgba(0, 0, 0, 0.55);
43 + transition: all .5s;
44 +
45 + &:hover {
46 + box-shadow: none;
47 + transform: translateY(3px);
48 + }
49 + }
50 + }*/
51 +
52 + .images-list {
53 + overflow: hidden;
54 + margin: -1%;
55 + &.box-margins {
56 + margin: 1%;
57 + }
58 +
59 + img {
60 + cursor: pointer;
61 + width: 18%;
62 + border-radius: 10px;
63 + //max-width: 278px;
64 + float: left;
65 + box-sizing: border-box;
66 + margin: 1%;
67 + border: 5px solid #fff;
68 + box-shadow: 0px 7px 20px -7px rgba(0, 0, 0, 0.55);
69 + transition: all 0.5s;
70 +
71 + &:hover {
72 + box-shadow: none;
73 + transform: translateY(3px);
74 + }
75 + }
76 + }
77 +}
78 +
79 +@media (max-width: 768px) {
80 + .profile-gallery {
81 + .images-list {
82 + margin: -1.5%;
83 + &.box-margins {
84 + margin: 1.5%;
85 + }
86 +
87 + img {
88 + width: 30.3%;
89 + margin: 1.5%;
90 + }
91 + }
92 + }
93 +}
94 +@media (max-width: 480px) {
95 + .profile-gallery {
96 + .images-list {
97 + margin: -2%;
98 + &.box-margins {
99 + margin: 2%;
100 + }
101 +
102 + img {
103 + width: 46%;
104 + margin: 2%;
105 + }
106 + }
107 + }
108 +}
109 +@media (max-width: 360px) {
110 + .profile-gallery {
111 + .images-list {
112 + margin: -2%;
113 + &.box-margins {
114 + margin: 2%;
115 + }
116 +
117 + img {
118 + width: 96%;
119 + margin: 2%;
120 + }
121 + }
122 + }
123 +}
124 +</style>
src/components/Profile/ProfileTimeline.vue new
+126
@@ -0,0 +1,126 @@
1 +<template>
2 + <div class="page-profile-timeline">
3 + <div class="timeline">
4 + <div class="time-box" v-for="i in 6" :key="i">
5 + <div class="time-pin">
6 + <div class="avatar">
7 + <img src="@/assets/images/avatar.jpg" alt="avatar" />
8 + </div>
9 + </div>
10 + <div class="time-wrap">
11 + <div class="time-content__header">
12 + <strong class="username">Aurora Shenton</strong>
13 + <span class="time">1{{ i }}/05/2018 22:4{{ i + 2 }}</span>
14 + </div>
15 + <div class="time-content__content" v-if="i % 2">
16 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce dictum finibus maximus. Morbi nibh lorem, bibendum
17 + porttitor turpis sed, molestie aliquam nibh. Curabitur condimentum ipsum accumsan elementum lobortis. Sed at turpis
18 + est. Nam maximus tempor orci ac dictum.
19 + </div>
20 + <div class="time-content__content" v-else>
21 + Donec dapibus molestie lacus ac pellentesque. Quisque imperdiet ultricies elementum. Quisque quis ullamcorper nisl,
22 + a facilisis augue. Fusce in lacus dapibus, eleifend orci non, maximus nunc.
23 + </div>
24 + </div>
25 + </div>
26 + </div>
27 + </div>
28 +</template>
29 +
30 +<script>
31 +import { defineComponent } from "@vue/runtime-core"
32 +
33 +export default defineComponent({
34 + name: "ProfileTimeline",
35 + data() {
36 + return {}
37 + }
38 +})
39 +</script>
40 +
41 +<style lang="scss" scoped>
42 +@import "../../assets/scss/_variables";
43 +
44 +.page-profile-timeline {
45 + .timeline {
46 + font-family: inherit;
47 +
48 + .time-box {
49 + padding-bottom: 40px;
50 + overflow: hidden;
51 + position: relative;
52 +
53 + &:before {
54 + content: "";
55 + display: block;
56 + width: 2px;
57 + background: $background-color;
58 + position: absolute;
59 + top: 0px;
60 + left: 24px;
61 + bottom: 0px;
62 + }
63 +
64 + &:first-child {
65 + &:before {
66 + top: 25px;
67 + }
68 + }
69 + &:last-child {
70 + &:before {
71 + bottom: inherit;
72 + height: 15px;
73 + }
74 + }
75 +
76 + .time-pin {
77 + width: 50px;
78 + height: 50px;
79 + padding: 5px;
80 + display: block;
81 + overflow: hidden;
82 + float: left;
83 + box-sizing: border-box;
84 + position: relative;
85 +
86 + .avatar {
87 + width: 40px;
88 + height: 40px;
89 + border-radius: 50%;
90 + overflow: hidden;
91 + border: 2px solid #fff;
92 + box-shadow: 0px 3px 4px -2px rgba(0, 0, 0, 0.4);
93 + box-sizing: border-box;
94 +
95 + img {
96 + width: 100%;
97 + }
98 + }
99 + }
100 +
101 + .time-wrap {
102 + width: 100%;
103 + display: block;
104 + float: right;
105 + margin-left: -50px;
106 + padding-left: 60px;
107 + box-sizing: border-box;
108 +
109 + .time-content__header {
110 + font-size: 14px;
111 + margin-bottom: 5px;
112 + border-bottom: 1px solid transparentize($text-color-primary, 0.8);
113 +
114 + & > * {
115 + margin-right: 10px;
116 + }
117 +
118 + .time {
119 + opacity: 0.5;
120 + }
121 + }
122 + }
123 + }
124 + }
125 +}
126 +</style>
src/components/Search.vue new
+214
@@ -0,0 +1,214 @@
1 +<template>
2 + <div class="search-box">
3 + <el-autocomplete
4 + class="search-input"
5 + popper-class="search-box-popper card-base card-shadow--small"
6 + v-model="search"
7 + :fetch-suggestions="querySearch"
8 + placeholder="Search..."
9 + :trigger-on-focus="true"
10 + clearable
11 + size="small"
12 + @select="handleSelect"
13 + >
14 + <template #prefix>
15 + <i class="mdi mdi-magnify"></i>
16 + </template>
17 + <template #default="{ item }">
18 + <span class="value">{{ item.value }}</span>
19 + <span class="tags">{{ item.tags }}</span>
20 + </template>
21 + <template #suffix>
22 + <i class="el-input__icon el-icon-circle-close-outline" @click="search = ''" v-if="search"></i>
23 + </template>
24 + </el-autocomplete>
25 + </div>
26 +</template>
27 +
28 +<script>
29 +import { defineComponent } from "@vue/runtime-core"
30 +
31 +export default defineComponent({
32 + name: "Search",
33 + data() {
34 + return {
35 + search: "",
36 + list: []
37 + }
38 + },
39 + methods: {
40 + querySearch(queryString, cb) {
41 + var list = this.list
42 + var results = queryString ? list.filter(this.createFilter(queryString)) : list
43 + // call callback function to return suggestions
44 + cb(results)
45 + },
46 + createFilter(queryString) {
47 + return link => {
48 + return link.meta.toLowerCase().indexOf(queryString.toLowerCase()) !== -1
49 + }
50 + },
51 + handleSelect(item) {
52 + this.goto(item.name)
53 + },
54 + flattenObject(object) {
55 + let obj = {}
56 + Object.keys(object).forEach(key => {
57 + if (typeof object[key] !== "object") {
58 + obj[key] = object[key]
59 + } else {
60 + // polyfill spread obj
61 + const fltnObj = this.flattenObject(object[key])
62 +
63 + Object.keys(fltnObj).forEach(fltnKey => {
64 + obj[fltnKey] = fltnObj[fltnKey]
65 + })
66 +
67 + // future spread obj syntax
68 + //obj = { ...this.flattenObject(object[key]) };
69 + }
70 + })
71 + return obj
72 + },
73 + flatten(list, key, cb) {
74 + let newList = []
75 +
76 + for (let k in list) {
77 + let temp = Object.assign({}, list[k])
78 + if (temp[key] && temp[key].length) delete temp[key]
79 +
80 + newList.push(temp)
81 +
82 + if (list[k][key] && list[k][key].length) {
83 + newList = newList.concat(list[k][key])
84 + }
85 + }
86 +
87 + let check = false
88 + for (let i in newList) {
89 + if (newList[i][key] && newList[i][key].length) check = true
90 + }
91 +
92 + if (check) this.flatten(newList, key, cb)
93 + else cb(newList)
94 +
95 + return true
96 + },
97 + parseList(list) {
98 + let parsed = []
99 +
100 + for (let k in list) {
101 + if (list[k].name && list[k].meta && list[k].meta.searchable) {
102 + let name = list[k].name
103 + let value = list[k].meta.title || name || ""
104 + let tags = ""
105 + if (list[k].meta.tags && list[k].meta.tags.length) tags = list[k].meta.tags.join(", ")
106 +
107 + let meta = name + value + tags
108 +
109 + if (value) {
110 + parsed.push({
111 + value,
112 + tags,
113 + name,
114 + meta
115 + })
116 + }
117 + }
118 + }
119 +
120 + return parsed
121 + },
122 + goto(name) {
123 + this.$router.push({ name })
124 + }
125 + },
126 + mounted() {
127 + //console.log(this.$router.options.routes)
128 + this.flatten(this.$router.options.routes, "children", data => {
129 + this.list = this.parseList(data)
130 + })
131 + }
132 +})
133 +</script>
134 +
135 +<style lang="scss">
136 +@import "../assets/scss/_variables";
137 +@import "../assets/scss/card-shadow";
138 +
139 +.search-box {
140 + max-width: 300px;
141 + width: 100%;
142 +
143 + .search-input {
144 + overflow: hidden;
145 + transition: all 0.5s;
146 + background: transparent;
147 +
148 + &:hover,
149 + &:active,
150 + &:focus {
151 + @extend .card-base;
152 + @extend .card-shadow--small;
153 + }
154 + }
155 + .el-input__wrapper {
156 + box-shadow: none !important;
157 + }
158 + .el-autocomplete {
159 + width: 100%;
160 +
161 + input {
162 + border-color: transparent;
163 + border-radius: 0px;
164 + background-color: transparent;
165 + line-height: 33px;
166 + border-bottom-color: transparentize($text-color-accent, 0.8);
167 + transition: all 0.5s;
168 +
169 + &:hover {
170 + border-color: transparent;
171 + }
172 + &:focus {
173 + border-color: $text-color-accent;
174 + }
175 + &:hover,
176 + &:active,
177 + &:focus {
178 + border-radius: 5px;
179 + background-color: #fff;
180 + }
181 + }
182 +
183 + .el-input__suffix {
184 + cursor: pointer;
185 + }
186 + }
187 +}
188 +
189 +.search-box-popper {
190 + margin-top: 2px !important;
191 + border-radius: 5px;
192 + overflow: hidden;
193 +
194 + .el-scrollbar__wrap {
195 + border: none;
196 + max-height: 240px;
197 + }
198 +
199 + .value {
200 + color: $text-color-accent;
201 + font-weight: bold;
202 + margin-right: 10px;
203 + text-transform: capitalize;
204 + }
205 + .tags {
206 + opacity: 0.5;
207 + text-transform: lowercase;
208 + }
209 +
210 + .popper__arrow {
211 + display: none;
212 + }
213 +}
214 +</style>
src/components/TextareaAutosize.vue new
+115
@@ -0,0 +1,115 @@
1 +<template>
2 + <textarea :style="computedStyles" v-model="val" @focus="resize"></textarea>
3 +</template>
4 +<script>
5 +export default {
6 + name: "TextareaAutosize",
7 + props: {
8 + value: {
9 + type: [String, Number],
10 + default: ""
11 + },
12 + autosize: {
13 + type: Boolean,
14 + default: true
15 + },
16 + minHeight: {
17 + type: [Number],
18 + default: null
19 + },
20 + maxHeight: {
21 + type: [Number],
22 + default: null
23 + },
24 + /*
25 + * Force !important for style properties
26 + */
27 + important: {
28 + type: [Boolean, Array],
29 + default: false
30 + }
31 + },
32 + data() {
33 + return {
34 + // data property for v-model binding with real textarea tag
35 + val: null,
36 + // works when content height becomes more then value of the maxHeight property
37 + maxHeightScroll: false,
38 + height: "auto"
39 + }
40 + },
41 + computed: {
42 + computedStyles() {
43 + if (!this.autosize) return {}
44 + return {
45 + resize: !this.isResizeImportant ? "none" : "none !important",
46 + height: this.height,
47 + overflow: this.maxHeightScroll ? "auto" : !this.isOverflowImportant ? "hidden" : "hidden !important"
48 + }
49 + },
50 + isResizeImportant() {
51 + const imp = this.important
52 + return imp === true || (Array.isArray(imp) && imp.includes("resize"))
53 + },
54 + isOverflowImportant() {
55 + const imp = this.important
56 + return imp === true || (Array.isArray(imp) && imp.includes("overflow"))
57 + },
58 + isHeightImportant() {
59 + const imp = this.important
60 + return imp === true || (Array.isArray(imp) && imp.includes("height"))
61 + }
62 + },
63 + watch: {
64 + value(val) {
65 + this.val = val
66 + },
67 + val(val) {
68 + this.$nextTick(this.resize)
69 + this.$emit("input", val)
70 + },
71 + minHeight() {
72 + this.$nextTick(this.resize)
73 + },
74 + maxHeight() {
75 + this.$nextTick(this.resize)
76 + },
77 + autosize(val) {
78 + if (val) this.resize()
79 + }
80 + },
81 + methods: {
82 + resize() {
83 + const important = this.isHeightImportant ? "important" : ""
84 + this.height = `auto${important ? " !important" : ""}`
85 + this.$nextTick(() => {
86 + let contentHeight = this.$el.scrollHeight + 1
87 +
88 + if (this.minHeight) {
89 + contentHeight = contentHeight < this.minHeight ? this.minHeight : contentHeight
90 + }
91 +
92 + if (this.maxHeight) {
93 + if (contentHeight > this.maxHeight) {
94 + contentHeight = this.maxHeight
95 + this.maxHeightScroll = true
96 + } else {
97 + this.maxHeightScroll = false
98 + }
99 + }
100 +
101 + const heightVal = contentHeight + "px"
102 + this.height = `${heightVal}${important ? " !important" : ""}`
103 + })
104 +
105 + return this
106 + }
107 + },
108 + created() {
109 + this.val = this.value
110 + },
111 + mounted() {
112 + this.resize()
113 + }
114 +}
115 +</script>
src/components/UserDialog.vue new
+121
@@ -0,0 +1,121 @@
1 +<template>
2 + <el-dialog :show-close="true" :class="'user-dialog'" v-model="visible" @close="$emit('update:dialogvisible', false)">
3 + <div class="avatar-box">
4 + <img :src="userdata.id ? '/static/images/users/user-' + userdata.id + '.jpg' : imagePlaceholder" alt="user avatar" />
5 + <div class="star" @click="userdata.starred = !userdata.starred">
6 + <i class="mdi mdi-star align-vertical-middle" v-if="userdata.starred"></i>
7 + <i class="mdi mdi-star-outline align-vertical-middle" v-if="!userdata.starred"></i>
8 + </div>
9 + </div>
10 + <div class="form-box">
11 + <el-input placeholder="Fullname" v-model="userdata.full_name"></el-input>
12 + <el-input placeholder="Email" v-model="userdata.email"></el-input>
13 + <el-input placeholder="Phone" v-model="userdata.phone"></el-input>
14 + </div>
15 + </el-dialog>
16 +</template>
17 +
18 +<script>
19 +export default {
20 + name: "UserDialog",
21 + props: ["userdata", "dialogvisible"],
22 + data() {
23 + return {
24 + visible: false,
25 + imagePlaceholder:
26 + "data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAeAAD/4QMvaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MCA3OS4xNjA0NTEsIDIwMTcvMDUvMDYtMDE6MDg6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkExM0RGNDdBMzM1QzExRThCNjhCOTFBMEVCQUQzNDYxIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkExM0RGNDc5MzM1QzExRThCNjhCOTFBMEVCQUQzNDYxIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkRBMUEyQ0NDMjc2QzExRTg5QUMyOTk2OTcxQkYxODMyIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkRBMUEyQ0NEMjc2QzExRTg5QUMyOTk2OTcxQkYxODMyIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4AIUFkb2JlAGTAAAAAAQMAEAMCAwYAAAWZAAAGSQAACC7/2wCEABALCwsMCxAMDBAXDw0PFxsUEBAUGx8XFxcXFx8eFxoaGhoXHh4jJSclIx4vLzMzLy9AQEBAQEBAQEBAQEBAQEABEQ8PERMRFRISFRQRFBEUGhQWFhQaJhoaHBoaJjAjHh4eHiMwKy4nJycuKzU1MDA1NUBAP0BAQEBAQEBAQEBAQP/CABEIAGQAZAMBIgACEQEDEQH/xACdAAEAAgMBAQAAAAAAAAAAAAAABQYBBAcCAwEBAAMBAAAAAAAAAAAAAAAAAAECAwQQAAEEAgMBAQEAAAAAAAAAAAECAwQFEQYAIDAQQBIRAAIBAgMCCwcFAAAAAAAAAAECAxEEACExYRIgMEFRcYGRodFSExBAsSIyQnKSsiMzBRIAAQQDAQEBAAAAAAAAAAAAAQAgMBEQITFxYYH/2gAMAwEAAhEDEQAAAOgAAHzPo09syAAAACF57IRXRjichFq9f9QE/wA24RIAAHLNGyVvpwGbRebPHSPNuFZAAERLfqVa2dct+x1eKmOuOedBy19CsgAY5b1LnOlIUb5ALzSL/nawDDYABjIgIK+L155I3IjS3SlwAAAAAAAAP//aAAgBAgABBQDxQkAEAgjB6JOU8Ucq+gEkIUnhSs8Ukp6NEZ+OEfz0DihwuK4Tny//2gAIAQMAAQUA8VqyQSOA5HRQweJGB9JxwqSeZSOJUD0czj4jOehQk8/hPn//2gAIAQEAAQUA/E9IYjobtqt1Xlsl+mojypcmY7gcodmlVjrbiHW/DZ5SpN590uSp+l8L0EXX3Q0kVfhutWtif8SlS1UNcayr8JjcN6PYaK8lbek3a10+t11Mrw2C+ap482dLsHod/cQkubhfLTJlSZblDtMqucbcQ632up67Gz66NYKehdVAKF9rUmqX0ZZdfd1fXnKlHYgEWOnVUwv6JZoKdKvFGJoSs11RX1iP3f/aAAgBAgIGPwCH6VRRDRgllBaKokDxbYb7mj+N7jcX/9oACAEDAgY/AIrCtpwGWVsLQv2Xkn//2gAIAQEBBj8A9y355FiTzOwUd+NyO8hdjookUn48WFiAe8mr6SnRQNXbBmupWmkP3Ma06BoOr2LFO7TWJNGQmpjHmQnm5sLJGwZHAZWGhBzB4m6LHKJvSQcwQU+NeAI3NTbyNGPxyZf3cTfA5fzue014E7chnNOpV4kf6CLWC5ADkaLIopn+QHtVEBZ2ICqMySdAMQ2rf20Ly087Zns04lob3cMEvylZCADXTXlwX/zZleM5iKXJhsDitevAVxFGvKxevcowk9xKst23ypI9FVSeSNSde/iRQCS6lr6MR0y+5tgwZryUyudK/SuxV0GAkF0+4Mgj0kUdG/WmN311Tasag99cerdSvM/mclqdHNhYLtmmsjka5vHtU82zswskbBkcBlYaEHMHhz3JNVLFYhzRrkvjwpbGQ1NswMdfI9cuog8IqdCKHDSxAzWJzWQZlNknjwVhhQySuaKiipJw9xctW6nUKyKaqig1ptPDIIqDkQcGSCtpKcyY/oJ2ocuymD6E0Mo5K7yH4MO/FCsSjnMnguAb66G7ypCM/wBT+GN2zhCMcmkPzO3Sxz9//9k="
27 + }
28 + },
29 + watch: {
30 + dialogvisible(val) {
31 + this.visible = val
32 + }
33 + }
34 +}
35 +</script>
36 +
37 +<style lang="scss">
38 +@import "../assets/scss/_variables";
39 +
40 +.el-dialog.user-dialog {
41 + max-width: 400px;
42 +
43 + .el-dialog__header {
44 + padding: 0;
45 +
46 + .el-dialog__headerbtn {
47 + z-index: 1;
48 + background: rgba(0, 0, 0, 0.05);
49 + min-width: 18px;
50 + min-height: 18px;
51 + max-width: 18px;
52 + max-height: 18px;
53 + border-radius: 4px;
54 + position: absolute;
55 + top: 20px;
56 + right: 20px;
57 +
58 + .el-dialog__close {
59 + color: $background-color;
60 + }
61 + }
62 + }
63 + .el-dialog__body {
64 + padding: 0;
65 + }
66 +
67 + .avatar-box {
68 + background: $text-color-accent;
69 + margin-bottom: 50px;
70 + position: relative;
71 +
72 + img {
73 + width: 100px;
74 + height: 100px;
75 + border-radius: 50%;
76 + position: relative;
77 + bottom: -50px;
78 + display: block;
79 + margin: 0 auto;
80 + background: white;
81 + border: 2px solid $text-color-accent;
82 + box-sizing: border-box;
83 + }
84 +
85 + .star {
86 + position: absolute;
87 + top: 50%;
88 + left: 50%;
89 + z-index: 1;
90 + background: white;
91 + box-sizing: border-box;
92 + width: 30px;
93 + height: 30px;
94 + text-align: center;
95 + line-height: 28px;
96 + font-size: 20px;
97 + border-radius: 50%;
98 + border: 2px solid $text-color-accent;
99 + cursor: pointer;
100 + margin-top: 35px;
101 + margin-left: 35px;
102 +
103 + .mdi-star {
104 + color: #ffd730;
105 + }
106 + .mdi-star-outline {
107 + opacity: 0.5;
108 + }
109 + }
110 + }
111 +
112 + .form-box {
113 + padding: 20px;
114 + box-sizing: border-box;
115 +
116 + & > * {
117 + margin: 10px 0;
118 + }
119 + }
120 +}
121 +</style>
src/components/VuePellEditor.vue new
+163
@@ -0,0 +1,163 @@
1 +<template>
2 + <div ref="editor" class="vp-editor">
3 + <div
4 + v-if="(vpContent === '' || vpContent === '<br>') && placeholder"
5 + class="vp-editor__placeholder"
6 + @click="$refs.editor.content.focus()"
7 + >
8 + {{ placeholder }}
9 + </div>
10 + </div>
11 +</template>
12 +
13 +<script>
14 +import pell from "pell"
15 +import { defineComponent } from "@vue/runtime-core"
16 +
17 +export default defineComponent({
18 + name: "VuePellEditor",
19 +
20 + /**
21 + * Props
22 + */
23 + props: {
24 + actions: {
25 + type: Array,
26 + default: () => []
27 + },
28 + content: {
29 + type: String,
30 + default: ""
31 + },
32 + value: {
33 + type: String,
34 + default: ""
35 + },
36 + placeholder: {
37 + type: String,
38 + default: "Write something amazing..."
39 + },
40 + editorHeight: {
41 + type: String,
42 + default: ""
43 + },
44 + styleWithCss: {
45 + type: Boolean,
46 + default: false
47 + },
48 + classes: {
49 + type: Object,
50 + default: () => {}
51 + },
52 + defaultParagraphSeparator: {
53 + type: String,
54 + default: "div"
55 + }
56 + },
57 +
58 + /**
59 + * Data
60 + */
61 + data: () => ({
62 + vpContent: "",
63 + pell: undefined
64 + }),
65 +
66 + /**
67 + * Watch
68 + */
69 + watch: {
70 + // eslint-disable-next-line
71 + content: function (newVal, oldVal) {
72 + if (this.pell) {
73 + if (!!newVal && newVal !== this.vpContent) {
74 + this.vpContent = newVal
75 + this.$refs.editor.content.innerHTML = newVal
76 + } else if (!newVal) {
77 + this.$refs.editor.content.innerHTML = ""
78 + }
79 + }
80 + },
81 + // eslint-disable-next-line
82 + value: function (newVal, oldVal) {
83 + if (this.pell) {
84 + if (!!newVal && newVal !== this.vpContent) {
85 + this.vpContent = newVal
86 + this.$refs.editor.content.innerHTML = newVal
87 + } else if (!newVal) {
88 + this.$refs.editor.content.innerHTML = ""
89 + }
90 + }
91 + }
92 + },
93 +
94 + /**
95 + * Before Destroy
96 + * Reset pell instance
97 + */
98 + beforeDestroy() {
99 + this.pell = undefined
100 + },
101 +
102 + /**
103 + * Mounted
104 + */
105 + mounted() {
106 + this.init()
107 + this.$emit("mounted")
108 + },
109 +
110 + /**
111 + * Methods
112 + */
113 + methods: {
114 + init() {
115 + if (this.$el) {
116 + const options = {
117 + element: this.$refs.editor,
118 + onChange: html => {
119 + this.vpContent = html
120 + this.$emit("input", html)
121 + this.$emit("change", {
122 + editor: this.pell,
123 + html: html
124 + })
125 + },
126 + classes: this.classes,
127 + styleWithCSS: this.styleWithCss,
128 + defaultParagraphSeparator: this.defaultParagraphSeparator
129 + }
130 + if (this.actions && this.actions.length > 0) {
131 + options.actions = this.actions
132 + }
133 + const pellEditor = pell.init(options)
134 + this.pell = pellEditor
135 + window.pell = pell
136 + if (this.content || this.value) {
137 + this.$refs.editor.content.innerHTML = this.content || this.value
138 + this.vpContent = this.content || this.value
139 + }
140 + if (this.editorHeight !== "") {
141 + this.$refs.editor.content.style.height = this.editorHeight
142 + }
143 + }
144 + }
145 + }
146 +})
147 +</script>
148 +
149 +<style lang="scss">
150 +@import "pell/src/pell.scss";
151 +
152 +.vp-editor {
153 + position: relative;
154 +
155 + &__placeholder {
156 + position: absolute;
157 + top: 42px;
158 + left: 10px;
159 + color: #ddd;
160 + font-style: italic;
161 + }
162 +}
163 +</style>
src/components/layout-picker.vue new
+313
@@ -0,0 +1,313 @@
1 +<template>
2 + <div class="layout-picker" :class="{ open: pickerOpened, 'pos-left': position === 'right' }">
3 + <div class="icon-box" @click="pickerOpened = !pickerOpened">
4 + <i class="mdi mdi-cog"></i>
5 + </div>
6 + <div class="picker-box">
7 + <div class="close-btn" @click="pickerOpened = !pickerOpened">
8 + <i class="mdi mdi-close"></i>
9 + </div>
10 +
11 + <div class="selector-box">
12 + <span class="label">View animation</span>
13 + <el-select v-model="viewAnimation" placeholder="Select" size="small">
14 + <el-option label="fade-left" value="fade-left"></el-option>
15 + <el-option label="fade-right" value="fade-right"></el-option>
16 + <el-option label="fade-top" value="fade-top"></el-option>
17 + <el-option label="fade-top-in-out" value="fade-top-in-out"></el-option>
18 + <el-option label="fade-bottom" value="fade-bottom"></el-option>
19 + <el-option label="fade-bottom-in-out" value="fade-bottom-in-out"></el-option>
20 + <el-option label="fade" value="fade"></el-option>
21 + <el-option label="none" :value="false"></el-option>
22 + </el-select>
23 + </div>
24 +
25 + <div class="selector-box">
26 + <span class="label">Navigation</span>
27 + <el-select v-model="navPos" placeholder="Select" size="small">
28 + <el-option label="top" value="top"></el-option>
29 + <el-option label="bottom" value="bottom"></el-option>
30 + <el-option label="left" value="left"></el-option>
31 + <el-option label="right" value="right"></el-option>
32 + <el-option label="none" :value="false"></el-option>
33 + </el-select>
34 + </div>
35 +
36 + <div class="selector-box">
37 + <span class="label">Toolbar</span>
38 + <el-radio-group v-model="toolbar" size="small" v-if="navPos === 'top'">
39 + <el-radio-button :label="'top'">top</el-radio-button>
40 + <el-radio-button :label="'bottom'">bottom</el-radio-button>
41 + <el-radio-button :label="false">off</el-radio-button>
42 + </el-radio-group>
43 + <el-radio-group v-model="toolbar" size="small" v-if="navPos !== 'top'">
44 + <el-radio-button :label="'bottom'">on</el-radio-button>
45 + <el-radio-button :label="false">off</el-radio-button>
46 + </el-radio-group>
47 + </div>
48 +
49 + <div class="selector-box">
50 + <span class="label">Footer</span>
51 + <el-radio-group v-model="footer" size="small" v-if="navPos === 'left' || navPos === 'right'">
52 + <el-radio-button :label="'above'">above</el-radio-button>
53 + <el-radio-button :label="'below'">below</el-radio-button>
54 + <el-radio-button :label="false">off</el-radio-button>
55 + </el-radio-group>
56 + <el-radio-group v-model="footer" size="small" v-if="navPos !== 'left' && navPos !== 'right'">
57 + <el-radio-button :label="'below'">on</el-radio-button>
58 + <el-radio-button :label="false">off</el-radio-button>
59 + </el-radio-group>
60 + </div>
61 +
62 + <div class="selector-box">
63 + <span class="label">Boxed</span>
64 + <el-radio-group v-model="boxed" size="small">
65 + <el-radio-button :label="true">on</el-radio-button>
66 + <el-radio-button :label="false">off</el-radio-button>
67 + </el-radio-group>
68 + </div>
69 +
70 + <div class="selector-box">
71 + <span class="label">Themes (vue2 version)</span>
72 + <a class="theme-box" href="https://pragmatic-theme-a.ddmweb.it/" target="_blank">
73 + <div class="color" style="background: #ffffff"></div>
74 + <div class="color" style="background: #000000"></div>
75 + <div class="color" style="background: #d7195d"></div>
76 + </a>
77 + <a class="theme-box" href="https://pragmatic-theme-b.ddmweb.it/" target="_blank">
78 + <div class="color" style="background: #8794a3"></div>
79 + <div class="color" style="background: #ffffff"></div>
80 + <div class="color" style="background: #52f17e"></div>
81 + </a>
82 + <a class="theme-box" href="https://pragmatic-theme-c.ddmweb.it/" target="_blank">
83 + <div class="color" style="background: #191d24"></div>
84 + <div class="color" style="background: #ffffff"></div>
85 + <div class="color" style="background: #52f17e"></div>
86 + </a>
87 + <a class="theme-box" href="https://pragmatic-theme-d.ddmweb.it/" target="_blank">
88 + <div class="color" style="background: #2b80f6"></div>
89 + <div class="color" style="background: #ffffff"></div>
90 + <div class="color" style="background: #1b2738"></div>
91 + </a>
92 + </div>
93 + </div>
94 + </div>
95 +</template>
96 +
97 +<script>
98 +import { useMainStore } from "../stores/main"
99 +
100 +import { defineComponent } from "@vue/runtime-core"
101 +
102 +export default defineComponent({
103 + name: "LayoutPicker",
104 + props: ["position"],
105 + data() {
106 + return {
107 + pickerOpened: false
108 + }
109 + },
110 + computed: {
111 + navPos: {
112 + get() {
113 + return useMainStore().navPos
114 + },
115 + set(val) {
116 + useMainStore().setLayout({ navPos: val })
117 + }
118 + },
119 + toolbar: {
120 + get() {
121 + return useMainStore().toolbar
122 + },
123 + set(val) {
124 + useMainStore().setLayout({ toolbar: val })
125 + }
126 + },
127 + footer: {
128 + get() {
129 + return useMainStore().footer
130 + },
131 + set(val) {
132 + useMainStore().setLayout({ footer: val })
133 + }
134 + },
135 + boxed: {
136 + get() {
137 + return useMainStore().boxed
138 + },
139 + set(val) {
140 + useMainStore().setLayout({ boxed: val })
141 + }
142 + },
143 + roundedCorners: {
144 + get() {
145 + return useMainStore().roundedCorners
146 + },
147 + set(val) {
148 + useMainStore().setLayout({ roundedCorners: val })
149 + }
150 + },
151 + viewAnimation: {
152 + get() {
153 + return useMainStore().viewAnimation
154 + },
155 + set(val) {
156 + useMainStore().setLayout({ viewAnimation: val })
157 + }
158 + }
159 + },
160 + methods: {}
161 +})
162 +</script>
163 +
164 +<style lang="scss">
165 +@import "../assets/scss/_variables";
166 +@import "../assets/scss/_mixins";
167 +
168 +.layout-picker {
169 + width: 60px;
170 + height: 60px;
171 + background: lighten($background-color, 20%);
172 + position: fixed;
173 + right: -35px;
174 + top: 50%;
175 + transform: translateX(-5px) translateY(-50%);
176 + border-radius: 50%;
177 + box-shadow:
178 + 0px 4px 20px 0px rgba(0, 0, 0, 0.08),
179 + 0px 2px 7px 0px rgba(0, 0, 0, 0.02);
180 + transition: all 0.5s;
181 + overflow: hidden;
182 + z-index: 2000;
183 +
184 + .icon-box {
185 + position: absolute;
186 + top: 50%;
187 + left: 0;
188 + right: 0;
189 + bottom: 0;
190 + width: 100%;
191 + height: 60px;
192 + line-height: 60px;
193 + text-align: center;
194 + font-size: 40px;
195 + opacity: 0.3;
196 + cursor: pointer;
197 + transform: translateX(0px) translateY(-50%);
198 + transition: all 0.5s;
199 +
200 + i::before {
201 + animation: spin 5s infinite linear;
202 + }
203 + }
204 +
205 + .picker-box {
206 + position: absolute;
207 + top: 50%;
208 + left: 0;
209 + right: 0;
210 + bottom: 0;
211 + width: 100%;
212 + height: 100%;
213 + opacity: 0;
214 + padding: 15px 30px;
215 + box-sizing: border-box;
216 + transform: translateX(-100%) translateY(-50%);
217 + transition: all 0.2s ease-in-out 0s;
218 +
219 + .close-btn {
220 + cursor: pointer;
221 + text-align: right;
222 + font-size: 20px;
223 + float: right;
224 + position: relative;
225 + top: -6px;
226 + right: -16px;
227 + }
228 +
229 + .selector-box {
230 + width: 100%;
231 + margin: 10px 0;
232 +
233 + & > .label {
234 + width: 100%;
235 + display: block;
236 + }
237 + }
238 +
239 + .theme-box {
240 + display: block;
241 + height: 30px;
242 + width: 40px;
243 + float: left;
244 + border-radius: 5px;
245 + overflow: hidden;
246 + margin-right: 5px;
247 + box-sizing: border-box;
248 + border: 1px solid rgba(0, 0, 0, 0.2);
249 +
250 + .color {
251 + display: block;
252 + width: 33.3333%;
253 + float: left;
254 + height: 100%;
255 + }
256 +
257 + &:hover {
258 + border: 2px solid white;
259 + }
260 + }
261 + }
262 +
263 + &.open {
264 + width: 255px;
265 + height: 405px;
266 + right: -35px !important;
267 + border-radius: 6px;
268 + transform: translateX(-42px) translateY(-50%);
269 +
270 + .icon-box {
271 + transform: translateX(100%) translateY(-50%);
272 + opacity: 0;
273 + }
274 + .picker-box {
275 + transform: translateX(0%) translateY(-50%);
276 + opacity: 1;
277 + transition: all 0.5s ease-in-out 0.2s;
278 + }
279 + }
280 +
281 + &:hover {
282 + right: 0;
283 + }
284 +
285 + &.pos-left {
286 + right: initial;
287 + left: 0px;
288 + transform: translateX(5px) translateY(-50%);
289 +
290 + &.open {
291 + transform: translateX(15px) translateY(-50%);
292 + }
293 + }
294 +}
295 +
296 +@keyframes spin {
297 + 0% {
298 + -webkit-transform: rotate(0deg);
299 + transform: rotate(0deg);
300 + }
301 +
302 + 100% {
303 + -webkit-transform: rotate(359deg);
304 + transform: rotate(359deg);
305 + }
306 +}
307 +
308 +@media (max-width: 768px) {
309 + .layout-picker {
310 + display: none;
311 + }
312 +}
313 +</style>
src/components/theme-picker.vue new
+153
@@ -0,0 +1,153 @@
1 +<template>
2 + <el-color-picker class="theme-picker" popper-class="theme-picker-dropdown" v-model="theme"></el-color-picker>
3 +</template>
4 +
5 +<style>
6 +.theme-picker {
7 + display: inline-block;
8 +}
9 +
10 +.theme-picker .el-color-picker__trigger {
11 + vertical-align: middle;
12 +}
13 +
14 +.theme-picker-dropdown .el-color-dropdown__link-btn {
15 + display: none;
16 +}
17 +</style>
18 +
19 +<script>
20 +const version = "2.2.2"
21 +
22 +const ORIGINAL_THEME = "#409EFF"
23 +import { defineComponent } from "@vue/runtime-core"
24 +
25 +export default defineComponent({
26 + data() {
27 + return {
28 + chalk: "", // content of theme-chalk css
29 + docs: "", // content of docs css
30 + theme: ORIGINAL_THEME
31 + }
32 + },
33 +
34 + watch: {
35 + theme(val, oldVal) {
36 + if (typeof val !== "string") return
37 + const themeCluster = this.getThemeCluster(val.replace("#", ""))
38 + const originalCluster = this.getThemeCluster(oldVal.replace("#", ""))
39 + const getHandler = (variable, id) => {
40 + return () => {
41 + const originalCluster = this.getThemeCluster(ORIGINAL_THEME.replace("#", ""))
42 + let newStyle = this.updateStyle(this[variable], originalCluster, themeCluster)
43 +
44 + let styleTag = document.getElementById(id)
45 + if (!styleTag) {
46 + styleTag = document.createElement("style")
47 + styleTag.setAttribute("id", id)
48 + document.head.appendChild(styleTag)
49 + }
50 + styleTag.innerText = newStyle
51 + }
52 + }
53 +
54 + const chalkHandler = getHandler("chalk", "chalk-style")
55 + const docsHandler = getHandler("docs", "docs-style")
56 +
57 + if (!this.chalk) {
58 + const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`
59 + this.getCSSString(url, chalkHandler, "chalk")
60 + } else {
61 + chalkHandler()
62 + }
63 +
64 + if (!this.docs) {
65 + const links = [].filter.call(document.querySelectorAll("link"), link => {
66 + return /docs\..+\.css/.test(link.href || "")
67 + })
68 + links[0] && this.getCSSString(links[0].href, docsHandler, "docs")
69 + } else {
70 + docsHandler()
71 + }
72 +
73 + const styles = [].slice.call(document.querySelectorAll("style")).filter(style => {
74 + const text = style.innerText
75 + return new RegExp(oldVal, "i").test(text) && !/Chalk Variables/.test(text)
76 + })
77 + styles.forEach(style => {
78 + const { innerText } = style
79 + if (typeof innerText !== "string") return
80 + style.innerText = this.updateStyle(innerText, originalCluster, themeCluster)
81 + })
82 + }
83 + },
84 +
85 + methods: {
86 + updateStyle(style, oldCluster, newCluster) {
87 + let newStyle = style
88 + oldCluster.forEach((color, index) => {
89 + newStyle = newStyle.replace(new RegExp(color, "ig"), newCluster[index])
90 + })
91 + return newStyle
92 + },
93 +
94 + getCSSString(url, callback, variable) {
95 + const xhr = new XMLHttpRequest()
96 + xhr.onreadystatechange = () => {
97 + if (xhr.readyState === 4 && xhr.status === 200) {
98 + this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, "")
99 + callback()
100 + }
101 + }
102 + xhr.open("GET", url)
103 + xhr.send()
104 + },
105 +
106 + getThemeCluster(theme) {
107 + const tintColor = (color, tint) => {
108 + let red = parseInt(color.slice(0, 2), 16)
109 + let green = parseInt(color.slice(2, 4), 16)
110 + let blue = parseInt(color.slice(4, 6), 16)
111 +
112 + if (tint === 0) {
113 + // when primary color is in its rgb space
114 + return [red, green, blue].join(",")
115 + } else {
116 + red += Math.round(tint * (255 - red))
117 + green += Math.round(tint * (255 - green))
118 + blue += Math.round(tint * (255 - blue))
119 +
120 + red = red.toString(16)
121 + green = green.toString(16)
122 + blue = blue.toString(16)
123 +
124 + return `#${red}${green}${blue}`
125 + }
126 + }
127 +
128 + const shadeColor = (color, shade) => {
129 + let red = parseInt(color.slice(0, 2), 16)
130 + let green = parseInt(color.slice(2, 4), 16)
131 + let blue = parseInt(color.slice(4, 6), 16)
132 +
133 + red = Math.round((1 - shade) * red)
134 + green = Math.round((1 - shade) * green)
135 + blue = Math.round((1 - shade) * blue)
136 +
137 + red = red.toString(16)
138 + green = green.toString(16)
139 + blue = blue.toString(16)
140 +
141 + return `#${red}${green}${blue}`
142 + }
143 +
144 + const clusters = [theme]
145 + for (let i = 0; i <= 9; i++) {
146 + clusters.push(tintColor(theme, Number((i / 10).toFixed(2))))
147 + }
148 + clusters.push(shadeColor(theme, 0.1))
149 + return clusters
150 + }
151 + }
152 +})
153 +</script>
src/components/vue-peity/Peity.vue new
+46
@@ -0,0 +1,46 @@
1 +<template>
2 + <span></span>
3 +</template>
4 +
5 +<script>
6 +import Peity from "./lib/peity"
7 +
8 +const types = ["line", "bar", "pie", "donut"]
9 +
10 +import { defineComponent } from "@vue/runtime-core"
11 +
12 +export default defineComponent({
13 + props: {
14 + type: {
15 + type: String,
16 + required: true,
17 + validator: value => types.indexOf(value) > -1
18 + },
19 + data: {
20 + type: String,
21 + required: true
22 + },
23 + options: {
24 + type: Object,
25 + default: () => ({})
26 + }
27 + },
28 + data() {
29 + return {
30 + chart: null
31 + }
32 + },
33 + mounted() {
34 + this.chart = new Peity(this.$el, this.type, this.data, this.options)
35 + this.chart.draw()
36 + },
37 + watch: {
38 + data(val) {
39 + this.$nextTick(() => {
40 + this.chart.raw = val
41 + this.chart.draw()
42 + })
43 + }
44 + }
45 +})
46 +</script>
src/components/vue-peity/lib/bar.js new
+68
@@ -0,0 +1,68 @@
1 +export default {
2 + options: {
3 + delimiter: ",",
4 + fill: ["#4D89F9"],
5 + height: 16,
6 + min: 0,
7 + padding: 0.1,
8 + width: 32
9 + },
10 +
11 + draw(opts) {
12 + var values = this.values()
13 + var max = Math.max.apply(Math, opts.max === undefined ? values : values.concat(opts.max))
14 + var min = Math.min.apply(Math, opts.min === undefined ? values : values.concat(opts.min))
15 +
16 + var $svg = this.prepare(opts.width, opts.height)
17 + var rect = $svg.getBoundingClientRect()
18 +
19 + var width = rect.width
20 + var height = rect.height
21 + var diff = max - min
22 + var padding = opts.padding
23 + var fill = this.fill()
24 +
25 + var xScale = (this.x = input => {
26 + return (input * width) / values.length
27 + })
28 +
29 + var yScale = (this.y = input => {
30 + return height - (diff ? ((input - min) / diff) * height : 1)
31 + })
32 +
33 + for (var i = 0; i < values.length; i++) {
34 + var x = xScale(i + padding)
35 + var w = xScale(i + 1 - padding) - x
36 + var value = values[i]
37 + var valueY = yScale(value)
38 + var y1 = valueY
39 + var y2 = valueY
40 + var h
41 +
42 + if (!diff) {
43 + h = 1
44 + } else if (value < 0) {
45 + y1 = yScale(Math.min(max, 0))
46 + } else {
47 + y2 = yScale(Math.max(min, 0))
48 + }
49 +
50 + h = y2 - y1
51 +
52 + if (h === 0) {
53 + h = 1
54 + if (max > 0 && diff) y1--
55 + }
56 +
57 + $svg.appendChild(
58 + this.svgElement("rect", {
59 + fill: fill.call(this, value, i, values),
60 + x: x,
61 + y: y1,
62 + width: w,
63 + height: h
64 + })
65 + )
66 + }
67 + }
68 +}
src/components/vue-peity/lib/line.js new
+69
@@ -0,0 +1,69 @@
1 +export default {
2 + options: {
3 + delimiter: ",",
4 + fill: "#c6d9fd",
5 + height: 16,
6 + min: 0,
7 + stroke: "#4d89f9",
8 + strokeWidth: 1,
9 + width: 32
10 + },
11 +
12 + draw(opts) {
13 + var values = this.values()
14 + if (values.length === 1) values.push(values[0])
15 + var max = Math.max.apply(Math, opts.max === undefined ? values : values.concat(opts.max))
16 + var min = Math.min.apply(Math, opts.min === undefined ? values : values.concat(opts.min))
17 +
18 + var $svg = this.prepare(opts.width, opts.height)
19 + var rect = $svg.getBoundingClientRect()
20 + var strokeWidth = opts.strokeWidth
21 + var width = rect.width
22 + var height = rect.height - strokeWidth
23 + var diff = max - min
24 +
25 + var xScale = (this.x = input => {
26 + return input * (width / (values.length - 1))
27 + })
28 +
29 + var yScale = (this.y = input => {
30 + var y = height
31 +
32 + if (diff) {
33 + y -= ((input - min) / diff) * height
34 + }
35 +
36 + return y + strokeWidth / 2
37 + })
38 +
39 + var zero = yScale(Math.max(min, 0))
40 + var coords = [0, zero]
41 +
42 + for (var i = 0; i < values.length; i++) {
43 + coords.push(xScale(i), yScale(values[i]))
44 + }
45 +
46 + coords.push(width, zero)
47 +
48 + if (opts.fill) {
49 + $svg.appendChild(
50 + this.svgElement("polygon", {
51 + fill: opts.fill,
52 + points: coords.join(" ")
53 + })
54 + )
55 + }
56 +
57 + if (strokeWidth) {
58 + $svg.appendChild(
59 + this.svgElement("polyline", {
60 + fill: "none",
61 + points: coords.slice(2, coords.length - 2).join(" "),
62 + stroke: opts.stroke,
63 + "stroke-width": strokeWidth,
64 + "stroke-linecap": "square"
65 + })
66 + )
67 + }
68 + }
69 +}
src/components/vue-peity/lib/peity.js new
+73
@@ -0,0 +1,73 @@
1 +import bar from "./bar"
2 +import line from "./line"
3 +import pie from "./pie"
4 +
5 +const svgElement = (tag, attrs) => {
6 + let e = document.createElementNS("http://www.w3.org/2000/svg", tag)
7 + for (let key in attrs) {
8 + e.setAttribute(key, attrs[key])
9 + }
10 + return e
11 +}
12 +
13 +// https://gist.github.com/madrobby/3201472
14 +// const svgSupported = ('createElementNS' in document) && svgElement('svg', {}).createSVGRect
15 +
16 +class Peity {
17 + constructor($el, type, data, options) {
18 + this.$el = $el
19 + this.type = type
20 + this.raw = data
21 + this.options = Object.assign({}, Peity.defaults[this.type], options)
22 + }
23 +
24 + svgElement(...args) {
25 + return svgElement(...args)
26 + }
27 +
28 + prepare(width, height) {
29 + if (!this.$svg) {
30 + this.$el.style.display = "none"
31 + this.$svg = svgElement("svg", {
32 + class: "peity"
33 + })
34 + this.$el.parentNode.insertBefore(this.$svg, this.$el)
35 + }
36 + this.$svg.innerHTML = ""
37 + this.$svg.setAttribute("width", width)
38 + this.$svg.setAttribute("height", height)
39 + return this.$svg
40 + }
41 +
42 + fill() {
43 + let f = this.options.fill
44 + return typeof f === "function"
45 + ? f
46 + : function (_, i) {
47 + return f[i % f.length]
48 + }
49 + }
50 +
51 + draw() {
52 + Peity.graphers[this.type].call(this, this.options)
53 + }
54 +
55 + values() {
56 + return this.raw.split(this.options.delimiter).map(val => parseFloat(val))
57 + }
58 +}
59 +
60 +Peity.defaults = {}
61 +Peity.graphers = {}
62 +
63 +Peity.register = (type, factory) => {
64 + Peity.defaults[type] = factory.options
65 + Peity.graphers[type] = factory.draw
66 +}
67 +
68 +Peity.register("bar", bar)
69 +Peity.register("donut", pie)
70 +Peity.register("line", line)
71 +Peity.register("pie", pie)
72 +
73 +export default Peity
src/components/vue-peity/lib/pie.js new
+150
@@ -0,0 +1,150 @@
1 +export default {
2 + options: {
3 + fill: ["#ff9900", "#fff4dd", "#ffc66e"],
4 + radius: 8
5 + },
6 +
7 + draw(opts) {
8 + if (!opts.delimiter) {
9 + var delimiter = this.raw.match(/[^0-9.]/)
10 + opts.delimiter = delimiter ? delimiter[0] : ","
11 + }
12 + var values = this.values().map(n => (n > 0 ? n : 0))
13 +
14 + if (opts.delimiter === "/") {
15 + var v1 = values[0]
16 + var v2 = values[1]
17 + values = [v1, Math.max(0, v2 - v1)]
18 + }
19 +
20 + var i = 0
21 + var length = values.length
22 + var sum = 0
23 +
24 + for (; i < length; i++) {
25 + sum += values[i]
26 + }
27 +
28 + if (!sum) {
29 + length = 2
30 + sum = 1
31 + values = [0, 1]
32 + }
33 +
34 + var diameter = opts.radius * 2
35 +
36 + var $svg = this.prepare(opts.width || diameter, opts.height || diameter)
37 +
38 + var rect = $svg.getBoundingClientRect()
39 + var width = rect.width
40 + var height = rect.height
41 + var cx = width / 2
42 + var cy = height / 2
43 +
44 + var radius = Math.min(cx, cy)
45 + var innerRadius = opts.innerRadius
46 +
47 + if (this.type === "donut" && !innerRadius) {
48 + innerRadius = radius * 0.5
49 + }
50 +
51 + var pi = Math.PI
52 + var fill = this.fill()
53 +
54 + var scale = (this.scale = (value, radius) => {
55 + var radians = (value / sum) * pi * 2 - pi / 2
56 +
57 + return [radius * Math.cos(radians) + cx, radius * Math.sin(radians) + cy]
58 + })
59 +
60 + var cumulative = 0
61 +
62 + for (i = 0; i < length; i++) {
63 + var value = values[i]
64 + var portion = value / sum
65 + var $node
66 +
67 + if (portion === 0) continue
68 +
69 + if (portion === 1) {
70 + if (innerRadius) {
71 + var x2 = cx - 0.01
72 + var y1 = cy - radius
73 + var y2 = cy - innerRadius
74 +
75 + $node = this.svgElement("path", {
76 + d: [
77 + "M",
78 + cx,
79 + y1,
80 + "A",
81 + radius,
82 + radius,
83 + 0,
84 + 1,
85 + 1,
86 + x2,
87 + y1,
88 + "L",
89 + x2,
90 + y2,
91 + "A",
92 + innerRadius,
93 + innerRadius,
94 + 0,
95 + 1,
96 + 0,
97 + cx,
98 + y2
99 + ].join(" ")
100 + })
101 + } else {
102 + $node = this.svgElement("circle", {
103 + cx: cx,
104 + cy: cy,
105 + r: radius
106 + })
107 + }
108 + } else {
109 + var cumulativePlusValue = cumulative + value
110 +
111 + var d = ["M"].concat(
112 + scale(cumulative, radius),
113 + "A",
114 + radius,
115 + radius,
116 + 0,
117 + portion > 0.5 ? 1 : 0,
118 + 1,
119 + scale(cumulativePlusValue, radius),
120 + "L"
121 + )
122 +
123 + if (innerRadius) {
124 + d = d.concat(
125 + scale(cumulativePlusValue, innerRadius),
126 + "A",
127 + innerRadius,
128 + innerRadius,
129 + 0,
130 + portion > 0.5 ? 1 : 0,
131 + 0,
132 + scale(cumulative, innerRadius)
133 + )
134 + } else {
135 + d.push(cx, cy)
136 + }
137 +
138 + cumulative += value
139 +
140 + $node = this.svgElement("path", {
141 + d: d.join(" ")
142 + })
143 + }
144 +
145 + $node.setAttribute("fill", fill.call(this, value, i, values))
146 +
147 + $svg.appendChild($node)
148 + }
149 + }
150 +}
src/components/vue-ps/README.md new
+112
@@ -0,0 +1,112 @@
1 +# `vue-ps`
2 +
3 +[perfect-scrollbar](https://github.com/noraesae/perfect-scrollbar) vue version
4 +
5 +## 1.install
6 +
7 +```
8 +npm install vue-ps
9 +```
10 +
11 +## 2. example
12 +
13 +### 2.1 base example
14 +
15 +```html
16 +<template>
17 + <VuePs class="scroll-area" v-once :settings="settings" @ps-scroll-y="scrollHanle">
18 + <img src="./assets/azusa.jpg" height="720" width="1280" alt="azusa" />
19 + </VuePs>
20 +</template>
21 +
22 +<script>
23 + import VuePs from "vue-ps"
24 +
25 + export default {
26 + components: {
27 + VuePs
28 + },
29 + name: "app",
30 + data() {
31 + return {
32 + settings: {
33 + maxScrollbarLength: 60
34 + }
35 + }
36 + },
37 + methods: {
38 + scrollHanle(evt) {
39 + console.log(evt)
40 + }
41 + }
42 + }
43 +</script>
44 +<style lang="scss">
45 + .scroll-area {
46 + position: relative;
47 + margin: auto;
48 + width: 400px;
49 + height: 300px;
50 + }
51 +</style>
52 +```
53 +
54 +Also,you can clone this repository to run the example:
55 +
56 +```shell
57 +git clone git@github.com:Linko91/vue-ps.git
58 +cd vue-ps
59 +npm install
60 +npm run example
61 +```
62 +
63 +### 2.2 example with vuerouter
64 +
65 +```shell
66 +git clone git@github.com:Linko91/vue-ps.git
67 +cd vue-ps
68 +npm install
69 +npm run example:vuerouter
70 +```
71 +
72 +## 3. props
73 +
74 +### settings:please refer to [optional-parameters of perfect-scrollbar](https://github.com/noraesae/perfect-scrollbar#optional-parameters)
75 +
76 +### swicher:which you could use to turn off the scrollbar for mobile or other case
77 +
78 +## 4. events
79 +
80 +please refer to [events of perfect-scrollbar](https://github.com/noraesae/perfect-scrollbar#events)
81 +
82 +## 5. use vue and webpack
83 +
84 +you can do it like this:
85 +
86 +### install
87 +
88 +```shell
89 +npm install vue-ps perfect-scrollbar --save
90 +```
91 +
92 +### use
93 +
94 +```js
95 +import VuePs from "vue-ps/index.vue"
96 +export default {
97 + components: {
98 + VuePs
99 + }
100 + //...
101 +}
102 +```
103 +
104 +## License
105 +
106 +The MIT License (MIT) Copyright (c) 2016 Hyunje Alex Jun and other contributors.
107 +
108 +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
109 +
110 +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
111 +
112 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
src/components/vue-ps/index.js new
+4
@@ -0,0 +1,4 @@
1 +// module.exports = require('./index.vue')
2 +import VuePs from "./index.vue"
3 +
4 +export default VuePs
src/components/vue-ps/index.vue new
+125
@@ -0,0 +1,125 @@
1 +<template>
2 + <section
3 + class="ps-container"
4 + :is="tagname"
5 + @mouseover.once="update"
6 + @ps-scroll-y="scrollHanle"
7 + @ps-scroll-x="scrollHanle"
8 + @ps-scroll-up="scrollHanle"
9 + @ps-scroll-down="scrollHanle"
10 + @ps-scroll-left="scrollHanle"
11 + @ps-scroll-right="scrollHanle"
12 + @ps-y-reach-start="scrollHanle"
13 + @ps-y-reach-end="scrollHanle"
14 + @ps-x-reach-start="scrollHanle"
15 + @ps-x-reach-end="scrollHanle"
16 + >
17 + <slot></slot>
18 + </section>
19 +</template>
20 +
21 +<script>
22 +import PerfectScrollbar from "perfect-scrollbar"
23 +
24 +import { defineComponent } from "@vue/runtime-core"
25 +
26 +export default defineComponent({
27 + name: "vue-ps",
28 + props: {
29 + settings: {
30 + type: Object,
31 + default: () => ({
32 + wheelSpeed: 1.5,
33 + wheelPropagation: true
34 + })
35 + },
36 + swicher: {
37 + type: Boolean,
38 + default: true
39 + },
40 + tagname: {
41 + type: String,
42 + default: "section"
43 + }
44 + },
45 + data() {
46 + return {
47 + ps: null,
48 + _ps_inited: false
49 + }
50 + },
51 + methods: {
52 + scrollHanle(evt) {
53 + this.$emit(evt.type, evt)
54 + },
55 +
56 + update() {
57 + //this.ps.update(this.$el)
58 + if (this.ps) this.ps.update()
59 + },
60 +
61 + __init() {
62 + this.$nextTick(() => {
63 + if (this.swicher) {
64 + if (!this._ps_inited) {
65 + this._ps_inited = true
66 + this.ps = new PerfectScrollbar(this.$el, this.settings)
67 + } else {
68 + this.update(this.$el)
69 + }
70 + }
71 + })
72 + },
73 +
74 + __uninit() {
75 + if (this.ps) this.ps.destroy(this.$el)
76 +
77 + this.ps = null
78 + this._ps_inited = false
79 + }
80 + },
81 +
82 + watch: {
83 + swicher(val) {
84 + if (val && !this._ps_inited) {
85 + this.__init()
86 + }
87 + if (!val && this._ps_inited) {
88 + this.__uninit()
89 + }
90 + },
91 +
92 + $route() {
93 + this.update()
94 + }
95 + },
96 +
97 + mounted() {
98 + // debugger
99 + this.__init()
100 + },
101 +
102 + updated() {
103 + this.$nextTick(this.update)
104 + },
105 +
106 + activated() {
107 + this.__init()
108 + },
109 +
110 + deactivated() {
111 + this.__uninit()
112 + },
113 +
114 + beforeUnmount() {
115 + this.__uninit()
116 + }
117 +})
118 +</script>
119 +
120 +<style lang="scss">
121 +@import "~perfect-scrollbar/css/perfect-scrollbar.css";
122 +.ps-container {
123 + position: relative;
124 +}
125 +</style>
src/components/vue-ps/package.json new
+54
@@ -0,0 +1,54 @@
1 +{
2 + "name": "vue-ps",
3 + "version": "0.1.0",
4 + "description": "",
5 + "main": "dist/index.js",
6 + "scripts": {
7 + "build": "cross-env NODE_ENV=production webpack --progress --hide-modules --config build-webpack.conf.js",
8 + "example": "cross-env NODE_ENV=development webpack-dev-server --open --inline --hot --config example-webpack.conf.js",
9 + "example:vuerouter": "cross-env NODE_ENV=development webpack-dev-server --open --inline --hot --config example-vuerouter-webpack.conf.js"
10 + },
11 + "repository": {
12 + "type": "git",
13 + "url": "https://github.com/Linko91/vue-ps"
14 + },
15 + "author": "",
16 + "license": "MIT",
17 + "dependencies": {
18 + "perfect-scrollbar": "^1.3.0"
19 + },
20 + "files": [
21 + "dist",
22 + "index.js",
23 + "index.vue"
24 + ],
25 + "keywords": [
26 + "scroll",
27 + "scrollbar",
28 + "perfect-scroll",
29 + "vue-ps",
30 + "vue-scroll",
31 + "vue-scrollbar",
32 + "vue-plugin",
33 + "frontend"
34 + ],
35 + "devDependencies": {
36 + "babel-core": "^6.0.0",
37 + "babel-loader": "^6.0.0",
38 + "babel-preset-es2015": "^6.0.0",
39 + "cross-env": "^3.0.0",
40 + "css-loader": "^0.25.0",
41 + "file-loader": "^0.9.0",
42 + "node-sass": "^4.5.3",
43 + "sass-loader": "^4.1.1",
44 + "scss-loader": "0.0.1",
45 + "style-loader": "^0.13.1",
46 + "vue": "^2.4.2",
47 + "vue-loader": "^10.3.0",
48 + "vue-router": "^2.7.0",
49 + "vue-style-loader": "^1.0.0",
50 + "vue-template-compiler": "^2.3.3",
51 + "webpack": "^2.5.1",
52 + "webpack-dev-server": "^2.4.5"
53 + }
54 +}
src/components/vue-quill-editor.vue new
+179
@@ -0,0 +1,179 @@
1 +<template>
2 + <div class="quill-editor">
3 + <slot name="toolbar"></slot>
4 + <div ref="editor"></div>
5 + </div>
6 +</template>
7 +
8 +<script>
9 +// require sources
10 +import _Quill from "quill"
11 +import "quill/dist/quill.core.css"
12 +import "quill/dist/quill.snow.css"
13 +import "quill/dist/quill.bubble.css"
14 +
15 +const Quill = window.Quill || _Quill
16 +const defaultOptions = {
17 + theme: "snow",
18 + boundary: document.body,
19 + modules: {
20 + toolbar: [
21 + ["bold", "italic", "underline", "strike"],
22 + ["blockquote", "code-block"],
23 + [{ header: 1 }, { header: 2 }],
24 + [{ list: "ordered" }, { list: "bullet" }],
25 + [{ script: "sub" }, { script: "super" }],
26 + [{ indent: "-1" }, { indent: "+1" }],
27 + [{ direction: "rtl" }],
28 + [{ size: ["small", false, "large", "huge"] }],
29 + [{ header: [1, 2, 3, 4, 5, 6, false] }],
30 + [{ color: [] }, { background: [] }],
31 + [{ font: [] }],
32 + [{ align: [] }],
33 + ["clean"],
34 + ["link", "image", "video"]
35 + ]
36 + },
37 + placeholder: "Insert text here ...",
38 + readOnly: false
39 +}
40 +
41 +// pollfill
42 +if (typeof Object.assign != "function") {
43 + Object.defineProperty(Object, "assign", {
44 + value(target, varArgs) {
45 + if (target == null) {
46 + throw new TypeError("Cannot convert undefined or null to object")
47 + }
48 + const to = Object(target)
49 + for (let index = 1; index < arguments.length; index++) {
50 + const nextSource = arguments[index]
51 + if (nextSource != null) {
52 + for (const nextKey in nextSource) {
53 + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
54 + to[nextKey] = nextSource[nextKey]
55 + }
56 + }
57 + }
58 + }
59 + return to
60 + },
61 + writable: true,
62 + configurable: true
63 + })
64 +}
65 +
66 +// export
67 +export default {
68 + name: "quill-editor",
69 + data() {
70 + return {
71 + _options: {},
72 + _content: "",
73 + defaultOptions
74 + }
75 + },
76 + props: {
77 + content: String,
78 + value: String,
79 + disabled: {
80 + type: Boolean,
81 + default: false
82 + },
83 + options: {
84 + type: Object,
85 + required: false,
86 + default: () => ({})
87 + },
88 + globalOptions: {
89 + type: Object,
90 + required: false,
91 + default: () => ({})
92 + }
93 + },
94 + mounted() {
95 + this.initialize()
96 + },
97 + beforeDestroy() {
98 + this.quill = null
99 + delete this.quill
100 + },
101 + methods: {
102 + // Init Quill instance
103 + initialize() {
104 + if (this.$el) {
105 + // Options
106 + this._options = Object.assign({}, this.defaultOptions, this.globalOptions, this.options)
107 +
108 + // Instance
109 + this.quill = new Quill(this.$refs.editor, this._options)
110 +
111 + this.quill.enable(false)
112 +
113 + // Set editor content
114 + if (this.value || this.content) {
115 + this.quill.pasteHTML(this.value || this.content)
116 + }
117 +
118 + // Disabled editor
119 + if (!this.disabled) {
120 + this.quill.enable(true)
121 + }
122 +
123 + // Mark model as touched if editor lost focus
124 + this.quill.on("selection-change", range => {
125 + if (!range) {
126 + this.$emit("blur", this.quill)
127 + } else {
128 + this.$emit("focus", this.quill)
129 + }
130 + })
131 +
132 + // Update model if text changes
133 + this.quill.on("text-change", (delta, oldDelta, source) => {
134 + let html = this.$refs.editor.children[0].innerHTML
135 + const quill = this.quill
136 + const text = this.quill.getText()
137 + if (html === "<p><br></p>") html = ""
138 + this._content = html
139 + this.$emit("input", this._content)
140 + this.$emit("change", { html, text, quill })
141 + })
142 +
143 + // Emit ready event
144 + this.$emit("ready", this.quill)
145 + }
146 + }
147 + },
148 + watch: {
149 + // Watch content change
150 + content(newVal, oldVal) {
151 + if (this.quill) {
152 + if (newVal && newVal !== this._content) {
153 + this._content = newVal
154 + this.quill.pasteHTML(newVal)
155 + } else if (!newVal) {
156 + this.quill.setText("")
157 + }
158 + }
159 + },
160 + // Watch content change
161 + value(newVal, oldVal) {
162 + if (this.quill) {
163 + if (newVal && newVal !== this._content) {
164 + this._content = newVal
165 + this.quill.pasteHTML(newVal)
166 + } else if (!newVal) {
167 + this.quill.setText("")
168 + }
169 + }
170 + },
171 + // Watch disabled change
172 + disabled(newVal, oldVal) {
173 + if (this.quill) {
174 + this.quill.enable(!newVal)
175 + }
176 + }
177 + }
178 +}
179 +</script>
src/components/vue-resize/ResizeObserver.vue new
+128
@@ -0,0 +1,128 @@
1 +<template>
2 + <div class="resize-observer" tabindex="-1" />
3 +</template>
4 +
5 +<script>
6 +import { getInternetExplorerVersion } from "./compatibility"
7 +
8 +let isIE
9 +
10 +function initCompat() {
11 + if (!initCompat.init) {
12 + initCompat.init = true
13 + isIE = getInternetExplorerVersion() !== -1
14 + }
15 +}
16 +
17 +import { defineComponent } from "@vue/runtime-core"
18 +
19 +export default defineComponent({
20 + name: "ResizeObserver",
21 + props: {
22 + emitOnMount: {
23 + type: Boolean,
24 + default: false
25 + },
26 +
27 + ignoreWidth: {
28 + type: Boolean,
29 + default: false
30 + },
31 +
32 + ignoreHeight: {
33 + type: Boolean,
34 + default: false
35 + }
36 + },
37 +
38 + mounted() {
39 + initCompat()
40 + this.$nextTick(() => {
41 + this._w = this.$el.offsetWidth
42 + this._h = this.$el.offsetHeight
43 + if (this.emitOnMount) {
44 + this.emitSize()
45 + }
46 + })
47 + const object = document.createElement("object")
48 + this._resizeObject = object
49 + object.setAttribute("aria-hidden", "true")
50 + object.setAttribute("tabindex", -1)
51 + object.onload = this.addResizeHandlers
52 + object.type = "text/html"
53 + if (isIE) {
54 + this.$el.appendChild(object)
55 + }
56 + object.data = "about:blank"
57 + if (!isIE) {
58 + this.$el.appendChild(object)
59 + }
60 + },
61 +
62 + beforeUnmount() {
63 + this.removeResizeHandlers()
64 + },
65 +
66 + methods: {
67 + compareAndNotify() {
68 + if ((!this.ignoreWidth && this._w !== this.$el.offsetWidth) || (!this.ignoreHeight && this._h !== this.$el.offsetHeight)) {
69 + this._w = this.$el.offsetWidth
70 + this._h = this.$el.offsetHeight
71 + this.emitSize()
72 + }
73 + },
74 +
75 + emitSize() {
76 + this.$emit("notify", {
77 + width: this._w,
78 + height: this._h
79 + })
80 + },
81 +
82 + addResizeHandlers() {
83 + this._resizeObject.contentDocument.defaultView.addEventListener("resize", this.compareAndNotify)
84 + this.compareAndNotify()
85 + },
86 +
87 + removeResizeHandlers() {
88 + if (this._resizeObject && this._resizeObject.onload) {
89 + if (!isIE && this._resizeObject.contentDocument) {
90 + this._resizeObject.contentDocument.defaultView.removeEventListener("resize", this.compareAndNotify)
91 + }
92 + this.$el.removeChild(this._resizeObject)
93 + this._resizeObject.onload = null
94 + this._resizeObject = null
95 + }
96 + }
97 + }
98 +})
99 +</script>
100 +
101 +<style>
102 +.resize-observer {
103 + position: absolute;
104 + top: 0;
105 + left: 0;
106 + z-index: -1;
107 + width: 100%;
108 + height: 100%;
109 + border: none;
110 + background-color: transparent;
111 + pointer-events: none;
112 + display: block;
113 + overflow: hidden;
114 + opacity: 0;
115 +}
116 +
117 +.resize-observer > object {
118 + display: block;
119 + position: absolute;
120 + top: 0;
121 + left: 0;
122 + height: 100%;
123 + width: 100%;
124 + overflow: hidden;
125 + pointer-events: none;
126 + z-index: -1;
127 +}
128 +</style>
src/components/vue-resize/compatibility.js new
+25
@@ -0,0 +1,25 @@
1 +export function getInternetExplorerVersion() {
2 + const ua = window.navigator.userAgent
3 +
4 + const msie = ua.indexOf("MSIE ")
5 + if (msie > 0) {
6 + // IE 10 or older => return version number
7 + return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10)
8 + }
9 +
10 + const trident = ua.indexOf("Trident/")
11 + if (trident > 0) {
12 + // IE 11 => return version number
13 + const rv = ua.indexOf("rv:")
14 + return parseInt(ua.substring(rv + 3, ua.indexOf(".", rv)), 10)
15 + }
16 +
17 + const edge = ua.indexOf("Edge/")
18 + if (edge > 0) {
19 + // Edge (IE 12+) => return version number
20 + return parseInt(ua.substring(edge + 5, ua.indexOf(".", edge)), 10)
21 + }
22 +
23 + // other browser
24 + return -1
25 +}
src/core/footer.vue new
+70
@@ -0,0 +1,70 @@
1 +<template>
2 + <div class="footer flex align-center justify-space-between" :class="{ above: position === 'above' }">
3 + <div>
4 + <a href="https://pragmatic-docs.vercel.app/#/" target="_blank">
5 + <span class="hidden-xs-only">Documentation</span><span class="hidden-sm-and-up">Docs.</span>
6 + </a>
7 + </div>
8 + <div>
9 + <span>Made by <a href="https://ddmweb.it" target="_blank">Linko</a></span>
10 + <a
11 + class="el-button buy-btn el-button--default el-button--small is-plain"
12 + href="https://1.envato.market/BkJGL?ref=Linko91&utm_source=pragmaticdemo"
13 + target="_blank"
14 + >
15 + <i class="mdi mdi-cart mr-5"></i> Purchase <span class="hidden-xs-only ml-5">Pragmatic</span>
16 + </a>
17 + </div>
18 + </div>
19 +</template>
20 +
21 +<script lang="ts">
22 +import { defineComponent } from "@vue/runtime-core"
23 +export default defineComponent({
24 + name: "Footer",
25 + props: ["position"]
26 +})
27 +</script>
28 +
29 +<style lang="scss" scoped>
30 +@import "../assets/scss/_variables";
31 +@import "../assets/scss/_mixins";
32 +
33 +.footer {
34 + width: 100%;
35 + height: 40px;
36 + padding: 0 20px;
37 + box-sizing: border-box;
38 + background: white;
39 + margin-top: 2px;
40 + font-size: 14px;
41 + border-top-left-radius: 20px;
42 +
43 + &.above {
44 + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.08);
45 + z-index: 1;
46 + position: absolute;
47 + bottom: 0;
48 + left: 0;
49 + right: 0;
50 + border-radius: 0;
51 + }
52 +
53 + a {
54 + font-weight: bold;
55 + text-decoration: none;
56 + color: $text-color-accent;
57 + }
58 +
59 + .buy-btn {
60 + margin-left: 10px;
61 + }
62 +}
63 +
64 +@media (max-width: 768px) {
65 + .footer {
66 + padding: 0 12px;
67 + border-radius: 0;
68 + }
69 +}
70 +</style>
src/core/horizontal-nav.vue new
+86
@@ -0,0 +1,86 @@
1 +<template>
2 + <div class="horizontal-nav flex" :class="{ ['pos-' + position]: true }">
3 + <logo mode="horizontal" />
4 + <div class="box grow flex nav-container">
5 + <el-scrollbar class="box grow">
6 + <Nav @push-page="pushPage" mode="horizontal" />
7 + </el-scrollbar>
8 + </div>
9 + </div>
10 +</template>
11 +
12 +<script lang="ts">
13 +import { defineComponent } from "@vue/runtime-core"
14 +import Nav from "@/core/nav.vue"
15 +import Logo from "@/core/logo.vue"
16 +
17 +export default defineComponent({
18 + name: "HorizontalNav",
19 + props: ["position"],
20 + data() {
21 + return {}
22 + },
23 + methods: {
24 + pushPage(index, indexPath) {
25 + this.$emit("push-page", { page: index })
26 + }
27 + },
28 + components: {
29 + Nav,
30 + Logo
31 + }
32 +})
33 +</script>
34 +
35 +<style lang="scss" scoped>
36 +@import "../assets/scss/_variables";
37 +
38 +.horizontal-nav {
39 + overflow: hidden;
40 + //overflow-x: scroll;
41 + //-webkit-overflow-scrolling: touch;
42 + //-ms-overflow-style: -ms-autohiding-scrollbar;
43 + background: white;
44 + height: 45px;
45 + z-index: 1;
46 + margin-bottom: 30px;
47 +
48 + &.pos-top {
49 + border-bottom-left-radius: 16px;
50 + border-bottom-right-radius: 16px;
51 + }
52 + &.pos-bottom {
53 + border-top-left-radius: 16px;
54 + border-top-right-radius: 16px;
55 + }
56 +
57 + .nav-container {
58 + position: relative;
59 + overflow: hidden;
60 + padding-right: 20px;
61 +
62 + &::before {
63 + content: "";
64 + display: block;
65 + z-index: 1;
66 + position: absolute;
67 + top: 0px;
68 + left: 0px;
69 + width: 0px;
70 + height: 20px;
71 + box-shadow: 0px 0px 15px 15px #fff;
72 + }
73 + &::after {
74 + content: "";
75 + display: block;
76 + z-index: 1;
77 + position: absolute;
78 + top: 0px;
79 + right: 20px;
80 + width: 0px;
81 + height: 20px;
82 + box-shadow: 0px 0px 15px 15px #fff;
83 + }
84 + }
85 +}
86 +</style>
src/core/logo.vue new
+126
@@ -0,0 +1,126 @@
1 +<template>
2 + <div class="box-logo flex align-center" :class="{ 'nav-collapsed': collapseNav, [mode]: true }">
3 + <!--<div class="letter-logo">P</div>-->
4 + <img class="image-logo" src="@/assets/images/logo.svg" alt="logo" @click="goto('/')" />
5 + <div class="app-name" @click="goto('/')">Pragmatic</div>
6 + <!--
7 + <button class="collapse-nav" @click="collapseNavToggle">
8 + <i class="mdi mdi-menu"></i>
9 + </button>
10 + -->
11 + </div>
12 +</template>
13 +
14 +<script lang="ts">
15 +import { defineComponent } from "@vue/runtime-core"
16 +export default defineComponent({
17 + name: "Logo",
18 + props: ["collapseNav", "mode"],
19 + data() {
20 + return {}
21 + },
22 + methods: {
23 + collapseNavToggle() {
24 + this.$emit("collapse-nav-toggle")
25 + },
26 + goto(index: string) {
27 + this.$router.push(index)
28 + }
29 + }
30 +})
31 +</script>
32 +
33 +<style lang="scss">
34 +@import "../assets/scss/_variables";
35 +@import "../assets/scss/_mixins";
36 +
37 +.box-logo {
38 + height: 60px;
39 + padding: 0 20px;
40 + box-sizing: border-box;
41 + font-size: 20px;
42 + font-weight: bold;
43 + position: relative;
44 + @include text-bordered-shadow();
45 +
46 + .letter-logo {
47 + width: 30px;
48 + height: 30px;
49 + line-height: 30px;
50 + text-align: center;
51 + background: $text-color-primary;
52 + color: $text-color-accent;
53 + border-radius: 5px;
54 + margin-right: 10px;
55 + font-weight: bolder;
56 + font-size: 20px;
57 + }
58 +
59 + .image-logo {
60 + width: 30px;
61 + height: 30px;
62 + margin-right: 10px;
63 + filter: drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.3));
64 + cursor: pointer;
65 + }
66 +
67 + .app-name {
68 + cursor: pointer;
69 + }
70 +
71 + .collapse-nav {
72 + position: absolute;
73 + top: 50%;
74 + left: 10px;
75 + height: 30px;
76 + width: 30px;
77 + margin-top: -15px;
78 + opacity: 0;
79 + box-shadow: 0px 0px 20px 10px $background-color;
80 + cursor: pointer;
81 + border: 1px solid $text-color-accent;
82 + border-radius: 50%;
83 + color: $text-color-accent;
84 + outline: none;
85 + background: $background-color;
86 + transition: all 0.5s;
87 + }
88 +
89 + &:hover {
90 + .collapse-nav {
91 + opacity: 1;
92 + left: 20px;
93 + }
94 + }
95 +
96 + &.nav-collapsed {
97 + .app-name {
98 + display: none;
99 + }
100 + }
101 +
102 + &.horizontal {
103 + height: 100%;
104 +
105 + .collapse-nav {
106 + display: none;
107 + }
108 + }
109 +}
110 +
111 +@media (max-width: 768px) {
112 + .box-logo {
113 + .collapse-nav {
114 + display: none;
115 + }
116 +
117 + &.horizontal {
118 + padding: 0 10px;
119 +
120 + .app-name {
121 + display: none;
122 + }
123 + }
124 + }
125 +}
126 +</style>
src/core/nav.vue new
+558
@@ -0,0 +1,558 @@
1 +<template>
2 + <el-menu
3 + v-model:default-active="activeLink"
4 + :mode="mode"
5 + @select="goto"
6 + :collapse="isCollapse"
7 + :unique-opened="true"
8 + background-color="transparent"
9 + class="main-navigation-menu"
10 + :class="{ 'nav-collapsed': isCollapse }"
11 + >
12 + <div class="el-menu-item-group__title" style="padding-top: 4px"><span>Apps</span></div>
13 + <el-sub-menu index="/dashboards" popper-class="main-navigation-submenu">
14 + <template #title> <i class="mdi mdi-gauge"></i><span>Dashboard</span> </template>
15 + <el-menu-item index="/dashboard">
16 + <span slot="title">Analytical</span>
17 + </el-menu-item>
18 + <el-menu-item index="/ecommerce-dashboard">
19 + <span slot="title">eCommerce</span>
20 + </el-menu-item>
21 + <el-menu-item index="/crypto-dashboard">
22 + <span slot="title">Crypto</span>
23 + </el-menu-item>
24 + </el-sub-menu>
25 + <el-menu-item index="/calendar"> <i class="mdi mdi-calendar"></i><span slot="title">Calendar</span> </el-menu-item>
26 + <el-menu-item index="/contacts"> <i class="mdi mdi-account-multiple-outline"></i><span slot="title">Contacts</span> </el-menu-item>
27 + <el-menu-item index="/gallery"> <i class="mdi mdi-image-multiple-outline"></i><span slot="title">Gallery</span> </el-menu-item>
28 + <el-menu-item index="/cards"> <i class="mdi mdi-view-dashboard-outline"></i><span slot="title">Cards</span> </el-menu-item>
29 + <el-menu-item index="/mail"> <i class="mdi mdi-email-outline"></i><span slot="title">Mail</span> </el-menu-item>
30 + <el-sub-menu index="/ecommerce" popper-class="main-navigation-submenu">
31 + <template #title> <i class="mdi mdi-cart-outline"></i><span>eCommerce</span> </template>
32 + <el-menu-item index="/ecommerce/dashboard">
33 + <span slot="title">Dashboard</span>
34 + </el-menu-item>
35 + <el-menu-item index="/ecommerce/shop">
36 + <span slot="title">Shop</span>
37 + </el-menu-item>
38 + <el-menu-item index="/ecommerce/products">
39 + <span slot="title">Products</span>
40 + </el-menu-item>
41 + <el-menu-item index="/ecommerce/product-detail">
42 + <span slot="title">Product Detail</span>
43 + </el-menu-item>
44 + <el-menu-item index="/ecommerce/new-product">
45 + <span slot="title">New Product</span>
46 + </el-menu-item>
47 + <el-menu-item index="/ecommerce/account">
48 + <span slot="title">My Account</span>
49 + </el-menu-item>
50 + <el-menu-item index="/ecommerce/cart">
51 + <span slot="title">Cart</span>
52 + </el-menu-item>
53 + <el-menu-item index="/ecommerce/checkout">
54 + <span slot="title">Checkout</span>
55 + </el-menu-item>
56 + </el-sub-menu>
57 +
58 + <div class="el-menu-item-group__title"><span>User interface</span></div>
59 + <el-sub-menu index="layout" popper-class="main-navigation-submenu">
60 + <template #title> <i class="mdi mdi-view-compact-outline"></i><span>Layout</span> </template>
61 + <el-menu-item index="/layout/flexbox">
62 + <span slot="title">Flexbox</span>
63 + </el-menu-item>
64 + <el-menu-item index="/layout/blank">
65 + <span slot="title">Blank page</span>
66 + </el-menu-item>
67 + <el-menu-item index="/layout/page-headers">
68 + <span slot="title">Page headers</span>
69 + </el-menu-item>
70 + <el-menu-item index="/layout/sidebar-right">
71 + <span slot="title">Sidebar right</span>
72 + </el-menu-item>
73 + <el-menu-item index="/layout/sidebar-left">
74 + <span slot="title">Sidebar left</span>
75 + </el-menu-item>
76 + <el-menu-item index="/layout/tabbed">
77 + <span slot="title">Tabbed page</span>
78 + </el-menu-item>
79 + </el-sub-menu>
80 + <el-menu-item index="/themes"> <i class="mdi mdi-format-color-fill"></i><span slot="title">Themes</span> </el-menu-item>
81 + <el-sub-menu index="1" popper-class="main-navigation-submenu" teleported>
82 + <template #title> <i class="mdi mdi-menu"></i><span>Multi level menu</span> </template>
83 + <el-menu-item index="1-1">item one (1)</el-menu-item>
84 + <el-menu-item index="1-2">item two (2)</el-menu-item>
85 + <el-menu-item index="1-3">item three (3)</el-menu-item>
86 + <el-sub-menu index="1-4" popper-class="main-navigation-submenu" teleported>
87 + <template #title>item four (4)</template>
88 + <el-sub-menu index="1-4-1" popper-class="main-navigation-submenu" teleported>
89 + <template #title>item one (4.1)</template>
90 + <el-menu-item index="1-4-1-1">item one (4.1.1)</el-menu-item>
91 + <el-menu-item index="1-4-1-2">item two (4.1.2)</el-menu-item>
92 + <el-menu-item index="1-4-1-3">item three (4.1.3)</el-menu-item>
93 + </el-sub-menu>
94 + <el-sub-menu index="1-4-2" popper-class="main-navigation-submenu" teleported>
95 + <template #title>item two (4.2)</template>
96 + <el-menu-item index="1-4-2-1">item one (4.2.1)</el-menu-item>
97 + <el-menu-item index="1-4-2-2">item two (4.2.2)</el-menu-item>
98 + <el-menu-item index="1-4-2-3">item three (4.2.3)</el-menu-item>
99 + </el-sub-menu>
100 + <el-menu-item index="1-4-3">item three (4-3)</el-menu-item>
101 + <el-menu-item index="1-4-4">item four (4-4)</el-menu-item>
102 + <el-menu-item index="1-4-5">item five (4-5)</el-menu-item>
103 + <el-menu-item index="1-4-6">item six (4-6)</el-menu-item>
104 + <el-menu-item index="1-4-7">item seven (4-7)</el-menu-item>
105 + </el-sub-menu>
106 + </el-sub-menu>
107 + <el-sub-menu index="icons" popper-class="main-navigation-submenu">
108 + <template #title> <i class="mdi mdi-folder-star-outline"></i><span>Icons</span> </template>
109 + <el-menu-item index="/icons/md-icons">
110 + <span slot="title">MD Icons</span>
111 + </el-menu-item>
112 + <el-menu-item index="/icons/flag-icons">
113 + <span slot="title">Flag Icons</span>
114 + </el-menu-item>
115 + </el-sub-menu>
116 + <el-menu-item index="/multi-language"> <i class="mdi mdi-translate"></i><span slot="title">Multi language</span> </el-menu-item>
117 + <el-menu-item index="/typography"> <i class="mdi mdi-format-font"></i><span slot="title">Typography</span> </el-menu-item>
118 + <el-menu-item index="/helper-classes">
119 + <i class="mdi mdi-help-circle-outline"></i><span slot="title">Helper Classes</span>
120 + </el-menu-item>
121 + <el-sub-menu index="element" popper-class="main-navigation-submenu limit-height">
122 + <template #title> <i class="mdi mdi-shape-outline"></i><span>Element</span> </template>
123 + <el-menu-item index="/element/button">
124 + <span slot="title">Button</span>
125 + </el-menu-item>
126 + <el-menu-item index="/element/radio">
127 + <span slot="title">Radio</span>
128 + </el-menu-item>
129 + <el-menu-item index="/element/checkbox">
130 + <span slot="title">Checkbox</span>
131 + </el-menu-item>
132 + <el-menu-item index="/element/input">
133 + <span slot="title">Input</span>
134 + </el-menu-item>
135 + <el-menu-item index="/element/input-number">
136 + <span slot="title">Input Number</span>
137 + </el-menu-item>
138 + <el-menu-item index="/element/select">
139 + <span slot="title">Select</span>
140 + </el-menu-item>
141 + <el-menu-item index="/element/cascader">
142 + <span slot="title">Cascader</span>
143 + </el-menu-item>
144 + <el-menu-item index="/element/switch">
145 + <span slot="title">Switch</span>
146 + </el-menu-item>
147 + <el-menu-item index="/element/slider">
148 + <span slot="title">Slider</span>
149 + </el-menu-item>
150 + <el-menu-item index="/element/time-picker">
151 + <span slot="title">Time Picker</span>
152 + </el-menu-item>
153 + <el-menu-item index="/element/date-picker">
154 + <span slot="title">Date Picker</span>
155 + </el-menu-item>
156 + <el-menu-item index="/element/datetime-picker">
157 + <span slot="title">Date Time Picker</span>
158 + </el-menu-item>
159 + <el-menu-item index="/element/upload">
160 + <span slot="title">Upload</span>
161 + </el-menu-item>
162 + <el-menu-item index="/element/rate">
163 + <span slot="title">Rate</span>
164 + </el-menu-item>
165 + <el-menu-item index="/element/color-picker">
166 + <span slot="title">Color Picker</span>
167 + </el-menu-item>
168 + <el-menu-item index="/element/transfer">
169 + <span slot="title">Transfer</span>
170 + </el-menu-item>
171 + <el-menu-item index="/element/form">
172 + <span slot="title">Form</span>
173 + </el-menu-item>
174 + <el-menu-item index="/element/tag">
175 + <span slot="title">Tag</span>
176 + </el-menu-item>
177 + <el-menu-item index="/element/progress">
178 + <span slot="title">Progress</span>
179 + </el-menu-item>
180 + <el-menu-item index="/element/tree">
181 + <span slot="title">Tree</span>
182 + </el-menu-item>
183 + <el-menu-item index="/element/pagination">
184 + <span slot="title">Pagination</span>
185 + </el-menu-item>
186 + <el-menu-item index="/element/badge">
187 + <span slot="title">Badge</span>
188 + </el-menu-item>
189 + <el-menu-item index="/element/alert">
190 + <span slot="title">Alert</span>
191 + </el-menu-item>
192 + <el-menu-item index="/element/loading">
193 + <span slot="title">Loading</span>
194 + </el-menu-item>
195 + <el-menu-item index="/element/message">
196 + <span slot="title">Message</span>
197 + </el-menu-item>
198 + <el-menu-item index="/element/message-box">
199 + <span slot="title">Message Box</span>
200 + </el-menu-item>
201 + <el-menu-item index="/element/notification">
202 + <span slot="title">Notification</span>
203 + </el-menu-item>
204 + <el-menu-item index="/element/menu">
205 + <span slot="title">NavMenu</span>
206 + </el-menu-item>
207 + <el-menu-item index="/element/tabs">
208 + <span slot="title">Tabs</span>
209 + </el-menu-item>
210 + <el-menu-item index="/element/breadcrumb">
211 + <span slot="title">Breadcrumb</span>
212 + </el-menu-item>
213 + <el-menu-item index="/element/dropdown">
214 + <span slot="title">Dropdown</span>
215 + </el-menu-item>
216 + <el-menu-item index="/element/steps">
217 + <span slot="title">Steps</span>
218 + </el-menu-item>
219 + <el-menu-item index="/element/dialog">
220 + <span slot="title">Dialog</span>
221 + </el-menu-item>
222 + <el-menu-item index="/element/tooltip">
223 + <span slot="title">Tooltip</span>
224 + </el-menu-item>
225 + <el-menu-item index="/element/popover">
226 + <span slot="title">Popover</span>
227 + </el-menu-item>
228 + <el-menu-item index="/element/card">
229 + <span slot="title">Card</span>
230 + </el-menu-item>
231 + <el-menu-item index="/element/carousel">
232 + <span slot="title">Carousel</span>
233 + </el-menu-item>
234 + <el-menu-item index="/element/collapse">
235 + <span slot="title">Collapse</span>
236 + </el-menu-item>
237 + <el-menu-item index="/element/timeline">
238 + <span slot="title">Timeline</span>
239 + </el-menu-item>
240 + </el-sub-menu>
241 +
242 + <div class="el-menu-item-group__title"><span>Components</span></div>
243 + <el-sub-menu index="tables" popper-class="main-navigation-submenu">
244 + <template #title> <i class="mdi mdi-table"></i><span>Tables</span> </template>
245 + <el-menu-item index="/tables/simple-table">
246 + <span slot="title">Basic Table</span>
247 + </el-menu-item>
248 + <el-menu-item index="/tables/styled-table">
249 + <span slot="title">Element UI</span>
250 + </el-menu-item>
251 + <el-menu-item index="/tables/tui-grid">
252 + <span slot="title">TUI Grid</span>
253 + </el-menu-item>
254 + </el-sub-menu>
255 + <el-sub-menu index="maps" popper-class="main-navigation-submenu">
256 + <template #title> <i class="mdi mdi-map-outline"></i><span>Maps</span> </template>
257 + <el-menu-item index="/maps/leaflet">
258 + <span slot="title">Leaflet</span>
259 + </el-menu-item>
260 + <el-menu-item index="/maps/mapbox">
261 + <span slot="title">Mapbox</span>
262 + </el-menu-item>
263 + </el-sub-menu>
264 + <el-sub-menu index="editors" popper-class="main-navigation-submenu">
265 + <template #title> <i class="mdi mdi-pencil-box-outline"></i><span>Editors</span> </template>
266 + <el-menu-item index="/editors/quill">
267 + <span slot="title">Quill</span>
268 + </el-menu-item>
269 + <el-menu-item index="/editors/pell">
270 + <span slot="title">Pell</span>
271 + </el-menu-item>
272 + <el-menu-item index="/editors/markdown">
273 + <span slot="title">Markdown</span>
274 + </el-menu-item>
275 + </el-sub-menu>
276 + <el-sub-menu index="charts" popper-class="main-navigation-submenu">
277 + <template #title> <i class="mdi mdi-chart-line"></i><span>Charts</span> </template>
278 + <el-menu-item index="/charts/vuechartkick">
279 + <span slot="title">Vue Chartkick</span>
280 + </el-menu-item>
281 + <el-menu-item index="/charts/peity">
282 + <span slot="title">Peity</span>
283 + </el-menu-item>
284 + <el-menu-item index="/charts/echarts">
285 + <span slot="title">Echarts</span>
286 + </el-menu-item>
287 + </el-sub-menu>
288 +
289 + <div class="el-menu-item-group__title"><span>Pages</span></div>
290 + <el-menu-item index="/profile">
291 + <i class="mdi mdi-card-account-details-outline"></i><span slot="title">Profile</span>
292 + </el-menu-item>
293 + <el-sub-menu index="authentication" popper-class="main-navigation-submenu">
294 + <template #title> <i class="mdi mdi-lock-outline"></i><span>Authentication</span> </template>
295 + <el-menu-item index="/logout">
296 + <span slot="title">Login</span>
297 + </el-menu-item>
298 + <el-menu-item index="/login2">
299 + <span slot="title">Login 2</span>
300 + </el-menu-item>
301 + <el-menu-item index="/register">
302 + <span slot="title">Register</span>
303 + </el-menu-item>
304 + <el-menu-item index="/forgot-password">
305 + <span slot="title">Forgot Password</span>
306 + </el-menu-item>
307 + </el-sub-menu>
308 + <el-menu-item index="/invoice"> <i class="mdi mdi-file-document-edit-outline"></i><span slot="title">Invoice</span> </el-menu-item>
309 + <el-menu-item index="/404"> <i class="mdi mdi-alert-octagon-outline"></i><span slot="title">404</span> </el-menu-item>
310 +
311 + <div class="collapse-menu-btn" :class="{ collapsed: isCollapse }">
312 + <button @click="$emit('collapse-nav-toggle')" class="flex align-center">
313 + <span v-if="!isCollapse"> <i class="mdi mdi-unfold-less-vertical"></i> Collapse </span>
314 + <span v-if="isCollapse"> <i class="mdi mdi-unfold-more-vertical"></i></span>
315 + </button>
316 + </div>
317 + </el-menu>
318 +</template>
319 +
320 +<script lang="ts">
321 +import { defineComponent } from "@vue/runtime-core"
322 +import { detect } from "detect-browser"
323 +import { useRoute } from "vue-router"
324 +const browser = detect()
325 +
326 +export default defineComponent({
327 + name: "Nav",
328 + props: ["mode", "isCollapse"],
329 + data() {
330 + return {
331 + isIe: true,
332 + isEdge: true,
333 + activeLink: null as unknown as string
334 + }
335 + },
336 + methods: {
337 + goto(index: string) {
338 + if (index.charAt(0) === "/") {
339 + this.$router.push(index)
340 + this.$emit("push-page", { page: index })
341 + }
342 + },
343 + setLink(path: string) {
344 + this.activeLink = path
345 + }
346 + },
347 + created() {
348 + if (browser && browser.name !== "ie") this.isIe = false
349 + if (browser && browser.name !== "edge") this.isEdge = false
350 +
351 + const route = useRoute()
352 + this.setLink(route.path)
353 + this.$router.afterEach((to, from) => {
354 + this.setLink(route.path)
355 + })
356 + }
357 +})
358 +</script>
359 +
360 +<style lang="scss" scoped>
361 +@import "../assets/scss/_variables";
362 +
363 +.el-menu {
364 + border: none;
365 +}
366 +.el-menu::before,
367 +.el-menu::after {
368 + display: none;
369 +}
370 +.el-sub-menu,
371 +.el-menu-item {
372 + .mdi {
373 + vertical-align: middle;
374 + margin-right: 5px;
375 + display: inline-block;
376 + width: 24px;
377 + text-align: center;
378 + font-size: 18px;
379 + }
380 +}
381 +
382 +.collapse-menu-btn {
383 + button {
384 + border-radius: 4px;
385 + border: none;
386 + color: $text-color-accent;
387 + background: lighten($text-color-accent, 30);
388 + font-weight: 600;
389 + padding: 4px 8px;
390 + margin-top: 20px;
391 + font-size: 12px;
392 + margin-left: 20px;
393 + cursor: pointer;
394 + white-space: nowrap;
395 + overflow: hidden;
396 + text-align: center;
397 +
398 + i {
399 + font-size: 14px;
400 + margin-right: 5px;
401 + }
402 + }
403 +
404 + &.collapsed {
405 + button {
406 + margin-left: 17px;
407 +
408 + i {
409 + margin-right: -2px;
410 + }
411 + }
412 + }
413 +}
414 +</style>
415 +
416 +<style lang="scss">
417 +@import "../assets/scss/_variables";
418 +
419 +.main-navigation-menu {
420 + transition: width 0.5s;
421 +
422 + &:not(.el-menu--collapse) {
423 + .el-sub-menu__title,
424 + .el-menu-item {
425 + height: 40px;
426 + line-height: 40px;
427 + background-color: transparent !important;
428 + }
429 +
430 + &:not(.el-menu--horizontal) {
431 + .el-menu-item,
432 + .el-sub-menu {
433 + position: relative;
434 +
435 + &::before {
436 + content: "";
437 + display: block;
438 + width: 0px;
439 + height: 1px;
440 + position: absolute;
441 + bottom: 10px;
442 + left: 30px;
443 + background: $text-color-primary;
444 + z-index: 1;
445 + opacity: 0;
446 + transition: all 0.7s cubic-bezier(0.55, 0, 0.1, 1);
447 + }
448 + &:hover {
449 + &::before {
450 + width: 100px;
451 + opacity: 1;
452 + //left: 50px;
453 + transform: translate(20px, 0);
454 + }
455 + }
456 +
457 + &.is-active {
458 + &::before {
459 + background: $text-color-accent;
460 + }
461 + }
462 + }
463 + }
464 +
465 + .el-sub-menu.is-opened {
466 + //background: #edf1f6 !important;
467 + //background: rgba(223, 228, 234, 0.38) !important;
468 + position: relative;
469 +
470 + &::after {
471 + content: "";
472 + display: block;
473 + width: 2px;
474 + position: absolute;
475 + top: 40px;
476 + bottom: 10px;
477 + left: 31px;
478 + background: $text-color-primary;
479 + z-index: 1;
480 + }
481 +
482 + &::before {
483 + display: none;
484 + }
485 +
486 + .el-menu-item,
487 + .el-sub-menu {
488 + &::before,
489 + &::after {
490 + display: none;
491 + }
492 + }
493 + }
494 +
495 + .el-menu-item-group__title {
496 + padding: 15px 0 0px 20px;
497 + color: transparentize($text-color-primary, 0.65);
498 + }
499 + }
500 +
501 + .el-sub-menu__title,
502 + .el-menu-item:not(.is-active) {
503 + color: $text-color-primary;
504 +
505 + i {
506 + color: $text-color-primary;
507 + }
508 + }
509 +
510 + &.el-menu--collapse {
511 + .el-menu-item-group__title {
512 + padding: 15px 0 0px 0px;
513 + width: 100%;
514 + text-align: center;
515 + }
516 +
517 + .el-sub-menu__title:hover,
518 + .el-menu-item:hover {
519 + background-color: rgba(0, 0, 0, 0.05) !important;
520 + }
521 + }
522 +
523 + &.el-menu--horizontal {
524 + white-space: nowrap;
525 + /*width: fit-content;
526 + width: max-content;*/
527 + overflow: hidden;
528 + display: table;
529 +
530 + & > * {
531 + float: inherit !important;
532 + display: inline-block;
533 + }
534 + }
535 +
536 + &.nav-collapsed {
537 + .el-menu-item,
538 + .el-sub-menu__title {
539 + & > span {
540 + display: none;
541 + }
542 + }
543 + }
544 +}
545 +
546 +.main-navigation-submenu {
547 + .el-menu {
548 + background: #fff !important;
549 +
550 + .el-menu-item:not(.is-active) {
551 + color: $text-color-primary;
552 + }
553 + .el-menu-item:hover {
554 + background-color: transparentize($background-color, 0.3) !important;
555 + }
556 + }
557 +}
558 +</style>
src/core/toolbar.vue new
+312
@@ -0,0 +1,312 @@
1 +<template>
2 + <div class="toolbar flex align-center justify-space-between">
3 + <div class="box-left box grow flex">
4 + <button @click="toggleSidebar" v-if="menuBurger !== 'right'" class="toggle-sidebar card-base card-shadow--small">
5 + <i class="mdi mdi-menu"></i>
6 + </button>
7 +
8 + <img class="logo-mini" src="@/assets/images/logo.svg" alt="logo" />
9 +
10 + <search class="hidden-xs-only"></search>
11 + </div>
12 + <div class="box-right flex align-center pl-10">
13 + <el-dropdown trigger="click" @command="onCommandLang">
14 + <span class="el-dropdown-link">
15 + <i class="flag-icon" :class="{ ['flag-icon-' + lang]: true }"></i>
16 + </span>
17 + <template #dropdown>
18 + <el-dropdown-menu>
19 + <el-dropdown-item command="us"
20 + ><i class="flag-icon flag-icon-us mr-15"></i>{{ $t("languages.English") }}</el-dropdown-item
21 + >
22 + <el-dropdown-item command="it"
23 + ><i class="flag-icon flag-icon-it mr-15"></i>{{ $t("languages.Italian") }}</el-dropdown-item
24 + >
25 + <el-dropdown-item command="fr"
26 + ><i class="flag-icon flag-icon-fr mr-15"></i>{{ $t("languages.French") }}</el-dropdown-item
27 + >
28 + <el-dropdown-item command="de"
29 + ><i class="flag-icon flag-icon-de mr-15"></i>{{ $t("languages.German") }}</el-dropdown-item
30 + >
31 + <el-dropdown-item command="es"
32 + ><i class="flag-icon flag-icon-es mr-15"></i>{{ $t("languages.Spanish") }}</el-dropdown-item
33 + >
34 + <el-dropdown-item command="cn"
35 + ><i class="flag-icon flag-icon-cn mr-15"></i>{{ $t("languages.Chinese") }}</el-dropdown-item
36 + >
37 + <el-dropdown-item command="jp"
38 + ><i class="flag-icon flag-icon-jp mr-15"></i>{{ $t("languages.Japanese") }}</el-dropdown-item
39 + >
40 + </el-dropdown-menu>
41 + </template>
42 + </el-dropdown>
43 + <button class="fullscreen-button" @click="toggleFullscreen">
44 + <i class="mdi mdi-fullscreen" v-if="!fullscreen"></i>
45 + <i class="mdi mdi-fullscreen-exit" v-if="fullscreen"></i>
46 + </button>
47 + <el-popover placement="bottom" :width="popoverWidth" trigger="click">
48 + <template #reference>
49 + <el-badge :is-dot="true" class="notification-icon-badge">
50 + <el-button class="notification-icon">
51 + <i class="mdi mdi-bell"></i>
52 + </el-button>
53 + </el-badge>
54 + </template>
55 + <template #default>
56 + <notification-box></notification-box>
57 + </template>
58 + </el-popover>
59 + <span class="username"><router-link to="/profile">Aurora Shenton</router-link></span>
60 + <el-dropdown trigger="click" @command="onCommand">
61 + <span class="el-dropdown-link">
62 + <img src="../assets/images/avatar.jpg" class="avatar" alt="avatar" />
63 + </span>
64 + <template #dropdown>
65 + <el-dropdown-menu>
66 + <el-dropdown-item command="/profile"> <i class="mdi mdi-account-outline mr-10"></i> Profile </el-dropdown-item>
67 + <el-dropdown-item command="/calendar"> <i class="mdi mdi-calendar mr-10"></i> Calendar </el-dropdown-item>
68 + <el-dropdown-item command="/contacts">
69 + <i class="mdi mdi-account-multiple-outline mr-10"></i> Contacts
70 + </el-dropdown-item>
71 + <el-dropdown-item command="/logout" divided> <i class="mdi mdi-logout mr-10"></i> Logout </el-dropdown-item>
72 + </el-dropdown-menu>
73 + </template>
74 + </el-dropdown>
75 +
76 + <button
77 + @click="toggleSidebar"
78 + v-if="menuBurger === 'right'"
79 + class="toggle-sidebar toggle-sidebar__right card-base card-shadow--small"
80 + >
81 + <i class="mdi mdi-menu"></i>
82 + </button>
83 + </div>
84 + </div>
85 +</template>
86 +
87 +<script lang="ts">
88 +import { defineComponent } from "@vue/runtime-core"
89 +import NotificationBox from "../components/NotificationBox.vue"
90 +import Search from "../components/Search.vue"
91 +import { api as fullscreen } from "vue-fullscreen"
92 +import type { RouteLocationRaw } from "vue-router"
93 +
94 +export default defineComponent({
95 + name: "Toolbar",
96 + props: ["menuBurger"],
97 + data() {
98 + return {
99 + popoverWidth: 300,
100 + fullscreen: false,
101 + lang: "us"
102 + }
103 + },
104 + methods: {
105 + onCommandLang(lang: string) {
106 + if (lang.charAt(0) === "/") this.onCommand(lang)
107 + else this.lang = lang
108 + },
109 + onCommand(path: RouteLocationRaw) {
110 + this.$router.push(path)
111 + },
112 + toggleSidebar() {
113 + this.$emit("toggle-sidebar")
114 + },
115 + resizePopoverWidth() {
116 + if (window.innerWidth <= 768) {
117 + this.popoverWidth = 250
118 + } else {
119 + this.popoverWidth = 300
120 + }
121 + },
122 + toggleFullscreen() {
123 + fullscreen.toggle(document.querySelector("body"), {
124 + callback: () => {
125 + this.fullscreen = fullscreen.isFullscreen
126 + }
127 + })
128 + }
129 + },
130 + components: {
131 + NotificationBox,
132 + Search
133 + },
134 + mounted() {
135 + this.fullscreen = fullscreen.isFullscreen
136 + this.resizePopoverWidth()
137 + window.addEventListener("resize", this.resizePopoverWidth)
138 + },
139 + beforeUnmount() {
140 + window.removeEventListener("resize", this.resizePopoverWidth)
141 + }
142 +})
143 +</script>
144 +
145 +<style lang="scss" scoped>
146 +@import "../assets/scss/_variables";
147 +@import "../assets/scss/_mixins";
148 +
149 +.toolbar {
150 + width: 100%;
151 + height: 100%;
152 + padding: 0 20px;
153 + box-sizing: border-box;
154 +
155 + .username {
156 + margin-left: 20px;
157 + font-weight: bold;
158 + @include text-bordered-shadow();
159 +
160 + a {
161 + color: $text-color-primary;
162 + text-decoration: none;
163 +
164 + &:hover {
165 + color: $text-color-accent;
166 + }
167 + }
168 + }
169 +
170 + .avatar {
171 + border-radius: 50%;
172 + width: 35px;
173 + height: 35px;
174 + border: 1px solid #fff;
175 + margin-left: 20px;
176 + box-sizing: border-box;
177 + display: block;
178 + cursor: pointer;
179 + box-shadow:
180 + 0 2px 5px 0 rgba(49, 49, 93, 0.1),
181 + 0 1px 2px 0 rgba(0, 0, 0, 0.08);
182 + transition: box-shadow 0.5s;
183 +
184 + &:hover {
185 + box-shadow:
186 + 0px 3px 10px 0 rgba(49, 49, 93, 0.08),
187 + 0px 2px 7px 0 rgba(0, 0, 0, 0.08);
188 + }
189 + }
190 +
191 + .notification-icon {
192 + font-size: 20px;
193 + outline: none;
194 + padding: 0;
195 + background: transparent;
196 + border: none;
197 + margin-left: 20px;
198 + //color: #aab7c5;
199 + color: transparentize($text-color-primary, 0.7);
200 + @include text-bordered-shadow();
201 +
202 + &:hover {
203 + color: $text-color-accent;
204 + }
205 + }
206 +
207 + :deep() {
208 + .notification-icon-badge {
209 + sup {
210 + top: 4px;
211 + }
212 + }
213 + }
214 +
215 + .toggle-sidebar {
216 + border: 1px solid transparent;
217 + height: 32px;
218 + min-height: 32px;
219 + line-height: 32px;
220 + width: 32px;
221 + min-width: 32px;
222 + max-width: 32px;
223 + box-sizing: border-box;
224 + text-align: center;
225 + margin: 0;
226 + outline: none;
227 + margin-right: 5px;
228 + font-size: 24px;
229 + padding: 0;
230 + cursor: pointer;
231 + display: inline-block;
232 + color: $text-color-primary;
233 + background: white;
234 + display: none;
235 + opacity: 0;
236 + transition: all 0.5s;
237 +
238 + &__right {
239 + margin-right: 0px;
240 + margin-left: 5px;
241 + }
242 +
243 + &:hover,
244 + &:focus,
245 + &:active {
246 + color: $text-color-accent;
247 + border-color: $text-color-accent;
248 + }
249 + }
250 +
251 + .fullscreen-button {
252 + font-size: 24px;
253 + cursor: pointer;
254 + outline: none;
255 + padding: 0;
256 + background: transparent;
257 + border: none;
258 + margin-left: 20px;
259 + //color: #aab7c5;
260 + color: transparentize($text-color-primary, 0.7);
261 + @include text-bordered-shadow();
262 +
263 + &:hover {
264 + color: $text-color-accent;
265 + }
266 + }
267 +
268 + .logo-mini {
269 + width: 32px;
270 + height: 32px;
271 + display: none;
272 + }
273 +
274 + .el-dropdown {
275 + .flag-icon {
276 + box-shadow:
277 + 0 2px 5px 0 rgba(49, 49, 93, 0.1),
278 + 0 1px 2px 0 rgba(0, 0, 0, 0.08);
279 + cursor: pointer;
280 + border: 1px solid lighten($background-color, 20%);
281 + background-color: lighten($background-color, 20%);
282 + }
283 + }
284 +}
285 +
286 +@media (max-width: 650px) {
287 + .toolbar {
288 + .username {
289 + display: none;
290 + }
291 + }
292 +}
293 +
294 +@media (max-width: 768px) {
295 + .toolbar {
296 + padding: 0 10px;
297 +
298 + .toggle-sidebar {
299 + display: block;
300 + opacity: 1;
301 + }
302 +
303 + .fullscreen-button {
304 + display: none;
305 + }
306 +
307 + .logo-mini {
308 + display: inherit;
309 + }
310 + }
311 +}
312 +</style>
src/core/vertical-nav.vue new
+166
@@ -0,0 +1,166 @@
1 +<template>
2 + <div class="vertical-nav" :class="{ 'nav-collapsed': collapseNav, open: openSidebar }">
3 + <div class="sidebar-mask" :class="{ open: openSidebar }" @click="closeNav"></div>
4 +
5 + <div class="sidebar flex column" :class="{ open: openSidebar, ['pos-' + position]: true }">
6 + <Logo :collapse-nav="collapseNav" @collapse-nav-toggle="collapseNavToggle" />
7 +
8 + <div class="box-nav box grow">
9 + <el-scrollbar class="scroll-nav">
10 + <div>
11 + <Nav :is-collapse="collapseNav" @push-page="pushPage" @collapse-nav-toggle="collapseNavToggle" />
12 + <br />
13 + </div>
14 + </el-scrollbar>
15 + </div>
16 + </div>
17 + </div>
18 +</template>
19 +
20 +<script lang="ts">
21 +import { defineComponent } from "@vue/runtime-core"
22 +import Nav from "./nav.vue"
23 +import Logo from "./logo.vue"
24 +
25 +export default defineComponent({
26 + name: "VerticalNav",
27 + props: ["collapseNav", "openSidebar", "position"],
28 + emits: ["update:openSidebar", "collapse-nav-toggle", "push-page"],
29 + data() {
30 + return {}
31 + },
32 + methods: {
33 + collapseNavToggle() {
34 + this.$emit("collapse-nav-toggle")
35 + },
36 + pushPage(index: string) {
37 + this.$emit("push-page", { page: index })
38 + },
39 + closeNav() {
40 + this.$emit("update:openSidebar", false)
41 + }
42 + },
43 + components: {
44 + Nav,
45 + Logo
46 + }
47 +})
48 +</script>
49 +
50 +<style lang="scss">
51 +@import "../assets/scss/_variables";
52 +@import "../assets/scss/_mixins";
53 +
54 +.vertical-nav {
55 + //width: 230px;
56 + height: 100vh;
57 + padding: 10px 20px;
58 + box-sizing: border-box;
59 + transition: width 0.5s;
60 +
61 + .sidebar-mask {
62 + visibility: hidden;
63 + opacity: 0;
64 + transition: all 0.5s;
65 + }
66 +
67 + .sidebar {
68 + width: 230px;
69 + height: 100%;
70 + transition: width 0.5s;
71 +
72 + .box-nav {
73 + overflow: hidden;
74 + padding-top: 15px;
75 + //padding-left: 5px;
76 +
77 + .scroll-nav {
78 + height: 100%;
79 + }
80 + }
81 +
82 + &:not(.pos-right) {
83 + .box-nav {
84 + .scroll-nav {
85 + &.vb {
86 + & > .vb-content {
87 + margin-left: 4px;
88 + }
89 + & > .vb-dragger {
90 + //left: 3px;
91 + right: inherit;
92 + }
93 + }
94 + .ps__scrollbar-y-rail {
95 + left: 0px;
96 + right: inherit;
97 + }
98 + }
99 + }
100 + }
101 + }
102 +
103 + &.nav-collapsed {
104 + .sidebar {
105 + width: 74px;
106 + }
107 + }
108 +}
109 +
110 +@media (max-width: 768px) {
111 + .vertical-nav {
112 + width: 100%;
113 + position: fixed;
114 + top: 0;
115 + left: 0;
116 + right: 0;
117 + bottom: 0;
118 + z-index: 9999;
119 + visibility: hidden;
120 +
121 + &.open {
122 + visibility: visible;
123 + }
124 +
125 + .sidebar {
126 + position: fixed;
127 + top: 0;
128 + left: 0;
129 + z-index: 9999;
130 + background: $background-color;
131 + box-shadow:
132 + -10px 0px 10px 10px rgba(0, 0, 0, 0.2),
133 + -10px 0px 20px 20px rgba(0, 0, 0, 0.2);
134 + transform: translateX(-100%);
135 + opacity: 0;
136 + transition: all 0.5s;
137 +
138 + &.pos-right {
139 + left: initial;
140 + right: 0;
141 + box-shadow:
142 + 10px 0px 10px 10px rgba(0, 0, 0, 0.2),
143 + 10px 0px 20px 20px rgba(0, 0, 0, 0.2);
144 + transform: translateX(100%);
145 + }
146 +
147 + &.open {
148 + opacity: 1;
149 + transform: translateX(0%);
150 + }
151 + }
152 +
153 + .sidebar-mask.open {
154 + position: fixed;
155 + top: 0;
156 + left: 0;
157 + background: rgba(0, 0, 0, 0.4);
158 + z-index: 999;
159 + right: 0;
160 + bottom: 0;
161 + opacity: 1;
162 + visibility: visible;
163 + }
164 + }
165 +}
166 +</style>
src/empty.d.ts new
+1
@@ -0,0 +1 @@
1 +export {}
src/env.d.ts new
+8
@@ -0,0 +1,8 @@
1 +/// <reference types="vite/client" />
2 +
3 +declare module "*.vue" {
4 + import type { DefineComponent } from "vue"
5 + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
6 + const component: DefineComponent<{}, {}, any>
7 + export default component
8 +}
src/i18n.json new
+100
@@ -0,0 +1,100 @@
1 +{
2 + "us": {
3 + "message": {
4 + "hello": "hello world"
5 + },
6 + "languages": {
7 + "English": "English",
8 + "Italian": "Italian",
9 + "French": "French",
10 + "German": "German",
11 + "Spanish": "Spanish",
12 + "Chinese": "Chinese",
13 + "Japanese": "Japanese"
14 + }
15 + },
16 + "it": {
17 + "message": {
18 + "hello": "ciao mondo"
19 + },
20 + "languages": {
21 + "English": "Inglese",
22 + "Italian": "Italiano",
23 + "French": "Francese",
24 + "German": "Tedesco",
25 + "Spanish": "Spagnolo",
26 + "Chinese": "Cinese",
27 + "Japanese": "Giapponese"
28 + }
29 + },
30 + "fr": {
31 + "message": {
32 + "hello": "bonjour le monde"
33 + },
34 + "languages": {
35 + "English": "Anglais",
36 + "Italian": "Italien",
37 + "French": "Français",
38 + "German": "Allemand",
39 + "Spanish": "Espagnol",
40 + "Chinese": "Chinois",
41 + "Japanese": "Japonais"
42 + }
43 + },
44 + "de": {
45 + "message": {
46 + "hello": "hallo welt"
47 + },
48 + "languages": {
49 + "English": "Englisch",
50 + "Italian": "Italienisch",
51 + "French": "Französisch",
52 + "German": "Deutsch",
53 + "Spanish": "Spanisch",
54 + "Chinese": "Chinesisch",
55 + "Japanese": "Japanisch"
56 + }
57 + },
58 + "es": {
59 + "message": {
60 + "hello": "hola mundo"
61 + },
62 + "languages": {
63 + "English": "Inglés",
64 + "Italian": "Italiano",
65 + "French": "Francés",
66 + "German": "Alemán",
67 + "Spanish": "Español",
68 + "Chinese": "Chino",
69 + "Japanese": "Japonés"
70 + }
71 + },
72 + "cn": {
73 + "message": {
74 + "hello": "你好,世界"
75 + },
76 + "languages": {
77 + "English": "英语",
78 + "Italian": "意大利语",
79 + "French": "法语",
80 + "German": "德国的语言",
81 + "Spanish": "西班牙语",
82 + "Chinese": "中文",
83 + "Japanese": "日语"
84 + }
85 + },
86 + "jp": {
87 + "message": {
88 + "hello": "こんにちは、世界"
89 + },
90 + "languages": {
91 + "English": "英語",
92 + "Italian": "イタリア語",
93 + "French": "フランス語",
94 + "German": "ドイツ語",
95 + "Spanish": "スペイン語",
96 + "Chinese": "中国語",
97 + "Japanese": "日本語"
98 + }
99 + }
100 +}
src/layout.ts new
+37
@@ -0,0 +1,37 @@
1 +import { EFooter, ENavPos, EToolbar } from "@/types"
2 +
3 +export default {
4 + contenOnly: {
5 + navPos: false,
6 + toolbar: false,
7 + footer: false
8 + },
9 + navLeft: {
10 + navPos: ENavPos.left,
11 + toolbar: EToolbar.bottom,
12 + boxed: false,
13 + roundedCorners: false,
14 + footer: EFooter.below
15 + },
16 + navRight: {
17 + navPos: ENavPos.right,
18 + toolbar: EToolbar.bottom,
19 + boxed: false,
20 + roundedCorners: false,
21 + footer: EFooter.below
22 + },
23 + navTop: {
24 + navPos: ENavPos.top,
25 + toolbar: EToolbar.bottom,
26 + boxed: false,
27 + roundedCorners: false,
28 + footer: EFooter.below
29 + },
30 + navBottom: {
31 + navPos: ENavPos.bottom,
32 + toolbar: EToolbar.bottom,
33 + boxed: false,
34 + roundedCorners: false,
35 + footer: EFooter.below
36 + }
37 +}
src/main.ts new
+66
@@ -0,0 +1,66 @@
1 +/* ═ ═ ═ ═ ═ ═ ═ ═ ═ *\
2 +| CORE LIBS |
3 +\* ═ ═ ═ ═ ═ ═ ═ ═ ═ */
4 +import { createApp } from "vue"
5 +import { createPinia } from "pinia"
6 +import { createPersistedState } from "pinia-plugin-persistedstate"
7 +import ElementPlus from "element-plus"
8 +import enEn from "element-plus/es/locale/lang/en"
9 +// import * as ElementPlusIconsVue from "@element-plus/icons-vue"
10 +
11 +/* ═ ═ ═ ═ ═ ═ ═ ═ ═ *\
12 +| THIRD PARTS LIBS |
13 +\* ═ ═ ═ ═ ═ ═ ═ ═ ═ */
14 +import "balloon-css/balloon.min.css"
15 +import "../node_modules/@mdi/font/css/materialdesignicons.min.css"
16 +import "viewerjs/dist/viewer.css"
17 +import VueViewer from "v-viewer"
18 +// @ts-ignore: Unreachable code error
19 +import vClickOutside from "v-click-outside"
20 +import VueHighlightJS from "vue3-highlightjs"
21 +import "highlight.js/styles/solarized-light.css"
22 +import mavonEditor from "mavon-editor"
23 +import VueChartkick from "vue-chartkick"
24 +import "chartkick/chart.js"
25 +import { createI18n } from "vue-i18n"
26 +import i18n_messages from "./i18n.json"
27 +
28 +/* ═ ═ ═ ═ ═ ═ ═ ═ ═ *\
29 +| CORE ASSETS |
30 +\* ═ ═ ═ ═ ═ ═ ═ ═ ═ */
31 +import "./assets/scss/global.scss"
32 +import "flex.box/src/flexbox.css"
33 +import "animate.css"
34 +import App from "@/App.vue"
35 +import router from "./router"
36 +
37 +const i18n = createI18n({
38 + locale: "us",
39 + messages: i18n_messages
40 +})
41 +const pinia = createPinia()
42 +pinia.use(createPersistedState())
43 +const app = createApp(App)
44 +
45 +/* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ *\
46 +| THIRD PARTS COMPONENTS |
47 +\* ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ */
48 +app.use(i18n)
49 +app.use(pinia)
50 +app.use(router)
51 +app.use(VueChartkick)
52 +app.use(VueViewer)
53 +app.use(vClickOutside)
54 +app.use(mavonEditor)
55 +app.use(VueHighlightJS)
56 +app.use(ElementPlus, {
57 + locale: enEn
58 +})
59 +
60 +/*
61 +for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
62 + app.component(key, component)
63 +}
64 +*/
65 +
66 +app.mount("#app")
src/router/charts.ts new
+67
@@ -0,0 +1,67 @@
1 +import Charts from "../views/ui/Charts/Charts.vue"
2 +import VueChartist from "../views/ui/Charts/VueChartist.vue"
3 +import VueChartkick from "../views/ui/Charts/VueChartkick.vue"
4 +import Peity from "../views/ui/Charts/Peity.vue"
5 +import Echarts from "../views/ui/Charts/Echarts.vue"
6 +
7 +import layouts from "../layout"
8 +
9 +export default {
10 + path: "/charts",
11 + name: "charts",
12 + component: Charts,
13 + meta: {
14 + auth: true,
15 + layout: layouts.navLeft
16 + },
17 + children: [
18 + {
19 + path: "vuechartist",
20 + name: "vuechartist",
21 + component: VueChartist,
22 + meta: {
23 + auth: true,
24 + layout: layouts.navLeft,
25 + searchable: true,
26 + title: "Vue Chartist",
27 + tags: ["ui"]
28 + }
29 + },
30 + {
31 + path: "vuechartkick",
32 + name: "vuechartkick",
33 + component: VueChartkick,
34 + meta: {
35 + auth: true,
36 + layout: layouts.navLeft,
37 + searchable: true,
38 + title: "Vue Chartkick",
39 + tags: ["ui"]
40 + }
41 + },
42 + {
43 + path: "peity",
44 + name: "peity",
45 + component: Peity,
46 + meta: {
47 + auth: true,
48 + layout: layouts.navLeft,
49 + searchable: true,
50 + title: "Peity",
51 + tags: ["ui"]
52 + }
53 + },
54 + {
55 + path: "echarts",
56 + name: "echarts",
57 + component: Echarts,
58 + meta: {
59 + auth: true,
60 + layout: layouts.navLeft,
61 + searchable: true,
62 + title: "Echarts",
63 + tags: ["ui"]
64 + }
65 + }
66 + ]
67 +}
src/router/ecommerce.ts new
+126
@@ -0,0 +1,126 @@
1 +import Account from "../views/apps/ecommerce/Account.vue"
2 +import Cart from "../views/apps/ecommerce/Cart.vue"
3 +import Checkout from "../views/apps/ecommerce/Checkout.vue"
4 +import Dashboard from "../views/apps/ecommerce/Dashboard.vue"
5 +import Ecommerce from "../views/apps/ecommerce/Ecommerce.vue"
6 +import NewProduct from "../views/apps/ecommerce/NewProduct.vue"
7 +import ProductDetail from "../views/apps/ecommerce/ProductDetail.vue"
8 +import Products from "../views/apps/ecommerce/Products.vue"
9 +import Shop from "../views/apps/ecommerce/Shop.vue"
10 +
11 +import layouts from "../layout"
12 +
13 +export default {
14 + path: "/ecommerce",
15 + name: "ecommerce",
16 + component: Ecommerce,
17 + meta: {
18 + auth: true,
19 + layout: layouts.navLeft
20 + },
21 + children: [
22 + {
23 + path: "account",
24 + name: "ecommerce-account",
25 + component: Account,
26 + meta: {
27 + auth: true,
28 + layout: layouts.navLeft,
29 + //layout: layouts.navTop,
30 + searchable: true,
31 + title: "eCommerce Account",
32 + tags: ["ecommerce", "shop", "products"]
33 + }
34 + },
35 + {
36 + path: "cart",
37 + name: "ecommerce-cart",
38 + component: Cart,
39 + meta: {
40 + auth: true,
41 + layout: layouts.navLeft,
42 + //layout: layouts.navTop,
43 + searchable: true,
44 + title: "eCommerce Cart",
45 + tags: ["ecommerce", "shop", "products"]
46 + }
47 + },
48 + {
49 + path: "checkout",
50 + name: "ecommerce-checkout",
51 + component: Checkout,
52 + meta: {
53 + auth: true,
54 + layout: layouts.navLeft,
55 + //layout: layouts.navTop,
56 + searchable: true,
57 + title: "eCommerce Checkout",
58 + tags: ["ecommerce", "shop", "products"]
59 + }
60 + },
61 + {
62 + alias: "/ecommerce",
63 + path: "dashboard",
64 + name: "ecommerce-dashboard",
65 + component: Dashboard,
66 + meta: {
67 + auth: true,
68 + layout: layouts.navLeft,
69 + searchable: true,
70 + title: "eCommerce Dashboard",
71 + tags: ["ecommerce", "shop", "products"]
72 + }
73 + },
74 + {
75 + path: "new-product",
76 + name: "ecommerce-new-product",
77 + component: NewProduct,
78 + meta: {
79 + auth: true,
80 + layout: layouts.navLeft,
81 + searchable: true,
82 + title: "eCommerce New Product",
83 + tags: ["ecommerce", "shop", "products"]
84 + }
85 + },
86 + {
87 + path: "product-detail",
88 + name: "ecommerce-product-detail",
89 + component: ProductDetail,
90 + meta: {
91 + auth: true,
92 + layout: layouts.navLeft,
93 + //layout: layouts.navTop,
94 + searchable: true,
95 + title: "eCommerce Product Detail",
96 + tags: ["ecommerce", "shop", "products"]
97 + }
98 + },
99 + {
100 + path: "products",
101 + name: "ecommerce-products",
102 + component: Products,
103 + meta: {
104 + auth: true,
105 + layout: layouts.navLeft,
106 + //layout: layouts.navTop,
107 + searchable: true,
108 + title: "eCommerce Products",
109 + tags: ["ecommerce", "shop", "products"]
110 + }
111 + },
112 + {
113 + path: "shop",
114 + name: "ecommerce-shop",
115 + component: Shop,
116 + meta: {
117 + auth: true,
118 + layout: layouts.navLeft,
119 + //layout: layouts.navTop,
120 + searchable: true,
121 + title: "eCommerce Shop",
122 + tags: ["ecommerce", "shop", "products"]
123 + }
124 + }
125 + ]
126 +}
src/router/editors.ts new
+54
@@ -0,0 +1,54 @@
1 +import Editors from "../views/ui/Editors/Editors.vue"
2 +import Quill from "../views/ui/Editors/Quill.vue"
3 +import Pell from "../views/ui/Editors/Pell.vue"
4 +import Markdown from "../views/ui/Editors/Markdown.vue"
5 +
6 +import layouts from "../layout"
7 +
8 +export default {
9 + path: "/editors",
10 + name: "editors",
11 + component: Editors,
12 + meta: {
13 + auth: true,
14 + layout: layouts.navLeft
15 + },
16 + children: [
17 + {
18 + path: "quill",
19 + name: "quill",
20 + component: Quill,
21 + meta: {
22 + auth: true,
23 + layout: layouts.navLeft,
24 + searchable: true,
25 + title: "Quill",
26 + tags: ["editor"]
27 + }
28 + },
29 + {
30 + path: "pell",
31 + name: "pell",
32 + component: Pell,
33 + meta: {
34 + auth: true,
35 + layout: layouts.navLeft,
36 + searchable: true,
37 + title: "Pell",
38 + tags: ["editor"]
39 + }
40 + },
41 + {
42 + path: "markdown",
43 + name: "markdown",
44 + component: Markdown,
45 + meta: {
46 + auth: true,
47 + layout: layouts.navLeft,
48 + searchable: true,
49 + title: "Markdown",
50 + tags: ["editor"]
51 + }
52 + }
53 + ]
54 +}
src/router/element.ts new
+522
@@ -0,0 +1,522 @@
1 +import Element from "../views/ui/Element/Element.vue"
2 +import ElementButton from "../views/ui/Element/ElementButton.vue"
3 +import ElementRadio from "../views/ui/Element/ElementRadio.vue"
4 +import ElementCheckbox from "../views/ui/Element/ElementCheckbox.vue"
5 +import ElementInput from "../views/ui/Element/ElementInput.vue"
6 +import ElementInputNumber from "../views/ui/Element/ElementInputNumber.vue"
7 +import ElementSelect from "../views/ui/Element/ElementSelect.vue"
8 +import ElementCascader from "../views/ui/Element/ElementCascader.vue"
9 +import ElementSwitch from "../views/ui/Element/ElementSwitch.vue"
10 +import ElementSlider from "../views/ui/Element/ElementSlider.vue"
11 +import ElementTimePicker from "../views/ui/Element/ElementTimePicker.vue"
12 +import ElementDatePicker from "../views/ui/Element/ElementDatePicker.vue"
13 +import ElementDateTimePicker from "../views/ui/Element/ElementDateTimePicker.vue"
14 +import ElementUpload from "../views/ui/Element/ElementUpload.vue"
15 +import ElementRate from "../views/ui/Element/ElementRate.vue"
16 +import ElementColorPicker from "../views/ui/Element/ElementColorPicker.vue"
17 +import ElementTransfer from "../views/ui/Element/ElementTransfer.vue"
18 +import ElementForm from "../views/ui/Element/ElementForm.vue"
19 +import ElementTag from "../views/ui/Element/ElementTag.vue"
20 +import ElementProgress from "../views/ui/Element/ElementProgress.vue"
21 +import ElementTree from "../views/ui/Element/ElementTree.vue"
22 +import ElementPagination from "../views/ui/Element/ElementPagination.vue"
23 +import ElementBadge from "../views/ui/Element/ElementBadge.vue"
24 +import ElementAlert from "../views/ui/Element/ElementAlert.vue"
25 +import ElementLoading from "../views/ui/Element/ElementLoading.vue"
26 +import ElementMessage from "../views/ui/Element/ElementMessage.vue"
27 +import ElementMessageBox from "../views/ui/Element/ElementMessageBox.vue"
28 +import ElementNotification from "../views/ui/Element/ElementNotification.vue"
29 +import ElementNavMenu from "../views/ui/Element/ElementNavMenu.vue"
30 +import ElementTabs from "../views/ui/Element/ElementTabs.vue"
31 +import ElementBreadcrumb from "../views/ui/Element/ElementBreadcrumb.vue"
32 +import ElementDropdown from "../views/ui/Element/ElementDropdown.vue"
33 +import ElementSteps from "../views/ui/Element/ElementSteps.vue"
34 +import ElementDialog from "../views/ui/Element/ElementDialog.vue"
35 +import ElementTooltip from "../views/ui/Element/ElementTooltip.vue"
36 +import ElementPopover from "../views/ui/Element/ElementPopover.vue"
37 +import ElementCard from "../views/ui/Element/ElementCard.vue"
38 +import ElementCarousel from "../views/ui/Element/ElementCarousel.vue"
39 +import ElementCollapse from "../views/ui/Element/ElementCollapse.vue"
40 +import ElementTimeline from "../views/ui/Element/ElementTimeline.vue"
41 +
42 +import layouts from "../layout"
43 +
44 +export default {
45 + path: "/element",
46 + name: "element",
47 + component: Element,
48 + meta: {
49 + auth: true,
50 + layout: layouts.navLeft
51 + },
52 + children: [
53 + {
54 + path: "button",
55 + name: "button",
56 + component: ElementButton,
57 + meta: {
58 + auth: true,
59 + layout: layouts.navLeft,
60 + searchable: true,
61 + title: "Element Button",
62 + tags: ["ui"]
63 + }
64 + },
65 + {
66 + path: "radio",
67 + name: "radio",
68 + component: ElementRadio,
69 + meta: {
70 + auth: true,
71 + layout: layouts.navLeft,
72 + searchable: true,
73 + title: "Element Radio",
74 + tags: ["ui"]
75 + }
76 + },
77 + {
78 + path: "checkbox",
79 + name: "checkbox",
80 + component: ElementCheckbox,
81 + meta: {
82 + auth: true,
83 + layout: layouts.navLeft,
84 + searchable: true,
85 + title: "Element Checkbox",
86 + tags: ["ui"]
87 + }
88 + },
89 + {
90 + path: "input",
91 + name: "input",
92 + component: ElementInput,
93 + meta: {
94 + auth: true,
95 + layout: layouts.navLeft,
96 + searchable: true,
97 + title: "Element Input",
98 + tags: ["ui"]
99 + }
100 + },
101 + {
102 + path: "input-number",
103 + name: "input-number",
104 + component: ElementInputNumber,
105 + meta: {
106 + auth: true,
107 + layout: layouts.navLeft,
108 + searchable: true,
109 + title: "Element Input Number",
110 + tags: ["ui"]
111 + }
112 + },
113 + {
114 + path: "select",
115 + name: "select",
116 + component: ElementSelect,
117 + meta: {
118 + auth: true,
119 + layout: layouts.navLeft,
120 + searchable: true,
121 + title: "Element Select",
122 + tags: ["ui"]
123 + }
124 + },
125 + {
126 + path: "cascader",
127 + name: "cascader",
128 + component: ElementCascader,
129 + meta: {
130 + auth: true,
131 + layout: layouts.navLeft,
132 + searchable: true,
133 + title: "Element Cascader",
134 + tags: ["ui"]
135 + }
136 + },
137 + {
138 + path: "switch",
139 + name: "switch",
140 + component: ElementSwitch,
141 + meta: {
142 + auth: true,
143 + layout: layouts.navLeft,
144 + searchable: true,
145 + title: "Element Switch",
146 + tags: ["ui"]
147 + }
148 + },
149 + {
150 + path: "slider",
151 + name: "slider",
152 + component: ElementSlider,
153 + meta: {
154 + auth: true,
155 + layout: layouts.navLeft,
156 + searchable: true,
157 + title: "Element Slider",
158 + tags: ["ui"]
159 + }
160 + },
161 + {
162 + path: "time-picker",
163 + name: "time-picker",
164 + component: ElementTimePicker,
165 + meta: {
166 + auth: true,
167 + layout: layouts.navLeft,
168 + searchable: true,
169 + title: "Element Time Picker",
170 + tags: ["ui"]
171 + }
172 + },
173 + {
174 + path: "date-picker",
175 + name: "date-picker",
176 + component: ElementDatePicker,
177 + meta: {
178 + auth: true,
179 + layout: layouts.navLeft,
180 + searchable: true,
181 + title: "Element Date Picker",
182 + tags: ["ui"]
183 + }
184 + },
185 + {
186 + path: "datetime-picker",
187 + name: "datetime-picker",
188 + component: ElementDateTimePicker,
189 + meta: {
190 + auth: true,
191 + layout: layouts.navLeft,
192 + searchable: true,
193 + title: "Element Date Time Picker",
194 + tags: ["ui"]
195 + }
196 + },
197 + {
198 + path: "upload",
199 + name: "upload",
200 + component: ElementUpload,
201 + meta: {
202 + auth: true,
203 + layout: layouts.navLeft,
204 + searchable: true,
205 + title: "Element Upload",
206 + tags: ["ui"]
207 + }
208 + },
209 + {
210 + path: "rate",
211 + name: "rate",
212 + component: ElementRate,
213 + meta: {
214 + auth: true,
215 + layout: layouts.navLeft,
216 + searchable: true,
217 + title: "Element Rate",
218 + tags: ["ui"]
219 + }
220 + },
221 + {
222 + path: "color-picker",
223 + name: "color-picker",
224 + component: ElementColorPicker,
225 + meta: {
226 + auth: true,
227 + layout: layouts.navLeft,
228 + searchable: true,
229 + title: "Element Color Picker",
230 + tags: ["ui"]
231 + }
232 + },
233 + {
234 + path: "transfer",
235 + name: "transfer",
236 + component: ElementTransfer,
237 + meta: {
238 + auth: true,
239 + layout: layouts.navLeft,
240 + searchable: true,
241 + title: "Element Transfer",
242 + tags: ["ui"]
243 + }
244 + },
245 + {
246 + path: "form",
247 + name: "form",
248 + component: ElementForm,
249 + meta: {
250 + auth: true,
251 + layout: layouts.navLeft,
252 + searchable: true,
253 + title: "Element Form",
254 + tags: ["ui"]
255 + }
256 + },
257 + {
258 + path: "tag",
259 + name: "tag",
260 + component: ElementTag,
261 + meta: {
262 + auth: true,
263 + layout: layouts.navLeft,
264 + searchable: true,
265 + title: "Element Tag",
266 + tags: ["ui"]
267 + }
268 + },
269 + {
270 + path: "progress",
271 + name: "progress",
272 + component: ElementProgress,
273 + meta: {
274 + auth: true,
275 + layout: layouts.navLeft,
276 + searchable: true,
277 + title: "Element Progress",
278 + tags: ["ui"]
279 + }
280 + },
281 + {
282 + path: "tree",
283 + name: "tree",
284 + component: ElementTree,
285 + meta: {
286 + auth: true,
287 + layout: layouts.navLeft,
288 + searchable: true,
289 + title: "Element Tree",
290 + tags: ["ui"]
291 + }
292 + },
293 + {
294 + path: "pagination",
295 + name: "pagination",
296 + component: ElementPagination,
297 + meta: {
298 + auth: true,
299 + layout: layouts.navLeft,
300 + searchable: true,
301 + title: "Element Pagination",
302 + tags: ["ui"]
303 + }
304 + },
305 + {
306 + path: "badge",
307 + name: "badge",
308 + component: ElementBadge,
309 + meta: {
310 + auth: true,
311 + layout: layouts.navLeft,
312 + searchable: true,
313 + title: "Element Badge",
314 + tags: ["ui"]
315 + }
316 + },
317 + {
318 + path: "alert",
319 + name: "alert",
320 + component: ElementAlert,
321 + meta: {
322 + auth: true,
323 + layout: layouts.navLeft,
324 + searchable: true,
325 + title: "Element Alert",
326 + tags: ["ui"]
327 + }
328 + },
329 + {
330 + path: "loading",
331 + name: "loading",
332 + component: ElementLoading,
333 + meta: {
334 + auth: true,
335 + layout: layouts.navLeft,
336 + searchable: true,
337 + title: "Element Loading",
338 + tags: ["ui"]
339 + }
340 + },
341 + {
342 + path: "message",
343 + name: "message",
344 + component: ElementMessage,
345 + meta: {
346 + auth: true,
347 + layout: layouts.navLeft,
348 + searchable: true,
349 + title: "Element Message",
350 + tags: ["ui"]
351 + }
352 + },
353 + {
354 + path: "message-box",
355 + name: "message-box",
356 + component: ElementMessageBox,
357 + meta: {
358 + auth: true,
359 + layout: layouts.navLeft,
360 + searchable: true,
361 + title: "Element Message Box",
362 + tags: ["ui"]
363 + }
364 + },
365 + {
366 + path: "notification",
367 + name: "notification",
368 + component: ElementNotification,
369 + meta: {
370 + auth: true,
371 + layout: layouts.navLeft,
372 + searchable: true,
373 + title: "Element Notification",
374 + tags: ["ui"]
375 + }
376 + },
377 + {
378 + path: "menu",
379 + name: "menu",
380 + component: ElementNavMenu,
381 + meta: {
382 + auth: true,
383 + layout: layouts.navLeft,
384 + searchable: true,
385 + title: "Element NavMenu",
386 + tags: ["ui"]
387 + }
388 + },
389 + {
390 + path: "tabs",
391 + name: "tabs",
392 + component: ElementTabs,
393 + meta: {
394 + auth: true,
395 + layout: layouts.navLeft,
396 + searchable: true,
397 + title: "Element Tabs",
398 + tags: ["ui"]
399 + }
400 + },
401 + {
402 + path: "breadcrumb",
403 + name: "breadcrumb",
404 + component: ElementBreadcrumb,
405 + meta: {
406 + auth: true,
407 + layout: layouts.navLeft,
408 + searchable: true,
409 + title: "Element Breadcrumb",
410 + tags: ["ui"]
411 + }
412 + },
413 + {
414 + path: "dropdown",
415 + name: "dropdown",
416 + component: ElementDropdown,
417 + meta: {
418 + auth: true,
419 + layout: layouts.navLeft,
420 + searchable: true,
421 + title: "Element Dropdown",
422 + tags: ["ui"]
423 + }
424 + },
425 + {
426 + path: "steps",
427 + name: "steps",
428 + component: ElementSteps,
429 + meta: {
430 + auth: true,
431 + layout: layouts.navLeft,
432 + searchable: true,
433 + title: "Element Steps",
434 + tags: ["ui"]
435 + }
436 + },
437 + {
438 + path: "dialog",
439 + name: "dialog",
440 + component: ElementDialog,
441 + meta: {
442 + auth: true,
443 + layout: layouts.navLeft,
444 + searchable: true,
445 + title: "Element Dialog",
446 + tags: ["ui"]
447 + }
448 + },
449 + {
450 + path: "tooltip",
451 + name: "tooltip",
452 + component: ElementTooltip,
453 + meta: {
454 + auth: true,
455 + layout: layouts.navLeft,
456 + searchable: true,
457 + title: "Element Tooltip",
458 + tags: ["ui"]
459 + }
460 + },
461 + {
462 + path: "popover",
463 + name: "popover",
464 + component: ElementPopover,
465 + meta: {
466 + auth: true,
467 + layout: layouts.navLeft,
468 + searchable: true,
469 + title: "Element Popover",
470 + tags: ["ui"]
471 + }
472 + },
473 + {
474 + path: "card",
475 + name: "card",
476 + component: ElementCard,
477 + meta: {
478 + auth: true,
479 + layout: layouts.navLeft,
480 + searchable: true,
481 + title: "Element Card",
482 + tags: ["ui"]
483 + }
484 + },
485 + {
486 + path: "carousel",
487 + name: "carousel",
488 + component: ElementCarousel,
489 + meta: {
490 + auth: true,
491 + layout: layouts.navLeft,
492 + searchable: true,
493 + title: "Element Carousel",
494 + tags: ["ui"]
495 + }
496 + },
497 + {
498 + path: "collapse",
499 + name: "collapse",
500 + component: ElementCollapse,
501 + meta: {
502 + auth: true,
503 + layout: layouts.navLeft,
504 + searchable: true,
505 + title: "Element Collapse",
506 + tags: ["ui"]
507 + }
508 + },
509 + {
510 + path: "timeline",
511 + name: "timeline",
512 + component: ElementTimeline,
513 + meta: {
514 + auth: true,
515 + layout: layouts.navLeft,
516 + searchable: true,
517 + title: "Element Timeline",
518 + tags: ["ui"]
519 + }
520 + }
521 + ]
522 +}
src/router/index.ts new
+366
@@ -0,0 +1,366 @@
1 +import { createRouter, createWebHistory } from "vue-router"
2 +
3 +//apps
4 +import Dashboard from "../views/apps/Dashboard.vue"
5 +import CryptoDashboard from "../views/apps/CryptoDashboard.vue"
6 +import EcommerceDashboard from "../views/apps/ecommerce/Dashboard.vue"
7 +import Calendar from "../views/apps/Calendar.vue"
8 +import Contacts from "../views/apps/Contacts.vue"
9 +import Gallery from "../views/apps/Gallery.vue"
10 +import Cards from "../views/apps/Cards.vue"
11 +import Mail from "../views/apps/Mail.vue"
12 +import Ecommerce from "./ecommerce"
13 +/*
14 +
15 +//pages
16 +*/
17 +import Login from "../views/pages/authentication/Login.vue"
18 +import Login2 from "../views/pages/authentication/Login2.vue"
19 +import Register from "../views/pages/authentication/Register.vue"
20 +import ForgotPassword from "../views/pages/authentication/ForgotPassword.vue"
21 +import Profile from "../views/pages/Profile.vue"
22 +import NotFound from "../views/pages/NotFound.vue"
23 +import Invoice from "../views/pages/Invoice.vue"
24 +
25 +//ui
26 +import layout from "./layout"
27 +import Themes from "../views/ui/Themes.vue"
28 +import Icons from "../views/ui/Icons/Icons.vue"
29 +import MdIcons from "../views/ui/Icons/MdIcons.vue"
30 +import FlagIcons from "../views/ui/Icons/FlagIcons.vue"
31 +import MultiLanguage from "../views/ui/MultiLanguage.vue"
32 +import HelperClasses from "../views/ui/HelperClasses.vue"
33 +import Typography from "../views/ui/Typography.vue"
34 +import element from "./element"
35 +import tables from "./tables"
36 +import maps from "./maps"
37 +import editors from "./editors"
38 +import charts from "./charts"
39 +
40 +import layouts from "../layout"
41 +import { useMainStore } from "@/stores/main"
42 +import type { StateLayout } from "@/types"
43 +
44 +const router = createRouter({
45 + history: createWebHistory(import.meta.env.BASE_URL),
46 + routes: [
47 + {
48 + path: "/",
49 + alias: "/dashboard",
50 + name: "dashboard",
51 + component: Dashboard,
52 + meta: {
53 + auth: true,
54 + layout: layouts.navLeft,
55 + searchable: true,
56 + tags: ["app"]
57 + }
58 + },
59 + {
60 + path: "/ecommerce-dashboard",
61 + name: "ecommerce-admin-dashboard",
62 + component: EcommerceDashboard,
63 + meta: {
64 + auth: true,
65 + layout: layouts.navLeft,
66 + searchable: true,
67 + title: "eCommerce admin dashboard",
68 + tags: ["app", "Ecommerce"]
69 + }
70 + },
71 + {
72 + path: "/crypto-dashboard",
73 + alias: "/dashboards",
74 + name: "crypto-dashboard",
75 + component: CryptoDashboard,
76 + meta: {
77 + auth: true,
78 + layout: layouts.navLeft,
79 + searchable: true,
80 + tags: ["app", "Crypto"]
81 + }
82 + },
83 + {
84 + path: "/calendar",
85 + name: "calendar",
86 + component: Calendar,
87 + meta: {
88 + auth: true,
89 + layout: layouts.navLeft,
90 + searchable: true,
91 + tags: ["app"]
92 + }
93 + },
94 + {
95 + path: "/contacts",
96 + name: "contacts",
97 + component: Contacts,
98 + meta: {
99 + auth: true,
100 + layout: layouts.navLeft,
101 + searchable: true,
102 + tags: ["users", "address", "book", "app"]
103 + }
104 + },
105 + {
106 + path: "/gallery",
107 + name: "gallery",
108 + component: Gallery,
109 + meta: {
110 + auth: true,
111 + layout: layouts.navLeft,
112 + searchable: true,
113 + tags: ["photo", "app"]
114 + }
115 + },
116 + {
117 + path: "/cards",
118 + name: "cards",
119 + component: Cards,
120 + meta: {
121 + auth: true,
122 + layout: layouts.navLeft,
123 + searchable: true,
124 + tags: ["app", "todo"]
125 + }
126 + },
127 + {
128 + path: "/mail",
129 + name: "mail",
130 + component: Mail,
131 + meta: {
132 + auth: true,
133 + layout: layouts.navLeft,
134 + searchable: true,
135 + title: "Mail",
136 + tags: ["app", "email", "inbox"]
137 + }
138 + },
139 + Ecommerce,
140 + layout,
141 + {
142 + path: "/themes",
143 + name: "themes",
144 + component: Themes,
145 + meta: {
146 + auth: true,
147 + layout: layouts.navLeft,
148 + searchable: true,
149 + tags: ["ui"]
150 + }
151 + },
152 + {
153 + path: "/icons",
154 + name: "icons",
155 + component: Icons,
156 + meta: {
157 + auth: true,
158 + layout: layouts.navLeft
159 + },
160 + children: [
161 + {
162 + path: "md-icons",
163 + name: "md-icons",
164 + component: MdIcons,
165 + meta: {
166 + auth: true,
167 + layout: layouts.navLeft,
168 + searchable: true,
169 + title: "Material Design Icons",
170 + tags: ["material design"]
171 + }
172 + },
173 + {
174 + path: "flag-icons",
175 + name: "flag-icons",
176 + component: FlagIcons,
177 + meta: {
178 + auth: true,
179 + layout: layouts.navLeft,
180 + searchable: true,
181 + title: "Flag Icons",
182 + tags: ["list", "ui"]
183 + }
184 + }
185 + ]
186 + },
187 + {
188 + path: "/multi-language",
189 + name: "multi-language",
190 + component: MultiLanguage,
191 + meta: {
192 + auth: true,
193 + layout: layouts.navLeft,
194 + searchable: true,
195 + tags: ["ui", "translate"]
196 + }
197 + },
198 + {
199 + path: "/helper-classes",
200 + name: "helper-classes",
201 + component: HelperClasses,
202 + meta: {
203 + auth: true,
204 + layout: layouts.navLeft,
205 + searchable: true,
206 + title: "Helper Classes",
207 + tags: ["ui"]
208 + }
209 + },
210 + {
211 + path: "/typography",
212 + name: "typography",
213 + component: Typography,
214 + meta: {
215 + auth: true,
216 + layout: layouts.navLeft,
217 + searchable: true,
218 + title: "Typography",
219 + tags: ["ui"]
220 + }
221 + },
222 + element,
223 + tables,
224 + maps,
225 + editors,
226 + charts,
227 + {
228 + path: "/profile",
229 + name: "profile",
230 + component: Profile,
231 + meta: {
232 + auth: true,
233 + layout: layouts.navLeft,
234 + searchable: true,
235 + tags: ["pages"]
236 + }
237 + },
238 + {
239 + path: "/invoice",
240 + name: "invoice",
241 + component: Invoice,
242 + meta: {
243 + auth: true,
244 + layout: layouts.navLeft,
245 + searchable: true,
246 + tags: ["pages"]
247 + }
248 + },
249 + {
250 + path: "/login",
251 + name: "login",
252 + component: Login,
253 + meta: {
254 + layout: layouts.contenOnly
255 + }
256 + },
257 + {
258 + path: "/login2",
259 + name: "login2",
260 + component: Login2,
261 + meta: {
262 + layout: layouts.contenOnly
263 + }
264 + },
265 + {
266 + path: "/register",
267 + name: "register",
268 + component: Register,
269 + meta: {
270 + layout: layouts.contenOnly
271 + }
272 + },
273 + {
274 + path: "/forgot-password",
275 + name: "forgot-password",
276 + component: ForgotPassword,
277 + meta: {
278 + layout: layouts.contenOnly
279 + }
280 + },
281 + {
282 + path: "/logout",
283 + redirect: to => {
284 + auth.logout()
285 + return "/login"
286 + }
287 + },
288 + {
289 + path: "/:pathMatch(.*)*",
290 + name: "not-found",
291 + component: NotFound,
292 + meta: {
293 + layout: layouts.contenOnly
294 + }
295 + }
296 + ]
297 +})
298 +
299 +const l = {
300 + contenOnly() {
301 + useMainStore().setLayout(layouts.contenOnly)
302 + },
303 + navLeft() {
304 + useMainStore().setLayout(layouts.navLeft)
305 + },
306 + navRight() {
307 + useMainStore().setLayout(layouts.navRight)
308 + },
309 + navTop() {
310 + useMainStore().setLayout(layouts.navTop)
311 + },
312 + navBottom() {
313 + useMainStore().setLayout(layouts.navBottom)
314 + },
315 + set(layout: Partial<StateLayout>) {
316 + useMainStore().setLayout(layout)
317 + }
318 +}
319 +
320 +//insert here login logic
321 +const auth = {
322 + loggedIn() {
323 + return useMainStore().isLogged
324 + },
325 + logout() {
326 + useMainStore().setLogout()
327 + }
328 +}
329 +
330 +router.beforeEach((to, from) => {
331 + let authrequired = false
332 + if (to && to.meta && to.meta.auth) authrequired = true
333 +
334 + //console.log('authrequired', authrequired, to.name)
335 +
336 + if (authrequired) {
337 + if (auth.loggedIn()) {
338 + if (to.name === "login") {
339 + window.location.href = "/"
340 + return false
341 + }
342 + } else {
343 + if (to.name !== "login") {
344 + window.location.href = "/login"
345 + return false
346 + }
347 + }
348 + } else {
349 + if (auth.loggedIn() && to.name === "login") {
350 + window.location.href = "/"
351 + return false
352 + }
353 + }
354 +
355 + if (to && to.meta && to.meta.layout) {
356 + l.set(to.meta.layout)
357 + }
358 +})
359 +
360 +router.afterEach((to, from) => {
361 + setTimeout(() => {
362 + useMainStore().setSplashScreen(false)
363 + }, 500)
364 +})
365 +
366 +export default router
src/router/layout.ts new
+93
@@ -0,0 +1,93 @@
1 +import Layout from "../views/ui/Layout/Layout.vue"
2 +import LayoutFlexbox from "../views/ui/Layout/LayoutFlexbox.vue"
3 +import LayoutBlank from "../views/ui/Layout/LayoutBlank.vue"
4 +import PageHeaders from "../views/ui/Layout/PageHeaders.vue"
5 +import LayoutSidebarRight from "../views/ui/Layout/LayoutSidebarRight.vue"
6 +import LayoutSidebarLeft from "../views/ui/Layout/LayoutSidebarLeft.vue"
7 +import LayoutTabbed from "../views/ui/Layout/LayoutTabbed.vue"
8 +
9 +import layouts from "../layout"
10 +
11 +export default {
12 + path: "/layout",
13 + name: "layout",
14 + component: Layout,
15 + meta: {
16 + auth: true,
17 + layout: layouts.navLeft
18 + },
19 + children: [
20 + {
21 + path: "flexbox",
22 + name: "flexbox",
23 + component: LayoutFlexbox,
24 + meta: {
25 + auth: true,
26 + layout: layouts.navLeft,
27 + searchable: true,
28 + title: "Layout Flexbox",
29 + tags: ["ui", "flexbox"]
30 + }
31 + },
32 + {
33 + path: "blank",
34 + name: "blank",
35 + component: LayoutBlank,
36 + meta: {
37 + auth: true,
38 + layout: layouts.navLeft,
39 + searchable: true,
40 + title: "Blank page",
41 + tags: ["ui", "layout"]
42 + }
43 + },
44 + {
45 + path: "page-headers",
46 + name: "page-headers",
47 + component: PageHeaders,
48 + meta: {
49 + auth: true,
50 + layout: layouts.navLeft,
51 + searchable: true,
52 + title: "Page headers",
53 + tags: ["ui", "layout"]
54 + }
55 + },
56 + {
57 + path: "sidebar-right",
58 + name: "sidebar-right",
59 + component: LayoutSidebarRight,
60 + meta: {
61 + auth: true,
62 + layout: layouts.navLeft,
63 + searchable: true,
64 + title: "Sidebar right",
65 + tags: ["ui", "layout"]
66 + }
67 + },
68 + {
69 + path: "sidebar-left",
70 + name: "sidebar-left",
71 + component: LayoutSidebarLeft,
72 + meta: {
73 + auth: true,
74 + layout: layouts.navLeft,
75 + searchable: true,
76 + title: "Sidebar left",
77 + tags: ["ui", "layout"]
78 + }
79 + },
80 + {
81 + path: "tabbed",
82 + name: "tabbed",
83 + component: LayoutTabbed,
84 + meta: {
85 + auth: true,
86 + layout: layouts.navLeft,
87 + searchable: true,
88 + title: "Tabbed page",
89 + tags: ["ui", "layout"]
90 + }
91 + }
92 + ]
93 +}
src/router/maps.ts new
+53
@@ -0,0 +1,53 @@
1 +import Maps from "../views/ui/Maps/Maps.vue"
2 +import Leaflet from "../views/ui/Maps/Leaflet.vue"
3 +import Mapbox from "../views/ui/Maps/Mapbox.vue"
4 +
5 +import layouts from "../layout"
6 +
7 +export default {
8 + path: "/maps",
9 + name: "maps",
10 + component: Maps,
11 + meta: {
12 + auth: true,
13 + layout: layouts.navLeft
14 + },
15 + children: [
16 + {
17 + path: "leaflet",
18 + name: "leaflet",
19 + component: Leaflet,
20 + meta: {
21 + auth: true,
22 + layout: layouts.navLeft,
23 + searchable: true,
24 + title: "Leaflet",
25 + tags: ["maps"]
26 + }
27 + },
28 + {
29 + path: "mapbox",
30 + name: "mapbox",
31 + component: Mapbox,
32 + meta: {
33 + auth: true,
34 + layout: layouts.navLeft,
35 + searchable: true,
36 + title: "Mapbox",
37 + tags: ["maps"]
38 + }
39 + }
40 + /*{
41 + path: 'datamaps',
42 + name: 'datamaps',
43 + component: Datamaps,
44 + meta: {
45 + auth: true,
46 + layout: layouts.navLeft,
47 + searchable: true,
48 + title: 'Datamaps',
49 + tags: ['maps']
50 + }
51 + }*/
52 + ]
53 +}
src/router/tables.ts new
+53
@@ -0,0 +1,53 @@
1 +import Tables from "../views/ui/Tables/Tables.vue"
2 +import Table from "../views/ui/Tables/Table.vue"
3 +import StyledTablePage from "../views/ui/Tables/Styled.vue"
4 +import TuiGridPage from "../views/ui/Tables/TuiGrid.vue"
5 +
6 +import layouts from "../layout"
7 +
8 +export default {
9 + path: "/tables",
10 + name: "tables",
11 + component: Tables,
12 + meta: {
13 + auth: true,
14 + layout: layouts.navLeft
15 + },
16 + children: [
17 + {
18 + path: "simple-table",
19 + name: "simple-table",
20 + component: Table,
21 + meta: {
22 + auth: true,
23 + layout: layouts.navLeft,
24 + searchable: true,
25 + tags: ["simple"]
26 + }
27 + },
28 + {
29 + path: "styled-table",
30 + name: "styled-table",
31 + component: StyledTablePage,
32 + meta: {
33 + auth: true,
34 + layout: layouts.navLeft,
35 + searchable: true,
36 + title: "Element Styled Table",
37 + tags: ["advanced"]
38 + }
39 + },
40 + {
41 + path: "tui-grid",
42 + name: "tui-grid",
43 + component: TuiGridPage,
44 + meta: {
45 + auth: true,
46 + layout: layouts.navLeft,
47 + searchable: true,
48 + title: "TUI Grid",
49 + tags: ["advanced"]
50 + }
51 + }
52 + ]
53 +}
src/stores/main.ts new
+73
@@ -0,0 +1,73 @@
1 +import { ENavPos, EToolbar, EViewAnimation, type State, type StateLayout } from "@/types"
2 +import { defineStore, acceptHMRUpdate } from "pinia"
3 +
4 +export const useMainStore = defineStore("main", {
5 + state: (): State => ({
6 + layout: {
7 + navPos: ENavPos.left, //top, bottom, left, right, false
8 + toolbar: EToolbar.top, //top, bottom, false
9 + footer: true, //above, below, false
10 + boxed: false, //true, false
11 + roundedCorners: false, //true, false
12 + viewAnimation: EViewAnimation.fadeTop // fade-left, fade-right, fade-top, fade-top-in-out, fade-bottom, fade-bottom-in-out, fade, false
13 + },
14 + splashScreen: true,
15 + logged: true
16 + }),
17 + actions: {
18 + setLayout(payload: Partial<StateLayout>) {
19 + if (payload && payload.navPos !== undefined) this.layout.navPos = payload.navPos
20 +
21 + if (payload && payload.toolbar !== undefined) this.layout.toolbar = payload.toolbar
22 +
23 + if (payload && payload.footer !== undefined) this.layout.footer = payload.footer
24 +
25 + if (payload && payload.boxed !== undefined) this.layout.boxed = payload.boxed
26 +
27 + if (payload && payload.roundedCorners !== undefined) this.layout.roundedCorners = payload.roundedCorners
28 +
29 + if (payload && payload.viewAnimation !== undefined) this.layout.viewAnimation = payload.viewAnimation
30 + },
31 + setLogin() {
32 + this.logged = true
33 + },
34 + setLogout() {
35 + this.layout.navPos = null
36 + this.layout.toolbar = null
37 + this.logged = false
38 + },
39 + setSplashScreen(payload: boolean) {
40 + this.splashScreen = payload
41 + }
42 + },
43 + getters: {
44 + navPos(state) {
45 + return state.layout?.navPos
46 + },
47 + toolbar(state) {
48 + return state.layout?.toolbar
49 + },
50 + footer(state) {
51 + return state.layout?.footer
52 + },
53 + boxed(state) {
54 + return state.layout?.boxed
55 + },
56 + roundedCorners(state) {
57 + return state.layout?.roundedCorners
58 + },
59 + viewAnimation(state) {
60 + return state.layout?.viewAnimation
61 + },
62 + isLogged(state) {
63 + return state.logged
64 + }
65 + },
66 + persist: {
67 + paths: ["layout"]
68 + }
69 +})
70 +
71 +if (import.meta.hot) {
72 + import.meta.hot.accept(acceptHMRUpdate(useMainStore, import.meta.hot))
73 +}
src/types/index.ts new
+37
@@ -0,0 +1,37 @@
1 +export enum ENavPos {
2 + "top" = "top",
3 + "bottom" = "bottom",
4 + "left" = "left",
5 + "right" = "right"
6 +}
7 +export enum EToolbar {
8 + "top" = "top",
9 + "bottom" = "bottom"
10 +}
11 +export enum EFooter {
12 + "above" = "above",
13 + "below" = "below"
14 +}
15 +export enum EViewAnimation {
16 + "fadeLeft" = "fade-left",
17 + "fadeRight" = "fade-right",
18 + "fadeTop" = "fade-top",
19 + "fadeTopInOut" = "fade-top-in-out",
20 + "fadeBottom" = "fade-bottom",
21 + "fadeBottomInOut" = "fade-bottom-in-out",
22 + "fade" = "fade"
23 +}
24 +
25 +export interface StateLayout {
26 + navPos: ENavPos | boolean | null
27 + toolbar: EToolbar | boolean | null
28 + footer: EFooter | boolean | null
29 + boxed: boolean
30 + roundedCorners: boolean
31 + viewAnimation: EViewAnimation
32 +}
33 +export interface State {
34 + layout: StateLayout
35 + splashScreen: boolean
36 + logged: boolean
37 +}
src/views/apps/Calendar.vue new
+253
@@ -0,0 +1,253 @@
1 +<template>
2 + <el-scrollbar class="page-calendar">
3 + <FullCalendar ref="fullCalendar" :options="calendarOptions" class="calendar-wrap card-base card-shadow--medium" />
4 +
5 + <el-dialog title="Add event" v-model="dialogFormVisible">
6 + <el-form :model="form" ref="form" label-position="top">
7 + <el-col :span="13">
8 + <el-form-item
9 + label="Title"
10 + prop="title"
11 + :rules="[{ required: true, message: 'Please input event title', trigger: 'blur' }]"
12 + >
13 + <el-input v-model.trim="form.title"></el-input>
14 + </el-form-item>
15 + </el-col>
16 + <el-col class="text-center" :span="1">&nbsp;</el-col>
17 + <el-col :span="5">
18 + <el-form-item label="All day">
19 + <el-switch v-model="form.allDay"></el-switch>
20 + </el-form-item>
21 + </el-col>
22 + <el-col :span="5">
23 + <el-form-item label="Color">
24 + <el-color-picker v-model="form.color" :predefine="predefineColors"></el-color-picker>
25 + </el-form-item>
26 + </el-col>
27 + <el-form-item label="Description">
28 + <el-input type="textarea" autosize v-model="form.description"></el-input>
29 + </el-form-item>
30 + <el-form-item
31 + label="Start"
32 + prop="startDate"
33 + :rules="[{ required: true, message: 'Please input a valid date', trigger: 'blur' }]"
34 + >
35 + <el-col :span="11">
36 + <el-date-picker type="date" placeholder="Pick a date" v-model="form.startDate" style="width: 100%"></el-date-picker>
37 + </el-col>
38 + <el-col v-if="!form.allDay" class="text-center" :span="2">-</el-col>
39 + <el-col v-if="!form.allDay" :span="11">
40 + <el-time-picker
41 + type="fixed-time"
42 + placeholder="Pick a time"
43 + v-model="form.startTime"
44 + style="width: 100%"
45 + format="HH:mm"
46 + ></el-time-picker>
47 + </el-col>
48 + </el-form-item>
49 + <el-form-item label="End">
50 + <el-col :span="11">
51 + <el-date-picker type="date" placeholder="Pick a date" v-model="form.endDate" style="width: 100%"></el-date-picker>
52 + </el-col>
53 + <el-col v-if="!form.allDay" class="text-center" :span="2">-</el-col>
54 + <el-col v-if="!form.allDay" :span="11">
55 + <el-time-picker
56 + type="fixed-time"
57 + placeholder="Pick a time"
58 + v-model="form.endTime"
59 + style="width: 100%"
60 + format="HH:mm"
61 + ></el-time-picker>
62 + </el-col>
63 + </el-form-item>
64 + </el-form>
65 + <span slot="footer" class="dialog-footer">
66 + <el-button @click="closeEventDialog">Cancel</el-button>
67 + <el-button type="primary" @click="setEvent">Save</el-button>
68 + </span>
69 + </el-dialog>
70 + </el-scrollbar>
71 +</template>
72 +
73 +<script>
74 +import dayjs from "dayjs"
75 +import "@fullcalendar/core/vdom"
76 +import FullCalendar from "@fullcalendar/vue3"
77 +import dayGridPlugin from "@fullcalendar/daygrid"
78 +import timeGridPlugin from "@fullcalendar/timegrid"
79 +import listPlugin from "@fullcalendar/list"
80 +import interactionPlugin from "@fullcalendar/interaction"
81 +import { defineComponent } from "@vue/runtime-core"
82 +
83 +export default defineComponent({
84 + name: "Calendar",
85 + data() {
86 + const __Y = dayjs().format("YYYY")
87 + const __M = dayjs().format("MM")
88 +
89 + return {
90 + calendarOptions: {
91 + customButtons: {
92 + addEvent: {
93 + text: "✚",
94 + click: this.addEventDialog
95 + }
96 + },
97 + locale: "en",
98 + headerToolbar: {
99 + left: "prev,next today",
100 + center: "title",
101 + right: "dayGridMonth,timeGridWeek,timeGridDay,listWeek addEvent"
102 + },
103 + height: "auto",
104 + firstDay: 1,
105 + allDaySlot: true,
106 + slotEventOverlap: true,
107 + selectable: true,
108 + selectMirror: true,
109 + eventTimeFormat: {
110 + // like '14:30'
111 + hour: "2-digit",
112 + minute: "2-digit",
113 + meridiem: false
114 + },
115 + navLinks: true, // can click day/week names to navigate views
116 + editable: true,
117 + dayMaxEvents: true, // allow "more" link when too many events
118 + plugins: [dayGridPlugin, timeGridPlugin, listPlugin, interactionPlugin],
119 + events: [
120 + { title: "All Day Event", start: __Y + "-" + __M + "-01" },
121 + { title: "Long Event", start: __Y + "-" + __M + "-07", end: __Y + "-" + __M + "-10" },
122 + { id: 999, title: "Repeating Event", start: __Y + "-" + __M + "-09T16:00:00" },
123 + { id: 999, title: "Repeating Event", start: __Y + "-" + __M + "-16T16:00:00" },
124 + { title: "Conference", start: __Y + "-" + __M + "-11", end: __Y + "-" + __M + "-13" },
125 + {
126 + title: "Meeting",
127 + start: __Y + "-" + __M + "-12T10:30:00",
128 + end: __Y + "-" + __M + "-12T12:30:00"
129 + },
130 + { title: "Lunch", start: __Y + "-" + __M + "-12T12:00:00" },
131 + { title: "Meeting", start: __Y + "-" + __M + "-12T14:30:00" },
132 + { title: "Happy Hour", start: __Y + "-" + __M + "-12T17:30:00" },
133 + { title: "Dinner", start: __Y + "-" + __M + "-12T20:00:00" },
134 + { title: "Birthday Party", start: __Y + "-" + __M + "-13T07:00:00" },
135 + { title: "Click for Google", url: "http://google.com/", start: __Y + "-" + __M + "-28" }
136 + ],
137 + dateClick: this.dayClick,
138 + eventClick: this.eventClick,
139 + select: this.select
140 + },
141 + dialogFormVisible: false,
142 + form: {
143 + title: "",
144 + description: "",
145 + allDay: false,
146 + startDate: "",
147 + startTime: "",
148 + endDate: "",
149 + endTime: "",
150 + color: "#4a596a"
151 + },
152 + predefineColors: ["#ff4500", "#ff8c00", "#ffd700", "#90ee90", "#00ced1", "#1e90ff", "#4a596a", "#c71585"]
153 + }
154 + },
155 + methods: {
156 + closeEventDialog() {
157 + this.$refs.form.resetFields()
158 + this.dialogFormVisible = false
159 + this.form = {
160 + title: "",
161 + description: "",
162 + allDay: false,
163 + startDate: "",
164 + startTime: "",
165 + endDate: "",
166 + endTime: "",
167 + color: "#4a596a"
168 + }
169 + },
170 + setEvent() {
171 + this.$refs.form.validate(valid => {
172 + if (valid) {
173 + let start = dayjs(this.form.startDate)
174 + if (this.form.startTime) {
175 + start.add(dayjs(this.form.startTime).format("HH"), "hours")
176 + start.add(dayjs(this.form.startTime).format("mm"), "minutes")
177 + }
178 +
179 + let event = {
180 + id: new Date().getTime(),
181 + title: this.form.title,
182 + description: this.form.description,
183 + start: start,
184 + allDay: this.form.allDay
185 + }
186 +
187 + if (this.form.color) event.color = this.form.color
188 + if (this.form.endDate) {
189 + let end = dayjs(this.form.endDate)
190 + if (this.form.endTime) {
191 + end.add(dayjs(this.form.endTime).format("HH"), "hours")
192 + end.add(dayjs(this.form.endTime).format("mm"), "minutes")
193 + } else {
194 + end.add(24, "hours")
195 + }
196 +
197 + event.end = end
198 + }
199 +
200 + this.$refs.fullCalendar("renderEvent", event, true)
201 +
202 + this.closeEventDialog()
203 + } else {
204 + return false
205 + }
206 + })
207 + },
208 + addEventDialog() {
209 + this.dialogFormVisible = true
210 + },
211 + dayClick(arg) {
212 + this.form.startDate = arg.date
213 + this.dialogFormVisible = true
214 + },
215 + eventClick(arg) {
216 + this.form = {
217 + title: arg.event.title,
218 + description: arg.event.description,
219 + allDay: arg.event.allDay,
220 + startDate: arg.event.start,
221 + startTime: arg.event.start,
222 + endDate: arg.event.end,
223 + endTime: arg.event.end,
224 + color: arg.event.color || "#4a596a"
225 + }
226 + this.dialogFormVisible = true
227 + },
228 + select(arg) {
229 + this.form.startDate = arg.start
230 + this.form.endDate = arg.end
231 + this.dialogFormVisible = true
232 + }
233 + },
234 + components: {
235 + FullCalendar
236 + }
237 +})
238 +</script>
239 +
240 +<style lang="scss">
241 +/*
242 +@import "../../assets/scss/_variables";
243 +//@import '~@fullcalendar/core/main.css';
244 +@import "~@fullcalendar/daygrid/main.css";
245 +@import "~@fullcalendar/timegrid/main.css";
246 +@import "~@fullcalendar/list/main.css";
247 +
248 +/*.page-calendar {
249 + .calendar-wrap {
250 + //background: white;
251 + }
252 +}*/
253 +</style>
src/views/apps/Cards.vue new
+245
@@ -0,0 +1,245 @@
1 +<template>
2 + <div class="page-cards flex column">
3 + <el-row>
4 + <div class="card-form card-base card-outline" @click="openForm" v-click-outside="onClickOutside" :class="{ open: formOpen }">
5 + <div v-if="!formOpen">Write a note</div>
6 + <div v-if="formOpen">
7 + <input v-model="title" placeholder="Title" />
8 + <textarea v-model="description" placeholder="Description"></textarea>
9 + <button @click="addCard" :disabled="!title.trim() && !description.trim()" class="accent-text">Save</button>
10 + <button @click="closeForm">close</button>
11 + </div>
12 + </div>
13 + </el-row>
14 +
15 + <div class="list box grow scrollable">
16 + <div class="masonry">
17 + <div class="item card-base card-alt" v-for="i in listSorted" :key="i.id">
18 + <img v-if="i.image" :src="i.image_url" alt="card image" />
19 + <div class="p-20">
20 + <h2 class="mt-0 mb-0">{{ i.title }}</h2>
21 + <p class="mt-10 text-justify">{{ i.description }}</p>
22 + <div class="flex justify-space-between o-050 fs-14">
23 + <div class="accent-text">
24 + <strong>{{ i.date }}</strong>
25 + </div>
26 + </div>
27 + </div>
28 + </div>
29 + </div>
30 + </div>
31 + </div>
32 +</template>
33 +
34 +<script>
35 +import _ from "lodash"
36 +import dayjs from "dayjs"
37 +import Chance from "chance"
38 +const chance = new Chance()
39 +
40 +import { defineComponent } from "@vue/runtime-core"
41 +
42 +export default defineComponent({
43 + name: "Cards",
44 + data() {
45 + return {
46 + title: "",
47 + description: "",
48 + list: [],
49 + masonryCols: 4,
50 + formOpen: false
51 + }
52 + },
53 + computed: {
54 + listSorted() {
55 + return _.orderBy(this.list, ["id"], ["desc"])
56 + }
57 + },
58 + methods: {
59 + __resizeHanlder: _.throttle(function (e) {
60 + if (window.innerWidth <= 480) this.masonryCols = 1
61 + else if (window.innerWidth <= 1000) this.masonryCols = 2
62 + else if (window.innerWidth <= 1200) this.masonryCols = 3
63 + else this.masonryCols = 4
64 + }, 700),
65 + addCard() {
66 + this.list.push({
67 + id: this.list.length,
68 + title: this.title,
69 + description: this.description,
70 + date: dayjs().format("MM/DD/YYYY")
71 + })
72 +
73 + this.title = ""
74 + this.description = ""
75 + },
76 + generateCards() {
77 + const year = new Date().getFullYear()
78 +
79 + for (let i = 0; i <= 50; i++) {
80 + this.list.push({
81 + id: i,
82 + image: chance.bool(),
83 + image_url: "/static/images/gallery/photo-" + chance.integer({ min: 0, max: 50 }) + ".jpg",
84 + title: chance.sentence({ words: 3 }),
85 + description: chance.sentence(),
86 + date: chance.date({ string: true, year: year })
87 + })
88 + }
89 + },
90 + onClickOutside() {
91 + this.formOpen = false
92 + },
93 + openForm() {
94 + this.formOpen = true
95 + },
96 + closeForm() {
97 + setTimeout(this.onClickOutside, 100)
98 + }
99 + },
100 + created() {
101 + this.generateCards()
102 + }
103 +})
104 +</script>
105 +
106 +<style lang="scss">
107 +@import "../../assets/scss/_variables";
108 +
109 +.page-cards {
110 + overflow: hidden;
111 + padding-left: 20px;
112 + padding-right: 15px;
113 +
114 + .list {
115 + //overflow: hidden;
116 + //overflow-y: auto;
117 + padding: 10px 20px;
118 + margin: 0 -20px;
119 + margin-top: 20px;
120 +
121 + .masonry {
122 + column-count: 4;
123 + column-gap: 40px;
124 + padding: 4px;
125 + }
126 +
127 + .item {
128 + //padding: 20px;
129 + //margin: 20px 0;
130 + margin-bottom: 20px;
131 + //border-radius: 5px;
132 + opacity: 0.85;
133 + transition: all 0.25s;
134 +
135 + /* masonry */
136 + //display: inline-block;
137 + box-sizing: border-box;
138 + width: 100%;
139 +
140 + img {
141 + width: 100%;
142 + max-width: 100%;
143 + }
144 +
145 + &:hover {
146 + opacity: 1;
147 + box-shadow: 0px 0px 0px 4px $text-color-accent;
148 + }
149 + }
150 + }
151 +
152 + .card-form {
153 + width: 100%;
154 + max-width: 400px;
155 + margin: 0 auto;
156 + box-sizing: border-box;
157 + padding: 8px;
158 + overflow: hidden;
159 +
160 + * {
161 + box-sizing: border-box;
162 + display: block;
163 + width: 100%;
164 + border: none;
165 + outline: none;
166 + padding: 8px;
167 + background: transparent;
168 + color: $text-color-primary;
169 + }
170 +
171 + input {
172 + font-weight: bold;
173 + font-size: 16px;
174 + }
175 +
176 + textarea {
177 + resize: none;
178 + }
179 +
180 + button {
181 + text-transform: uppercase;
182 + width: auto;
183 + margin: 0 auto;
184 + cursor: pointer;
185 + border-bottom: 1px solid transparent;
186 + display: inline-block;
187 +
188 + &:hover {
189 + border-color: $text-color-primary;
190 + }
191 +
192 + &.accent-text {
193 + color: $text-color-accent;
194 +
195 + &:hover {
196 + border-color: $text-color-accent;
197 + }
198 + }
199 +
200 + &[disabled] {
201 + border-color: transparent !important;
202 + opacity: 0.5;
203 + cursor: not-allowed;
204 + }
205 + }
206 +
207 + &:not(.open) {
208 + padding: 0px;
209 + }
210 + }
211 +}
212 +
213 +/* Masonry on large screens */
214 +@media (max-width: 1200px) {
215 + .page-cards {
216 + .list {
217 + .masonry {
218 + column-count: 3;
219 + }
220 + }
221 + }
222 +}
223 +
224 +/* Masonry on medium-sized screens */
225 +@media (max-width: 1000px) {
226 + .page-cards {
227 + .list {
228 + .masonry {
229 + column-count: 2;
230 + }
231 + }
232 + }
233 +}
234 +
235 +/* Masonry on small screens */
236 +@media (max-width: 480px) {
237 + .page-cards {
238 + .list {
239 + .masonry {
240 + column-count: 1;
241 + }
242 + }
243 + }
244 +}
245 +</style>
src/views/apps/Contacts.vue new
+403
@@ -0,0 +1,403 @@
1 +<template>
2 + <div class="page-contacts flex column" id="page-contacts">
3 + <resize-observer @notify="__resizeHanlder" />
4 +
5 + <div class="contacts-root box grow flex gaps justify-center" :class="contactsClass">
6 + <div class="card-base card-shadow--small search-card scrollable only-y">
7 + <h1 class="mt-0">Contacts</h1>
8 +
9 + <el-input prefix-icon="el-icon-search" placeholder="Search a contact" clearable v-model="search"> </el-input>
10 +
11 + <div class="o-050 text-right mt-10 mb-30">
12 + <strong>{{ contactsFiltered.length }}</strong> contacts
13 + </div>
14 +
15 + <el-button @click="openDialog({})">
16 + <i class="mdi mdi-account-plus mr-10"></i>
17 + add contact</el-button
18 + >
19 +
20 + <div class="p-20">
21 + <p>Contacts favorites</p>
22 + <ul class="contacts-favourites">
23 + <li v-for="c in contactsFavourite" :key="c.id" @click="openDialog(c)">
24 + <img :src="'/static/images/users/user-' + c.id + '.jpg'" alt="user favourite avatar" />
25 + <span>{{ c.full_name }}</span>
26 + </li>
27 + </ul>
28 + </div>
29 + </div>
30 + <div class="contacts-list box grow scrollable only-y">
31 + <div v-for="c in contactsFiltered" :key="c.id" class="flex contact" @click="openDialog(c)">
32 + <div class="star align-vertical p-10 fs-22">
33 + <i class="mdi mdi-star align-vertical-middle" v-if="c.starred"></i>
34 + <i class="mdi mdi-star-outline align-vertical-middle" v-if="!c.starred"></i>
35 + </div>
36 + <div class="avatar align-vertical">
37 + <img :src="'/static/images/users/user-' + c.id + '.jpg'" class="align-vertical-middle" alt="user avatar" />
38 + </div>
39 + <div class="info box grow flex">
40 + <div class="name box grow flex column justify-center p-10">
41 + <div class="fullname fs-18">
42 + <strong>{{ c.full_name }}</strong>
43 + </div>
44 + <div class="phone fs-14 secondary-text">{{ c.phone }}</div>
45 + <div class="email fs-14 secondary-text">{{ c.email }}</div>
46 + </div>
47 + <div class="phone align-vertical p-10">
48 + <span class="align-vertical-middle">{{ c.phone }}</span>
49 + </div>
50 + </div>
51 + </div>
52 + </div>
53 + </div>
54 +
55 + <user-dialog v-model="dialogvisible" :userdata="userdata"></user-dialog>
56 + </div>
57 +</template>
58 +
59 +<script>
60 +import UserDialog from "@/components/UserDialog.vue"
61 +import Contacts from "@/assets/data/CONTACTS_MOCK_DATA.json"
62 +import { defineComponent } from "@vue/runtime-core"
63 +import _ from "lodash"
64 +import ResizeObserver from "@/components/vue-resize/ResizeObserver.vue"
65 +
66 +export default defineComponent({
67 + name: "Contacts",
68 + data() {
69 + return {
70 + search: "",
71 + dialogvisible: false,
72 + pageWidth: 0,
73 + userdata: {},
74 + contacts: Contacts.slice(0, 30)
75 + }
76 + },
77 + computed: {
78 + contactsFiltered() {
79 + return this.contacts.filter(
80 + ({ full_name, email, phone }) =>
81 + (full_name + email + phone).toString().toLowerCase().indexOf(this.search.toString().toLowerCase()) !== -1
82 + )
83 + },
84 + contactsClass() {
85 + return this.pageWidth >= 870 ? "large" : this.pageWidth >= 760 ? "medium" : "small"
86 + },
87 + contactsFavourite() {
88 + return this.contacts.filter(({ starred }) => starred)
89 + }
90 + },
91 + methods: {
92 + openDialog(data) {
93 + this.userdata = data
94 + this.dialogvisible = true
95 + },
96 + setPageWidth() {
97 + this.pageWidth = document.getElementById("page-contacts").offsetWidth
98 + },
99 + __resizeHanlder: _.throttle(function (e) {
100 + this.setPageWidth()
101 + }, 700)
102 + },
103 + mounted() {
104 + this.setPageWidth()
105 + },
106 + components: {
107 + ResizeObserver,
108 + UserDialog
109 + }
110 +})
111 +</script>
112 +
113 +<style lang="scss" scoped>
114 +@import "../../assets/scss/_variables";
115 +
116 +.page-contacts {
117 + height: 100%;
118 + margin: 0 !important;
119 + padding: 20px;
120 + padding-bottom: 10px;
121 + box-sizing: border-box;
122 +
123 + .search-card {
124 + padding: 50px;
125 + max-width: 350px;
126 + //max-height: 320px;
127 + box-sizing: border-box;
128 + margin-bottom: 15px;
129 +
130 + .el-input,
131 + .el-button {
132 + width: 100%;
133 + }
134 +
135 + .contacts-favourites {
136 + margin: 0;
137 + padding: 0;
138 + list-style: none;
139 + overflow: auto;
140 +
141 + li {
142 + list-style: none;
143 + padding: 0;
144 + margin: 0;
145 + margin-right: 10px;
146 + margin-bottom: 10px;
147 + float: left;
148 + cursor: pointer;
149 + background: $background-color;
150 + color: $text-color-primary;
151 + border-radius: 4px;
152 + overflow: hidden;
153 +
154 + &:hover {
155 + color: $text-color-accent;
156 + }
157 +
158 + img {
159 + width: 30px;
160 + height: 30px;
161 + float: left;
162 + }
163 +
164 + span {
165 + line-height: 30px;
166 + padding: 0 10px;
167 + }
168 + }
169 + }
170 + }
171 +
172 + .search-wrap {
173 + margin: 0 auto;
174 + margin-bottom: 10px;
175 + padding: 0px 30px;
176 + box-sizing: border-box;
177 + width: 100%;
178 + max-width: 600px;
179 +
180 + i {
181 + display: inline-block;
182 + width: 22px;
183 + }
184 +
185 + input {
186 + outline: none;
187 + background: transparent;
188 + border: none;
189 + font-size: 15px;
190 + position: relative;
191 + top: -2px;
192 + width: 100%;
193 + padding: 0;
194 + color: $text-color-primary;
195 + }
196 +
197 + .contacts-tot {
198 + margin-right: 20px;
199 + margin-left: 10px;
200 + }
201 +
202 + a {
203 + border-bottom: 1px solid;
204 + text-decoration: none;
205 + color: $text-color-primary;
206 +
207 + &:hover {
208 + opacity: 0.6;
209 + }
210 + }
211 + }
212 +
213 + .contacts-root {
214 + max-height: 100%;
215 + }
216 +
217 + .contacts-list {
218 + //margin: 0 auto;
219 + width: 100%;
220 + max-width: 965px;
221 + padding: 0px 30px;
222 + box-sizing: border-box;
223 +
224 + .contact {
225 + margin: 10px 0;
226 + padding: 5px;
227 + box-sizing: border-box;
228 + cursor: pointer;
229 + transition: all 0.5s 0.25s;
230 +
231 + .star {
232 + .mdi-star {
233 + color: #ffd730;
234 + }
235 + .mdi-star-outline {
236 + opacity: 0.5;
237 + }
238 + }
239 +
240 + .avatar {
241 + width: 60px;
242 + transition: all 0.5s 0.25s;
243 +
244 + img {
245 + border: 1px solid transparentize($text-color-primary, 0.9);
246 + box-sizing: border-box;
247 + width: 50px;
248 + height: 50px;
249 + border-radius: 50%;
250 + transition: all 0.5s 0.25s;
251 + }
252 + }
253 +
254 + .info {
255 + word-break: break-word;
256 +
257 + .name {
258 + //.fullname {}
259 +
260 + .email {
261 + opacity: 0;
262 + line-height: 0;
263 + transition: all 0.5s 0.25s;
264 + }
265 +
266 + .phone {
267 + display: none;
268 + }
269 + }
270 +
271 + //.phone {}
272 + }
273 +
274 + &:hover {
275 + margin: 15px -20px;
276 + padding: 10px;
277 + background-color: lighten($background-color, 20%);
278 + border-radius: 5px;
279 + box-shadow:
280 + 0 8px 16px 0 rgba(40, 40, 90, 0.09),
281 + 0 3px 6px 0 rgba(0, 0, 0, 0.065);
282 +
283 + .avatar {
284 + width: 90px;
285 +
286 + img {
287 + width: 90px;
288 + height: 90px;
289 + }
290 + }
291 +
292 + .info {
293 + .name {
294 + .email {
295 + opacity: 1;
296 + line-height: 1.4;
297 + }
298 + }
299 + }
300 + }
301 + }
302 + }
303 +
304 + .contacts-root {
305 + &.medium {
306 + .search-card {
307 + padding: 20px;
308 + max-width: 260px;
309 + //max-height: 260px;
310 + }
311 + }
312 + &.small {
313 + overflow-y: auto;
314 + display: block;
315 + -webkit-box-orient: vertical;
316 + -webkit-box-direction: normal;
317 + -ms-flex-direction: column;
318 + flex-direction: column;
319 + padding: 5px;
320 +
321 + .search-card {
322 + padding: 20px;
323 + max-width: 100%;
324 + width: 100%;
325 + //max-height: 240px;
326 + flex: none;
327 + -webkit-box-flex: none;
328 + -ms-flex: none;
329 + display: block;
330 + overflow: hidden !important;
331 + }
332 +
333 + .contacts-list {
334 + flex: none;
335 + -webkit-box-flex: none;
336 + -ms-flex: none;
337 + display: block;
338 + overflow: hidden !important;
339 + }
340 + }
341 + }
342 +}
343 +
344 +@media (max-width: 768px) {
345 + .page-contacts {
346 + .search-wrap {
347 + padding: 0;
348 + }
349 + .contacts-list {
350 + padding: 0px;
351 +
352 + .contact {
353 + .avatar {
354 + width: 40px;
355 +
356 + img {
357 + width: 40px;
358 + height: 40px;
359 + }
360 + }
361 +
362 + .info {
363 + .phone {
364 + display: none;
365 + }
366 +
367 + .name {
368 + .phone {
369 + display: block;
370 + }
371 + }
372 + }
373 +
374 + &:hover {
375 + margin: 15px 0px;
376 +
377 + .avatar {
378 + width: 60px;
379 +
380 + img {
381 + width: 60px;
382 + height: 60px;
383 + }
384 + }
385 + }
386 + }
387 + }
388 +
389 + .contacts-root {
390 + &.medium {
391 + .contacts-list {
392 + padding: 0 30px;
393 + }
394 + }
395 + &.small {
396 + .contacts-list {
397 + padding: 8px;
398 + }
399 + }
400 + }
401 + }
402 +}
403 +</style>
src/views/apps/CryptoDashboard.vue new
+1673
@@ -0,0 +1,1673 @@
1 +<template>
2 + <el-scrollbar class="page-crypto-dashboard">
3 + <resize-observer @notify="__resizeHanlder" />
4 +
5 + <div id="crypto-banner" class="card-base">
6 + <ul>
7 + <li v-for="c in cryptocoins" :key="c.ico" :data-balloon="c.name" data-balloon-pos="down">
8 + <i :class="'cc ' + c.ico"></i>{{ c.price }}
9 + </li>
10 + </ul>
11 + </div>
12 +
13 + <div class="card-base card-outline">
14 + <el-row class="mt-0">
15 + <el-col :xs="24" :sm="24" :md="12" :lg="14" :xl="14">
16 + <div class="wallet-box flex column">
17 + <div class="select-wallet" :class="{ open: selectWalletOpen }">
18 + <div class="wallet-item selected flex">
19 + <div class="icon flex column center">
20 + <i class="cc BTC"></i>
21 + </div>
22 + <div class="coin box grow flex column justify-center">
23 + <div class="fs-18 title">
24 + <span class="mr-10">Bitcoin Wallet</span><span class="o-050 cod">BTC</span>
25 + </div>
26 + <div class="fs-14 balance">
27 + <span class="o-070 mr-10">balance</span>
28 + <span class="accent-text">$ 9404,46</span>
29 + </div>
30 + </div>
31 + <div class="arrow flex column center" @click="selectWalletOpen = !selectWalletOpen">
32 + <i class="mdi mdi-chevron-down"></i>
33 + </div>
34 + </div>
35 + <div class="wallet-list">
36 + <div class="wallet-item flex">
37 + <div class="icon flex column center">
38 + <i class="cc XLM"></i>
39 + </div>
40 + <div class="coin box grow flex column justify-center">
41 + <div class="fs-18 title">
42 + <span class="mr-10">Stellar Wallet</span>
43 + <span class="o-050 cod">XLM</span>
44 + </div>
45 + <div class="fs-14 balance">
46 + <span class="o-070 mr-10">balance</span>
47 + <span class="accent-text">$ 7647,43</span>
48 + </div>
49 + </div>
50 + </div>
51 + <div class="wallet-item flex">
52 + <div class="icon flex column center">
53 + <i class="cc LTC"></i>
54 + </div>
55 + <div class="coin box grow flex column justify-center">
56 + <div class="fs-18 title">
57 + <span class="mr-10">Litecoin Wallet</span>
58 + <span class="o-050 cod">LTC</span>
59 + </div>
60 + <div class="fs-14 balance">
61 + <span class="o-070 mr-10">balance</span>
62 + <span class="accent-text">$ 247,37</span>
63 + </div>
64 + </div>
65 + </div>
66 + <div class="wallet-item flex">
67 + <div class="icon flex column center">
68 + <i class="mdi mdi-plus-circle"></i>
69 + </div>
70 + <div class="coin box grow flex column justify-center">
71 + <div class="fs-18 title">
72 + <span class="mr-10">Add Wallet</span>
73 + </div>
74 + </div>
75 + </div>
76 + </div>
77 + </div>
78 + <div class="content flex column box grow">
79 + <div class="portfolio box grow flex">
80 + <div class="balance box grow">
81 + <h4 class="m-0 o-050">BALANCE</h4>
82 + <h1 class="m-0 mt-20 mb-10">$ 9404,46</h1>
83 + <h2 class="m-0 o-070"><i class="cc BTC-alt mr-10"></i>12</h2>
84 + </div>
85 + </div>
86 + <div class="chart-box">
87 + <div v-loading="!asyncComponent">
88 + <div class="data-range-picker">Last 6 months <i class="mdi mdi-chevron-down ml-10"></i></div>
89 + <component
90 + :is="asyncComponent"
91 + :type="'line'"
92 + :options="{
93 + width: '100%',
94 + height: 200,
95 + fill: ['rgba(8, 124, 210, 0.25)'],
96 + stroke: 'rgba(8, 124, 210, 0.75)',
97 + strokeWidth: 2
98 + }"
99 + :data="[1, 3, 2, 4, 4, 9, 3, 4, 6, 5, 4, 6, 9, 8, 11, 12, 13, 12, 12, 14].toString()"
100 + />
101 + <div class="flex justify-space-around labels" v-if="asyncComponent">
102 + <span>FEB</span>
103 + <span>MAR</span>
104 + <span>APR</span>
105 + <span>MAY</span>
106 + <span>JUN</span>
107 + <span>JUL</span>
108 + </div>
109 + </div>
110 + </div>
111 + </div>
112 + </div>
113 + </el-col>
114 + <el-col :xs="24" :sm="24" :md="12" :lg="10" :xl="10">
115 + <div class="bg-white chart-wallet-box">
116 + <div id="chartWallet" style="height: 500px; width: 98%"></div>
117 + </div>
118 + </el-col>
119 + </el-row>
120 + </div>
121 +
122 + <el-row class="mt-30" :gutter="30">
123 + <el-col :xs="24" :sm="12" :md="10" :lg="10" :xl="10" class="conversion-widget">
124 + <h2 class="conversion-title">Conversion History</h2>
125 + <el-scrollbar class="card-base card-outline p-10 mb-30" style="height: 660px">
126 + <table class="conversion-table">
127 + <thead>
128 + <tr>
129 + <th class="text-center">Type</th>
130 + <th class="text-center">Date</th>
131 + <th class="text-center">Amount</th>
132 + <th class="text-center">Fee</th>
133 + </tr>
134 + </thead>
135 + <tbody>
136 + <tr v-for="(i, index) in conversionHistory" :key="index">
137 + <td class="text-center tokens">
138 + <span>{{ i.t_a }}</span>
139 + <i class="mdi mdi-swap-horizontal"></i>
140 + <span>{{ i.t_b }}</span>
141 + </td>
142 + <td class="text-center">{{ i.date }}/{{ year }}</td>
143 + <td class="text-center fw-700">${{ i.amount }}</td>
144 + <td class="text-center danger-text">-${{ i.fee }}</td>
145 + </tr>
146 + </tbody>
147 + </table>
148 + </el-scrollbar>
149 + </el-col>
150 + <el-col :xs="24" :sm="12" :md="14" :lg="14" :xl="14" class="conversion-widget">
151 + <h2 class="conversion-title">Quick Conversion</h2>
152 + <el-scrollbar class="card-base card-outline ph-20 pt-5 pb-15 mb-30" style="height: 660px">
153 + <el-tabs class="themed">
154 + <el-tab-pane label="Limit">
155 + <div>
156 + <el-row :gutter="30">
157 + <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
158 + <div class="title flex justify-space-between mb-20">
159 + <div>Buy BTC</div>
160 + <div class="o-050">USD Balance: $ 8354.36</div>
161 + </div>
162 + <div class="form mb-20" style="overflow: hidden">
163 + <el-form label-width="70px">
164 + <el-form-item label="Price">
165 + <el-input class="themed" placeholder="$ 6384,43"></el-input>
166 + </el-form-item>
167 + <el-form-item label="Amount">
168 + <el-input class="themed" placeholder="0.0373 BTC"></el-input>
169 + </el-form-item>
170 + <el-form-item label="Total">
171 + <el-input class="themed" placeholder="$ 747,36"></el-input>
172 + </el-form-item>
173 + <el-button class="themed" type="primary" plain style="float: right"> Buy BTC </el-button>
174 + </el-form>
175 + </div>
176 + </el-col>
177 + <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
178 + <div class="title flex justify-space-between mb-20">
179 + <div>Sell BTC</div>
180 + <div class="o-050">BTC Balance: 1.038748</div>
181 + </div>
182 + <div class="form mb-20" style="overflow: hidden">
183 + <el-form label-width="70px">
184 + <el-form-item label="Price">
185 + <el-input class="themed" placeholder="$ 9848,38"></el-input>
186 + </el-form-item>
187 + <el-form-item label="Amount">
188 + <el-input class="themed" placeholder="0.083837 BTC"></el-input>
189 + </el-form-item>
190 + <el-form-item label="Total">
191 + <el-input class="themed" placeholder="$ 83638,76"></el-input>
192 + </el-form-item>
193 + <el-button class="themed" type="primary" plain style="float: right"> Sell BTC </el-button>
194 + </el-form>
195 + </div>
196 + </el-col>
197 + </el-row>
198 + </div>
199 + </el-tab-pane>
200 + <el-tab-pane label="Market">
201 + <div>
202 + <el-row :gutter="30">
203 + <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
204 + <div class="title flex justify-space-between mb-20">
205 + <div>Buy BTC</div>
206 + <div class="o-050">USD Balance: $ 8354.36</div>
207 + </div>
208 + <div class="form mb-20" style="overflow: hidden">
209 + <el-form label-width="70px">
210 + <el-form-item label="Price">
211 + <el-input class="themed" placeholder="$ 6384,43"></el-input>
212 + </el-form-item>
213 + <el-form-item label="Amount">
214 + <el-input class="themed" placeholder="0.0373 BTC"></el-input>
215 + </el-form-item>
216 + <el-button class="themed" type="primary" plain style="float: right"> Buy BTC </el-button>
217 + </el-form>
218 + </div>
219 + </el-col>
220 + <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
221 + <div class="title flex justify-space-between mb-20">
222 + <div>Sell BTC</div>
223 + <div class="o-050">BTC Balance: 1.038748</div>
224 + </div>
225 + <div class="form mb-20" style="overflow: hidden">
226 + <el-form label-width="70px">
227 + <el-form-item label="Price">
228 + <el-input class="themed" placeholder="$ 9848,38"></el-input>
229 + </el-form-item>
230 + <el-form-item label="Amount">
231 + <el-input class="themed" placeholder="0.083837 BTC"></el-input>
232 + </el-form-item>
233 + <el-button class="themed" type="primary" plain style="float: right"> Sell BTC </el-button>
234 + </el-form>
235 + </div>
236 + </el-col>
237 + </el-row>
238 + </div>
239 + </el-tab-pane>
240 + <el-tab-pane label="Stop Limit">
241 + <div>
242 + <el-row :gutter="30">
243 + <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
244 + <div class="title flex justify-space-between mb-20">
245 + <div>Buy BTC</div>
246 + <div class="o-050">USD Balance: $ 8354.36</div>
247 + </div>
248 + <div class="form mb-20" style="overflow: hidden">
249 + <el-form label-width="70px">
250 + <el-form-item label="Stop">
251 + <el-input class="themed" placeholder="$ 6384,43"></el-input>
252 + </el-form-item>
253 + <el-form-item label="Limit">
254 + <el-input class="themed" placeholder="0.0373 BTC"></el-input>
255 + </el-form-item>
256 + <el-form-item label="Amount">
257 + <el-input class="themed" placeholder="$ 747,36"></el-input>
258 + </el-form-item>
259 + <el-button class="themed" type="primary" plain style="float: right"> Buy BTC </el-button>
260 + </el-form>
261 + </div>
262 + </el-col>
263 + <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
264 + <div class="title flex justify-space-between mb-20">
265 + <div>Sell BTC</div>
266 + <div class="o-050">BTC Balance: 1.038748</div>
267 + </div>
268 + <div class="form mb-20" style="overflow: hidden">
269 + <el-form label-width="70px">
270 + <el-form-item label="Stop">
271 + <el-input class="themed" placeholder="$ 9848,38"></el-input>
272 + </el-form-item>
273 + <el-form-item label="Limit">
274 + <el-input class="themed" placeholder="0.083837 BTC"></el-input>
275 + </el-form-item>
276 + <el-form-item label="Amount">
277 + <el-input class="themed" placeholder="$ 83638,76"></el-input>
278 + </el-form-item>
279 + <el-button class="themed" type="primary" plain style="float: right"> Sell BTC </el-button>
280 + </el-form>
281 + </div>
282 + </el-col>
283 + </el-row>
284 + </div>
285 + </el-tab-pane>
286 + </el-tabs>
287 + </el-scrollbar>
288 + </el-col>
289 + </el-row>
290 + </el-scrollbar>
291 +</template>
292 +
293 +<script>
294 +import MarqueeInfinite from "marquee-infinite"
295 +import * as echarts from "echarts"
296 +import "cryptocoins-icons/webfont/cryptocoins.css"
297 +import "cryptocoins-icons/webfont/cryptocoins-colors.css"
298 +import ResizeObserver from "../../components/vue-resize/ResizeObserver.vue"
299 +import _throttle from "lodash/throttle"
300 +import { defineComponent } from "@vue/runtime-core"
301 +import Peity from "../../components/vue-peity/Peity.vue"
302 +
303 +export default defineComponent({
304 + name: "CryptoDashboard",
305 + data() {
306 + return {
307 + asyncComponent: "peity",
308 + resized: false,
309 + marquee: null,
310 + chartWallet: null,
311 + chartPrice: null,
312 + chartCandle: null,
313 + cryptocoins: [
314 + {
315 + ico: "BTC",
316 + name: "Bitcoin",
317 + price: "$6.307,52"
318 + },
319 + {
320 + ico: "ETH",
321 + name: "Ethereum",
322 + price: "$200,14"
323 + },
324 + {
325 + ico: "XRP",
326 + name: "XRP",
327 + price: "$0,273904"
328 + },
329 + {
330 + ico: "XLM",
331 + name: "Stellar",
332 + price: "$0,196676"
333 + },
334 + {
335 + ico: "LTC",
336 + name: "Litecoin",
337 + price: "$52,18"
338 + },
339 + {
340 + ico: "USDT",
341 + name: "Tether",
342 + price: "$1,00"
343 + },
344 + {
345 + ico: "XMR",
346 + name: "Monero",
347 + price: "$109,88"
348 + },
349 + {
350 + ico: "DASH",
351 + name: "Dash",
352 + price: "$183,62"
353 + },
354 + {
355 + ico: "NEO",
356 + name: "NEO",
357 + price: "$16,71"
358 + },
359 + {
360 + ico: "XTZ",
361 + name: "Tezos",
362 + price: "$1,46"
363 + },
364 + {
365 + ico: "XEM",
366 + name: "NEM",
367 + price: "$0,085573"
368 + },
369 + {
370 + ico: "ZEC",
371 + name: "Zcash",
372 + price: "$111,73"
373 + },
374 + {
375 + ico: "OMG",
376 + name: "OmiseGO",
377 + price: "$3,12"
378 + },
379 + {
380 + ico: "LSK",
381 + name: "Lisk",
382 + price: "$3,40"
383 + },
384 + {
385 + ico: "BCN",
386 + name: "Bytecoin",
387 + price: "$0,001815"
388 + },
389 + {
390 + ico: "DCR",
391 + name: "Decred",
392 + price: "$35,83"
393 + },
394 + {
395 + ico: "QTUM",
396 + name: "Qtum",
397 + price: "$3,22"
398 + },
399 + {
400 + ico: "REP",
401 + name: "Augur",
402 + price: "$12,40"
403 + },
404 + {
405 + ico: "STRAT",
406 + name: "Stratis",
407 + price: "$1,29"
408 + },
409 + {
410 + ico: "MCO",
411 + name: "MCO",
412 + price: "$4,14"
413 + }
414 + ],
415 + selectWalletOpen: false,
416 + year: new Date().getFullYear(),
417 + conversionHistory: [
418 + { t_a: "BTC", t_b: "USD", date: "03/10", amount: "25,38", fee: "1,23" },
419 + { t_a: "RPX", t_b: "ETH", date: "01/10", amount: "15,21", fee: "1,13" },
420 + { t_a: "LTC", t_b: "BTC", date: "27/09", amount: "17,43", fee: "2,14" },
421 + { t_a: "PRX", t_b: "LTC", date: "25/09", amount: "23,18", fee: "3,17" },
422 + { t_a: "ETH", t_b: "USD", date: "22/09", amount: "35,42", fee: "3,12" },
423 + { t_a: "BTC", t_b: "ETH", date: "20/09", amount: "72,62", fee: "4,15" },
424 + { t_a: "RPX", t_b: "USD", date: "19/09", amount: "25,38", fee: "1,23" },
425 + { t_a: "BTC", t_b: "USD", date: "17/09", amount: "25,38", fee: "1,23" },
426 + { t_a: "ETH", t_b: "BTC", date: "16/09", amount: "52,11", fee: "4,72" },
427 + { t_a: "BTC", t_b: "USD", date: "14/09", amount: "25,38", fee: "1,23" },
428 + { t_a: "RPX", t_b: "ETH", date: "13/09", amount: "15,21", fee: "1,13" },
429 + { t_a: "LTC", t_b: "BTC", date: "10/09", amount: "17,43", fee: "2,14" },
430 + { t_a: "PRX", t_b: "LTC", date: "09/09", amount: "23,18", fee: "3,17" },
431 + { t_a: "ETH", t_b: "USD", date: "08/09", amount: "35,42", fee: "3,12" },
432 + { t_a: "BTC", t_b: "ETH", date: "07/09", amount: "72,62", fee: "4,15" },
433 + { t_a: "RPX", t_b: "USD", date: "06/09", amount: "25,38", fee: "1,23" }
434 + /*{ t_a: "BTC", t_b: "USD", date: "05/09", amount: "25,38", fee: "1,23" },
435 + { t_a: "ETH", t_b: "BTC", date: "04/09", amount: "52,11", fee: "4,72" },
436 + { t_a: "BTC", t_b: "USD", date: "01/09", amount: "25,38", fee: "1,23" },
437 + { t_a: "RPX", t_b: "ETH", date: "29/08", amount: "15,21", fee: "1,13" },
438 + { t_a: "LTC", t_b: "BTC", date: "28/08", amount: "17,43", fee: "2,14" },
439 + { t_a: "PRX", t_b: "LTC", date: "26/08", amount: "23,18", fee: "3,17" },
440 + { t_a: "ETH", t_b: "USD", date: "24/08", amount: "35,42", fee: "3,12" },
441 + { t_a: "BTC", t_b: "ETH", date: "21/08", amount: "72,62", fee: "4,15" },
442 + { t_a: "RPX", t_b: "USD", date: "20/08", amount: "25,38", fee: "1,23" },
443 + { t_a: "BTC", t_b: "USD", date: "18/08", amount: "25,38", fee: "1,23" },
444 + { t_a: "ETH", t_b: "BTC", date: "16/08", amount: "52,11", fee: "4,72" },
445 + { t_a: "BTC", t_b: "USD", date: "15/08", amount: "25,38", fee: "1,23" },
446 + { t_a: "RPX", t_b: "ETH", date: "13/08", amount: "15,21", fee: "1,13" },
447 + { t_a: "LTC", t_b: "BTC", date: "11/08", amount: "17,43", fee: "2,14" },
448 + { t_a: "PRX", t_b: "LTC", date: "09/08", amount: "23,18", fee: "3,17" },
449 + { t_a: "ETH", t_b: "USD", date: "07/08", amount: "35,42", fee: "3,12" },
450 + { t_a: "BTC", t_b: "ETH", date: "05/08", amount: "72,62", fee: "4,15" },
451 + { t_a: "RPX", t_b: "USD", date: "04/08", amount: "25,38", fee: "1,23" },
452 + { t_a: "BTC", t_b: "USD", date: "03/08", amount: "25,38", fee: "1,23" },
453 + { t_a: "ETH", t_b: "BTC", date: "01/08", amount: "52,11", fee: "4,72" }*/
454 + ]
455 + }
456 + },
457 + computed: {},
458 + methods: {
459 + __resizeHanlder: _throttle(function (e) {
460 + if (this.resized) {
461 + this.asyncComponent = null
462 + this.removePeity()
463 + setTimeout(() => {
464 + this.asyncComponent = "peity"
465 + }, 1000)
466 +
467 + if (this.chartWallet) {
468 + this.chartWallet.resize()
469 + }
470 + if (this.chartPrice) {
471 + this.chartPrice.resize()
472 + }
473 + if (this.chartCandle) {
474 + this.chartCandle.resize()
475 + }
476 + }
477 + this.resized = true
478 + }, 700),
479 + removePeity() {
480 + const peityEl = document.querySelectorAll(".peity") //.forEach((el)=>{el.remove()})
481 + //ie fix
482 + for (let i = 0; i < peityEl.length; i++) {
483 + peityEl[i].parentNode.removeChild(peityEl[i])
484 + }
485 + },
486 + initMarquee() {
487 + this.marquee = new MarqueeInfinite("#crypto-banner", {
488 + maxItems: 80,
489 + duration: 50000,
490 + classNames: {
491 + container: "marqueeInfinite",
492 + slider: "marqueeInfiniteSlider",
493 + cell: "marqueeInfiniteCell"
494 + }
495 + })
496 + },
497 + initChartWallet() {
498 + const scale = 1
499 + const chartWalletData = [
500 + {
501 + value: 23,
502 + name: "Bitcoin",
503 + itemStyle: {
504 + borderWidth: 5,
505 + //shadowBlur: 20,
506 + borderColor: "#3f84f6"
507 + //shadowColor: '#00cfff'
508 + }
509 + },
510 + {
511 + value: 62,
512 + name: "Dash",
513 + itemStyle: {
514 + borderWidth: 5,
515 + //shadowBlur: 20,
516 + borderColor: "#2673f5"
517 + //shadowColor: '#00a4ca'
518 + }
519 + },
520 + {
521 + value: 12,
522 + name: "Stellar",
523 + itemStyle: {
524 + borderWidth: 5,
525 + //shadowBlur: 20,
526 + borderColor: "#4889f6"
527 + //shadowColor: '#007590'
528 + }
529 + },
530 + {
531 + value: 31,
532 + name: "Ethereum",
533 + itemStyle: {
534 + borderWidth: 5,
535 + //shadowBlur: 20,
536 + borderColor: "#74a6f8"
537 + //shadowColor: '#005390'
538 + }
539 + },
540 + {
541 + value: 59,
542 + name: "Litecoin",
543 + itemStyle: {
544 + borderWidth: 5,
545 + //shadowBlur: 20,
546 + borderColor: "#a4c5fb"
547 + //shadowColor: '#087cd2'
548 + }
549 + }
550 + ]
551 +
552 + const rich = {
553 + value: {
554 + color: "#0394ff",
555 + fontSize: 20 * scale,
556 + fontFamily: "Nunito Sans",
557 + padding: [2, 0],
558 + align: "center"
559 + },
560 + total: {
561 + color: "#0394ff",
562 + fontSize: 40 * scale,
563 + fontFamily: "Nunito Sans",
564 + align: "center"
565 + },
566 + title: {
567 + color: "#000",
568 + align: "center",
569 + fontSize: 14 * scale,
570 + fontFamily: "Nunito Sans",
571 + borderWidth: 1,
572 + borderColor: "#0b5263",
573 + padding: [5, 5]
574 + },
575 + percent: {
576 + color: "#888",
577 + fontSize: 12 * scale,
578 + fontFamily: "Nunito Sans",
579 + align: "center",
580 + padding: [5, 0]
581 + }
582 + /*hr: {
583 + borderColor: '#0b5263',
584 + width: '100%',
585 + borderWidth: 1,
586 + height: 0,
587 + top: '10%'
588 + }*/
589 + }
590 +
591 + this.chartWallet = echarts.init(document.getElementById("chartWallet"))
592 + this.chartWallet.setOption({
593 + title: {
594 + text: "coins",
595 + left: "center",
596 + top: "47%",
597 + padding: [24, 0],
598 + textStyle: {
599 + color: "#000",
600 + fontSize: 18 * scale,
601 + fontFamily: "Nunito Sans",
602 + align: "center"
603 + }
604 + },
605 + legend: {
606 + selectedMode: false,
607 + formatter: function (name) {
608 + var total = 0
609 + var averagePercent
610 + chartWalletData.forEach(function (value, index, array) {
611 + total += value.value
612 + })
613 + return "{total|" + total + "}"
614 + },
615 + data: [chartWalletData[0].name],
616 + // data: [''],
617 + // itemGap: 50,
618 + left: "center",
619 + top: "43%",
620 + icon: "none",
621 + align: "center",
622 + textStyle: {
623 + color: "#fff",
624 + fontSize: 16 * scale,
625 + fontFamily: "Nunito Sans",
626 + rich: rich
627 + }
628 + },
629 + series: [
630 + {
631 + name: "coins",
632 + type: "pie",
633 + radius: ["37%", "45%"],
634 + color: ["#3f84f6", "#2673f5", "#4889f6", "#74a6f8", "#a4c5fb"],
635 + label: {
636 + formatter: function (params, ticket, callback) {
637 + var total = 0
638 + var percent = 0
639 + chartWalletData.forEach(function (value, index, array) {
640 + total += value.value
641 + })
642 + percent = ((params.value / total) * 100).toFixed(1)
643 + return "{value|" + params.value + "}\n{title|" + params.name + "}\n{percent|" + percent + "%}"
644 + //return '{white|' + params.name + '}\n{hr|}\n{yellow|' + params.value + '}\n{blue|' + percent + '%}';
645 + },
646 + rich: rich
647 + },
648 + labelLine: {
649 + length: 35 * scale,
650 + length2: 0,
651 + lineStyle: {
652 + color: "#0b5263"
653 + }
654 + },
655 + data: chartWalletData
656 + }
657 + ]
658 + })
659 + },
660 + initChartPrice() {
661 + const chartOptions = {
662 + title: {
663 + text: "BTC/USD",
664 + top: 0,
665 + right: 0,
666 + textStyle: {
667 + fontSize: 14
668 + }
669 + },
670 + legend: {
671 + show: !1
672 + },
673 + grid: {
674 + show: false,
675 + left: -25,
676 + right: 10,
677 + bottom: 40,
678 + top: 10,
679 + containLabel: true
680 + },
681 + tooltip: {
682 + trigger: "axis",
683 + formatter: function (e) {
684 + var t = e[0].seriesName + " - " + e[0].name
685 + return (
686 + (t += "<br/> Opening : " + e[0].value[0]),
687 + (t += "<br/> Closing : $ " + e[0].value[1]),
688 + (t += "<br/> Highest : $ " + e[0].value[3]),
689 + (t += "<br/> Lowest : $ " + e[0].value[2])
690 + )
691 + },
692 + axisPointer: {
693 + type: "line",
694 + lineStyle: {
695 + color: "#fff",
696 + width: 2,
697 + type: "solid"
698 + }
699 + }
700 + },
701 + legend: {
702 + show: !1,
703 + data: ["BTC"]
704 + },
705 + dataZoom: {
706 + show: !0,
707 + realtime: !0,
708 + start: 0,
709 + end: 50
710 + },
711 + color: ["#24CB8C", "#1EC481", "#18BE77"],
712 + calculable: !0,
713 + xAxis: [
714 + {
715 + type: "category",
716 + boundaryGap: !0,
717 + axisLine: {
718 + lineStyle: {
719 + color: "#fff"
720 + }
721 + },
722 + axisTick: {
723 + onGap: !1
724 + },
725 + splitLine: {
726 + show: !1
727 + },
728 + data: [
729 + "1/24",
730 + "1/25",
731 + "1/28",
732 + "1/29",
733 + "1/30",
734 + "1/31",
735 + "2/1",
736 + "2/4",
737 + "2/5",
738 + "2/6",
739 + "2/7",
740 + "2/8",
741 + "2/18",
742 + "2/19",
743 + "2/20",
744 + "2/21",
745 + "2/22",
746 + "2/25",
747 + "2/26",
748 + "2/27",
749 + "2/28",
750 + "3/1",
751 + "3/4",
752 + "3/5",
753 + "3/6",
754 + "3/7",
755 + "3/8",
756 + "3/11",
757 + "3/12",
758 + "3/13",
759 + "3/14",
760 + "3/15",
761 + "3/18",
762 + "3/19",
763 + "3/20",
764 + "3/21",
765 + "3/22",
766 + "3/25",
767 + "3/26",
768 + "3/27",
769 + "3/28",
770 + "3/29",
771 + "4/1",
772 + "4/2",
773 + "4/3",
774 + "4/8",
775 + "4/9",
776 + "4/10",
777 + "4/11",
778 + "4/12",
779 + "4/15",
780 + "4/16",
781 + "4/17",
782 + "4/18",
783 + "4/19",
784 + "4/22",
785 + "4/23",
786 + "4/24",
787 + "4/25",
788 + "4/26",
789 + "5/2",
790 + "5/3",
791 + "5/6",
792 + "5/7",
793 + "5/8",
794 + "5/9",
795 + "5/10",
796 + "5/13",
797 + "5/14",
798 + "5/15",
799 + "5/16",
800 + "5/17",
801 + "5/20",
802 + "5/21",
803 + "5/22",
804 + "5/23",
805 + "5/24",
806 + "5/27",
807 + "5/28",
808 + "5/29",
809 + "5/30",
810 + "5/31",
811 + "6/3",
812 + "6/4",
813 + "6/5",
814 + "6/6",
815 + "6/7",
816 + "6/13"
817 + ]
818 + }
819 + ],
820 + yAxis: [
821 + {
822 + show: false,
823 + type: "value",
824 + scale: !0,
825 + boundaryGap: [0.01, 0.01],
826 + axisLine: {
827 + lineStyle: {
828 + color: "#fff"
829 + }
830 + },
831 + splitLine: {
832 + lineStyle: {
833 + color: "#e3e3e3"
834 + }
835 + }
836 + }
837 + ],
838 + series: [
839 + {
840 + name: "BTC",
841 + type: "k",
842 + barMaxWidth: 20,
843 + itemStyle: {
844 + color: "#94E8CA",
845 + color0: "#FFA4B0",
846 + lineStyle: {
847 + width: 2,
848 + color: "#28D094",
849 + color0: "#FF4961"
850 + }
851 + },
852 + data: [
853 + {
854 + value: [2320.26, 2302.6, 2287.3, 2362.94],
855 + itemStyle: {
856 + color0: "#FFA4B0",
857 + lineStyle: {
858 + width: 3,
859 + color0: "#FF4961"
860 + }
861 + }
862 + },
863 + [2300, 2291.3, 2288.26, 2308.38],
864 + [2295.35, 2346.5, 2295.35, 2346.92],
865 + [2347.22, 2358.98, 2337.35, 2363.8],
866 + [2360.75, 2382.48, 2347.89, 2383.76],
867 + [2383.43, 2385.42, 2371.23, 2391.82],
868 + [2377.41, 2419.02, 2369.57, 2421.15],
869 + [2425.92, 2428.15, 2417.58, 2440.38],
870 + [2411, 2433.13, 2403.3, 2437.42],
871 + [2432.68, 2434.48, 2427.7, 2441.73],
872 + [2430.69, 2418.53, 2394.22, 2433.89],
873 + [2416.62, 2432.4, 2414.4, 2443.03],
874 + [2441.91, 2421.56, 2415.43, 2444.8],
875 + [2420.26, 2382.91, 2373.53, 2427.07],
876 + [2383.49, 2397.18, 2370.61, 2397.94],
877 + [2378.82, 2325.95, 2309.17, 2378.82],
878 + [2322.94, 2314.16, 2308.76, 2330.88],
879 + [2320.62, 2325.82, 2315.01, 2338.78],
880 + [2313.74, 2293.34, 2289.89, 2340.71],
881 + [2297.77, 2313.22, 2292.03, 2324.63],
882 + [2322.32, 2365.59, 2308.92, 2366.16],
883 + [2364.54, 2359.51, 2330.86, 2369.65],
884 + [2332.08, 2273.4, 2259.25, 2333.54],
885 + [2274.81, 2326.31, 2270.1, 2328.14],
886 + [2333.61, 2347.18, 2321.6, 2351.44],
887 + [2340.44, 2324.29, 2304.27, 2352.02],
888 + [2326.42, 2318.61, 2314.59, 2333.67],
889 + [2314.68, 2310.59, 2296.58, 2320.96],
890 + [2309.16, 2286.6, 2264.83, 2333.29],
891 + [2282.17, 2263.97, 2253.25, 2286.33],
892 + [2255.77, 2270.28, 2253.31, 2276.22],
893 + [2269.31, 2278.4, 2250, 2312.08],
894 + [2267.29, 2240.02, 2239.21, 2276.05],
895 + [2244.26, 2257.43, 2232.02, 2261.31],
896 + [2257.74, 2317.37, 2257.42, 2317.86],
897 + [2318.21, 2324.24, 2311.6, 2330.81],
898 + [2321.4, 2328.28, 2314.97, 2332],
899 + [2334.74, 2326.72, 2319.91, 2344.89],
900 + [2318.58, 2297.67, 2281.12, 2319.99],
901 + [2299.38, 2301.26, 2289, 2323.48],
902 + [2273.55, 2236.3, 2232.91, 2273.55],
903 + [2238.49, 2236.62, 2228.81, 2246.87],
904 + [2229.46, 2234.4, 2227.31, 2243.95],
905 + [2234.9, 2227.74, 2220.44, 2253.42],
906 + [2232.69, 2225.29, 2217.25, 2241.34],
907 + [2196.24, 2211.59, 2180.67, 2212.59],
908 + [2215.47, 2225.77, 2215.47, 2234.73],
909 + [2224.93, 2226.13, 2212.56, 2233.04],
910 + [2236.98, 2219.55, 2217.26, 2242.48],
911 + [2218.09, 2206.78, 2204.44, 2226.26],
912 + [2199.91, 2181.94, 2177.39, 2204.99],
913 + [2169.63, 2194.85, 2165.78, 2196.43],
914 + [2195.03, 2193.8, 2178.47, 2197.51],
915 + [2181.82, 2197.6, 2175.44, 2206.03],
916 + [2201.12, 2244.64, 2200.58, 2250.11],
917 + [2236.4, 2242.17, 2232.26, 2245.12],
918 + [2242.62, 2184.54, 2182.81, 2242.62],
919 + [2187.35, 2218.32, 2184.11, 2226.12],
920 + [2213.19, 2199.31, 2191.85, 2224.63],
921 + [2203.89, 2177.91, 2173.86, 2210.58],
922 + [2170.78, 2174.12, 2161.14, 2179.65],
923 + [2179.05, 2205.5, 2179.05, 2222.81],
924 + [2212.5, 2231.17, 2212.5, 2236.07],
925 + [2227.86, 2235.57, 2219.44, 2240.26],
926 + [2242.39, 2246.3, 2235.42, 2255.21],
927 + [2246.96, 2232.97, 2221.38, 2247.86],
928 + [2228.82, 2246.83, 2225.81, 2247.67],
929 + [2247.68, 2241.92, 2231.36, 2250.85],
930 + [2238.9, 2217.01, 2205.87, 2239.93],
931 + [2217.09, 2224.8, 2213.58, 2225.19],
932 + [2221.34, 2251.81, 2210.77, 2252.87],
933 + [2249.81, 2282.87, 2248.41, 2288.09],
934 + [2286.33, 2299.99, 2281.9, 2309.39],
935 + [2297.11, 2305.11, 2290.12, 2305.3],
936 + [2303.75, 2302.4, 2292.43, 2314.18],
937 + [2293.81, 2275.67, 2274.1, 2304.95],
938 + [2281.45, 2288.53, 2270.25, 2292.59],
939 + [2286.66, 2293.08, 2283.94, 2301.7],
940 + [2293.4, 2321.32, 2281.47, 2322.1],
941 + [2323.54, 2324.02, 2321.17, 2334.33],
942 + [2316.25, 2317.75, 2310.49, 2325.72],
943 + [2320.74, 2300.59, 2299.37, 2325.53],
944 + [2300.21, 2299.25, 2294.11, 2313.43],
945 + [2297.1, 2272.42, 2264.76, 2297.1],
946 + [2270.71, 2270.93, 2260.87, 2276.86],
947 + [2264.43, 2242.11, 2240.07, 2266.69],
948 + [2242.26, 2210.9, 2205.07, 2250.63],
949 + [2190.1, 2148.35, 2126.22, 2190.1]
950 + ]
951 + }
952 + ]
953 + }
954 +
955 + this.chartPrice = echarts.init(document.getElementById("priceChart"))
956 + this.chartPrice.setOption(chartOptions)
957 + },
958 + initChartCandle() {
959 + const chartOptions = {
960 + title: {
961 + text: "",
962 + top: 0,
963 + right: 0,
964 + textStyle: {
965 + fontSize: 14
966 + }
967 + },
968 + legend: {
969 + show: !1
970 + },
971 + grid: {
972 + show: false,
973 + left: -25,
974 + right: 10,
975 + bottom: 40,
976 + top: 10,
977 + containLabel: true
978 + },
979 + tooltip: {
980 + trigger: "axis",
981 + formatter: function (e) {
982 + var t = e[0].seriesName + " - " + e[0].name
983 + return (
984 + (t += "<br/> Opening : " + e[0].value[0]),
985 + (t += "<br/> Closing : $ " + e[0].value[1]),
986 + (t += "<br/> Highest : $ " + e[0].value[3]),
987 + (t += "<br/> Lowest : $ " + e[0].value[2])
988 + )
989 + },
990 + axisPointer: {
991 + type: "line",
992 + lineStyle: {
993 + color: "#fff",
994 + width: 2,
995 + type: "solid"
996 + }
997 + }
998 + },
999 + legend: {
1000 + show: !1,
1001 + data: ["BTC"]
1002 + },
1003 + dataZoom: {
1004 + show: !0,
1005 + realtime: !0,
1006 + start: 0,
1007 + end: 50
1008 + },
1009 + color: ["#24CB8C", "#1EC481", "#18BE77"],
1010 + calculable: !0,
1011 + xAxis: [
1012 + {
1013 + type: "category",
1014 + boundaryGap: !0,
1015 + axisLine: {
1016 + lineStyle: {
1017 + color: "#fff"
1018 + }
1019 + },
1020 + axisTick: {
1021 + onGap: !1
1022 + },
1023 + splitLine: {
1024 + show: !1
1025 + },
1026 + data: [
1027 + "1/24",
1028 + "1/25",
1029 + "1/28",
1030 + "1/29",
1031 + "1/30",
1032 + "1/31",
1033 + "2/1",
1034 + "2/4",
1035 + "2/5",
1036 + "2/6",
1037 + "2/7",
1038 + "2/8",
1039 + "2/18",
1040 + "2/19",
1041 + "2/20",
1042 + "2/21",
1043 + "2/22",
1044 + "2/25",
1045 + "2/26",
1046 + "2/27",
1047 + "2/28",
1048 + "3/1",
1049 + "3/4",
1050 + "3/5",
1051 + "3/6",
1052 + "3/7",
1053 + "3/8",
1054 + "3/11",
1055 + "3/12",
1056 + "3/13",
1057 + "3/14",
1058 + "3/15",
1059 + "3/18",
1060 + "3/19",
1061 + "3/20",
1062 + "3/21",
1063 + "3/22",
1064 + "3/25",
1065 + "3/26",
1066 + "3/27",
1067 + "3/28",
1068 + "3/29",
1069 + "4/1",
1070 + "4/2",
1071 + "4/3",
1072 + "4/8",
1073 + "4/9",
1074 + "4/10",
1075 + "4/11",
1076 + "4/12",
1077 + "4/15",
1078 + "4/16",
1079 + "4/17",
1080 + "4/18",
1081 + "4/19",
1082 + "4/22",
1083 + "4/23",
1084 + "4/24",
1085 + "4/25",
1086 + "4/26",
1087 + "5/2",
1088 + "5/3",
1089 + "5/6",
1090 + "5/7",
1091 + "5/8",
1092 + "5/9",
1093 + "5/10",
1094 + "5/13",
1095 + "5/14",
1096 + "5/15",
1097 + "5/16",
1098 + "5/17",
1099 + "5/20",
1100 + "5/21",
1101 + "5/22",
1102 + "5/23",
1103 + "5/24",
1104 + "5/27",
1105 + "5/28",
1106 + "5/29",
1107 + "5/30",
1108 + "5/31",
1109 + "6/3",
1110 + "6/4",
1111 + "6/5",
1112 + "6/6",
1113 + "6/7",
1114 + "6/13"
1115 + ]
1116 + }
1117 + ],
1118 + yAxis: [
1119 + {
1120 + show: false,
1121 + type: "value",
1122 + scale: !0,
1123 + boundaryGap: [0.01, 0.01],
1124 + axisLine: {
1125 + lineStyle: {
1126 + color: "#fff"
1127 + }
1128 + },
1129 + splitLine: {
1130 + lineStyle: {
1131 + color: "#e3e3e3"
1132 + }
1133 + }
1134 + }
1135 + ],
1136 + series: [
1137 + {
1138 + name: "BTC",
1139 + type: "k",
1140 + barMaxWidth: 20,
1141 + itemStyle: {
1142 + color: "#94E8CA",
1143 + color0: "#FFA4B0",
1144 + lineStyle: {
1145 + width: 2,
1146 + color: "#28D094",
1147 + color0: "#FF4961"
1148 + }
1149 + },
1150 + data: [
1151 + {
1152 + value: [2320.26, 2302.6, 2287.3, 2362.94],
1153 + itemStyle: {
1154 + color0: "#FFA4B0",
1155 + lineStyle: {
1156 + width: 3,
1157 + color0: "#FF4961"
1158 + }
1159 + }
1160 + },
1161 + [2300, 2291.3, 2288.26, 2308.38],
1162 + [2295.35, 2346.5, 2295.35, 2346.92],
1163 + [2347.22, 2358.98, 2337.35, 2363.8],
1164 + [2360.75, 2382.48, 2347.89, 2383.76],
1165 + [2383.43, 2385.42, 2371.23, 2391.82],
1166 + [2377.41, 2419.02, 2369.57, 2421.15],
1167 + [2425.92, 2428.15, 2417.58, 2440.38],
1168 + [2411, 2433.13, 2403.3, 2437.42],
1169 + [2432.68, 2434.48, 2427.7, 2441.73],
1170 + [2430.69, 2418.53, 2394.22, 2433.89],
1171 + [2416.62, 2432.4, 2414.4, 2443.03],
1172 + [2441.91, 2421.56, 2415.43, 2444.8],
1173 + [2420.26, 2382.91, 2373.53, 2427.07],
1174 + [2383.49, 2397.18, 2370.61, 2397.94],
1175 + [2378.82, 2325.95, 2309.17, 2378.82],
1176 + [2322.94, 2314.16, 2308.76, 2330.88],
1177 + [2320.62, 2325.82, 2315.01, 2338.78],
1178 + [2313.74, 2293.34, 2289.89, 2340.71],
1179 + [2297.77, 2313.22, 2292.03, 2324.63],
1180 + [2322.32, 2365.59, 2308.92, 2366.16],
1181 + [2364.54, 2359.51, 2330.86, 2369.65],
1182 + [2332.08, 2273.4, 2259.25, 2333.54],
1183 + [2274.81, 2326.31, 2270.1, 2328.14],
1184 + [2333.61, 2347.18, 2321.6, 2351.44],
1185 + [2340.44, 2324.29, 2304.27, 2352.02],
1186 + [2326.42, 2318.61, 2314.59, 2333.67],
1187 + [2314.68, 2310.59, 2296.58, 2320.96],
1188 + [2309.16, 2286.6, 2264.83, 2333.29],
1189 + [2282.17, 2263.97, 2253.25, 2286.33],
1190 + [2255.77, 2270.28, 2253.31, 2276.22],
1191 + [2269.31, 2278.4, 2250, 2312.08],
1192 + [2267.29, 2240.02, 2239.21, 2276.05],
1193 + [2244.26, 2257.43, 2232.02, 2261.31],
1194 + [2257.74, 2317.37, 2257.42, 2317.86],
1195 + [2318.21, 2324.24, 2311.6, 2330.81],
1196 + [2321.4, 2328.28, 2314.97, 2332],
1197 + [2334.74, 2326.72, 2319.91, 2344.89],
1198 + [2318.58, 2297.67, 2281.12, 2319.99],
1199 + [2299.38, 2301.26, 2289, 2323.48],
1200 + [2273.55, 2236.3, 2232.91, 2273.55],
1201 + [2238.49, 2236.62, 2228.81, 2246.87],
1202 + [2229.46, 2234.4, 2227.31, 2243.95],
1203 + [2234.9, 2227.74, 2220.44, 2253.42],
1204 + [2232.69, 2225.29, 2217.25, 2241.34],
1205 + [2196.24, 2211.59, 2180.67, 2212.59],
1206 + [2215.47, 2225.77, 2215.47, 2234.73],
1207 + [2224.93, 2226.13, 2212.56, 2233.04],
1208 + [2236.98, 2219.55, 2217.26, 2242.48],
1209 + [2218.09, 2206.78, 2204.44, 2226.26],
1210 + [2199.91, 2181.94, 2177.39, 2204.99],
1211 + [2169.63, 2194.85, 2165.78, 2196.43],
1212 + [2195.03, 2193.8, 2178.47, 2197.51],
1213 + [2181.82, 2197.6, 2175.44, 2206.03],
1214 + [2201.12, 2244.64, 2200.58, 2250.11],
1215 + [2236.4, 2242.17, 2232.26, 2245.12],
1216 + [2242.62, 2184.54, 2182.81, 2242.62],
1217 + [2187.35, 2218.32, 2184.11, 2226.12],
1218 + [2213.19, 2199.31, 2191.85, 2224.63],
1219 + [2203.89, 2177.91, 2173.86, 2210.58],
1220 + [2170.78, 2174.12, 2161.14, 2179.65],
1221 + [2179.05, 2205.5, 2179.05, 2222.81],
1222 + [2212.5, 2231.17, 2212.5, 2236.07],
1223 + [2227.86, 2235.57, 2219.44, 2240.26],
1224 + [2242.39, 2246.3, 2235.42, 2255.21],
1225 + [2246.96, 2232.97, 2221.38, 2247.86],
1226 + [2228.82, 2246.83, 2225.81, 2247.67],
1227 + [2247.68, 2241.92, 2231.36, 2250.85],
1228 + [2238.9, 2217.01, 2205.87, 2239.93],
1229 + [2217.09, 2224.8, 2213.58, 2225.19],
1230 + [2221.34, 2251.81, 2210.77, 2252.87],
1231 + [2249.81, 2282.87, 2248.41, 2288.09],
1232 + [2286.33, 2299.99, 2281.9, 2309.39],
1233 + [2297.11, 2305.11, 2290.12, 2305.3],
1234 + [2303.75, 2302.4, 2292.43, 2314.18],
1235 + [2293.81, 2275.67, 2274.1, 2304.95],
1236 + [2281.45, 2288.53, 2270.25, 2292.59],
1237 + [2286.66, 2293.08, 2283.94, 2301.7],
1238 + [2293.4, 2321.32, 2281.47, 2322.1],
1239 + [2323.54, 2324.02, 2321.17, 2334.33],
1240 + [2316.25, 2317.75, 2310.49, 2325.72],
1241 + [2320.74, 2300.59, 2299.37, 2325.53],
1242 + [2300.21, 2299.25, 2294.11, 2313.43],
1243 + [2297.1, 2272.42, 2264.76, 2297.1],
1244 + [2270.71, 2270.93, 2260.87, 2276.86],
1245 + [2264.43, 2242.11, 2240.07, 2266.69],
1246 + [2242.26, 2210.9, 2205.07, 2250.63],
1247 + [2190.1, 2148.35, 2126.22, 2190.1]
1248 + ]
1249 + }
1250 + ]
1251 + }
1252 +
1253 + this.chartCandle = echarts.init(document.getElementById("candleChart"))
1254 + this.chartCandle.setOption(chartOptions)
1255 + }
1256 + },
1257 + mounted() {
1258 + setTimeout(() => {
1259 + this.initMarquee()
1260 + }, 100)
1261 +
1262 + setTimeout(() => {
1263 + this.initChartWallet()
1264 + }, 500)
1265 +
1266 + setTimeout(() => {
1267 + //this.initChartPrice()
1268 + }, 500)
1269 +
1270 + setTimeout(() => {
1271 + //this.initChartCandle()
1272 + }, 500)
1273 + },
1274 + beforeUnmount() {
1275 + if (this.chartWallet) {
1276 + this.chartWallet.dispose()
1277 + this.chartWallet = null
1278 + }
1279 + if (this.chartPrice) {
1280 + this.chartPrice.dispose()
1281 + this.chartPrice = null
1282 + }
1283 + if (this.chartCandle) {
1284 + this.chartCandle.dispose()
1285 + this.chartCandle = null
1286 + }
1287 + },
1288 + components: { ResizeObserver, Peity }
1289 +})
1290 +</script>
1291 +
1292 +<style lang="scss" scoped>
1293 +@import "../../assets/scss/_variables";
1294 +
1295 +.chart-wallet-box > div {
1296 + margin-left: 1%;
1297 +}
1298 +
1299 +.wallet-box {
1300 + border-right: 2px solid $text-color-primary;
1301 + height: 500px;
1302 +
1303 + .select-wallet {
1304 + background: $text-color-primary;
1305 + color: $background-color;
1306 + height: 70px;
1307 + overflow: hidden;
1308 + position: relative;
1309 + z-index: 1;
1310 +
1311 + .wallet-item {
1312 + background: $text-color-primary;
1313 + color: $background-color;
1314 + height: 70px;
1315 +
1316 + .icon {
1317 + width: 70px;
1318 + line-height: 70px;
1319 + font-size: 35px;
1320 + }
1321 +
1322 + .coin {
1323 + .title {
1324 + font-weight: bold;
1325 + }
1326 + }
1327 +
1328 + .arrow {
1329 + background: transparentize($background-color, 0.9);
1330 + color: transparentize($background-color, 0.8);
1331 + width: 70px;
1332 + line-height: 70px;
1333 + font-size: 40px;
1334 + cursor: pointer;
1335 +
1336 + &:hover {
1337 + background: transparentize($background-color, 0.8);
1338 + color: transparentize($text-color-primary, 0.1);
1339 + }
1340 + }
1341 + }
1342 +
1343 + .wallet-list {
1344 + display: none;
1345 + background: $text-color-primary;
1346 + position: absolute;
1347 + top: 70px;
1348 + left: 0;
1349 + right: 0;
1350 +
1351 + .wallet-item {
1352 + background: transparentize($background-color, 0.9);
1353 + }
1354 + }
1355 +
1356 + &.open {
1357 + overflow: inherit;
1358 +
1359 + .wallet-list {
1360 + display: block;
1361 + }
1362 + }
1363 + }
1364 +
1365 + .content {
1366 + .portfolio {
1367 + padding: 20px;
1368 +
1369 + .price-chart-box {
1370 + width: 60%;
1371 + display: none;
1372 + }
1373 +
1374 + .price-chart {
1375 + background: transparentize($text-color-primary, 0.9);
1376 + position: relative;
1377 + border-radius: 4px;
1378 + }
1379 + }
1380 + .chart-box {
1381 + position: relative;
1382 + min-height: 50px;
1383 +
1384 + .data-range-picker {
1385 + position: absolute;
1386 + top: 0;
1387 + left: 20px;
1388 + background: transparentize($text-color-primary, 0.9);
1389 + padding: 5px 10px;
1390 + cursor: pointer;
1391 + border-radius: 4px;
1392 +
1393 + &:hover {
1394 + background: transparentize($text-color-primary, 0.8);
1395 + }
1396 + }
1397 + .peity {
1398 + display: inherit;
1399 + }
1400 + .labels {
1401 + position: absolute;
1402 + bottom: 0;
1403 + z-index: 1;
1404 + left: 0;
1405 + right: 0;
1406 + font-size: 12px;
1407 + padding-bottom: 5px;
1408 + opacity: 0.6;
1409 + }
1410 + }
1411 + }
1412 +}
1413 +
1414 +.widget {
1415 + height: 200px;
1416 + position: relative;
1417 +
1418 + .widget-header {
1419 + .widget-icon-box {
1420 + background: rgba(0, 0, 0, 0.02);
1421 + border: 1px solid rgba(0, 0, 0, 0.02);
1422 + text-align: center;
1423 + width: 60px;
1424 + padding: 5px;
1425 + }
1426 +
1427 + .widget-title {
1428 + font-weight: bold;
1429 + }
1430 + }
1431 +
1432 + .badge-box {
1433 + .badge {
1434 + //background: rgba(0, 0, 0, .02);
1435 + display: inline-block;
1436 + //padding: 2px 5px;
1437 + //border: 1px solid rgba(0, 0, 0, .02);
1438 + border-radius: 4px;
1439 + font-size: 80%;
1440 + }
1441 + }
1442 +}
1443 +
1444 +.conversion-widget {
1445 + .conversion-title {
1446 + background: $text-color-primary;
1447 + color: $background-color;
1448 + padding: 10px 15px;
1449 + margin: 0;
1450 + border-top-left-radius: 5px;
1451 + border-top-right-radius: 5px;
1452 + }
1453 +
1454 + .conversion-table {
1455 + width: 100%;
1456 +
1457 + thead {
1458 + th {
1459 + opacity: 0.6;
1460 + }
1461 + }
1462 +
1463 + tbody {
1464 + tr {
1465 + td {
1466 + &.tokens {
1467 + i {
1468 + font-size: 20px;
1469 + opacity: 0.4;
1470 + }
1471 + }
1472 + }
1473 + }
1474 + }
1475 + }
1476 +}
1477 +
1478 +.candle-chart-box {
1479 + .zoom-box {
1480 + margin-top: 5px;
1481 + margin-bottom: 5px;
1482 +
1483 + .label {
1484 + background: transparentize($background-color, 0.8);
1485 + padding: 1px 5px;
1486 + font-size: 14px;
1487 + margin: 0 5px;
1488 +
1489 + &.selected {
1490 + background: transparentize($text-color-accent, 0.5);
1491 + }
1492 + }
1493 + }
1494 +}
1495 +
1496 +/*@media (max-width: 768px) {
1497 + .el-row {
1498 + //margin-left: 0 !important;
1499 + //margin-right: 0 !important;
1500 +
1501 + .el-col-24 {
1502 + //padding-left: 0 !important;
1503 + //padding-right: 0 !important;
1504 + }
1505 + }
1506 +}*/
1507 +
1508 +@media (min-width: 1300px) {
1509 + .wallet-box {
1510 + .content {
1511 + .portfolio {
1512 + .price-chart-box {
1513 + display: block;
1514 + }
1515 + }
1516 + }
1517 + }
1518 +}
1519 +
1520 +@media (max-width: 991px) {
1521 + .wallet-box {
1522 + border: none;
1523 + }
1524 + .candle-chart-box {
1525 + .price-box {
1526 + display: none;
1527 + }
1528 + }
1529 +}
1530 +
1531 +@media (max-width: 400px) {
1532 + .wallet-box {
1533 + .select-wallet {
1534 + height: 50px;
1535 +
1536 + .wallet-item {
1537 + height: 50px;
1538 +
1539 + .icon {
1540 + width: 50px;
1541 + line-height: 50px;
1542 + font-size: 30px;
1543 + }
1544 +
1545 + .coin {
1546 + .title {
1547 + font-size: 16px;
1548 +
1549 + .cod {
1550 + display: none;
1551 + }
1552 + }
1553 + .balance {
1554 + display: none;
1555 + }
1556 + }
1557 +
1558 + .arrow {
1559 + width: 50px;
1560 + line-height: 50px;
1561 + font-size: 40px;
1562 + }
1563 + }
1564 +
1565 + .wallet-list {
1566 + top: 50px;
1567 + }
1568 + }
1569 + }
1570 +
1571 + .conversion-widget {
1572 + .conversion-table {
1573 + font-size: 13px;
1574 +
1575 + tbody {
1576 + tr {
1577 + td {
1578 + &.tokens {
1579 + i {
1580 + font-size: 14px;
1581 + }
1582 + }
1583 + }
1584 + }
1585 + }
1586 + }
1587 + }
1588 +}
1589 +</style>
1590 +
1591 +<style lang="scss">
1592 +@import "../../assets/scss/_variables";
1593 +
1594 +.page-crypto-dashboard {
1595 + #crypto-banner {
1596 + margin-bottom: 0px;
1597 + padding-top: 10px;
1598 + padding-bottom: 40px;
1599 + box-shadow: 0px -30px 0px 0px $background-color inset;
1600 + //background: transparentize($text-color-primary, 0.9);
1601 + box-sizing: border-box;
1602 +
1603 + &.marqueeInfinite {
1604 + display: -webkit-box;
1605 + display: -ms-flexbox;
1606 + display: flex;
1607 + overflow: hidden;
1608 + white-space: nowrap;
1609 + }
1610 +
1611 + &.marqueeInfinite > * {
1612 + -ms-flex-negative: 0;
1613 + flex-shrink: 0;
1614 + width: -moz-max-content;
1615 + -webkit-backface-visibility: hidden;
1616 + backface-visibility: hidden;
1617 + will-change: transform;
1618 + }
1619 +
1620 + &.marqueeInfinite > * > * {
1621 + -ms-flex-negative: 0;
1622 + flex-shrink: 0;
1623 + display: inline-block;
1624 + }
1625 +
1626 + ul,
1627 + li {
1628 + list-style: none;
1629 + padding: 0;
1630 + margin: 0;
1631 + }
1632 + li {
1633 + display: inline-block;
1634 + margin-right: 30px;
1635 + //border-bottom: 2px solid $text-color-primary;
1636 +
1637 + i {
1638 + margin-right: 7px;
1639 + }
1640 + }
1641 + }
1642 +
1643 + .wallet-box {
1644 + .content {
1645 + .chart-box {
1646 + .peity {
1647 + display: inherit;
1648 + }
1649 + }
1650 + }
1651 + }
1652 +
1653 + .vb-content {
1654 + padding: 0 20px;
1655 + box-sizing: border-box !important;
1656 + margin-top: -5px;
1657 + margin-left: -20px;
1658 + margin-right: -20px;
1659 + height: calc(100% + 15px) !important;
1660 + width: calc(100% + 40px) !important;
1661 + }
1662 +}
1663 +
1664 +@media (max-width: 768px) {
1665 + .page-crypto-dashboard {
1666 + .vb-content {
1667 + padding: 0 5px !important;
1668 + margin: -5px;
1669 + width: calc(100% + 10px) !important;
1670 + }
1671 + }
1672 +}
1673 +</style>
src/views/apps/Dashboard.vue new
+941
@@ -0,0 +1,941 @@
1 +<template>
2 + <el-scrollbar class="page-dashboard">
3 + <resize-observer @notify="__resizeHanlder" />
4 +
5 + <el-row class="mt-0" :gutter="30">
6 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
7 + <div class="card-base card-shadow--medium mb-30 widget small-widget" v-loading="!asyncComponent">
8 + <div class="widget-hdr ph-20 pt-20">
9 + <div class="flex justify-center align-center">
10 + <div class="widget-icon-box mr-20 animate__animated animate__fadeInRight">
11 + <i class="widget-icon mdi mdi-account-multiple accent-text fs-30"></i>
12 + <div class="badge-box">
13 + <span class="badge">
14 + <i class="mdi mdi-trending-up success-text mr-10"></i>
15 + <strong class="accent-text">16%</strong>
16 + </span>
17 + </div>
18 + </div>
19 + <div class="widget-info box grow text-truncate animate__animated animate__fadeInLeft">
20 + <div class="o-050 widget-title text-truncate pt-5 pb-10">Users</div>
21 + <h2 class="m-0 text-truncate">4,523</h2>
22 + </div>
23 + </div>
24 + </div>
25 +
26 + <component
27 + :is="asyncComponent"
28 + :type="'line'"
29 + :options="{ width: '100%', height: 80 }"
30 + :data="[1, 3, 2, 4, 4, 9, 3, 4, 6, 5, 4, 6, 9, 8, 11, 12, 13, 12, 12, 14].toString()"
31 + />
32 + </div>
33 + </el-col>
34 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
35 + <div class="card-base card-shadow--medium mb-30 widget small-widget" v-loading="!asyncComponent">
36 + <div class="widget-hdr ph-20 pt-20">
37 + <div class="flex justify-center align-center">
38 + <div class="widget-icon-box mr-20 animate__animated animate__fadeInRight">
39 + <i class="widget-icon mdi mdi-eye accent-text fs-30"></i>
40 + <div class="badge-box">
41 + <span class="badge">
42 + <i class="mdi mdi-trending-up success-text mr-10"></i>
43 + <strong class="accent-text">11%</strong>
44 + </span>
45 + </div>
46 + </div>
47 + <div class="widget-info box grow text-truncate animate__animated animate__fadeInLeft">
48 + <div class="o-050 widget-title text-truncate pt-5 pb-10">Views</div>
49 + <h2 class="m-0 text-truncate">2,523</h2>
50 + </div>
51 + </div>
52 + </div>
53 +
54 + <component
55 + :is="asyncComponent"
56 + :type="'bar'"
57 + :options="{ width: '100%', height: 80, fill: ['#c6d9fd'] }"
58 + :data="[1, 3, 2, 4, 4, 9, 3, 4, 6, 5, 4, 6, 9, 8, 7, 6, 5, 12, 10, 9].toString()"
59 + />
60 + </div>
61 + </el-col>
62 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
63 + <div class="card-base card-shadow--medium mb-30 widget small-widget" v-loading="!asyncComponent">
64 + <div class="widget-hdr ph-20 pt-20">
65 + <div class="flex justify-center align-center">
66 + <div class="widget-icon-box mr-20 animate__animated animate__fadeInRight">
67 + <i class="widget-icon mdi mdi-account-convert success-text fs-30"></i>
68 + <div class="badge-box">
69 + <span class="badge">
70 + <i class="mdi mdi-trending-neutral info-text mr-10"></i>
71 + <strong class="success-text">1%</strong>
72 + </span>
73 + </div>
74 + </div>
75 + <div class="widget-info box grow text-truncate animate__animated animate__fadeInLeft">
76 + <div class="o-050 widget-title text-truncate pt-5 pb-10">Conversion</div>
77 + <h2 class="m-0 text-truncate">9,832</h2>
78 + </div>
79 + </div>
80 + </div>
81 +
82 + <component
83 + :is="asyncComponent"
84 + :type="'line'"
85 + :options="{ width: '100%', height: 80, fill: '#56f19a', stroke: '#67C23A' }"
86 + :data="[10, 7, 8, 5, 4, 9, 3, 4, 6, 5, 4, 4, 2, 4, 5, 9, 13, 12, 12, 14].toString()"
87 + />
88 + </div>
89 + </el-col>
90 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
91 + <div class="card-base card-shadow--medium mb-30 widget small-widget" v-loading="!asyncComponent">
92 + <div class="widget-hdr ph-20 pt-20">
93 + <div class="flex justify-center align-center">
94 + <div class="widget-icon-box mr-20 animate__animated animate__fadeInRight">
95 + <i class="widget-icon mdi mdi-cash-multiple success-text fs-30"></i>
96 + <div class="badge-box">
97 + <span class="badge">
98 + <i class="mdi mdi-trending-neutral info-text mr-10"></i>
99 + <strong class="success-text">0%</strong>
100 + </span>
101 + </div>
102 + </div>
103 + <div class="widget-info box grow text-truncate animate__animated animate__fadeInLeft">
104 + <div class="o-050 widget-title text-truncate pt-5 pb-10">Revenue</div>
105 + <h2 class="m-0 text-truncate">6,364</h2>
106 + </div>
107 + </div>
108 + </div>
109 +
110 + <component
111 + :is="asyncComponent"
112 + :type="'bar'"
113 + :options="{ width: '100%', height: 80, fill: ['#56f19a'] }"
114 + :data="[6, 5, 4, 3, 5, 3, 4, 5, 6, 5, 4, 2, 3, 8, 7, 6, 5, 2, 1, 5].toString()"
115 + />
116 + </div>
117 + </el-col>
118 + <!--<el-col :xs="24" :sm="12" :md="8" :lg="4" :xl="4">
119 + <div class="card-base card-shadow--medium mb-30 widget small-widget" v-loading="!asyncComponent">
120 +
121 + <div class="widget-hdr ph-20 pt-20">
122 + <div class="flex justify-center align-center">
123 + <div class="widget-icon-box mr-20 animate__animated animate__fadeInRight">
124 + <i class="widget-icon mdi mdi-message-text-outline danger-text fs-30"></i>
125 + <div class="badge-box">
126 + <span class="badge"><i class="mdi mdi-trending-down danger-text mr-10"></i><strong class="danger-text">23%</strong></span>
127 + </div>
128 + </div>
129 + <div class="widget-info box grow text-truncate animate__animated animate__fadeInLeft">
130 + <div class="o-050 widget-title text-truncate pt-5 pb-10">Messages</div>
131 + <h2 class="m-0 text-truncate">52,628</h2>
132 + </div>
133 + </div>
134 + </div>
135 +
136 + <component :is="asyncComponent" :type="'line'" :options='{ width: "100%", height: 80, fill: "#EF5F8B", stroke: "#CF2256" }' :data="[9, 7, 5, 4, 4, 8, 3, 4, 6, 5, 4, 6, 5, 7, 3, 2, 4, 3, 2, 1].toString()"/>
137 + </div>
138 + </el-col>
139 + <el-col :xs="24" :sm="12" :md="8" :lg="4" :xl="4">
140 + <div class="card-base card-shadow--medium mb-30 widget small-widget" v-loading="!asyncComponent">
141 +
142 + <div class="widget-hdr ph-20 pt-20">
143 + <div class="flex justify-center align-center">
144 + <div class="widget-icon-box mr-20 animate__animated animate__fadeInRight">
145 + <i class="widget-icon mdi mdi-cart danger-text fs-30"></i>
146 + <div class="badge-box">
147 + <span class="badge"><i class="mdi mdi-trending-down danger-text mr-10"></i><strong class="danger-text">9%</strong></span>
148 + </div>
149 + </div>
150 + <div class="widget-info box grow text-truncate animate__animated animate__fadeInLeft">
151 + <div class="o-050 widget-title text-truncate pt-5 pb-10">Purchases</div>
152 + <h2 class="m-0 text-truncate">3,346</h2>
153 + </div>
154 + </div>
155 + </div>
156 +
157 + <component :is="asyncComponent" :type="'bar'" :options='{ width: "100%", height: 80, fill: ["#EF5F8B"] }' :data="[1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4, 5, 4, 3, 2, 1, 2, 3, 4].toString()"/>
158 + </div>
159 + </el-col>-->
160 + </el-row>
161 +
162 + <el-row class="mt-0" :gutter="30">
163 + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
164 + <div class="card-base card-shadow--medium bg-accent p-20" style="height: 400px" v-loading="!asyncChart1">
165 + <h1 class="white-text mv-0 animate__animated animate__fadeInDown">Statistics</h1>
166 + <h3 class="mt-0 mb-40 white-text o-050 animate__animated animate__slideInUp">revenue</h3>
167 + <div id="chart1" style="height: 300px; width: 100%"></div>
168 + </div>
169 + </el-col>
170 + </el-row>
171 +
172 + <el-row class="mt-30" :gutter="30">
173 + <el-col :xs="24" :sm="12" :md="14" :lg="16" :xl="18">
174 + <div class="card-base card-shadow--medium mb-30" style="height: 410px">
175 + <div class="p-20 flex justify-space-between">
176 + <div>
177 + <h2 class="mv-0 animate__animated animate__fadeInDown">Progress</h2>
178 + <h4 class="mt-5 mb-0 o-050 animate__animated animate__slideInUp">This month</h4>
179 + </div>
180 + <div class="radio-switcher">
181 + <el-radio-group v-model="radio1">
182 + <el-radio-button label="Day"></el-radio-button>
183 + <el-radio-button label="Week"></el-radio-button>
184 + <el-radio-button label="Month"></el-radio-button>
185 + </el-radio-group>
186 + </div>
187 + </div>
188 + <el-scrollbar>
189 + <table class="styled striped">
190 + <thead>
191 + <tr>
192 + <th></th>
193 + <th style="min-width: 85px">First name</th>
194 + <th style="min-width: 80px">Last name</th>
195 + <th style="min-width: 130px">Activity</th>
196 + <th style="min-width: 195px">Progress</th>
197 + </tr>
198 + </thead>
199 + <tbody>
200 + <tr v-for="item of list" :key="item.id">
201 + <td class="text-right">
202 + <span
203 + class="status-indicator ml-10 pulse"
204 + :class="{
205 + active: item.status === 'active',
206 + positive: item.status === 'positive',
207 + intermediary: item.status === 'intermediary',
208 + negative: item.status === 'negative'
209 + }"
210 + ></span>
211 + </td>
212 + <td style="min-width: 80px">{{ item.first_name }}</td>
213 + <td style="min-width: 80px">{{ item.last_name }}</td>
214 + <td style="min-width: 130px">
215 + <peity :options="{ fill: ['#a4bbe0', '#5f8fdf'] }" :type="'donut'" :data="'1/5'"></peity>
216 + <peity :options="{ fill: ['#a4bbe0', '#5f8fdf'] }" :type="'donut'" :data="'226/360'"></peity>
217 + <peity :options="{ fill: ['#a4bbe0', '#5f8fdf'] }" :type="'donut'" :data="'0.52/1.561'"></peity>
218 + <peity :options="{ fill: ['#a4bbe0', '#5f8fdf'] }" :type="'donut'" :data="'0.52/1.561'"></peity>
219 + <peity :options="{ fill: ['#a4bbe0', '#5f8fdf'] }" :type="'donut'" :data="'0.52/1.561'"></peity>
220 + </td>
221 + <td style="min-width: 195px">
222 + <el-progress
223 + :percentage="item.progress"
224 + :status="item.status === 'positive' ? 'success' : null"
225 + :color="
226 + item.status === 'negative' ? '#ff4d4d' : item.status === 'intermediary' ? '#ffaa00' : ''
227 + "
228 + ></el-progress>
229 + </td>
230 + </tr>
231 + </tbody>
232 + </table>
233 + </el-scrollbar>
234 + </div>
235 + </el-col>
236 + <el-col :xs="24" :sm="12" :md="10" :lg="8" :xl="6">
237 + <div
238 + class="card-base card-shadow--medium mb-30 bg-primary p-20"
239 + style="height: 410px; box-sizing: border-box"
240 + v-loading="!asyncChart2"
241 + >
242 + <div id="chart2" style="height: 350px; width: 80%; margin-left: 10%"></div>
243 + </div>
244 + </el-col>
245 + </el-row>
246 +
247 + <el-row class="mt-0" :gutter="30">
248 + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
249 + <div class="card-base card-shadow--medium p-20 mb-30" style="height: 295px">
250 + <div class="flex justify-space-between">
251 + <div>
252 + <h2 class="mv-0 animate__animated animate__fadeInDown">Report</h2>
253 + <h4 class="mt-5 mb-40 o-050 animate__animated animate__slideInUp">This week</h4>
254 + </div>
255 + <div class="radio-switcher">
256 + <el-radio-group v-model="radio2">
257 + <el-radio-button label="Day"></el-radio-button>
258 + <el-radio-button label="Week"></el-radio-button>
259 + <el-radio-button label="Month"></el-radio-button>
260 + </el-radio-group>
261 + </div>
262 + </div>
263 +
264 + <h4 class="mb-0 mt-0">New Users</h4>
265 + <el-progress :percentage="100" status="success"></el-progress>
266 + <h4 class="mb-0">Views</h4>
267 + <el-progress :percentage="70"></el-progress>
268 + <h4 class="mb-0">Conversions</h4>
269 + <el-progress :percentage="20" status="exception"></el-progress>
270 + </div>
271 + </el-col>
272 + </el-row>
273 + </el-scrollbar>
274 +</template>
275 +
276 +<script>
277 +import _ from "lodash"
278 +import * as echarts from "echarts"
279 +import Peity from "../../components/vue-peity/Peity.vue"
280 +import ResizeObserver from "../../components/vue-resize/ResizeObserver.vue"
281 +import { defineComponent } from "@vue/runtime-core"
282 +
283 +export default defineComponent({
284 + name: "Dashboard",
285 + data() {
286 + return {
287 + asyncComponent: "peity",
288 + asyncChart1: true,
289 + asyncChart2: true,
290 + chart1: null,
291 + chart2: null,
292 + resized: false,
293 + list: [
294 + {
295 + activity: 111,
296 + progress: 70,
297 + status: "active",
298 + id: 1,
299 + first_name: "Fidela",
300 + last_name: "MacLaverty",
301 + email: "fmaclaverty0@scribd.com",
302 + gender: "Female",
303 + ip_address: "165.9.197.163"
304 + },
305 + {
306 + activity: 111,
307 + progress: 55,
308 + status: "intermediary",
309 + id: 2,
310 + first_name: "Garrard",
311 + last_name: "Inge",
312 + email: "ginge1@51.la",
313 + gender: "Male",
314 + ip_address: "138.87.225.97"
315 + },
316 + {
317 + activity: 111,
318 + progress: 100,
319 + status: "positive",
320 + id: 3,
321 + first_name: "Clayborn",
322 + last_name: "Blencoe",
323 + email: "cblencoe2@cbc.ca",
324 + gender: "Male",
325 + ip_address: "237.146.154.222"
326 + },
327 + {
328 + activity: 111,
329 + progress: 12,
330 + status: "negative",
331 + id: 6,
332 + first_name: "Elna",
333 + last_name: "Deboick",
334 + email: "edeboick5@4shared.com",
335 + gender: "Female",
336 + ip_address: "53.209.210.199"
337 + },
338 + {
339 + activity: 111,
340 + progress: 0,
341 + status: "",
342 + id: 8,
343 + first_name: "Sheffie",
344 + last_name: "Fellgett",
345 + email: "sfellgett7@ow.ly",
346 + gender: "Male",
347 + ip_address: "219.29.191.217"
348 + }
349 + //{"activity":111, "progress": 68, "status":"active", "id":4,"first_name":"Reinaldos","last_name":"Briiginshaw","email":"rbriiginshaw3@mashable.com","gender":"Male","ip_address":"35.148.222.21"},
350 + //{"activity":111, "progress": 43, "status":"intermediary", "id":5,"first_name":"Abigael","last_name":"Richmond","email":"arichmond4@shinystat.com","gender":"Female","ip_address":"135.221.192.85"},
351 + //{"activity":111, "progress": 100, "status":"positive", "id":7,"first_name":"Lanna","last_name":"Prentice","email":"lprentice6@oracle.com","gender":"Female","ip_address":"198.34.29.215"},
352 + //{"activity":111, "progress": 88, "status":"active", "id":9,"first_name":"Mamie","last_name":"Calkin","email":"mcalkin8@oakley.com","gender":"Female","ip_address":"69.0.235.44"},
353 + //{"activity":111, "progress": 9, "status":"negative", "id":10,"first_name":"Saudra","last_name":"Dunniom","email":"sdunniom9@ameblo.jp","gender":"Female","ip_address":"182.157.218.101"}
354 + ],
355 + radio1: "Month",
356 + radio2: "Week",
357 + data3: {
358 + labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul"],
359 + datasets: [
360 + {
361 + label: "Visitors",
362 + backgroundColor: "#fff",
363 + stack: "Stack 0",
364 + data: [23, 41, 34, 62, 46, 57, 68]
365 + }
366 + ]
367 + },
368 + options3: {
369 + maintainAspectRatio: false,
370 + title: {
371 + display: false,
372 + text: "Chart.js Bar Chart - Stacked"
373 + },
374 + legend: {
375 + display: false
376 + },
377 + tooltips: {
378 + mode: "index",
379 + intersect: false
380 + },
381 + responsive: true,
382 + scales: {
383 + xAxes: [
384 + {
385 + stacked: true,
386 + gridLines: {
387 + display: false,
388 + drawBorder: false
389 + },
390 + ticks: {
391 + fontColor: "#fff"
392 + }
393 + }
394 + ],
395 + yAxes: [
396 + {
397 + stacked: true,
398 + gridLines: {
399 + display: false,
400 + drawBorder: false
401 + },
402 + ticks: {
403 + display: false
404 + }
405 + }
406 + ]
407 + }
408 + }
409 + }
410 + },
411 + computed: {
412 + smallWidget() {
413 + return this.dashboardWidth >= 970 && this.dashboardWidth <= 1412 && this.windowWidth >= 1200
414 + }
415 + },
416 + methods: {
417 + __resizeHanlder: _.throttle(function (e) {
418 + if (this.resized) {
419 + this.asyncComponent = null
420 + this.removePeity()
421 + setTimeout(() => {
422 + this.asyncComponent = "peity"
423 + }, 1000)
424 +
425 + this.asyncChart1 = false
426 + this.asyncChart2 = false
427 + setTimeout(() => {
428 + this.asyncChart1 = true
429 + this.resizeChart1()
430 + }, 1000)
431 + setTimeout(() => {
432 + this.asyncChart2 = true
433 + this.resizeChart2()
434 + }, 2500)
435 + }
436 + this.resized = true
437 + }, 700),
438 + removePeity() {
439 + const peityEl = document.querySelectorAll(".widget .peity") //.forEach((el)=>{el.remove()})
440 + //ie fix
441 + for (let i = 0; i < peityEl.length; i++) {
442 + peityEl[i].parentNode.removeChild(peityEl[i])
443 + }
444 + },
445 + initChart1() {
446 + this.chart1 = echarts.init(document.getElementById("chart1"))
447 +
448 + // Generate data
449 + let category = []
450 + let dottedBase = +new Date()
451 + let lineData = []
452 + let barData = []
453 +
454 + for (let i = 0; i < 6; i++) {
455 + let date = new Date((dottedBase += 3600 * 24 * 1000))
456 + category.push([date.getFullYear(), date.getMonth() + 1, date.getDate()].join("-"))
457 + let b = Math.random() * 200
458 + let d = Math.random() * 200
459 + barData.push(parseInt(b))
460 + lineData.push(parseInt(d + b))
461 + }
462 +
463 + this.chart1.setOption({
464 + //backgroundColor: '#0f375f',
465 + coordinateSystem: {},
466 + grid: {
467 + show: false,
468 + left: "20px",
469 + right: "50px",
470 + bottom: "20px",
471 + top: "20px",
472 + containLabel: true
473 + },
474 + tooltip: {
475 + trigger: "axis",
476 + axisPointer: {
477 + type: "cross"
478 + }
479 + },
480 + legend: {
481 + show: false,
482 + data: ["line", "bar"],
483 + textStyle: {
484 + color: "#ccc"
485 + }
486 + },
487 + xAxis: {
488 + data: category,
489 + boundaryGap: false,
490 + axisLine: {
491 + lineStyle: {
492 + color: "rgba(255,255,255,0.5)"
493 + }
494 + }
495 + },
496 + yAxis: {
497 + splitLine: { show: false },
498 + axisLine: {
499 + lineStyle: {
500 + color: "rgba(255,255,255,0.5)"
501 + }
502 + }
503 + },
504 + series: [
505 + {
506 + name: "Data A",
507 + type: "line",
508 + smooth: true,
509 + showAllSymbol: true,
510 + symbol: "emptyCircle",
511 + symbolSize: 10,
512 + lineStyle: {
513 + color: "#fff"
514 + },
515 + itemStyle: {
516 + color: "#fff",
517 + borderColor: "#5f8fdf",
518 + borderWidth: 3
519 + },
520 + areaStyle: {
521 + color: "rgba(255,255,255,0.2)"
522 + },
523 + animationDuration: 2800,
524 + animationEasing: "cubicInOut",
525 + data: lineData
526 + },
527 + {
528 + name: "Data B",
529 + type: "bar",
530 + barWidth: 10,
531 + itemStyle: {
532 + borderRadius: 5,
533 + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
534 + { offset: 0, color: "#fff" },
535 + { offset: 1, color: "rgba(255,255,255,0)" }
536 + ])
537 + },
538 + data: barData
539 + },
540 + /* {
541 + name: 'line',
542 + type: 'bar',
543 + barGap: '-100%',
544 + barWidth: 10,
545 + itemStyle: {
546 +
547 + color: new echarts.graphic.LinearGradient(
548 + 0, 0, 0, 1,
549 + [
550 + {offset: 0, color: 'rgba(20,200,212,0.5)'},
551 + {offset: 0.2, color: 'rgba(20,200,212,0.2)'},
552 + {offset: 1, color: 'rgba(20,200,212,0)'}
553 + ]
554 + )
555 + },
556 + z: -12,
557 + data: lineData
558 + },*/
559 +
560 + {
561 + name: "Data C",
562 + type: "pictorialBar",
563 + symbol: "rect",
564 + itemStyle: {
565 + color: "rgba(255,255,255,0.1)"
566 + },
567 + symbolRepeat: true,
568 + symbolSize: [12, 4],
569 + symbolMargin: 1,
570 + z: -10,
571 + data: lineData
572 + }
573 + ]
574 + })
575 + },
576 + initChart2() {
577 + this.chart2 = echarts.init(document.getElementById("chart2"))
578 +
579 + var dataBJ = [
580 + [55, 9, 56, 0.46, 18, 6, 1],
581 + [25, 11, 21, 0.65, 34, 9, 2],
582 + [56, 7, 63, 0.3, 14, 5, 3],
583 + [33, 7, 29, 0.33, 16, 6, 4],
584 + [42, 24, 44, 0.76, 40, 16, 5],
585 + [82, 58, 90, 1.77, 68, 33, 6],
586 + [74, 49, 77, 1.46, 48, 27, 7],
587 + [78, 55, 80, 1.29, 59, 29, 8],
588 + [267, 216, 280, 4.8, 108, 64, 9],
589 + [185, 127, 216, 2.52, 61, 27, 10],
590 + [39, 19, 38, 0.57, 31, 15, 11],
591 + [41, 11, 40, 0.43, 21, 7, 12],
592 + [64, 38, 74, 1.04, 46, 22, 13],
593 + [108, 79, 120, 1.7, 75, 41, 14],
594 + [108, 63, 116, 1.48, 44, 26, 15],
595 + [33, 6, 29, 0.34, 13, 5, 16],
596 + [94, 66, 110, 1.54, 62, 31, 17],
597 + [186, 142, 192, 3.88, 93, 79, 18],
598 + [57, 31, 54, 0.96, 32, 14, 19],
599 + [22, 8, 17, 0.48, 23, 10, 20],
600 + [39, 15, 36, 0.61, 29, 13, 21],
601 + [94, 69, 114, 2.08, 73, 39, 22],
602 + [99, 73, 110, 2.43, 76, 48, 23],
603 + [31, 12, 30, 0.5, 32, 16, 24],
604 + [42, 27, 43, 1, 53, 22, 25],
605 + [154, 117, 157, 3.05, 92, 58, 26],
606 + [234, 185, 230, 4.09, 123, 69, 27],
607 + [160, 120, 186, 2.77, 91, 50, 28],
608 + [134, 96, 165, 2.76, 83, 41, 29],
609 + [52, 24, 60, 1.03, 50, 21, 30],
610 + [46, 5, 49, 0.28, 10, 6, 31]
611 + ]
612 +
613 + var dataGZ = [
614 + [26, 37, 27, 1.163, 27, 13, 1],
615 + [85, 62, 71, 1.195, 60, 8, 2],
616 + [78, 38, 74, 1.363, 37, 7, 3],
617 + [21, 21, 36, 0.634, 40, 9, 4],
618 + [41, 42, 46, 0.915, 81, 13, 5],
619 + [56, 52, 69, 1.067, 92, 16, 6],
620 + [64, 30, 28, 0.924, 51, 2, 7],
621 + [55, 48, 74, 1.236, 75, 26, 8],
622 + [76, 85, 113, 1.237, 114, 27, 9],
623 + [91, 81, 104, 1.041, 56, 40, 10],
624 + [84, 39, 60, 0.964, 25, 11, 11],
625 + [64, 51, 101, 0.862, 58, 23, 12],
626 + [70, 69, 120, 1.198, 65, 36, 13],
627 + [77, 105, 178, 2.549, 64, 16, 14],
628 + [109, 68, 87, 0.996, 74, 29, 15],
629 + [73, 68, 97, 0.905, 51, 34, 16],
630 + [54, 27, 47, 0.592, 53, 12, 17],
631 + [51, 61, 97, 0.811, 65, 19, 18],
632 + [91, 71, 121, 1.374, 43, 18, 19],
633 + [73, 102, 182, 2.787, 44, 19, 20],
634 + [73, 50, 76, 0.717, 31, 20, 21],
635 + [84, 94, 140, 2.238, 68, 18, 22],
636 + [93, 77, 104, 1.165, 53, 7, 23],
637 + [99, 130, 227, 3.97, 55, 15, 24],
638 + [146, 84, 139, 1.094, 40, 17, 25],
639 + [113, 108, 137, 1.481, 48, 15, 26],
640 + [81, 48, 62, 1.619, 26, 3, 27],
641 + [56, 48, 68, 1.336, 37, 9, 28],
642 + [82, 92, 174, 3.29, 0, 13, 29],
643 + [106, 116, 188, 3.628, 101, 16, 30],
644 + [118, 50, 0, 1.383, 76, 11, 31]
645 + ]
646 +
647 + var dataSH = [
648 + [91, 45, 125, 0.82, 34, 23, 1],
649 + [65, 27, 78, 0.86, 45, 29, 2],
650 + [83, 60, 84, 1.09, 73, 27, 3],
651 + [109, 81, 121, 1.28, 68, 51, 4],
652 + [106, 77, 114, 1.07, 55, 51, 5],
653 + [109, 81, 121, 1.28, 68, 51, 6],
654 + [106, 77, 114, 1.07, 55, 51, 7],
655 + [89, 65, 78, 0.86, 51, 26, 8],
656 + [53, 33, 47, 0.64, 50, 17, 9],
657 + [80, 55, 80, 1.01, 75, 24, 10],
658 + [117, 81, 124, 1.03, 45, 24, 11],
659 + [99, 71, 142, 1.1, 62, 42, 12],
660 + [95, 69, 130, 1.28, 74, 50, 13],
661 + [116, 87, 131, 1.47, 84, 40, 14],
662 + [108, 80, 121, 1.3, 85, 37, 15],
663 + [134, 83, 167, 1.16, 57, 43, 16],
664 + [79, 43, 107, 1.05, 59, 37, 17],
665 + [71, 46, 89, 0.86, 64, 25, 18],
666 + [97, 71, 113, 1.17, 88, 31, 19],
667 + [84, 57, 91, 0.85, 55, 31, 20],
668 + [87, 63, 101, 0.9, 56, 41, 21],
669 + [104, 77, 119, 1.09, 73, 48, 22],
670 + [87, 62, 100, 1, 72, 28, 23],
671 + [168, 128, 172, 1.49, 97, 56, 24],
672 + [65, 45, 51, 0.74, 39, 17, 25],
673 + [39, 24, 38, 0.61, 47, 17, 26],
674 + [39, 24, 39, 0.59, 50, 19, 27],
675 + [93, 68, 96, 1.05, 79, 29, 28],
676 + [188, 143, 197, 1.66, 99, 51, 29],
677 + [174, 131, 174, 1.55, 108, 50, 30],
678 + [187, 143, 201, 1.39, 89, 53, 31]
679 + ]
680 +
681 + var lineStyle = {
682 + width: 1,
683 + opacity: 0.5
684 + }
685 +
686 + this.chart2.setOption({
687 + legend: {
688 + bottom: 0,
689 + data: ["Data 1", "Data 2"],
690 + itemGap: 20,
691 + textStyle: {
692 + color: "#fff",
693 + fontSize: 14
694 + },
695 + selectedMode: "single"
696 + },
697 + grid: {
698 + height: "350px"
699 + },
700 + /*visualMap: {
701 + show: true,
702 + min: 0,
703 + max: 20,
704 + dimension: 6,
705 + inRange: {
706 + colorLightness: [0.5, 0.8]
707 + }
708 + },*/
709 + radar: {
710 + indicator: [
711 + { name: "AQI", max: 250 },
712 + { name: "PM2.5", max: 250 },
713 + { name: "PM10", max: 250 },
714 + { name: "CO", max: 5 },
715 + { name: "NO2", max: 100 },
716 + { name: "SO2", max: 100 }
717 + ],
718 + shape: "circle",
719 + radius: "60%",
720 + splitNumber: 5,
721 + axisName: {
722 + color: "rgb(238, 197, 102)"
723 + },
724 + splitLine: {
725 + lineStyle: {
726 + color: [
727 + "rgba(238, 197, 102, 0.1)",
728 + "rgba(238, 197, 102, 0.2)",
729 + "rgba(238, 197, 102, 0.4)",
730 + "rgba(238, 197, 102, 0.6)",
731 + "rgba(238, 197, 102, 0.8)",
732 + "rgba(238, 197, 102, 1)"
733 + ].reverse()
734 + }
735 + },
736 + splitArea: {
737 + show: false
738 + },
739 + axisLine: {
740 + lineStyle: {
741 + color: "rgba(238, 197, 102, 0.5)"
742 + }
743 + }
744 + },
745 + series: [
746 + {
747 + name: "Data 1",
748 + type: "radar",
749 + lineStyle: lineStyle,
750 + data: dataBJ,
751 + symbol: "none",
752 + itemStyle: {
753 + color: "#F9713C"
754 + },
755 + areaStyle: {
756 + opacity: 0.1
757 + }
758 + },
759 + {
760 + name: "Data 2",
761 + type: "radar",
762 + lineStyle: lineStyle,
763 + data: dataSH,
764 + symbol: "none",
765 + itemStyle: {
766 + color: "#B3E4A1"
767 + },
768 + areaStyle: {
769 + opacity: 0.05
770 + }
771 + }
772 + /*{
773 + name: 'Data 3',
774 + type: 'radar',
775 + lineStyle: lineStyle,
776 + data: dataGZ,
777 + symbol: 'none',
778 + itemStyle: {
779 +
780 + color: 'rgb(238, 197, 102)'
781 +
782 + },
783 + areaStyle: {
784 +
785 + opacity: 0.05
786 +
787 + }
788 + }*/
789 + ]
790 + })
791 + },
792 + destroyChart1() {
793 + if (this.chart1) {
794 + this.chart1.dispose()
795 + this.chart1 = null
796 + }
797 + },
798 + destroyChart2() {
799 + if (this.chart2) {
800 + this.chart2.dispose()
801 + this.chart2 = null
802 + }
803 + },
804 + resizeChart1() {
805 + if (this.chart1) {
806 + this.destroyChart1()
807 + this.initChart1()
808 + //this.chart1.resize()
809 + }
810 + },
811 + resizeChart2() {
812 + if (this.chart2) {
813 + this.chart2.resize()
814 + }
815 + }
816 + },
817 + mounted() {
818 + this.initChart1()
819 + this.initChart2()
820 + },
821 + beforeUnmount() {
822 + this.destroyChart1()
823 + this.destroyChart2()
824 + },
825 + components: { Peity, ResizeObserver }
826 +})
827 +</script>
828 +
829 +<style lang="scss" scoped>
830 +@import "../../assets/scss/_variables";
831 +
832 +.widget {
833 + height: 200px;
834 + position: relative;
835 +
836 + .widget-hdr {
837 + .widget-icon-box {
838 + background: rgba(0, 0, 0, 0.02);
839 + border: 1px solid rgba(0, 0, 0, 0.02);
840 + border-radius: 4px;
841 + text-align: center;
842 + width: 60px;
843 + padding: 5px;
844 + }
845 +
846 + .widget-title {
847 + font-weight: bold;
848 + }
849 + }
850 +
851 + .badge-box {
852 + .badge {
853 + //background: rgba(0, 0, 0, .02);
854 + display: inline-block;
855 + //padding: 2px 5px;
856 + //border: 1px solid rgba(0, 0, 0, .02);
857 + border-radius: 4px;
858 + font-size: 80%;
859 + }
860 + }
861 +}
862 +
863 +/*@media (max-width: 768px) {
864 + .el-row {
865 + //margin-left: 0 !important;
866 + //margin-right: 0 !important;
867 +
868 + .el-col-24 {
869 + //padding-left: 0 !important;
870 + //padding-right: 0 !important;
871 + }
872 + }
873 +}*/
874 +
875 +/*@media (min-width: 1200px) and (max-width: 1850px) {
876 + .widget {
877 + .widget-hdr {
878 + .widget-icon-box {
879 + display: none;
880 + }
881 + }
882 + }
883 +}*/
884 +@media (min-width: 768px) and (max-width: 1040px) {
885 + .radio-switcher {
886 + display: none;
887 + }
888 +
889 + .widget {
890 + .widget-hdr {
891 + .widget-icon-box {
892 + display: none;
893 + }
894 + }
895 + }
896 +}
897 +@media (max-width: 420px) {
898 + .radio-switcher {
899 + display: none;
900 + }
901 +}
902 +</style>
903 +
904 +<style lang="scss">
905 +.page-dashboard {
906 + .widget {
907 + .peity {
908 + position: absolute;
909 + bottom: -1px;
910 + left: 0;
911 + border-bottom-left-radius: 5px;
912 + border-bottom-right-radius: 5px;
913 + }
914 + }
915 + table.styled {
916 + .peity {
917 + margin-right: 10px;
918 + }
919 + }
920 +
921 + .vb-content {
922 + padding: 0 20px;
923 + box-sizing: border-box !important;
924 + margin-top: -5px;
925 + margin-left: -20px;
926 + margin-right: -20px;
927 + height: calc(100% + 15px) !important;
928 + width: calc(100% + 40px) !important;
929 + }
930 +}
931 +
932 +@media (max-width: 768px) {
933 + .page-dashboard {
934 + .vb-content {
935 + padding: 0 5px !important;
936 + margin: -5px;
937 + width: calc(100% + 10px) !important;
938 + }
939 + }
940 +}
941 +</style>
src/views/apps/Gallery.vue new
+40
@@ -0,0 +1,40 @@
1 +<template>
2 + <div class="page-gallery scrollable only-y">
3 + <div class="page-header header-accent-gradient card-base card-shadow--small">
4 + <h1>Gallery</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Apps</el-breadcrumb-item>
8 + <el-breadcrumb-item>Gallery</el-breadcrumb-item>
9 + </el-breadcrumb>
10 + <h4>All pictures taken from <a href="https://pexels.com/" target="_blank" class="white-text">pexels.com</a></h4>
11 + </div>
12 +
13 + <div class="photo-list">
14 + <profile-gallery></profile-gallery>
15 + </div>
16 + </div>
17 +</template>
18 +
19 +<script>
20 +import ProfileGallery from "@/components/Profile/ProfileGallery.vue"
21 +
22 +import { defineComponent } from "@vue/runtime-core"
23 +
24 +export default defineComponent({
25 + name: "Gallery",
26 + mounted() {
27 + //console.log('Gallery mounted')
28 + },
29 + components: {
30 + ProfileGallery
31 + }
32 +})
33 +</script>
34 +
35 +<style lang="scss" scoped>
36 +.page-gallery {
37 + padding-left: 20px;
38 + padding-right: 15px;
39 +}
40 +</style>
src/views/apps/Mail.vue new
+604
@@ -0,0 +1,604 @@
1 +<template>
2 + <div class="page-mail flex" :class="{ 'email-selected': mailSelected }">
3 + <div class="mail-boxes flex column">
4 + <button class="compose-btn" @click="mailComposerVisible = true"><i class="mdi mdi-email-plus"></i></button>
5 + <div class="list-boxes scrollable only-y box grow">
6 + <div class="item flex align-center" :class="{ selected: mb.active }" v-for="mb in mailboxes" :key="mb.icon">
7 + <span class="icon"><i :class="'mdi mdi-' + mb.icon"></i></span>
8 + <span class="label box grow">{{ mb.label }}</span>
9 + <span class="badge" v-if="mb.label === 'Inbox'">7</span>
10 + </div>
11 + </div>
12 + </div>
13 + <div class="mail-list box grow flex column">
14 + <div class="search-box">
15 + <input placeholder="Search..." />
16 + </div>
17 + <el-scrollbar class="box grow">
18 + <div
19 + class="item flex"
20 + :class="{ selected: ml.id === selected }"
21 + v-for="ml in mailList"
22 + :key="ml.id"
23 + @click="selectMail(ml.id)"
24 + >
25 + <div class="left">
26 + <div class="avatar">
27 + <img :src="ml.photo" />
28 + </div>
29 + <div class="attachment">
30 + <i class="mdi mdi-attachment" v-show="ml.attachment"></i>
31 + </div>
32 + </div>
33 + <div class="right box grow">
34 + <div class="user flex">
35 + <div class="name box grow">{{ ml.name }}</div>
36 + <div class="datetime">{{ ml.datetime }}</div>
37 + </div>
38 + <div class="subject">{{ ml.subject }}</div>
39 + <!--<div class="body">{{ml.body}}</div>-->
40 + </div>
41 + </div>
42 + </el-scrollbar>
43 + </div>
44 + <div class="mail-content box grow flex column">
45 + <div class="btn-back-box p-16" v-if="mailSelected">
46 + <button @click="selected = 0"><i class="mdi mdi-arrow-left"></i> BACK</button>
47 + </div>
48 + <div class="box grow scrollable scr-alt p-16" v-if="mailSelected">
49 + <div class="content-header flex">
50 + <div class="avatar mr-16">
51 + <img :src="mailSelected.photo" />
52 + </div>
53 + <div class="user-info box grow flex column justify-center">
54 + <div>
55 + <strong>{{ mailSelected.name }}</strong>
56 + </div>
57 + <div>to: jwick@email.com</div>
58 + </div>
59 + <div class="flex column justify-center right-col-large">
60 + <div class="text-right">
61 + {{ mailSelected.datetime }}
62 + </div>
63 + <div>
64 + <div class="buttonset">
65 + <button><i class="mdi mdi-reply"></i></button>
66 + <button><i class="mdi mdi-reply-all"></i></button>
67 + <button><i class="mdi mdi-forward"></i></button>
68 + </div>
69 + </div>
70 + </div>
71 + </div>
72 +
73 + <div class="flex column justify-center right-col-small mt-20">
74 + <div class="text-center">
75 + {{ mailSelected.datetime }}
76 + </div>
77 + <div>
78 + <div class="buttonset text-center">
79 + <button><i class="mdi mdi-reply"></i></button>
80 + <button><i class="mdi mdi-reply-all"></i></button>
81 + <button><i class="mdi mdi-forward"></i></button>
82 + </div>
83 + </div>
84 + </div>
85 +
86 + <div class="subject">{{ mailSelected.subject }}</div>
87 + <div class="body">{{ mailSelected.body }}</div>
88 + <div class="attachments-list mt-30" v-if="mailSelected.attachment">
89 + <div>
90 + <strong><i class="mdi mdi-attachment fs-20"></i> Attachments (1)</strong>
91 + </div>
92 + <div class="attachment flex">
93 + <div class="type">
94 + <i class="mdi mdi-file-document fs-40"></i>
95 + </div>
96 + <div class="box grow detail">
97 + <div>
98 + <strong>Invoice</strong>
99 + <br />
100 + <small>142 KB</small>
101 + </div>
102 + </div>
103 + </div>
104 + </div>
105 + </div>
106 + <div class="box grow p-16 flex center" v-if="!mailSelected">
107 + <div class="text-center o-020 fs-20">
108 + <i class="mdi mdi-email fs-110"></i><br />
109 + Select a message to read
110 + </div>
111 + </div>
112 + </div>
113 +
114 + <el-dialog title="New Message" v-model="mailComposerVisible" class="new-emai-dialog themed">
115 + <el-form label-width="120px" :label-position="'top'">
116 + <el-col>
117 + <el-form-item label="From">
118 + <el-input type="email" class="themed" />
119 + </el-form-item>
120 + </el-col>
121 + <el-col>
122 + <el-form-item label="To">
123 + <el-input type="email" class="themed" />
124 + </el-form-item>
125 + </el-col>
126 + <el-col>
127 + <el-form-item label="Subject">
128 + <el-input class="themed" />
129 + </el-form-item>
130 + </el-col>
131 + </el-form>
132 + <div>
133 + <vue-pell-editor
134 + :actions="editorOptions"
135 + :content="editorContent"
136 + :placeholder="editorPlaceholder"
137 + v-model="editorContent"
138 + :styleWithCss="false"
139 + editorHeight="250px"
140 + />
141 + </div>
142 + <div>
143 + <el-button type="primary" plain class="themed">Send</el-button>
144 + </div>
145 + </el-dialog>
146 + </div>
147 +</template>
148 +
149 +<script>
150 +import dayjs from "dayjs"
151 +import Chance from "chance"
152 +const chance = new Chance()
153 +import VuePellEditor from "@/components/VuePellEditor.vue"
154 +
155 +import { defineComponent } from "@vue/runtime-core"
156 +
157 +export default defineComponent({
158 + name: "Mail",
159 + data() {
160 + let mailList = []
161 + const year = new Date().getFullYear()
162 +
163 + for (let i = 1; i <= 50; i++) {
164 + let timestamp = dayjs(chance.date({ year: year })).format("x")
165 +
166 + mailList.push({
167 + name: chance.name(),
168 + photo: "/static/images/users/user-" + chance.integer({ min: 0, max: 30 }) + ".jpg",
169 + subject: chance.sentence(),
170 + body: chance.paragraph(),
171 + attachment: chance.bool(),
172 + starred: chance.bool(),
173 + snoozed: chance.bool(),
174 + snoozed: chance.bool(),
175 + timestamp: timestamp,
176 + datetime: dayjs(timestamp, "x").format("DD MMM"),
177 + id: i
178 + })
179 + }
180 +
181 + return {
182 + mailList,
183 + mailComposerVisible: false,
184 + selected: 1,
185 + mailboxes: [
186 + {
187 + icon: "inbox",
188 + label: "Inbox",
189 + active: true
190 + },
191 + {
192 + icon: "star",
193 + label: "Starred",
194 + active: false
195 + },
196 + {
197 + icon: "clock",
198 + label: "Snoozed",
199 + active: false
200 + },
201 + {
202 + icon: "send",
203 + label: "Sent",
204 + active: false
205 + },
206 + {
207 + icon: "file",
208 + label: "Draft",
209 + active: false
210 + },
211 + {
212 + icon: "delete",
213 + label: "Trash",
214 + active: false
215 + },
216 + {
217 + icon: "alert-octagon",
218 + label: "Spam",
219 + active: false
220 + }
221 + ],
222 + editorOptions: [
223 + "bold",
224 + "underline",
225 + {
226 + name: "italic",
227 + result: () => window.pell.exec("italic")
228 + },
229 + {
230 + name: "custom",
231 + icon: "<b><u><i>C</i></u></b>",
232 + title: "Custom Action",
233 + result: () => console.log("YOLO")
234 + },
235 + {
236 + name: "image",
237 + result: () => {
238 + const url = window.prompt("Enter the image URL")
239 + if (url) window.pell.exec("insertImage", ensureHTTP(url))
240 + }
241 + },
242 + {
243 + name: "link",
244 + result: () => {
245 + const url = window.prompt("Enter the link URL")
246 + if (url) window.pell.exec("createLink", ensureHTTP(url))
247 + }
248 + }
249 + ],
250 + editorPlaceholder: "Write something amazing...",
251 + editorContent: "<div>Predefined Content</div>"
252 + }
253 + },
254 + computed: {
255 + mailSelected() {
256 + return this.mailList.find(({ id }) => id === this.selected)
257 + }
258 + },
259 + methods: {
260 + selectMail(id) {
261 + this.selected = id
262 + }
263 + },
264 + components: { VuePellEditor }
265 +})
266 +</script>
267 +
268 +<style lang="scss" scoped>
269 +@import "@/assets/scss/_variables";
270 +
271 +.page-mail {
272 + position: relative;
273 + height: calc(100% - 20px);
274 +
275 + .mail-boxes {
276 + position: absolute;
277 + top: 0px;
278 + left: 0px;
279 + bottom: 0px;
280 + z-index: 99;
281 + width: 60px;
282 + transition: all 0.25s;
283 + background: white;
284 + border-top-left-radius: 4px;
285 + border-bottom-left-radius: 4px;
286 + overflow: hidden;
287 +
288 + .compose-btn {
289 + background: $text-color-accent;
290 + color: white;
291 + border: none;
292 + outline: none;
293 + margin: 0;
294 + height: 50px;
295 + font-size: 30px;
296 + cursor: pointer;
297 + }
298 +
299 + .list-boxes {
300 + padding: 8px 0;
301 + }
302 +
303 + .item {
304 + width: 100%;
305 + white-space: nowrap;
306 + overflow: hidden;
307 + padding: 8px 16px;
308 + box-sizing: border-box;
309 + color: transparentize($text-color-primary, 0.5);
310 + cursor: pointer;
311 +
312 + .icon {
313 + font-size: 30px;
314 + }
315 + .label {
316 + opacity: 0;
317 + padding: 0;
318 + padding-left: 15px;
319 + transition: all 0.5s;
320 + }
321 + .badge {
322 + //background: $text-color-primary;
323 + padding: 0 7px;
324 + opacity: 0;
325 + transition: all 0.5s;
326 + }
327 +
328 + &.selected {
329 + background: transparentize($background-color, 0.9);
330 + color: transparentize($text-color-accent, 0);
331 + }
332 +
333 + &:hover {
334 + opacity: 0.5;
335 + }
336 + }
337 +
338 + &:hover {
339 + width: 220px;
340 + border-top-right-radius: 4px;
341 + border-bottom-right-radius: 4px;
342 +
343 + .item {
344 + text-overflow: ellipsis;
345 +
346 + .label {
347 + opacity: 1;
348 + }
349 + .badge {
350 + opacity: 1;
351 + }
352 + }
353 + }
354 + }
355 + .mail-list {
356 + margin-left: 60px;
357 +
358 + .search-box {
359 + height: 50px;
360 + width: 100%;
361 + max-width: 100%;
362 + background: transparentize($text-color-primary, 0.9);
363 +
364 + input {
365 + box-sizing: border-box;
366 + border: none;
367 + width: 100%;
368 + height: 100%;
369 + background: transparent;
370 + padding: 16px;
371 + font-size: 18px;
372 + outline: none;
373 + }
374 + }
375 +
376 + .item {
377 + width: 100%;
378 + background: transparentize($text-color-primary, 0.9);
379 + border-bottom: 1px solid transparentize($text-color-primary, 0.9);
380 + cursor: pointer;
381 +
382 + &.selected {
383 + background: transparentize($text-color-primary, 0.8);
384 + }
385 +
386 + &:last-child {
387 + border: none;
388 + }
389 +
390 + .left {
391 + text-align: center;
392 + padding: 16px;
393 + box-sizing: border-box;
394 + width: 72px;
395 +
396 + .avatar {
397 + img {
398 + width: 40px;
399 + }
400 + }
401 + .attachment {
402 + font-size: 30px;
403 + }
404 + }
405 +
406 + .right {
407 + padding: 16px;
408 + padding-left: 0px;
409 + padding-top: 12px;
410 +
411 + .user {
412 + opacity: 0.8;
413 + margin-bottom: 10px;
414 +
415 + .name {
416 + overflow: hidden;
417 + text-overflow: ellipsis;
418 + white-space: nowrap;
419 + }
420 + }
421 + .subject {
422 + font-weight: bold;
423 + font-size: 18px;
424 + margin-bottom: 10px;
425 + }
426 + .body {
427 + font-size: 14px;
428 + opacity: 0.8;
429 + }
430 + }
431 + }
432 + }
433 + .mail-content {
434 + background: white;
435 + border-top-right-radius: 4px;
436 + border-bottom-right-radius: 4px;
437 +
438 + .btn-back-box {
439 + display: none;
440 +
441 + button {
442 + background: transparent;
443 + cursor: pointer;
444 + color: transparentize($text-color-primary, 0.4);
445 + border: none;
446 + outline: none;
447 + font-weight: bold;
448 + font-size: 14px;
449 + }
450 + }
451 +
452 + .content-header {
453 + .avatar {
454 + img {
455 + width: 60px;
456 + display: block;
457 + }
458 + }
459 + }
460 +
461 + .right-col-small {
462 + display: none;
463 + }
464 +
465 + .buttonset {
466 + margin-top: 10px;
467 +
468 + button {
469 + border: none;
470 + cursor: pointer;
471 + padding: 3px 10px;
472 + background: $background-color;
473 + border: 2px solid $background-color;
474 + color: $text-color-primary;
475 + font-size: 16px;
476 + outline: none;
477 +
478 + &:hover {
479 + background: $text-color-primary;
480 + color: $background-color;
481 + }
482 + }
483 + }
484 +
485 + .subject {
486 + background: transparentize($text-color-accent, 0.8);
487 + font-weight: bold;
488 + font-size: 20px;
489 + padding: 16px;
490 + margin: 16px 0;
491 + }
492 +
493 + .attachments-list {
494 + .attachment {
495 + background: $text-color-accent;
496 + border: 2px solid $text-color-accent;
497 + color: white;
498 + float: left;
499 + margin-top: 10px;
500 + margin-right: 10px;
501 + cursor: pointer;
502 +
503 + .type {
504 + width: 60px;
505 + height: 60px;
506 + line-height: 60px;
507 + text-align: center;
508 + }
509 +
510 + .detail {
511 + padding: 6px 15px;
512 + padding-left: 0px;
513 + }
514 +
515 + &:hover {
516 + background: white;
517 + color: $text-color-accent;
518 + }
519 + }
520 + }
521 + }
522 +}
523 +
524 +@media (max-width: 768px) {
525 + .page-mail {
526 + .mail-boxes {
527 + //top: 15px;
528 + left: 10px;
529 + //bottom: 15px;
530 +
531 + &:hover {
532 + box-shadow: 3px 0px 10px -3px $text-color-accent;
533 + }
534 + }
535 +
536 + .mail-list {
537 + margin-left: 70px;
538 + border-top-right-radius: 4px;
539 + border-bottom-right-radius: 4px;
540 + overflow: hidden;
541 +
542 + .item {
543 + .right {
544 + .user {
545 + font-size: 12px;
546 + }
547 + .subject {
548 + font-size: 14px;
549 + }
550 + .body {
551 + font-size: 10px;
552 + }
553 + }
554 + }
555 + }
556 +
557 + .mail-content {
558 + display: none;
559 + margin-left: 70px;
560 + //mettere bordi arrotondati
561 + //border-t
562 +
563 + .btn-back-box {
564 + display: inherit;
565 + }
566 + }
567 +
568 + &.email-selected {
569 + .mail-list {
570 + display: none;
571 + }
572 +
573 + .mail-content {
574 + display: inherit;
575 + }
576 + }
577 + }
578 +}
579 +
580 +@media (max-width: 480px) {
581 + .page-mail {
582 + .mail-content {
583 + .right-col-large {
584 + display: none;
585 + }
586 + .right-col-small {
587 + display: block;
588 + }
589 + }
590 + }
591 +}
592 +</style>
593 +
594 +<style lang="scss">
595 +.new-emai-dialog {
596 + overflow: hidden;
597 + width: 90%;
598 + max-width: 660px;
599 +
600 + .el-form {
601 + overflow: hidden;
602 + }
603 +}
604 +</style>
src/views/apps/ecommerce/Account.vue new
+763
@@ -0,0 +1,763 @@
1 +<template>
2 + <el-scrollbar class="page-ecommerce-account">
3 + <div class="page-header">
4 + <h1>
5 + <span>My Account</span>
6 + </h1>
7 + <el-breadcrumb separator="/">
8 + <el-breadcrumb-item :to="{ name: 'ecommerce-shop' }">Shop</el-breadcrumb-item>
9 + <el-breadcrumb-item>My Account</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div>
14 + <el-tabs v-model="activeTab" class="themed">
15 + <el-tab-pane label="Dashboard" name="dashboard">
16 + <el-row :gutter="20" class="account-tab">
17 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
18 + <div class="card-base card-outline p-20 mb-20 widget-profile">
19 + <div class="title">Profile</div>
20 + <div class="flex">
21 + <div class="avatar">
22 + <img src="../../../assets/images/avatar.jpg" alt="avatar" />
23 + </div>
24 + <div class="box grow flex column justify-center" @click="activeTab = 'profile'">
25 + <div class="name">Aurora Shenton</div>
26 + <div class="since">since <strong>21 Feb 2018</strong></div>
27 + </div>
28 + </div>
29 + </div>
30 + </el-col>
31 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
32 + <div class="card-base card-outline p-20 mb-20 widget-order">
33 + <div class="title">Last order</div>
34 + <div class="flex">
35 + <div class="photo">
36 + <img src="/static/images/shop/11.jpg" alt="product-photo" />
37 + </div>
38 + <div class="box grow flex column justify-center" @click="activeTab = 'orders'">
39 + <div class="name">Beautifull Seat</div>
40 + <div class="date">
41 + delivery date <strong>{{ deliveryDate }}</strong>
42 + </div>
43 + </div>
44 + </div>
45 + </div>
46 + </el-col>
47 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
48 + <div class="card-base card-outline p-20 mb-20 widget-achievements">
49 + <div class="title">Achievements</div>
50 + <div class="flex">
51 + <div class="box grow">
52 + <el-tooltip effect="dark" content="10 Orders" placement="top">
53 + <i class="mdi mdi-trophy"></i>
54 + </el-tooltip>
55 + </div>
56 + <div class="box grow">
57 + <el-tooltip effect="dark" content="Certified User" placement="top">
58 + <i class="mdi mdi-check-decagram"></i>
59 + </el-tooltip>
60 + </div>
61 + <div class="box grow">
62 + <el-tooltip effect="dark" content="100 Orders" placement="top">
63 + <i class="mdi mdi-seal"></i>
64 + </el-tooltip>
65 + </div>
66 + <div class="box grow">
67 + <el-tooltip effect="dark" content="Purchase Protection" placement="top">
68 + <i class="mdi mdi-shield-check"></i>
69 + </el-tooltip>
70 + </div>
71 + <div class="box grow">
72 + <el-tooltip effect="dark" content="Premium User" placement="top">
73 + <i class="mdi mdi-star"></i>
74 + </el-tooltip>
75 + </div>
76 + </div>
77 + </div>
78 + </el-col>
79 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
80 + <div class="card-base card-outline p-20 mb-20 widget-address">
81 + <div class="title">Billing address</div>
82 + <div class="box grow flex column justify-center" @click="activeTab = 'profile'">
83 + <div class="city">Los Angeles</div>
84 + <div class="street">Church Street 23, Block C2</div>
85 + </div>
86 + </div>
87 + </el-col>
88 + </el-row>
89 + </el-tab-pane>
90 + <el-tab-pane label="Orders" name="orders">
91 + <div class="orders-tab">
92 + <div class="order-wrapper" v-for="o in orders" :key="o.id">
93 + <div class="order card-shadow--small" :class="{ open: o.open }" @click="o.open = !o.open">
94 + <div class="flex">
95 + <div class="status">
96 + <el-progress
97 + type="circle"
98 + :percentage="o.status"
99 + :status="o.status === 100 ? 'success' : null"
100 + :width="80"
101 + ></el-progress>
102 + </div>
103 + <div class="info box grow flex column justify-center">
104 + <div class="title flex justify-space-between">
105 + <div class="date">{{ o.date }}</div>
106 + <div class="number">ORDER #{{ o.id }}</div>
107 + </div>
108 + <div class="amount">$ {{ o.amount }}</div>
109 + </div>
110 + </div>
111 + <div class="detail flex">
112 + <div class="photo">
113 + <img :src="o.photo" />
114 + </div>
115 + <div class="product box grow flex column justify-center">
116 + <div class="product-name">{{ o.product }}</div>
117 + <div class="price">
118 + <span class="unit-price">$ {{ o.price }}</span>
119 + <span class="qnt"> x {{ o.qnt }}</span>
120 + </div>
121 + </div>
122 + </div>
123 + </div>
124 + </div>
125 + </div>
126 + </el-tab-pane>
127 + <el-tab-pane label="Wishlist" name="wishlist">
128 + <el-row class="wishlist-box" :gutter="20">
129 + <el-col :xs="24" :sm="8" :md="6" :lg="4" :xl="4">
130 + <div class="sidebar card-shadow--small">
131 + <div class="title flex justify-space-between align-center">
132 + <span>My lists</span>
133 + <el-tooltip effect="dark" content="Add a New Wishlist" placement="top">
134 + <button><i class="mdi mdi-plus"></i></button>
135 + </el-tooltip>
136 + </div>
137 + <div class="lists">
138 + <ul>
139 + <li class="active"><a>Chairs</a></li>
140 + <li><a>BBQ</a></li>
141 + <li><a>Games</a></li>
142 + <li><a>Tables</a></li>
143 + <li><a>Accessories</a></li>
144 + </ul>
145 + </div>
146 + </div>
147 + </el-col>
148 + <el-col :xs="24" :sm="16" :md="18" :lg="20" :xl="20">
149 + <el-row class="item-list" :gutter="20">
150 + <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="6" v-for="i in wishlist" :key="i.id">
151 + <div class="item mb-20 flex card-shadow--small" @click="gotoProducts">
152 + <div class="photo">
153 + <img :src="i.photo" />
154 + </div>
155 + <div class="box grow flex column justify-center">
156 + <div class="product-name">{{ i.product }}</div>
157 + <div class="price">$ {{ i.price }}</div>
158 + </div>
159 + </div>
160 + </el-col>
161 + </el-row>
162 + </el-col>
163 + </el-row>
164 + </el-tab-pane>
165 + <el-tab-pane label="Profile" name="profile">
166 + <el-row class="profile-box" :gutter="20">
167 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
168 + <div class="user-box card-shadow--small">
169 + <div class="photo b-rad-8">
170 + <img src="../../../assets/images/avatar.jpg" alt="avatar" />
171 + </div>
172 + <div class="name">Aurora Shenton</div>
173 + <div class="contacts">
174 + <div><i class="mdi mdi-email mr-10"></i> ashenton@mail.com</div>
175 + <div class="mt-10"><i class="mdi mdi-phone mr-10"></i> 579-459-8481</div>
176 + </div>
177 + </div>
178 + <div class="flex achievements-box justify-space-around card-shadow--small">
179 + <div class="box">
180 + <el-tooltip effect="dark" content="10 Orders" placement="top">
181 + <i class="mdi mdi-trophy"></i>
182 + </el-tooltip>
183 + </div>
184 + <div class="box">
185 + <el-tooltip effect="dark" content="Certified User" placement="top">
186 + <i class="mdi mdi-check-decagram"></i>
187 + </el-tooltip>
188 + </div>
189 + <div class="box">
190 + <el-tooltip effect="dark" content="100 Orders" placement="top">
191 + <i class="mdi mdi-seal"></i>
192 + </el-tooltip>
193 + </div>
194 + <div class="box">
195 + <el-tooltip effect="dark" content="Purchase Protection" placement="top">
196 + <i class="mdi mdi-shield-check"></i>
197 + </el-tooltip>
198 + </div>
199 + <div class="box">
200 + <el-tooltip effect="dark" content="Premium User" placement="top">
201 + <i class="mdi mdi-star"></i>
202 + </el-tooltip>
203 + </div>
204 + </div>
205 + </el-col>
206 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
207 + <div class="billing-box card-shadow--small">
208 + <div class="title">Billing address</div>
209 + <el-row :gutter="10">
210 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
211 + <div class="box">
212 + <div class="key">Number</div>
213 + <div class="value">23, Block C2</div>
214 + </div>
215 + </el-col>
216 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
217 + <div class="box">
218 + <div class="key">City</div>
219 + <div class="value">Los Angeles</div>
220 + </div>
221 + </el-col>
222 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
223 + <div class="box">
224 + <div class="key">Street</div>
225 + <div class="value">Church Street</div>
226 + </div>
227 + </el-col>
228 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
229 + <div class="box">
230 + <div class="key">Postal Code</div>
231 + <div class="value">100065</div>
232 + </div>
233 + </el-col>
234 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
235 + <div class="box">
236 + <div class="key">State</div>
237 + <div class="value">CA</div>
238 + </div>
239 + </el-col>
240 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
241 + <div class="box">
242 + <div class="key">Country</div>
243 + <div class="value">United States</div>
244 + </div>
245 + </el-col>
246 + </el-row>
247 + </div>
248 + <div class="shipping-box card-shadow--small">
249 + <div class="title">Shipping address</div>
250 + <el-row :gutter="10">
251 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
252 + <div class="box">
253 + <div class="key">Number</div>
254 + <div class="value">23, Block C2</div>
255 + </div>
256 + </el-col>
257 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
258 + <div class="box">
259 + <div class="key">City</div>
260 + <div class="value">Los Angeles</div>
261 + </div>
262 + </el-col>
263 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
264 + <div class="box">
265 + <div class="key">Street</div>
266 + <div class="value">Church Street</div>
267 + </div>
268 + </el-col>
269 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
270 + <div class="box">
271 + <div class="key">Postal Code</div>
272 + <div class="value">100065</div>
273 + </div>
274 + </el-col>
275 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
276 + <div class="box">
277 + <div class="key">State</div>
278 + <div class="value">CA</div>
279 + </div>
280 + </el-col>
281 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
282 + <div class="box">
283 + <div class="key">Country</div>
284 + <div class="value">United States</div>
285 + </div>
286 + </el-col>
287 + </el-row>
288 + </div>
289 + </el-col>
290 + </el-row>
291 + </el-tab-pane>
292 + </el-tabs>
293 + </div>
294 + </el-scrollbar>
295 +</template>
296 +
297 +<script>
298 +import dayjs from "dayjs"
299 +import _ from "lodash"
300 +import Chance from "chance"
301 +const chance = new Chance()
302 +
303 +import { defineComponent } from "@vue/runtime-core"
304 +
305 +export default defineComponent({
306 + name: "EcommerceAccount",
307 + data() {
308 + return {
309 + activeTab: "dashboard",
310 + deliveryDate: dayjs().format("DD MMM"),
311 + orders: [],
312 + wishlist: []
313 + }
314 + },
315 + methods: {
316 + initOrdersData() {
317 + const year = new Date().getFullYear()
318 +
319 + _.times(50, number => {
320 + let price = chance.floating({ min: 30, max: 100, fixed: 2 })
321 + let qnt = chance.integer({ min: 1, max: 5 })
322 + let amount = price * qnt
323 +
324 + this.orders.push({
325 + date: dayjs(chance.date({ year: year })).format("DD MMM YYYY"),
326 + amount: _.replace(amount.toFixed(2).toString(), ".", ","),
327 + id: "384628" + number,
328 + status: number > 5 ? 100 : chance.integer({ min: 0, max: 90 }),
329 + open: false,
330 + photo: "/static/images/shop/" + chance.integer({ min: 0, max: 19 }) + ".jpg",
331 + product: chance.sentence({ words: 3 }),
332 + qnt,
333 + price: _.replace(price.toFixed(2).toString(), ".", ",")
334 + })
335 + })
336 + },
337 + initWishlistData() {
338 + _.times(50, number => {
339 + let price = chance.floating({ min: 30, max: 100, fixed: 2 })
340 +
341 + this.wishlist.push({
342 + id: number,
343 + photo: "/static/images/shop/" + chance.integer({ min: 0, max: 19 }) + ".jpg",
344 + product: chance.sentence({ words: 3 }),
345 + price: _.replace(price.toFixed(2).toString(), ".", ",")
346 + })
347 + })
348 + },
349 + gotoProducts() {
350 + this.$router.push({ name: "ecommerce-products" })
351 + }
352 + },
353 + created() {
354 + this.initOrdersData()
355 + this.initWishlistData()
356 + }
357 +})
358 +</script>
359 +
360 +<style lang="scss">
361 +@import "../../../assets/scss/_variables";
362 +
363 +.page-ecommerce-account {
364 + .page-header {
365 + margin-bottom: 20px;
366 + }
367 +
368 + .account-tab {
369 + .card-outline {
370 + min-height: 130px;
371 + border: 2px solid darken($background-color, 20);
372 +
373 + .title {
374 + font-size: 16px;
375 + margin-bottom: 10px;
376 + font-weight: bold;
377 + color: $background-color;
378 + background: darken($background-color, 20);
379 + display: inline-block;
380 + display: inline-block;
381 + position: relative;
382 + top: -22px;
383 + margin-left: -20px;
384 + padding: 4px 10px;
385 + text-transform: uppercase;
386 + }
387 + }
388 +
389 + .widget-profile {
390 + .avatar {
391 + width: 70px;
392 +
393 + img {
394 + width: 100%;
395 + }
396 + }
397 +
398 + .box.grow {
399 + background: transparentize($text-color-primary, 0.97);
400 + height: 70px;
401 + padding: 0 20px;
402 + box-sizing: border-box;
403 + cursor: pointer;
404 +
405 + .since {
406 + font-size: 12px;
407 + opacity: 0.5;
408 + }
409 +
410 + &:hover {
411 + background: transparentize($text-color-primary, 0.8);
412 + }
413 + }
414 + }
415 + .widget-order {
416 + .photo {
417 + width: 70px;
418 +
419 + img {
420 + width: 100%;
421 + }
422 + }
423 +
424 + .box.grow {
425 + background: transparentize($text-color-primary, 0.97);
426 + height: 70px;
427 + padding: 0 20px;
428 + box-sizing: border-box;
429 + cursor: pointer;
430 +
431 + .date {
432 + font-size: 12px;
433 + opacity: 0.5;
434 + }
435 +
436 + &:hover {
437 + background: transparentize($text-color-primary, 0.8);
438 + }
439 + }
440 + }
441 + .widget-achievements {
442 + .box.grow {
443 + background: transparentize($text-color-primary, 0.97);
444 + height: 70px;
445 + line-height: 70px;
446 + font-size: 30px;
447 + box-sizing: border-box;
448 + text-align: center;
449 + }
450 + }
451 + .widget-address {
452 + .box.grow {
453 + background: transparentize($text-color-primary, 0.97);
454 + height: 70px;
455 + padding: 0px 20px;
456 + box-sizing: border-box;
457 + cursor: pointer;
458 +
459 + .street {
460 + font-size: 12px;
461 + opacity: 0.5;
462 + }
463 +
464 + &:hover {
465 + background: transparentize($text-color-primary, 0.8);
466 + }
467 + }
468 + }
469 + }
470 +
471 + .orders-tab {
472 + margin-left: -10px;
473 + margin-right: -10px;
474 +
475 + .order-wrapper {
476 + width: 25%;
477 + float: left;
478 + padding: 0 10px;
479 + box-sizing: border-box;
480 +
481 + .order {
482 + background: white;
483 + //color: $background-color;
484 + border-top-left-radius: 40px;
485 + border-bottom-left-radius: 40px;
486 + border-top-right-radius: 40px;
487 + border-bottom-right-radius: 40px;
488 + margin-bottom: 20px;
489 + width: 100%;
490 + height: 80px;
491 + overflow: hidden;
492 + cursor: pointer;
493 + transition: all 0.25s;
494 +
495 + .el-progress {
496 + display: block;
497 +
498 + .el-progress-circle__track {
499 + stroke: transparentize($text-color-primary, 0.9);
500 + }
501 +
502 + .el-progress__text {
503 + //color: $background-color;
504 + font-weight: bold !important;
505 + font-size: 16px !important;
506 + }
507 +
508 + &.is-success .el-progress__text {
509 + //color: $color-success;
510 + }
511 + }
512 +
513 + .info {
514 + padding: 0 20px;
515 +
516 + .date {
517 + font-weight: bold;
518 + }
519 +
520 + .number {
521 + opacity: 0.5;
522 + font-size: 14px;
523 + }
524 +
525 + .amount {
526 + margin-top: 5px;
527 + color: $text-color-accent;
528 + }
529 + }
530 +
531 + .detail {
532 + padding: 17px 20px;
533 + box-sizing: border-box;
534 +
535 + .photo {
536 + width: 60px;
537 +
538 + img {
539 + width: 100%;
540 + }
541 + }
542 +
543 + .product-name {
544 + box-sizing: border-box;
545 + padding-left: 20px;
546 + font-weight: bold;
547 + }
548 + .price {
549 + box-sizing: border-box;
550 + padding-left: 20px;
551 + margin-top: 5px;
552 + font-size: 14px;
553 +
554 + .qnt {
555 + opacity: 0.5;
556 + }
557 + }
558 + }
559 +
560 + &.open {
561 + height: 180px;
562 + border-bottom-left-radius: 20px;
563 + border-bottom-right-radius: 20px;
564 + border-top-right-radius: 20px;
565 + }
566 + }
567 + }
568 + }
569 +
570 + .wishlist-box {
571 + .sidebar {
572 + background: white;
573 + border-radius: 4px;
574 + margin-bottom: 20px;
575 +
576 + .title {
577 + padding: 20px;
578 + border-bottom: 1px solid transparentize($text-color-primary, 0.9);
579 + font-weight: bold;
580 +
581 + button {
582 + background: transparentize($text-color-primary, 0.9);
583 + color: var(--text-color);
584 + border: none;
585 + border-radius: 4px;
586 + outline: none;
587 + width: 30px;
588 + height: 30px;
589 + line-height: 30px;
590 + padding: 0;
591 + margin: 0;
592 + text-align: center;
593 + font-size: 20px;
594 + cursor: pointer;
595 +
596 + i:before {
597 + transition: all 0.25s;
598 + }
599 +
600 + &:hover {
601 + background: transparentize($text-color-primary, 0.8);
602 +
603 + i:before {
604 + transform: rotate(180deg);
605 + }
606 + }
607 + }
608 + }
609 + .lists {
610 + padding: 20px;
611 +
612 + ul,
613 + li {
614 + padding: 0;
615 + margin: 0;
616 + list-style: none;
617 + }
618 +
619 + li {
620 + margin-bottom: 10px;
621 +
622 + &.active a {
623 + color: $text-color-primary;
624 + }
625 + }
626 + }
627 + }
628 + .item-list {
629 + .item {
630 + background: white;
631 + border-radius: 4px;
632 + overflow: hidden;
633 + cursor: pointer;
634 +
635 + .photo {
636 + width: 70px;
637 + padding: 10px;
638 +
639 + img {
640 + width: 100%;
641 + display: block;
642 + }
643 + }
644 +
645 + .box {
646 + padding: 0 10px;
647 +
648 + .product-name {
649 + font-weight: bold;
650 + }
651 + .price {
652 + color: $text-color-accent;
653 + }
654 + }
655 +
656 + &:hover {
657 + background: transparentize($text-color-primary, 0.8);
658 + }
659 + }
660 + }
661 + }
662 +
663 + .profile-box {
664 + .user-box {
665 + background: white;
666 + border-radius: 4px;
667 + padding: 20px;
668 + box-sizing: border-box;
669 + margin-bottom: 20px;
670 +
671 + .photo {
672 + width: 200px;
673 + display: block;
674 + margin: 10px auto;
675 + border: 5px solid $text-color-primary;
676 +
677 + img {
678 + width: 100%;
679 + display: block;
680 + }
681 + }
682 + .name {
683 + text-align: center;
684 + font-size: 20px;
685 + margin: 10px 0;
686 + }
687 +
688 + .contacts {
689 + background: transparentize($text-color-primary, 0.97);
690 + padding: 20px;
691 + }
692 + }
693 +
694 + .achievements-box {
695 + background: white;
696 + border-radius: 4px;
697 + padding: 20px;
698 + box-sizing: border-box;
699 + margin-bottom: 20px;
700 +
701 + .box {
702 + padding: 10px;
703 + //background: transparentize($text-color-primary, .9);
704 + font-size: 20px;
705 + min-width: 26px;
706 + text-align: center;
707 + }
708 + }
709 +
710 + .billing-box,
711 + .shipping-box {
712 + background: white;
713 + border-radius: 4px;
714 + margin-bottom: 20px;
715 + padding: 20px;
716 +
717 + .title {
718 + font-weight: bold;
719 + margin-bottom: 20px;
720 + }
721 +
722 + .box {
723 + background: transparentize($text-color-primary, 0.97);
724 + padding: 20px;
725 + margin-bottom: 10px;
726 +
727 + .key {
728 + font-size: 14px;
729 + opacity: 0.7;
730 + }
731 + }
732 + }
733 + }
734 +}
735 +
736 +@media (max-width: 1330px) {
737 + .page-ecommerce-account {
738 + .orders-tab {
739 + .order-wrapper {
740 + width: 33.33333%;
741 + }
742 + }
743 + }
744 +}
745 +@media (max-width: 1000px) {
746 + .page-ecommerce-account {
747 + .orders-tab {
748 + .order-wrapper {
749 + width: 50%;
750 + }
751 + }
752 + }
753 +}
754 +@media (max-width: 700px) {
755 + .page-ecommerce-account {
756 + .orders-tab {
757 + .order-wrapper {
758 + width: 100%;
759 + }
760 + }
761 + }
762 +}
763 +</style>
src/views/apps/ecommerce/Cart.vue new
+345
@@ -0,0 +1,345 @@
1 +<template>
2 + <el-scrollbar class="page-ecommerce-cart">
3 + <el-row class="cart-box" :gutter="20">
4 + <el-col :xs="24" :sm="16" :md="18" :lg="18" :xl="18">
5 + <el-row class="item-list">
6 + <el-col>
7 + <div class="item mb-20 page-header card-base header-primary">
8 + <h1>
9 + <span>Your Cart (5 items)</span>
10 + </h1>
11 + <el-breadcrumb separator="/" class="mt-10 themed">
12 + <el-breadcrumb-item :to="{ name: 'ecommerce-shop' }">Shop</el-breadcrumb-item>
13 + <el-breadcrumb-item>Cart</el-breadcrumb-item>
14 + </el-breadcrumb>
15 + </div>
16 + </el-col>
17 + <el-col v-for="i in cart" :key="i.id">
18 + <div class="item mb-20 flex card-shadow--small b-rad-4">
19 + <div class="photo">
20 + <img :src="i.photo" />
21 + </div>
22 + <div class="box grow flex column justify-center">
23 + <div class="product-name">{{ i.product }}</div>
24 + <div class="price">$ {{ i.price_text }}</div>
25 + </div>
26 + <div class="box grow flex center text-center">
27 + <div>
28 + <span class="ics">X</span>
29 + <el-input-number
30 + v-model="i.qnt"
31 + controls-position="right"
32 + :min="1"
33 + class="themed ml-10"
34 + ></el-input-number>
35 + </div>
36 + </div>
37 + <div class="box grow flex align-center">
38 + <div class="text-right box grow">
39 + <button class="del-btn"><i class="mdi mdi-delete"></i></button>
40 + </div>
41 + </div>
42 + </div>
43 + </el-col>
44 + </el-row>
45 + </el-col>
46 +
47 + <el-col :xs="24" :sm="8" :md="6" :lg="6" :xl="6">
48 + <div class="widget card-shadow--small b-rad-4">
49 + <div class="title flex justify-space-between align-center">Total</div>
50 + <div class="content">
51 + <div class="fs-30">$ {{ amount_text }}</div>
52 + <button @click="gotoCheckout">Checkout</button>
53 + </div>
54 + </div>
55 + <div class="widget card-shadow--small b-rad-4">
56 + <div class="title flex justify-space-between align-center">Related Products</div>
57 + <div class="content">
58 + <el-row class="items">
59 + <el-col v-for="i in items" :key="i.id">
60 + <div class="item mb-20 flex">
61 + <div class="photo">
62 + <div class="add-btn"><i class="mdi mdi-plus-circle"></i></div>
63 + <img :src="i.photo" />
64 + </div>
65 + <div class="box grow flex column justify-center">
66 + <div class="product-name">{{ i.product }}</div>
67 + <div class="price">$ {{ i.price }}</div>
68 + </div>
69 + </div>
70 + </el-col>
71 + </el-row>
72 + </div>
73 + </div>
74 + <div class="widget card-shadow--small b-rad-4">
75 + <div class="title flex justify-space-between align-center">Support</div>
76 + <div class="content">
77 + <div>
78 + <div><i class="mdi mdi-email mr-10"></i> shop@mail.com</div>
79 + <div class="mt-10"><i class="mdi mdi-phone mr-10"></i> 579-459-8481</div>
80 + </div>
81 + </div>
82 + </div>
83 + </el-col>
84 + </el-row>
85 + </el-scrollbar>
86 +</template>
87 +
88 +<script>
89 +import Chance from "chance"
90 +const chance = new Chance()
91 +import _ from "lodash"
92 +import { defineComponent } from "@vue/runtime-core"
93 +
94 +export default defineComponent({
95 + name: "EcommerceCart",
96 + data() {
97 + return {
98 + items: [],
99 + cart: []
100 + }
101 + },
102 + computed: {
103 + amount() {
104 + return _.reduce(this.cart, (sum, obj) => sum + obj.price * obj.qnt, 0)
105 + },
106 + amount_text() {
107 + return _.replace(this.amount.toFixed(2).toString(), ".", ",")
108 + }
109 + },
110 + methods: {
111 + gotoCheckout() {
112 + this.$router.push({ name: "ecommerce-checkout" })
113 + },
114 + initCartData() {
115 + _.times(5, number => {
116 + let price = chance.floating({ min: 30, max: 100, fixed: 2 })
117 + let qnt = chance.integer({ min: 1, max: 5 })
118 +
119 + this.cart.push({
120 + id: number,
121 + photo: "/static/images/shop/" + chance.integer({ min: 0, max: 19 }) + ".jpg",
122 + product: chance.sentence({ words: 3 }),
123 + price,
124 + price_text: _.replace(price.toFixed(2).toString(), ".", ","),
125 + qnt
126 + })
127 + })
128 + },
129 + initItemsData() {
130 + _.times(5, number => {
131 + let price = chance.floating({ min: 30, max: 100, fixed: 2 })
132 +
133 + this.items.push({
134 + id: number,
135 + photo: "/static/images/shop/" + chance.integer({ min: 0, max: 19 }) + ".jpg",
136 + product: chance.sentence({ words: 3 }),
137 + price: _.replace(price.toFixed(2).toString(), ".", ",")
138 + })
139 + })
140 + }
141 + },
142 + created() {
143 + this.initCartData()
144 + this.initItemsData()
145 + }
146 +})
147 +</script>
148 +
149 +<style lang="scss">
150 +@import "../../../assets/scss/_variables";
151 +
152 +.page-ecommerce-cart {
153 + .cart-box {
154 + .widget {
155 + background: white;
156 + margin-bottom: 20px;
157 +
158 + .title {
159 + padding: 20px;
160 + border-bottom: 1px solid transparentize($text-color-primary, 0.9);
161 + font-weight: bold;
162 + }
163 + .content {
164 + padding: 20px;
165 +
166 + button {
167 + margin-top: 10px;
168 + border: 1px solid $text-color-accent;
169 + color: $text-color-accent;
170 + background-color: transparentize($text-color-accent, 0.9);
171 + padding: 10px;
172 + width: 100%;
173 + text-align: center;
174 + font-family: inherit;
175 + font-size: 20px;
176 + cursor: pointer;
177 + border-radius: 4px;
178 +
179 + &:hover {
180 + background-color: transparentize($text-color-accent, 0.7);
181 + }
182 + }
183 +
184 + .items {
185 + .item {
186 + background: transparentize($text-color-primary, 0.97);
187 + box-sizing: border-box;
188 +
189 + .photo {
190 + width: 58px;
191 + position: relative;
192 + padding: 10px;
193 + background: white;
194 +
195 + .add-btn {
196 + position: absolute;
197 + background: transparentize($text-color-accent, 0.3);
198 + color: white;
199 + top: 0;
200 + left: 0;
201 + right: 0;
202 + bottom: 0;
203 + width: 100%;
204 + height: 100%;
205 + text-align: center;
206 + line-height: 78px;
207 + font-size: 40px;
208 + opacity: 0;
209 + transition: all 0.25s;
210 + }
211 +
212 + img {
213 + width: 100%;
214 + display: block;
215 + }
216 + }
217 +
218 + .box {
219 + padding-left: 10px;
220 +
221 + .product-name {
222 + font-size: 14px;
223 + }
224 + .price {
225 + font-size: 12px;
226 + margin-top: 2px;
227 + color: $text-color-accent;
228 + }
229 + }
230 +
231 + &:hover {
232 + .photo {
233 + .add-btn {
234 + opacity: 1;
235 + }
236 + }
237 + }
238 + }
239 + }
240 + }
241 + }
242 +
243 + .item-list {
244 + .item {
245 + background: white;
246 + padding: 30px;
247 + box-sizing: border-box;
248 + margin-bottom: 20px;
249 +
250 + .photo {
251 + width: 100px;
252 + padding: 10px;
253 + background: white;
254 +
255 + img {
256 + width: 100%;
257 + display: block;
258 + }
259 + }
260 +
261 + .box {
262 + padding-left: 30px;
263 +
264 + .product-name {
265 + font-weight: bold;
266 + font-size: 20px;
267 + }
268 + .price {
269 + margin-top: 10px;
270 + color: $text-color-accent;
271 + }
272 +
273 + .el-input-number {
274 + width: 90px;
275 + }
276 +
277 + .del-btn {
278 + margin-top: 10px;
279 + color: $text-color-danger;
280 + padding: 10px;
281 + text-align: center;
282 + font-family: inherit;
283 + font-size: 20px;
284 + cursor: pointer;
285 + opacity: 0.5;
286 + border: none;
287 + background: transparent;
288 + outline: none;
289 + visibility: hidden;
290 +
291 + &:hover {
292 + opacity: 1;
293 + }
294 + }
295 + }
296 +
297 + &:hover {
298 + .del-btn {
299 + visibility: visible;
300 + }
301 + }
302 + }
303 + }
304 + }
305 +}
306 +
307 +@media (max-width: 900px) {
308 + .page-ecommerce-cart {
309 + .cart-box {
310 + .item-list {
311 + .item {
312 + .photo {
313 + display: none;
314 + }
315 + & > .box {
316 + padding: 0;
317 + }
318 + }
319 + }
320 + }
321 + }
322 +}
323 +
324 +@media (max-width: 600px) {
325 + .page-ecommerce-cart {
326 + .cart-box {
327 + .item-list {
328 + .item {
329 + display: block;
330 + padding: 20px;
331 +
332 + .photo,
333 + & > .box {
334 + margin-bottom: 10px;
335 + width: 100%;
336 + display: block;
337 + clear: both;
338 + padding: 0;
339 + }
340 + }
341 + }
342 + }
343 + }
344 +}
345 +</style>
src/views/apps/ecommerce/Checkout.vue new
+436
@@ -0,0 +1,436 @@
1 +<template>
2 + <div class="page-ecommerce-checkout scrollable only-yt">
3 + <div class="page-header card-base header-primary">
4 + <h1>
5 + <span>Checkout</span>
6 + </h1>
7 + <el-breadcrumb separator="/">
8 + <el-breadcrumb-item :to="{ name: 'ecommerce-shop' }">Shop</el-breadcrumb-item>
9 + <el-breadcrumb-item :to="{ name: 'ecommerce-cart' }">Cart</el-breadcrumb-item>
10 + <el-breadcrumb-item>Checkout</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 +
14 + <div class="widget shipping card-shadow--small b-rad-4">
15 + <div class="title">Shipping information</div>
16 + <div class="content">
17 + <div class="flex justify-space-between">
18 + <div class="box grow flex column mt-40 fs-20 info">
19 + <div class="mb-15"><i class="mdi mdi-account mr-10"></i>Aurora Shenton</div>
20 + <div class="mb-15"><i class="mdi mdi-map-marker mr-10"></i>Los Angeles, Church Street, 23, Block C2</div>
21 + <div><i class="mdi mdi-phone mr-10"></i>579-459-8481</div>
22 + </div>
23 +
24 + <div class="box grow flex mt-40 fs-20 type align-center justify-center">
25 + <div class="box grow type-btn text-center">
26 + <div><i class="mdi mdi-truck mb-10 fs-30"></i></div>
27 + <div><span>Standard</span></div>
28 + </div>
29 + <div class="box grow type-btn text-center">
30 + <div><i class="mdi mdi-airplane mb-10 fs-30"></i></div>
31 + <div><span>3 Days</span></div>
32 + </div>
33 + <div class="box grow type-btn text-center active">
34 + <div><i class="mdi mdi-rocket mb-10 fs-30"></i></div>
35 + <div><span>1 Day</span></div>
36 + </div>
37 + </div>
38 + </div>
39 + </div>
40 + </div>
41 +
42 + <div class="widget review card-shadow--small b-rad-4">
43 + <div class="title">Review items (5)</div>
44 + <div class="content">
45 + <el-row class="items mt-40" :gutter="20">
46 + <el-col v-for="i in items" :key="i.id" :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
47 + <div class="item mb-20 flex">
48 + <div class="photo">
49 + <img :src="i.photo" />
50 + </div>
51 + <div class="box grow flex column justify-center">
52 + <div class="product-name">{{ i.product }}</div>
53 + <div class="price">
54 + {{ i.qnt }} x $ {{ i.price_text }} = <strong>$ {{ i.amount_text }}</strong>
55 + </div>
56 + </div>
57 + </div>
58 + </el-col>
59 + </el-row>
60 + </div>
61 + </div>
62 +
63 + <div class="widget payment card-shadow--small b-rad-4">
64 + <div class="title">Payment</div>
65 + <div class="content">
66 + <div class="flex justify-space-between">
67 + <div class="box grow mt-40 pr-30 info">
68 + <h3 class="m-0 mb-10">General Info</h3>
69 + <p>
70 + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore
71 + magna aliqua.
72 + <br /><br />
73 + Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
74 + </p>
75 + </div>
76 +
77 + <div class="box grow flex column mt-40 card">
78 + <h3 class="m-0 mb-10">Credit Card</h3>
79 + <el-row :gutter="20" class="fs-20">
80 + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb-20">
81 + <el-input placeholder="Card number" v-model="card" class="themed"></el-input>
82 + </el-col>
83 + <el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12" class="mb-20">
84 + <el-input placeholder="MM/YY" v-model="date" class="themed"></el-input>
85 + </el-col>
86 + <el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="12" class="mb-20">
87 + <el-input type="password" placeholder="CVC" v-model="cvv" class="themed"></el-input>
88 + </el-col>
89 + <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb-20">
90 + <el-input placeholder="Full name" v-model="name" class="themed"></el-input>
91 + </el-col>
92 + </el-row>
93 + </div>
94 +
95 + <div class="box grow mt-40 total">
96 + <div class="t-row">
97 + <div class="label">Total</div>
98 + <div class="value">$ {{ price2Text(amount) }}</div>
99 + </div>
100 + <div class="t-row">
101 + <div class="label">Coupan Discount</div>
102 + <div class="value">$ 100,00</div>
103 + </div>
104 + <div class="t-row">
105 + <div class="label">Delivery Charges</div>
106 + <div class="value">$ 50,00</div>
107 + </div>
108 + <div class="t-row">
109 + <div class="label">Tax</div>
110 + <div class="value">$ 100,00</div>
111 + </div>
112 + <div class="t-row tot">
113 + <div class="label">Payable Amount</div>
114 + <div class="value">$ {{ price2Text(amount + 50) }}</div>
115 + </div>
116 + <button>Confirm & Pay</button>
117 + </div>
118 + </div>
119 + </div>
120 +
121 + <div class="mt-40 small-info">
122 + <h3 class="m-0 mb-10">General Info</h3>
123 + <p>
124 + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
125 + aliqua.
126 + <br /><br />
127 + Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
128 + </p>
129 + </div>
130 + </div>
131 + </div>
132 +</template>
133 +
134 +<script>
135 +import Chance from "chance"
136 +const chance = new Chance()
137 +import _ from "lodash"
138 +import { defineComponent } from "@vue/runtime-core"
139 +
140 +export default defineComponent({
141 + name: "EcommerceCheckout",
142 + data() {
143 + return {
144 + items: [],
145 + amount: 0,
146 + card: "",
147 + date: "",
148 + cvv: "",
149 + name: ""
150 + }
151 + },
152 + methods: {
153 + price2Text(price) {
154 + return _.replace(price.toFixed(2).toString(), ".", ",")
155 + },
156 + initItemsData() {
157 + _.times(5, number => {
158 + let price = chance.floating({ min: 30, max: 100, fixed: 2 })
159 + let qnt = chance.integer({ min: 1, max: 5 })
160 + let amount = price * qnt
161 + this.amount += amount
162 +
163 + this.items.push({
164 + id: number,
165 + photo: "/static/images/shop/" + chance.integer({ min: 0, max: 19 }) + ".jpg",
166 + product: chance.sentence({ words: 3 }),
167 + price,
168 + price_text: _.replace(price.toFixed(2).toString(), ".", ","),
169 + qnt,
170 + amount,
171 + amount_text: _.replace(amount.toFixed(2).toString(), ".", ",")
172 + })
173 + })
174 + }
175 + },
176 + created() {
177 + this.initItemsData()
178 + }
179 +})
180 +</script>
181 +
182 +<style lang="scss">
183 +@import "../../../assets/scss/_variables";
184 +
185 +.page-ecommerce-checkout {
186 + padding-left: 20px;
187 + padding-right: 15px;
188 +
189 + .page-header {
190 + margin-bottom: 20px;
191 + }
192 +
193 + .widget {
194 + position: relative;
195 + border: 4px solid $text-color-accent;
196 + box-sizing: border-box;
197 + padding: 20px;
198 + margin-bottom: 20px;
199 + background: white;
200 +
201 + .title {
202 + background: $text-color-accent;
203 + color: $background-color;
204 + position: absolute;
205 + top: 0;
206 + left: 0;
207 + padding: 2px 12px 6px 8px;
208 + font-size: 16px;
209 + font-weight: bold;
210 + text-transform: uppercase;
211 + }
212 +
213 + &.shipping {
214 + .info {
215 + background: $background-color;
216 + padding: 30px;
217 + margin-right: 10px;
218 + box-sizing: border-box;
219 + }
220 + .type {
221 + background: $background-color;
222 + margin-left: 10px;
223 + padding: 30px;
224 + box-sizing: border-box;
225 +
226 + .type-btn {
227 + background: transparentize($text-color-accent, 0.9);
228 + border: 1px solid $text-color-accent;
229 + color: $text-color-accent;
230 + padding: 20px;
231 + text-align: center;
232 +
233 + &.active {
234 + background: $text-color-accent;
235 + color: white;
236 + }
237 + }
238 + }
239 + }
240 +
241 + &.review {
242 + .items {
243 + .item {
244 + background: transparentize($text-color-primary, 0.97);
245 + box-sizing: border-box;
246 +
247 + .photo {
248 + width: 65px;
249 + padding: 10px;
250 + background: white;
251 +
252 + img {
253 + width: 100%;
254 + display: block;
255 + }
256 + }
257 +
258 + .box {
259 + padding-left: 20px;
260 + padding-right: 20px;
261 +
262 + .product-name {
263 + font-size: 16px;
264 + }
265 + .price {
266 + font-size: 14px;
267 + margin-top: 2px;
268 + color: $text-color-accent;
269 + }
270 + }
271 +
272 + &:hover {
273 + .photo {
274 + .add-btn {
275 + opacity: 1;
276 + }
277 + }
278 + }
279 + }
280 + }
281 + }
282 +
283 + &.payment {
284 + .card {
285 + max-width: 400px;
286 + }
287 +
288 + .total {
289 + text-align: right;
290 + font-size: 16px;
291 +
292 + .t-row {
293 + & > div {
294 + display: inline-block;
295 + }
296 + .label {
297 + padding: 5px 10px;
298 + opacity: 0.6;
299 + }
300 + .value {
301 + padding: 5px 10px;
302 + min-width: 100px;
303 + text-align: left;
304 + }
305 +
306 + &.tot {
307 + & > div {
308 + font-size: 20px;
309 + opacity: 1;
310 + font-weight: bold;
311 + border-top: 1px solid $text-color-primary;
312 + }
313 + }
314 + }
315 +
316 + button {
317 + background: transparentize($text-color-accent, 0.9);
318 + border: 1px solid $text-color-accent;
319 + border-radius: 0;
320 + color: $text-color-accent;
321 + padding: 10px;
322 + margin-top: 10px;
323 + font-family: inherit;
324 + font-size: 20px;
325 + font-weight: bold;
326 + width: 100%;
327 + max-width: 300px;
328 + text-align: center;
329 + cursor: pointer;
330 +
331 + &:hover {
332 + background: $text-color-accent;
333 + color: white;
334 + }
335 + }
336 + }
337 +
338 + .small-info {
339 + display: none;
340 + }
341 + }
342 + }
343 +}
344 +
345 +@media (max-width: 1100px) {
346 + .page-ecommerce-checkout {
347 + .widget {
348 + &.payment {
349 + .info {
350 + display: none;
351 + }
352 + .small-info {
353 + display: block;
354 + }
355 + }
356 + }
357 + }
358 +}
359 +@media (max-width: 850px) {
360 + .page-ecommerce-checkout {
361 + .widget {
362 + &.shipping {
363 + .content {
364 + & > .flex {
365 + display: block;
366 + clear: both;
367 + width: 100%;
368 + }
369 + }
370 +
371 + .info {
372 + display: block;
373 + clear: both;
374 + width: 100%;
375 + margin: 0;
376 + margin-top: 40px;
377 + }
378 + .type {
379 + display: block;
380 + clear: both;
381 + width: 100%;
382 + margin: 0;
383 + }
384 + }
385 +
386 + &.payment {
387 + .content {
388 + & > .flex {
389 + display: block;
390 + clear: both;
391 + width: 100%;
392 + }
393 + }
394 +
395 + .card {
396 + display: block;
397 + clear: both;
398 + width: 100%;
399 + margin: 0 auto;
400 + margin-top: 40px;
401 + }
402 + .total {
403 + display: block;
404 + clear: both;
405 + width: 100%;
406 + margin: 0 auto;
407 + margin-top: 20px;
408 + }
409 + }
410 + }
411 + }
412 +}
413 +
414 +@media (max-width: 450px) {
415 + .page-ecommerce-checkout {
416 + .widget {
417 + &.payment {
418 + .total {
419 + font-size: 12px;
420 +
421 + .t-row {
422 + .value {
423 + min-width: inherit;
424 + }
425 + &.tot {
426 + & > div {
427 + font-size: 14px;
428 + }
429 + }
430 + }
431 + }
432 + }
433 + }
434 + }
435 +}
436 +</style>
src/views/apps/ecommerce/Dashboard.vue new
+503
@@ -0,0 +1,503 @@
1 +<template>
2 + <el-scrollbar class="page-ecommerce-dashboard">
3 + <resize-observer @notify="__resizeHanlder" />
4 +
5 + <div class="card-base card-alt">
6 + <el-row :gutter="30">
7 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
8 + <div class="widget p-20">
9 + <div class="text-uppercase text-right flex">
10 + <div class="box grow">
11 + <h3 class="m-0">2.384</h3>
12 + <p class="m-0">Daily Orders</p>
13 + </div>
14 + <div class="icon-box ph-15 accent-text">
15 + <i class="mdi mdi-cart-outline"></i>
16 + </div>
17 + </div>
18 + <div class="progress-box mt-10">
19 + <el-progress :percentage="78" class="themed"></el-progress>
20 + </div>
21 + </div>
22 + </el-col>
23 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
24 + <div class="widget p-20">
25 + <div class="text-uppercase text-right flex">
26 + <div class="box grow">
27 + <h3 class="m-0">7.945,87 $</h3>
28 + <p class="m-0">Daily Earnings</p>
29 + </div>
30 + <div class="icon-box ph-15 accent-text">
31 + <i class="mdi mdi-currency-usd"></i>
32 + </div>
33 + </div>
34 + <div class="progress-box mt-10">
35 + <el-progress :percentage="67" class="themed"></el-progress>
36 + </div>
37 + </div>
38 + </el-col>
39 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
40 + <div class="widget p-20">
41 + <div class="text-uppercase text-right flex">
42 + <div class="box grow">
43 + <h3 class="m-0">5.760</h3>
44 + <p class="m-0">Monthly Sales</p>
45 + </div>
46 + <div class="icon-box ph-15 accent-text">
47 + <i class="mdi mdi-cart-outline"></i>
48 + </div>
49 + </div>
50 + <div class="progress-box mt-10">
51 + <el-progress :percentage="23" class="themed"></el-progress>
52 + </div>
53 + </div>
54 + </el-col>
55 + <el-col :xs="24" :sm="12" :md="12" :lg="6" :xl="6">
56 + <div class="widget p-20">
57 + <div class="text-uppercase text-right flex">
58 + <div class="box grow">
59 + <h3 class="m-0">68.329,29 $</h3>
60 + <p class="m-0">Monthly Earnings</p>
61 + </div>
62 + <div class="icon-box ph-15 accent-text">
63 + <i class="mdi mdi-currency-usd"></i>
64 + </div>
65 + </div>
66 + <div class="progress-box mt-10">
67 + <el-progress :percentage="37" class="themed"></el-progress>
68 + </div>
69 + </div>
70 + </el-col>
71 + </el-row>
72 + </div>
73 +
74 + <div class="card-base card-shadow--medium bg-white black-text ph-5 p-0 pb-20 mt-20">
75 + <el-row>
76 + <el-col :xs="24" :sm="12" :md="12" :lg="16" :xl="16">
77 + <div>
78 + <div id="chart" :style="{ height: '500px', width: '100%' }"></div>
79 + </div>
80 + </el-col>
81 + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
82 + <div>
83 + <div id="pie" :style="{ height: '500px', width: '100%' }"></div>
84 + </div>
85 + </el-col>
86 + </el-row>
87 + </div>
88 +
89 + <el-scrollbar class="table-box card-base card-outline mv-20">
90 + <table class="styled striped hover">
91 + <thead>
92 + <tr>
93 + <th>Product</th>
94 + <th>Customer</th>
95 + <th>Location</th>
96 + <th>Amount</th>
97 + <th>Status</th>
98 + </tr>
99 + </thead>
100 + <tbody>
101 + <tr v-for="item in gridData" :key="item.id">
102 + <td>
103 + <div class="item-box item-product">
104 + <div class="product-image">
105 + <img :src="item.photo" />
106 + </div>
107 + <div>
108 + <h4 class="m-0 mb-5">{{ item.product }}</h4>
109 + <p class="m-0">{{ item.price }} $</p>
110 + </div>
111 + </div>
112 + </td>
113 + <td>
114 + <div class="item-box item-customer">
115 + <h4 class="m-0 mb-5">{{ item.customer }}</h4>
116 + <p class="m-0">
117 + <a>{{ item.email }}</a>
118 + </p>
119 + </div>
120 + </td>
121 + <td>
122 + <div class="item-box item-location">
123 + <h4 class="m-0 mb-5">{{ item.address }}</h4>
124 + <p class="m-0 o-060">{{ item.city }}</p>
125 + </div>
126 + </td>
127 + <td>
128 + <div class="item-box item-amount">
129 + <h4 class="m-0 mb-5">{{ item.amount }} $</h4>
130 + <p class="m-0 o-060">{{ item.qnt }}</p>
131 + </div>
132 + </td>
133 + <td>
134 + <div :class="'item-box item-status status-' + item.status">
135 + <h4 class="m-0 mb-5">{{ item.status }}</h4>
136 + <p class="m-0 o-060">{{ item.date }}</p>
137 + </div>
138 + </td>
139 + </tr>
140 + </tbody>
141 + </table>
142 + </el-scrollbar>
143 + </el-scrollbar>
144 +</template>
145 +
146 +<script>
147 +import * as echarts from "echarts"
148 +import Chance from "chance"
149 +const chance = new Chance()
150 +import _ from "lodash"
151 +import ResizeObserver from "@/components/vue-resize/ResizeObserver.vue"
152 +
153 +import { defineComponent } from "@vue/runtime-core"
154 +
155 +export default defineComponent({
156 + name: "EcommerceDashboard",
157 + data() {
158 + return {
159 + chart: null,
160 + pie: null,
161 + gridData: []
162 + }
163 + },
164 + created() {
165 + this.initGridData()
166 + },
167 + mounted() {
168 + this.initChart()
169 + this.initPie()
170 + window.addEventListener("resize", this.__resizeHanlder)
171 + },
172 + beforeUnmount() {
173 + if (!this.chart) {
174 + return
175 + }
176 +
177 + if (!this.pie) {
178 + return
179 + }
180 +
181 + window.removeEventListener("resize", this.__resizeHanlder)
182 + this.chart.dispose()
183 + this.pie.dispose()
184 + this.chart = null
185 + this.pie = null
186 + },
187 + methods: {
188 + __resizeHanlder: _.throttle(function (e) {
189 + if (this.chart) {
190 + // this.chart.resize()
191 + this.chart.dispose()
192 + this.initChart()
193 + }
194 + if (this.pie) {
195 + this.pie.resize()
196 + }
197 + }, 700),
198 + initChart() {
199 + this.chart = echarts.init(document.getElementById("chart"))
200 + this.chart.setOption({
201 + //backgroundColor: '#394056',
202 + title: {
203 + top: 20,
204 + text: "SALES STATISTICS",
205 + textStyle: { fontWeight: "normal", fontSize: 16, fontFamily: "Nunito Sans" /*color: '#F1F1F3'*/ },
206 + left: "1%"
207 + },
208 + tooltip: {
209 + trigger: "axis",
210 + axisPointer: {
211 + lineStyle: {
212 + /*color: '#57617B'*/
213 + }
214 + }
215 + },
216 + legend: {
217 + top: 40,
218 + icon: "rect",
219 + itemWidth: 14,
220 + itemHeight: 5,
221 + itemGap: 13,
222 + data: ["Product-A", "Product-B"],
223 + right: "4%",
224 + textStyle: { fontSize: 12, fontFamily: "Nunito Sans" /*color: '#F1F1F3'*/ }
225 + },
226 + grid: {
227 + top: 100,
228 + left: "-5px",
229 + right: "30px",
230 + bottom: "2%",
231 + containLabel: true
232 + },
233 + xAxis: [
234 + {
235 + type: "category",
236 + boundaryGap: false,
237 + axisLine: {
238 + lineStyle: {
239 + /*color: '#57617B'*/
240 + }
241 + },
242 + data: ["13:00", "13:05", "13:10", "13:15", "13:20", "13:25", "13:30", "13:35", "13:40", "13:45", "13:50", "13:55"]
243 + }
244 + ],
245 + yAxis: [
246 + {
247 + show: false,
248 + type: "value",
249 + name: "(%)",
250 + axisTick: { show: false },
251 + axisLine: {
252 + lineStyle: {
253 + /*color: '#57617B'*/
254 + }
255 + },
256 + axisLabel: {
257 + margin: 10,
258 + fontSize: 14
259 + },
260 + splitLine: { lineStyle: { color: "#eee" /*color: '#57617B'*/ } }
261 + }
262 + ],
263 + series: [
264 + {
265 + name: "Product-A",
266 + type: "line",
267 + smooth: true,
268 + symbol: "circle",
269 + symbolSize: 5,
270 + showSymbol: false,
271 + lineStyle: { width: 1 },
272 + areaStyle: {
273 + color: new echarts.graphic.LinearGradient(
274 + 0,
275 + 0,
276 + 0,
277 + 1,
278 + [
279 + {
280 + offset: 0,
281 + color: "rgba(19, 206, 102, 0.3)"
282 + },
283 + {
284 + offset: 0.8,
285 + color: "rgba(19, 206, 102, 0)"
286 + }
287 + ],
288 + false
289 + ),
290 + shadowColor: "rgba(0, 0, 0, 0.1)",
291 + shadowBlur: 10
292 + },
293 + itemStyle: {
294 + color: "rgb(19, 206, 102)",
295 + borderColor: "rgba(19, 206, 102, 0.27)",
296 + borderWidth: 12
297 + },
298 + data: [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122]
299 + },
300 + {
301 + name: "Product-B",
302 + type: "line",
303 + smooth: true,
304 + symbol: "circle",
305 + symbolSize: 5,
306 + showSymbol: false,
307 + lineStyle: { width: 1 },
308 + areaStyle: {
309 + color: new echarts.graphic.LinearGradient(
310 + 0,
311 + 0,
312 + 0,
313 + 1,
314 + [
315 + {
316 + offset: 0,
317 + color: "rgba(95, 143, 223, 0.3)"
318 + },
319 + {
320 + offset: 0.8,
321 + color: "rgba(95, 143, 223, 0)"
322 + }
323 + ],
324 + false
325 + ),
326 + shadowColor: "rgba(0, 0, 0, 0.1)",
327 + shadowBlur: 10
328 + },
329 + itemStyle: {
330 + color: "rgb(95, 143, 223)",
331 + borderColor: "rgba(95, 143, 223, 0.2)",
332 + borderWidth: 12
333 + },
334 + data: [120, 110, 125, 145, 122, 165, 122, 220, 182, 191, 134, 150]
335 + } /*{
336 + name: 'Product-C',
337 + type: 'line',
338 + smooth: true,
339 + symbol: 'circle',
340 + symbolSize: 5,
341 + showSymbol: false,
342 + lineStyle: { width: 1 },
343 + areaStyle: {
344 +
345 + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
346 + offset: 0,
347 + color: 'rgba(236, 32, 95, 0.3)'
348 + }, {
349 + offset: 0.8,
350 + color: 'rgba(236, 32, 95, 0)'
351 + }], false),
352 + shadowColor: 'rgba(0, 0, 0, 0.1)',
353 + shadowBlur: 10
354 +
355 + },
356 + itemStyle: {
357 +
358 + color: 'rgb(236, 32, 95)',
359 + borderColor: 'rgba(236, 32, 95, 0.2)',
360 + borderWidth: 12
361 +
362 + },
363 + data: [220, 182, 125, 145, 122, 191, 134, 150, 120, 110, 165, 122]
364 + }*/
365 + ]
366 + })
367 + },
368 + initPie() {
369 + this.pie = echarts.init(document.getElementById("pie"))
370 + this.pie.setOption({
371 + title: {
372 + top: 20,
373 + text: "ORDER STATUS",
374 + textStyle: { fontWeight: "normal", fontSize: 16, fontFamily: "Nunito Sans" /*color: '#F1F1F3'*/ },
375 + left: "1%"
376 + },
377 + tooltip: {
378 + trigger: "item",
379 + formatter: "{a} <br/>{b}: {c} ({d}%)"
380 + },
381 + series: [
382 + {
383 + name: "Status",
384 + type: "pie",
385 + selectedMode: "single",
386 + radius: [0, "35%"],
387 +
388 + label: {
389 + position: "inner"
390 + },
391 + labelLine: {
392 + show: false
393 + },
394 + data: [
395 + {
396 + value: 335,
397 + name: "Orders",
398 + selected: true,
399 + itemStyle: { color: "rgb(95, 143, 223)" }
400 + },
401 + { value: 679, name: "Pending", itemStyle: { color: "rgb(19, 206, 102)" } },
402 + { value: 1548, name: "Delivered", itemStyle: { color: "rgb(247, 186, 43)" } }
403 + ]
404 + },
405 + {
406 + name: "Products",
407 + type: "pie",
408 + radius: ["45%", "60%"],
409 +
410 + data: [
411 + { value: 335, name: "p1", itemStyle: { color: "#3f84f6" } },
412 + { value: 310, name: "p2", itemStyle: { color: "#4c8bf7" } },
413 + { value: 234, name: "p3", itemStyle: { color: "#5a95f7" } },
414 + { value: 135, name: "p4", itemStyle: { color: "#70a3f8" } },
415 + { value: 1048, name: "p5", itemStyle: { color: "#8ab4fa" } },
416 + { value: 251, name: "p6", itemStyle: { color: "#a3c4fb" } },
417 + { value: 147, name: "p7", itemStyle: { color: "#bfd6fc" } },
418 + { value: 102, name: "p8", itemStyle: { color: "#d4e4fd" } }
419 + ],
420 +
421 + itemStyle: {
422 + color: "rgb(19, 206, 102)"
423 + }
424 + }
425 + ]
426 + })
427 + },
428 + initGridData() {
429 + const year = new Date().getFullYear()
430 + const status_list = ["Complete", "Pending", "Returned", "Paid"]
431 +
432 + _.times(10, number => {
433 + let price = chance.floating({ min: 1, max: 100, fixed: 2 })
434 + let qnt = chance.integer({ min: 1, max: 5 })
435 + let amount = price * qnt
436 +
437 + this.gridData.push({
438 + customer: chance.name(),
439 + photo: "/static/images/shop/" + chance.integer({ min: 0, max: 19 }) + ".jpg",
440 + city: chance.city(),
441 + address: chance.address(),
442 + email: chance.email(),
443 + product: chance.sentence({ words: 3 }),
444 + price: _.replace(price.toFixed(2).toString(), ".", ","),
445 + qnt,
446 + amount: _.replace(amount.toFixed(2).toString(), ".", ","),
447 + status: status_list[chance.integer({ min: 0, max: 3 })],
448 + date: chance.date({ string: true, year: year }),
449 + id: number
450 + })
451 + })
452 + }
453 + },
454 + components: { ResizeObserver }
455 +})
456 +</script>
457 +
458 +<style lang="scss">
459 +@import "../../../assets/scss/_variables";
460 +
461 +.page-ecommerce-dashboard {
462 + .widget {
463 + .icon-box {
464 + font-size: 30px;
465 + }
466 + }
467 +
468 + .table-box {
469 + .item-box {
470 + &.item-product {
471 + .product-image {
472 + width: 50px;
473 + margin-right: 15px;
474 + float: left;
475 +
476 + img {
477 + width: 100%;
478 + }
479 + }
480 + }
481 +
482 + &.item-status {
483 + padding: 5px 10px;
484 +
485 + &.status- {
486 + &Complete {
487 + background: rgba(44, 196, 120, 0.25);
488 + }
489 + &Pending {
490 + background: rgba(247, 186, 42, 0.25);
491 + }
492 + &Returned {
493 + background: rgba(243, 24, 71, 0.25);
494 + }
495 + &Paid {
496 + background: rgba(45, 109, 211, 0.25);
497 + }
498 + }
499 + }
500 + }
501 + }
502 +}
503 +</style>
src/views/apps/ecommerce/Ecommerce.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Ecommerce"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/apps/ecommerce/NewProduct.vue new
+543
@@ -0,0 +1,543 @@
1 +<template>
2 + <el-scrollbar class="page-ecommerce-new-product">
3 + <div class="page-header card-base header-accent">
4 + <h1>
5 + <span>Ecommerce new product</span>
6 + </h1>
7 + <el-breadcrumb separator="/">
8 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
9 + <el-breadcrumb-item :to="{ path: '/ecommerce' }">Ecommerce</el-breadcrumb-item>
10 + <el-breadcrumb-item>New Product</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 +
14 + <el-row>
15 + <el-col>
16 + <div class="item-box card-shadow--small b-rad-4">
17 + <el-row>
18 + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
19 + <div class="gallery-box">
20 + <div class="main-photo">
21 + <div class="btn-close"><i class="mdi mdi-close"></i></div>
22 + <img src="/static/images/shop/2.jpg" />
23 + </div>
24 + <div class="other-photos">
25 + <div class="a-photo">
26 + <div class="btn-close"><i class="mdi mdi-close"></i></div>
27 + <img src="/static/images/shop/2.jpg" />
28 + </div>
29 + <div class="a-photo">
30 + <div class="btn-close"><i class="mdi mdi-close"></i></div>
31 + <img src="/static/images/shop/2.jpg" />
32 + </div>
33 + <div class="a-photo">
34 + <div class="add-photo">
35 + <div class="dashed-box"></div>
36 + <i class="mdi mdi-image-plus"></i>
37 + </div>
38 + </div>
39 + </div>
40 + </div>
41 + </el-col>
42 + <el-col :xs="24" :sm="12" :md="12" :lg="16" :xl="16">
43 + <div class="detail-box">
44 + <el-row>
45 + <el-col>
46 + <input class="title" v-model="title" placeholder="Product name" />
47 + </el-col>
48 + </el-row>
49 + <el-row>
50 + <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
51 + <div class="number-input">
52 + <label>Price ($)</label>
53 + <el-input-number
54 + v-model="price"
55 + controls-position="right"
56 + :min="1"
57 + class="themed mr-10 mb-10"
58 + ></el-input-number>
59 + </div>
60 + </el-col>
61 + <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
62 + <div class="number-input">
63 + <label>Discount (%)</label>
64 + <el-input-number
65 + v-model="discount"
66 + controls-position="right"
67 + :min="1"
68 + class="themed mr-10 mb-10"
69 + ></el-input-number>
70 + </div>
71 + </el-col>
72 + <el-col :xs="24" :sm="24" :md="8" :lg="8" :xl="8">
73 + <div class="number-input">
74 + <label>Stock</label>
75 + <el-input-number
76 + v-model="stock"
77 + controls-position="right"
78 + :min="1"
79 + class="themed mr-10 mb-10"
80 + ></el-input-number>
81 + </div>
82 + </el-col>
83 + </el-row>
84 + <el-row>
85 + <el-col class="final-price">
86 + final price: <strong>$ {{ finalPrice }}</strong
87 + >, discount: <strong>$ {{ discountPrice }}</strong>
88 + </el-col>
89 + </el-row>
90 + <el-row>
91 + <el-col class="description-box">
92 + <textarea-autosize
93 + v-model="description"
94 + placeholder="Description"
95 + :min-height="100"
96 + ></textarea-autosize>
97 + </el-col>
98 + </el-row>
99 + <el-row :gutter="20">
100 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
101 + <div class="select-box mb-10">
102 + <el-select
103 + v-model="cat"
104 + placeholder="Category"
105 + clearable
106 + class="themed"
107 + :popper-class="'themed color-accent-' + colorAccent"
108 + >
109 + <el-option
110 + v-for="(i, index) in cat_list"
111 + :key="index"
112 + :label="i"
113 + :value="kebabCase(i)"
114 + ></el-option>
115 + <el-option :label="'Cat 2'" :value="'cat2'"></el-option>
116 + <el-option :label="'Cat 3'" :value="'cat3'"></el-option>
117 + </el-select>
118 + </div>
119 + </el-col>
120 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
121 + <div class="select-box mb-10">
122 + <el-select
123 + v-model="tags"
124 + multiple
125 + filterable
126 + allow-create
127 + default-first-option
128 + placeholder="Tags"
129 + class="themed"
130 + :popper-class="'themed color-accent-' + colorAccent"
131 + >
132 + <el-option
133 + v-for="item in tags_options"
134 + :key="item.value"
135 + :label="item.label"
136 + :value="item.value"
137 + ></el-option>
138 + </el-select>
139 + </div>
140 + </el-col>
141 + </el-row>
142 +
143 + <el-row class="mt-50">
144 + <el-col class="text-right">
145 + <el-radio-group v-model="status" class="themed">
146 + <el-radio-button label="In Stock"></el-radio-button>
147 + <el-radio-button label="Awaiting"></el-radio-button>
148 + <el-radio-button label="Out of Stock"></el-radio-button>
149 + </el-radio-group>
150 + </el-col>
151 + </el-row>
152 +
153 + <el-row>
154 + <el-col>
155 + <div class="actions-box text-right">
156 + <el-switch
157 + v-model="active"
158 + active-text="Active"
159 + inactive-text=""
160 + class="mr-20 themed"
161 + ></el-switch>
162 + <el-button class="themed mb-10 mr-10" type="primary" plain
163 + ><i class="mdi mdi-content-save"></i> Save</el-button
164 + >
165 + <el-button class="themed mb-10" type="primary" plain
166 + ><i class="mdi mdi-refresh"></i> Reset</el-button
167 + >
168 + </div>
169 + </el-col>
170 + </el-row>
171 + </div>
172 + </el-col>
173 + </el-row>
174 + </div>
175 + </el-col>
176 + </el-row>
177 +
178 + <el-row class="mt-20">
179 + <el-col>
180 + <div class="item-box p-30 card-shadow--small b-rad-4">
181 + <el-row>
182 + <el-col>
183 + <div class="meta-form">
184 + <h3 class="m-0">Meta data</h3>
185 + <el-row class="mt-30" :gutter="20">
186 + <el-col :xs="24" :sm="12" :md="6" :lg="4" :xl="4">
187 + <input placeholder="Key" />
188 + </el-col>
189 + <el-col :xs="24" :sm="12" :md="6" :lg="8" :xl="8">
190 + <input placeholder="Value" />
191 + </el-col>
192 + <el-col :xs="24" :sm="12" :md="6" :lg="8" :xl="8">
193 + <input placeholder="Description" />
194 + </el-col>
195 + <el-col :xs="24" :sm="12" :md="6" :lg="4" :xl="4">
196 + <button><i class="mdi mdi-plus-box mr-10 fs-20"></i>add meta</button>
197 + </el-col>
198 + </el-row>
199 + <el-row class="mt-10" :gutter="20" v-for="i in meta" :key="i.id">
200 + <el-col :xs="24" :sm="12" :md="6" :lg="4" :xl="4">
201 + <input placeholder="Key" v-model="i.title" />
202 + </el-col>
203 + <el-col :xs="24" :sm="12" :md="6" :lg="8" :xl="8">
204 + <input placeholder="Value" v-model="i.keywords" />
205 + </el-col>
206 + <el-col :xs="24" :sm="12" :md="6" :lg="8" :xl="8">
207 + <input placeholder="Description" v-model="i.description" />
208 + </el-col>
209 + <el-col :xs="24" :sm="12" :md="6" :lg="4" :xl="4">
210 + <button><i class="mdi mdi-close-box mr-10 fs-20"></i>delete</button>
211 + </el-col>
212 + </el-row>
213 + </div>
214 + </el-col>
215 + </el-row>
216 + </div>
217 + </el-col>
218 + </el-row>
219 + </el-scrollbar>
220 +</template>
221 +
222 +<script>
223 +import _ from "lodash"
224 +import { useMainStore } from "@/stores/main"
225 +import TextareaAutosize from "@/components/TextareaAutosize.vue"
226 +import { defineComponent } from "@vue/runtime-core"
227 +
228 +export default defineComponent({
229 + name: "EcommerceNewProduct",
230 + data() {
231 + return {
232 + discount: 15,
233 + price: 155,
234 + stock: 100,
235 + tags_options: [
236 + {
237 + value: "Chairs",
238 + label: "Chairs"
239 + },
240 + {
241 + value: "Foldable",
242 + label: "Foldable"
243 + },
244 + {
245 + value: "Garden",
246 + label: "Garden"
247 + }
248 + ],
249 + tags: [],
250 + title: "",
251 + description: "",
252 + cat: "bar-stools",
253 + cat_list: [
254 + "Dining chairs",
255 + "Foldable chairs",
256 + "Bar Stools",
257 + "Garden chairs",
258 + "Step stools",
259 + "Junior chairs",
260 + "High chairs",
261 + "Fabric armchairs",
262 + "Leather armchairs",
263 + "Rattan armchairs",
264 + "Swivel chairs",
265 + "Office chairs"
266 + ],
267 + status: "Awaiting",
268 + active: true,
269 + meta: [
270 + {
271 + id: 0,
272 + title: "Brand",
273 + keywords: "Stellar",
274 + description: ""
275 + },
276 + {
277 + id: 1,
278 + title: "Seat Lock Included",
279 + keywords: "Yes",
280 + description: ""
281 + },
282 + {
283 + id: 2,
284 + title: "Type",
285 + keywords: "Office Chair",
286 + description: ""
287 + },
288 + {
289 + id: 3,
290 + title: "Style",
291 + keywords: "Contemporary & Modern",
292 + description: ""
293 + }
294 + ]
295 + }
296 + },
297 + computed: {
298 + finalPrice() {
299 + return (this.price - this.discountPrice).toFixed(2)
300 + },
301 + discountPrice() {
302 + return ((this.price / 100) * this.discount).toFixed(2)
303 + },
304 + colorAccent() {
305 + return useMainStore().colorAccent
306 + }
307 + },
308 + methods: {
309 + kebabCase: _.kebabCase
310 + },
311 + components: { TextareaAutosize }
312 +})
313 +</script>
314 +
315 +<style lang="scss">
316 +@import "../../../assets/scss/_variables";
317 +
318 +.page-ecommerce-new-product {
319 + .page-header {
320 + margin-bottom: 20px;
321 + }
322 +
323 + .item-box {
324 + background: white;
325 +
326 + .main-photo,
327 + .a-photo {
328 + position: relative;
329 +
330 + img {
331 + width: 100%;
332 + }
333 +
334 + .btn-close {
335 + position: absolute;
336 + right: 30px;
337 + top: 30px;
338 + background: rgba(0, 0, 0, 0.1);
339 + width: 20px;
340 + height: 20px;
341 + text-align: center;
342 + line-height: 20px;
343 + }
344 + }
345 +
346 + .main-photo {
347 + padding: 30px;
348 + box-sizing: border-box;
349 + }
350 + .other-photos {
351 + padding: 0 15px;
352 + padding-bottom: 15px;
353 + box-sizing: border-box;
354 +
355 + .a-photo {
356 + width: 33.3333333%;
357 + box-sizing: border-box;
358 + padding: 0 15px;
359 + display: inline-block;
360 +
361 + .btn-close {
362 + position: absolute;
363 + right: 15px;
364 + top: 0px;
365 + }
366 +
367 + .add-photo {
368 + width: 100%;
369 + height: 100%;
370 + box-sizing: border-box;
371 + padding-bottom: 100%;
372 + position: relative;
373 +
374 + .dashed-box {
375 + border: 4px dashed transparentize($text-color-accent, 0.5);
376 + position: absolute;
377 + top: 0;
378 + left: 0;
379 + right: 0;
380 + bottom: 0;
381 + }
382 +
383 + .mdi {
384 + position: absolute;
385 + top: 50%;
386 + left: 50%;
387 + font-size: 30px;
388 + transform: translateX(-50%) translateY(-50%);
389 + opacity: 0.7;
390 + }
391 + }
392 + }
393 + }
394 +
395 + .detail-box {
396 + padding: 30px;
397 + padding-left: 0;
398 +
399 + .title {
400 + background: transparent;
401 + font-size: 30px;
402 + border: none;
403 + outline: none;
404 + border-bottom: 2px solid transparentize($text-color-primary, 0.8);
405 + font-family: inherit;
406 + width: 100%;
407 + margin-bottom: 20px;
408 + color: $text-color-primary;
409 + font-weight: bold;
410 + }
411 +
412 + .number-input {
413 + margin-bottom: 10px;
414 +
415 + label {
416 + display: block;
417 + clear: both;
418 + opacity: 0.5;
419 + margin-bottom: 10px;
420 + font-size: 14px;
421 + }
422 + }
423 +
424 + .final-price {
425 + color: transparentize($text-color-primary, 0.3);
426 +
427 + strong {
428 + color: $text-color-accent;
429 + }
430 + }
431 +
432 + .description-box {
433 + margin-top: 20px;
434 + margin-bottom: 10px;
435 +
436 + textarea {
437 + border: 1px solid transparentize($text-color-accent, 0.7);
438 + outline: none;
439 + width: 100%;
440 + resize: vertical;
441 + background: white;
442 + font-family: inherit;
443 + padding: 10px;
444 + box-sizing: border-box;
445 + color: $text-color-primary;
446 + font-size: 16px;
447 + border-radius: 4px;
448 + }
449 + }
450 +
451 + .el-input-number {
452 + width: 90px;
453 +
454 + .el-input__inner {
455 + color: $text-color-accent;
456 + background-color: transparent;
457 + border-color: transparentize($text-color-accent, 0.7);
458 + font-family: inherit;
459 + font-weight: bold;
460 + }
461 + }
462 +
463 + .el-button {
464 + font-family: inherit;
465 + margin-left: 0;
466 + }
467 +
468 + .select-box {
469 + box-sizing: border-box;
470 + }
471 +
472 + .el-select {
473 + width: 100%;
474 +
475 + .el-input__inner {
476 + border-color: transparentize($text-color-accent, 0.7);
477 + color: $text-color-accent;
478 + font-family: inherit;
479 + }
480 + }
481 +
482 + .actions-box {
483 + text-align: right;
484 + margin-top: 20px;
485 + }
486 +
487 + .el-radio-group {
488 + .el-radio-button__inner {
489 + background-color: transparentize($text-color-accent, 0.9);
490 + border-color: transparentize($text-color-accent, 0.7);
491 + color: $text-color-accent;
492 + }
493 + .el-radio-button__orig-radio:checked + .el-radio-button__inner {
494 + background-color: $text-color-accent;
495 + color: white;
496 + }
497 + }
498 + }
499 +
500 + .meta-form {
501 + input,
502 + button {
503 + border: 1px solid transparentize($text-color-accent, 0.7);
504 + outline: none;
505 + border-radius: 4px;
506 + color: $text-color-primary;
507 + padding: 8px 13px;
508 + background: white;
509 + width: 100%;
510 + margin-bottom: 7px;
511 + box-sizing: border-box;
512 + font-family: inherit;
513 + font-size: 14px;
514 + }
515 +
516 + button {
517 + cursor: pointer;
518 + border-bottom: 1px solid $text-color-accent;
519 + font-family: inherit;
520 + text-transform: uppercase;
521 + line-height: 0;
522 + padding: 16px 2px;
523 + color: $text-color-accent;
524 +
525 + i {
526 + position: relative;
527 + top: 3px;
528 + }
529 + }
530 + }
531 + }
532 +}
533 +
534 +@media (max-width: 768px) {
535 + .page-ecommerce-new-product {
536 + .item-box {
537 + .detail-box {
538 + padding-left: 30px;
539 + }
540 + }
541 + }
542 +}
543 +</style>
src/views/apps/ecommerce/ProductDetail.vue new
+228
@@ -0,0 +1,228 @@
1 +<template>
2 + <div class="page-ecommerce-product-detail scrollable only-y">
3 + <el-breadcrumb separator="/" class="themed">
4 + <el-breadcrumb-item :to="{ name: 'ecommerce-shop' }">Shop</el-breadcrumb-item>
5 + <el-breadcrumb-item :to="{ name: 'ecommerce-shop' }">Office</el-breadcrumb-item>
6 + <el-breadcrumb-item :to="{ name: 'ecommerce-products' }">Chairs</el-breadcrumb-item>
7 + <el-breadcrumb-item>Beautifull Seat</el-breadcrumb-item>
8 + </el-breadcrumb>
9 +
10 + <el-row class="mt-30">
11 + <el-col>
12 + <div class="item-box card-shadow--medium">
13 + <el-row>
14 + <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="8">
15 + <div class="gallery-box">
16 + <div class="main-photo">
17 + <img src="/static/images/shop/2.jpg" data-zoom="/static/images/shop/2.jpg" />
18 + </div>
19 + </div>
20 + </el-col>
21 + <el-col :xs="24" :sm="12" :md="12" :lg="16" :xl="16">
22 + <div class="detail-box">
23 + <h1 class="title">Beautifull Seat</h1>
24 + <div class="rate">
25 + <el-rate
26 + v-model="rate"
27 + style="width: 120px; display: inline-block; margin-right: 10px"
28 + disabled
29 + ></el-rate>
30 + <span class="review fs-12 o-050">(5 customer review)</span>
31 + </div>
32 + <div class="price-box">
33 + <span class="discounted-price">$ 637,24</span>
34 + <span class="normal-price">$ 937,78</span>
35 + <span class="discount">28% off</span>
36 + </div>
37 + <div class="description">
38 + Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or
39 + randomised words which don't look even slightly believable. but the majority have suffered alteration in
40 + some form, by injected humour.
41 + </div>
42 + <div class="actions-box">
43 + <el-button class="themed mr-10 mb-10" type="primary" plain>
44 + <i class="mdi mdi-cart-outline"></i> Add to Cart
45 + </el-button>
46 + <el-button class="themed mb-10 ml-0" type="primary" plain>
47 + <i class="mdi mdi-heart-outline"></i> Add to Wishlist
48 + </el-button>
49 + </div>
50 + </div>
51 + </el-col>
52 + </el-row>
53 + </div>
54 + </el-col>
55 + </el-row>
56 +
57 + <el-row class="mt-20">
58 + <el-col>
59 + <div class="item-box p-30">
60 + <el-tabs v-model="activeTab" class="themed">
61 + <el-tab-pane label="Description" name="description">
62 + <p>
63 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porttitor, nibh vel imperdiet pretium, augue ex
64 + rutrum sapien, sit amet rutrum purus libero pretium justo. Curabitur id nisi vitae metus ultricies
65 + condimentum. Fusce semper justo ipsum, rutrum rhoncus nulla scelerisque id. Lorem ipsum dolor sit amet,
66 + consectetur adipiscing elit. Donec tempor nisl ornare ipsum ultricies, nec fermentum sem tincidunt. Donec
67 + arcu purus, tincidunt sed urna a, tristique gravida arcu. Nam ac tincidunt felis. Nam pulvinar ante ut
68 + efficitur pellentesque. Cras vel sodales turpis. Nunc fermentum sed sem quis egestas. Nullam ultrices eu
69 + diam quis viverra. Proin nec convallis risus. Maecenas efficitur dolor quis lacus scelerisque, vel rutrum
70 + nibh vestibulum. Nullam ante lorem, faucibus at convallis ut, ullamcorper sed lacus. In finibus orci eu nibh
71 + venenatis, imperdiet rhoncus felis accumsan. Cras a augue bibendum, consectetur enim mattis, vulputate leo.
72 + </p>
73 + <p>
74 + Mauris vel facilisis tellus, sit amet cursus turpis. Duis ut consectetur nunc. Nulla viverra nulla vel mi
75 + pellentesque efficitur. Cras sit amet efficitur magna. Vestibulum ac ante ac magna feugiat scelerisque.
76 + Nullam condimentum gravida euismod. Donec rutrum egestas massa. Morbi venenatis dolor ac felis efficitur
77 + finibus. Vestibulum sed pellentesque sapien. Donec a rutrum leo, at ornare ligula. Nullam vel feugiat
78 + turpis, ac porta felis. Mauris hendrerit tincidunt ante sit amet vestibulum. Cras efficitur porta vulputate.
79 + </p>
80 + <p>
81 + Curabitur auctor lacus eget lorem blandit, ac tempus ante euismod. Morbi nec odio in sem elementum hendrerit
82 + id vel ipsum. In nec nibh vel orci porta pretium. Pellentesque habitant morbi tristique senectus et netus et
83 + malesuada fames ac turpis egestas. Cras nec tristique diam, ac vulputate massa. Aliquam massa magna,
84 + tincidunt et ultrices tempor, scelerisque nec sem. Sed auctor faucibus facilisis. Nulla vel ligula non
85 + mauris lobortis pretium. Donec sit amet volutpat nisl, sed ultrices turpis. Curabitur posuere erat nunc,
86 + eget volutpat turpis aliquet quis.
87 + </p>
88 + </el-tab-pane>
89 + <el-tab-pane label="Aditional information" name="info">
90 + <p>
91 + Curabitur auctor lacus eget lorem blandit, ac tempus ante euismod. Morbi nec odio in sem elementum hendrerit
92 + id vel ipsum. In nec nibh vel orci porta pretium. Pellentesque habitant morbi tristique senectus et netus et
93 + malesuada fames ac turpis egestas. Cras nec tristique diam, ac vulputate massa. Aliquam massa magna,
94 + tincidunt et ultrices tempor, scelerisque nec sem. Sed auctor faucibus facilisis. Nulla vel ligula non
95 + mauris lobortis pretium. Donec sit amet volutpat nisl, sed ultrices turpis. Curabitur posuere erat nunc,
96 + eget volutpat turpis aliquet quis.
97 + </p>
98 + <p>
99 + Ut posuere felis et ante pharetra ullamcorper. Maecenas sagittis nisl ac est porta volutpat. Praesent et
100 + mollis lorem, vel egestas augue. Aenean euismod auctor dapibus. Nullam sit amet urna erat. Duis euismod diam
101 + et nisl molestie dapibus. Sed non ligula vitae risus lacinia viverra id tempor neque. Sed tincidunt
102 + ultricies lacinia. Sed sed elit commodo, mattis mauris sed, imperdiet urna. Donec eu interdum ligula. In leo
103 + risus, vulputate sed diam nec, porta facilisis elit. Praesent sed sapien ultrices, vulputate nisl a,
104 + placerat nulla. Fusce mollis lectus orci. Pellentesque ut enim eleifend lacus dapibus vehicula. Sed mi
105 + neque, ullamcorper euismod diam quis, aliquet ultricies eros.
106 + </p>
107 + <p>
108 + Pellentesque nunc purus, ultrices vitae nisi id, placerat mollis leo. Aenean egestas orci vel ipsum eleifend
109 + dapibus. Suspendisse a pellentesque dui, eu sodales massa. Donec condimentum arcu vitae augue consequat, in
110 + sodales enim scelerisque. Sed sodales eros sed porta cursus. Ut pellentesque bibendum tincidunt. Donec a
111 + molestie risus, eget consectetur nulla. Sed sed diam erat. Vestibulum velit ligula, eleifend eget sem ut,
112 + tristique sagittis neque. Phasellus eget velit nisi. Ut finibus ligula eget lectus aliquet, a ullamcorper
113 + velit facilisis.
114 + </p>
115 + </el-tab-pane>
116 + <el-tab-pane label="Reviews (0)" name="reviews"> Leave a review </el-tab-pane>
117 + </el-tabs>
118 + </div>
119 + </el-col>
120 + </el-row>
121 + </div>
122 +</template>
123 +
124 +<script>
125 +import Drift from "drift-zoom"
126 +
127 +import { defineComponent } from "@vue/runtime-core"
128 +
129 +export default defineComponent({
130 + name: "EcommerceProductDetail",
131 + data() {
132 + return {
133 + rate: 4,
134 + qnt: 1,
135 + activeTab: "description"
136 + }
137 + },
138 + mounted() {
139 + const mainPhoto = document.querySelector(".main-photo img")
140 + const paneContainer = document.querySelector(".main-photo")
141 +
142 + new Drift(mainPhoto, {
143 + paneContainer: paneContainer,
144 + inlinePane: false,
145 + zoomFactor: 2
146 + })
147 + }
148 +})
149 +</script>
150 +
151 +<style lang="scss">
152 +@import "../../../assets/scss/_variables";
153 +
154 +.page-ecommerce-product-detail {
155 + padding: 0 20px;
156 +
157 + .item-box {
158 + border-radius: 4px;
159 + overflow: hidden;
160 +
161 + .main-photo {
162 + position: relative;
163 + overflow: hidden;
164 + background: white;
165 + padding: 30px;
166 +
167 + img {
168 + width: 100%;
169 + }
170 + }
171 + .detail-box {
172 + padding: 30px;
173 + position: relative;
174 +
175 + .title {
176 + margin: 0;
177 + }
178 +
179 + .price-box {
180 + margin-top: 20px;
181 + margin-bottom: 30px;
182 +
183 + .discounted-price {
184 + color: $text-color-accent;
185 + font-weight: bold;
186 + font-size: 25px;
187 + margin-right: 20px;
188 + display: inline-block;
189 + }
190 + .normal-price {
191 + opacity: 0.5;
192 + text-decoration: line-through;
193 + text-decoration-color: $text-color-accent;
194 + margin-right: 10px;
195 + display: inline-block;
196 + }
197 + .discount {
198 + color: $text-color-accent;
199 + display: inline-block;
200 + }
201 + }
202 +
203 + .actions-box {
204 + margin-top: 30px;
205 +
206 + .el-input-number {
207 + width: 100px;
208 +
209 + .el-input__inner {
210 + color: $text-color-accent;
211 + background-color: transparent;
212 + border-color: $text-color-accent;
213 + font-family: inherit;
214 + font-weight: bold;
215 + padding-left: 5px;
216 + padding-right: 45px;
217 + }
218 + }
219 +
220 + .el-button {
221 + font-family: inherit;
222 + margin-left: 0;
223 + }
224 + }
225 + }
226 + }
227 +}
228 +</style>
src/views/apps/ecommerce/Products.vue new
+531
@@ -0,0 +1,531 @@
1 +<template>
2 + <div class="page-ecommerce-products flex">
3 + <div :class="{ sidebar: true, open: sidebarOpen }">
4 + <el-scrollbar class="scroller">
5 + <div class="widget close-filter-box">
6 + <button @click="sidebarOpen = false">close filter</button>
7 + </div>
8 + <div class="widget">
9 + <div class="title">Category</div>
10 + <div class="content">
11 + <el-tree :data="treeData" :props="treeProps" node-key="id" :default-expanded-keys="[1]"></el-tree>
12 + </div>
13 + </div>
14 + <div class="widget">
15 + <div class="title">Price</div>
16 + <div class="content">
17 + <el-slider v-model="range" range :max="100" class="themed"></el-slider>
18 + <div class="flex justify-space-between o-060">
19 + <span>$ {{ range[0] }}</span>
20 + <span>$ {{ range[1] }}</span>
21 + </div>
22 + </div>
23 + </div>
24 + <div class="widget select-color">
25 + <div class="title">Colors</div>
26 + <div class="content">
27 + <ul>
28 + <li>
29 + <div class="color-box" style="background: #343a40"></div>
30 + Black
31 + </li>
32 + <li>
33 + <div class="color-box" style="background: #788db4"></div>
34 + Grey
35 + </li>
36 + <li>
37 + <div class="color-box" style="background: #736cc7"></div>
38 + Purple
39 + </li>
40 + <li>
41 + <div class="color-box" style="background: #f64a91"></div>
42 + Pink
43 + </li>
44 + <li>
45 + <div class="color-box" style="background: #ff5c75"></div>
46 + Red
47 + </li>
48 + <li>
49 + <div class="color-box" style="background: #399af2"></div>
50 + Blue
51 + </li>
52 + <li>
53 + <div class="color-box" style="background: #ffce67"></div>
54 + Yellow
55 + </li>
56 + <li>
57 + <div class="color-box" style="background: #2fbfa0"></div>
58 + Green
59 + </li>
60 + </ul>
61 + </div>
62 + </div>
63 + <div class="widget close-filter-box">
64 + <button @click="sidebarOpen = false">close filter</button>
65 + </div>
66 + </el-scrollbar>
67 + </div>
68 +
69 + <div class="list-container box grow flex column">
70 + <div class="toggle-filter-box">
71 + <button @click="sidebarOpen = !sidebarOpen">
72 + <span v-if="!sidebarOpen">open filter</span>
73 + <span v-if="sidebarOpen">close filter</span>
74 + </button>
75 + </div>
76 +
77 + <div class="list scrollable only-y box grow">
78 + <div v-for="i in gridData" :key="i.id" class="item" @click="gotoDetail">
79 + <div class="wrapper card-shadow--medium">
80 + <button class="love-btn"><i class="mdi mdi-heart-outline"></i></button>
81 + <div class="image p-20">
82 + <div class="bg" :style="'background-image: url(' + i.photo + ')'"></div>
83 + </div>
84 + <div class="detail p-20">
85 + <div class="rate">
86 + <el-rate v-model="i.rate" disabled></el-rate>
87 + </div>
88 + <div class="name">
89 + {{ i.product }}
90 + </div>
91 + <div class="desc">Lorem ipsum sit dolor amet</div>
92 + <div class="price">$ {{ i.price }}</div>
93 + <div class="buttons flex justify-space-between">
94 + <button class="box grow">add to cart <i class="mdi mdi-cart-outline ml-5"></i></button>
95 + </div>
96 + </div>
97 + </div>
98 + </div>
99 + </div>
100 + </div>
101 + </div>
102 +</template>
103 +
104 +<script>
105 +import _ from "lodash"
106 +import { defineComponent } from "@vue/runtime-core"
107 +
108 +export default defineComponent({
109 + name: "EcommerceProducts",
110 + data() {
111 + return {
112 + gridData: [],
113 + sidebarOpen: false,
114 + range: [25, 75],
115 + treeData: [
116 + {
117 + id: 1,
118 + label: "Chairs",
119 + children: [
120 + {
121 + label: "Dining chairs"
122 + },
123 + {
124 + label: "Foldable chairs"
125 + },
126 + {
127 + label: "Café chairs"
128 + }
129 + ]
130 + },
131 + {
132 + label: "Café & bar chairs",
133 + children: [
134 + {
135 + label: "Bar Stools"
136 + },
137 + {
138 + label: "Café chairs"
139 + }
140 + ]
141 + },
142 + {
143 + label: "Dining sets",
144 + children: []
145 + },
146 + {
147 + label: "Garden chairs",
148 + children: [
149 + {
150 + label: "Garden chairs"
151 + },
152 + {
153 + label: "Garden benches"
154 + },
155 + {
156 + label: "Sun loungers & hammocks"
157 + }
158 + ]
159 + },
160 + {
161 + label: "Stools & benches",
162 + children: []
163 + },
164 + {
165 + label: "Step stools",
166 + children: []
167 + },
168 + {
169 + label: "Junior chairs",
170 + children: []
171 + },
172 + {
173 + label: "High chairs",
174 + children: []
175 + },
176 + {
177 + label: "Armchairs",
178 + children: [
179 + {
180 + label: "Fabric armchairs"
181 + },
182 + {
183 + label: "Leather armchairs"
184 + },
185 + {
186 + label: "Leather & coated fabric armchairs"
187 + },
188 + {
189 + label: "Coated fabric armchairs"
190 + },
191 + {
192 + label: "Rattan armchairs"
193 + }
194 + ]
195 + },
196 + {
197 + label: "Office chairs",
198 + children: [
199 + {
200 + label: "Swivel chairs"
201 + },
202 + {
203 + label: "Visitor's chairs"
204 + }
205 + ]
206 + }
207 + ],
208 + treeProps: {
209 + children: "children",
210 + label: "label"
211 + }
212 + }
213 + },
214 + computed: {},
215 + methods: {
216 + initGridData() {
217 + _.times(50, number => {
218 + let price = chance.floating({ min: 1, max: 100, fixed: 2 })
219 +
220 + this.gridData.push({
221 + photo: "/static/images/shop/" + chance.integer({ min: 0, max: 19 }) + ".jpg",
222 + product: chance.sentence({ words: 2 }),
223 + price: _.replace(price.toFixed(2).toString(), ".", ","),
224 + rate: chance.integer({ min: 3, max: 5 }),
225 + id: number
226 + })
227 + })
228 + },
229 + gotoDetail() {
230 + this.$router.push({ name: "ecommerce-product-detail" })
231 + }
232 + },
233 + created() {
234 + this.initGridData()
235 + },
236 + mounted() {}
237 +})
238 +</script>
239 +
240 +<style lang="scss" scoped>
241 +@import "../../../assets/scss/_variables";
242 +
243 +.page-ecommerce-products {
244 + .sidebar {
245 + width: 300px;
246 + margin-right: 20px;
247 + margin-right: 10px;
248 + margin-left: -10px;
249 +
250 + .scroller {
251 + padding: 10px;
252 + padding-top: 0px;
253 + width: 100%;
254 + height: 100%;
255 + box-sizing: border-box;
256 + }
257 +
258 + .widget {
259 + background: white;
260 + border-radius: 4px;
261 + margin-bottom: 20px;
262 + box-shadow:
263 + 0 8px 16px 0 rgba(0, 0, 0, 0.07),
264 + 0 3px 6px 0 rgba(0, 0, 0, 0.065);
265 + overflow: hidden;
266 + margin-left: 20px;
267 + margin-right: 10px;
268 +
269 + &.close-filter-box {
270 + display: none;
271 + text-align: center;
272 +
273 + button {
274 + width: 100%;
275 + border: none;
276 + text-transform: uppercase;
277 + outline: none;
278 + font-family: inherit;
279 + font-weight: bold;
280 + padding: 5px 0px;
281 + border-bottom: 2px solid;
282 + background: white;
283 + color: $text-color-accent;
284 + cursor: pointer;
285 + }
286 + }
287 +
288 + &.select-color {
289 + ul,
290 + li {
291 + padding: 0;
292 + list-style: none;
293 + margin: 0;
294 + }
295 +
296 + li {
297 + margin-bottom: 10px;
298 + }
299 +
300 + .color-box {
301 + background: transparent;
302 + width: 12px;
303 + height: 12px;
304 + display: inline-block;
305 + margin-right: 10px;
306 + }
307 + }
308 +
309 + .title {
310 + border-bottom: 1px solid rgba(0, 0, 0, 0.1);
311 + padding: 15px 20px;
312 + }
313 + .content {
314 + padding: 15px 20px;
315 + }
316 + }
317 + }
318 +
319 + .toggle-filter-box {
320 + padding: 10px;
321 + padding-top: 0px;
322 + text-align: right;
323 + display: none;
324 +
325 + button {
326 + border: none;
327 + text-transform: uppercase;
328 + outline: none;
329 + font-family: inherit;
330 + font-weight: bold;
331 + padding: 1px 2px;
332 + border-bottom: 2px solid;
333 + color: $text-color-accent;
334 + background: transparent;
335 + cursor: pointer;
336 + }
337 + }
338 +
339 + .list {
340 + .item {
341 + display: block;
342 + width: 25%;
343 + height: 400px;
344 + padding: 0 10px;
345 + padding-bottom: 20px;
346 + box-sizing: border-box;
347 + float: left;
348 +
349 + .wrapper {
350 + box-sizing: border-box;
351 + height: 100%;
352 + position: relative;
353 + cursor: pointer;
354 + transition: all 0.25s;
355 + position: relative;
356 +
357 + .love-btn {
358 + position: absolute;
359 + top: 6px;
360 + right: 6px;
361 + background: white;
362 + color: $text-color-primary;
363 + border: none;
364 + text-transform: uppercase;
365 + outline: none;
366 + font-family: inherit;
367 + font-weight: bold;
368 + padding: 3px 7px;
369 + }
370 +
371 + .image {
372 + box-sizing: border-box;
373 + height: 150px;
374 + width: 100%;
375 + background-color: white;
376 + padding-bottom: 10px;
377 +
378 + .bg {
379 + background-color: white;
380 + background-size: contain;
381 + background-repeat: no-repeat;
382 + background-position: center center;
383 + width: 100%;
384 + height: 100%;
385 + }
386 + }
387 +
388 + .detail {
389 + padding-top: 10px;
390 +
391 + .rate {
392 + margin-top: 10px;
393 +
394 + & > div {
395 + margin: 0 auto;
396 + display: block;
397 + width: 120px;
398 + }
399 + }
400 +
401 + .name {
402 + text-transform: uppercase;
403 + font-weight: bold;
404 + text-align: center;
405 + padding: 10px;
406 + padding-bottom: 5px;
407 + }
408 +
409 + .desc {
410 + text-align: center;
411 + font-size: 14px;
412 + opacity: 0.5;
413 + }
414 +
415 + .price {
416 + text-align: center;
417 + font-weight: bold;
418 + font-size: 22px;
419 + padding: 10px;
420 + color: $text-color-accent;
421 + }
422 + }
423 +
424 + .buttons {
425 + position: absolute;
426 + left: 14px;
427 + bottom: 14px;
428 + right: 14px;
429 +
430 + button {
431 + background: white;
432 + color: $text-color-primary;
433 + border: none;
434 + text-transform: uppercase;
435 + outline: none;
436 + font-family: inherit;
437 + font-weight: bold;
438 + padding: 3px 7px;
439 + }
440 + }
441 +
442 + &:hover {
443 + box-shadow:
444 + 0 8px 16px 0 rgba(40, 40, 90, 0.09),
445 + 0 3px 6px 0 rgba(0, 0, 0, 0.065),
446 + 0px 10px 0px 0px $text-color-accent;
447 + }
448 + }
449 + }
450 + }
451 +}
452 +
453 +@media (max-width: 1400px) {
454 + .page-ecommerce-products {
455 + .list {
456 + .item {
457 + width: 33.33%;
458 + }
459 + }
460 + }
461 +}
462 +
463 +@media (max-width: 1230px) {
464 + .page-ecommerce-products {
465 + .list {
466 + .item {
467 + width: 50%;
468 + }
469 + }
470 + }
471 +}
472 +
473 +@media (max-width: 1200px) {
474 + .page-ecommerce-products {
475 + .sidebar {
476 + width: 200px;
477 + }
478 + }
479 +}
480 +
481 +@media (max-width: 940px) {
482 + .page-ecommerce-products {
483 + .sidebar {
484 + width: 230px;
485 + position: absolute;
486 + top: 0;
487 + left: 0;
488 + bottom: 0;
489 + margin: 0;
490 + z-index: 999;
491 + transform: translateX(-100%);
492 + transition: all 0.25s;
493 + background: white;
494 +
495 + .scroller {
496 + padding: 15px;
497 + padding-top: 20px;
498 + }
499 +
500 + .widget {
501 + margin-left: 5px;
502 + margin-right: 5px;
503 + &.close-filter-box {
504 + display: block;
505 + }
506 + }
507 +
508 + &.open {
509 + transform: translateX(0%);
510 + box-shadow: 3px 0px 10px -3px rgba(0, 0, 0, 0.4);
511 + border-top-left-radius: 4px;
512 + border-top-right-radius: 4px;
513 + }
514 + }
515 +
516 + .toggle-filter-box {
517 + display: block;
518 + }
519 + }
520 +}
521 +
522 +@media (max-width: 480px) {
523 + .page-ecommerce-products {
524 + .list {
525 + .item {
526 + width: 100%;
527 + }
528 + }
529 + }
530 +}
531 +</style>
src/views/apps/ecommerce/Shop.vue new
+359
@@ -0,0 +1,359 @@
1 +<template>
2 + <div class="page-ecommerce-shop scrollable only-y">
3 + <div class="grid-container">
4 + <div class="widget w1" @click="gotoProducts">
5 + <div class="bg" style="background-image: url(/static/images/shop-cat/office.jpg)"></div>
6 + <div class="title">Office</div>
7 + <div class="desc">
8 + <p>Lorem ipsum dolor sit amet.</p>
9 + <span class="accent-text"><strong>6374</strong> items</span>
10 + </div>
11 + </div>
12 + <div class="widget w2" @click="gotoProducts">
13 + <div class="bg" style="background-image: url(/static/images/shop-cat/home.jpg)"></div>
14 + <div class="title">Home</div>
15 + <div class="desc">
16 + <p>Praesent imperdiet dictum mauris in pharetra.</p>
17 + <span class="accent-text"><strong>2385</strong> items</span>
18 + </div>
19 + </div>
20 + <div class="widget w3" @click="gotoProducts">
21 + <div class="bg" style="background-image: url(/static/images/shop-cat/tech.jpg)"></div>
22 + <div class="title">Tech</div>
23 + <div class="desc">
24 + <p>Nam auctor ultricies nisi.</p>
25 + <span class="accent-text"><strong>2856</strong> items</span>
26 + </div>
27 + </div>
28 + <div class="widget w4" @click="gotoProducts">
29 + <div class="bg" style="background-image: url(/static/images/shop-cat/watches.jpg)"></div>
30 + <div class="title">Watches</div>
31 + <div class="desc">
32 + <p>In ante risus, lacinia vel pellentesque.</p>
33 + <span class="accent-text"><strong>342</strong> items</span>
34 + </div>
35 + </div>
36 + <div class="widget w5" @click="gotoProducts">
37 + <div class="bg" style="background-image: url(/static/images/shop-cat/clothing.jpg)"></div>
38 + <div class="title">Clothing</div>
39 + <div class="desc">
40 + <p>Vivamus quis volutpat leo.</p>
41 + <span class="accent-text"><strong>654</strong> items</span>
42 + </div>
43 + </div>
44 + </div>
45 + </div>
46 +</template>
47 +
48 +<script>
49 +import { defineComponent } from "@vue/runtime-core"
50 +
51 +export default defineComponent({
52 + name: "EcommerceShop",
53 + methods: {
54 + gotoProducts() {
55 + this.$router.push({ name: "ecommerce-products" })
56 + }
57 + }
58 +})
59 +</script>
60 +
61 +<style lang="scss" scoped>
62 +@import "../../../assets/scss/_variables";
63 +
64 +.page-ecommerce-shop {
65 + .grid-container {
66 + display: grid;
67 + height: 100%;
68 + grid-template-columns: 1fr 1fr 1fr;
69 + grid-template-rows: 1fr 1fr 1fr;
70 + grid-gap: 20px 20px;
71 + grid-template-areas: "w4 w3 w1" "w5 w3 w1" "w2 w2 w1";
72 + }
73 +
74 + .w1 {
75 + grid-area: w1;
76 + }
77 +
78 + .w2 {
79 + grid-area: w2;
80 + }
81 +
82 + .w3 {
83 + grid-area: w3;
84 + }
85 +
86 + .w4 {
87 + grid-area: w4;
88 + }
89 +
90 + .w5 {
91 + grid-area: w5;
92 + }
93 +
94 + .widget {
95 + min-height: 140px;
96 + border: 5px solid $text-color-accent;
97 + position: relative;
98 + color: $text-color-primary;
99 + overflow: hidden;
100 + cursor: pointer;
101 + border-radius: 4px;
102 +
103 + .bg {
104 + position: absolute;
105 + top: 0;
106 + bottom: 0;
107 + left: 0;
108 + right: 0;
109 + height: 100%;
110 + widows: 100%;
111 + background-size: cover;
112 + background-repeat: no-repeat;
113 + background-position: center center;
114 + opacity: 0.8;
115 + transform: scale(1.06);
116 + transition: all 0.75s;
117 + }
118 +
119 + .title {
120 + background: $text-color-accent;
121 + display: inline-block;
122 + color: $background-color;
123 + padding: 5px 15px;
124 + padding-top: 0px;
125 + padding-left: 10px;
126 + text-transform: uppercase;
127 + font-weight: bold;
128 + position: relative;
129 + }
130 +
131 + .desc {
132 + position: absolute;
133 + bottom: 0;
134 + left: 0;
135 + width: 100%;
136 + padding: 20px;
137 + box-sizing: border-box;
138 + transform: translateY(100%);
139 + opacity: 0;
140 + transition: all 0.75s;
141 +
142 + .accent-text {
143 + background: $background-color;
144 + padding: 2px 10px;
145 + }
146 + }
147 +
148 + &:hover {
149 + .bg {
150 + opacity: 0.3;
151 + transform: scale(1.03);
152 + filter: blur(3px);
153 + }
154 + .desc {
155 + opacity: 1;
156 + transform: translateY(0%);
157 + }
158 + }
159 + }
160 +}
161 +@media all and (-ms-high-contrast: none) {
162 + .page-ecommerce-shop {
163 + .grid-container {
164 + display: -ms-grid;
165 + -ms-grid-columns: 1fr 1fr 1fr;
166 + -ms-grid-rows: 1fr 1fr 1fr;
167 + }
168 +
169 + .w1 {
170 + -ms-grid-row: 1;
171 + -ms-grid-row-span: 3;
172 + -ms-grid-column: 3;
173 + -ms-grid-column-span: 1;
174 + }
175 +
176 + .w2 {
177 + -ms-grid-row: 3;
178 + -ms-grid-row-span: 1;
179 + -ms-grid-column: 1;
180 + -ms-grid-column-span: 2;
181 + }
182 +
183 + .w3 {
184 + -ms-grid-row: 1;
185 + -ms-grid-row-span: 2;
186 + -ms-grid-column: 2;
187 + -ms-grid-column-span: 1;
188 + }
189 +
190 + .w4 {
191 + -ms-grid-row: 1;
192 + -ms-grid-row-span: 1;
193 + -ms-grid-column: 1;
194 + -ms-grid-column-span: 1;
195 + }
196 +
197 + .w5 {
198 + -ms-grid-row: 2;
199 + -ms-grid-row-span: 1;
200 + -ms-grid-column: 1;
201 + -ms-grid-column-span: 1;
202 + }
203 + }
204 +}
205 +
206 +@media (max-width: 1000px) {
207 + .page-ecommerce-shop {
208 + .grid-container {
209 + display: grid;
210 + height: 100%;
211 + grid-template-columns: 1fr 1fr 1fr;
212 + grid-template-rows: 1fr 1fr 1fr 1fr;
213 + grid-gap: 20px 20px;
214 + grid-template-areas: "w4 w4 w3" "w5 w5 w3" "w2 w2 w2" "w1 w1 w1";
215 + }
216 +
217 + .w1 {
218 + grid-area: w1;
219 + }
220 +
221 + .w2 {
222 + grid-area: w2;
223 + }
224 +
225 + .w3 {
226 + grid-area: w3;
227 + }
228 +
229 + .w4 {
230 + grid-area: w4;
231 + }
232 +
233 + .w5 {
234 + grid-area: w5;
235 + }
236 + }
237 +}
238 +@media all and (-ms-high-contrast: none) and (max-width: 1000px) {
239 + .page-ecommerce-shop {
240 + .grid-container {
241 + display: -ms-grid;
242 + -ms-grid-columns: 1fr 1fr 1fr;
243 + -ms-grid-rows: 1fr 1fr 1fr 1fr;
244 + }
245 +
246 + .w1 {
247 + -ms-grid-row: 4;
248 + -ms-grid-row-span: 1;
249 + -ms-grid-column: 1;
250 + -ms-grid-column-span: 3;
251 + }
252 +
253 + .w2 {
254 + -ms-grid-row: 3;
255 + -ms-grid-row-span: 1;
256 + -ms-grid-column: 1;
257 + -ms-grid-column-span: 3;
258 + }
259 +
260 + .w3 {
261 + -ms-grid-row: 1;
262 + -ms-grid-row-span: 2;
263 + -ms-grid-column: 3;
264 + -ms-grid-column-span: 1;
265 + }
266 +
267 + .w4 {
268 + -ms-grid-row: 1;
269 + -ms-grid-row-span: 1;
270 + -ms-grid-column: 1;
271 + -ms-grid-column-span: 2;
272 + }
273 +
274 + .w5 {
275 + -ms-grid-row: 2;
276 + -ms-grid-row-span: 1;
277 + -ms-grid-column: 1;
278 + -ms-grid-column-span: 2;
279 + }
280 + }
281 +}
282 +
283 +@media (max-width: 768px) {
284 + .page-ecommerce-shop {
285 + .grid-container {
286 + display: grid;
287 + height: 100%;
288 + grid-template-columns: 1fr 1fr 1fr;
289 + grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
290 + grid-gap: 20px 20px;
291 + grid-template-areas: "w4 w4 w4" "w5 w5 w5" "w3 w3 w3" "w2 w2 w2" "w1 w1 w1";
292 + }
293 +
294 + .w4 {
295 + grid-area: w4;
296 + }
297 +
298 + .w5 {
299 + grid-area: w5;
300 + }
301 +
302 + .w3 {
303 + grid-area: w3;
304 + }
305 +
306 + .w2 {
307 + grid-area: w2;
308 + }
309 +
310 + .w1 {
311 + grid-area: w1;
312 + }
313 + }
314 +}
315 +@media all and (-ms-high-contrast: none) and (max-width: 768px) {
316 + .page-ecommerce-shop {
317 + .grid-container {
318 + display: -ms-grid;
319 + -ms-grid-columns: 1fr 1fr 1fr;
320 + -ms-grid-rows: 1fr 1fr 1fr 1fr 1fr;
321 + }
322 +
323 + .w4 {
324 + -ms-grid-row: 1;
325 + -ms-grid-row-span: 1;
326 + -ms-grid-column: 1;
327 + -ms-grid-column-span: 3;
328 + }
329 +
330 + .w5 {
331 + -ms-grid-row: 2;
332 + -ms-grid-row-span: 1;
333 + -ms-grid-column: 1;
334 + -ms-grid-column-span: 3;
335 + }
336 +
337 + .w3 {
338 + -ms-grid-row: 3;
339 + -ms-grid-row-span: 1;
340 + -ms-grid-column: 1;
341 + -ms-grid-column-span: 3;
342 + }
343 +
344 + .w2 {
345 + -ms-grid-row: 4;
346 + -ms-grid-row-span: 1;
347 + -ms-grid-column: 1;
348 + -ms-grid-column-span: 3;
349 + }
350 +
351 + .w1 {
352 + -ms-grid-row: 5;
353 + -ms-grid-row-span: 1;
354 + -ms-grid-column: 1;
355 + -ms-grid-column-span: 3;
356 + }
357 + }
358 +}
359 +</style>
src/views/pages/Invoice.vue new
+361
@@ -0,0 +1,361 @@
1 +<template>
2 + <div class="page-invoice scrollable">
3 + <div class="toolbar">
4 + <el-button class="animate__animated animate__fadeInRight" type="primary" plain size="small"
5 + ><i class="mdi mdi-cart"></i> Check out</el-button
6 + >
7 + <el-button class="animate__animated animate__fadeInRight" plain size="small" @click="print"
8 + ><i class="mdi mdi-printer"></i> Print</el-button
9 + >
10 + </div>
11 +
12 + <div class="invoice bg-white black-text">
13 + <div class="invoice-top">
14 + <div class="logo">
15 + <img src="@/assets/images/logo.svg" alt="logo" />
16 + </div>
17 + <div class="info">
18 + <h2>John Wick</h2>
19 + <p>jwick@email.com<br />777-777-7777</p>
20 + </div>
21 + <!--End Info-->
22 + <div class="title">
23 + <h1>Invoice #1337</h1>
24 + <p>Issued: May 23, 2018<br />Payment Due: June 23, 2018</p>
25 + </div>
26 + <!--End Title-->
27 + </div>
28 + <!--End InvoiceTop-->
29 +
30 + <hr />
31 +
32 + <div class="invoice-middle">
33 + <div class="clientlogo">
34 + <img src="@/assets/images/avatar.jpg" alt="client logo" />
35 + </div>
36 + <div class="info">
37 + <h2>Client Name</h2>
38 + <p>john.doe@email.com<br />555-555-5555</p>
39 + </div>
40 +
41 + <div class="project">
42 + <h2>Project Description</h2>
43 + <p>
44 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in diam sit amet felis ultricies ultricies vitae et
45 + tortor. Proin dapibus justo felis, ut imperdiet lacus accumsan quis.
46 + </p>
47 + </div>
48 + </div>
49 + <!--End Invoice Mid-->
50 +
51 + <div class="invoice-bottom">
52 + <table>
53 + <thead>
54 + <tr>
55 + <th>Item Description</th>
56 + <th>Hours</th>
57 + <th>Rate</th>
58 + <th>Sub-total</th>
59 + </tr>
60 + </thead>
61 + <tbody>
62 + <tr>
63 + <td>Service 1</td>
64 + <td>6</td>
65 + <td>$55</td>
66 + <td>$330.00</td>
67 + </tr>
68 +
69 + <tr>
70 + <td>Service 2</td>
71 + <td>3</td>
72 + <td>$75</td>
73 + <td>$225.00</td>
74 + </tr>
75 +
76 + <tr>
77 + <td>Service 3</td>
78 + <td>4</td>
79 + <td>$75</td>
80 + <td>$300.00</td>
81 + </tr>
82 +
83 + <tr>
84 + <td>Service 4</td>
85 + <td>250</td>
86 + <td>$65</td>
87 + <td>$16,250.00</td>
88 + </tr>
89 +
90 + <tr>
91 + <td>Service 5</td>
92 + <td>10</td>
93 + <td>$70</td>
94 + <td>$700.00</td>
95 + </tr>
96 +
97 + <tr>
98 + <td></td>
99 + <td>HST</td>
100 + <td>13%</td>
101 + <td>$2,314.65</td>
102 + </tr>
103 + </tbody>
104 + <tfoot>
105 + <tr>
106 + <td></td>
107 + <td></td>
108 + <td class="Rate"><h2>Total</h2></td>
109 + <td class="payment"><h2>$20,119.65</h2></td>
110 + </tr>
111 + </tfoot>
112 + </table>
113 +
114 + <div class="legalcopy flex mt-20">
115 + <p class="legal box grow mr-20 mt-0">
116 + <strong>Thank you for your business!</strong>  Payment is expected within 31 days; please process this invoice
117 + within that time. There will be a 5% interest charge per month on late invoices.
118 + </p>
119 + <el-button type="primary" plain size="small" style="height: 32px"><i class="mdi mdi-cart"></i> Check out</el-button>
120 + </div>
121 + </div>
122 + <!--End Invoice-->
123 + </div>
124 + </div>
125 +</template>
126 +
127 +<script>
128 +import { defineComponent } from "@vue/runtime-core"
129 +
130 +export default defineComponent({
131 + name: "Invoice",
132 + methods: {
133 + print() {
134 + window.print()
135 + }
136 + }
137 +})
138 +</script>
139 +
140 +<style lang="scss">
141 +@import "../../assets/scss/_variables";
142 +
143 +.page-invoice {
144 + .toolbar {
145 + max-width: 794px;
146 + margin: 0 auto;
147 + text-align: right;
148 + margin-bottom: 20px;
149 + }
150 +
151 + .invoice {
152 + background: white;
153 + width: 100%;
154 + max-width: 794px;
155 + min-height: 1123px;
156 + margin: 0 auto;
157 + padding: 2em;
158 + box-sizing: border-box;
159 + box-shadow: 0px 8px 8px -8px rgba(0, 0, 0, 0.3);
160 + margin-bottom: 30px;
161 +
162 + hr {
163 + border: 1px solid rgba(0, 0, 0, 0.05);
164 + }
165 +
166 + .invoice-top {
167 + overflow: hidden;
168 + margin-bottom: 30px;
169 +
170 + .logo {
171 + float: left;
172 + height: 60px;
173 + width: 60px;
174 + box-sizing: border-box;
175 + border-radius: 50%;
176 + overflow: hidden;
177 + background: rgba(0, 0, 0, 0.07);
178 + text-align: center;
179 +
180 + img {
181 + height: 80%;
182 + margin-top: 10%;
183 + }
184 + }
185 + .info {
186 + display: block;
187 + float: left;
188 + margin-left: 20px;
189 + margin-top: 5px;
190 +
191 + & > * {
192 + margin: 0;
193 + }
194 + }
195 + .title {
196 + float: right;
197 +
198 + & > * {
199 + margin: 0;
200 + }
201 +
202 + p {
203 + text-align: right;
204 + }
205 + }
206 + }
207 +
208 + .invoice-middle {
209 + overflow: hidden;
210 + margin-top: 30px;
211 + margin-bottom: 30px;
212 +
213 + .clientlogo {
214 + float: left;
215 + height: 60px;
216 + width: 60px;
217 + box-sizing: border-box;
218 + border-radius: 50%;
219 + overflow: hidden;
220 + background: grey;
221 +
222 + img {
223 + width: 100%;
224 + }
225 + }
226 +
227 + .info {
228 + display: block;
229 + float: left;
230 + margin-left: 20px;
231 + margin-top: 5px;
232 +
233 + & > * {
234 + margin: 0;
235 + }
236 + }
237 +
238 + .project {
239 + margin-left: 52%;
240 +
241 + & > * {
242 + margin: 0;
243 + }
244 + }
245 + }
246 +
247 + .invoice-bottom {
248 + table {
249 + width: 100%;
250 + border-collapse: collapse;
251 +
252 + th {
253 + text-align: right;
254 + padding: 20px;
255 + padding-bottom: 5px;
256 + opacity: 0.7;
257 +
258 + &:first-child {
259 + text-align: left;
260 + padding-left: 0px;
261 + width: 100%;
262 + }
263 + &:last-child {
264 + padding-right: 0px;
265 + }
266 + }
267 +
268 + td {
269 + text-align: right;
270 + padding: 20px;
271 + padding-bottom: 5px;
272 + border-bottom: 1px solid #eee;
273 +
274 + &:first-child {
275 + text-align: left;
276 + padding-left: 0px;
277 + width: 100%;
278 + }
279 + &:last-child {
280 + padding-right: 0px;
281 + }
282 + }
283 +
284 + tfoot td {
285 + border: none;
286 + padding-top: 5px;
287 + }
288 + }
289 + }
290 +
291 + h1 {
292 + font-size: 1.5em;
293 + color: #222;
294 + }
295 + h2 {
296 + font-size: 0.9em;
297 + }
298 + h3 {
299 + font-size: 1.2em;
300 + font-weight: 300;
301 + line-height: 2em;
302 + }
303 + p {
304 + font-size: 0.7em;
305 + color: #666;
306 + line-height: 1.2em;
307 + }
308 + }
309 +}
310 +
311 +@media screen and (max-width: 768px) {
312 + .page-invoice {
313 + .invoice {
314 + .invoice-middle {
315 + .project {
316 + display: block;
317 + width: 100%;
318 + clear: both;
319 + padding: 10px 0;
320 + margin: 0;
321 + }
322 + }
323 + .invoice-bottom {
324 + table {
325 + th {
326 + padding: 5px;
327 + }
328 +
329 + td {
330 + padding: 5px;
331 + }
332 + }
333 + }
334 + }
335 + }
336 +}
337 +
338 +@media print {
339 + .layout-container .container .footer,
340 + .layout-container .container .header,
341 + .layout-container .container .horizontal-nav,
342 + .layout-container .footer,
343 + .layout-container .layout-picker,
344 + .layout-container .vertical-nav,
345 + .layout-container .header {
346 + display: none;
347 + }
348 +
349 + .page-invoice {
350 + .toolbar {
351 + display: none;
352 + }
353 +
354 + .invoice {
355 + box-shadow: none;
356 + max-width: 100%;
357 + padding: 0;
358 + }
359 + }
360 +}
361 +</style>
src/views/pages/NotFound.vue new
+30
@@ -0,0 +1,30 @@
1 +<template>
2 + <div class="not-found">
3 + <div class="msg-box">
4 + <h1 class="animate__animated animate__fadeInDown">404 Not Found</h1>
5 + <h2 class="animate__animated animate__fadeInUp">Oops!<br />It seems that this page does not exist.</h2>
6 + </div>
7 + </div>
8 +</template>
9 +
10 +<script>
11 +import { defineComponent } from "@vue/runtime-core"
12 +
13 +export default defineComponent({
14 + name: "NotFound"
15 +})
16 +</script>
17 +
18 +<style lang="scss" scoped>
19 +@import "../../assets/scss/_variables";
20 +@import "../../assets/scss/_mixins";
21 +
22 +.msg-box {
23 + max-width: 240px;
24 + margin: 50px auto;
25 +
26 + h1 {
27 + @include text-bordered-shadow();
28 + }
29 +}
30 +</style>
src/views/pages/Profile.vue new
+318
@@ -0,0 +1,318 @@
1 +<template>
2 + <el-scrollbar class="page-profile" id="affix-container">
3 + <div class="card-base card-shadow--medium identity" id="boundary">
4 + <div class="cover"></div>
5 +
6 + <div class="username">
7 + <div class="cover-small"></div>
8 + <div class="avatar-small"><img src="@/assets/images/avatar.jpg" alt="avatar" /></div>
9 + <span>{{ username }}</span>
10 + <div class="colors-box">
11 + <div v-for="i in 5" :key="i" :class="{ color: true, active: colorActive }" :style="{ background: color }"></div>
12 + </div>
13 + </div>
14 + <div class="avatar"><img src="@/assets/images/avatar.jpg" alt="avatar" /></div>
15 + <img src="@/assets/images/cover-2.jpg" id="color-thief" class="color-thief" alt="profile cover" />
16 + </div>
17 + <div class="card-base card-shadow--medium info bg-white black-text">
18 + <el-tabs v-model="activeTab">
19 + <el-tab-pane label="Timeline" name="timeline">
20 + <profile-timeline></profile-timeline>
21 + </el-tab-pane>
22 + <el-tab-pane label="Info" name="info">
23 + <profile-edit></profile-edit>
24 + </el-tab-pane>
25 + <el-tab-pane label="Photo" name="photo" class="pane-photo">
26 + <profile-gallery :boxMargins="false"></profile-gallery>
27 + </el-tab-pane>
28 + </el-tabs>
29 + </div>
30 + </el-scrollbar>
31 +</template>
32 +
33 +<script>
34 +import ProfileEdit from "../../components/Profile/ProfileEdit.vue"
35 +import ProfileGallery from "../../components/Profile/ProfileGallery.vue"
36 +import ProfileTimeline from "../../components/Profile/ProfileTimeline.vue"
37 +import { defineComponent } from "@vue/runtime-core"
38 +
39 +export default defineComponent({
40 + name: "Profile",
41 + data() {
42 + return {
43 + username: "Aurora Shenton",
44 + colorActive: false,
45 + color: "white",
46 + activeTab: "timeline",
47 + affixEnabled: true
48 + }
49 + },
50 + methods: {
51 + resizeAffixEnabled() {
52 + if (window.innerWidth <= 768) {
53 + this.affixEnabled = false
54 + } else {
55 + this.affixEnabled = true
56 + }
57 + }
58 + },
59 + mounted() {
60 + /*
61 + var colorThief = new ColorThief();
62 + setTimeout(()=>{
63 + let rgb = colorThief.getColor(document.getElementById('color-thief'))
64 + //console.log('Profile mounted', rgb)
65 + this.colorActive = true
66 + this.color = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`
67 + }, 1000)
68 + */
69 +
70 + this.resizeAffixEnabled()
71 + window.addEventListener("resize", this.resizeAffixEnabled)
72 + },
73 + beforeUnmount() {
74 + window.removeEventListener("resize", this.resizeAffixEnabled)
75 + },
76 + components: {
77 + ProfileEdit,
78 + ProfileGallery,
79 + ProfileTimeline
80 + }
81 +})
82 +</script>
83 +
84 +<style lang="scss" scoped>
85 +@import "../../assets/scss/_variables";
86 +
87 +.page-profile {
88 + overflow: auto;
89 +
90 + .identity {
91 + margin-bottom: 20px;
92 + position: relative;
93 + width: 100%;
94 + height: 370px;
95 +
96 + .cover {
97 + position: absolute;
98 + top: 0;
99 + left: 0;
100 + right: 0;
101 + bottom: 0;
102 + background-image: url("../../assets/images/cover-2.jpg");
103 + background-position: 50%;
104 + background-size: cover;
105 + background-repeat: no-repeat;
106 + width: 100%;
107 + height: 100%;
108 + }
109 + .username {
110 + color: #32325d;
111 + position: absolute;
112 + width: 100%;
113 + height: 50px;
114 + bottom: 75px;
115 + left: 0;
116 + right: 0;
117 + background: #fff;
118 + line-height: 50px;
119 + box-sizing: border-box;
120 + padding-left: 250px;
121 + font-size: 25px;
122 + overflow: hidden;
123 + white-space: nowrap;
124 + text-overflow: ellipsis;
125 + box-shadow:
126 + 0 7px 14px 0 rgba(50, 50, 93, 0.1),
127 + 0 3px 6px 0 rgba(0, 0, 0, 0.07);
128 +
129 + .cover-small {
130 + width: 220px;
131 + height: 50px;
132 + overflow: hidden;
133 + display: block;
134 + float: left;
135 + margin-right: -220px;
136 + position: relative;
137 + left: -250px;
138 + border-radius: 9px;
139 + -webkit-box-sizing: border-box;
140 + box-sizing: border-box;
141 + border: 4px solid white;
142 + opacity: 0;
143 + top: 0px;
144 + background-image: url("../../assets/images/cover-2.jpg");
145 + background-position: 50%;
146 + background-size: cover;
147 + background-repeat: no-repeat;
148 + -webkit-transition: all 0.5s;
149 + transition: all 0.5s;
150 + }
151 + .avatar-small {
152 + width: 50px;
153 + height: 50px;
154 + overflow: hidden;
155 + display: block;
156 + float: left;
157 + margin-right: -50px;
158 + position: relative;
159 + left: -100px;
160 + border-radius: 50%;
161 + box-sizing: border-box;
162 + border: 4px solid white;
163 + opacity: 0;
164 + top: 0px;
165 + transform: rotate(-50deg);
166 + transition: all 0.5s;
167 + }
168 + .avatar-small img {
169 + width: 100%;
170 + }
171 +
172 + &.affix {
173 + z-index: 99;
174 + border-radius: 5px;
175 +
176 + .cover-small {
177 + opacity: 1;
178 + }
179 +
180 + .avatar-small {
181 + opacity: 1;
182 + left: -60px;
183 + transform: rotate(0deg);
184 + }
185 + }
186 +
187 + .colors-box {
188 + height: 50px;
189 + background: white; //091c2d
190 + float: right;
191 +
192 + .color {
193 + width: 50px;
194 + height: 50px;
195 + background: white; //091c2d
196 + float: right;
197 + transform: skew(-45deg);
198 + box-shadow: 1px 0px 1px 0px transparent;
199 + position: relative;
200 + right: -25px;
201 + margin-right: -50px;
202 + transition: margin-right 0.75s;
203 +
204 + &.active {
205 + margin-right: 0;
206 + }
207 +
208 + &:nth-child(2) {
209 + opacity: 0.8;
210 + }
211 + &:nth-child(3) {
212 + opacity: 0.6;
213 + }
214 + &:nth-child(4) {
215 + opacity: 0.4;
216 + }
217 + &:nth-child(5) {
218 + opacity: 0.2;
219 + }
220 + }
221 + }
222 + }
223 + .avatar {
224 + border: 6px solid #fff;
225 + position: absolute;
226 + bottom: 10px;
227 + left: 50px;
228 + width: 180px;
229 + height: 180px;
230 + overflow: hidden;
231 + border-radius: 50%;
232 + box-sizing: border-box;
233 + box-shadow: 0px 20px 15px -15px rgba(0, 0, 0, 0.15);
234 +
235 + img {
236 + width: 100%;
237 + }
238 + }
239 +
240 + .color-thief {
241 + display: block;
242 + width: 100px;
243 + visibility: hidden;
244 + z-index: -999999;
245 + position: absolute;
246 + }
247 + }
248 +
249 + .info {
250 + padding: 24px 32px;
251 + margin-bottom: 20px;
252 + }
253 +}
254 +
255 +@media (max-width: 768px) {
256 + .page-profile {
257 + .identity {
258 + height: auto;
259 +
260 + .avatar {
261 + bottom: inherit;
262 + top: 10px;
263 + left: 50%;
264 + width: 100px;
265 + margin-left: -50px;
266 + height: 100px;
267 + border-width: 3px;
268 + }
269 +
270 + .username {
271 + position: inherit;
272 + padding: 10px;
273 + margin: 0;
274 + top: inherit;
275 + left: inherit;
276 + z-index: 1;
277 + right: inherit;
278 + text-align: center;
279 + bottom: inherit;
280 + white-space: inherit;
281 + line-height: inherit;
282 + height: auto;
283 + margin-top: 120px;
284 + width: 90%;
285 + margin-left: 5%;
286 + margin-bottom: 10px;
287 + border-radius: 50px;
288 +
289 + .colors-box {
290 + display: none;
291 + }
292 +
293 + .avatar-small {
294 + display: none;
295 + }
296 +
297 + .cover-small {
298 + display: none;
299 + }
300 + }
301 + }
302 +
303 + .info {
304 + padding: 8px 16px;
305 + }
306 + }
307 +}
308 +</style>
309 +
310 +<style lang="scss">
311 +.page-profile {
312 + .el-tabs:not(.el-tabs--border-card) {
313 + .el-tabs__item:not(.is-active) {
314 + color: #32325d;
315 + }
316 + }
317 +}
318 +</style>
src/views/pages/authentication/ForgotPassword.vue new
+110
@@ -0,0 +1,110 @@
1 +<template>
2 + <el-scrollbar class="forgot-password-page">
3 + <div class="align-vertical">
4 + <div class="form-wrapper align-vertical-middle">
5 + <div class="form-box card-base card-shadow--extraLarge">
6 + <img class="image-logo" src="@/assets/images/logo.svg" alt="logo" />
7 +
8 + <div class="field-box">
9 + <input type="email" placeholder="E-mail" />
10 + </div>
11 +
12 + <div class="flex text-center center pt-20 pb-10">
13 + <button @click="login" class="send-btn">SEND RESET LINK</button>
14 + </div>
15 + </div>
16 + </div>
17 + </div>
18 + </el-scrollbar>
19 +</template>
20 +
21 +<script>
22 +import { useMainStore } from "../../../stores/main"
23 +import { defineComponent } from "@vue/runtime-core"
24 +
25 +export default defineComponent({
26 + name: "ForgotPassword",
27 + data() {
28 + return {
29 + form: {
30 + email: "",
31 + password: ""
32 + }
33 + }
34 + },
35 + methods: {
36 + login() {
37 + useMainStore().setLogin()
38 + this.$router.push("dashboard")
39 + }
40 + }
41 +})
42 +</script>
43 +
44 +<style lang="scss">
45 +@import "@/assets/scss/_variables";
46 +
47 +.forgot-password-page {
48 + background: $text-color-primary;
49 + margin-left: -30px;
50 + margin-right: -30px;
51 +
52 + .form-wrapper {
53 + width: 100%;
54 + }
55 +
56 + .form-box {
57 + width: 100%;
58 + max-width: 340px;
59 + padding: 30px;
60 + box-sizing: border-box;
61 + margin: 20px auto;
62 +
63 + a {
64 + font-size: 14px;
65 + color: $text-color-accent;
66 + text-decoration: none;
67 + font-weight: 500;
68 + }
69 +
70 + .image-logo {
71 + width: 80px;
72 + margin: 0px auto;
73 + margin-bottom: 50px;
74 + display: block;
75 + }
76 +
77 + .field-box {
78 + margin-bottom: 10px;
79 + input {
80 + width: 100%;
81 + box-sizing: border-box;
82 + border-radius: 10px;
83 + padding: 10px 20px;
84 + outline: none;
85 + border: 1px solid $text-color-primary;
86 + }
87 + }
88 +
89 + .send-btn {
90 + margin-top: 20px;
91 + width: 100%;
92 + background-color: $text-color-primary;
93 + color: #fff;
94 + font-weight: bold;
95 + border-radius: 10px;
96 + padding: 10px 20px;
97 + outline: none;
98 + border: none;
99 + }
100 + }
101 +}
102 +
103 +@media (max-width: 768px) {
104 + .layout-container .container .view.forgot-password-page {
105 + margin-left: -5px;
106 + margin-right: -5px;
107 + max-width: calc(100% + 10px);
108 + }
109 +}
110 +</style>
src/views/pages/authentication/Login.vue new
+158
@@ -0,0 +1,158 @@
1 +<template>
2 + <el-scrollbar class="login-page">
3 + <div class="align-vertical">
4 + <div class="form-wrapper align-vertical-middle">
5 + <div class="form-box card-base card-shadow--extraLarge">
6 + <img class="image-logo" src="@/assets/images/logo.svg" alt="logo" />
7 +
8 + <div class="field-box">
9 + <input type="username" name="username" placeholder="Username" />
10 + </div>
11 + <div class="field-box">
12 + <input type="password" name="password" placeholder="Password" />
13 + </div>
14 +
15 + <div class="flex align-center">
16 + <div class="box grow"><el-checkbox>Remember Me </el-checkbox></div>
17 + <div class="box grow text-right">
18 + <router-link to="/dashboard">Forgot Password?</router-link>
19 + </div>
20 + </div>
21 +
22 + <div class="flex text-center center pt-30 pb-10">
23 + <button @click="login" class="login-btn">LOGIN</button>
24 + </div>
25 +
26 + <div class="text-divider mv-10">or</div>
27 +
28 + <div class="flex column center pt-10 pb-10">
29 + <button @click="login" class="social-btn google">Log in with Google</button>
30 + <button @click="login" class="social-btn facebook">Log in with Facebook</button>
31 + </div>
32 +
33 + <div class="text-center signin-box pt-20">Don't have an account? <a>Sign in</a></div>
34 + </div>
35 + </div>
36 + </div>
37 + </el-scrollbar>
38 +</template>
39 +
40 +<script>
41 +import { defineComponent } from "@vue/runtime-core"
42 +import { useMainStore } from "../../../stores/main"
43 +
44 +export default defineComponent({
45 + name: "Login",
46 + data() {
47 + return {
48 + form: {
49 + email: "",
50 + password: ""
51 + }
52 + }
53 + },
54 + methods: {
55 + login() {
56 + useMainStore().setLogin()
57 + this.$router.push("dashboard")
58 + }
59 + }
60 +})
61 +</script>
62 +
63 +<style lang="scss">
64 +@import "@/assets/scss/_variables";
65 +
66 +.login-page {
67 + background: $text-color-primary;
68 + margin-left: -30px;
69 + margin-right: -30px;
70 +
71 + .form-wrapper {
72 + width: 100%;
73 + }
74 +
75 + .form-box {
76 + width: 100%;
77 + max-width: 340px;
78 + padding: 30px;
79 + box-sizing: border-box;
80 + margin: 20px auto;
81 +
82 + a {
83 + font-size: 14px;
84 + color: $text-color-accent;
85 + text-decoration: none;
86 + font-weight: 500;
87 + }
88 +
89 + .image-logo {
90 + width: 80px;
91 + margin: 0px auto;
92 + margin-bottom: 30px;
93 + display: block;
94 + }
95 +
96 + .field-box {
97 + margin-bottom: 10px;
98 + input {
99 + width: 100%;
100 + box-sizing: border-box;
101 + border-radius: 10px;
102 + padding: 10px 20px;
103 + outline: none;
104 + border: 1px solid $text-color-primary;
105 + }
106 + }
107 +
108 + .login-btn {
109 + margin-top: 20px;
110 + width: 100%;
111 + background-color: $text-color-primary;
112 + color: #fff;
113 + font-weight: bold;
114 + border-radius: 10px;
115 + padding: 10px 20px;
116 + outline: none;
117 + border: none;
118 + }
119 +
120 + .social-btn {
121 + width: 160px;
122 + border: none;
123 + border-radius: 4px;
124 + padding: 4px 8px;
125 +
126 + &.google {
127 + margin-bottom: 10px;
128 + background-color: #d73d32;
129 + color: white;
130 +
131 + &:hover {
132 + border-color: #d73d32;
133 + }
134 + }
135 + &.facebook {
136 + background-color: #3f5c9a;
137 + color: white;
138 +
139 + &:hover {
140 + border-color: #3f5c9a;
141 + }
142 + }
143 + }
144 +
145 + .signin-box {
146 + font-size: 14px;
147 + }
148 + }
149 +}
150 +
151 +@media (max-width: 768px) {
152 + .layout-container .container .view.login-page {
153 + margin-left: -5px;
154 + margin-right: -5px;
155 + max-width: calc(100% + 10px);
156 + }
157 +}
158 +</style>
src/views/pages/authentication/Login2.vue new
+171
@@ -0,0 +1,171 @@
1 +<template>
2 + <div class="login-page flex">
3 + <div class="box grow scrollable align-vertical side-box box-left">
4 + <div class="align-vertical-middle wrapper text-center">
5 + <img class="image-logo" src="@/assets/images/logo.svg" alt="logo-left" />
6 + <h1 class="h-big">Pragmatic</h1>
7 + <p class="p-50">
8 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ullamcorper nisl erat, vel convallis elit fermentum
9 + pellentesque. Sed mollis velit facilisis facilisis viverra.
10 + </p>
11 + </div>
12 + </div>
13 + <div class="box grow scrollable align-vertical side-box box-right">
14 + <div class="align-vertical-middle wrapper">
15 + <form class="form-box" @submit.prevent="login">
16 + <h2>Log in to your account</h2>
17 + <p class="mb-40">Go to the dashboard</p>
18 +
19 + <div class="field-box">
20 + <input type="username" name="username" placeholder="Username" v-model="username" />
21 + </div>
22 + <div class="field-box">
23 + <input type="password" name="password" placeholder="Password" v-model="password" />
24 + </div>
25 + <div>
26 + <el-checkbox>Remember me </el-checkbox>
27 + </div>
28 + <div>
29 + <router-link to="/forgot-password">Lost Password?</router-link>
30 + </div>
31 + <div>
32 + <button class="login-btn">Login</button>
33 + </div>
34 + </form>
35 + </div>
36 + </div>
37 + </div>
38 +</template>
39 +
40 +<script>
41 +import { defineComponent } from "@vue/runtime-core"
42 +
43 +export default defineComponent({
44 + name: "Login2",
45 + data() {
46 + return {
47 + username: "",
48 + password: ""
49 + }
50 + },
51 + methods: {}
52 +})
53 +</script>
54 +
55 +<style lang="scss">
56 +@import "@/assets/scss/_variables.scss";
57 +
58 +.login-page {
59 + position: absolute;
60 + top: 0;
61 + left: 0;
62 + right: 0;
63 + bottom: 0;
64 + padding: 0 !important;
65 +
66 + .side-box {
67 + .wrapper {
68 + width: 100%;
69 + box-sizing: border-box;
70 + padding: 20px;
71 + }
72 + }
73 +
74 + .box-left {
75 + background-image: url("../../../assets/images/login2.jpg");
76 + background-size: cover;
77 + background-position: 50% 50%;
78 +
79 + .wrapper {
80 + .image-logo {
81 + width: 90%;
82 + max-width: 100px;
83 + margin-top: 20px;
84 + }
85 + }
86 + }
87 + .box-right {
88 + background: white;
89 + }
90 +
91 + .form-box {
92 + width: 100%;
93 + max-width: 340px;
94 + padding: 30px;
95 + box-sizing: border-box;
96 + margin: 20px auto;
97 + //background: transparent;
98 +
99 + a {
100 + font-size: 14px;
101 + color: $text-color-primary;
102 + text-decoration: none;
103 + font-weight: 500;
104 + }
105 +
106 + .image-logo {
107 + width: 80px;
108 + margin: 0px auto;
109 + margin-bottom: 70px;
110 + display: block;
111 + }
112 +
113 + .field-box {
114 + margin-bottom: 10px;
115 + input {
116 + width: 100%;
117 + box-sizing: border-box;
118 + border-radius: 10px;
119 + padding: 10px 20px;
120 + outline: none;
121 + border: 1px solid $text-color-primary;
122 + }
123 + }
124 +
125 + .login-btn {
126 + margin-top: 20px;
127 + width: 100%;
128 + background-color: $text-color-primary;
129 + color: #fff;
130 + font-weight: bold;
131 + border-radius: 10px;
132 + padding: 10px 20px;
133 + outline: none;
134 + border: none;
135 + }
136 + }
137 +}
138 +
139 +@media (max-width: 1200px) {
140 + .login-page {
141 + .box-left {
142 + .wrapper {
143 + .h-big {
144 + font-size: 50px;
145 + }
146 + }
147 + }
148 + }
149 +}
150 +@media (max-width: 900px) {
151 + .login-page {
152 + .box-left {
153 + .wrapper {
154 + .h-big {
155 + font-size: 30px;
156 + }
157 + }
158 + }
159 + }
160 +}
161 +@media (max-width: 768px) {
162 + .login-page {
163 + display: block;
164 + overflow: auto;
165 +
166 + .side-box {
167 + display: block;
168 + }
169 + }
170 +}
171 +</style>
src/views/pages/authentication/Register.vue new
+129
@@ -0,0 +1,129 @@
1 +<template>
2 + <el-scrollbar class="register-page">
3 + <div class="align-vertical">
4 + <div class="form-wrapper align-vertical-middle">
5 + <div class="form-box card-base card-shadow--extraLarge">
6 + <img class="image-logo" src="@/assets/images/logo.svg" alt="logo" />
7 +
8 + <div class="field-box">
9 + <input type="text" placeholder="Name" />
10 + </div>
11 + <div class="field-box">
12 + <input type="email" placeholder="E-mail" />
13 + </div>
14 + <div class="field-box">
15 + <input type="password" placeholder="Password" />
16 + </div>
17 + <div class="field-box">
18 + <input type="password" placeholder="Password (confirm)" />
19 + </div>
20 +
21 + <div class="flex">
22 + <div class="box grow"><el-checkbox>I read and accept terms</el-checkbox></div>
23 + </div>
24 +
25 + <div>
26 + <button @click="login" class="signin-btn">SIGN IN</button>
27 + </div>
28 +
29 + <div class="text-center login-box pt-10">Already have an account? <a>Login</a></div>
30 + </div>
31 + </div>
32 + </div>
33 + </el-scrollbar>
34 +</template>
35 +
36 +<script>
37 +import { useMainStore } from "@/stores/main"
38 +import { defineComponent } from "@vue/runtime-core"
39 +
40 +export default defineComponent({
41 + name: "Register",
42 + data() {
43 + return {
44 + form: {
45 + email: "",
46 + password: ""
47 + }
48 + }
49 + },
50 + methods: {
51 + login() {
52 + useMainStore().setLogin()
53 + this.$router.push("dashboard")
54 + }
55 + }
56 +})
57 +</script>
58 +
59 +<style lang="scss">
60 +@import "@/assets/scss/_variables";
61 +
62 +.register-page {
63 + background: $text-color-primary;
64 + margin-left: -30px;
65 + margin-right: -30px;
66 +
67 + .form-wrapper {
68 + width: 100%;
69 + }
70 +
71 + .form-box {
72 + width: 100%;
73 + max-width: 340px;
74 + padding: 30px;
75 + box-sizing: border-box;
76 + margin: 20px auto;
77 +
78 + a {
79 + font-size: 14px;
80 + color: $text-color-accent;
81 + text-decoration: none;
82 + font-weight: 500;
83 + }
84 +
85 + .image-logo {
86 + width: 80px;
87 + margin: 0px auto;
88 + margin-bottom: 50px;
89 + display: block;
90 + }
91 +
92 + .field-box {
93 + margin-bottom: 10px;
94 + input {
95 + width: 100%;
96 + box-sizing: border-box;
97 + border-radius: 10px;
98 + padding: 10px 20px;
99 + outline: none;
100 + border: 1px solid $text-color-primary;
101 + }
102 + }
103 +
104 + .signin-btn {
105 + margin-top: 20px;
106 + width: 100%;
107 + background-color: $text-color-primary;
108 + color: #fff;
109 + font-weight: bold;
110 + border-radius: 10px;
111 + padding: 10px 20px;
112 + outline: none;
113 + border: none;
114 + }
115 +
116 + .login-box {
117 + font-size: 14px;
118 + }
119 + }
120 +}
121 +
122 +@media (max-width: 768px) {
123 + .layout-container .container .view.register-page {
124 + margin-left: -5px;
125 + margin-right: -5px;
126 + max-width: calc(100% + 10px);
127 + }
128 +}
129 +</style>
src/views/ui/Charts/Charts.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Charts"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/ui/Charts/Echarts.vue new
+234
@@ -0,0 +1,234 @@
1 +<template>
2 + <div class="page-echarts scrollable ph-20">
3 + <div class="page-header">
4 + <h1>Echarts</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Charts</el-breadcrumb-item>
9 + <el-breadcrumb-item>Echarts</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div class="card-base card-shadow--medium bg-white black-text pv-30 ph-20">
14 + <div id="chart" :style="{ height: '500px', width: '100%' }"></div>
15 + </div>
16 +
17 + <h4>
18 + <a href="https://github.com/apache/incubator-echarts" target="_blank"> <i class="mdi mdi-link-variant"></i>reference </a>
19 + </h4>
20 + </div>
21 +</template>
22 +
23 +<script>
24 +import * as echarts from "echarts"
25 +
26 +import { defineComponent } from "@vue/runtime-core"
27 +
28 +export default defineComponent({
29 + name: "EchartsPage",
30 + data() {
31 + return {
32 + chart: null
33 + }
34 + },
35 + mounted() {
36 + this.initChart()
37 + window.addEventListener("resize", this.__resizeHanlder)
38 + },
39 + beforeUnmount() {
40 + if (!this.chart) {
41 + return
42 + }
43 + window.removeEventListener("resize", this.__resizeHanlder)
44 + this.chart.dispose()
45 + this.chart = null
46 + },
47 + methods: {
48 + __resizeHanlder() {
49 + if (this.chart) {
50 + this.chart.resize()
51 + }
52 + },
53 + initChart() {
54 + this.chart = echarts.init(document.getElementById("chart"))
55 + this.chart.setOption({
56 + //backgroundColor: '#394056',
57 + title: {
58 + top: 20,
59 + text: "Chart title",
60 + fontWeight: "normal",
61 + fontSize: 16 /*color: '#F1F1F3'*/,
62 + left: "1%"
63 + },
64 + tooltip: {
65 + trigger: "axis",
66 + axisPointer: {
67 + lineStyle: {
68 + /*color: '#57617B'*/
69 + }
70 + }
71 + },
72 + legend: {
73 + top: 20,
74 + icon: "rect",
75 + itemWidth: 14,
76 + itemHeight: 5,
77 + itemGap: 13,
78 + data: ["One", "Two", "Three"],
79 + right: "4%",
80 + textStyle: { fontSize: 12 /*color: '#F1F1F3'*/ }
81 + },
82 + grid: {
83 + top: 100,
84 + left: "3%",
85 + right: "4%",
86 + bottom: "2%",
87 + containLabel: true
88 + },
89 + xAxis: [
90 + {
91 + type: "category",
92 + boundaryGap: false,
93 + axisLine: {
94 + lineStyle: {
95 + /*color: '#57617B'*/
96 + }
97 + },
98 + data: ["13:00", "13:05", "13:10", "13:15", "13:20", "13:25", "13:30", "13:35", "13:40", "13:45", "13:50", "13:55"]
99 + }
100 + ],
101 + yAxis: [
102 + {
103 + type: "value",
104 + name: "(%)",
105 + axisTick: { show: false },
106 + axisLine: {
107 + lineStyle: {
108 + /*color: '#57617B'*/
109 + }
110 + },
111 + axisLabel: {
112 + margin: 10,
113 + fontSize: 14
114 + },
115 + splitLine: { lineStyle: { color: "#eee" /*color: '#57617B'*/ } }
116 + }
117 + ],
118 + series: [
119 + {
120 + name: "One",
121 + type: "line",
122 + smooth: true,
123 + symbol: "circle",
124 + symbolSize: 5,
125 + showSymbol: false,
126 + lineStyle: { width: 1 },
127 + areaStyle: {
128 + color: new echarts.graphic.LinearGradient(
129 + 0,
130 + 0,
131 + 0,
132 + 1,
133 + [
134 + {
135 + offset: 0,
136 + color: "rgba(137, 189, 27, 0.3)"
137 + },
138 + {
139 + offset: 0.8,
140 + color: "rgba(137, 189, 27, 0)"
141 + }
142 + ],
143 + false
144 + ),
145 + shadowColor: "rgba(0, 0, 0, 0.1)",
146 + shadowBlur: 10
147 + },
148 + itemStyle: {
149 + color: "rgb(137,189,27)",
150 + borderColor: "rgba(137,189,2,0.27)",
151 + borderWidth: 12
152 + },
153 + data: [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122]
154 + },
155 + {
156 + name: "Two",
157 + type: "line",
158 + smooth: true,
159 + symbol: "circle",
160 + symbolSize: 5,
161 + showSymbol: false,
162 + lineStyle: { width: 1 },
163 + areaStyle: {
164 + color: new echarts.graphic.LinearGradient(
165 + 0,
166 + 0,
167 + 0,
168 + 1,
169 + [
170 + {
171 + offset: 0,
172 + color: "rgba(0, 136, 212, 0.3)"
173 + },
174 + {
175 + offset: 0.8,
176 + color: "rgba(0, 136, 212, 0)"
177 + }
178 + ],
179 + false
180 + ),
181 + shadowColor: "rgba(0, 0, 0, 0.1)",
182 + shadowBlur: 10
183 + },
184 + itemStyle: {
185 + color: "rgb(0,136,212)",
186 + borderColor: "rgba(0,136,212,0.2)",
187 + borderWidth: 12
188 + },
189 + data: [120, 110, 125, 145, 122, 165, 122, 220, 182, 191, 134, 150]
190 + },
191 + {
192 + name: "Three",
193 + type: "line",
194 + smooth: true,
195 + symbol: "circle",
196 + symbolSize: 5,
197 + showSymbol: false,
198 + lineStyle: { width: 1 },
199 + areaStyle: {
200 + color: new echarts.graphic.LinearGradient(
201 + 0,
202 + 0,
203 + 0,
204 + 1,
205 + [
206 + {
207 + offset: 0,
208 + color: "rgba(219, 50, 51, 0.3)"
209 + },
210 + {
211 + offset: 0.8,
212 + color: "rgba(219, 50, 51, 0)"
213 + }
214 + ],
215 + false
216 + ),
217 + shadowColor: "rgba(0, 0, 0, 0.1)",
218 + shadowBlur: 10
219 + },
220 + itemStyle: {
221 + color: "rgb(219,50,51)",
222 + borderColor: "rgba(219,50,51,0.2)",
223 + borderWidth: 12
224 + },
225 + data: [220, 182, 125, 145, 122, 191, 134, 150, 120, 110, 165, 122]
226 + }
227 + ]
228 + })
229 + }
230 + }
231 +})
232 +</script>
233 +
234 +<style lang="scss"></style>
src/views/ui/Charts/Peity.vue new
+124
@@ -0,0 +1,124 @@
1 +<template>
2 + <div class="page-peity scrollable ph-20">
3 + <div class="page-header">
4 + <h1>Peity</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Charts</el-breadcrumb-item>
9 + <el-breadcrumb-item>Peity</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div class="card-base card-shadow--medium p-30 mt-40" v-if="!isIe">
14 + <h2 class="mt-0 mb-30">Updating</h2>
15 + <div class="chart-box">
16 + <peity :type="'line'" :options="{ width: '100%' }" :data="lineData"></peity>
17 + </div>
18 + </div>
19 +
20 + <div class="card-base card-shadow--medium p-30 mt-40">
21 + <h2 class="mt-0 mb-30">Pie</h2>
22 + <div class="chart-box">
23 + <peity :type="'pie'" :data="'1/5'"></peity>
24 + <peity :type="'pie'" :data="'226/360'"></peity>
25 + <peity :type="'pie'" :data="'0.52/1.561'"></peity>
26 + <peity :type="'pie'" :data="'1,4'"></peity>
27 + <peity :type="'pie'" :data="'226,134'"></peity>
28 + <peity :type="'pie'" :data="'0.52,1.041'"></peity>
29 + <peity :type="'pie'" :data="'1,2,3,2,2'"></peity>
30 + </div>
31 + </div>
32 +
33 + <div class="card-base card-shadow--medium p-30 mt-40">
34 + <h2 class="mt-0 mb-30">Donut</h2>
35 + <div class="chart-box">
36 + <peity :type="'donut'" :data="'1/5'"></peity>
37 + <peity :type="'donut'" :data="'226/360'"></peity>
38 + <peity :type="'donut'" :data="'0.52/1.561'"></peity>
39 + <peity :type="'donut'" :data="'1,4'"></peity>
40 + <peity :type="'donut'" :data="'226,134'"></peity>
41 + <peity :type="'donut'" :data="'0.52,1.041'"></peity>
42 + <peity :type="'donut'" :data="'1,2,3,2,2'"></peity>
43 + </div>
44 + </div>
45 +
46 + <div class="card-base card-shadow--medium p-30 mt-40">
47 + <h2 class="mt-0 mb-30">Line</h2>
48 + <div class="chart-box">
49 + <peity :type="'line'" :data="'5,3,9,6,5,9,7,3,5,2'"></peity>
50 + <peity :type="'line'" :data="'5,3,2,-1,-3,-2,2,3,5,2'"></peity>
51 + <peity :type="'line'" :data="'0,-3,-6,-4,-5,-4,-7,-3,-5,-2'"></peity>
52 + </div>
53 + </div>
54 +
55 + <div class="card-base card-shadow--medium p-30 mt-40">
56 + <h2 class="mt-0 mb-30">Bar</h2>
57 + <div class="chart-box">
58 + <peity :type="'bar'" :data="'5,3,9,6,5,9,7,3,5,2'"></peity>
59 + <peity :type="'bar'" :data="'5,3,2,-1,-3,-2,2,3,5,2'"></peity>
60 + <peity :type="'bar'" :data="'0,-3,-6,-4,-5,-4,-7,-3,-5,-2'"></peity>
61 + </div>
62 + </div>
63 +
64 + <div class="card-base card-shadow--medium p-30 mt-40">
65 + <h2 class="mt-0 mb-30">Options</h2>
66 + <div class="chart-box">
67 + <peity :type="'donut'" :options="{ fill: ['red', '#eeeeee'], innerRadius: 10, radius: 40 }" :data="'1/7'"></peity>
68 + <peity :type="'donut'" :options="{ fill: ['orange', '#eeeeee'], innerRadius: 14, radius: 36 }" :data="'2/7'"></peity>
69 + <peity :type="'donut'" :options="{ fill: ['yellow', '#eeeeee'], innerRadius: 16, radius: 32 }" :data="'3/7'"></peity>
70 + <peity :type="'donut'" :options="{ fill: ['green', '#eeeeee'], innerRadius: 18, radius: 28 }" :data="'4/7'"></peity>
71 + <peity :type="'donut'" :options="{ fill: ['blue', '#eeeeee'], innerRadius: 20, radius: 24 }" :data="'5/7'"></peity>
72 + <peity :type="'donut'" :options="{ fill: ['indigo', '#eeeeee'], innerRadius: 18, radius: 20 }" :data="'6/7'"></peity>
73 + <peity :type="'donut'" :options="{ fill: ['violet', '#eeeeee'], innerRadius: 15, radius: 16 }" :data="'7/7'"></peity>
74 + </div>
75 + </div>
76 +
77 + <h4>
78 + <a href="https://github.com/vue-bulma/peity" target="_blank"><i class="mdi mdi-link-variant"></i>reference</a>
79 + </h4>
80 + </div>
81 +</template>
82 +
83 +<script>
84 +import { detect } from "detect-browser"
85 +const browser = detect()
86 +import Peity from "@/components/vue-peity/Peity.vue"
87 +
88 +import { defineComponent } from "@vue/runtime-core"
89 +
90 +export default defineComponent({
91 + name: "PeityPage",
92 + data() {
93 + return {
94 + isIe: true,
95 + data: [5, 3, 9, 6, 5, 9, 7, 3, 5, 2, 5, 3, 9, 6, 5, 9, 7, 3, 5, 2]
96 + }
97 + },
98 + computed: {
99 + lineData() {
100 + return this.data.toString()
101 + }
102 + },
103 + created() {
104 + if (browser.name !== "ie") this.isIe = false
105 +
106 + setInterval(() => {
107 + let random = Math.round(Math.random() * 10)
108 + this.data.shift()
109 + this.data.push(random)
110 + }, 1000)
111 + },
112 + components: { Peity }
113 +})
114 +</script>
115 +
116 +<style lang="scss">
117 +.page-peity {
118 + .chart-box {
119 + & > * {
120 + margin-right: 20px;
121 + }
122 + }
123 +}
124 +</style>
src/views/ui/Charts/Plotly.vue new
+465
@@ -0,0 +1,465 @@
1 +<template>
2 + <div class="page-plotly scrollable">
3 + <div class="page-header">
4 + <h1>Plotly</h1>
5 + <h4>
6 + <a href="https://plot.ly/javascript/" target="_blank"><i class="mdi mdi-link-variant"></i>reference</a>
7 + </h4>
8 + <el-breadcrumb separator="/">
9 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
10 + <el-breadcrumb-item>Components</el-breadcrumb-item>
11 + <el-breadcrumb-item>Charts</el-breadcrumb-item>
12 + <el-breadcrumb-item>Plotly</el-breadcrumb-item>
13 + </el-breadcrumb>
14 + </div>
15 +
16 + <div class="card-base card-shadow--medium p-20 mt-30">
17 + <h2 class="mt-0">Stacked Area Chart</h2>
18 + <div class="chart-box">
19 + <div ref="stackedArea"></div>
20 + </div>
21 + </div>
22 +
23 + <div class="card-base card-shadow--medium p-20 mt-30">
24 + <h2 class="mt-0">Colored and Styled Bar Chart</h2>
25 + <div class="chart-box">
26 + <div ref="bar"></div>
27 + </div>
28 + </div>
29 +
30 + <div class="card-base card-shadow--medium p-20 mt-30">
31 + <h2 class="mt-0">Sankey Diagram</h2>
32 + <div class="chart-box">
33 + <div ref="sankey"></div>
34 + </div>
35 + </div>
36 +
37 + <!--<div class="card-base card-shadow--medium p-20 mt-30">
38 + <h2 class="mt-0">Lines on an Orthographic Map</h2>
39 + <div class="chart-box">
40 + <div ref="map"></div>
41 + </div>
42 + </div>-->
43 +
44 + <div class="card-base card-shadow--medium p-20 mt-30">
45 + <h2 class="mt-0">Fully Styled Box Plot</h2>
46 + <div class="chart-box">
47 + <div ref="boxPlot"></div>
48 + </div>
49 + </div>
50 +
51 + <div class="card-base card-shadow--medium p-20 mt-30">
52 + <h2 class="mt-0">Time Series with Rangeslider</h2>
53 + <div class="chart-box">
54 + <div ref="time"></div>
55 + </div>
56 + </div>
57 +
58 + <div class="card-base card-shadow--medium p-20 mt-30">
59 + <h2 class="mt-0">Wind Rose Chart</h2>
60 + <div class="chart-box">
61 + <div ref="polar"></div>
62 + </div>
63 + </div>
64 + </div>
65 +</template>
66 +
67 +<script>
68 +import Plotly from "plotly.js/lib/core"
69 +import PlotlyBar from "plotly.js/lib/bar"
70 +import PlotlyBox from "plotly.js/lib/box"
71 +import PlotlySankey from "plotly.js/lib/sankey"
72 +
73 +/*import PlotlyScatter3d from 'plotly.js/lib/scatter3d'
74 +import PlotlySurface from 'plotly.js/lib/surface'
75 +import PlotlyMesh3d from 'plotly.js/lib/mesh3d'*/
76 +
77 +Plotly.register(PlotlyBar)
78 +Plotly.register(PlotlyBox)
79 +Plotly.register(PlotlySankey)
80 +
81 +/*Plotly.register(PlotlyScatter3d)
82 +Plotly.register(PlotlySurface)
83 +Plotly.register(PlotlyMesh3d)*/
84 +
85 +import { defineComponent } from "@vue/runtime-core"
86 +
87 +export default defineComponent({
88 + name: "PlotlyPage",
89 + data() {
90 + return {
91 + rows: []
92 + }
93 + },
94 + mounted() {
95 + /* Stacked Area Chart */
96 + var traces = [
97 + { x: [1, 2, 3], y: [2, 1, 4], fill: "tozeroy" },
98 + { x: [1, 2, 3], y: [1, 1, 2], fill: "tonexty" },
99 + { x: [1, 2, 3], y: [3, 0, 2], fill: "tonexty" }
100 + ]
101 + function stackedArea(traces) {
102 + for (var i = 1; i < traces.length; i++) {
103 + for (var j = 0; j < Math.min(traces[i]["y"].length, traces[i - 1]["y"].length); j++) {
104 + traces[i]["y"][j] += traces[i - 1]["y"][j]
105 + }
106 + }
107 + return traces
108 + }
109 + Plotly.newPlot(this.$refs.stackedArea, stackedArea(traces), { title: "stacked and filled line chart" })
110 +
111 + /* Colored and Styled Bar Chart */
112 + ;(() => {
113 + var trace1 = {
114 + x: [1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012],
115 + y: [219, 146, 112, 127, 124, 180, 236, 207, 236, 263, 350, 430, 474, 526, 488, 537, 500, 439],
116 + name: "Rest of world",
117 + marker: { color: "rgb(55, 83, 109)" },
118 + type: "bar"
119 + }
120 + var trace2 = {
121 + x: [1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012],
122 + y: [16, 13, 10, 11, 28, 37, 43, 55, 56, 88, 105, 156, 270, 299, 340, 403, 549, 499],
123 + name: "China",
124 + marker: { color: "rgb(26, 118, 255)" },
125 + type: "bar"
126 + }
127 + var data = [trace1, trace2]
128 + var layout = {
129 + title: "US Export of Plastic Scrap",
130 + xaxis: {
131 + tickfont: {
132 + size: 14,
133 + color: "rgb(107, 107, 107)"
134 + }
135 + },
136 + yaxis: {
137 + title: "USD (millions)",
138 + titlefont: {
139 + size: 16,
140 + color: "rgb(107, 107, 107)"
141 + },
142 + tickfont: {
143 + size: 14,
144 + color: "rgb(107, 107, 107)"
145 + }
146 + },
147 + legend: {
148 + x: 0,
149 + y: 1.0,
150 + bgcolor: "rgba(255, 255, 255, 0)",
151 + bordercolor: "rgba(255, 255, 255, 0)"
152 + },
153 + barmode: "group",
154 + bargap: 0.15,
155 + bargroupgap: 0.1
156 + }
157 + Plotly.newPlot(this.$refs.bar, data, layout)
158 + })()
159 +
160 + /* Sankey Diagram */
161 + Plotly.d3.json("https://raw.githubusercontent.com/plotly/plotly.js/master/test/image/mocks/sankey_energy.json", fig => {
162 + var data = {
163 + type: "sankey",
164 + domain: {
165 + x: [0, 1],
166 + y: [0, 1]
167 + },
168 + orientation: "h",
169 + valueformat: ".0f",
170 + valuesuffix: "TWh",
171 + node: {
172 + pad: 15,
173 + thickness: 15,
174 + line: {
175 + color: "black",
176 + width: 0.5
177 + },
178 + label: fig.data[0].node.label,
179 + color: fig.data[0].node.color
180 + },
181 + link: {
182 + source: fig.data[0].link.source,
183 + target: fig.data[0].link.target,
184 + value: fig.data[0].link.value,
185 + label: fig.data[0].link.label
186 + }
187 + }
188 + var data = [data]
189 + var layout = {
190 + title: "Energy forecast for 2050<br>Source: Department of Energy & Climate Change, Tom Counsell via <a href='https://bost.ocks.org/mike/sankey/'>Mike Bostock</a>",
191 + //width: 1118,
192 + height: 772,
193 + font: {
194 + size: 10
195 + }
196 + }
197 + Plotly.plot(this.$refs.sankey, data, layout)
198 + })
199 +
200 + /* Lines on an Orthographic Map
201 + Plotly.d3.csv('https://raw.githubusercontent.com/plotly/datasets/master/globe_contours.csv',(err, rows) => {
202 + function unpack(rows, key) {
203 + return rows.map(function(row) { return row[key]; });
204 + }
205 +
206 + var data = [];
207 + var scl =['rgb(213,62,79)','rgb(244,109,67)','rgb(253,174,97)','rgb(254,224,139)','rgb(255,255,191)','rgb(230,245,152)','rgb(171,221,164)','rgb(102,194,165)','rgb(50,136,189)'];
208 + var allLats = [];
209 + var allLons = [];
210 +
211 + for ( var i = 0 ; i < scl.length; i++){
212 + var latHead = 'lat-'+i;
213 + var lonHead = 'lon-'+i;
214 + var lat = unpack(rows, latHead);
215 + var lon = unpack(rows, lonHead);
216 + allLats.push(lat);
217 + allLons.push(lon);
218 + }
219 + for ( var i = 0 ; i < scl.length; i++) {
220 + var current = {
221 + type:'scattergeo',
222 + lon: allLons[i],
223 + lat: allLats[i],
224 + mode: 'lines',
225 + line: {
226 + width: 2,
227 + color: scl[i]
228 + }
229 + }
230 + data.push(current);
231 + };
232 + var layout = {
233 + geo: {
234 + projection: {
235 + type: 'orthographic',
236 + rotation: {
237 + lon: -100,
238 + lat: 40
239 + },
240 + },
241 + showocean: true,
242 + oceancolor: 'rgb(0, 255, 255)',
243 + showland: true,
244 + landcolor: 'rgb(230, 145, 56)',
245 + showlakes: true,
246 + lakecolor: 'rgb(0, 255, 255)',
247 + showcountries: true,
248 + lonaxis: {
249 + showgrid: true,
250 + gridcolor: 'rgb(102, 102, 102)'
251 + },
252 + lataxis: {
253 + showgrid: true,
254 + gridcolor: 'rgb(102, 102, 102)'
255 + }
256 + }
257 + };
258 + Plotly.plot(this.$refs.map, data, layout, {showLink: false});
259 + });*/
260 +
261 + /* Fully Styled Box Plot */
262 + ;(() => {
263 + var xData = [
264 + "Carmelo<br>Anthony",
265 + "Dwyane<br>Wade",
266 + "Deron<br>Williams",
267 + "Brook<br>Lopez",
268 + "Damian<br>Lillard",
269 + "David<br>West",
270 + "Blake<br>Griffin",
271 + "David<br>Lee",
272 + "Demar<br>Derozan"
273 + ]
274 +
275 + function getrandom(num, mul) {
276 + var value = []
277 + for (i = 0; i <= num; i++) {
278 + var rand = Math.random() * mul
279 + value.push(rand)
280 + }
281 + return value
282 + }
283 +
284 + var yData = [
285 + getrandom(30, 10),
286 + getrandom(30, 20),
287 + getrandom(30, 25),
288 + getrandom(30, 40),
289 + getrandom(30, 45),
290 + getrandom(30, 30),
291 + getrandom(30, 20),
292 + getrandom(30, 15),
293 + getrandom(30, 43)
294 + ]
295 + var colors = [
296 + "rgba(93, 164, 214, 0.5)",
297 + "rgba(255, 144, 14, 0.5)",
298 + "rgba(44, 160, 101, 0.5)",
299 + "rgba(255, 65, 54, 0.5)",
300 + "rgba(207, 114, 255, 0.5)",
301 + "rgba(127, 96, 0, 0.5)",
302 + "rgba(255, 140, 184, 0.5)",
303 + "rgba(79, 90, 117, 0.5)",
304 + "rgba(222, 223, 0, 0.5)"
305 + ]
306 +
307 + var data = []
308 +
309 + for (var i = 0; i < xData.length; i++) {
310 + var result = {
311 + type: "box",
312 + y: yData[i],
313 + name: xData[i],
314 + boxpoints: "all",
315 + jitter: 0.5,
316 + whiskerwidth: 0.2,
317 + fillcolor: "cls",
318 + marker: {
319 + size: 2
320 + },
321 + line: {
322 + width: 1
323 + }
324 + }
325 + data.push(result)
326 + }
327 +
328 + var layout = {
329 + title: "Points Scored by the Top 9 Scoring NBA Players in 2012",
330 + yaxis: {
331 + autorange: true,
332 + showgrid: true,
333 + zeroline: true,
334 + dtick: 5,
335 + gridcolor: "rgb(255, 255, 255)",
336 + gridwidth: 1,
337 + zerolinecolor: "rgb(255, 255, 255)",
338 + zerolinewidth: 2
339 + },
340 + margin: {
341 + l: 40,
342 + r: 30,
343 + b: 80,
344 + t: 100
345 + },
346 + //paper_bgcolor: 'rgb(243, 243, 243)',
347 + //splot_bgcolor: 'rgb(243, 243, 243)',
348 + showlegend: false
349 + }
350 +
351 + Plotly.newPlot(this.$refs.boxPlot, data, layout)
352 + })()
353 +
354 + /* Time Series with Rangeslider */
355 + Plotly.d3.csv("https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv", (err, rows) => {
356 + function unpack(rows, key) {
357 + return rows.map(function (row) {
358 + return row[key]
359 + })
360 + }
361 +
362 + var trace1 = {
363 + type: "scatter",
364 + mode: "lines",
365 + name: "AAPL High",
366 + x: unpack(rows, "Date"),
367 + y: unpack(rows, "AAPL.High"),
368 + line: { color: "#17BECF" }
369 + }
370 + var trace2 = {
371 + type: "scatter",
372 + mode: "lines",
373 + name: "AAPL Low",
374 + x: unpack(rows, "Date"),
375 + y: unpack(rows, "AAPL.Low"),
376 + line: { color: "#7F7F7F" }
377 + }
378 +
379 + var data = [trace1, trace2]
380 +
381 + var layout = {
382 + title: "Time Series with Rangeslider",
383 + xaxis: {
384 + autorange: true,
385 + range: ["2015-02-17", "2017-02-16"],
386 + rangeselector: {
387 + buttons: [
388 + {
389 + count: 1,
390 + label: "1m",
391 + step: "month",
392 + stepmode: "backward"
393 + },
394 + {
395 + count: 6,
396 + label: "6m",
397 + step: "month",
398 + stepmode: "backward"
399 + },
400 + { step: "all" }
401 + ]
402 + },
403 + rangeslider: { range: ["2015-02-17", "2017-02-16"] },
404 + type: "date"
405 + },
406 + yaxis: {
407 + autorange: true,
408 + range: [86.8700008333, 138.870004167],
409 + type: "linear"
410 + }
411 + }
412 +
413 + Plotly.newPlot(this.$refs.time, data, layout)
414 + })
415 +
416 + /* Wind Rose Chart */
417 + var trace1 = {
418 + r: [77.5, 72.5, 70.0, 45.0, 22.5, 42.5, 40.0, 62.5],
419 + t: ["North", "N-E", "East", "S-E", "South", "S-W", "West", "N-W"],
420 + name: "11-14 m/s",
421 + marker: { color: "rgb(106,81,163)" },
422 + type: "area"
423 + }
424 +
425 + var trace2 = {
426 + r: [57.5, 50.0, 45.0, 35.0, 20.0, 22.5, 37.5, 55.0],
427 + t: ["North", "N-E", "East", "S-E", "South", "S-W", "West", "N-W"],
428 + name: "8-11 m/s",
429 + marker: { color: "rgb(158,154,200)" },
430 + type: "area"
431 + }
432 +
433 + var trace3 = {
434 + r: [40.0, 30.0, 30.0, 35.0, 7.5, 7.5, 32.5, 40.0],
435 + t: ["North", "N-E", "East", "S-E", "South", "S-W", "West", "N-W"],
436 + name: "5-8 m/s",
437 + marker: { color: "rgb(203,201,226)" },
438 + type: "area"
439 + }
440 +
441 + var trace4 = {
442 + r: [20.0, 7.5, 15.0, 22.5, 2.5, 2.5, 12.5, 22.5],
443 + t: ["North", "N-E", "East", "S-E", "South", "S-W", "West", "N-W"],
444 + name: "< 5 m/s",
445 + marker: { color: "rgb(242,240,247)" },
446 + type: "area"
447 + }
448 +
449 + var data = [trace1, trace2, trace3, trace4]
450 +
451 + var layout = {
452 + title: "Wind Speed Distribution in Laurel, NE",
453 + font: { size: 16 },
454 + legend: { font: { size: 16 } },
455 + radialaxis: { ticksuffix: "%" },
456 + orientation: 270,
457 + width: 340
458 + }
459 +
460 + Plotly.newPlot(this.$refs.polar, data, layout)
461 + }
462 +})
463 +</script>
464 +
465 +<style lang="scss"></style>
src/views/ui/Charts/VueChartist.vue new
+134
@@ -0,0 +1,134 @@
1 +<template>
2 + <el-scrollbar class="page-vuechartist">
3 + <div class="page-header">
4 + <h1>Vue Chartist</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Charts</el-breadcrumb-item>
9 + <el-breadcrumb-item>Vue Chartist</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <h3 class="mb-15 mt-20">Simple Line Chart</h3>
14 + <div class="card-base card-shadow--medium p-50 bg-white black-text" style="height: 300px">
15 + <vue-chartist :data="data1" :options="options1" type="Line"></vue-chartist>
16 + </div>
17 +
18 + <h3 class="mb-15 mt-50">Bi-polar Line Chart with Area Only</h3>
19 + <div class="card-base card-shadow--medium p-50 bg-white black-text" style="height: 300px">
20 + <vue-chartist :data="data2" :options="options2" type="Line"></vue-chartist>
21 + </div>
22 +
23 + <h3 class="mb-15 mt-50">Multi-line Labels</h3>
24 + <div class="card-base card-shadow--medium p-50 bg-white black-text" style="height: 300px">
25 + <vue-chartist :data="data3" :options="options3" type="Bar"></vue-chartist>
26 + </div>
27 +
28 + <h3 class="mb-15 mt-50">Donut Chart using fill rather than stroke</h3>
29 + <div class="card-base card-shadow--medium p-50 bg-white black-text" style="height: 300px">
30 + <vue-chartist :data="data4" :options="options4" type="Pie"></vue-chartist>
31 + </div>
32 +
33 + <h4>
34 + <a href="https://github.com/lakb248/vue-chartist" target="_blank"><i class="mdi mdi-link-variant"></i>reference</a>
35 + </h4>
36 + </el-scrollbar>
37 +</template>
38 +
39 +<script>
40 +import { defineComponent } from "@vue/runtime-core"
41 +
42 +export default defineComponent({
43 + name: "VueChartistPage",
44 + data() {
45 + return {
46 + data1: {
47 + labels: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
48 + series: [
49 + [12, 9, 7, 8, 5],
50 + [2, 1, 3.5, 7, 3],
51 + [1, 3, 4, 5, 6]
52 + ]
53 + },
54 + options1: {
55 + fullWidth: true,
56 + chartPadding: {
57 + right: 40
58 + }
59 + },
60 + data2: {
61 + labels: [1, 2, 3, 4, 5, 6, 7, 8],
62 + series: [
63 + [1, 2, 3, 1, -2, 0, 1, 0],
64 + [-2, -1, -2, -1, -2.5, -1, -2, -1],
65 + [0, 0, 0, 1, 2, 2.5, 2, 1],
66 + [2.5, 2, 1, 0.5, 1, 0.5, -1, -2.5]
67 + ]
68 + },
69 + options2: {
70 + high: 3,
71 + low: -3,
72 + showArea: true,
73 + showLine: false,
74 + showPoint: false,
75 + fullWidth: true,
76 + axisX: {
77 + showLabel: false,
78 + showGrid: false
79 + }
80 + },
81 + data3: {
82 + labels: [
83 + "First quarter of the year",
84 + "Second quarter of the year",
85 + "Third quarter of the year",
86 + "Fourth quarter of the year"
87 + ],
88 + series: [
89 + [60000, 40000, 80000, 70000],
90 + [40000, 30000, 70000, 65000],
91 + [8000, 3000, 10000, 6000]
92 + ]
93 + },
94 + options3: {
95 + seriesBarDistance: 10,
96 + axisX: {
97 + offset: 60
98 + },
99 + axisY: {
100 + offset: 80,
101 + labelInterpolationFnc: function (value) {
102 + return value + " CHF"
103 + },
104 + scaleMinSpace: 15
105 + }
106 + },
107 + data4: {
108 + series: [20, 10, 30, 40]
109 + },
110 + options4: {
111 + donut: true,
112 + donutWidth: 60,
113 + donutSolid: true,
114 + startAngle: 270,
115 + showLabel: true
116 + }
117 + }
118 + }
119 +})
120 +</script>
121 +
122 +<style lang="scss">
123 +.v-chartist-container {
124 + height: 100%;
125 +}
126 +
127 +@media (max-width: 768px) {
128 + .page-vuechartist {
129 + .p-50 {
130 + padding: 10px;
131 + }
132 + }
133 +}
134 +</style>
src/views/ui/Charts/VueChartkick.vue new
+90
@@ -0,0 +1,90 @@
1 +<template>
2 + <div class="page-vuechartkick scrollable ph-20">
3 + <div class="page-header">
4 + <h1>Vue Chartkick</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Charts</el-breadcrumb-item>
9 + <el-breadcrumb-item>Vue Chartkick</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div class="card-base card-shadow--medium bg-white black-text p-30 mt-40">
14 + <h2 class="mt-0 mb-30">Line chart</h2>
15 + <line-chart :data="{ '2017-01-01': 11, '2017-01-02': 6 }"></line-chart>
16 + </div>
17 + <div class="card-base card-shadow--medium bg-white black-text p-30 mt-40">
18 + <h2 class="mt-0 mb-30">Pie chart</h2>
19 + <pie-chart
20 + :data="[
21 + ['Blueberry', 44],
22 + ['Strawberry', 23]
23 + ]"
24 + ></pie-chart>
25 + </div>
26 + <div class="card-base card-shadow--medium bg-white black-text p-30 mt-40">
27 + <h2 class="mt-0 mb-30">Column chart</h2>
28 + <column-chart
29 + :data="[
30 + ['Sun', 32],
31 + ['Mon', 46],
32 + ['Tue', 28]
33 + ]"
34 + ></column-chart>
35 + </div>
36 + <div class="card-base card-shadow--medium bg-white black-text p-30 mt-40">
37 + <h2 class="mt-0 mb-30">Bar chart</h2>
38 + <bar-chart
39 + :data="[
40 + ['Work', 32],
41 + ['Play', 1492]
42 + ]"
43 + ></bar-chart>
44 + </div>
45 + <div class="card-base card-shadow--medium bg-white black-text p-30 mt-40">
46 + <h2 class="mt-0 mb-30">Area chart</h2>
47 + <area-chart :data="{ '2017-01-01': 11, '2017-01-02': 6 }"></area-chart>
48 + </div>
49 + <div class="card-base card-shadow--medium bg-white black-text p-30 mt-40">
50 + <h2 class="mt-0 mb-30">Scatter chart</h2>
51 + <scatter-chart
52 + :data="[
53 + [174.0, 80.0],
54 + [176.5, 82.3],
55 + [166.5, 52.3],
56 + [146.5, 32.3],
57 + [126.5, 12.3],
58 + [16.5, 8.3]
59 + ]"
60 + xtitle="Size"
61 + ytitle="Population"
62 + ></scatter-chart>
63 + </div>
64 +
65 + <h4>
66 + <a href="https://github.com/ankane/vue-chartkick" target="_blank"><i class="mdi mdi-link-variant"></i>reference</a>
67 + </h4>
68 + </div>
69 +</template>
70 +
71 +<script>
72 +import { defineComponent } from "@vue/runtime-core"
73 +
74 +export default defineComponent({
75 + name: "VueChartkickPage",
76 + data() {
77 + return {}
78 + }
79 +})
80 +</script>
81 +
82 +<style lang="scss" scoped>
83 +.card-base {
84 + height: 400px;
85 +
86 + & > div {
87 + position: relative;
88 + }
89 +}
90 +</style>
src/views/ui/Charts/VueD3Network.vue new
+160
@@ -0,0 +1,160 @@
1 +<template>
2 + <div class="page-vued3network scrollable">
3 + <div class="page-header">
4 + <h1>Vue D3 Network</h1>
5 + <h4>
6 + <a href="https://github.com/emiliorizzo/vue-d3-network" target="_blank"><i class="mdi mdi-link-variant"></i>reference</a>
7 + </h4>
8 + <el-breadcrumb separator="/">
9 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
10 + <el-breadcrumb-item>Components</el-breadcrumb-item>
11 + <el-breadcrumb-item>Charts</el-breadcrumb-item>
12 + <el-breadcrumb-item>Vue D3 Network</el-breadcrumb-item>
13 + </el-breadcrumb>
14 + </div>
15 + <div class="card-base card-shadow--medium">
16 + <ul class="menu">
17 + <li>
18 + <label> Node size </label>
19 + <input type="range" min="1" max="100" v-model="nodeSize" /> {{ options.nodeSize }}
20 + </li>
21 + <li>
22 + <label>Render as </label>
23 + <input type="radio" :value="false" v-model="canvas" />
24 + <label>SVG</label>
25 + <input type="radio" :value="true" v-model="canvas" />
26 + <label>Canvas</label>
27 + </li>
28 + </ul>
29 + <d3-network ref="net" :net-nodes="nodes" :net-links="links" :options="options" />
30 + </div>
31 + <div class="card-base card-shadow--medium mt-30">
32 + <ul class="menu">
33 + <li>
34 + <label>Force: {{ force }}</label>
35 + <input type="range" min="-500" max="500" v-model="force" />
36 + </li>
37 + <li>
38 + <label>Forces X: {{ fX }}</label>
39 + <input type="range" min="0" max="1" step=".01" v-model="fX" />
40 + </li>
41 + <li>
42 + <label>Forces Y: {{ fY }}</label>
43 + <input type="range" min="0" max="1" step=".01" v-model="fY" />
44 + </li>
45 + <li>
46 + <label>Center:</label>
47 + <input type="checkbox" v-model="fC" />
48 + </li>
49 + <li>
50 + <label>Many Body:</label>
51 + <input type="checkbox" v-model="fMb" />
52 + </li>
53 + <li>
54 + <button v-on:click="reset">restart simulation</button>
55 + </li>
56 + </ul>
57 + <d3-network :net-nodes="nodes2" :net-links="[]" :options="options2" />
58 + </div>
59 + </div>
60 +</template>
61 +
62 +<script>
63 +import { defineComponent } from "@vue/runtime-core"
64 +
65 +export default defineComponent({
66 + name: "VueD3NetworkPage",
67 + data() {
68 + return {
69 + nodes: [
70 + { id: 1, name: "my awesome node 1" },
71 + { id: 2, name: "my node 2" },
72 + { id: 3, name: "orange node", _color: "orange" },
73 + { id: 4, _color: "#0022ff" },
74 + { id: 5 },
75 + { id: 6 },
76 + { id: 7 },
77 + { id: 8 },
78 + { id: 9 }
79 + ],
80 + links: [
81 + { sid: 1, tid: 2 },
82 + { sid: 2, tid: 8 },
83 + { sid: 3, tid: 4 },
84 + { sid: 4, tid: 5 },
85 + { sid: 5, tid: 6 },
86 + { sid: 7, tid: 8 },
87 + { sid: 5, tid: 8 },
88 + { sid: 3, tid: 8 },
89 + { sid: 7, tid: 9 }
90 + ],
91 + nodeSize: 20,
92 + canvas: false,
93 + force: 50,
94 + fX: 0.5,
95 + fY: 0.5,
96 + fMb: true,
97 + fC: false,
98 + nNodes: 500
99 + }
100 + },
101 + computed: {
102 + options() {
103 + return {
104 + force: 3000,
105 + //size:{ w:600, h:500},
106 + nodeSize: this.nodeSize,
107 + nodeLabels: true,
108 + canvas: this.canvas
109 + }
110 + },
111 + nodes2() {
112 + return this.makeNodes()
113 + },
114 + options2() {
115 + return {
116 + force: this.force,
117 + forces: {
118 + X: this.fX,
119 + Y: this.fY,
120 + ManyBody: this.fMb,
121 + Center: this.fC
122 + },
123 + nodeSize: 20,
124 + nodeLabels: false
125 + }
126 + }
127 + },
128 + methods: {
129 + makeNodes() {
130 + return Array.apply(null, { length: this.nNodes }).map((value, index) => {
131 + return { id: index, _color: this.randomColor(), _size: Math.random() * 30 }
132 + })
133 + },
134 + reset() {
135 + this.nNodes++
136 + },
137 + randomColor() {
138 + return "rgb(" + parseInt(Math.random() * 64) + 1 + "," + parseInt(Math.random() * 10) + 1 + "," + 100 + ")"
139 + }
140 + }
141 +})
142 +</script>
143 +
144 +<style lang="scss">
145 +@import "../../../assets/scss/_variables";
146 +
147 +.page-vued3network {
148 + .link-label,
149 + .node-label {
150 + fill: $text-color-primary;
151 + }
152 + .link {
153 + stroke: transparentize($text-color-primary, 0.7);
154 + }
155 + .node {
156 + stroke-width: 1;
157 + stroke: rgba(0, 0, 0, 0.2);
158 + }
159 +}
160 +</style>
src/views/ui/Charts/VueTrend.vue new
+44
@@ -0,0 +1,44 @@
1 +<template>
2 + <div class="page-vuetrend scrollable">
3 + <div class="page-header">
4 + <h1>Vue Trend</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Charts</el-breadcrumb-item>
9 + <el-breadcrumb-item>Vue Trend</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 + <div class="card-base card-shadow--medium p-10">
13 + <trend :data="data" :gradient="['#6fa8dc', '#42b983', '#2c3e50']" auto-draw smooth></trend>
14 + </div>
15 +
16 + <h4>
17 + <a href="https://github.com/QingWei-Li/vue-trend" target="_blank"><i class="mdi mdi-link-variant"></i>reference</a>
18 + </h4>
19 + </div>
20 +</template>
21 +
22 +<script>
23 +import { defineComponent } from "@vue/runtime-core"
24 +
25 +export default defineComponent({
26 + name: "VueTrendPage",
27 + data() {
28 + return {
29 + data: [5, 3, 9, 6, 5, 9, 7, 3, 5, 2, 5, 3, 9, 6, 5, 9, 7, 3, 5, 2]
30 + }
31 + },
32 + created() {
33 + setTimeout(() => {
34 + setInterval(() => {
35 + let random = Math.round(Math.random() * 10)
36 + this.data.shift()
37 + this.data.push(random)
38 + }, 2000)
39 + }, 1000)
40 + }
41 +})
42 +</script>
43 +
44 +<style lang="scss"></style>
src/views/ui/Editors/Editors.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Editors"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/ui/Editors/Markdown.vue new
+98
@@ -0,0 +1,98 @@
1 +<template>
2 + <div class="page-markdown scrollable">
3 + <div class="page-header">
4 + <h1>Markdown</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Editors</el-breadcrumb-item>
9 + <el-breadcrumb-item>Markdown</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 + <div class="card-base card-shadow--medium">
13 + <mavon-editor v-model="value" language="en" :toolbars="toolbars" :subfield="subfield" :defaultOpen="subfield ? null : 'edit'" />
14 + </div>
15 +
16 + <h4>
17 + <a href="https://github.com/hinesboy/mavonEditor" target="_blank"><i class="mdi mdi-link-variant"></i> reference</a>
18 + </h4>
19 + </div>
20 +</template>
21 +
22 +<script>
23 +import { defineComponent } from "@vue/runtime-core"
24 +import "mavon-editor/dist/css/index.css"
25 +
26 +export default defineComponent({
27 + name: "MarkdownPage",
28 + data() {
29 + return {
30 + subfield: true,
31 + value: `@[toc](toc)
32 +
33 +# H1
34 +## H2
35 +### H3
36 +#### H4
37 +##### H5
38 +###### H6
39 +
40 +---
41 +
42 +Hello world`,
43 + toolbars: {
44 + bold: true,
45 + italic: true,
46 + header: true,
47 + underline: true,
48 + strikethrough: true,
49 + mark: true,
50 + superscript: true,
51 + subscript: true,
52 + quote: true,
53 + ol: true,
54 + ul: true,
55 + link: true,
56 + imagelink: true,
57 + code: true,
58 + table: true,
59 + fullscreen: true,
60 + readmodel: true,
61 + htmlcode: true,
62 + help: true,
63 + /* 1.3.5 */
64 + undo: true,
65 + redo: true,
66 + trash: true,
67 + save: false,
68 + /* 1.4.2 */
69 + navigation: true,
70 + /* 2.1.8 */
71 + alignleft: true,
72 + aligncenter: true,
73 + alignright: true,
74 + /* 2.2.1 */
75 + subfield: true,
76 + preview: true
77 + }
78 + }
79 + },
80 + mounted() {
81 + this.subfield = window.innerWidth >= 340
82 + }
83 +})
84 +</script>
85 +
86 +<style lang="scss">
87 +.page-markdown {
88 + padding: 0 20px;
89 +}
90 +@media (max-width: 339px) {
91 + .page-markdown {
92 + .v-note-wrapper .v-note-op {
93 + transform: scale(0.8);
94 + box-shadow: none !important;
95 + }
96 + }
97 +}
98 +</style>
src/views/ui/Editors/Pell.vue new
+74
@@ -0,0 +1,74 @@
1 +<template>
2 + <div class="page-quill scrollable">
3 + <div class="page-header">
4 + <h1>Pell</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Editors</el-breadcrumb-item>
9 + <el-breadcrumb-item>Pell</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 + <div class="card-base card-shadow--medium">
13 + <VuePellEditor
14 + :actions="editorOptions"
15 + :content="editorContent"
16 + :placeholder="editorPlaceholder"
17 + v-model="editorContent"
18 + :styleWithCss="false"
19 + editorHeight="400px"
20 + />
21 + </div>
22 +
23 + <h4>
24 + <a href="https://github.com/CinKon/vue-pell-editor" target="_blank"><i class="mdi mdi-link-variant"></i> reference</a>
25 + </h4>
26 + </div>
27 +</template>
28 +
29 +<script>
30 +import { defineComponent } from "@vue/runtime-core"
31 +import VuePellEditor from "@/components/VuePellEditor.vue"
32 +
33 +export default defineComponent({
34 + name: "PellPage",
35 + data() {
36 + return {
37 + editorContent: "",
38 + editorOptions: [
39 + "bold",
40 + "underline",
41 + {
42 + name: "italic",
43 + result: () => window.pell.exec("italic")
44 + },
45 + {
46 + name: "custom",
47 + icon: "<b><u><i>C</i></u></b>",
48 + title: "Custom Action",
49 + result: () => console.log("YOLO")
50 + },
51 + {
52 + name: "image",
53 + result: () => {
54 + const url = window.prompt("Enter the image URL")
55 + if (url) window.pell.exec("insertImage", ensureHTTP(url))
56 + }
57 + },
58 + {
59 + name: "link",
60 + result: () => {
61 + const url = window.prompt("Enter the link URL")
62 + if (url) window.pell.exec("createLink", ensureHTTP(url))
63 + }
64 + }
65 + ],
66 + editorPlaceholder: "Write something amazing...",
67 + editorContent: "<div>Predefined Content</div>"
68 + }
69 + },
70 + components: { VuePellEditor }
71 +})
72 +</script>
73 +
74 +<style lang="scss"></style>
src/views/ui/Editors/Quill.vue new
+126
@@ -0,0 +1,126 @@
1 +<template>
2 + <div class="page-quill scrollable">
3 + <div class="page-header">
4 + <h1>Quill</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Editors</el-breadcrumb-item>
9 + <el-breadcrumb-item>Quill</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <h2 class="mt-60">Theme Snow</h2>
14 + <div class="card-base card-shadow--medium" style="min-height: 300px">
15 + <vue-quill-editor
16 + v-model="content1"
17 + ref="myQuillEditor1"
18 + :options="editorOption1"
19 + @blur="onEditorBlur($event)"
20 + @focus="onEditorFocus($event)"
21 + @ready="onEditorReady($event)"
22 + >
23 + </vue-quill-editor>
24 + </div>
25 +
26 + <h2 class="mt-60">Theme Bubble</h2>
27 + <div class="card-base card-shadow--medium p-40 pb-200 t-bubble" id="t-bubble">
28 + <vue-quill-editor
29 + v-model="content2"
30 + ref="myQuillEditor2"
31 + :options="editorOption2"
32 + @blur="onEditorBlur($event)"
33 + @focus="onEditorFocus($event)"
34 + @ready="onEditorReady($event)"
35 + >
36 + </vue-quill-editor>
37 + </div>
38 + </div>
39 +</template>
40 +
41 +<script>
42 +import { defineComponent } from "@vue/runtime-core"
43 +import VueQuillEditor from "@/components/vue-quill-editor.vue"
44 +
45 +export default defineComponent({
46 + name: "QuillPage",
47 + data() {
48 + return {
49 + content1: "<h2>I am Example</h2>",
50 + editorOption1: {
51 + theme: "snow"
52 + },
53 + content2: "<h2>I am Example</h2>",
54 + editorOption2: {
55 + bounds: "#t-bubble",
56 + theme: "bubble",
57 + modules: {
58 + toolbar: [["bold", "italic", "underline", "strike"], [{ header: [1, 2, 3, 4, 5, 6, false] }]]
59 + }
60 + }
61 + }
62 + },
63 + methods: {
64 + onEditorBlur(quill) {
65 + console.log("editor blur!", quill)
66 + },
67 + onEditorFocus(quill) {
68 + console.log("editor focus!", quill)
69 + },
70 + onEditorReady(quill) {
71 + console.log("editor ready!", quill)
72 + },
73 + onEditorChange({ quill, html, text }) {
74 + console.log("editor change!", quill, html, text)
75 + this.content = html
76 + }
77 + },
78 + computed: {
79 + editor() {
80 + return this.$refs.myQuillEditor1.quill
81 + }
82 + },
83 + mounted() {
84 + console.log("this is current quill instance object", this.editor)
85 + },
86 + components: { VueQuillEditor }
87 +})
88 +</script>
89 +
90 +<style lang="scss">
91 +@import "../../../assets/scss/_variables";
92 +
93 +.page-quill {
94 + padding: 0 20px;
95 + padding-bottom: 20px;
96 +
97 + .card-base {
98 + box-sizing: border-box;
99 +
100 + .quill-editor {
101 + .ql-toolbar.ql-snow {
102 + border: none;
103 + background: lighten($background-color, 2%);
104 + border-bottom: 1px solid $background-color;
105 + }
106 + .ql-container.ql-snow {
107 + border: none;
108 + }
109 + }
110 +
111 + &.t-bubble {
112 + overflow: inherit;
113 + }
114 + }
115 +}
116 +
117 +@media (max-width: 768px) {
118 + .page-quill {
119 + .card-base {
120 + &.t-bubble {
121 + padding: 40px 20px;
122 + }
123 + }
124 + }
125 +}
126 +</style>
src/views/ui/Element/Element.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Element"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/ui/Element/ElementAlert.vue new
+95
@@ -0,0 +1,95 @@
1 +<template>
2 + <el-scrollbar class="page-element-alert">
3 + <div class="page-header">
4 + <h1>
5 + Element Alert
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/alert" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="With icon and description" name="1">
17 + <el-alert title="success alert" type="success" description="more text description" show-icon> </el-alert>
18 + &nbsp;
19 + <el-alert title="info alert" type="info" description="more text description" show-icon> </el-alert>
20 + &nbsp;
21 + <el-alert title="warning alert" type="warning" description="more text description" show-icon> </el-alert>
22 + &nbsp;
23 + <el-alert title="error alert" type="error" description="more text description" show-icon> </el-alert>
24 + </el-collapse-item>
25 + <el-collapse-item title="Code" name="2">
26 + <pre v-highlightjs="code1"><code class="html"></code></pre>
27 + </el-collapse-item>
28 + </el-collapse>
29 + </div>
30 + </el-scrollbar>
31 +</template>
32 +
33 +<script>
34 +import ThemePicker from "@/components/theme-picker.vue"
35 +
36 +import { defineComponent } from "@vue/runtime-core"
37 +
38 +export default defineComponent({
39 + name: "ElementAlert",
40 + data() {
41 + return {
42 + value1: true,
43 + value2: true,
44 + code1: `
45 +<el-alert
46 + title="success alert"
47 + type="success"
48 + description="more text description"
49 + show-icon>
50 +</el-alert>
51 +<el-alert
52 + title="info alert"
53 + type="info"
54 + description="more text description"
55 + show-icon>
56 +</el-alert>
57 +<el-alert
58 + title="warning alert"
59 + type="warning"
60 + description="more text description"
61 + show-icon>
62 +</el-alert>
63 +<el-alert
64 + title="error alert"
65 + type="error"
66 + description="more text description"
67 + show-icon>
68 +</el-alert>`
69 + }
70 + },
71 + components: {
72 + ThemePicker
73 + }
74 +})
75 +</script>
76 +
77 +<style lang="scss" scoped>
78 +.demo-box {
79 + padding: 20px;
80 + margin-bottom: 20px;
81 +}
82 +pre {
83 + margin: 0;
84 + background: white;
85 +}
86 +code {
87 + padding: 0;
88 +}
89 +
90 +@media (max-width: 768px) {
91 + code {
92 + font-size: 70%;
93 + }
94 +}
95 +</style>
src/views/ui/Element/ElementBadge.vue new
+115
@@ -0,0 +1,115 @@
1 +<template>
2 + <el-scrollbar class="page-element-badge">
3 + <div class="page-header">
4 + <h1>
5 + Element Badge
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/badge" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="block">
18 + <el-badge :value="12" :max="10" class="item">
19 + <el-button size="small">comments</el-button>
20 + </el-badge>
21 + <span style="margin-right: 30px"></span>
22 + <el-badge is-dot class="item">
23 + <el-button size="small">replies</el-button>
24 + </el-badge>
25 + <span style="margin-right: 30px"></span>
26 + <el-dropdown trigger="click">
27 + <span class="el-dropdown-link"> Click Me<i class="el-icon-caret-bottom el-icon--right"></i> </span>
28 + <el-dropdown-menu slot="dropdown">
29 + <el-dropdown-item class="clearfix">
30 + comments
31 + <el-badge class="mark" value="new" />
32 + </el-dropdown-item>
33 + <el-dropdown-item class="clearfix">
34 + replies
35 + <el-badge class="mark" :value="3" />
36 + </el-dropdown-item>
37 + </el-dropdown-menu>
38 + </el-dropdown>
39 + </div>
40 + </el-collapse-item>
41 + <el-collapse-item title="Code" name="2">
42 + <pre v-highlightjs="code1"><code class="html"></code></pre>
43 + </el-collapse-item>
44 + </el-collapse>
45 + </div>
46 + </el-scrollbar>
47 +</template>
48 +
49 +<script>
50 +import ThemePicker from "@/components/theme-picker.vue"
51 +
52 +import { defineComponent } from "@vue/runtime-core"
53 +
54 +export default defineComponent({
55 + name: "ElementBadge",
56 + data() {
57 + return {
58 + value1: true,
59 + value2: true,
60 + code1: `
61 +<el-badge :value="12" :max="10" class="item">
62 + <el-button size="small">comments</el-button>
63 +</el-badge>
64 +<span style="margin-right:30px;"></span>
65 +<el-badge is-dot class="item">
66 + <el-button size="small">replies</el-button>
67 +</el-badge>
68 +<span style="margin-right:30px;"></span>
69 +<el-dropdown trigger="click">
70 + <span class="el-dropdown-link">
71 + Click Me<i class="el-icon-caret-bottom el-icon--right"></i>
72 + </span>
73 + <el-dropdown-menu slot="dropdown">
74 + <el-dropdown-item class="clearfix">
75 + comments
76 + <el-badge class="mark" value="new" />
77 + </el-dropdown-item>
78 + <el-dropdown-item class="clearfix">
79 + replies
80 + <el-badge class="mark" :value="3" />
81 + </el-dropdown-item>
82 + </el-dropdown-menu>
83 +</el-dropdown>
84 +`
85 + }
86 + },
87 + components: {
88 + ThemePicker
89 + }
90 +})
91 +</script>
92 +
93 +<style lang="scss" scoped>
94 +.demo-box {
95 + padding: 20px;
96 + margin-bottom: 20px;
97 +}
98 +pre {
99 + margin: 0;
100 + background: white;
101 +}
102 +code {
103 + padding: 0;
104 +}
105 +
106 +@media (max-width: 768px) {
107 + code {
108 + font-size: 70%;
109 + }
110 +}
111 +
112 +.block {
113 + padding: 15px;
114 +}
115 +</style>
src/views/ui/Element/ElementBreadcrumb.vue new
+89
@@ -0,0 +1,89 @@
1 +<template>
2 + <el-scrollbar class="page-element-breadcrumb">
3 + <div class="page-header">
4 + <h1>
5 + Element Breadcrumb
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/breadcrumb" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-breadcrumb separator="/">
18 + <el-breadcrumb-item :to="{ path: '/' }">homepage</el-breadcrumb-item>
19 + <el-breadcrumb-item>promotion management</el-breadcrumb-item>
20 + <el-breadcrumb-item>promotion list</el-breadcrumb-item>
21 + <el-breadcrumb-item>promotion detail</el-breadcrumb-item>
22 + </el-breadcrumb>
23 + &nbsp;
24 + <el-breadcrumb separator-class="el-icon-arrow-right">
25 + <el-breadcrumb-item :to="{ path: '/' }">homepage</el-breadcrumb-item>
26 + <el-breadcrumb-item>promotion management</el-breadcrumb-item>
27 + <el-breadcrumb-item>promotion list</el-breadcrumb-item>
28 + <el-breadcrumb-item>promotion detail</el-breadcrumb-item>
29 + </el-breadcrumb>
30 + </el-collapse-item>
31 + <el-collapse-item title="Code" name="2">
32 + <pre v-highlightjs="code1"><code class="html"></code></pre>
33 + </el-collapse-item>
34 + </el-collapse>
35 + </div>
36 + </el-scrollbar>
37 +</template>
38 +
39 +<script>
40 +import ThemePicker from "@/components/theme-picker.vue"
41 +
42 +import { defineComponent } from "@vue/runtime-core"
43 +
44 +export default defineComponent({
45 + name: "ElementBreadcrumb",
46 + data() {
47 + return {
48 + value1: true,
49 + value2: true,
50 + code1: `
51 +<el-breadcrumb separator="/">
52 + <el-breadcrumb-item :to="{ path: '/' }">homepage</el-breadcrumb-item>
53 + <el-breadcrumb-item>promotion management</el-breadcrumb-item>
54 + <el-breadcrumb-item>promotion list</el-breadcrumb-item>
55 + <el-breadcrumb-item>promotion detail</el-breadcrumb-item>
56 +</el-breadcrumb>
57 +<el-breadcrumb separator-class="el-icon-arrow-right">
58 + <el-breadcrumb-item :to="{ path: '/' }">homepage</el-breadcrumb-item>
59 + <el-breadcrumb-item>promotion management</el-breadcrumb-item>
60 + <el-breadcrumb-item>promotion list</el-breadcrumb-item>
61 + <el-breadcrumb-item>promotion detail</el-breadcrumb-item>
62 +</el-breadcrumb>`
63 + }
64 + },
65 + components: {
66 + ThemePicker
67 + }
68 +})
69 +</script>
70 +
71 +<style lang="scss" scoped>
72 +.demo-box {
73 + padding: 20px;
74 + margin-bottom: 20px;
75 +}
76 +pre {
77 + margin: 0;
78 + background: white;
79 +}
80 +code {
81 + padding: 0;
82 +}
83 +
84 +@media (max-width: 768px) {
85 + code {
86 + font-size: 70%;
87 + }
88 +}
89 +</style>
src/views/ui/Element/ElementButton.vue new
+233
@@ -0,0 +1,233 @@
1 +<template>
2 + <el-scrollbar class="page-element-button">
3 + <div class="page-header">
4 + <h1>
5 + Element Button
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/button" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div>
18 + <el-button>Default</el-button>
19 + <el-button type="primary">Primary</el-button>
20 + <el-button type="success">Success</el-button>
21 + <el-button type="info">Info</el-button>
22 + <el-button type="warning">Warning</el-button>
23 + <el-button type="danger">Danger</el-button>
24 + </div>
25 +
26 + <div style="margin: 20px 0">
27 + <el-button plain>Plain</el-button>
28 + <el-button type="primary" plain>Primary</el-button>
29 + <el-button type="success" plain>Success</el-button>
30 + <el-button type="info" plain>Info</el-button>
31 + <el-button type="warning" plain>Warning</el-button>
32 + <el-button type="danger" plain>Danger</el-button>
33 + </div>
34 +
35 + <div>
36 + <el-button round>Round</el-button>
37 + <el-button type="primary" round>Primary</el-button>
38 + <el-button type="success" round>Success</el-button>
39 + <el-button type="info" round>Info</el-button>
40 + <el-button type="warning" round>Warning</el-button>
41 + <el-button type="danger" round>Danger</el-button>
42 + </div>
43 +
44 + <div class="mt-20">
45 + <el-button icon="el-icon-search" circle></el-button>
46 + <el-button type="primary" icon="el-icon-edit" circle></el-button>
47 + <el-button type="success" icon="el-icon-check" circle></el-button>
48 + <el-button type="info" icon="el-icon-message" circle></el-button>
49 + <el-button type="warning" icon="el-icon-star-off" circle></el-button>
50 + <el-button type="danger" icon="el-icon-delete" circle></el-button>
51 + </div>
52 + </el-collapse-item>
53 + <el-collapse-item title="Code" name="2">
54 + <pre v-highlightjs="code1"><code class="html"></code></pre>
55 + </el-collapse-item>
56 + </el-collapse>
57 + </div>
58 + <div class="card-base card-shadow--medium demo-box bg-white">
59 + <el-collapse value="1">
60 + <el-collapse-item title="Text Button" name="1">
61 + <el-button :link="true">Text Button</el-button>
62 + <el-button :link="true" disabled>Text Button</el-button>
63 + </el-collapse-item>
64 + <el-collapse-item title="Code" name="2">
65 + <pre v-highlightjs="code2"><code class="html"></code></pre>
66 + </el-collapse-item>
67 + </el-collapse>
68 + </div>
69 + <div class="card-base card-shadow--medium demo-box bg-white">
70 + <el-collapse value="1">
71 + <el-collapse-item title="Icon Button" name="1">
72 + <el-button type="primary" icon="el-icon-edit"></el-button>
73 + <el-button type="primary" icon="el-icon-share"></el-button>
74 + <el-button type="primary" icon="el-icon-delete"></el-button>
75 + <el-button type="primary" icon="el-icon-search">Search</el-button>
76 + <el-button type="primary">Upload<i class="el-icon-upload el-icon-right"></i></el-button>
77 + </el-collapse-item>
78 + <el-collapse-item title="Code" name="2">
79 + <pre v-highlightjs="code3"><code class="html"></code></pre>
80 + </el-collapse-item>
81 + </el-collapse>
82 + </div>
83 + <!--<div class="card-base card-shadow--medium demo-box bg-white">
84 + <el-collapse value="1">
85 + <el-collapse-item title="Button Group" name="1">
86 + <el-button-group>
87 + <el-button type="primary" icon="el-icon-arrow-left">Previous Page</el-button>
88 + <el-button type="primary">Next Page<i class="el-icon-arrow-right el-icon-right"></i></el-button>
89 + </el-button-group>
90 + &nbsp;
91 + <el-button-group>
92 + <el-button type="primary" icon="el-icon-edit"></el-button>
93 + <el-button type="primary" icon="el-icon-share"></el-button>
94 + <el-button type="primary" icon="el-icon-delete"></el-button>
95 + </el-button-group>
96 + </el-collapse-item>
97 + <el-collapse-item title="Code" name="2">
98 + <pre v-highlightjs="code4"><code class="html"></code></pre>
99 + </el-collapse-item>
100 + </el-collapse>
101 + </div>-->
102 + <div class="card-base card-shadow--medium demo-box bg-white">
103 + <el-collapse value="1">
104 + <el-collapse-item title="Sizes" name="1">
105 + <div>
106 + <el-button>Default</el-button>
107 + <el-button size="large">Large</el-button>
108 + <el-button size="small">Small</el-button>
109 + </div>
110 + <div style="margin-top: 20px">
111 + <el-button round>Default</el-button>
112 + <el-button size="large" round>Large</el-button>
113 + <el-button size="small" round>Small</el-button>
114 + </div>
115 + </el-collapse-item>
116 + <el-collapse-item title="Code" name="2">
117 + <pre v-highlightjs="code5"><code class="html"></code></pre>
118 + </el-collapse-item>
119 + </el-collapse>
120 + </div>
121 + </el-scrollbar>
122 +</template>
123 +
124 +<script>
125 +import ThemePicker from "@/components/theme-picker.vue"
126 +import { defineComponent } from "@vue/runtime-core"
127 +
128 +export default defineComponent({
129 + name: "ElementButton",
130 + data() {
131 + return {
132 + code1: `
133 +<div>
134 + <el-button>Default</el-button>
135 + <el-button type="primary">Primary</el-button>
136 + <el-button type="success">Success</el-button>
137 + <el-button type="info">Info</el-button>
138 + <el-button type="warning">Warning</el-button>
139 + <el-button type="danger">Danger</el-button>
140 +</div>
141 +
142 +<div style="margin: 20px 0">
143 + <el-button plain>Plain</el-button>
144 + <el-button type="primary" plain>Primary</el-button>
145 + <el-button type="success" plain>Success</el-button>
146 + <el-button type="info" plain>Info</el-button>
147 + <el-button type="warning" plain>Warning</el-button>
148 + <el-button type="danger" plain>Danger</el-button>
149 +</div>
150 +
151 +<div>
152 + <el-button round>Round</el-button>
153 + <el-button type="primary" round>Primary</el-button>
154 + <el-button type="success" round>Success</el-button>
155 + <el-button type="info" round>Info</el-button>
156 + <el-button type="warning" round>Warning</el-button>
157 + <el-button type="danger" round>Danger</el-button>
158 +</div>
159 +
160 +<div class="mt-20">
161 + <el-button icon="el-icon-search" circle></el-button>
162 + <el-button type="primary" icon="el-icon-edit" circle></el-button>
163 + <el-button type="success" icon="el-icon-check" circle></el-button>
164 + <el-button type="info" icon="el-icon-message" circle></el-button>
165 + <el-button type="warning" icon="el-icon-star-off" circle></el-button>
166 + <el-button type="danger" icon="el-icon-delete" circle></el-button>
167 +</div>
168 +`,
169 + code2: `
170 +<el-button :link="true">Text Button</el-button>
171 +<el-button :link="true" disabled>Text Button</el-button>
172 +`,
173 + code3: `
174 +<el-button type="primary" icon="el-icon-edit"></el-button>
175 +<el-button type="primary" icon="el-icon-share"></el-button>
176 +<el-button type="primary" icon="el-icon-delete"></el-button>
177 +<el-button type="primary" icon="el-icon-search">Search</el-button>
178 +<el-button type="primary">Upload<i class="el-icon-upload el-icon-right"></i></el-button>
179 +`,
180 + code4: `
181 +<el-button-group>
182 + <el-button type="primary" icon="el-icon-arrow-left">Previous Page</el-button>
183 + <el-button type="primary">Next Page<i class="el-icon-arrow-right el-icon-right"></i></el-button>
184 +</el-button-group>
185 +<el-button-group>
186 + <el-button type="primary" icon="el-icon-edit"></el-button>
187 + <el-button type="primary" icon="el-icon-share"></el-button>
188 + <el-button type="primary" icon="el-icon-delete"></el-button>
189 +</el-button-group>
190 +`,
191 + code5: `
192 +<div>
193 + <el-button>Default</el-button>
194 + <el-button size="large">Large</el-button>
195 + <el-button size="small">Small</el-button>
196 +</div>
197 +<div style="margin-top: 20px">
198 + <el-button round>Default</el-button>
199 + <el-button size="large" round>Large</el-button>
200 + <el-button size="small" round>Small</el-button>
201 +</div>
202 +`
203 + }
204 + },
205 + components: {
206 + ThemePicker
207 + }
208 +})
209 +</script>
210 +
211 +<style lang="scss" scoped>
212 +.page-element-button .demo-box {
213 + padding: 20px;
214 + margin-bottom: 20px;
215 +
216 + .el-button {
217 + margin: 10px;
218 + }
219 +}
220 +pre {
221 + margin: 0;
222 + background: white;
223 +}
224 +code {
225 + padding: 0;
226 +}
227 +
228 +@media (max-width: 768px) {
229 + code {
230 + font-size: 70%;
231 + }
232 +}
233 +</style>
src/views/ui/Element/ElementCard.vue new
+202
@@ -0,0 +1,202 @@
1 +<template>
2 + <el-scrollbar class="page-element-card">
3 + <div class="page-header">
4 + <h1>
5 + Element Card
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/card" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="block">
18 + <el-card class="box-card">
19 + <div slot="header" class="clearfix">
20 + <span>Card name</span>
21 + <el-button style="float: right; padding: 3px 0" :link="true">Operation button</el-button>
22 + </div>
23 + <div v-for="o in 4" :key="o" class="text item">
24 + {{ "List item " + o }}
25 + </div>
26 + </el-card>
27 + </div>
28 + </el-collapse-item>
29 + <el-collapse-item title="Code" name="2">
30 + <pre v-highlightjs="code1"><code class="html"></code></pre>
31 + </el-collapse-item>
32 + </el-collapse>
33 + </div>
34 + <div class="card-base card-shadow--medium demo-box bg-white">
35 + <el-collapse value="1">
36 + <el-collapse-item title="With images" name="1">
37 + <div class="block">
38 + <el-row>
39 + <el-col :span="8" :xs="11" v-for="(o, index) in 2" :key="o" style="margin: 5px">
40 + <el-card :body-style="{ padding: '0px' }">
41 + <img :src="'/static/images/gallery/photo-' + index + '.jpg'" class="image" alt="card image" />
42 + <div style="padding: 14px">
43 + <span>Yummy hamburger</span>
44 + <div class="bottom clearfix">
45 + <time class="time">{{ currentDate }}</time>
46 + <el-button :link="true" class="button">Button</el-button>
47 + </div>
48 + </div>
49 + </el-card>
50 + </el-col>
51 + </el-row>
52 + </div>
53 + </el-collapse-item>
54 + <el-collapse-item title="Code" name="2">
55 + <pre v-highlightjs="code2"><code class="html"></code></pre>
56 + </el-collapse-item>
57 + </el-collapse>
58 + </div>
59 + </el-scrollbar>
60 +</template>
61 +
62 +<script>
63 +import ThemePicker from "@/components/theme-picker.vue"
64 +import dayjs from "dayjs"
65 +
66 +import { defineComponent } from "@vue/runtime-core"
67 +
68 +export default defineComponent({
69 + name: "ElementCard",
70 + data() {
71 + return {
72 + currentDate: dayjs().format("DD/MM/YYYY"),
73 + code1: `
74 +<el-card class="box-card">
75 + <div slot="header" class="clearfix">
76 + <span>Card name</span>
77 + <el-button style="float: right; padding: 3px 0" :link="true">Operation button</el-button>
78 + </div>
79 + <div v-for="o in 4" :key="o" class="text item">
80 + {{'List item ' + o }}
81 + </div>
82 +</el-card>`,
83 + code2: `
84 +<el-row>
85 + <el-col :span="8" v-for="(o, index) in 2" :key="o" :offset="index > 0 ? 2 : 0">
86 + <el-card :body-style="{ padding: '0px' }">
87 + <img src="~examples/assets/images/hamburger.png" class="image" alt="card image">
88 + <div style="padding: 14px;">
89 + <span>Yummy hamburger</span>
90 + <div class="bottom clearfix">
91 + <time class="time">{{ currentDate }}</time>
92 + <el-button :link="true" class="button">Operating button</el-button>
93 + </div>
94 + </div>
95 + </el-card>
96 + </el-col>
97 +</el-row>
98 +
99 +<style>
100 + .time {
101 + font-size: 13px;
102 + color: #999;
103 + }
104 +
105 + .bottom {
106 + margin-top: 13px;
107 + line-height: 12px;
108 + }
109 +
110 + .button {
111 + padding: 0;
112 + float: right;
113 + }
114 +
115 + .image {
116 + width: 100%;
117 + display: block;
118 + }
119 +
120 + .clearfix:before,
121 + .clearfix:after {
122 + display: table;
123 + content: "";
124 + }
125 +
126 + .clearfix:after {
127 + clear: both
128 + }
129 +</style>
130 +
131 +<script>
132 +import { defineComponent } from "@vue/runtime-core"
133 +
134 +export default defineComponent({
135 + data() {
136 + return {
137 + currentDate: new Date()
138 + };
139 + }
140 +}
141 +<\/script>
142 +`
143 + }
144 + },
145 + components: {
146 + ThemePicker
147 + }
148 +})
149 +</script>
150 +
151 +<style lang="scss" scoped>
152 +.demo-box {
153 + padding: 20px;
154 + margin-bottom: 20px;
155 +}
156 +pre {
157 + margin: 0;
158 + background: white;
159 +}
160 +code {
161 + padding: 0;
162 +}
163 +
164 +@media (max-width: 768px) {
165 + code {
166 + font-size: 70%;
167 + }
168 +}
169 +
170 +.block {
171 + padding: 15px;
172 +}
173 +.time {
174 + font-size: 13px;
175 + color: #999;
176 +}
177 +
178 +.bottom {
179 + margin-top: 13px;
180 + line-height: 12px;
181 +}
182 +
183 +.button {
184 + padding: 0;
185 + float: right;
186 +}
187 +
188 +.image {
189 + width: 100%;
190 + display: block;
191 +}
192 +
193 +.clearfix:before,
194 +.clearfix:after {
195 + display: table;
196 + content: "";
197 +}
198 +
199 +.clearfix:after {
200 + clear: both;
201 +}
202 +</style>
src/views/ui/Element/ElementCarousel.vue new
+225
@@ -0,0 +1,225 @@
1 +<template>
2 + <el-scrollbar class="page-element-carousel">
3 + <div class="page-header">
4 + <h1>
5 + Element Carousel
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/carousel" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="block box grow" style="max-width: 400px; display: inline-block">
18 + <span class="demonstration">Switch when indicator is hovered (default)</span>
19 + <el-carousel height="150px">
20 + <el-carousel-item v-for="item in 4" :key="item">
21 + <h3>{{ item }}</h3>
22 + </el-carousel-item>
23 + </el-carousel>
24 + </div>
25 + <div class="block box grow" style="max-width: 400px; display: inline-block">
26 + <span class="demonstration">Switch when indicator is clicked</span>
27 + <el-carousel trigger="click" height="150px">
28 + <el-carousel-item v-for="item in 4" :key="item">
29 + <h3>{{ item }}</h3>
30 + </el-carousel-item>
31 + </el-carousel>
32 + </div>
33 + </el-collapse-item>
34 + <el-collapse-item title="Code" name="2">
35 + <pre v-highlightjs="code1"><code class="html"></code></pre>
36 + </el-collapse-item>
37 + </el-collapse>
38 + </div>
39 + <div class="card-base card-shadow--medium demo-box bg-white">
40 + <el-collapse value="1">
41 + <el-collapse-item title="Indicators" name="1">
42 + <div class="block box grow">
43 + <el-carousel indicator-position="outside">
44 + <el-carousel-item v-for="item in 4" :key="item">
45 + <h3>{{ item }}</h3>
46 + </el-carousel-item>
47 + </el-carousel>
48 + </div>
49 + </el-collapse-item>
50 + <el-collapse-item title="Code" name="2">
51 + <pre v-highlightjs="code2"><code class="html"></code></pre>
52 + </el-collapse-item>
53 + </el-collapse>
54 + </div>
55 + <div class="card-base card-shadow--medium demo-box bg-white">
56 + <el-collapse value="1">
57 + <el-collapse-item title="Card mode" name="1">
58 + <div class="block box grow">
59 + <el-carousel :interval="4000" type="card" height="200px">
60 + <el-carousel-item v-for="item in 6" :key="item">
61 + <h3>{{ item }}</h3>
62 + </el-carousel-item>
63 + </el-carousel>
64 + </div>
65 + </el-collapse-item>
66 + <el-collapse-item title="Code" name="2">
67 + <pre v-highlightjs="code3"><code class="html"></code></pre>
68 + </el-collapse-item>
69 + </el-collapse>
70 + </div>
71 + </el-scrollbar>
72 +</template>
73 +
74 +<script>
75 +import ThemePicker from "@/components/theme-picker.vue"
76 +
77 +import { defineComponent } from "@vue/runtime-core"
78 +
79 +export default defineComponent({
80 + name: "ElementCarousel",
81 + data() {
82 + return {
83 + value1: true,
84 + value2: true,
85 + code1: `
86 +<template>
87 + <div class="block">
88 + <span class="demonstration">Switch when indicator is hovered (default)</span>
89 + <el-carousel height="150px">
90 + <el-carousel-item v-for="item in 4" :key="item">
91 + <h3>{{ item }}</h3>
92 + </el-carousel-item>
93 + </el-carousel>
94 + </div>
95 + <div class="block">
96 + <span class="demonstration">Switch when indicator is clicked</span>
97 + <el-carousel trigger="click" height="150px">
98 + <el-carousel-item v-for="item in 4" :key="item">
99 + <h3>{{ item }}</h3>
100 + </el-carousel-item>
101 + </el-carousel>
102 + </div>
103 +</template>
104 +
105 +<style>
106 + .el-carousel__item h3 {
107 + color: #475669;
108 + font-size: 14px;
109 + opacity: 0.75;
110 + line-height: 150px;
111 + margin: 0;
112 + }
113 +
114 + .el-carousel__item:nth-child(2n) {
115 + background-color: #99a9bf;
116 + }
117 +
118 + .el-carousel__item:nth-child(2n+1) {
119 + background-color: #d3dce6;
120 + }
121 +</style>`,
122 + code2: `
123 +<template>
124 + <el-carousel indicator-position="outside">
125 + <el-carousel-item v-for="item in 4" :key="item">
126 + <h3>{{ item }}</h3>
127 + </el-carousel-item>
128 + </el-carousel>
129 +</template>
130 +
131 +<style>
132 + .el-carousel__item h3 {
133 + color: #475669;
134 + font-size: 18px;
135 + opacity: 0.75;
136 + line-height: 300px;
137 + margin: 0;
138 + }
139 +
140 + .el-carousel__item:nth-child(2n) {
141 + background-color: #99a9bf;
142 + }
143 +
144 + .el-carousel__item:nth-child(2n+1) {
145 + background-color: #d3dce6;
146 + }
147 +</style>
148 +`,
149 + code3: `
150 +<template>
151 + <el-carousel :interval="4000" type="card" height="200px">
152 + <el-carousel-item v-for="item in 6" :key="item">
153 + <h3>{{ item }}</h3>
154 + </el-carousel-item>
155 + </el-carousel>
156 +</template>
157 +
158 +<style>
159 + .el-carousel__item h3 {
160 + color: #475669;
161 + font-size: 14px;
162 + opacity: 0.75;
163 + line-height: 200px;
164 + margin: 0;
165 + }
166 +
167 + .el-carousel__item:nth-child(2n) {
168 + background-color: #99a9bf;
169 + }
170 +
171 + .el-carousel__item:nth-child(2n+1) {
172 + background-color: #d3dce6;
173 + }
174 +</style>
175 +`
176 + }
177 + },
178 + components: {
179 + ThemePicker
180 + }
181 +})
182 +</script>
183 +
184 +<style lang="scss" scoped>
185 +.demo-box {
186 + padding: 20px;
187 + margin-bottom: 20px;
188 +}
189 +pre {
190 + margin: 0;
191 + background: white;
192 +}
193 +code {
194 + padding: 0;
195 +}
196 +
197 +@media (max-width: 768px) {
198 + code {
199 + font-size: 70%;
200 + }
201 +}
202 +
203 +.block {
204 + //min-width: 305px;
205 + width: 100%;
206 + max-width: 500px;
207 + padding: 5px;
208 +}
209 +.el-carousel__item h3 {
210 + color: #475669;
211 + font-size: 14px;
212 + opacity: 0.75;
213 + line-height: 150px;
214 + text-align: center;
215 + margin: 0;
216 +}
217 +
218 +.el-carousel__item:nth-child(2n) {
219 + background-color: #99a9bf;
220 +}
221 +
222 +.el-carousel__item:nth-child(2n + 1) {
223 + background-color: #d3dce6;
224 +}
225 +</style>
src/views/ui/Element/ElementCascader.vue new
+545
@@ -0,0 +1,545 @@
1 +<template>
2 + <el-scrollbar class="page-element-cascader">
3 + <div class="page-header">
4 + <h1>
5 + Element Cascader
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/cascader" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Filterable" name="1">
17 + <el-cascader placeholder="Try searching: Guide" :options="options" filterable change-on-select></el-cascader>
18 + </el-collapse-item>
19 + <el-collapse-item title="Code" name="2">
20 + <pre v-highlightjs="code1"><code class="html"></code></pre>
21 + </el-collapse-item>
22 + </el-collapse>
23 + </div>
24 + </el-scrollbar>
25 +</template>
26 +
27 +<script>
28 +import ThemePicker from "@/components/theme-picker.vue"
29 +
30 +import { defineComponent } from "@vue/runtime-core"
31 +
32 +export default defineComponent({
33 + name: "ElementCascader",
34 + data() {
35 + return {
36 + options: [
37 + {
38 + value: "guide",
39 + label: "Guide",
40 + children: [
41 + {
42 + value: "disciplines",
43 + label: "Disciplines",
44 + children: [
45 + {
46 + value: "consistency",
47 + label: "Consistency"
48 + },
49 + {
50 + value: "feedback",
51 + label: "Feedback"
52 + },
53 + {
54 + value: "efficiency",
55 + label: "Efficiency"
56 + },
57 + {
58 + value: "controllability",
59 + label: "Controllability"
60 + }
61 + ]
62 + },
63 + {
64 + value: "navigation",
65 + label: "Navigation",
66 + children: [
67 + {
68 + value: "side nav",
69 + label: "Side Navigation"
70 + },
71 + {
72 + value: "top nav",
73 + label: "Top Navigation"
74 + }
75 + ]
76 + }
77 + ]
78 + },
79 + {
80 + value: "component",
81 + label: "Component",
82 + children: [
83 + {
84 + value: "basic",
85 + label: "Basic",
86 + children: [
87 + {
88 + value: "layout",
89 + label: "Layout"
90 + },
91 + {
92 + value: "color",
93 + label: "Color"
94 + },
95 + {
96 + value: "typography",
97 + label: "Typography"
98 + },
99 + {
100 + value: "icon",
101 + label: "Icon"
102 + },
103 + {
104 + value: "button",
105 + label: "Button"
106 + }
107 + ]
108 + },
109 + {
110 + value: "form",
111 + label: "Form",
112 + children: [
113 + {
114 + value: "radio",
115 + label: "Radio"
116 + },
117 + {
118 + value: "checkbox",
119 + label: "Checkbox"
120 + },
121 + {
122 + value: "input",
123 + label: "Input"
124 + },
125 + {
126 + value: "input-number",
127 + label: "InputNumber"
128 + },
129 + {
130 + value: "select",
131 + label: "Select"
132 + },
133 + {
134 + value: "cascader",
135 + label: "Cascader"
136 + },
137 + {
138 + value: "switch",
139 + label: "Switch"
140 + },
141 + {
142 + value: "slider",
143 + label: "Slider"
144 + },
145 + {
146 + value: "time-picker",
147 + label: "TimePicker"
148 + },
149 + {
150 + value: "date-picker",
151 + label: "DatePicker"
152 + },
153 + {
154 + value: "datetime-picker",
155 + label: "DateTimePicker"
156 + },
157 + {
158 + value: "upload",
159 + label: "Upload"
160 + },
161 + {
162 + value: "rate",
163 + label: "Rate"
164 + },
165 + {
166 + value: "form",
167 + label: "Form"
168 + }
169 + ]
170 + },
171 + {
172 + value: "data",
173 + label: "Data",
174 + children: [
175 + {
176 + value: "table",
177 + label: "Table"
178 + },
179 + {
180 + value: "tag",
181 + label: "Tag"
182 + },
183 + {
184 + value: "progress",
185 + label: "Progress"
186 + },
187 + {
188 + value: "tree",
189 + label: "Tree"
190 + },
191 + {
192 + value: "pagination",
193 + label: "Pagination"
194 + },
195 + {
196 + value: "badge",
197 + label: "Badge"
198 + }
199 + ]
200 + },
201 + {
202 + value: "notice",
203 + label: "Notice",
204 + children: [
205 + {
206 + value: "alert",
207 + label: "Alert"
208 + },
209 + {
210 + value: "loading",
211 + label: "Loading"
212 + },
213 + {
214 + value: "message",
215 + label: "Message"
216 + },
217 + {
218 + value: "message-box",
219 + label: "MessageBox"
220 + },
221 + {
222 + value: "notification",
223 + label: "Notification"
224 + }
225 + ]
226 + },
227 + {
228 + value: "navigation",
229 + label: "Navigation",
230 + children: [
231 + {
232 + value: "menu",
233 + label: "NavMenu"
234 + },
235 + {
236 + value: "tabs",
237 + label: "Tabs"
238 + },
239 + {
240 + value: "breadcrumb",
241 + label: "Breadcrumb"
242 + },
243 + {
244 + value: "dropdown",
245 + label: "Dropdown"
246 + },
247 + {
248 + value: "steps",
249 + label: "Steps"
250 + }
251 + ]
252 + },
253 + {
254 + value: "others",
255 + label: "Others",
256 + children: [
257 + {
258 + value: "dialog",
259 + label: "Dialog"
260 + },
261 + {
262 + value: "tooltip",
263 + label: "Tooltip"
264 + },
265 + {
266 + value: "popover",
267 + label: "Popover"
268 + },
269 + {
270 + value: "card",
271 + label: "Card"
272 + },
273 + {
274 + value: "carousel",
275 + label: "Carousel"
276 + },
277 + {
278 + value: "collapse",
279 + label: "Collapse"
280 + }
281 + ]
282 + }
283 + ]
284 + },
285 + {
286 + value: "resource",
287 + label: "Resource",
288 + children: [
289 + {
290 + value: "axure",
291 + label: "Axure Components"
292 + },
293 + {
294 + value: "sketch",
295 + label: "Sketch Templates"
296 + },
297 + {
298 + value: "docs",
299 + label: "Design Documentation"
300 + }
301 + ]
302 + }
303 + ],
304 + code1: `
305 +<template>
306 + <el-cascader
307 + placeholder="Try searching: Guide"
308 + :options="options"
309 + filterable
310 + change-on-select
311 + ></el-cascader>
312 +</template>
313 +
314 +<script>
315 + import { defineComponent } from "@vue/runtime-core"
316 +
317 +export default defineComponent({
318 + data() {
319 + return {
320 + options: [{
321 + value: 'guide',
322 + label: 'Guide',
323 + children: [{
324 + value: 'disciplines',
325 + label: 'Disciplines',
326 + children: [{
327 + value: 'consistency',
328 + label: 'Consistency'
329 + }, {
330 + value: 'feedback',
331 + label: 'Feedback'
332 + }, {
333 + value: 'efficiency',
334 + label: 'Efficiency'
335 + }, {
336 + value: 'controllability',
337 + label: 'Controllability'
338 + }]
339 + }, {
340 + value: 'navigation',
341 + label: 'Navigation',
342 + children: [{
343 + value: 'side nav',
344 + label: 'Side Navigation'
345 + }, {
346 + value: 'top nav',
347 + label: 'Top Navigation'
348 + }]
349 + }]
350 + }, {
351 + value: 'component',
352 + label: 'Component',
353 + children: [{
354 + value: 'basic',
355 + label: 'Basic',
356 + children: [{
357 + value: 'layout',
358 + label: 'Layout'
359 + }, {
360 + value: 'color',
361 + label: 'Color'
362 + }, {
363 + value: 'typography',
364 + label: 'Typography'
365 + }, {
366 + value: 'icon',
367 + label: 'Icon'
368 + }, {
369 + value: 'button',
370 + label: 'Button'
371 + }]
372 + }, {
373 + value: 'form',
374 + label: 'Form',
375 + children: [{
376 + value: 'radio',
377 + label: 'Radio'
378 + }, {
379 + value: 'checkbox',
380 + label: 'Checkbox'
381 + }, {
382 + value: 'input',
383 + label: 'Input'
384 + }, {
385 + value: 'input-number',
386 + label: 'InputNumber'
387 + }, {
388 + value: 'select',
389 + label: 'Select'
390 + }, {
391 + value: 'cascader',
392 + label: 'Cascader'
393 + }, {
394 + value: 'switch',
395 + label: 'Switch'
396 + }, {
397 + value: 'slider',
398 + label: 'Slider'
399 + }, {
400 + value: 'time-picker',
401 + label: 'TimePicker'
402 + }, {
403 + value: 'date-picker',
404 + label: 'DatePicker'
405 + }, {
406 + value: 'datetime-picker',
407 + label: 'DateTimePicker'
408 + }, {
409 + value: 'upload',
410 + label: 'Upload'
411 + }, {
412 + value: 'rate',
413 + label: 'Rate'
414 + }, {
415 + value: 'form',
416 + label: 'Form'
417 + }]
418 + }, {
419 + value: 'data',
420 + label: 'Data',
421 + children: [{
422 + value: 'table',
423 + label: 'Table'
424 + }, {
425 + value: 'tag',
426 + label: 'Tag'
427 + }, {
428 + value: 'progress',
429 + label: 'Progress'
430 + }, {
431 + value: 'tree',
432 + label: 'Tree'
433 + }, {
434 + value: 'pagination',
435 + label: 'Pagination'
436 + }, {
437 + value: 'badge',
438 + label: 'Badge'
439 + }]
440 + }, {
441 + value: 'notice',
442 + label: 'Notice',
443 + children: [{
444 + value: 'alert',
445 + label: 'Alert'
446 + }, {
447 + value: 'loading',
448 + label: 'Loading'
449 + }, {
450 + value: 'message',
451 + label: 'Message'
452 + }, {
453 + value: 'message-box',
454 + label: 'MessageBox'
455 + }, {
456 + value: 'notification',
457 + label: 'Notification'
458 + }]
459 + }, {
460 + value: 'navigation',
461 + label: 'Navigation',
462 + children: [{
463 + value: 'menu',
464 + label: 'NavMenu'
465 + }, {
466 + value: 'tabs',
467 + label: 'Tabs'
468 + }, {
469 + value: 'breadcrumb',
470 + label: 'Breadcrumb'
471 + }, {
472 + value: 'dropdown',
473 + label: 'Dropdown'
474 + }, {
475 + value: 'steps',
476 + label: 'Steps'
477 + }]
478 + }, {
479 + value: 'others',
480 + label: 'Others',
481 + children: [{
482 + value: 'dialog',
483 + label: 'Dialog'
484 + }, {
485 + value: 'tooltip',
486 + label: 'Tooltip'
487 + }, {
488 + value: 'popover',
489 + label: 'Popover'
490 + }, {
491 + value: 'card',
492 + label: 'Card'
493 + }, {
494 + value: 'carousel',
495 + label: 'Carousel'
496 + }, {
497 + value: 'collapse',
498 + label: 'Collapse'
499 + }]
500 + }]
501 + }, {
502 + value: 'resource',
503 + label: 'Resource',
504 + children: [{
505 + value: 'axure',
506 + label: 'Axure Components'
507 + }, {
508 + value: 'sketch',
509 + label: 'Sketch Templates'
510 + }, {
511 + value: 'docs',
512 + label: 'Design Documentation'
513 + }]
514 + }]
515 + };
516 + }
517 + };
518 +<\/script>`
519 + }
520 + },
521 + components: {
522 + ThemePicker
523 + }
524 +})
525 +</script>
526 +
527 +<style lang="scss" scoped>
528 +.demo-box {
529 + padding: 20px;
530 + margin-bottom: 20px;
531 +}
532 +pre {
533 + margin: 0;
534 + background: white;
535 +}
536 +code {
537 + padding: 0;
538 +}
539 +
540 +@media (max-width: 768px) {
541 + code {
542 + font-size: 70%;
543 + }
544 +}
545 +</style>
src/views/ui/Element/ElementCheckbox.vue new
+131
@@ -0,0 +1,131 @@
1 +<template>
2 + <el-scrollbar class="page-element-checkbox">
3 + <div class="page-header">
4 + <h1>
5 + Element Checkbox
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/checkbox" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-checkbox v-model="checked">Option</el-checkbox>
18 + </el-collapse-item>
19 + <el-collapse-item title="Code" name="2">
20 + <pre v-highlightjs="code1"><code class="html"></code></pre>
21 + </el-collapse-item>
22 + </el-collapse>
23 + </div>
24 + <div class="card-base card-shadow--medium demo-box bg-white">
25 + <el-collapse value="1">
26 + <el-collapse-item title="Indeterminate" name="1">
27 + <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">Check all</el-checkbox>
28 + <div style="margin: 15px 0"></div>
29 + <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
30 + <el-checkbox v-for="city in cities" :label="city" :key="city">{{ city }}</el-checkbox>
31 + </el-checkbox-group>
32 + </el-collapse-item>
33 + <el-collapse-item title="Code" name="2">
34 + <pre v-highlightjs="code2"><code class="html"></code></pre>
35 + </el-collapse-item>
36 + </el-collapse>
37 + </div>
38 + </el-scrollbar>
39 +</template>
40 +
41 +<script>
42 +import ThemePicker from "@/components/theme-picker.vue"
43 +const cityOptions = ["Shanghai", "Beijing", "Guangzhou", "Shenzhen"]
44 +import { defineComponent } from "@vue/runtime-core"
45 +
46 +export default defineComponent({
47 + name: "ElementCheckbox",
48 + data() {
49 + return {
50 + checked: true,
51 + checkAll: false,
52 + checkedCities: ["Shanghai", "Beijing"],
53 + cities: cityOptions,
54 + isIndeterminate: true,
55 + code1: `
56 +<!-- 'checked' should be true or false -->
57 +<el-checkbox v-model="checked">Option</el-checkbox>
58 +`,
59 + code2: `
60 +<template>
61 + <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">Check all</el-checkbox>
62 + <div style="margin: 15px 0;"></div>
63 + <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
64 + <el-checkbox v-for="city in cities" :label="city" :key="city">{{city}}</el-checkbox>
65 + </el-checkbox-group>
66 +</template>
67 +<script>
68 + const cityOptions = ['Shanghai', 'Beijing', 'Guangzhou', 'Shenzhen'];
69 + import { defineComponent } from "@vue/runtime-core"
70 +
71 +export default defineComponent({
72 + data() {
73 + return {
74 + checkAll: false,
75 + checkedCities: ['Shanghai', 'Beijing'],
76 + cities: cityOptions,
77 + isIndeterminate: true
78 + };
79 + },
80 + methods: {
81 + handleCheckAllChange(val) {
82 + this.checkedCities = val ? cityOptions : [];
83 + this.isIndeterminate = false;
84 + },
85 + handleCheckedCitiesChange(value) {
86 + let checkedCount = value.length;
87 + this.checkAll = checkedCount === this.cities.length;
88 + this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length;
89 + }
90 + }
91 + };
92 +<\/script>
93 +`
94 + }
95 + },
96 + methods: {
97 + handleCheckAllChange(val) {
98 + this.checkedCities = val ? cityOptions : []
99 + this.isIndeterminate = false
100 + },
101 + handleCheckedCitiesChange(value) {
102 + let checkedCount = value.length
103 + this.checkAll = checkedCount === this.cities.length
104 + this.isIndeterminate = checkedCount > 0 && checkedCount < this.cities.length
105 + }
106 + },
107 + components: {
108 + ThemePicker
109 + }
110 +})
111 +</script>
112 +
113 +<style lang="scss" scoped>
114 +.demo-box {
115 + padding: 20px;
116 + margin-bottom: 20px;
117 +}
118 +pre {
119 + margin: 0;
120 + background: white;
121 +}
122 +code {
123 + padding: 0;
124 +}
125 +
126 +@media (max-width: 768px) {
127 + code {
128 + font-size: 70%;
129 + }
130 +}
131 +</style>
src/views/ui/Element/ElementCollapse.vue new
+147
@@ -0,0 +1,147 @@
1 +<template>
2 + <el-scrollbar class="page-element-collapse">
3 + <div class="page-header">
4 + <h1>
5 + Element Collapse
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/collapse" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="block">
18 + <el-collapse v-model="activeNames" @change="handleChange">
19 + <el-collapse-item title="Consistency" name="1">
20 + <div>
21 + Consistent with real life: in line with the process and logic of real life, and comply with languages
22 + and habits that the users are used to;
23 + </div>
24 + <div>
25 + Consistent within interface: all elements should be consistent, such as: design style, icons and texts,
26 + position of elements, etc.
27 + </div>
28 + </el-collapse-item>
29 + <el-collapse-item title="Feedback" name="2">
30 + <div>
31 + Operation feedback: enable the users to clearly perceive their operations by style updates and
32 + interactive effects;
33 + </div>
34 + <div>Visual feedback: reflect current state by updating or rearranging elements of the page.</div>
35 + </el-collapse-item>
36 + <el-collapse-item title="Efficiency" name="3">
37 + <div>Simplify the process: keep operating process simple and intuitive;</div>
38 + <div>
39 + Definite and clear: enunciate your intentions clearly so that the users can quickly understand and make
40 + decisions;
41 + </div>
42 + <div>
43 + Easy to identify: the interface should be straightforward, which helps the users to identify and frees
44 + them from memorizing and recalling.
45 + </div>
46 + </el-collapse-item>
47 + <el-collapse-item title="Controllability" name="4">
48 + <div>
49 + Decision making: giving advices about operations is acceptable, but do not make decisions for the users;
50 + </div>
51 + <div>
52 + Controlled consequences: users should be granted the freedom to operate, including canceling, aborting
53 + or terminating current operation.
54 + </div>
55 + </el-collapse-item>
56 + </el-collapse>
57 + </div>
58 + </el-collapse-item>
59 + <el-collapse-item title="Code" name="2">
60 + <pre v-highlightjs="code1"><code class="html"></code></pre>
61 + </el-collapse-item>
62 + </el-collapse>
63 + </div>
64 + </el-scrollbar>
65 +</template>
66 +
67 +<script>
68 +import ThemePicker from "@/components/theme-picker.vue"
69 +
70 +import { defineComponent } from "@vue/runtime-core"
71 +
72 +export default defineComponent({
73 + name: "ElementCollapse",
74 + methods: {
75 + handleChange(val) {
76 + console.log(val)
77 + }
78 + },
79 + data() {
80 + return {
81 + activeNames: ["1"],
82 + code1: `
83 +<el-collapse v-model="activeNames" @change="handleChange">
84 + <el-collapse-item title="Consistency" name="1">
85 + <div>Consistent with real life: in line with the process and logic of real life, and comply with languages and habits that the users are used to;</div>
86 + <div>Consistent within interface: all elements should be consistent, such as: design style, icons and texts, position of elements, etc.</div>
87 + </el-collapse-item>
88 + <el-collapse-item title="Feedback" name="2">
89 + <div>Operation feedback: enable the users to clearly perceive their operations by style updates and interactive effects;</div>
90 + <div>Visual feedback: reflect current state by updating or rearranging elements of the page.</div>
91 + </el-collapse-item>
92 + <el-collapse-item title="Efficiency" name="3">
93 + <div>Simplify the process: keep operating process simple and intuitive;</div>
94 + <div>Definite and clear: enunciate your intentions clearly so that the users can quickly understand and make decisions;</div>
95 + <div>Easy to identify: the interface should be straightforward, which helps the users to identify and frees them from memorizing and recalling.</div>
96 + </el-collapse-item>
97 + <el-collapse-item title="Controllability" name="4">
98 + <div>Decision making: giving advices about operations is acceptable, but do not make decisions for the users;</div>
99 + <div>Controlled consequences: users should be granted the freedom to operate, including canceling, aborting or terminating current operation.</div>
100 + </el-collapse-item>
101 +</el-collapse>
102 +<script>
103 + import { defineComponent } from "@vue/runtime-core"
104 +
105 +export default defineComponent({
106 + data() {
107 + return {
108 + activeNames: ['1']
109 + };
110 + },
111 + methods: {
112 + handleChange(val) {
113 + console.log(val);
114 + }
115 + }
116 + }
117 +<\/script>`
118 + }
119 + },
120 + components: {
121 + ThemePicker
122 + }
123 +})
124 +</script>
125 +
126 +<style lang="scss" scoped>
127 +.demo-box {
128 + padding: 20px;
129 + margin-bottom: 20px;
130 +}
131 +pre {
132 + margin: 0;
133 + background: white;
134 +}
135 +code {
136 + padding: 0;
137 +}
138 +.block {
139 + padding: 20px;
140 +}
141 +
142 +@media (max-width: 768px) {
143 + code {
144 + font-size: 70%;
145 + }
146 +}
147 +</style>
src/views/ui/Element/ElementColorPicker.vue new
+77
@@ -0,0 +1,77 @@
1 +<template>
2 + <el-scrollbar class="page-element-color-picker">
3 + <div class="page-header">
4 + <h1>
5 + Element Color Picker
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/color-picker" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Alpha" name="1">
17 + <el-color-picker v-model="color3" show-alpha></el-color-picker>
18 + </el-collapse-item>
19 + <el-collapse-item title="Code" name="2">
20 + <pre v-highlightjs="code1"><code class="html"></code></pre>
21 + </el-collapse-item>
22 + </el-collapse>
23 + </div>
24 + </el-scrollbar>
25 +</template>
26 +
27 +<script>
28 +import ThemePicker from "@/components/theme-picker.vue"
29 +
30 +import { defineComponent } from "@vue/runtime-core"
31 +
32 +export default defineComponent({
33 + name: "ElementColorPicker",
34 + data() {
35 + return {
36 + color3: "rgba(19, 206, 102, 0.8)",
37 + code1: `
38 +<el-color-picker v-model="color3" show-alpha></el-color-picker>
39 +
40 +<script>
41 + import { defineComponent } from "@vue/runtime-core"
42 +
43 +export default defineComponent({
44 + data() {
45 + return {
46 + color3: 'rgba(19, 206, 102, 0.8)'
47 + }
48 + }
49 + };
50 +<\/script>`
51 + }
52 + },
53 + components: {
54 + ThemePicker
55 + }
56 +})
57 +</script>
58 +
59 +<style lang="scss" scoped>
60 +.demo-box {
61 + padding: 20px;
62 + margin-bottom: 20px;
63 +}
64 +pre {
65 + margin: 0;
66 + background: white;
67 +}
68 +code {
69 + padding: 0;
70 +}
71 +
72 +@media (max-width: 768px) {
73 + code {
74 + font-size: 70%;
75 + }
76 +}
77 +</style>
src/views/ui/Element/ElementDatePicker.vue new
+181
@@ -0,0 +1,181 @@
1 +<template>
2 + <el-scrollbar class="page-element-date-picker">
3 + <div class="page-header">
4 + <h1>
5 + Element Date Picker
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/date-picker" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Enter Date" name="1">
17 + <div class="block">
18 + <el-date-picker v-model="value1" type="date" placeholder="Pick a day"> </el-date-picker>
19 + </div>
20 + </el-collapse-item>
21 + <el-collapse-item title="Code" name="2">
22 + <pre v-highlightjs="code1"><code class="html"></code></pre>
23 + </el-collapse-item>
24 + </el-collapse>
25 + </div>
26 + <div class="card-base card-shadow--medium demo-box bg-white hidden-xs-only">
27 + <el-collapse value="1">
28 + <el-collapse-item title="Date Range" name="1">
29 + <div class="block">
30 + <el-date-picker
31 + v-model="value7"
32 + type="daterange"
33 + align="right"
34 + unlink-panels
35 + range-separator="To"
36 + start-placeholder="Start date"
37 + end-placeholder="End date"
38 + :picker-options="pickerOptions2"
39 + >
40 + </el-date-picker>
41 + </div>
42 + </el-collapse-item>
43 + <el-collapse-item title="Code" name="2">
44 + <pre v-highlightjs="code2"><code class="html"></code></pre>
45 + </el-collapse-item>
46 + </el-collapse>
47 + </div>
48 + </el-scrollbar>
49 +</template>
50 +
51 +<script>
52 +import ThemePicker from "@/components/theme-picker.vue"
53 +
54 +import { defineComponent } from "@vue/runtime-core"
55 +
56 +export default defineComponent({
57 + name: "ElementDatePicker",
58 + data() {
59 + return {
60 + value1: "",
61 + pickerOptions2: {
62 + shortcuts: [
63 + {
64 + text: "Last week",
65 + onClick(picker) {
66 + const end = new Date()
67 + const start = new Date()
68 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
69 + picker.$emit("pick", [start, end])
70 + }
71 + },
72 + {
73 + text: "Last month",
74 + onClick(picker) {
75 + const end = new Date()
76 + const start = new Date()
77 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
78 + picker.$emit("pick", [start, end])
79 + }
80 + },
81 + {
82 + text: "Last 3 months",
83 + onClick(picker) {
84 + const end = new Date()
85 + const start = new Date()
86 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
87 + picker.$emit("pick", [start, end])
88 + }
89 + }
90 + ]
91 + },
92 + value6: "",
93 + value7: "",
94 + code1: `
95 +<el-date-picker
96 + v-model="value1"
97 + type="date"
98 + placeholder="Pick a day">
99 +</el-date-picker>`,
100 + code2: `
101 +<template>
102 + <div class="block">
103 + <el-date-picker
104 + v-model="value7"
105 + type="daterange"
106 + align="right"
107 + unlink-panels
108 + range-separator="To"
109 + start-placeholder="Start date"
110 + end-placeholder="End date"
111 + :picker-options="pickerOptions2">
112 + </el-date-picker>
113 + </div>
114 +</template>
115 +
116 +<script>
117 + import { defineComponent } from "@vue/runtime-core"
118 +
119 +export default defineComponent({
120 + data() {
121 + return {
122 + pickerOptions2: {
123 + shortcuts: [{
124 + text: 'Last week',
125 + onClick(picker) {
126 + const end = new Date();
127 + const start = new Date();
128 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
129 + picker.$emit('pick', [start, end]);
130 + }
131 + }, {
132 + text: 'Last month',
133 + onClick(picker) {
134 + const end = new Date();
135 + const start = new Date();
136 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
137 + picker.$emit('pick', [start, end]);
138 + }
139 + }, {
140 + text: 'Last 3 months',
141 + onClick(picker) {
142 + const end = new Date();
143 + const start = new Date();
144 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
145 + picker.$emit('pick', [start, end]);
146 + }
147 + }]
148 + },
149 + value7: ''
150 + };
151 + }
152 + };
153 +<\/script>
154 +`
155 + }
156 + },
157 + components: {
158 + ThemePicker
159 + }
160 +})
161 +</script>
162 +
163 +<style lang="scss" scoped>
164 +.demo-box {
165 + padding: 20px;
166 + margin-bottom: 20px;
167 +}
168 +pre {
169 + margin: 0;
170 + background: white;
171 +}
172 +code {
173 + padding: 0;
174 +}
175 +
176 +@media (max-width: 768px) {
177 + code {
178 + font-size: 70%;
179 + }
180 +}
181 +</style>
src/views/ui/Element/ElementDateTimePicker.vue new
+182
@@ -0,0 +1,182 @@
1 +<template>
2 + <el-scrollbar class="page-element-datetime-picker">
3 + <div class="page-header">
4 + <h1>
5 + Element Date Time Picker
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/datetime-picker" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Date and time" name="1">
17 + <div class="block">
18 + <el-date-picker v-model="value1" type="datetime" placeholder="Select date and time"> </el-date-picker>
19 + </div>
20 + </el-collapse-item>
21 + <el-collapse-item title="Code" name="2">
22 + <pre v-highlightjs="code1"><code class="html"></code></pre>
23 + </el-collapse-item>
24 + </el-collapse>
25 + </div>
26 + <div class="card-base card-shadow--medium demo-box bg-white hidden-xs-only">
27 + <el-collapse value="1">
28 + <el-collapse-item title="Date and time range" name="1">
29 + <div class="block">
30 + <el-date-picker
31 + v-model="value4"
32 + type="datetimerange"
33 + :picker-options="pickerOptions2"
34 + range-separator="To"
35 + start-placeholder="Start date"
36 + end-placeholder="End date"
37 + align="right"
38 + >
39 + </el-date-picker>
40 + </div>
41 + </el-collapse-item>
42 + <el-collapse-item title="Code" name="2">
43 + <pre v-highlightjs="code2"><code class="html"></code></pre>
44 + </el-collapse-item>
45 + </el-collapse>
46 + </div>
47 + </el-scrollbar>
48 +</template>
49 +
50 +<script>
51 +import ThemePicker from "@/components/theme-picker.vue"
52 +
53 +import { defineComponent } from "@vue/runtime-core"
54 +
55 +export default defineComponent({
56 + name: "ElementDateTimePicker",
57 + data() {
58 + return {
59 + value1: "",
60 + pickerOptions2: {
61 + shortcuts: [
62 + {
63 + text: "Last week",
64 + onClick(picker) {
65 + const end = new Date()
66 + const start = new Date()
67 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
68 + picker.$emit("pick", [start, end])
69 + }
70 + },
71 + {
72 + text: "Last month",
73 + onClick(picker) {
74 + const end = new Date()
75 + const start = new Date()
76 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
77 + picker.$emit("pick", [start, end])
78 + }
79 + },
80 + {
81 + text: "Last 3 months",
82 + onClick(picker) {
83 + const end = new Date()
84 + const start = new Date()
85 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
86 + picker.$emit("pick", [start, end])
87 + }
88 + }
89 + ]
90 + },
91 + value3: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
92 + value4: "",
93 + code1: `
94 +<div class="block">
95 + <span class="demonstration">Default</span>
96 + <el-date-picker
97 + v-model="value1"
98 + type="datetime"
99 + placeholder="Select date and time">
100 + </el-date-picker>
101 +</div>`,
102 + code2: `
103 +<template>
104 + <div class="block">
105 + <el-date-picker
106 + v-model="value4"
107 + type="datetimerange"
108 + :picker-options="pickerOptions2"
109 + range-separator="To"
110 + start-placeholder="Start date"
111 + end-placeholder="End date"
112 + align="right">
113 + </el-date-picker>
114 + </div>
115 +</template>
116 +
117 +<script>
118 + import { defineComponent } from "@vue/runtime-core"
119 +
120 +export default defineComponent({
121 + data() {
122 + return {
123 + pickerOptions2: {
124 + shortcuts: [{
125 + text: 'Last week',
126 + onClick(picker) {
127 + const end = new Date();
128 + const start = new Date();
129 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
130 + picker.$emit('pick', [start, end]);
131 + }
132 + }, {
133 + text: 'Last month',
134 + onClick(picker) {
135 + const end = new Date();
136 + const start = new Date();
137 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
138 + picker.$emit('pick', [start, end]);
139 + }
140 + }, {
141 + text: 'Last 3 months',
142 + onClick(picker) {
143 + const end = new Date();
144 + const start = new Date();
145 + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
146 + picker.$emit('pick', [start, end]);
147 + }
148 + }]
149 + },
150 + value4: ''
151 + };
152 + }
153 + };
154 +<\/script>
155 +`
156 + }
157 + },
158 + components: {
159 + ThemePicker
160 + }
161 +})
162 +</script>
163 +
164 +<style lang="scss" scoped>
165 +.demo-box {
166 + padding: 20px;
167 + margin-bottom: 20px;
168 +}
169 +pre {
170 + margin: 0;
171 + background: white;
172 +}
173 +code {
174 + padding: 0;
175 +}
176 +
177 +@media (max-width: 768px) {
178 + code {
179 + font-size: 70%;
180 + }
181 +}
182 +</style>
src/views/ui/Element/ElementDialog.vue new
+253
@@ -0,0 +1,253 @@
1 +<template>
2 + <el-scrollbar class="page-element-dialog">
3 + <div class="page-header">
4 + <h1>
5 + Element Dialog
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/dialog" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Customizations" name="1">
17 + <!-- Table -->
18 + <el-button :link="true" @click="dialogTableVisible = true">open a Table nested Dialog</el-button>
19 +
20 + <el-dialog title="Shipping address" v-model="dialogTableVisible">
21 + <el-table :data="gridData">
22 + <el-table-column property="date" label="Date" width="150"></el-table-column>
23 + <el-table-column property="name" label="Name" width="200"></el-table-column>
24 + <el-table-column property="address" label="Address"></el-table-column>
25 + </el-table>
26 + </el-dialog>
27 +
28 + <span style="margin-right: 20px"></span>
29 +
30 + <!-- Form -->
31 + <el-button :link="true" @click="dialogFormVisible = true">open a Form nested Dialog</el-button>
32 +
33 + <el-dialog title="Shipping address" v-model="dialogFormVisible">
34 + <el-form :model="form">
35 + <el-form-item label="Promotion name" :label-width="formLabelWidth">
36 + <el-input v-model="form.name" auto-complete="off"></el-input>
37 + </el-form-item>
38 + <el-form-item label="Zones" :label-width="formLabelWidth">
39 + <el-select v-model="form.region" placeholder="Please select a zone">
40 + <el-option label="Zone No.1" value="shanghai"></el-option>
41 + <el-option label="Zone No.2" value="beijing"></el-option>
42 + </el-select>
43 + </el-form-item>
44 + </el-form>
45 + <span slot="footer" class="dialog-footer">
46 + <el-button @click="dialogFormVisible = false">Cancel</el-button>
47 + <el-button type="primary" @click="dialogFormVisible = false">Confirm</el-button>
48 + </span>
49 + </el-dialog>
50 + </el-collapse-item>
51 + <el-collapse-item title="Code" name="2">
52 + <pre v-highlightjs="code1"><code class="html"></code></pre>
53 + </el-collapse-item>
54 + </el-collapse>
55 + </div>
56 + <div class="card-base card-shadow--medium demo-box bg-white">
57 + <el-collapse value="1">
58 + <el-collapse-item title="Nested Dialog" name="1">
59 + <el-button :link="true" @click="outerVisible = true">open the outer Dialog</el-button>
60 +
61 + <el-dialog title="Outer Dialog" v-model="outerVisible">
62 + <el-dialog width="30%" title="Inner Dialog" v-model="innerVisible" append-to-body> </el-dialog>
63 + <div slot="footer" class="dialog-footer">
64 + <el-button class="m-5" @click="outerVisible = false">Cancel</el-button>
65 + <el-button class="m-5" type="primary" @click="innerVisible = true">open the inner Dialog</el-button>
66 + </div>
67 + </el-dialog>
68 + </el-collapse-item>
69 + <el-collapse-item title="Code" name="2">
70 + <pre v-highlightjs="code2"><code class="html"></code></pre>
71 + </el-collapse-item>
72 + </el-collapse>
73 + </div>
74 + </el-scrollbar>
75 +</template>
76 +
77 +<script>
78 +import ThemePicker from "@/components/theme-picker.vue"
79 +
80 +import { defineComponent } from "@vue/runtime-core"
81 +
82 +export default defineComponent({
83 + name: "ElementDialog",
84 + data() {
85 + return {
86 + gridData: [
87 + {
88 + date: "2016-05-02",
89 + name: "John Smith",
90 + address: "No.1518, Jinshajiang Road, Putuo District"
91 + },
92 + {
93 + date: "2016-05-04",
94 + name: "John Smith",
95 + address: "No.1518, Jinshajiang Road, Putuo District"
96 + },
97 + {
98 + date: "2016-05-01",
99 + name: "John Smith",
100 + address: "No.1518, Jinshajiang Road, Putuo District"
101 + },
102 + {
103 + date: "2016-05-03",
104 + name: "John Smith",
105 + address: "No.1518, Jinshajiang Road, Putuo District"
106 + }
107 + ],
108 + dialogTableVisible: false,
109 + dialogFormVisible: false,
110 + form: {
111 + name: "",
112 + region: "",
113 + date1: "",
114 + date2: "",
115 + delivery: false,
116 + type: [],
117 + resource: "",
118 + desc: ""
119 + },
120 + formLabelWidth: "120px",
121 + outerVisible: false,
122 + innerVisible: false,
123 + code1: `
124 +<!-- Table -->
125 +<el-button :link="true" @click="dialogTableVisible = true">open a Table nested Dialog</el-button>
126 +
127 +<el-dialog title="Shipping address" v-model="dialogTableVisible">
128 + <el-table :data="gridData">
129 + <el-table-column property="date" label="Date" width="150"></el-table-column>
130 + <el-table-column property="name" label="Name" width="200"></el-table-column>
131 + <el-table-column property="address" label="Address"></el-table-column>
132 + </el-table>
133 +</el-dialog>
134 +
135 +<!-- Form -->
136 +<el-button :link="true" @click="dialogFormVisible = true">open a Form nested Dialog</el-button>
137 +
138 +<el-dialog title="Shipping address" v-model="dialogFormVisible">
139 + <el-form :model="form">
140 + <el-form-item label="Promotion name" :label-width="formLabelWidth">
141 + <el-input v-model="form.name" auto-complete="off"></el-input>
142 + </el-form-item>
143 + <el-form-item label="Zones" :label-width="formLabelWidth">
144 + <el-select v-model="form.region" placeholder="Please select a zone">
145 + <el-option label="Zone No.1" value="shanghai"></el-option>
146 + <el-option label="Zone No.2" value="beijing"></el-option>
147 + </el-select>
148 + </el-form-item>
149 + </el-form>
150 + <span slot="footer" class="dialog-footer">
151 + <el-button @click="dialogFormVisible = false">Cancel</el-button>
152 + <el-button type="primary" @click="dialogFormVisible = false">Confirm</el-button>
153 + </span>
154 +</el-dialog>
155 +
156 +<script>
157 + import { defineComponent } from "@vue/runtime-core"
158 +
159 +export default defineComponent({
160 + data() {
161 + return {
162 + gridData: [{
163 + date: '2016-05-02',
164 + name: 'John Smith',
165 + address: 'No.1518, Jinshajiang Road, Putuo District'
166 + }, {
167 + date: '2016-05-04',
168 + name: 'John Smith',
169 + address: 'No.1518, Jinshajiang Road, Putuo District'
170 + }, {
171 + date: '2016-05-01',
172 + name: 'John Smith',
173 + address: 'No.1518, Jinshajiang Road, Putuo District'
174 + }, {
175 + date: '2016-05-03',
176 + name: 'John Smith',
177 + address: 'No.1518, Jinshajiang Road, Putuo District'
178 + }],
179 + dialogTableVisible: false,
180 + dialogFormVisible: false,
181 + form: {
182 + name: '',
183 + region: '',
184 + date1: '',
185 + date2: '',
186 + delivery: false,
187 + type: [],
188 + resource: '',
189 + desc: ''
190 + },
191 + formLabelWidth: '120px'
192 + };
193 + }
194 + };
195 +<\/script>`,
196 + code2: `
197 +<template>
198 + <el-button :link="true" @click="outerVisible = true">open the outer Dialog</el-button>
199 +
200 + <el-dialog title="Outer Dialog" v-model="outerVisible">
201 + <el-dialog
202 + width="30%"
203 + title="Inner Dialog"
204 + v-model="innerVisible"
205 + append-to-body>
206 + </el-dialog>
207 + <div slot="footer" class="dialog-footer">
208 + <el-button @click="outerVisible = false">Cancel</el-button>
209 + <el-button type="primary" @click="innerVisible = true">open the inner Dialog</el-button>
210 + </div>
211 + </el-dialog>
212 +</template>
213 +
214 +<script>
215 + import { defineComponent } from "@vue/runtime-core"
216 +
217 +export default defineComponent({
218 + data() {
219 + return {
220 + outerVisible: false,
221 + innerVisible: false
222 + };
223 + }
224 + }
225 +<\/script>
226 +`
227 + }
228 + },
229 + components: {
230 + ThemePicker
231 + }
232 +})
233 +</script>
234 +
235 +<style lang="scss" scoped>
236 +.demo-box {
237 + padding: 20px;
238 + margin-bottom: 20px;
239 +}
240 +pre {
241 + margin: 0;
242 + background: white;
243 +}
244 +code {
245 + padding: 0;
246 +}
247 +
248 +@media (max-width: 768px) {
249 + code {
250 + font-size: 70%;
251 + }
252 +}
253 +</style>
src/views/ui/Element/ElementDropdown.vue new
+148
@@ -0,0 +1,148 @@
1 +<template>
2 + <el-scrollbar class="page-element-dropdown">
3 + <div class="page-header">
4 + <h1>
5 + Element Dropdown
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/dropdown" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-dropdown>
18 + <span class="el-dropdown-link">
19 + Dropdown List
20 + <el-icon class="el-icon--right">
21 + <arrow-down />
22 + </el-icon>
23 + </span>
24 + <template #dropdown>
25 + <el-dropdown-menu>
26 + <el-dropdown-item>Action 1</el-dropdown-item>
27 + <el-dropdown-item>Action 2</el-dropdown-item>
28 + <el-dropdown-item>Action 3</el-dropdown-item>
29 + <el-dropdown-item disabled>Action 4</el-dropdown-item>
30 + <el-dropdown-item divided>Action 5</el-dropdown-item>
31 + </el-dropdown-menu>
32 + </template>
33 + </el-dropdown>
34 + </el-collapse-item>
35 + <el-collapse-item title="Code" name="2">
36 + <pre v-highlightjs="code1"><code class="html"></code></pre>
37 + </el-collapse-item>
38 + </el-collapse>
39 + </div>
40 + </el-scrollbar>
41 +</template>
42 +
43 +<script>
44 +import ThemePicker from "@/components/theme-picker.vue"
45 +import { ArrowDown } from "@element-plus/icons-vue"
46 +import { defineComponent } from "@vue/runtime-core"
47 +
48 +export default defineComponent({
49 + name: "ElementDropdown",
50 + methods: {
51 + handleClick() {
52 + alert("button click")
53 + },
54 + handleCommand(command) {
55 + this.$message("click on item " + command)
56 + }
57 + },
58 + data() {
59 + return {
60 + value1: true,
61 + value2: true,
62 + code1: `
63 +<el-dropdown>
64 + <span class="el-dropdown-link">
65 + Dropdown List
66 + <el-icon class="el-icon--right">
67 + <arrow-down />
68 + </el-icon>
69 + </span>
70 + <template #dropdown>
71 + <el-dropdown-menu>
72 + <el-dropdown-item>Action 1</el-dropdown-item>
73 + <el-dropdown-item>Action 2</el-dropdown-item>
74 + <el-dropdown-item>Action 3</el-dropdown-item>
75 + <el-dropdown-item disabled>Action 4</el-dropdown-item>
76 + <el-dropdown-item divided>Action 5</el-dropdown-item>
77 + </el-dropdown-menu>
78 + </template>
79 + </el-dropdown>
80 +
81 +<script>
82 + import { defineComponent } from "@vue/runtime-core"
83 + import { ArrowDown } from '@element-plus/icons-vue'
84 +export default defineComponent({
85 + methods: {
86 + handleClick() {
87 + alert('button click');
88 + }
89 + },
90 + components: {
91 + ArrowDown
92 + }
93 + }
94 +<\/script>`,
95 + code2: `
96 +<el-dropdown @command="handleCommand" trigger="click">
97 + <span class="el-dropdown-link">
98 + Dropdown List<i class="el-icon-arrow-down el-icon--right"></i>
99 + </span>
100 + <el-dropdown-menu slot="dropdown">
101 + <el-dropdown-item command="a">Action 1</el-dropdown-item>
102 + <el-dropdown-item command="b">Action 2</el-dropdown-item>
103 + <el-dropdown-item command="c">Action 3</el-dropdown-item>
104 + <el-dropdown-item command="d" disabled>Action 4</el-dropdown-item>
105 + <el-dropdown-item command="e" divided>Action 5</el-dropdown-item>
106 + </el-dropdown-menu>
107 +</el-dropdown>
108 +
109 +<script>
110 + import { defineComponent } from "@vue/runtime-core"
111 +
112 +export default defineComponent({
113 + methods: {
114 + handleCommand(command) {
115 + this.$message('click on item ' + command);
116 + }
117 + }
118 + }
119 +<\/script>
120 +`
121 + }
122 + },
123 + components: {
124 + ThemePicker,
125 + ArrowDown
126 + }
127 +})
128 +</script>
129 +
130 +<style lang="scss" scoped>
131 +.demo-box {
132 + padding: 20px;
133 + margin-bottom: 20px;
134 +}
135 +pre {
136 + margin: 0;
137 + background: white;
138 +}
139 +code {
140 + padding: 0;
141 +}
142 +
143 +@media (max-width: 768px) {
144 + code {
145 + font-size: 70%;
146 + }
147 +}
148 +</style>
src/views/ui/Element/ElementForm.vue new
+504
@@ -0,0 +1,504 @@
1 +<template>
2 + <el-scrollbar class="page-element-form">
3 + <div class="page-header">
4 + <h1>
5 + Element Form
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/form" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white hidden-xs-only">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic form" name="1">
17 + <el-form ref="form" :model="form" label-width="120px">
18 + <el-form-item label="Activity name">
19 + <el-input v-model="form.name"></el-input>
20 + </el-form-item>
21 + <el-form-item label="Activity zone">
22 + <el-select v-model="form.region" placeholder="please select your zone">
23 + <el-option label="Zone one" value="shanghai"></el-option>
24 + <el-option label="Zone two" value="beijing"></el-option>
25 + </el-select>
26 + </el-form-item>
27 + <el-form-item label="Activity time">
28 + <el-col :span="11">
29 + <el-date-picker
30 + type="date"
31 + placeholder="Pick a date"
32 + v-model="form.date1"
33 + style="width: 100%"
34 + ></el-date-picker>
35 + </el-col>
36 + <el-col class="line" :span="2">&nbsp;</el-col>
37 + <el-col :span="11">
38 + <el-time-picker
39 + type="fixed-time"
40 + placeholder="Pick a time"
41 + v-model="form.date2"
42 + style="width: 100%"
43 + ></el-time-picker>
44 + </el-col>
45 + </el-form-item>
46 + <el-form-item label="Instant delivery">
47 + <el-switch v-model="form.delivery"></el-switch>
48 + </el-form-item>
49 + <el-form-item label="Activity type">
50 + <el-checkbox-group v-model="form.type">
51 + <el-checkbox label="Online activities" name="type"></el-checkbox>
52 + <el-checkbox label="Promotion activities" name="type"></el-checkbox>
53 + <el-checkbox label="Offline activities" name="type"></el-checkbox>
54 + <el-checkbox label="Simple brand exposure" name="type"></el-checkbox>
55 + </el-checkbox-group>
56 + </el-form-item>
57 + <el-form-item label="Resources">
58 + <el-radio-group v-model="form.resource">
59 + <el-radio label="Sponsor"></el-radio>
60 + <el-radio label="Venue"></el-radio>
61 + </el-radio-group>
62 + </el-form-item>
63 + <el-form-item label="Activity form">
64 + <el-input type="textarea" v-model="form.desc"></el-input>
65 + </el-form-item>
66 + <el-form-item>
67 + <el-button type="primary" @click="onSubmit">Create</el-button>
68 + <el-button>Cancel</el-button>
69 + </el-form-item>
70 + </el-form>
71 + </el-collapse-item>
72 + <el-collapse-item title="Code" name="2">
73 + <pre v-highlightjs="code1"><code class="html"></code></pre>
74 + </el-collapse-item>
75 + </el-collapse>
76 + </div>
77 + <div class="card-base card-shadow--medium demo-box bg-white">
78 + <el-collapse value="1">
79 + <el-collapse-item title="Inline form" name="1">
80 + <el-form :inline="true" :model="formInline" class="demo-form-inline">
81 + <el-form-item label="Approved by">
82 + <el-input v-model="formInline.user" placeholder="Approved by"></el-input>
83 + </el-form-item>
84 + <el-form-item label="Activity zone">
85 + <el-select v-model="formInline.region" placeholder="Activity zone">
86 + <el-option label="Zone one" value="shanghai"></el-option>
87 + <el-option label="Zone two" value="beijing"></el-option>
88 + </el-select>
89 + </el-form-item>
90 + <el-form-item>
91 + <el-button type="primary" @click="onSubmit">Query</el-button>
92 + </el-form-item>
93 + </el-form>
94 + </el-collapse-item>
95 + <el-collapse-item title="Code" name="2">
96 + <pre v-highlightjs="code2"><code class="html"></code></pre>
97 + </el-collapse-item>
98 + </el-collapse>
99 + </div>
100 + <div class="card-base card-shadow--medium demo-box bg-white">
101 + <el-collapse value="1">
102 + <el-collapse-item title="Alignment" name="1">
103 + <el-radio-group v-model="labelPosition" size="small">
104 + <el-radio-button label="left">Left</el-radio-button>
105 + <el-radio-button label="right">Right</el-radio-button>
106 + <el-radio-button label="top">Top</el-radio-button>
107 + </el-radio-group>
108 + <div style="margin: 20px"></div>
109 + <el-form :label-position="labelPosition" label-width="100px" :model="formLabelAlign">
110 + <el-form-item label="Name">
111 + <el-input v-model="formLabelAlign.name"></el-input>
112 + </el-form-item>
113 + <el-form-item label="Activity zone">
114 + <el-input v-model="formLabelAlign.region"></el-input>
115 + </el-form-item>
116 + <el-form-item label="Activity form">
117 + <el-input v-model="formLabelAlign.type"></el-input>
118 + </el-form-item>
119 + </el-form>
120 + </el-collapse-item>
121 + <el-collapse-item title="Code" name="2">
122 + <pre v-highlightjs="code3"><code class="html"></code></pre>
123 + </el-collapse-item>
124 + </el-collapse>
125 + </div>
126 + <div class="card-base card-shadow--medium demo-box bg-white">
127 + <el-collapse value="1">
128 + <el-collapse-item title="Custom validation rules" name="1">
129 + <el-form :model="ruleForm2" status-icon :rules="rules2" ref="ruleForm2" label-width="120px" class="demo-ruleForm">
130 + <el-form-item label="Password" prop="pass">
131 + <el-input type="password" v-model="ruleForm2.pass" auto-complete="off"></el-input>
132 + </el-form-item>
133 + <el-form-item label="Confirm" prop="checkPass">
134 + <el-input type="password" v-model="ruleForm2.checkPass" auto-complete="off"></el-input>
135 + </el-form-item>
136 + <el-form-item label="Age" prop="age">
137 + <el-input v-model.number="ruleForm2.age"></el-input>
138 + </el-form-item>
139 + <el-form-item>
140 + <el-button type="primary" @click="submitForm('ruleForm2')">Submit</el-button>
141 + <el-button @click="resetForm('ruleForm2')">Reset</el-button>
142 + </el-form-item>
143 + </el-form>
144 + </el-collapse-item>
145 + <el-collapse-item title="Code" name="2">
146 + <pre v-highlightjs="code4"><code class="html"></code></pre>
147 + </el-collapse-item>
148 + </el-collapse>
149 + </div>
150 + </el-scrollbar>
151 +</template>
152 +
153 +<script>
154 +import ThemePicker from "@/components/theme-picker.vue"
155 +
156 +import { defineComponent } from "@vue/runtime-core"
157 +
158 +export default defineComponent({
159 + name: "ElementForm",
160 + data() {
161 + var checkAge = (rule, value, callback) => {
162 + if (!value) {
163 + return callback(new Error("Please input the age"))
164 + }
165 + setTimeout(() => {
166 + if (!Number.isInteger(value)) {
167 + callback(new Error("Please input digits"))
168 + } else {
169 + if (value < 18) {
170 + callback(new Error("Age must be greater than 18"))
171 + } else {
172 + callback()
173 + }
174 + }
175 + }, 1000)
176 + }
177 + var validatePass = (rule, value, callback) => {
178 + if (value === "") {
179 + callback(new Error("Please input the password"))
180 + } else {
181 + if (this.ruleForm2.checkPass !== "") {
182 + this.$refs.ruleForm2.validateField("checkPass")
183 + }
184 + callback()
185 + }
186 + }
187 + var validatePass2 = (rule, value, callback) => {
188 + if (value === "") {
189 + callback(new Error("Please input the password again"))
190 + } else if (value !== this.ruleForm2.pass) {
191 + callback(new Error("Two inputs don't match!"))
192 + } else {
193 + callback()
194 + }
195 + }
196 + return {
197 + form: {
198 + name: "",
199 + region: "",
200 + date1: "",
201 + date2: "",
202 + delivery: false,
203 + type: [],
204 + resource: "",
205 + desc: ""
206 + },
207 + formInline: {
208 + user: "",
209 + region: ""
210 + },
211 + labelPosition: "right",
212 + formLabelAlign: {
213 + name: "",
214 + region: "",
215 + type: ""
216 + },
217 + ruleForm2: {
218 + pass: "",
219 + checkPass: "",
220 + age: ""
221 + },
222 + rules2: {
223 + pass: [{ validator: validatePass, trigger: "blur" }],
224 + checkPass: [{ validator: validatePass2, trigger: "blur" }],
225 + age: [{ validator: checkAge, trigger: "blur" }]
226 + },
227 + code1: `
228 +<el-form ref="form" :model="form" label-width="120px">
229 + <el-form-item label="Activity name">
230 + <el-input v-model="form.name"></el-input>
231 + </el-form-item>
232 + <el-form-item label="Activity zone">
233 + <el-select v-model="form.region" placeholder="please select your zone">
234 + <el-option label="Zone one" value="shanghai"></el-option>
235 + <el-option label="Zone two" value="beijing"></el-option>
236 + </el-select>
237 + </el-form-item>
238 + <el-form-item label="Activity time">
239 + <el-col :span="11">
240 + <el-date-picker type="date" placeholder="Pick a date" v-model="form.date1" style="width: 100%;"></el-date-picker>
241 + </el-col>
242 + <el-col class="line" :span="2">-</el-col>
243 + <el-col :span="11">
244 + <el-time-picker type="fixed-time" placeholder="Pick a time" v-model="form.date2" style="width: 100%;"></el-time-picker>
245 + </el-col>
246 + </el-form-item>
247 + <el-form-item label="Instant delivery">
248 + <el-switch v-model="form.delivery"></el-switch>
249 + </el-form-item>
250 + <el-form-item label="Activity type">
251 + <el-checkbox-group v-model="form.type">
252 + <el-checkbox label="Online activities" name="type"></el-checkbox>
253 + <el-checkbox label="Promotion activities" name="type"></el-checkbox>
254 + <el-checkbox label="Offline activities" name="type"></el-checkbox>
255 + <el-checkbox label="Simple brand exposure" name="type"></el-checkbox>
256 + </el-checkbox-group>
257 + </el-form-item>
258 + <el-form-item label="Resources">
259 + <el-radio-group v-model="form.resource">
260 + <el-radio label="Sponsor"></el-radio>
261 + <el-radio label="Venue"></el-radio>
262 + </el-radio-group>
263 + </el-form-item>
264 + <el-form-item label="Activity form">
265 + <el-input type="textarea" v-model="form.desc"></el-input>
266 + </el-form-item>
267 + <el-form-item>
268 + <el-button type="primary" @click="onSubmit">Create</el-button>
269 + <el-button>Cancel</el-button>
270 + </el-form-item>
271 +</el-form>
272 +<script>
273 + import { defineComponent } from "@vue/runtime-core"
274 +
275 +export default defineComponent({
276 + data() {
277 + return {
278 + form: {
279 + name: '',
280 + region: '',
281 + date1: '',
282 + date2: '',
283 + delivery: false,
284 + type: [],
285 + resource: '',
286 + desc: ''
287 + }
288 + }
289 + },
290 + methods: {
291 + onSubmit() {
292 + console.log('submit!');
293 + }
294 + }
295 + }
296 +<\/script>`,
297 + code2: `
298 +<el-form :inline="true" :model="formInline" class="demo-form-inline">
299 + <el-form-item label="Approved by">
300 + <el-input v-model="formInline.user" placeholder="Approved by"></el-input>
301 + </el-form-item>
302 + <el-form-item label="Activity zone">
303 + <el-select v-model="formInline.region" placeholder="Activity zone">
304 + <el-option label="Zone one" value="shanghai"></el-option>
305 + <el-option label="Zone two" value="beijing"></el-option>
306 + </el-select>
307 + </el-form-item>
308 + <el-form-item>
309 + <el-button type="primary" @click="onSubmit">Query</el-button>
310 + </el-form-item>
311 +</el-form>
312 +<script>
313 + import { defineComponent } from "@vue/runtime-core"
314 +
315 +export default defineComponent({
316 + data() {
317 + return {
318 + formInline: {
319 + user: '',
320 + region: ''
321 + }
322 + }
323 + },
324 + methods: {
325 + onSubmit() {
326 + console.log('submit!');
327 + }
328 + }
329 + }
330 +<\/script>
331 +`,
332 + code3: `
333 +<el-radio-group v-model="labelPosition" size="small">
334 + <el-radio-button label="left">Left</el-radio-button>
335 + <el-radio-button label="right">Right</el-radio-button>
336 + <el-radio-button label="top">Top</el-radio-button>
337 +</el-radio-group>
338 +<div style="margin: 20px;"></div>
339 +<el-form :label-position="labelPosition" label-width="100px" :model="formLabelAlign">
340 + <el-form-item label="Name">
341 + <el-input v-model="formLabelAlign.name"></el-input>
342 + </el-form-item>
343 + <el-form-item label="Activity zone">
344 + <el-input v-model="formLabelAlign.region"></el-input>
345 + </el-form-item>
346 + <el-form-item label="Activity form">
347 + <el-input v-model="formLabelAlign.type"></el-input>
348 + </el-form-item>
349 +</el-form>
350 +<script>
351 + import { defineComponent } from "@vue/runtime-core"
352 +
353 +export default defineComponent({
354 + data() {
355 + return {
356 + labelPosition: 'right',
357 + formLabelAlign: {
358 + name: '',
359 + region: '',
360 + type: ''
361 + }
362 + };
363 + }
364 + }
365 +<\/script>
366 +`,
367 + code4: `
368 +<el-form :model="ruleForm2" status-icon :rules="rules2" ref="ruleForm2" label-width="120px" class="demo-ruleForm">
369 + <el-form-item label="Password" prop="pass">
370 + <el-input type="password" v-model="ruleForm2.pass" auto-complete="off"></el-input>
371 + </el-form-item>
372 + <el-form-item label="Confirm" prop="checkPass">
373 + <el-input type="password" v-model="ruleForm2.checkPass" auto-complete="off"></el-input>
374 + </el-form-item>
375 + <el-form-item label="Age" prop="age">
376 + <el-input v-model.number="ruleForm2.age"></el-input>
377 + </el-form-item>
378 + <el-form-item>
379 + <el-button type="primary" @click="submitForm('ruleForm2')">Submit</el-button>
380 + <el-button @click="resetForm('ruleForm2')">Reset</el-button>
381 + </el-form-item>
382 +</el-form>
383 +<script>
384 + import { defineComponent } from "@vue/runtime-core"
385 +
386 +export default defineComponent({
387 + data() {
388 + var checkAge = (rule, value, callback) => {
389 + if (!value) {
390 + return callback(new Error('Please input the age'));
391 + }
392 + setTimeout(() => {
393 + if (!Number.isInteger(value)) {
394 + callback(new Error('Please input digits'));
395 + } else {
396 + if (value < 18) {
397 + callback(new Error('Age must be greater than 18'));
398 + } else {
399 + callback();
400 + }
401 + }
402 + }, 1000);
403 + };
404 + var validatePass = (rule, value, callback) => {
405 + if (value === '') {
406 + callback(new Error('Please input the password'));
407 + } else {
408 + if (this.ruleForm2.checkPass !== '') {
409 + this.$refs.ruleForm2.validateField('checkPass');
410 + }
411 + callback();
412 + }
413 + };
414 + var validatePass2 = (rule, value, callback) => {
415 + if (value === '') {
416 + callback(new Error('Please input the password again'));
417 + } else if (value !== this.ruleForm2.pass) {
418 + callback(new Error('Two inputs don\'t match!'));
419 + } else {
420 + callback();
421 + }
422 + };
423 + return {
424 + ruleForm2: {
425 + pass: '',
426 + checkPass: '',
427 + age: ''
428 + },
429 + rules2: {
430 + pass: [
431 + { validator: validatePass, trigger: 'blur' }
432 + ],
433 + checkPass: [
434 + { validator: validatePass2, trigger: 'blur' }
435 + ],
436 + age: [
437 + { validator: checkAge, trigger: 'blur' }
438 + ]
439 + }
440 + };
441 + },
442 + methods: {
443 + submitForm(formName) {
444 + this.$refs[formName].validate((valid) => {
445 + if (valid) {
446 + alert('submit!');
447 + } else {
448 + console.log('error submit!!');
449 + return false;
450 + }
451 + });
452 + },
453 + resetForm(formName) {
454 + this.$refs[formName].resetFields();
455 + }
456 + }
457 + }
458 +<\/script>
459 +`
460 + }
461 + },
462 + methods: {
463 + onSubmit() {
464 + console.log("submit!")
465 + },
466 + submitForm(formName) {
467 + this.$refs[formName].validate(valid => {
468 + if (valid) {
469 + alert("submit!")
470 + } else {
471 + console.log("error submit!!")
472 + return false
473 + }
474 + })
475 + },
476 + resetForm(formName) {
477 + this.$refs[formName].resetFields()
478 + }
479 + },
480 + components: {
481 + ThemePicker
482 + }
483 +})
484 +</script>
485 +
486 +<style lang="scss" scoped>
487 +.demo-box {
488 + padding: 20px;
489 + margin-bottom: 20px;
490 +}
491 +pre {
492 + margin: 0;
493 + background: white;
494 +}
495 +code {
496 + padding: 0;
497 +}
498 +
499 +@media (max-width: 768px) {
500 + code {
501 + font-size: 70%;
502 + }
503 +}
504 +</style>
src/views/ui/Element/ElementInput.vue new
+200
@@ -0,0 +1,200 @@
1 +<template>
2 + <el-scrollbar class="page-element-input">
3 + <div class="page-header">
4 + <h1>
5 + Element Input
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/input" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-input placeholder="Please input" v-model="input"></el-input>
18 + </el-collapse-item>
19 + <el-collapse-item title="Code" name="2">
20 + <pre v-highlightjs="code1"><code class="html"></code></pre>
21 + </el-collapse-item>
22 + </el-collapse>
23 + </div>
24 + <div class="card-base card-shadow--medium demo-box bg-white">
25 + <el-collapse value="1">
26 + <el-collapse-item title="Clearable" name="1">
27 + <el-input placeholder="Please input" v-model="input10" clearable> </el-input>
28 + </el-collapse-item>
29 + <el-collapse-item title="Code" name="2">
30 + <pre v-highlightjs="code2"><code class="html"></code></pre>
31 + </el-collapse-item>
32 + </el-collapse>
33 + </div>
34 + <div class="card-base card-shadow--medium demo-box bg-white">
35 + <el-collapse value="1">
36 + <el-collapse-item title="Autosize Textarea" name="1">
37 + <el-input type="textarea" autosize placeholder="Please input" v-model="textarea2"> </el-input>
38 + <div style="margin: 20px 0"></div>
39 + <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" placeholder="Please input" v-model="textarea3">
40 + </el-input>
41 + </el-collapse-item>
42 + <el-collapse-item title="Code" name="2">
43 + <pre v-highlightjs="code3"><code class="html"></code></pre>
44 + </el-collapse-item>
45 + </el-collapse>
46 + </div>
47 + <div class="card-base card-shadow--medium demo-box bg-white">
48 + <el-collapse value="1">
49 + <el-collapse-item title="Mixed input" name="1">
50 + <div>
51 + <el-input placeholder="Please input" v-model="input3">
52 + <template slot="prepend">Http://</template>
53 + </el-input>
54 + </div>
55 + <div style="margin-top: 15px">
56 + <el-input placeholder="Please input" v-model="input4">
57 + <template slot="append">.com</template>
58 + </el-input>
59 + </div>
60 + <div style="margin-top: 15px">
61 + <el-input placeholder="Please input" v-model="input5" class="input-with-select">
62 + <el-select v-model="select" slot="prepend" placeholder="Select">
63 + <el-option label="Restaurant" value="1"></el-option>
64 + <el-option label="Order No." value="2"></el-option>
65 + <el-option label="Tel" value="3"></el-option>
66 + </el-select>
67 + <el-button slot="append" icon="el-icon-search"></el-button>
68 + </el-input>
69 + </div>
70 + </el-collapse-item>
71 + <el-collapse-item title="Code" name="2">
72 + <pre v-highlightjs="code4"><code class="html"></code></pre>
73 + </el-collapse-item>
74 + </el-collapse>
75 + </div>
76 + </el-scrollbar>
77 +</template>
78 +
79 +<script>
80 +import ThemePicker from "@/components/theme-picker.vue"
81 +
82 +import { defineComponent } from "@vue/runtime-core"
83 +
84 +export default defineComponent({
85 + name: "ElementInput",
86 + data() {
87 + return {
88 + input: "",
89 + input3: "",
90 + input4: "",
91 + input5: "",
92 + input10: "",
93 + textarea2: "",
94 + textarea3: "",
95 + select: "",
96 + code1: `
97 +<el-input placeholder="Please input" v-model="input"></el-input>
98 +`,
99 + code2: `
100 +<el-input
101 + placeholder="Please input"
102 + v-model="input10"
103 + clearable>
104 +</el-input>
105 +`,
106 + code3: `
107 +<el-input
108 + type="textarea"
109 + autosize
110 + placeholder="Please input"
111 + v-model="textarea2">
112 +</el-input>
113 +<div style="margin: 20px 0;"></div>
114 +<el-input
115 + type="textarea"
116 + :autosize="{ minRows: 2, maxRows: 4}"
117 + placeholder="Please input"
118 + v-model="textarea3">
119 +</el-input>
120 +`,
121 + code4: `
122 +<div>
123 + <el-input placeholder="Please input" v-model="input3">
124 + <template slot="prepend">Http://</template>
125 + </el-input>
126 +</div>
127 +<div style="margin-top: 15px;">
128 + <el-input placeholder="Please input" v-model="input4">
129 + <template slot="append">.com</template>
130 + </el-input>
131 +</div>
132 +<div style="margin-top: 15px;">
133 + <el-input placeholder="Please input" v-model="input5" class="input-with-select">
134 + <el-select v-model="select" slot="prepend" placeholder="Select">
135 + <el-option label="Restaurant" value="1"></el-option>
136 + <el-option label="Order No." value="2"></el-option>
137 + <el-option label="Tel" value="3"></el-option>
138 + </el-select>
139 + <el-button slot="append" icon="el-icon-search"></el-button>
140 + </el-input>
141 +</div>
142 +
143 +<style>
144 + .el-select .el-input {
145 + width: 110px;
146 + }
147 + .input-with-select .el-input-group__prepend {
148 + background-color: #fff;
149 + }
150 +</style>
151 +<script>
152 +import { defineComponent } from "@vue/runtime-core"
153 +
154 +export default defineComponent({
155 + data() {
156 + return {
157 + input3: '',
158 + input4: '',
159 + input5: '',
160 + select: ''
161 + }
162 + }
163 +}
164 +<\/script>
165 +`
166 + }
167 + },
168 + components: {
169 + ThemePicker
170 + }
171 +})
172 +</script>
173 +
174 +<style lang="scss" scoped>
175 +.demo-box {
176 + padding: 20px;
177 + margin-bottom: 20px;
178 +}
179 +pre {
180 + margin: 0;
181 + background: white;
182 +}
183 +code {
184 + padding: 0;
185 +}
186 +
187 +@media (max-width: 768px) {
188 + code {
189 + font-size: 70%;
190 + }
191 +}
192 +</style>
193 +
194 +<style lang="scss">
195 +.demo-box {
196 + .el-select .el-input {
197 + min-width: 110px;
198 + }
199 +}
200 +</style>
src/views/ui/Element/ElementInputNumber.vue new
+116
@@ -0,0 +1,116 @@
1 +<template>
2 + <el-scrollbar class="page-element-input-number">
3 + <div class="page-header">
4 + <h1>
5 + Element Input Number
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/input-number" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-input-number v-model="num1" :min="1" :max="10"></el-input-number>
18 + </el-collapse-item>
19 + <el-collapse-item title="Code" name="2">
20 + <pre v-highlightjs="code1"><code class="html"></code></pre>
21 + </el-collapse-item>
22 + </el-collapse>
23 + </div>
24 + <div class="card-base card-shadow--medium demo-box bg-white">
25 + <el-collapse value="1">
26 + <el-collapse-item title="Controls Position" name="1">
27 + <el-input-number v-model="num8" controls-position="right" :min="1" :max="10"></el-input-number>
28 + </el-collapse-item>
29 + <el-collapse-item title="Code" name="2">
30 + <pre v-highlightjs="code2"><code class="html"></code></pre>
31 + </el-collapse-item>
32 + </el-collapse>
33 + </div>
34 + </el-scrollbar>
35 +</template>
36 +
37 +<script>
38 +import ThemePicker from "@/components/theme-picker.vue"
39 +
40 +import { defineComponent } from "@vue/runtime-core"
41 +
42 +export default defineComponent({
43 + name: "ElementInputNumber",
44 + data() {
45 + return {
46 + num1: 1,
47 + num8: 1,
48 + code1: `
49 +<template>
50 + <el-input-number v-model="num1" @change="handleChange" :min="1" :max="10"></el-input-number>
51 +</template>
52 +<script>
53 + import { defineComponent } from "@vue/runtime-core"
54 +
55 +export default defineComponent({
56 + data() {
57 + return {
58 + num1: 1
59 + };
60 + },
61 + methods: {
62 + handleChange(value) {
63 + console.log(value)
64 + }
65 + }
66 + };
67 +<\/script>
68 +`,
69 + code2: `
70 +<template>
71 + <el-input-number v-model="num8" controls-position="right" @change="handleChange" :min="1" :max="10"></el-input-number>
72 +</template>
73 +<script>
74 + import { defineComponent } from "@vue/runtime-core"
75 +
76 +export default defineComponent({
77 + data() {
78 + return {
79 + num8: 1
80 + };
81 + },
82 + methods: {
83 + handleChange(value) {
84 + console.log(value);
85 + }
86 + }
87 + };
88 +<\/script>
89 +`
90 + }
91 + },
92 + components: {
93 + ThemePicker
94 + }
95 +})
96 +</script>
97 +
98 +<style lang="scss" scoped>
99 +.demo-box {
100 + padding: 20px;
101 + margin-bottom: 20px;
102 +}
103 +pre {
104 + margin: 0;
105 + background: white;
106 +}
107 +code {
108 + padding: 0;
109 +}
110 +
111 +@media (max-width: 768px) {
112 + code {
113 + font-size: 70%;
114 + }
115 +}
116 +</style>
src/views/ui/Element/ElementLoading.vue new
+283
@@ -0,0 +1,283 @@
1 +<template>
2 + <div class="page-element-loading scrollable">
3 + <div class="page-header">
4 + <h1>
5 + Element Loading
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/loading" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Loading inside a container" name="1">
17 + <el-table v-loading="loading" :data="tableData" style="width: 100%">
18 + <el-table-column prop="date" label="Date" width="180"> </el-table-column>
19 + <el-table-column prop="name" label="Name" width="180"> </el-table-column>
20 + <el-table-column prop="address" label="Address"> </el-table-column>
21 + </el-table>
22 + </el-collapse-item>
23 + <el-collapse-item title="Code" name="2">
24 + <pre v-highlightjs="code1"><code class="html"></code></pre>
25 + </el-collapse-item>
26 + </el-collapse>
27 + </div>
28 + <div class="card-base card-shadow--medium demo-box bg-white">
29 + <el-collapse value="1">
30 + <el-collapse-item title="Customization" name="1">
31 + <el-table
32 + v-loading="loading2"
33 + element-loading-text="Loading..."
34 + element-loading-spinner="el-icon-loading"
35 + element-loading-background="rgba(0, 0, 0, 0.8)"
36 + :data="tableData"
37 + style="width: 100%"
38 + >
39 + <el-table-column prop="date" label="Date" width="180"> </el-table-column>
40 + <el-table-column prop="name" label="Name" width="180"> </el-table-column>
41 + <el-table-column prop="address" label="Address"> </el-table-column>
42 + </el-table>
43 + </el-collapse-item>
44 + <el-collapse-item title="Code" name="2">
45 + <pre v-highlightjs="code2"><code class="html"></code></pre>
46 + </el-collapse-item>
47 + </el-collapse>
48 + </div>
49 + <div class="card-base card-shadow--medium demo-box bg-white">
50 + <el-collapse value="1">
51 + <el-collapse-item title="Full screen loading" name="1">
52 + <el-button class="m-5" type="primary" @click="openFullScreen" v-loading.fullscreen.lock="fullscreenLoading">
53 + As a directive
54 + </el-button>
55 + <el-button class="m-5" type="primary" @click="openFullScreen2"> As a service </el-button>
56 + </el-collapse-item>
57 + <el-collapse-item title="Code" name="2">
58 + <pre v-highlightjs="code3"><code class="html"></code></pre>
59 + </el-collapse-item>
60 + </el-collapse>
61 + </div>
62 + </div>
63 +</template>
64 +
65 +<script>
66 +import ThemePicker from "@/components/theme-picker.vue"
67 +
68 +import { defineComponent } from "@vue/runtime-core"
69 +
70 +export default defineComponent({
71 + name: "ElementLoading",
72 + data() {
73 + return {
74 + fullscreenLoading: false,
75 + tableData: [
76 + {
77 + date: "2016-05-02",
78 + name: "John Smith",
79 + address: "No.1518, Jinshajiang Road, Putuo District"
80 + },
81 + {
82 + date: "2016-05-04",
83 + name: "John Smith",
84 + address: "No.1518, Jinshajiang Road, Putuo District"
85 + },
86 + {
87 + date: "2016-05-01",
88 + name: "John Smith",
89 + address: "No.1518, Jinshajiang Road, Putuo District"
90 + }
91 + ],
92 + loading: true,
93 + loading2: true,
94 + code1: `
95 +<template>
96 + <el-table
97 + v-loading="loading"
98 + :data="tableData"
99 + style="width: 100%">
100 + <el-table-column
101 + prop="date"
102 + label="Date"
103 + width="180">
104 + </el-table-column>
105 + <el-table-column
106 + prop="name"
107 + label="Name"
108 + width="180">
109 + </el-table-column>
110 + <el-table-column
111 + prop="address"
112 + label="Address">
113 + </el-table-column>
114 + </el-table>
115 +</template>
116 +
117 +<script>
118 + import { defineComponent } from "@vue/runtime-core"
119 +
120 +export default defineComponent({
121 + data() {
122 + return {
123 + tableData: [{
124 + date: '2016-05-02',
125 + name: 'John Smith',
126 + address: 'No.1518, Jinshajiang Road, Putuo District'
127 + }, {
128 + date: '2016-05-04',
129 + name: 'John Smith',
130 + address: 'No.1518, Jinshajiang Road, Putuo District'
131 + }, {
132 + date: '2016-05-01',
133 + name: 'John Smith',
134 + address: 'No.1518, Jinshajiang Road, Putuo District'
135 + }],
136 + loading: true
137 + };
138 + }
139 + };
140 +<\/script>`,
141 + code2: `
142 +<template>
143 + <el-table
144 + v-loading="loading2"
145 + element-loading-text="Loading..."
146 + element-loading-spinner="el-icon-loading"
147 + element-loading-background="rgba(0, 0, 0, 0.8)"
148 + :data="tableData"
149 + style="width: 100%">
150 + <el-table-column
151 + prop="date"
152 + label="Date"
153 + width="180">
154 + </el-table-column>
155 + <el-table-column
156 + prop="name"
157 + label="Name"
158 + width="180">
159 + </el-table-column>
160 + <el-table-column
161 + prop="address"
162 + label="Address">
163 + </el-table-column>
164 + </el-table>
165 +</template>
166 +
167 +<script>
168 + import { defineComponent } from "@vue/runtime-core"
169 +
170 +export default defineComponent({
171 + data() {
172 + return {
173 + tableData: [{
174 + date: '2016-05-02',
175 + name: 'John Smith',
176 + address: 'No.1518, Jinshajiang Road, Putuo District'
177 + }, {
178 + date: '2016-05-04',
179 + name: 'John Smith',
180 + address: 'No.1518, Jinshajiang Road, Putuo District'
181 + }, {
182 + date: '2016-05-01',
183 + name: 'John Smith',
184 + address: 'No.1518, Jinshajiang Road, Putuo District'
185 + }],
186 + loading2: true
187 + };
188 + }
189 + };
190 +<\/script>
191 +`,
192 + code3: `
193 +<template>
194 + <el-button
195 + type="primary"
196 + @click="openFullScreen"
197 + v-loading.fullscreen.lock="fullscreenLoading">
198 + As a directive
199 + </el-button>
200 + <el-button
201 + type="primary"
202 + @click="openFullScreen2">
203 + As a service
204 + </el-button>
205 +</template>
206 +
207 +<script>
208 + import { defineComponent } from "@vue/runtime-core"
209 +
210 +export default defineComponent({
211 + data() {
212 + return {
213 + fullscreenLoading: false
214 + }
215 + },
216 + methods: {
217 + openFullScreen() {
218 + this.fullscreenLoading = true;
219 + setTimeout(() => {
220 + this.fullscreenLoading = false;
221 + }, 2000);
222 + },
223 + openFullScreen2() {
224 + const loading = this.$loading({
225 + lock: true,
226 + text: 'Loading',
227 + spinner: 'el-icon-loading',
228 + background: 'rgba(0, 0, 0, 0.7)'
229 + });
230 + setTimeout(() => {
231 + loading.close();
232 + }, 2000);
233 + }
234 + }
235 + }
236 +<\/script>
237 +`
238 + }
239 + },
240 + methods: {
241 + openFullScreen() {
242 + this.fullscreenLoading = true
243 + setTimeout(() => {
244 + this.fullscreenLoading = false
245 + }, 2000)
246 + },
247 + openFullScreen2() {
248 + const loading = this.$loading({
249 + lock: true,
250 + text: "Loading",
251 + spinner: "el-icon-loading",
252 + background: "rgba(0, 0, 0, 0.7)"
253 + })
254 + setTimeout(() => {
255 + loading.close()
256 + }, 2000)
257 + }
258 + },
259 + components: {
260 + ThemePicker
261 + }
262 +})
263 +</script>
264 +
265 +<style lang="scss" scoped>
266 +.demo-box {
267 + padding: 20px;
268 + margin-bottom: 20px;
269 +}
270 +pre {
271 + margin: 0;
272 + background: white;
273 +}
274 +code {
275 + padding: 0;
276 +}
277 +
278 +@media (max-width: 768px) {
279 + code {
280 + font-size: 70%;
281 + }
282 +}
283 +</style>
src/views/ui/Element/ElementMessage.vue new
+144
@@ -0,0 +1,144 @@
1 +<template>
2 + <el-scrollbar class="page-element-message">
3 + <div class="page-header">
4 + <h1>
5 + Element Message
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/message" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Closable" name="1">
17 + <el-button :plain="true" @click="open5" class="m-5">message</el-button>
18 + <el-button :plain="true" @click="open6" class="m-5">success</el-button>
19 + <el-button :plain="true" @click="open7" class="m-5">warning</el-button>
20 + <el-button :plain="true" @click="open8" class="m-5">error</el-button>
21 + </el-collapse-item>
22 + <el-collapse-item title="Code" name="2">
23 + <pre v-highlightjs="code1"><code class="html"></code></pre>
24 + </el-collapse-item>
25 + </el-collapse>
26 + </div>
27 + </el-scrollbar>
28 +</template>
29 +
30 +<script>
31 +import ThemePicker from "@/components/theme-picker.vue"
32 +
33 +import { defineComponent } from "@vue/runtime-core"
34 +
35 +export default defineComponent({
36 + name: "ElementMessage",
37 + methods: {
38 + open5() {
39 + this.$message({
40 + showClose: true,
41 + message: "This is a message."
42 + })
43 + },
44 +
45 + open6() {
46 + this.$message({
47 + showClose: true,
48 + message: "Congrats, this is a success message.",
49 + type: "success"
50 + })
51 + },
52 +
53 + open7() {
54 + this.$message({
55 + showClose: true,
56 + message: "Warning, this is a warning message.",
57 + type: "warning"
58 + })
59 + },
60 +
61 + open8() {
62 + this.$message({
63 + showClose: true,
64 + message: "Oops, this is a error message.",
65 + type: "error"
66 + })
67 + }
68 + },
69 + data() {
70 + return {
71 + code1: `
72 +<template>
73 + <el-button :plain="true" @click="open5">message</el-button>
74 + <el-button :plain="true" @click="open6">success</el-button>
75 + <el-button :plain="true" @click="open7">warning</el-button>
76 + <el-button :plain="true" @click="open8">error</el-button>
77 +</template>
78 +
79 +<script>
80 + import { defineComponent } from "@vue/runtime-core"
81 +
82 +export default defineComponent({
83 + methods: {
84 + open5() {
85 + this.$message({
86 + showClose: true,
87 + message: 'This is a message.'
88 + });
89 + },
90 +
91 + open6() {
92 + this.$message({
93 + showClose: true,
94 + message: 'Congrats, this is a success message.',
95 + type: 'success'
96 + });
97 + },
98 +
99 + open7() {
100 + this.$message({
101 + showClose: true,
102 + message: 'Warning, this is a warning message.',
103 + type: 'warning'
104 + });
105 + },
106 +
107 + open8() {
108 + this.$message({
109 + showClose: true,
110 + message: 'Oops, this is a error message.',
111 + type: 'error'
112 + });
113 + }
114 + }
115 + }
116 +<\/script>
117 +`
118 + }
119 + },
120 + components: {
121 + ThemePicker
122 + }
123 +})
124 +</script>
125 +
126 +<style lang="scss" scoped>
127 +.demo-box {
128 + padding: 20px;
129 + margin-bottom: 20px;
130 +}
131 +pre {
132 + margin: 0;
133 + background: white;
134 +}
135 +code {
136 + padding: 0;
137 +}
138 +
139 +@media (max-width: 768px) {
140 + code {
141 + font-size: 70%;
142 + }
143 +}
144 +</style>
src/views/ui/Element/ElementMessageBox.vue new
+217
@@ -0,0 +1,217 @@
1 +<template>
2 + <div class="page-element-message-box scrollable">
3 + <div class="page-header">
4 + <h1>
5 + Element Message Box
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/message-box" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Use HTML String" name="1">
17 + <el-button :link="true" @click="open5">Click to open Message Box</el-button>
18 + </el-collapse-item>
19 + <el-collapse-item title="Code" name="2">
20 + <pre v-highlightjs="code1"><code class="html"></code></pre>
21 + </el-collapse-item>
22 + </el-collapse>
23 + </div>
24 + <div class="card-base card-shadow--medium demo-box bg-white">
25 + <el-collapse value="1">
26 + <el-collapse-item title="Prompt" name="1">
27 + <el-button :link="true" @click="open3">Click to open Message Box</el-button>
28 + </el-collapse-item>
29 + <el-collapse-item title="Code" name="2">
30 + <pre v-highlightjs="code3"><code class="html"></code></pre>
31 + </el-collapse-item>
32 + </el-collapse>
33 + </div>
34 + <div class="card-base card-shadow--medium demo-box bg-white">
35 + <el-collapse value="1">
36 + <el-collapse-item title="Centered content" name="1">
37 + <el-button :link="true" @click="open6">Click to open Message Box</el-button>
38 + </el-collapse-item>
39 + <el-collapse-item title="Code" name="2">
40 + <pre v-highlightjs="code2"><code class="html"></code></pre>
41 + </el-collapse-item>
42 + </el-collapse>
43 + </div>
44 + </div>
45 +</template>
46 +
47 +<script>
48 +import ThemePicker from "@/components/theme-picker.vue"
49 +
50 +import { defineComponent } from "@vue/runtime-core"
51 +
52 +export default defineComponent({
53 + name: "ElementMessageBox",
54 + methods: {
55 + open5() {
56 + this.$alert("<strong>This is <i>HTML</i> string</strong>", "HTML String", {
57 + dangerouslyUseHTMLString: true
58 + })
59 + },
60 + open6() {
61 + this.$confirm("This will permanently delete the file. Continue?", "Warning", {
62 + confirmButtonText: "OK",
63 + cancelButtonText: "Cancel",
64 + type: "warning",
65 + center: true
66 + })
67 + .then(() => {
68 + this.$message({
69 + type: "success",
70 + showClose: true,
71 + message: "Delete completed"
72 + })
73 + })
74 + .catch(() => {
75 + this.$message({
76 + type: "info",
77 + showClose: true,
78 + message: "Delete canceled"
79 + })
80 + })
81 + },
82 + open3() {
83 + this.$prompt("Please input your e-mail", "Tip", {
84 + confirmButtonText: "OK",
85 + cancelButtonText: "Cancel",
86 + inputPattern: /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
87 + inputErrorMessage: "Invalid Email"
88 + })
89 + .then(value => {
90 + this.$message({
91 + type: "success",
92 + showClose: true,
93 + message: "Your email is:" + value
94 + })
95 + })
96 + .catch(() => {
97 + this.$message({
98 + type: "info",
99 + showClose: true,
100 + message: "Input canceled"
101 + })
102 + })
103 + }
104 + },
105 + data() {
106 + return {
107 + value1: true,
108 + value2: true,
109 + code1: `
110 +<template>
111 + <el-button :link="true" @click="open5">Click to open Message Box</el-button>
112 +</template>
113 +
114 +<script>
115 + import { defineComponent } from "@vue/runtime-core"
116 +
117 +export default defineComponent({
118 + methods: {
119 + open5() {
120 + this.$alert('<strong>This is <i>HTML</i> string</strong>', 'HTML String', {
121 + dangerouslyUseHTMLString: true
122 + });
123 + }
124 + }
125 + }
126 +<\/script>`,
127 + code2: `
128 +<template>
129 + <el-button :link="true" @click="open6">Click to open Message Box</el-button>
130 +</template>
131 +
132 +<script>
133 + import { defineComponent } from "@vue/runtime-core"
134 +
135 +export default defineComponent({
136 + methods: {
137 + open6() {
138 + this.$confirm('This will permanently delete the file. Continue?', 'Warning', {
139 + confirmButtonText: 'OK',
140 + cancelButtonText: 'Cancel',
141 + type: 'warning',
142 + center: true
143 + }).then(() => {
144 + this.$message({
145 + type: 'success',
146 + message: 'Delete completed'
147 + });
148 + }).catch(() => {
149 + this.$message({
150 + type: 'info',
151 + message: 'Delete canceled'
152 + });
153 + });
154 + }
155 + }
156 + }
157 +<\/script>
158 +`,
159 + code3: `
160 +<template>
161 + <el-button :link="true" @click="open3">Click to open Message Box</el-button>
162 +</template>
163 +
164 +<script>
165 + import { defineComponent } from "@vue/runtime-core"
166 +
167 +export default defineComponent({
168 + methods: {
169 + open3() {
170 + this.$prompt('Please input your e-mail', 'Tip', {
171 + confirmButtonText: 'OK',
172 + cancelButtonText: 'Cancel',
173 + inputPattern: /[\w!#$%&'*+/=?^_{|}~-]+(?:\.[\w!#$%&'*+/=?^_{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
174 + inputErrorMessage: 'Invalid Email'
175 + }).then(value => {
176 + this.$message({
177 + type: 'success',
178 + message: 'Your email is:' + value
179 + });
180 + }).catch(() => {
181 + this.$message({
182 + type: 'info',
183 + message: 'Input canceled'
184 + });
185 + });
186 + }
187 + }
188 + }
189 +<\/script>
190 +`
191 + }
192 + },
193 + components: {
194 + ThemePicker
195 + }
196 +})
197 +</script>
198 +
199 +<style lang="scss" scoped>
200 +.demo-box {
201 + padding: 20px;
202 + margin-bottom: 20px;
203 +}
204 +pre {
205 + margin: 0;
206 + background: white;
207 +}
208 +code {
209 + padding: 0;
210 +}
211 +
212 +@media (max-width: 768px) {
213 + code {
214 + font-size: 70%;
215 + }
216 +}
217 +</style>
src/views/ui/Element/ElementNavMenu.vue new
+480
@@ -0,0 +1,480 @@
1 +<template>
2 + <el-scrollbar class="page-element-menu">
3 + <div class="page-header">
4 + <h1>
5 + Element NavMenu
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/menu" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Top bar" name="1">
17 + <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect">
18 + <el-menu-item index="1">Processing Center</el-menu-item>
19 + <el-sub-menu index="2">
20 + <template slot="title">Workspace</template>
21 + <el-menu-item index="2-1">item one</el-menu-item>
22 + <el-menu-item index="2-2">item two</el-menu-item>
23 + <el-menu-item index="2-3">item three</el-menu-item>
24 + <el-sub-menu index="2-4">
25 + <template slot="title">item four</template>
26 + <el-menu-item index="2-4-1">item one</el-menu-item>
27 + <el-menu-item index="2-4-2">item two</el-menu-item>
28 + <el-menu-item index="2-4-3">item three</el-menu-item>
29 + </el-sub-menu>
30 + </el-sub-menu>
31 + <el-menu-item index="3" disabled>Info</el-menu-item>
32 + <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">Orders</a></el-menu-item>
33 + </el-menu>
34 + <div class="line"></div>
35 + <el-menu
36 + :default-active="activeIndex2"
37 + class="el-menu-demo"
38 + mode="horizontal"
39 + @select="handleSelect"
40 + background-color="#545c64"
41 + text-color="#fff"
42 + active-text-color="#ffd04b"
43 + >
44 + <el-menu-item index="1">Processing Center</el-menu-item>
45 + <el-sub-menu index="2">
46 + <template slot="title">Workspace</template>
47 + <el-menu-item index="2-1">item one</el-menu-item>
48 + <el-menu-item index="2-2">item two</el-menu-item>
49 + <el-menu-item index="2-3">item three</el-menu-item>
50 + <el-sub-menu index="2-4">
51 + <template slot="title">item four</template>
52 + <el-menu-item index="2-4-1">item one</el-menu-item>
53 + <el-menu-item index="2-4-2">item two</el-menu-item>
54 + <el-menu-item index="2-4-3">item three</el-menu-item>
55 + </el-sub-menu>
56 + </el-sub-menu>
57 + <el-menu-item index="3" disabled>Info</el-menu-item>
58 + <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">Orders</a></el-menu-item>
59 + </el-menu>
60 + </el-collapse-item>
61 + <el-collapse-item title="Code" name="2">
62 + <pre v-highlightjs="code1"><code class="html"></code></pre>
63 + </el-collapse-item>
64 + </el-collapse>
65 + </div>
66 + <div class="card-base card-shadow--medium demo-box bg-white">
67 + <el-collapse value="1">
68 + <el-collapse-item title="Side bar" name="1">
69 + <el-row class="tac">
70 + <el-col :span="9" :xs="24">
71 + <h5>Default colors</h5>
72 + <el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose">
73 + <el-sub-menu index="1">
74 + <template slot="title">
75 + <i class="el-icon-location"></i>
76 + <span>Navigator One</span>
77 + </template>
78 + <el-menu-item-group title="Group One">
79 + <el-menu-item index="1-1">item one</el-menu-item>
80 + <el-menu-item index="1-2">item one</el-menu-item>
81 + </el-menu-item-group>
82 + <el-menu-item-group title="Group Two">
83 + <el-menu-item index="1-3">item three</el-menu-item>
84 + </el-menu-item-group>
85 + <el-sub-menu index="1-4">
86 + <template slot="title">item four</template>
87 + <el-menu-item index="1-4-1">item one</el-menu-item>
88 + </el-sub-menu>
89 + </el-sub-menu>
90 + <el-menu-item index="2">
91 + <i class="el-icon-menu"></i>
92 + <span>Navigator Two</span>
93 + </el-menu-item>
94 + <el-menu-item index="3" disabled>
95 + <i class="el-icon-document"></i>
96 + <span>Navigator Three</span>
97 + </el-menu-item>
98 + <el-menu-item index="4">
99 + <i class="el-icon-setting"></i>
100 + <span>Navigator Four</span>
101 + </el-menu-item>
102 + </el-menu>
103 + </el-col>
104 + <el-col :span="12" :xs="24">
105 + <h5>Custom colors</h5>
106 + <el-menu
107 + default-active="2"
108 + class="el-menu-vertical-demo"
109 + @open="handleOpen"
110 + @close="handleClose"
111 + background-color="#545c64"
112 + text-color="#fff"
113 + active-text-color="#ffd04b"
114 + >
115 + <el-sub-menu index="1">
116 + <template slot="title">
117 + <i class="el-icon-location"></i>
118 + <span>Navigator One</span>
119 + </template>
120 + <el-menu-item-group title="Group One">
121 + <el-menu-item index="1-1">item one</el-menu-item>
122 + <el-menu-item index="1-2">item one</el-menu-item>
123 + </el-menu-item-group>
124 + <el-menu-item-group title="Group Two">
125 + <el-menu-item index="1-3">item three</el-menu-item>
126 + </el-menu-item-group>
127 + <el-sub-menu index="1-4">
128 + <template slot="title">item four</template>
129 + <el-menu-item index="1-4-1">item one</el-menu-item>
130 + </el-sub-menu>
131 + </el-sub-menu>
132 + <el-menu-item index="2">
133 + <i class="el-icon-menu"></i>
134 + <span>Navigator Two</span>
135 + </el-menu-item>
136 + <el-menu-item index="3" disabled>
137 + <i class="el-icon-document"></i>
138 + <span>Navigator Three</span>
139 + </el-menu-item>
140 + <el-menu-item index="4">
141 + <i class="el-icon-setting"></i>
142 + <span>Navigator Four</span>
143 + </el-menu-item>
144 + </el-menu>
145 + </el-col>
146 + </el-row>
147 + </el-collapse-item>
148 + <el-collapse-item title="Code" name="2">
149 + <pre v-highlightjs="code2"><code class="html"></code></pre>
150 + </el-collapse-item>
151 + </el-collapse>
152 + </div>
153 + <div class="card-base card-shadow--medium demo-box bg-white">
154 + <el-collapse value="1">
155 + <el-collapse-item title="Collapse" name="1">
156 + <div style="max-width: 300px">
157 + <el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
158 + <el-radio-button :label="false">expand</el-radio-button>
159 + <el-radio-button :label="true">collapse</el-radio-button>
160 + </el-radio-group>
161 + <el-menu
162 + default-active="2"
163 + class="el-menu-vertical-demo"
164 + @open="handleOpen"
165 + @close="handleClose"
166 + :collapse="isCollapse"
167 + >
168 + <el-sub-menu index="1">
169 + <template slot="title">
170 + <i class="el-icon-location"></i>
171 + <span slot="title">Navigator One</span>
172 + </template>
173 + <el-menu-item-group>
174 + <span slot="title">Group One</span>
175 + <el-menu-item index="1-1">item one</el-menu-item>
176 + <el-menu-item index="1-2">item two</el-menu-item>
177 + </el-menu-item-group>
178 + <el-menu-item-group title="Group Two">
179 + <el-menu-item index="1-3">item three</el-menu-item>
180 + </el-menu-item-group>
181 + <el-sub-menu index="1-4">
182 + <span slot="title">item four</span>
183 + <el-menu-item index="1-4-1">item one</el-menu-item>
184 + </el-sub-menu>
185 + </el-sub-menu>
186 + <el-menu-item index="2">
187 + <i class="el-icon-menu"></i>
188 + <span slot="title">Navigator Two</span>
189 + </el-menu-item>
190 + <el-menu-item index="3" disabled>
191 + <i class="el-icon-document"></i>
192 + <span slot="title">Navigator Three</span>
193 + </el-menu-item>
194 + <el-menu-item index="4">
195 + <i class="el-icon-setting"></i>
196 + <span slot="title">Navigator Four</span>
197 + </el-menu-item>
198 + </el-menu>
199 + </div>
200 + </el-collapse-item>
201 + <el-collapse-item title="Code" name="2">
202 + <pre v-highlightjs="code3"><code class="html"></code></pre>
203 + </el-collapse-item>
204 + </el-collapse>
205 + </div>
206 + </el-scrollbar>
207 +</template>
208 +
209 +<script>
210 +import ThemePicker from "@/components/theme-picker.vue"
211 +
212 +import { defineComponent } from "@vue/runtime-core"
213 +
214 +export default defineComponent({
215 + name: "ElementNavMenu",
216 + methods: {
217 + handleSelect(key, keyPath) {
218 + console.log(key, keyPath)
219 + },
220 + handleOpen(key, keyPath) {
221 + console.log(key, keyPath)
222 + },
223 + handleClose(key, keyPath) {
224 + console.log(key, keyPath)
225 + }
226 + },
227 + data() {
228 + return {
229 + activeIndex: "1",
230 + activeIndex2: "1",
231 + isCollapse: true,
232 + code1: `
233 +<el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect">
234 + <el-menu-item index="1">Processing Center</el-menu-item>
235 + <el-sub-menu index="2">
236 + <template slot="title">Workspace</template>
237 + <el-menu-item index="2-1">item one</el-menu-item>
238 + <el-menu-item index="2-2">item two</el-menu-item>
239 + <el-menu-item index="2-3">item three</el-menu-item>
240 + <el-sub-menu index="2-4">
241 + <template slot="title">item four</template>
242 + <el-menu-item index="2-4-1">item one</el-menu-item>
243 + <el-menu-item index="2-4-2">item two</el-menu-item>
244 + <el-menu-item index="2-4-3">item three</el-menu-item>
245 + </el-sub-menu>
246 + </el-sub-menu>
247 + <el-menu-item index="3" disabled>Info</el-menu-item>
248 + <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">Orders</a></el-menu-item>
249 +</el-menu>
250 +<div class="line"></div>
251 +<el-menu
252 + :default-active="activeIndex2"
253 + class="el-menu-demo"
254 + mode="horizontal"
255 + @select="handleSelect"
256 + background-color="#545c64"
257 + text-color="#fff"
258 + active-text-color="#ffd04b">
259 + <el-menu-item index="1">Processing Center</el-menu-item>
260 + <el-sub-menu index="2">
261 + <template slot="title">Workspace</template>
262 + <el-menu-item index="2-1">item one</el-menu-item>
263 + <el-menu-item index="2-2">item two</el-menu-item>
264 + <el-menu-item index="2-3">item three</el-menu-item>
265 + <el-sub-menu index="2-4">
266 + <template slot="title">item four</template>
267 + <el-menu-item index="2-4-1">item one</el-menu-item>
268 + <el-menu-item index="2-4-2">item two</el-menu-item>
269 + <el-menu-item index="2-4-3">item three</el-menu-item>
270 + </el-sub-menu>
271 + </el-sub-menu>
272 + <el-menu-item index="3" disabled>Info</el-menu-item>
273 + <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">Orders</a></el-menu-item>
274 +</el-menu>
275 +
276 +<script>
277 + import { defineComponent } from "@vue/runtime-core"
278 +
279 +export default defineComponent({
280 + data() {
281 + return {
282 + activeIndex: '1',
283 + activeIndex2: '1'
284 + };
285 + },
286 + methods: {
287 + handleSelect(key, keyPath) {
288 + console.log(key, keyPath);
289 + }
290 + }
291 + }
292 +<\/script>`,
293 + code2: `
294 +<el-row class="tac">
295 + <el-col :span="12">
296 + <h5>Default colors</h5>
297 + <el-menu
298 + default-active="2"
299 + class="el-menu-vertical-demo"
300 + @open="handleOpen"
301 + @close="handleClose">
302 + <el-sub-menu index="1">
303 + <template slot="title">
304 + <i class="el-icon-location"></i>
305 + <span>Navigator One</span>
306 + </template>
307 + <el-menu-item-group title="Group One">
308 + <el-menu-item index="1-1">item one</el-menu-item>
309 + <el-menu-item index="1-2">item one</el-menu-item>
310 + </el-menu-item-group>
311 + <el-menu-item-group title="Group Two">
312 + <el-menu-item index="1-3">item three</el-menu-item>
313 + </el-menu-item-group>
314 + <el-sub-menu index="1-4">
315 + <template slot="title">item four</template>
316 + <el-menu-item index="1-4-1">item one</el-menu-item>
317 + </el-sub-menu>
318 + </el-sub-menu>
319 + <el-menu-item index="2">
320 + <i class="el-icon-menu"></i>
321 + <span>Navigator Two</span>
322 + </el-menu-item>
323 + <el-menu-item index="3" disabled>
324 + <i class="el-icon-document"></i>
325 + <span>Navigator Three</span>
326 + </el-menu-item>
327 + <el-menu-item index="4">
328 + <i class="el-icon-setting"></i>
329 + <span>Navigator Four</span>
330 + </el-menu-item>
331 + </el-menu>
332 + </el-col>
333 + <el-col :span="12">
334 + <h5>Custom colors</h5>
335 + <el-menu
336 + default-active="2"
337 + class="el-menu-vertical-demo"
338 + @open="handleOpen"
339 + @close="handleClose"
340 + background-color="#545c64"
341 + text-color="#fff"
342 + active-text-color="#ffd04b">
343 + <el-sub-menu index="1">
344 + <template slot="title">
345 + <i class="el-icon-location"></i>
346 + <span>Navigator One</span>
347 + </template>
348 + <el-menu-item-group title="Group One">
349 + <el-menu-item index="1-1">item one</el-menu-item>
350 + <el-menu-item index="1-2">item one</el-menu-item>
351 + </el-menu-item-group>
352 + <el-menu-item-group title="Group Two">
353 + <el-menu-item index="1-3">item three</el-menu-item>
354 + </el-menu-item-group>
355 + <el-sub-menu index="1-4">
356 + <template slot="title">item four</template>
357 + <el-menu-item index="1-4-1">item one</el-menu-item>
358 + </el-sub-menu>
359 + </el-sub-menu>
360 + <el-menu-item index="2">
361 + <i class="el-icon-menu"></i>
362 + <span>Navigator Two</span>
363 + </el-menu-item>
364 + <el-menu-item index="3" disabled>
365 + <i class="el-icon-document"></i>
366 + <span>Navigator Three</span>
367 + </el-menu-item>
368 + <el-menu-item index="4">
369 + <i class="el-icon-setting"></i>
370 + <span>Navigator Four</span>
371 + </el-menu-item>
372 + </el-menu>
373 + </el-col>
374 +</el-row>
375 +
376 +<script>
377 + import { defineComponent } from "@vue/runtime-core"
378 +
379 +export default defineComponent({
380 + methods: {
381 + handleOpen(key, keyPath) {
382 + console.log(key, keyPath);
383 + },
384 + handleClose(key, keyPath) {
385 + console.log(key, keyPath);
386 + }
387 + }
388 + }
389 +<\/script>
390 +`,
391 + code3: `
392 +<el-radio-group v-model="isCollapse" style="margin-bottom: 20px;">
393 + <el-radio-button :label="false">expand</el-radio-button>
394 + <el-radio-button :label="true">collapse</el-radio-button>
395 +</el-radio-group>
396 +<el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" :collapse="isCollapse">
397 + <el-sub-menu index="1">
398 + <template slot="title">
399 + <i class="el-icon-location"></i>
400 + <span slot="title">Navigator One</span>
401 + </template>
402 + <el-menu-item-group>
403 + <span slot="title">Group One</span>
404 + <el-menu-item index="1-1">item one</el-menu-item>
405 + <el-menu-item index="1-2">item two</el-menu-item>
406 + </el-menu-item-group>
407 + <el-menu-item-group title="Group Two">
408 + <el-menu-item index="1-3">item three</el-menu-item>
409 + </el-menu-item-group>
410 + <el-sub-menu index="1-4">
411 + <span slot="title">item four</span>
412 + <el-menu-item index="1-4-1">item one</el-menu-item>
413 + </el-sub-menu>
414 + </el-sub-menu>
415 + <el-menu-item index="2">
416 + <i class="el-icon-menu"></i>
417 + <span slot="title">Navigator Two</span>
418 + </el-menu-item>
419 + <el-menu-item index="3" disabled>
420 + <i class="el-icon-document"></i>
421 + <span slot="title">Navigator Three</span>
422 + </el-menu-item>
423 + <el-menu-item index="4">
424 + <i class="el-icon-setting"></i>
425 + <span slot="title">Navigator Four</span>
426 + </el-menu-item>
427 +</el-menu>
428 +
429 +<script>
430 + import { defineComponent } from "@vue/runtime-core"
431 +
432 +export default defineComponent({
433 + data() {
434 + return {
435 + isCollapse: true
436 + };
437 + },
438 + methods: {
439 + handleOpen(key, keyPath) {
440 + console.log(key, keyPath);
441 + },
442 + handleClose(key, keyPath) {
443 + console.log(key, keyPath);
444 + }
445 + }
446 + }
447 +<\/script>
448 +`
449 + }
450 + },
451 + components: {
452 + ThemePicker
453 + }
454 +})
455 +</script>
456 +
457 +<style lang="scss" scoped>
458 +.demo-box {
459 + padding: 20px;
460 + margin-bottom: 20px;
461 +}
462 +pre {
463 + margin: 0;
464 + background: white;
465 +}
466 +code {
467 + padding: 0;
468 +}
469 +.line {
470 + height: 1px;
471 + background-color: #e0e6ed;
472 + margin: 35px -24px;
473 +}
474 +
475 +@media (max-width: 768px) {
476 + code {
477 + font-size: 70%;
478 + }
479 +}
480 +</style>
src/views/ui/Element/ElementNotification.vue new
+165
@@ -0,0 +1,165 @@
1 +<template>
2 + <el-scrollbar class="page-element-notification">
3 + <div class="page-header">
4 + <h1>
5 + Element Notification
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/notification" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="With types" name="1">
17 + <el-button class="m-5" plain @click="open3"> Success </el-button>
18 + <el-button class="m-5" plain @click="open4"> Warning </el-button>
19 + <el-button class="m-5" plain @click="open5"> Info </el-button>
20 + <el-button class="m-5" plain @click="open6"> Error </el-button>
21 + </el-collapse-item>
22 + <el-collapse-item title="Code" name="2">
23 + <pre v-highlightjs="code1"><code class="html"></code></pre>
24 + </el-collapse-item>
25 + </el-collapse>
26 + </div>
27 + </el-scrollbar>
28 +</template>
29 +
30 +<script>
31 +import ThemePicker from "@/components/theme-picker.vue"
32 +
33 +import { defineComponent } from "@vue/runtime-core"
34 +
35 +export default defineComponent({
36 + name: "ElementNotification",
37 + methods: {
38 + open3() {
39 + this.$notify({
40 + title: "Success",
41 + message: "This is a success message",
42 + type: "success"
43 + })
44 + },
45 +
46 + open4() {
47 + this.$notify({
48 + title: "Warning",
49 + message: "This is a warning message",
50 + type: "warning",
51 + position: "bottom-right"
52 + })
53 + },
54 +
55 + open5() {
56 + this.$notify.info({
57 + title: "Info",
58 + message: "This is an info message",
59 + position: "bottom-left"
60 + })
61 + },
62 +
63 + open6() {
64 + this.$notify.error({
65 + title: "Error",
66 + message: "This is an error message",
67 + position: "top-left"
68 + })
69 + }
70 + },
71 + data() {
72 + return {
73 + value1: true,
74 + value2: true,
75 + code1: `
76 +<template>
77 + <el-button
78 + plain
79 + @click="open3">
80 + Success
81 + </el-button>
82 + <el-button
83 + plain
84 + @click="open4">
85 + Warning
86 + </el-button>
87 + <el-button
88 + plain
89 + @click="open5">
90 + Info
91 + </el-button>
92 + <el-button
93 + plain
94 + @click="open6">
95 + Error
96 + </el-button>
97 +</template>
98 +
99 +<script>
100 + import { defineComponent } from "@vue/runtime-core"
101 +
102 +export default defineComponent({
103 + methods: {
104 + open3() {
105 + this.$notify({
106 + title: 'Success',
107 + message: 'This is a success message',
108 + type: 'success'
109 + });
110 + },
111 +
112 + open4() {
113 + this.$notify({
114 + title: 'Warning',
115 + message: 'This is a warning message',
116 + type: 'warning',
117 + position: 'bottom-right'
118 + });
119 + },
120 +
121 + open5() {
122 + this.$notify.info({
123 + title: 'Info',
124 + message: 'This is an info message',
125 + position: 'bottom-left'
126 + });
127 + },
128 +
129 + open6() {
130 + this.$notify.error({
131 + title: 'Error',
132 + message: 'This is an error message',
133 + position: 'top-left'
134 + });
135 + }
136 + }
137 + }
138 +<\/script>`
139 + }
140 + },
141 + components: {
142 + ThemePicker
143 + }
144 +})
145 +</script>
146 +
147 +<style lang="scss" scoped>
148 +.demo-box {
149 + padding: 20px;
150 + margin-bottom: 20px;
151 +}
152 +pre {
153 + margin: 0;
154 + background: white;
155 +}
156 +code {
157 + padding: 0;
158 +}
159 +
160 +@media (max-width: 768px) {
161 + code {
162 + font-size: 70%;
163 + }
164 +}
165 +</style>
src/views/ui/Element/ElementPagination.vue new
+110
@@ -0,0 +1,110 @@
1 +<template>
2 + <el-scrollbar class="page-element-pagination">
3 + <div class="page-header">
4 + <h1>
5 + Element Pagination
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/pagination" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Buttons with background color" name="1">
17 + <el-pagination background layout="prev, pager, next" :total="1000"> </el-pagination>
18 + </el-collapse-item>
19 + <el-collapse-item title="Code" name="2">
20 + <pre v-highlightjs="code1"><code class="html"></code></pre>
21 + </el-collapse-item>
22 + </el-collapse>
23 + </div>
24 + </el-scrollbar>
25 +</template>
26 +
27 +<script>
28 +import ThemePicker from "@/components/theme-picker.vue"
29 +
30 +import { defineComponent } from "@vue/runtime-core"
31 +
32 +export default defineComponent({
33 + name: "ElementPagination",
34 + data() {
35 + return {
36 + currentPage4: 4,
37 + code1: `
38 +<el-pagination
39 + background
40 + layout="prev, pager, next"
41 + :total="1000">
42 +</el-pagination>`,
43 + code2: `
44 +<template>
45 + <div class="block">
46 + <el-pagination
47 + @size-change="handleSizeChange"
48 + @current-change="handleCurrentChange"
49 + v-model:current-page="currentPage4"
50 + :page-sizes="[100, 200, 300, 400]"
51 + :page-size="100"
52 + layout="total, sizes, prev, pager, next, jumper"
53 + :total="400">
54 + </el-pagination>
55 + </div>
56 +</template>
57 +<script>
58 + import { defineComponent } from "@vue/runtime-core"
59 +
60 +export default defineComponent({
61 + methods: {
62 + handleSizeChange(val) {
63 + console.log(val+' items per page');
64 + },
65 + handleCurrentChange(val) {
66 + console.log('current page: '+val);
67 + }
68 + },
69 + data() {
70 + return {
71 + currentPage4: 4
72 + };
73 + }
74 + }
75 +<\/script>
76 +`,
77 + code3: `
78 +<el-pagination
79 + small
80 + layout="prev, pager, next"
81 + :total="50">
82 +</el-pagination>
83 +`
84 + }
85 + },
86 + components: {
87 + ThemePicker
88 + }
89 +})
90 +</script>
91 +
92 +<style lang="scss" scoped>
93 +.demo-box {
94 + padding: 20px;
95 + margin-bottom: 20px;
96 +}
97 +pre {
98 + margin: 0;
99 + background: white;
100 +}
101 +code {
102 + padding: 0;
103 +}
104 +
105 +@media (max-width: 768px) {
106 + code {
107 + font-size: 70%;
108 + }
109 +}
110 +</style>
src/views/ui/Element/ElementPopover.vue new
+233
@@ -0,0 +1,233 @@
1 +<template>
2 + <el-scrollbar class="page-element-popover">
3 + <div class="page-header">
4 + <h1>
5 + Element Popover
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/popover" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-popover
18 + placement="top-start"
19 + title="Title"
20 + :width="200"
21 + trigger="hover"
22 + content="this is content, this is content, this is content"
23 + >
24 + <template #reference>
25 + <el-button>Hover to activate</el-button>
26 + </template>
27 + </el-popover>
28 +
29 + <el-popover
30 + placement="bottom"
31 + title="Title"
32 + :width="200"
33 + trigger="click"
34 + content="this is content, this is content, this is content"
35 + >
36 + <template #reference>
37 + <el-button>Click to activate</el-button>
38 + </template>
39 + </el-popover>
40 +
41 + <el-popover
42 + ref="popover"
43 + placement="right"
44 + title="Title"
45 + :width="200"
46 + trigger="focus"
47 + content="this is content, this is content, this is content"
48 + >
49 + <template #reference>
50 + <el-button>Focus to activate</el-button>
51 + </template>
52 + </el-popover>
53 +
54 + <el-popover
55 + ref="popover"
56 + title="Title"
57 + :width="200"
58 + trigger="contextmenu"
59 + content="this is content, this is content, this is content"
60 + >
61 + <template #reference>
62 + <el-button>contextmenu to activate</el-button>
63 + </template>
64 + </el-popover>
65 +
66 + <el-popover
67 + :visible="visible"
68 + placement="bottom"
69 + title="Title"
70 + :width="200"
71 + content="this is content, this is content, this is content"
72 + >
73 + <template #reference>
74 + <el-button @click="visible = !visible">Manual to activate</el-button>
75 + </template>
76 + </el-popover>
77 + </el-collapse-item>
78 + <el-collapse-item title="Code" name="2">
79 + <pre v-highlightjs="code1"><code class="html"></code></pre>
80 + </el-collapse-item>
81 + </el-collapse>
82 + </div>
83 + </el-scrollbar>
84 +</template>
85 +
86 +<script>
87 +import ThemePicker from "@/components/theme-picker.vue"
88 +
89 +import { defineComponent } from "@vue/runtime-core"
90 +
91 +export default defineComponent({
92 + name: "ElementPopover",
93 + data() {
94 + return {
95 + gridData: [
96 + {
97 + date: "2016-05-02",
98 + name: "Jack",
99 + address: "New York City"
100 + },
101 + {
102 + date: "2016-05-04",
103 + name: "Jack",
104 + address: "New York City"
105 + },
106 + {
107 + date: "2016-05-01",
108 + name: "Jack",
109 + address: "New York City"
110 + },
111 + {
112 + date: "2016-05-03",
113 + name: "Jack",
114 + address: "New York City"
115 + }
116 + ],
117 + visible: false,
118 + code1: `
119 + <el-popover
120 + placement="top-start"
121 + title="Title"
122 + :width="200"
123 + trigger="hover"
124 + content="this is content, this is content, this is content"
125 + >
126 + <template #reference>
127 + <el-button>Hover to activate</el-button>
128 + </template>
129 + </el-popover>
130 +
131 + <el-popover
132 + placement="bottom"
133 + title="Title"
134 + :width="200"
135 + trigger="click"
136 + content="this is content, this is content, this is content"
137 + >
138 + <template #reference>
139 + <el-button>Click to activate</el-button>
140 + </template>
141 + </el-popover>
142 +
143 + <el-popover
144 + ref="popover"
145 + placement="right"
146 + title="Title"
147 + :width="200"
148 + trigger="focus"
149 + content="this is content, this is content, this is content"
150 + >
151 + <template #reference>
152 + <el-button>Focus to activate</el-button>
153 + </template>
154 + </el-popover>
155 +
156 + <el-popover
157 + ref="popover"
158 + title="Title"
159 + :width="200"
160 + trigger="contextmenu"
161 + content="this is content, this is content, this is content"
162 + >
163 + <template #reference>
164 + <el-button>contextmenu to activate</el-button>
165 + </template>
166 + </el-popover>
167 +
168 + <el-popover
169 + :visible="visible"
170 + placement="bottom"
171 + title="Title"
172 + :width="200"
173 + content="this is content, this is content, this is content"
174 + >
175 + <template #reference>
176 + <el-button @click="visible = !visible">Manual to activate</el-button>
177 + </template>
178 + </el-popover>
179 +
180 +<script>
181 + import { defineComponent } from "@vue/runtime-core"
182 +
183 +export default defineComponent({
184 + data() {
185 + return {
186 + gridData: [{
187 + date: '2016-05-02',
188 + name: 'Jack',
189 + address: 'New York City'
190 + }, {
191 + date: '2016-05-04',
192 + name: 'Jack',
193 + address: 'New York City'
194 + }, {
195 + date: '2016-05-01',
196 + name: 'Jack',
197 + address: 'New York City'
198 + }, {
199 + date: '2016-05-03',
200 + name: 'Jack',
201 + address: 'New York City'
202 + }]
203 + };
204 + }
205 + };
206 +<\/script>`
207 + }
208 + },
209 + components: {
210 + ThemePicker
211 + }
212 +})
213 +</script>
214 +
215 +<style lang="scss" scoped>
216 +.demo-box {
217 + padding: 20px;
218 + margin-bottom: 20px;
219 +}
220 +pre {
221 + margin: 0;
222 + background: white;
223 +}
224 +code {
225 + padding: 0;
226 +}
227 +
228 +@media (max-width: 768px) {
229 + code {
230 + font-size: 70%;
231 + }
232 +}
233 +</style>
src/views/ui/Element/ElementProgress.vue new
+120
@@ -0,0 +1,120 @@
1 +<template>
2 + <el-scrollbar class="page-element-progress">
3 + <div class="page-header">
4 + <h1>
5 + Element Progress
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/progress" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Linear progress bar (external percentage)" name="1">
17 + <el-progress :percentage="0"></el-progress>
18 + &nbsp;
19 + <el-progress :percentage="70"></el-progress>
20 + &nbsp;
21 + <el-progress :percentage="100" status="success"></el-progress>
22 + &nbsp;
23 + <el-progress :percentage="50" status="exception"></el-progress>
24 + </el-collapse-item>
25 + <el-collapse-item title="Code" name="2">
26 + <pre v-highlightjs="code1"><code class="html"></code></pre>
27 + </el-collapse-item>
28 + </el-collapse>
29 + </div>
30 + <div class="card-base card-shadow--medium demo-box bg-white">
31 + <el-collapse value="1">
32 + <el-collapse-item title="Linear progress bar (internal percentage)" name="1">
33 + <el-progress :text-inside="true" :stroke-width="18" :percentage="0"></el-progress>
34 + &nbsp;
35 + <el-progress :text-inside="true" :stroke-width="18" :percentage="70"></el-progress>
36 + &nbsp;
37 + <el-progress :text-inside="true" :stroke-width="18" :percentage="100" status="success"></el-progress>
38 + &nbsp;
39 + <el-progress :text-inside="true" :stroke-width="18" :percentage="50" status="exception"></el-progress>
40 + </el-collapse-item>
41 + <el-collapse-item title="Code" name="2">
42 + <pre v-highlightjs="code2"><code class="html"></code></pre>
43 + </el-collapse-item>
44 + </el-collapse>
45 + </div>
46 + <div class="card-base card-shadow--medium demo-box bg-white">
47 + <el-collapse value="1">
48 + <el-collapse-item title="Circular progress bar" name="1">
49 + <el-progress type="circle" :percentage="0"></el-progress>
50 + &nbsp;
51 + <el-progress type="circle" :percentage="25"></el-progress>
52 + &nbsp;
53 + <el-progress type="circle" :percentage="100" status="success"></el-progress>
54 + &nbsp;
55 + <el-progress type="circle" :percentage="50" status="exception"></el-progress>
56 + </el-collapse-item>
57 + <el-collapse-item title="Code" name="2">
58 + <pre v-highlightjs="code3"><code class="html"></code></pre>
59 + </el-collapse-item>
60 + </el-collapse>
61 + </div>
62 + </el-scrollbar>
63 +</template>
64 +
65 +<script>
66 +import ThemePicker from "@/components/theme-picker.vue"
67 +
68 +import { defineComponent } from "@vue/runtime-core"
69 +
70 +export default defineComponent({
71 + name: "ElementProgress",
72 + data() {
73 + return {
74 + value1: true,
75 + value2: true,
76 + code1: `
77 +<el-progress :percentage="0"></el-progress>
78 +<el-progress :percentage="70"></el-progress>
79 +<el-progress :percentage="100" status="success"></el-progress>
80 +<el-progress :percentage="50" status="exception"></el-progress>
81 +`,
82 + code2: `
83 +<el-progress :text-inside="true" :stroke-width="18" :percentage="0"></el-progress>
84 +<el-progress :text-inside="true" :stroke-width="18" :percentage="70"></el-progress>
85 +<el-progress :text-inside="true" :stroke-width="18" :percentage="100" status="success"></el-progress>
86 +<el-progress :text-inside="true" :stroke-width="18" :percentage="50" status="exception"></el-progress>
87 +`,
88 + code3: `
89 +<el-progress type="circle" :percentage="0"></el-progress>
90 +<el-progress type="circle" :percentage="25"></el-progress>
91 +<el-progress type="circle" :percentage="100" status="success"></el-progress>
92 +<el-progress type="circle" :percentage="50" status="exception"></el-progress>
93 +`
94 + }
95 + },
96 + components: {
97 + ThemePicker
98 + }
99 +})
100 +</script>
101 +
102 +<style lang="scss" scoped>
103 +.demo-box {
104 + padding: 20px;
105 + margin-bottom: 20px;
106 +}
107 +pre {
108 + margin: 0;
109 + background: white;
110 +}
111 +code {
112 + padding: 0;
113 +}
114 +
115 +@media (max-width: 768px) {
116 + code {
117 + font-size: 70%;
118 + }
119 +}
120 +</style>
src/views/ui/Element/ElementRadio.vue new
+145
@@ -0,0 +1,145 @@
1 +<template>
2 + <el-scrollbar class="page-element-radio">
3 + <div class="page-header">
4 + <h1>
5 + Element Radio
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/radio" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-radio v-model="radio" label="1">Option A</el-radio>
18 + <el-radio v-model="radio" label="2">Option B</el-radio>
19 + </el-collapse-item>
20 + <el-collapse-item title="Code" name="2">
21 + <pre v-highlightjs="code1"><code class="html"></code></pre>
22 + </el-collapse-item>
23 + </el-collapse>
24 + </div>
25 + <div class="card-base card-shadow--medium demo-box bg-white hidden-xs-only">
26 + <el-collapse value="1">
27 + <el-collapse-item title="Button style" name="1">
28 + <div>
29 + <el-radio-group v-model="radio3">
30 + <el-radio-button label="New York"></el-radio-button>
31 + <el-radio-button label="Washington"></el-radio-button>
32 + <el-radio-button label="Los Angeles"></el-radio-button>
33 + <el-radio-button label="Chicago"></el-radio-button>
34 + </el-radio-group>
35 + </div>
36 + <div style="margin-top: 20px">
37 + <el-radio-group v-model="radio4" size="default">
38 + <el-radio-button label="New York"></el-radio-button>
39 + <el-radio-button label="Washington"></el-radio-button>
40 + <el-radio-button label="Los Angeles"></el-radio-button>
41 + <el-radio-button label="Chicago"></el-radio-button>
42 + </el-radio-group>
43 + </div>
44 + </el-collapse-item>
45 + <el-collapse-item title="Code" name="2">
46 + <pre v-highlightjs="code2"><code class="html"></code></pre>
47 + </el-collapse-item>
48 + </el-collapse>
49 + </div>
50 + <div class="card-base card-shadow--medium demo-box bg-white">
51 + <el-collapse value="1">
52 + <el-collapse-item title="With borders" name="1">
53 + <div>
54 + <el-radio v-model="radio7" label="1" border>Option A</el-radio>
55 + <el-radio v-model="radio7" label="2" border>Option B</el-radio>
56 + </div>
57 + <div style="margin-top: 20px">
58 + <el-radio v-model="radio8" label="1" border size="default">Option A</el-radio>
59 + <el-radio v-model="radio8" label="2" border size="default">Option B</el-radio>
60 + </div>
61 + </el-collapse-item>
62 + <el-collapse-item title="Code" name="2">
63 + <pre v-highlightjs="code3"><code class="html"></code></pre>
64 + </el-collapse-item>
65 + </el-collapse>
66 + </div>
67 + </el-scrollbar>
68 +</template>
69 +
70 +<script>
71 +import ThemePicker from "@/components/theme-picker.vue"
72 +import { defineComponent } from "@vue/runtime-core"
73 +
74 +export default defineComponent({
75 + name: "ElementRadio",
76 + data() {
77 + return {
78 + radio: "1",
79 + radio3: "New York",
80 + radio4: "New York",
81 + radio5: "New York",
82 + radio6: "New York",
83 + radio7: "1",
84 + radio8: "1",
85 + radio9: "1",
86 + radio10: "1",
87 + code1: `
88 +<el-radio v-model="radio" label="1">Option A</el-radio>
89 +<el-radio v-model="radio" label="2">Option B</el-radio>
90 +`,
91 + code2: `
92 +<div>
93 + <el-radio-group v-model="radio3">
94 + <el-radio-button label="New York"></el-radio-button>
95 + <el-radio-button label="Washington"></el-radio-button>
96 + <el-radio-button label="Los Angeles"></el-radio-button>
97 + <el-radio-button label="Chicago"></el-radio-button>
98 + </el-radio-group>
99 +</div>
100 +<div style="margin-top: 20px">
101 + <el-radio-group v-model="radio4" size="default">
102 + <el-radio-button label="New York" ></el-radio-button>
103 + <el-radio-button label="Washington"></el-radio-button>
104 + <el-radio-button label="Los Angeles"></el-radio-button>
105 + <el-radio-button label="Chicago"></el-radio-button>
106 + </el-radio-group>
107 +</div>
108 +`,
109 + code3: `
110 +<div>
111 + <el-radio v-model="radio7" label="1" border>Option A</el-radio>
112 + <el-radio v-model="radio7" label="2" border>Option B</el-radio>
113 +</div>
114 +<div style="margin-top: 20px">
115 + <el-radio v-model="radio8" label="1" border size="default">Option A</el-radio>
116 + <el-radio v-model="radio8" label="2" border size="default">Option B</el-radio>
117 +</div>
118 +`
119 + }
120 + },
121 + components: {
122 + ThemePicker
123 + }
124 +})
125 +</script>
126 +
127 +<style lang="scss" scoped>
128 +.demo-box {
129 + padding: 20px;
130 + margin-bottom: 20px;
131 +}
132 +pre {
133 + margin: 0;
134 + background: white;
135 +}
136 +code {
137 + padding: 0;
138 +}
139 +
140 +@media (max-width: 768px) {
141 + code {
142 + font-size: 70%;
143 + }
144 +}
145 +</style>
src/views/ui/Element/ElementRate.vue new
+105
@@ -0,0 +1,105 @@
1 +<template>
2 + <div class="page-element-rate scrollable">
3 + <div class="page-header">
4 + <h1>
5 + Element Rate
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/rate" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="block">
18 + <el-rate
19 + v-model="value2"
20 + show-text
21 + :texts="['oops', 'disappointed', 'normal', 'good', 'great']"
22 + :colors="['#99A9BF', '#F7BA2A', '#FF9900']"
23 + >
24 + </el-rate>
25 + </div>
26 + </el-collapse-item>
27 + <el-collapse-item title="Code" name="2">
28 + <pre v-highlightjs="code1"><code class="html"></code></pre>
29 + </el-collapse-item>
30 + </el-collapse>
31 + </div>
32 + <div class="card-base card-shadow--medium demo-box bg-white">
33 + <el-collapse value="1">
34 + <el-collapse-item title="More icons" name="1">
35 + <div class="block">
36 + <el-rate
37 + v-model="value4"
38 + :icon-classes="['mdi mdi-emoticon-sad', 'mdi mdi-emoticon-neutral', 'mdi mdi-emoticon-happy']"
39 + void-icon-class="mdi mdi-emoticon-sad"
40 + :colors="['#99A9BF', '#F7BA2A', '#FF9900']"
41 + >
42 + </el-rate>
43 + </div>
44 + </el-collapse-item>
45 + <el-collapse-item title="Code" name="2">
46 + <pre v-highlightjs="code2"><code class="html"></code></pre>
47 + </el-collapse-item>
48 + </el-collapse>
49 + </div>
50 + </div>
51 +</template>
52 +
53 +<script>
54 +import ThemePicker from "@/components/theme-picker.vue"
55 +
56 +import { defineComponent } from "@vue/runtime-core"
57 +
58 +export default defineComponent({
59 + name: "ElementRate",
60 + data() {
61 + return {
62 + value2: null,
63 + value4: null,
64 + code1: `
65 +<el-rate
66 + v-model="value2"
67 + show-text
68 + :texts="['oops', 'disappointed', 'normal', 'good', 'great']"
69 + :colors="['#99A9BF', '#F7BA2A', '#FF9900']">
70 +</el-rate>`,
71 + code2: `
72 +<el-rate
73 + v-model="value4"
74 + :icon-classes="['mdi mdi-emoticon-sad', 'mdi mdi-emoticon-neutral', 'mdi mdi-emoticon-happy']"
75 + void-icon-class="mdi mdi-emoticon-sad"
76 + :colors="['#99A9BF', '#F7BA2A', '#FF9900']">
77 +</el-rate>
78 +`
79 + }
80 + },
81 + components: {
82 + ThemePicker
83 + }
84 +})
85 +</script>
86 +
87 +<style lang="scss" scoped>
88 +.demo-box {
89 + padding: 20px;
90 + margin-bottom: 20px;
91 +}
92 +pre {
93 + margin: 0;
94 + background: white;
95 +}
96 +code {
97 + padding: 0;
98 +}
99 +
100 +@media (max-width: 768px) {
101 + code {
102 + font-size: 70%;
103 + }
104 +}
105 +</style>
src/views/ui/Element/ElementSelect.vue new
+200
@@ -0,0 +1,200 @@
1 +<template>
2 + <el-scrollbar class="page-element-select">
3 + <div class="page-header">
4 + <h1>
5 + Element Select
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/select" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-select v-model="value" placeholder="Select">
18 + <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
19 + </el-select>
20 + </el-collapse-item>
21 + <el-collapse-item title="Code" name="2">
22 + <pre v-highlightjs="code1"><code class="html"></code></pre>
23 + </el-collapse-item>
24 + </el-collapse>
25 + </div>
26 + <div class="card-base card-shadow--medium demo-box bg-white">
27 + <el-collapse value="1">
28 + <el-collapse-item title="Create new items" name="1">
29 + <el-select
30 + v-model="value10"
31 + multiple
32 + filterable
33 + allow-create
34 + default-first-option
35 + placeholder="Choose tags for your article"
36 + >
37 + <el-option v-for="item in options5" :key="item.value" :label="item.label" :value="item.value"> </el-option>
38 + </el-select>
39 + </el-collapse-item>
40 + <el-collapse-item title="Code" name="2">
41 + <pre v-highlightjs="code2"><code class="html"></code></pre>
42 + </el-collapse-item>
43 + </el-collapse>
44 + </div>
45 + </el-scrollbar>
46 +</template>
47 +
48 +<script>
49 +import ThemePicker from "@/components/theme-picker.vue"
50 +
51 +import { defineComponent } from "@vue/runtime-core"
52 +
53 +export default defineComponent({
54 + name: "ElementSelect",
55 + data() {
56 + return {
57 + options: [
58 + {
59 + value: "Option1",
60 + label: "Option1"
61 + },
62 + {
63 + value: "Option2",
64 + label: "Option2"
65 + },
66 + {
67 + value: "Option3",
68 + label: "Option3"
69 + },
70 + {
71 + value: "Option4",
72 + label: "Option4"
73 + },
74 + {
75 + value: "Option5",
76 + label: "Option5"
77 + }
78 + ],
79 + value: "",
80 + options5: [
81 + {
82 + value: "HTML",
83 + label: "HTML"
84 + },
85 + {
86 + value: "CSS",
87 + label: "CSS"
88 + },
89 + {
90 + value: "JavaScript",
91 + label: "JavaScript"
92 + }
93 + ],
94 + value10: [],
95 + code1: `
96 +<template>
97 + <el-select v-model="value" placeholder="Select">
98 + <el-option
99 + v-for="item in options"
100 + :key="item.value"
101 + :label="item.label"
102 + :value="item.value">
103 + </el-option>
104 + </el-select>
105 +</template>
106 +
107 +<script>
108 + import { defineComponent } from "@vue/runtime-core"
109 +
110 +export default defineComponent({
111 + data() {
112 + return {
113 + options: [{
114 + value: 'Option1',
115 + label: 'Option1'
116 + }, {
117 + value: 'Option2',
118 + label: 'Option2'
119 + }, {
120 + value: 'Option3',
121 + label: 'Option3'
122 + }, {
123 + value: 'Option4',
124 + label: 'Option4'
125 + }, {
126 + value: 'Option5',
127 + label: 'Option5'
128 + }],
129 + value: ''
130 + }
131 + }
132 + }
133 +<\/script>`,
134 + code2: `
135 +<template>
136 + <el-select
137 + v-model="value10"
138 + multiple
139 + filterable
140 + allow-create
141 + default-first-option
142 + placeholder="Choose tags for your article">
143 + <el-option
144 + v-for="item in options5"
145 + :key="item.value"
146 + :label="item.label"
147 + :value="item.value">
148 + </el-option>
149 + </el-select>
150 +</template>
151 +
152 +<script>
153 + import { defineComponent } from "@vue/runtime-core"
154 +
155 +export default defineComponent({
156 + data() {
157 + return {
158 + options5: [{
159 + value: 'HTML',
160 + label: 'HTML'
161 + }, {
162 + value: 'CSS',
163 + label: 'CSS'
164 + }, {
165 + value: 'JavaScript',
166 + label: 'JavaScript'
167 + }],
168 + value10: []
169 + }
170 + }
171 + }
172 +<\/script>
173 +`
174 + }
175 + },
176 + components: {
177 + ThemePicker
178 + }
179 +})
180 +</script>
181 +
182 +<style lang="scss" scoped>
183 +.demo-box {
184 + padding: 20px;
185 + margin-bottom: 20px;
186 +}
187 +pre {
188 + margin: 0;
189 + background: white;
190 +}
191 +code {
192 + padding: 0;
193 +}
194 +
195 +@media (max-width: 768px) {
196 + code {
197 + font-size: 70%;
198 + }
199 +}
200 +</style>
src/views/ui/Element/ElementSlider.vue new
+297
@@ -0,0 +1,297 @@
1 +<template>
2 + <div class="page-element-slider scrollable">
3 + <div class="page-header">
4 + <h1>
5 + Element Slider
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/slider" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="block">
18 + <span class="demonstration">Default value</span>
19 + <el-slider v-model="value1"></el-slider>
20 + </div>
21 + <div class="block">
22 + <span class="demonstration">Customized initial value</span>
23 + <el-slider v-model="value2"></el-slider>
24 + </div>
25 + <div class="block">
26 + <span class="demonstration">Hide Tooltip</span>
27 + <el-slider v-model="value3" :show-tooltip="false"></el-slider>
28 + </div>
29 + <div class="block">
30 + <span class="demonstration">Format Tooltip</span>
31 + <el-slider v-model="value4" :format-tooltip="formatTooltip"></el-slider>
32 + </div>
33 + <div class="block">
34 + <span class="demonstration">Disabled</span>
35 + <el-slider v-model="value5" disabled></el-slider>
36 + </div>
37 + </el-collapse-item>
38 + <el-collapse-item title="Code" name="2">
39 + <pre v-highlightjs="code1"><code class="html"></code></pre>
40 + </el-collapse-item>
41 + </el-collapse>
42 + </div>
43 + <div class="card-base card-shadow--medium demo-box bg-white">
44 + <el-collapse value="1">
45 + <el-collapse-item title="Discrete values" name="1">
46 + <div class="block">
47 + <span class="demonstration">Breakpoints not displayed</span>
48 + <el-slider v-model="value6" :step="10"> </el-slider>
49 + </div>
50 + <div class="block">
51 + <span class="demonstration">Breakpoints displayed</span>
52 + <el-slider v-model="value7" :step="10" show-stops> </el-slider>
53 + </div>
54 + </el-collapse-item>
55 + <el-collapse-item title="Code" name="2">
56 + <pre v-highlightjs="code2"><code class="html"></code></pre>
57 + </el-collapse-item>
58 + </el-collapse>
59 + </div>
60 + <div class="card-base card-shadow--medium demo-box bg-white">
61 + <el-collapse value="1">
62 + <el-collapse-item title="Slider with input box" name="1">
63 + <div class="block">
64 + <el-slider v-model="value8" show-input> </el-slider>
65 + </div>
66 + </el-collapse-item>
67 + <el-collapse-item title="Code" name="2">
68 + <pre v-highlightjs="code3"><code class="html"></code></pre>
69 + </el-collapse-item>
70 + </el-collapse>
71 + </div>
72 + <div class="card-base card-shadow--medium demo-box bg-white">
73 + <el-collapse value="1">
74 + <el-collapse-item title="Range selection" name="1">
75 + <div class="block">
76 + <el-slider v-model="value9" range show-stops :max="10"> </el-slider>
77 + </div>
78 + </el-collapse-item>
79 + <el-collapse-item title="Code" name="2">
80 + <pre v-highlightjs="code4"><code class="html"></code></pre>
81 + </el-collapse-item>
82 + </el-collapse>
83 + </div>
84 + <div class="card-base card-shadow--medium demo-box bg-white">
85 + <el-collapse value="1">
86 + <el-collapse-item title="Vertical mode" name="1">
87 + <div class="block">
88 + <el-slider v-model="value10" vertical height="200px"> </el-slider>
89 + </div>
90 + </el-collapse-item>
91 + <el-collapse-item title="Code" name="2">
92 + <pre v-highlightjs="code5"><code class="html"></code></pre>
93 + </el-collapse-item>
94 + </el-collapse>
95 + </div>
96 + </div>
97 +</template>
98 +
99 +<script>
100 +import ThemePicker from "@/components/theme-picker.vue"
101 +
102 +import { defineComponent } from "@vue/runtime-core"
103 +
104 +export default defineComponent({
105 + name: "ElementSlider",
106 + data() {
107 + return {
108 + value1: 0,
109 + value2: 50,
110 + value3: 36,
111 + value4: 48,
112 + value5: 42,
113 + value6: 0,
114 + value7: 0,
115 + value8: 0,
116 + value9: [4, 8],
117 + value10: 0,
118 + code1: `
119 +<template>
120 + <div class="block">
121 + <span class="demonstration">Default value</span>
122 + <el-slider v-model="value1"></el-slider>
123 + </div>
124 + <div class="block">
125 + <span class="demonstration">Customized initial value</span>
126 + <el-slider v-model="value2"></el-slider>
127 + </div>
128 + <div class="block">
129 + <span class="demonstration">Hide Tooltip</span>
130 + <el-slider v-model="value3" :show-tooltip="false"></el-slider>
131 + </div>
132 + <div class="block">
133 + <span class="demonstration">Format Tooltip</span>
134 + <el-slider v-model="value4" :format-tooltip="formatTooltip"></el-slider>
135 + </div>
136 + <div class="block">
137 + <span class="demonstration">Disabled</span>
138 + <el-slider v-model="value5" disabled></el-slider>
139 + </div>
140 +</template>
141 +
142 +<script>
143 + import { defineComponent } from "@vue/runtime-core"
144 +
145 +export default defineComponent({
146 + data() {
147 + return {
148 + value1: 0,
149 + value2: 50,
150 + value3: 36,
151 + value4: 48,
152 + value5: 42
153 + }
154 + },
155 + methods: {
156 + formatTooltip(val) {
157 + return val / 100;
158 + }
159 + }
160 + }
161 +<\/script>`,
162 + code2: `
163 +<template>
164 + <div class="block">
165 + <span class="demonstration">Breakpoints not displayed</span>
166 + <el-slider
167 + v-model="value6"
168 + :step="10">
169 + </el-slider>
170 + </div>
171 + <div class="block">
172 + <span class="demonstration">Breakpoints displayed</span>
173 + <el-slider
174 + v-model="value7"
175 + :step="10"
176 + show-stops>
177 + </el-slider>
178 + </div>
179 +</template>
180 +
181 +<script>
182 + import { defineComponent } from "@vue/runtime-core"
183 +
184 +export default defineComponent({
185 + data() {
186 + return {
187 + value6: 0,
188 + value7: 0
189 + }
190 + }
191 + }
192 +<\/script>
193 +`,
194 + code3: `
195 +<template>
196 + <div class="block">
197 + <el-slider
198 + v-model="value8"
199 + show-input>
200 + </el-slider>
201 + </div>
202 +</template>
203 +
204 +<script>
205 + import { defineComponent } from "@vue/runtime-core"
206 +
207 +export default defineComponent({
208 + data() {
209 + return {
210 + value8: 0
211 + }
212 + }
213 + }
214 +<\/script>
215 +`,
216 + code4: `
217 +<template>
218 + <div class="block">
219 + <el-slider
220 + v-model="value9"
221 + range
222 + show-stops
223 + :max="10">
224 + </el-slider>
225 + </div>
226 +</template>
227 +
228 +<script>
229 + import { defineComponent } from "@vue/runtime-core"
230 +
231 +export default defineComponent({
232 + data() {
233 + return {
234 + value9: [4, 8]
235 + }
236 + }
237 + }
238 +<\/script>
239 +`,
240 + code5: `
241 +<template>
242 + <div class="block">
243 + <el-slider
244 + v-model="value10"
245 + vertical
246 + height="200px">
247 + </el-slider>
248 + </div>
249 +</template>
250 +
251 +<script>
252 + import { defineComponent } from "@vue/runtime-core"
253 +
254 +export default defineComponent({
255 + data() {
256 + return {
257 + value10: 0
258 + }
259 + }
260 + }
261 +<\/script>
262 +`
263 + }
264 + },
265 + methods: {
266 + formatTooltip(val) {
267 + return val / 100
268 + }
269 + },
270 + components: {
271 + ThemePicker
272 + }
273 +})
274 +</script>
275 +
276 +<style lang="scss" scoped>
277 +.demo-box {
278 + padding: 20px;
279 + margin-bottom: 20px;
280 +}
281 +pre {
282 + margin: 0;
283 + background: white;
284 +}
285 +code {
286 + padding: 0;
287 +}
288 +.block {
289 + padding: 15px;
290 +}
291 +
292 +@media (max-width: 768px) {
293 + code {
294 + font-size: 70%;
295 + }
296 +}
297 +</style>
src/views/ui/Element/ElementSteps.vue new
+202
@@ -0,0 +1,202 @@
1 +<template>
2 + <el-scrollbar class="page-element-steps">
3 + <div class="page-header">
4 + <h1>
5 + Element Steps
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/steps" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-steps :active="active" finish-status="success">
18 + <el-step title="Step 1"></el-step>
19 + <el-step title="Step 2"></el-step>
20 + <el-step title="Step 3"></el-step>
21 + </el-steps>
22 +
23 + <el-button style="margin-top: 12px" @click="next">Next step</el-button>
24 + </el-collapse-item>
25 + <el-collapse-item title="Code" name="2">
26 + <pre v-highlightjs="code1"><code class="html"></code></pre>
27 + </el-collapse-item>
28 + </el-collapse>
29 + </div>
30 + <div class="card-base card-shadow--medium demo-box bg-white">
31 + <el-collapse value="1">
32 + <el-collapse-item title="Center" name="1">
33 + <el-steps :active="2" align-center>
34 + <el-step title="Step 1" description="Some description"></el-step>
35 + <el-step title="Step 2" description="Some description"></el-step>
36 + <el-step title="Step 3" description="Some description"></el-step>
37 + <el-step title="Step 4" description="Some description"></el-step>
38 + </el-steps>
39 + </el-collapse-item>
40 + <el-collapse-item title="Code" name="2">
41 + <pre v-highlightjs="code2"><code class="html"></code></pre>
42 + </el-collapse-item>
43 + </el-collapse>
44 + </div>
45 + <div class="card-base card-shadow--medium demo-box bg-white">
46 + <el-collapse value="1">
47 + <el-collapse-item title="Step bar with icon" name="1">
48 + <el-steps :active="1">
49 + <el-step title="Step 1" icon="el-icon-edit"></el-step>
50 + <el-step title="Step 2" icon="el-icon-upload"></el-step>
51 + <el-step title="Step 3" icon="el-icon-picture"></el-step>
52 + </el-steps>
53 + </el-collapse-item>
54 + <el-collapse-item title="Code" name="2">
55 + <pre v-highlightjs="code3"><code class="html"></code></pre>
56 + </el-collapse-item>
57 + </el-collapse>
58 + </div>
59 + <div class="card-base card-shadow--medium demo-box bg-white">
60 + <el-collapse value="1">
61 + <el-collapse-item title="Vertical step bar" name="1">
62 + <div style="height: 300px">
63 + <el-steps direction="vertical" :active="1">
64 + <el-step title="Step 1"></el-step>
65 + <el-step title="Step 2"></el-step>
66 + <el-step title="Step 3"></el-step>
67 + </el-steps>
68 + </div>
69 + </el-collapse-item>
70 + <el-collapse-item title="Code" name="2">
71 + <pre v-highlightjs="code4"><code class="html"></code></pre>
72 + </el-collapse-item>
73 + </el-collapse>
74 + </div>
75 + <div class="card-base card-shadow--medium demo-box bg-white hidden-xs-only">
76 + <el-collapse value="1">
77 + <el-collapse-item title="Simple step bar" name="1">
78 + <el-steps :space="200" :active="1" simple>
79 + <el-step title="Step 1" icon="el-icon-edit"></el-step>
80 + <el-step title="Step 2" icon="el-icon-upload"></el-step>
81 + <el-step title="Step 3" icon="el-icon-picture"></el-step>
82 + </el-steps>
83 +
84 + <el-steps :active="1" finish-status="success" simple style="margin-top: 20px">
85 + <el-step title="Step 1"></el-step>
86 + <el-step title="Step 2"></el-step>
87 + <el-step title="Step 3"></el-step>
88 + </el-steps>
89 + </el-collapse-item>
90 + <el-collapse-item title="Code" name="2">
91 + <pre v-highlightjs="code5"><code class="html"></code></pre>
92 + </el-collapse-item>
93 + </el-collapse>
94 + </div>
95 + </el-scrollbar>
96 +</template>
97 +
98 +<script>
99 +import ThemePicker from "@/components/theme-picker.vue"
100 +
101 +import { defineComponent } from "@vue/runtime-core"
102 +
103 +export default defineComponent({
104 + name: "ElementSteps",
105 + methods: {
106 + next() {
107 + if (this.active++ > 2) this.active = 0
108 + }
109 + },
110 + data() {
111 + return {
112 + active: 0,
113 + code1: `
114 +<el-steps :active="active" finish-status="success">
115 + <el-step title="Step 1"></el-step>
116 + <el-step title="Step 2"></el-step>
117 + <el-step title="Step 3"></el-step>
118 +</el-steps>
119 +
120 +<el-button style="margin-top: 12px;" @click="next">Next step</el-button>
121 +
122 +<script>
123 + import { defineComponent } from "@vue/runtime-core"
124 +
125 +export default defineComponent({
126 + data() {
127 + return {
128 + active: 0
129 + };
130 + },
131 +
132 + methods: {
133 + next() {
134 + if (this.active++ > 2) this.active = 0;
135 + }
136 + }
137 + }
138 +<\/script>`,
139 + code2: `
140 +<el-steps :active="2" align-center>
141 + <el-step title="Step 1" description="Some description"></el-step>
142 + <el-step title="Step 2" description="Some description"></el-step>
143 + <el-step title="Step 3" description="Some description"></el-step>
144 + <el-step title="Step 4" description="Some description"></el-step>
145 +</el-steps>
146 +`,
147 + code3: `
148 +<el-steps :active="1">
149 + <el-step title="Step 1" icon="el-icon-edit"></el-step>
150 + <el-step title="Step 2" icon="el-icon-upload"></el-step>
151 + <el-step title="Step 3" icon="el-icon-picture"></el-step>
152 +</el-steps>
153 +`,
154 + code4: `
155 +<div style="height: 300px;">
156 + <el-steps direction="vertical" :active="1">
157 + <el-step title="Step 1"></el-step>
158 + <el-step title="Step 2"></el-step>
159 + <el-step title="Step 3"></el-step>
160 + </el-steps>
161 +</div>
162 +`,
163 + code5: `
164 +<el-steps :space="200" :active="1" simple>
165 + <el-step title="Step 1" icon="el-icon-edit"></el-step>
166 + <el-step title="Step 2" icon="el-icon-upload"></el-step>
167 + <el-step title="Step 3" icon="el-icon-picture"></el-step>
168 +</el-steps>
169 +
170 +<el-steps :active="1" finish-status="success" simple style="margin-top: 20px">
171 + <el-step title="Step 1" ></el-step>
172 + <el-step title="Step 2" ></el-step>
173 + <el-step title="Step 3" ></el-step>
174 +</el-steps>
175 +`
176 + }
177 + },
178 + components: {
179 + ThemePicker
180 + }
181 +})
182 +</script>
183 +
184 +<style lang="scss" scoped>
185 +.demo-box {
186 + padding: 20px;
187 + margin-bottom: 20px;
188 +}
189 +pre {
190 + margin: 0;
191 + background: white;
192 +}
193 +code {
194 + padding: 0;
195 +}
196 +
197 +@media (max-width: 768px) {
198 + code {
199 + font-size: 70%;
200 + }
201 +}
202 +</style>
src/views/ui/Element/ElementSwitch.vue new
+74
@@ -0,0 +1,74 @@
1 +<template>
2 + <el-scrollbar class="page-element-switch">
3 + <div class="page-header">
4 + <h1>
5 + Element Switch
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/switch" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <el-switch v-model="value1"> </el-switch>
18 + &nbsp;
19 + <el-switch v-model="value2" active-color="#13ce66" inactive-color="#ff4949"> </el-switch>
20 + </el-collapse-item>
21 + <el-collapse-item title="Code" name="2">
22 + <pre v-highlightjs="code1"><code class="html"></code></pre>
23 + </el-collapse-item>
24 + </el-collapse>
25 + </div>
26 + </el-scrollbar>
27 +</template>
28 +
29 +<script>
30 +import ThemePicker from "@/components/theme-picker.vue"
31 +
32 +import { defineComponent } from "@vue/runtime-core"
33 +
34 +export default defineComponent({
35 + name: "ElementSwitch",
36 + data() {
37 + return {
38 + value1: true,
39 + value2: true,
40 + code1: `
41 +<el-switch v-model="value1">
42 +</el-switch>
43 +<el-switch
44 + v-model="value2"
45 + active-color="#13ce66"
46 + inactive-color="#ff4949">
47 +</el-switch>`
48 + }
49 + },
50 + components: {
51 + ThemePicker
52 + }
53 +})
54 +</script>
55 +
56 +<style lang="scss" scoped>
57 +.demo-box {
58 + padding: 20px;
59 + margin-bottom: 20px;
60 +}
61 +pre {
62 + margin: 0;
63 + background: white;
64 +}
65 +code {
66 + padding: 0;
67 +}
68 +
69 +@media (max-width: 768px) {
70 + code {
71 + font-size: 70%;
72 + }
73 +}
74 +</style>
src/views/ui/Element/ElementTabs.vue new
+266
@@ -0,0 +1,266 @@
1 +<template>
2 + <el-scrollbar class="page-element-tabs">
3 + <div class="page-header">
4 + <h1>
5 + Element Tabs
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/tabs" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Tab position" name="1">
17 + <el-radio-group v-model="tabPosition" style="margin-bottom: 30px">
18 + <el-radio-button label="top">top</el-radio-button>
19 + <el-radio-button label="right">right</el-radio-button>
20 + <el-radio-button label="bottom">bottom</el-radio-button>
21 + <el-radio-button label="left">left</el-radio-button>
22 + </el-radio-group>
23 +
24 + <el-tabs :tab-position="tabPosition" style="height: 200px">
25 + <el-tab-pane label="User">User</el-tab-pane>
26 + <el-tab-pane label="Config">Config</el-tab-pane>
27 + <el-tab-pane label="Role">Role</el-tab-pane>
28 + <el-tab-pane label="Task">Task</el-tab-pane>
29 + </el-tabs>
30 + </el-collapse-item>
31 + <el-collapse-item title="Code" name="2">
32 + <pre v-highlightjs="code1"><code class="html"></code></pre>
33 + </el-collapse-item>
34 + </el-collapse>
35 + </div>
36 + <div class="card-base card-shadow--medium demo-box bg-white">
37 + <el-collapse value="1">
38 + <el-collapse-item title="Custom Tab" name="1">
39 + <el-tabs type="border-card">
40 + <el-tab-pane>
41 + <span slot="label"><i class="el-icon-date"></i> Route</span>
42 + Route
43 + </el-tab-pane>
44 + <el-tab-pane label="Config">Config</el-tab-pane>
45 + <el-tab-pane label="Role">Role</el-tab-pane>
46 + <el-tab-pane label="Task">Task</el-tab-pane>
47 + </el-tabs>
48 + </el-collapse-item>
49 + <el-collapse-item title="Code" name="2">
50 + <pre v-highlightjs="code2"><code class="html"></code></pre>
51 + </el-collapse-item>
52 + </el-collapse>
53 + </div>
54 + <div class="card-base card-shadow--medium demo-box bg-white">
55 + <el-collapse value="1">
56 + <el-collapse-item title="Customized trigger button of new tab" name="1">
57 + <div style="margin-bottom: 20px">
58 + <el-button size="small" @click="addTab(editableTabsValue2)"> add tab </el-button>
59 + </div>
60 + <el-tabs v-model="editableTabsValue2" type="card" closable @tab-remove="removeTab">
61 + <el-tab-pane v-for="item in editableTabs2" :key="item.name" :label="item.title" :name="item.name">
62 + {{ item.content }}
63 + </el-tab-pane>
64 + </el-tabs>
65 + </el-collapse-item>
66 + <el-collapse-item title="Code" name="2">
67 + <pre v-highlightjs="code3"><code class="html"></code></pre>
68 + </el-collapse-item>
69 + </el-collapse>
70 + </div>
71 + </el-scrollbar>
72 +</template>
73 +
74 +<script>
75 +import ThemePicker from "@/components/theme-picker.vue"
76 +
77 +import { defineComponent } from "@vue/runtime-core"
78 +
79 +export default defineComponent({
80 + name: "ElementTabs",
81 + methods: {
82 + addTab(targetName) {
83 + let newTabName = ++this.tabIndex + ""
84 + this.editableTabs2.push({
85 + title: "New Tab",
86 + name: newTabName,
87 + content: "New Tab content"
88 + })
89 + this.editableTabsValue2 = newTabName
90 + },
91 + removeTab(targetName) {
92 + let tabs = this.editableTabs2
93 + let activeName = this.editableTabsValue2
94 + if (activeName === targetName) {
95 + tabs.forEach((tab, index) => {
96 + if (tab.name === targetName) {
97 + let nextTab = tabs[index + 1] || tabs[index - 1]
98 + if (nextTab) {
99 + activeName = nextTab.name
100 + }
101 + }
102 + })
103 + }
104 +
105 + this.editableTabsValue2 = activeName
106 + this.editableTabs2 = tabs.filter(tab => tab.name !== targetName)
107 + }
108 + },
109 + data() {
110 + return {
111 + editableTabsValue2: "2",
112 + editableTabs2: [
113 + {
114 + title: "Tab 1",
115 + name: "1",
116 + content: "Tab 1 content"
117 + },
118 + {
119 + title: "Tab 2",
120 + name: "2",
121 + content: "Tab 2 content"
122 + }
123 + ],
124 + tabIndex: 2,
125 + tabPosition: "top",
126 + code1: `
127 +<template>
128 + <el-radio-group v-model="tabPosition" style="margin-bottom: 30px;">
129 + <el-radio-button label="top">top</el-radio-button>
130 + <el-radio-button label="right">right</el-radio-button>
131 + <el-radio-button label="bottom">bottom</el-radio-button>
132 + <el-radio-button label="left">left</el-radio-button>
133 + </el-radio-group>
134 +
135 + <el-tabs :tab-position="tabPosition" style="height: 200px;">
136 + <el-tab-pane label="User">User</el-tab-pane>
137 + <el-tab-pane label="Config">Config</el-tab-pane>
138 + <el-tab-pane label="Role">Role</el-tab-pane>
139 + <el-tab-pane label="Task">Task</el-tab-pane>
140 + </el-tabs>
141 +</template>
142 +<script>
143 + import { defineComponent } from "@vue/runtime-core"
144 +
145 +export default defineComponent({
146 + data() {
147 + return {
148 + tabPosition: 'top'
149 + };
150 + }
151 + };
152 +<\/script>
153 +`,
154 + code2: `
155 +<el-tabs type="border-card">
156 + <el-tab-pane>
157 + <span slot="label"><i class="el-icon-date"></i> Route</span>
158 + Route
159 + </el-tab-pane>
160 + <el-tab-pane label="Config">Config</el-tab-pane>
161 + <el-tab-pane label="Role">Role</el-tab-pane>
162 + <el-tab-pane label="Task">Task</el-tab-pane>
163 +</el-tabs>
164 +`,
165 + code3: `
166 +<div style="margin-bottom: 20px;">
167 + <el-button
168 + size="small"
169 + @click="addTab(editableTabsValue2)"
170 + >
171 + add tab
172 + </el-button>
173 +</div>
174 +<el-tabs v-model="editableTabsValue2" type="card" closable @tab-remove="removeTab">
175 + <el-tab-pane
176 + v-for="(item, index) in editableTabs2"
177 + :key="item.name"
178 + :label="item.title"
179 + :name="item.name"
180 + >
181 + {{item.content}}
182 + </el-tab-pane>
183 +</el-tabs>
184 +<script>
185 + import { defineComponent } from "@vue/runtime-core"
186 +
187 +export default defineComponent({
188 + data() {
189 + return {
190 + editableTabsValue2: '2',
191 + editableTabs2: [{
192 + title: 'Tab 1',
193 + name: '1',
194 + content: 'Tab 1 content'
195 + }, {
196 + title: 'Tab 2',
197 + name: '2',
198 + content: 'Tab 2 content'
199 + }],
200 + tabIndex: 2
201 + }
202 + },
203 + methods: {
204 + addTab(targetName) {
205 + let newTabName = ++this.tabIndex + '';
206 + this.editableTabs2.push({
207 + title: 'New Tab',
208 + name: newTabName,
209 + content: 'New Tab content'
210 + });
211 + this.editableTabsValue2 = newTabName;
212 + },
213 + removeTab(targetName) {
214 + let tabs = this.editableTabs2;
215 + let activeName = this.editableTabsValue2;
216 + if (activeName === targetName) {
217 + tabs.forEach((tab, index) => {
218 + if (tab.name === targetName) {
219 + let nextTab = tabs[index + 1] || tabs[index - 1];
220 + if (nextTab) {
221 + activeName = nextTab.name;
222 + }
223 + }
224 + });
225 + }
226 +
227 + this.editableTabsValue2 = activeName;
228 + this.editableTabs2 = tabs.filter(tab => tab.name !== targetName);
229 + }
230 + }
231 + }
232 +<\/script>
233 +`
234 + }
235 + },
236 + components: {
237 + ThemePicker
238 + }
239 +})
240 +</script>
241 +
242 +<style lang="scss" scoped>
243 +.demo-box {
244 + padding: 20px;
245 + margin-bottom: 20px;
246 +}
247 +pre {
248 + margin: 0;
249 + background: white;
250 +}
251 +code {
252 + padding: 0;
253 +}
254 +
255 +@media (max-width: 768px) {
256 + code {
257 + font-size: 70%;
258 + }
259 +}
260 +</style>
261 +
262 +<style lang="scss">
263 +.page-element-tabs .el-radio-button__inner {
264 + padding: 10px 14px;
265 +}
266 +</style>
src/views/ui/Element/ElementTag.vue new
+188
@@ -0,0 +1,188 @@
1 +<template>
2 + <el-scrollbar class="page-element-tag">
3 + <div class="page-header">
4 + <h1>
5 + Element Tag
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/tag" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Edit Dynamically" name="1">
17 + <el-tag :key="tag" v-for="tag in dynamicTags" closable :disable-transitions="false" @close="handleClose(tag)">
18 + {{ tag }}
19 + </el-tag>
20 + <el-input
21 + class="input-new-tag"
22 + v-if="inputVisible"
23 + v-model="inputValue"
24 + ref="saveTagInput"
25 + size="small"
26 + @keyup.enter.native="handleInputConfirm"
27 + @blur="handleInputConfirm"
28 + >
29 + </el-input>
30 + <el-button v-else class="button-new-tag" size="small" @click="showInput">+ New Tag</el-button>
31 + </el-collapse-item>
32 + <el-collapse-item title="Code" name="2">
33 + <pre v-highlightjs="code1"><code class="html"></code></pre>
34 + </el-collapse-item>
35 + </el-collapse>
36 + </div>
37 + </el-scrollbar>
38 +</template>
39 +
40 +<script>
41 +import ThemePicker from "@/components/theme-picker.vue"
42 +
43 +import { defineComponent } from "@vue/runtime-core"
44 +
45 +export default defineComponent({
46 + name: "ElementTag",
47 + data() {
48 + return {
49 + dynamicTags: ["Tag 1", "Tag 2", "Tag 3"],
50 + inputVisible: false,
51 + inputValue: "",
52 + code1: `
53 +<el-tag
54 + :key="tag"
55 + v-for="tag in dynamicTags"
56 + closable
57 + :disable-transitions="false"
58 + @close="handleClose(tag)">
59 + {{tag}}
60 +</el-tag>
61 +<el-input
62 + class="input-new-tag"
63 + v-if="inputVisible"
64 + v-model="inputValue"
65 + ref="saveTagInput"
66 + size="small"
67 + @keyup.enter.native="handleInputConfirm"
68 + @blur="handleInputConfirm"
69 +>
70 +</el-input>
71 +<el-button v-else class="button-new-tag" size="small" @click="showInput">+ New Tag</el-button>
72 +
73 +<style>
74 + .el-tag + .el-tag {
75 + margin-left: 10px;
76 + }
77 + .button-new-tag {
78 + margin-left: 10px;
79 + height: 32px;
80 + line-height: 30px;
81 + padding-top: 0;
82 + padding-bottom: 0;
83 + }
84 + .input-new-tag {
85 + width: 90px;
86 + margin-left: 10px;
87 + vertical-align: bottom;
88 + }
89 +</style>
90 +
91 +<script>
92 + import { defineComponent } from "@vue/runtime-core"
93 +
94 +export default defineComponent({
95 + data() {
96 + return {
97 + dynamicTags: ['Tag 1', 'Tag 2', 'Tag 3'],
98 + inputVisible: false,
99 + inputValue: ''
100 + };
101 + },
102 + methods: {
103 + handleClose(tag) {
104 + this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
105 + },
106 +
107 + showInput() {
108 + this.inputVisible = true;
109 + this.$nextTick(_ => {
110 + this.$refs.saveTagInput.$refs.input.focus();
111 + });
112 + },
113 +
114 + handleInputConfirm() {
115 + let inputValue = this.inputValue;
116 + if (inputValue) {
117 + this.dynamicTags.push(inputValue);
118 + }
119 + this.inputVisible = false;
120 + this.inputValue = '';
121 + }
122 + }
123 + }
124 +<\/script>`
125 + }
126 + },
127 + methods: {
128 + handleClose(tag) {
129 + this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1)
130 + },
131 +
132 + showInput() {
133 + this.inputVisible = true
134 + this.$nextTick(_ => {
135 + this.$refs.saveTagInput.$refs.input.focus()
136 + })
137 + },
138 +
139 + handleInputConfirm() {
140 + let inputValue = this.inputValue
141 + if (inputValue) {
142 + this.dynamicTags.push(inputValue)
143 + }
144 + this.inputVisible = false
145 + this.inputValue = ""
146 + }
147 + },
148 + components: {
149 + ThemePicker
150 + }
151 +})
152 +</script>
153 +
154 +<style lang="scss" scoped>
155 +.demo-box {
156 + padding: 20px;
157 + margin-bottom: 20px;
158 +}
159 +pre {
160 + margin: 0;
161 + background: white;
162 +}
163 +code {
164 + padding: 0;
165 +}
166 +
167 +@media (max-width: 768px) {
168 + code {
169 + font-size: 70%;
170 + }
171 +}
172 +
173 +.el-tag + .el-tag {
174 + margin-left: 10px;
175 +}
176 +.button-new-tag {
177 + margin-left: 10px;
178 + height: 32px;
179 + line-height: 30px;
180 + padding-top: 0;
181 + padding-bottom: 0;
182 +}
183 +.input-new-tag {
184 + width: 90px;
185 + margin-left: 10px;
186 + vertical-align: bottom;
187 +}
188 +</style>
src/views/ui/Element/ElementTimePicker.vue new
+243
@@ -0,0 +1,243 @@
1 +<template>
2 + <el-scrollbar class="page-element-time-picker">
3 + <div class="page-header">
4 + <h1>
5 + Element Time Picker
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/time-picker" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Arbitrary time picker" name="1">
17 + <el-time-picker
18 + v-model="value2"
19 + :picker-options="{
20 + selectableRange: '18:30:00 - 20:30:00'
21 + }"
22 + placeholder="Arbitrary time"
23 + >
24 + </el-time-picker>
25 + &nbsp;
26 + <el-time-picker
27 + arrow-control
28 + v-model="value3"
29 + :picker-options="{
30 + selectableRange: '18:30:00 - 20:30:00'
31 + }"
32 + placeholder="Arbitrary time"
33 + >
34 + </el-time-picker>
35 + </el-collapse-item>
36 + <el-collapse-item title="Code" name="2">
37 + <pre v-highlightjs="code1"><code class="html"></code></pre>
38 + </el-collapse-item>
39 + </el-collapse>
40 + </div>
41 + <div class="card-base card-shadow--medium demo-box bg-white">
42 + <el-collapse value="1">
43 + <el-collapse-item title="Fixed time range" name="1">
44 + <el-time-select
45 + placeholder="Start time"
46 + v-model="startTime"
47 + :picker-options="{
48 + start: '08:30',
49 + step: '00:15',
50 + end: '18:30'
51 + }"
52 + >
53 + </el-time-select>
54 + &nbsp;
55 + <el-time-select
56 + placeholder="End time"
57 + v-model="endTime"
58 + :picker-options="{
59 + start: '08:30',
60 + step: '00:15',
61 + end: '18:30',
62 + minTime: startTime
63 + }"
64 + >
65 + </el-time-select>
66 + </el-collapse-item>
67 + <el-collapse-item title="Code" name="2">
68 + <pre v-highlightjs="code2"><code class="html"></code></pre>
69 + </el-collapse-item>
70 + </el-collapse>
71 + </div>
72 + <div class="card-base card-shadow--medium demo-box bg-white hidden-xs-only">
73 + <el-collapse value="1">
74 + <el-collapse-item title="Arbitrary time range" name="1">
75 + <el-time-picker
76 + is-range
77 + v-model="value4"
78 + range-separator="To"
79 + start-placeholder="Start time"
80 + end-placeholder="End time"
81 + >
82 + </el-time-picker>
83 + &nbsp;
84 + <el-time-picker
85 + is-range
86 + arrow-control
87 + v-model="value5"
88 + range-separator="To"
89 + start-placeholder="Start time"
90 + end-placeholder="End time"
91 + >
92 + </el-time-picker>
93 + </el-collapse-item>
94 + <el-collapse-item title="Code" name="2">
95 + <pre v-highlightjs="code3"><code class="html"></code></pre>
96 + </el-collapse-item>
97 + </el-collapse>
98 + </div>
99 + </el-scrollbar>
100 +</template>
101 +
102 +<script>
103 +import ThemePicker from "@/components/theme-picker.vue"
104 +
105 +import { defineComponent } from "@vue/runtime-core"
106 +
107 +export default defineComponent({
108 + name: "ElementTimePicker",
109 + data() {
110 + return {
111 + value2: new Date(2016, 9, 10, 18, 40),
112 + value3: new Date(2016, 9, 10, 18, 40),
113 + startTime: "",
114 + endTime: "",
115 + value4: [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
116 + value5: [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
117 + code1: `
118 +<template>
119 + <el-time-picker
120 + v-model="value2"
121 + :picker-options="{
122 + selectableRange: '18:30:00 - 20:30:00'
123 + }"
124 + placeholder="Arbitrary time">
125 + </el-time-picker>
126 + <el-time-picker
127 + arrow-control
128 + v-model="value3"
129 + :picker-options="{
130 + selectableRange: '18:30:00 - 20:30:00'
131 + }"
132 + placeholder="Arbitrary time">
133 + </el-time-picker>
134 +</template>
135 +
136 +<script>
137 + import { defineComponent } from "@vue/runtime-core"
138 +
139 +export default defineComponent({
140 + data() {
141 + return {
142 + value2: new Date(2016, 9, 10, 18, 40),
143 + value3: new Date(2016, 9, 10, 18, 40)
144 + };
145 + }
146 + }
147 +<\/script>
148 +`,
149 + code2: `
150 +<template>
151 + <el-time-select
152 + placeholder="Start time"
153 + v-model="startTime"
154 + :picker-options="{
155 + start: '08:30',
156 + step: '00:15',
157 + end: '18:30'
158 + }">
159 + </el-time-select>
160 + <el-time-select
161 + placeholder="End time"
162 + v-model="endTime"
163 + :picker-options="{
164 + start: '08:30',
165 + step: '00:15',
166 + end: '18:30',
167 + minTime: startTime
168 + }">
169 + </el-time-select>
170 +</template>
171 +
172 +<script>
173 + import { defineComponent } from "@vue/runtime-core"
174 +
175 +export default defineComponent({
176 + data() {
177 + return {
178 + startTime: '',
179 + endTime: ''
180 + };
181 + }
182 + }
183 +<\/script>
184 +`,
185 + code3: `
186 +<template>
187 + <el-time-picker
188 + is-range
189 + v-model="value4"
190 + range-separator="To"
191 + start-placeholder="Start time"
192 + end-placeholder="End time">
193 + </el-time-picker>
194 + <el-time-picker
195 + is-range
196 + arrow-control
197 + v-model="value5"
198 + range-separator="To"
199 + start-placeholder="Start time"
200 + end-placeholder="End time">
201 + </el-time-picker>
202 +</template>
203 +
204 +<script>
205 + import { defineComponent } from "@vue/runtime-core"
206 +
207 +export default defineComponent({
208 + data() {
209 + return {
210 + value4: [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)],
211 + value5: [new Date(2016, 9, 10, 8, 40), new Date(2016, 9, 10, 9, 40)]
212 + };
213 + }
214 + }
215 +<\/script>
216 +`
217 + }
218 + },
219 + components: {
220 + ThemePicker
221 + }
222 +})
223 +</script>
224 +
225 +<style lang="scss" scoped>
226 +.demo-box {
227 + padding: 20px;
228 + margin-bottom: 20px;
229 +}
230 +pre {
231 + margin: 0;
232 + background: white;
233 +}
234 +code {
235 + padding: 0;
236 +}
237 +
238 +@media (max-width: 768px) {
239 + code {
240 + font-size: 70%;
241 + }
242 +}
243 +</style>
src/views/ui/Element/ElementTimeline.vue new
+269
@@ -0,0 +1,269 @@
1 +<template>
2 + <el-scrollbar class="page-element-timeline">
3 + <div class="page-header">
4 + <h1>
5 + Element Timeline
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/timeline" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="radio">
18 + Order:
19 + <el-radio-group v-model="reverse">
20 + <el-radio :label="true">descending</el-radio>
21 + <el-radio :label="false">ascending</el-radio>
22 + </el-radio-group>
23 + </div>
24 +
25 + <el-timeline :reverse="reverse">
26 + <el-timeline-item v-for="(activity, index) in activities" :key="index" :timestamp="activity.timestamp">
27 + {{ activity.content }}
28 + </el-timeline-item>
29 + </el-timeline>
30 + </el-collapse-item>
31 + <el-collapse-item title="Code" name="2">
32 + <pre v-highlightjs="code1"><code class="html"></code></pre>
33 + </el-collapse-item>
34 + </el-collapse>
35 + </div>
36 + <div class="card-base card-shadow--medium demo-box bg-white">
37 + <el-collapse value="1">
38 + <el-collapse-item title="Custom node" name="1">
39 + <el-timeline>
40 + <el-timeline-item
41 + v-for="(activity, index) in activities2"
42 + :key="index"
43 + :icon="activity.icon"
44 + :type="activity.type"
45 + :color="activity.color"
46 + :size="activity.size"
47 + :timestamp="activity.timestamp"
48 + >
49 + {{ activity.content }}
50 + </el-timeline-item>
51 + </el-timeline>
52 + </el-collapse-item>
53 + <el-collapse-item title="Code" name="2">
54 + <pre v-highlightjs="code2"><code class="html"></code></pre>
55 + </el-collapse-item>
56 + </el-collapse>
57 + </div>
58 + <div class="card-base card-shadow--medium demo-box bg-white">
59 + <el-collapse value="1">
60 + <el-collapse-item title="Custom timestamp" name="1">
61 + <el-timeline>
62 + <el-timeline-item timestamp="2018/4/12" placement="top">
63 + <el-card>
64 + <h4>Update Github template</h4>
65 + <p>Tom committed 2018/4/12 20:46</p>
66 + </el-card>
67 + </el-timeline-item>
68 + <el-timeline-item timestamp="2018/4/3" placement="top">
69 + <el-card>
70 + <h4>Update Github template</h4>
71 + <p>Tom committed 2018/4/3 20:46</p>
72 + </el-card>
73 + </el-timeline-item>
74 + <el-timeline-item timestamp="2018/4/2" placement="top">
75 + <el-card>
76 + <h4>Update Github template</h4>
77 + <p>Tom committed 2018/4/2 20:46</p>
78 + </el-card>
79 + </el-timeline-item>
80 + </el-timeline>
81 + </el-collapse-item>
82 + <el-collapse-item title="Code" name="2">
83 + <pre v-highlightjs="code3"><code class="html"></code></pre>
84 + </el-collapse-item>
85 + </el-collapse>
86 + </div>
87 + </el-scrollbar>
88 +</template>
89 +
90 +<script>
91 +import ThemePicker from "@/components/theme-picker.vue"
92 +
93 +import { defineComponent } from "@vue/runtime-core"
94 +
95 +export default defineComponent({
96 + name: "ElementTimeline",
97 + data() {
98 + return {
99 + reverse: true,
100 + activities: [
101 + {
102 + content: "Event start",
103 + timestamp: "2018-04-15"
104 + },
105 + {
106 + content: "Approved",
107 + timestamp: "2018-04-13"
108 + },
109 + {
110 + content: "Success",
111 + timestamp: "2018-04-11"
112 + }
113 + ],
114 + activities2: [
115 + {
116 + content: "Custom icon",
117 + timestamp: "2018-04-12 20:46",
118 + size: "large",
119 + type: "primary",
120 + icon: "el-icon-more"
121 + },
122 + {
123 + content: "Custom color",
124 + timestamp: "2018-04-03 20:46",
125 + color: "#0bbd87"
126 + },
127 + {
128 + content: "Custom size",
129 + timestamp: "2018-04-03 20:46",
130 + size: "large"
131 + },
132 + {
133 + content: "Default node",
134 + timestamp: "2018-04-03 20:46"
135 + }
136 + ],
137 + code1: `
138 +<template>
139 + <div class="radio">
140 + Order:
141 + <el-radio-group v-model="reverse">
142 + <el-radio :label="true">descending</el-radio>
143 + <el-radio :label="false">ascending</el-radio>
144 + </el-radio-group>
145 + </div>
146 +
147 + <el-timeline :reverse="reverse">
148 + <el-timeline-item
149 + v-for="(activity, index) in activities"
150 + :key="index"
151 + :timestamp="activity.timestamp">
152 + {{activity.content}}
153 + </el-timeline-item>
154 + </el-timeline>
155 +</template>
156 +
157 +<script>
158 + import { defineComponent } from "@vue/runtime-core"
159 +
160 +export default defineComponent({
161 + data() {
162 + return {
163 + reverse: true,
164 + activities: [{
165 + content: 'Event start',
166 + timestamp: '2018-04-15'
167 + }, {
168 + content: 'Approved',
169 + timestamp: '2018-04-13'
170 + }, {
171 + content: 'Success',
172 + timestamp: '2018-04-11'
173 + }]
174 + };
175 + }
176 +<\/script>
177 +`,
178 + code2: `
179 +<template>
180 + <el-timeline>
181 + <el-timeline-item
182 + v-for="(activity, index) in activities"
183 + :key="index"
184 + :icon="activity.icon"
185 + :type="activity.type"
186 + :color="activity.color"
187 + :size="activity.size"
188 + :timestamp="activity.timestamp">
189 + {{activity.content}}
190 + </el-timeline-item>
191 + </el-timeline>
192 +</template>
193 +
194 +<script>
195 + import { defineComponent } from "@vue/runtime-core"
196 +
197 +export default defineComponent({
198 + data() {
199 + return {
200 + activities: [{
201 + content: 'Custom icon',
202 + timestamp: '2018-04-12 20:46',
203 + size: 'large',
204 + type: 'primary',
205 + icon: 'el-icon-more'
206 + }, {
207 + content: 'Custom color',
208 + timestamp: '2018-04-03 20:46',
209 + color: '#0bbd87'
210 + }, {
211 + content: 'Custom size',
212 + timestamp: '2018-04-03 20:46',
213 + size: 'large'
214 + }, {
215 + content: 'Default node',
216 + timestamp: '2018-04-03 20:46'
217 + }]
218 + };
219 + }
220 + };
221 +<\/script>
222 +`,
223 + code3: `
224 +<el-timeline>
225 + <el-timeline-item timestamp="2018/4/12" placement="top">
226 + <el-card>
227 + <h4>Update Github template</h4>
228 + <p>Tom committed 2018/4/12 20:46</p>
229 + </el-card>
230 + </el-timeline-item>
231 + <el-timeline-item timestamp="2018/4/3" placement="top">
232 + <el-card>
233 + <h4>Update Github template</h4>
234 + <p>Tom committed 2018/4/3 20:46</p>
235 + </el-card>
236 + </el-timeline-item>
237 + <el-timeline-item timestamp="2018/4/2" placement="top">
238 + <el-card>
239 + <h4>Update Github template</h4>
240 + <p>Tom committed 2018/4/2 20:46</p>
241 + </el-card>
242 + </el-timeline-item>
243 +</el-timeline>
244 +`
245 + }
246 + },
247 + components: { ThemePicker }
248 +})
249 +</script>
250 +
251 +<style lang="scss" scoped>
252 +.page-element-timeline .demo-box {
253 + padding: 20px;
254 + margin-bottom: 20px;
255 +}
256 +pre {
257 + margin: 0;
258 + background: white;
259 +}
260 +code {
261 + padding: 0;
262 +}
263 +
264 +@media (max-width: 768px) {
265 + code {
266 + font-size: 70%;
267 + }
268 +}
269 +</style>
src/views/ui/Element/ElementTooltip.vue new
+274
@@ -0,0 +1,274 @@
1 +<template>
2 + <el-scrollbar class="page-element-tooltip">
3 + <div class="page-header">
4 + <h1>
5 + Element Tooltip
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/tooltip" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white hidden-xs-only">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Basic usage" name="1">
17 + <div class="box">
18 + <div class="top">
19 + <el-tooltip class="item" effect="dark" content="Top Left prompts info" placement="top-start">
20 + <el-button>top-start</el-button>
21 + </el-tooltip>
22 + <el-tooltip class="item" effect="dark" content="Top Center prompts info" placement="top">
23 + <el-button>top</el-button>
24 + </el-tooltip>
25 + <el-tooltip class="item" effect="dark" content="Top Right prompts info" placement="top-end">
26 + <el-button>top-end</el-button>
27 + </el-tooltip>
28 + </div>
29 + <div class="left">
30 + <el-tooltip class="item" effect="dark" content="Left Top prompts info" placement="left-start">
31 + <el-button>left-start</el-button>
32 + </el-tooltip>
33 + <el-tooltip class="item" effect="dark" content="Left Center prompts info" placement="left">
34 + <el-button>left</el-button>
35 + </el-tooltip>
36 + <el-tooltip class="item" effect="dark" content="Left Bottom prompts info" placement="left-end">
37 + <el-button>left-end</el-button>
38 + </el-tooltip>
39 + </div>
40 +
41 + <div class="right">
42 + <el-tooltip class="item" effect="dark" content="Right Top prompts info" placement="right-start">
43 + <el-button>right-start</el-button>
44 + </el-tooltip>
45 + <el-tooltip class="item" effect="dark" content="Right Center prompts info" placement="right">
46 + <el-button>right</el-button>
47 + </el-tooltip>
48 + <el-tooltip class="item" effect="dark" content="Right Bottom prompts info" placement="right-end">
49 + <el-button>right-end</el-button>
50 + </el-tooltip>
51 + </div>
52 + <div class="bottom">
53 + <el-tooltip class="item" effect="dark" content="Bottom Left prompts info" placement="bottom-start">
54 + <el-button>bottom-start</el-button>
55 + </el-tooltip>
56 + <el-tooltip class="item" effect="dark" content="Bottom Center prompts info" placement="bottom">
57 + <el-button>bottom</el-button>
58 + </el-tooltip>
59 + <el-tooltip class="item" effect="dark" content="Bottom Right prompts info" placement="bottom-end">
60 + <el-button>bottom-end</el-button>
61 + </el-tooltip>
62 + </div>
63 + </div>
64 + </el-collapse-item>
65 + <el-collapse-item title="Code" name="2">
66 + <pre v-highlightjs="code1"><code class="html"></code></pre>
67 + </el-collapse-item>
68 + </el-collapse>
69 + </div>
70 + <div class="card-base card-shadow--medium demo-box bg-white">
71 + <el-collapse value="1">
72 + <el-collapse-item title="Theme" name="1">
73 + <el-tooltip content="Top center" placement="top">
74 + <el-button>Dark</el-button>
75 + </el-tooltip>
76 + <el-tooltip content="Bottom center" placement="bottom" effect="light">
77 + <el-button>Light</el-button>
78 + </el-tooltip>
79 + </el-collapse-item>
80 + <el-collapse-item title="Code" name="2">
81 + <pre v-highlightjs="code2"><code class="html"></code></pre>
82 + </el-collapse-item>
83 + </el-collapse>
84 + </div>
85 + <div class="card-base card-shadow--medium demo-box bg-white">
86 + <el-collapse value="1">
87 + <el-collapse-item title="More Content" name="1">
88 + <el-tooltip placement="top">
89 + <div slot="content">multiple lines<br />second line</div>
90 + <el-button>Top center</el-button>
91 + </el-tooltip>
92 + </el-collapse-item>
93 + <el-collapse-item title="Code" name="2">
94 + <pre v-highlightjs="code3"><code class="html"></code></pre>
95 + </el-collapse-item>
96 + </el-collapse>
97 + </div>
98 + </el-scrollbar>
99 +</template>
100 +
101 +<script>
102 +import ThemePicker from "@/components/theme-picker.vue"
103 +
104 +import { defineComponent } from "@vue/runtime-core"
105 +
106 +export default defineComponent({
107 + name: "ElementTooltip",
108 + data() {
109 + return {
110 + value1: true,
111 + value2: true,
112 + code1: `
113 +<div class="box">
114 + <div class="top">
115 + <el-tooltip class="item" effect="dark" content="Top Left prompts info" placement="top-start">
116 + <el-button>top-start</el-button>
117 + </el-tooltip>
118 + <el-tooltip class="item" effect="dark" content="Top Center prompts info" placement="top">
119 + <el-button>top</el-button>
120 + </el-tooltip>
121 + <el-tooltip class="item" effect="dark" content="Top Right prompts info" placement="top-end">
122 + <el-button>top-end</el-button>
123 + </el-tooltip>
124 + </div>
125 + <div class="left">
126 + <el-tooltip class="item" effect="dark" content="Left Top prompts info" placement="left-start">
127 + <el-button>left-start</el-button>
128 + </el-tooltip>
129 + <el-tooltip class="item" effect="dark" content="Left Center prompts info" placement="left">
130 + <el-button>left</el-button>
131 + </el-tooltip>
132 + <el-tooltip class="item" effect="dark" content="Left Bottom prompts info" placement="left-end">
133 + <el-button>left-end</el-button>
134 + </el-tooltip>
135 + </div>
136 +
137 + <div class="right">
138 + <el-tooltip class="item" effect="dark" content="Right Top prompts info" placement="right-start">
139 + <el-button>right-start</el-button>
140 + </el-tooltip>
141 + <el-tooltip class="item" effect="dark" content="Right Center prompts info" placement="right">
142 + <el-button>right</el-button>
143 + </el-tooltip>
144 + <el-tooltip class="item" effect="dark" content="Right Bottom prompts info" placement="right-end">
145 + <el-button>right-end</el-button>
146 + </el-tooltip>
147 + </div>
148 + <div class="bottom">
149 + <el-tooltip class="item" effect="dark" content="Bottom Left prompts info" placement="bottom-start">
150 + <el-button>bottom-start</el-button>
151 + </el-tooltip>
152 + <el-tooltip class="item" effect="dark" content="Bottom Center prompts info" placement="bottom">
153 + <el-button>bottom</el-button>
154 + </el-tooltip>
155 + <el-tooltip class="item" effect="dark" content="Bottom Right prompts info" placement="bottom-end">
156 + <el-button>bottom-end</el-button>
157 + </el-tooltip>
158 + </div>
159 +</div>
160 +
161 +<style>
162 + .box {
163 + width: 400px;
164 +
165 + .top {
166 + text-align: center;
167 + }
168 +
169 + .left {
170 + float: left;
171 + width: 110px;
172 + }
173 +
174 + .right {
175 + float: right;
176 + width: 110px;
177 + }
178 +
179 + .bottom {
180 + clear: both;
181 + text-align: center;
182 + }
183 +
184 + .item {
185 + margin: 4px;
186 + }
187 +
188 + .left .el-tooltip__popper,
189 + .right .el-tooltip__popper {
190 + padding: 8px 10px;
191 + }
192 +
193 + .el-button {
194 + width: 110px;
195 + }
196 + }
197 +</style>`,
198 + code2: `
199 +<el-tooltip content="Top center" placement="top">
200 + <el-button>Dark</el-button>
201 +</el-tooltip>
202 +<el-tooltip content="Bottom center" placement="bottom" effect="light">
203 + <el-button>Light</el-button>
204 +</el-tooltip>
205 +`,
206 + code3: `
207 +<el-tooltip placement="top">
208 + <div slot="content">multiple lines<br/>second line</div>
209 + <el-button>Top center</el-button>
210 +</el-tooltip>
211 +`
212 + }
213 + },
214 + components: {
215 + ThemePicker
216 + }
217 +})
218 +</script>
219 +
220 +<style lang="scss" scoped>
221 +.demo-box {
222 + padding: 20px;
223 + margin-bottom: 20px;
224 +}
225 +pre {
226 + margin: 0;
227 + background: white;
228 +}
229 +code {
230 + padding: 0;
231 +}
232 +
233 +@media (max-width: 768px) {
234 + code {
235 + font-size: 70%;
236 + }
237 +}
238 +
239 +.box {
240 + width: 400px;
241 +
242 + .top {
243 + text-align: center;
244 + }
245 +
246 + .left {
247 + float: left;
248 + width: 110px;
249 + }
250 +
251 + .right {
252 + float: right;
253 + width: 110px;
254 + }
255 +
256 + .bottom {
257 + clear: both;
258 + text-align: center;
259 + }
260 +
261 + .item {
262 + margin: 4px;
263 + }
264 +
265 + .left .el-tooltip__popper,
266 + .right .el-tooltip__popper {
267 + padding: 8px 10px;
268 + }
269 +
270 + .el-button {
271 + width: 110px;
272 + }
273 +}
274 +</style>
src/views/ui/Element/ElementTransfer.vue new
+126
@@ -0,0 +1,126 @@
1 +<template>
2 + <el-scrollbar class="page-element-transfer">
3 + <div class="page-header">
4 + <h1>
5 + Element Transfer
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/transfer" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Filterable" name="1">
17 + <el-transfer
18 + filterable
19 + :filter-method="filterMethod"
20 + filter-placeholder="State Abbreviations"
21 + v-model="value2"
22 + :data="data2"
23 + >
24 + </el-transfer>
25 + </el-collapse-item>
26 + <el-collapse-item title="Code" name="2">
27 + <pre v-highlightjs="code1"><code class="html"></code></pre>
28 + </el-collapse-item>
29 + </el-collapse>
30 + </div>
31 + </el-scrollbar>
32 +</template>
33 +
34 +<script>
35 +import ThemePicker from "@/components/theme-picker.vue"
36 +
37 +import { defineComponent } from "@vue/runtime-core"
38 +
39 +export default defineComponent({
40 + name: "ElementTransfer",
41 + data() {
42 + const generateData2 = _ => {
43 + const data = []
44 + const states = ["California", "Illinois", "Maryland", "Texas", "Florida", "Colorado", "Connecticut "]
45 + const initials = ["CA", "IL", "MD", "TX", "FL", "CO", "CT"]
46 + states.forEach((city, index) => {
47 + data.push({
48 + label: city,
49 + key: index,
50 + initial: initials[index]
51 + })
52 + })
53 + return data
54 + }
55 + return {
56 + data2: generateData2(),
57 + value2: [],
58 + filterMethod(query, item) {
59 + return item.initial.toLowerCase().indexOf(query.toLowerCase()) > -1
60 + },
61 + code1: `
62 +<template>
63 + <el-transfer
64 + filterable
65 + :filter-method="filterMethod"
66 + filter-placeholder="State Abbreviations"
67 + v-model="value2"
68 + :data="data2">
69 + </el-transfer>
70 +</template>
71 +
72 +<script>
73 + import { defineComponent } from "@vue/runtime-core"
74 +
75 +export default defineComponent({
76 + data() {
77 + const generateData2 = _ => {
78 + const data = [];
79 + const states = ['California', 'Illinois', 'Maryland', 'Texas', 'Florida', 'Colorado', 'Connecticut '];
80 + const initials = ['CA', 'IL', 'MD', 'TX', 'FL', 'CO', 'CT'];
81 + states.forEach((city, index) => {
82 + data.push({
83 + label: city,
84 + key: index,
85 + initial: initials[index]
86 + });
87 + });
88 + return data;
89 + };
90 + return {
91 + data2: generateData2(),
92 + value2: [],
93 + filterMethod(query, item) {
94 + return item.initial.toLowerCase().indexOf(query.toLowerCase()) > -1;
95 + }
96 + };
97 + }
98 + };
99 +<\/script>`
100 + }
101 + },
102 + components: {
103 + ThemePicker
104 + }
105 +})
106 +</script>
107 +
108 +<style lang="scss" scoped>
109 +.demo-box {
110 + padding: 20px;
111 + margin-bottom: 20px;
112 +}
113 +pre {
114 + margin: 0;
115 + background: white;
116 +}
117 +code {
118 + padding: 0;
119 +}
120 +
121 +@media (max-width: 768px) {
122 + code {
123 + font-size: 70%;
124 + }
125 +}
126 +</style>
src/views/ui/Element/ElementTree.vue new
+220
@@ -0,0 +1,220 @@
1 +<template>
2 + <el-scrollbar class="page-element-tree">
3 + <div class="page-header">
4 + <h1>
5 + Element Tree
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/tree" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Tree node filtering" name="1">
17 + <el-input placeholder="Filter keyword" v-model="filterText"> </el-input>
18 + &nbsp;
19 + <el-tree
20 + class="filter-tree"
21 + :data="data2"
22 + :props="defaultProps"
23 + default-expand-all
24 + show-checkbox
25 + :filter-node-method="filterNode"
26 + ref="tree2"
27 + >
28 + </el-tree>
29 + </el-collapse-item>
30 + <el-collapse-item title="Code" name="2">
31 + <pre v-highlightjs="code1"><code class="html"></code></pre>
32 + </el-collapse-item>
33 + </el-collapse>
34 + </div>
35 + </el-scrollbar>
36 +</template>
37 +
38 +<script>
39 +import ThemePicker from "@/components/theme-picker.vue"
40 +
41 +import { defineComponent } from "@vue/runtime-core"
42 +
43 +export default defineComponent({
44 + name: "ElementTree",
45 + watch: {
46 + filterText(val) {
47 + this.$refs.tree2.filter(val)
48 + }
49 + },
50 +
51 + methods: {
52 + filterNode(value, data) {
53 + if (!value) return true
54 + return data.label.indexOf(value) !== -1
55 + }
56 + },
57 + data() {
58 + return {
59 + filterText: "",
60 + data2: [
61 + {
62 + id: 1,
63 + label: "Level one 1",
64 + children: [
65 + {
66 + id: 4,
67 + label: "Level two 1-1",
68 + children: [
69 + {
70 + id: 9,
71 + label: "Level three 1-1-1"
72 + },
73 + {
74 + id: 10,
75 + label: "Level three 1-1-2"
76 + }
77 + ]
78 + }
79 + ]
80 + },
81 + {
82 + id: 2,
83 + label: "Level one 2",
84 + children: [
85 + {
86 + id: 5,
87 + label: "Level two 2-1"
88 + },
89 + {
90 + id: 6,
91 + label: "Level two 2-2"
92 + }
93 + ]
94 + },
95 + {
96 + id: 3,
97 + label: "Level one 3",
98 + children: [
99 + {
100 + id: 7,
101 + label: "Level two 3-1"
102 + },
103 + {
104 + id: 8,
105 + label: "Level two 3-2"
106 + }
107 + ]
108 + }
109 + ],
110 + defaultProps: {
111 + children: "children",
112 + label: "label"
113 + },
114 + code1: `
115 +<el-input
116 + placeholder="Filter keyword"
117 + v-model="filterText">
118 +</el-input>
119 +
120 +<el-tree
121 + class="filter-tree"
122 + :data="data2"
123 + :props="defaultProps"
124 + default-expand-all
125 + show-checkbox
126 + :filter-node-method="filterNode"
127 + ref="tree2">
128 +</el-tree>
129 +
130 +<script>
131 + import { defineComponent } from "@vue/runtime-core"
132 +
133 +export default defineComponent({
134 + watch: {
135 + filterText(val) {
136 + this.$refs.tree2.filter(val);
137 + }
138 + },
139 +
140 + methods: {
141 + filterNode(value, data) {
142 + if (!value) return true;
143 + return data.label.indexOf(value) !== -1;
144 + }
145 + },
146 +
147 + data() {
148 + return {
149 + filterText: '',
150 + data2: [{
151 + id: 1,
152 + label: 'Level one 1',
153 + children: [{
154 + id: 4,
155 + label: 'Level two 1-1',
156 + children: [{
157 + id: 9,
158 + label: 'Level three 1-1-1'
159 + }, {
160 + id: 10,
161 + label: 'Level three 1-1-2'
162 + }]
163 + }]
164 + }, {
165 + id: 2,
166 + label: 'Level one 2',
167 + children: [{
168 + id: 5,
169 + label: 'Level two 2-1'
170 + }, {
171 + id: 6,
172 + label: 'Level two 2-2'
173 + }]
174 + }, {
175 + id: 3,
176 + label: 'Level one 3',
177 + children: [{
178 + id: 7,
179 + label: 'Level two 3-1'
180 + }, {
181 + id: 8,
182 + label: 'Level two 3-2'
183 + }]
184 + }],
185 + defaultProps: {
186 + children: 'children',
187 + label: 'label'
188 + }
189 + };
190 + }
191 + };
192 +<\/script>
193 +`
194 + }
195 + },
196 + components: {
197 + ThemePicker
198 + }
199 +})
200 +</script>
201 +
202 +<style lang="scss" scoped>
203 +.demo-box {
204 + padding: 20px;
205 + margin-bottom: 20px;
206 +}
207 +pre {
208 + margin: 0;
209 + background: white;
210 +}
211 +code {
212 + padding: 0;
213 +}
214 +
215 +@media (max-width: 768px) {
216 + code {
217 + font-size: 70%;
218 + }
219 +}
220 +</style>
src/views/ui/Element/ElementUpload.vue new
+149
@@ -0,0 +1,149 @@
1 +<template>
2 + <el-scrollbar class="page-element-upload">
3 + <div class="page-header">
4 + <h1>
5 + Element Upload
6 + <theme-picker style="float: right"></theme-picker>
7 + </h1>
8 + <h4>
9 + <a href="http://element.eleme.io/#/en-US/component/upload" target="_blank"
10 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
11 + >
12 + </h4>
13 + </div>
14 + <div class="card-base card-shadow--medium demo-box bg-white">
15 + <el-collapse value="1">
16 + <el-collapse-item title="Click to upload files" name="1">
17 + <div class="block">
18 + <el-upload
19 + class="upload-demo"
20 + action="https://jsonplaceholder.typicode.com/posts/"
21 + :on-preview="handlePreview"
22 + :on-remove="handleRemove"
23 + :before-remove="beforeRemove"
24 + multiple
25 + drag
26 + :limit="3"
27 + :on-exceed="handleExceed"
28 + :file-list="fileList"
29 + >
30 + <i class="el-icon-upload"></i>
31 + <div class="el-upload__text">Drop file here or <em>click to upload</em></div>
32 + <div class="el-upload__tip" slot="tip">jpg/png files with a size less than 500kb</div>
33 + </el-upload>
34 + </div>
35 + </el-collapse-item>
36 + <el-collapse-item title="Code" name="2">
37 + <pre v-highlightjs="code1"><code class="html"></code></pre>
38 + </el-collapse-item>
39 + </el-collapse>
40 + </div>
41 + </el-scrollbar>
42 +</template>
43 +
44 +<script>
45 +import ThemePicker from "@/components/theme-picker.vue"
46 +
47 +import { defineComponent } from "@vue/runtime-core"
48 +
49 +export default defineComponent({
50 + name: "ElementUpload",
51 + data() {
52 + return {
53 + fileList: [
54 + {
55 + name: "food.jpeg",
56 + url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100"
57 + },
58 + {
59 + name: "food2.jpeg",
60 + url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100"
61 + }
62 + ],
63 + code1: `
64 +<el-upload
65 + class="upload-demo"
66 + action="https://jsonplaceholder.typicode.com/posts/"
67 + :on-preview="handlePreview"
68 + :on-remove="handleRemove"
69 + :before-remove="beforeRemove"
70 + multiple
71 + drag
72 + :limit="3"
73 + :on-exceed="handleExceed"
74 + :file-list="fileList">
75 + <i class="el-icon-upload"></i>
76 + <div class="el-upload__text">Drop file here or <em>click to upload</em></div>
77 + <div class="el-upload__tip" slot="tip">jpg/png files with a size less than 500kb</div>
78 +</el-upload>
79 +<script>
80 + import { defineComponent } from "@vue/runtime-core"
81 +
82 +export default defineComponent({
83 + data() {
84 + return {
85 + fileList: [{name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}, {name: 'food2.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}]
86 + };
87 + },
88 + methods: {
89 + handleRemove(file, fileList) {
90 + console.log(file, fileList);
91 + },
92 + handlePreview(file) {
93 + console.log(file);
94 + },
95 + handleExceed(files, fileList) {
96 + this.$message.warning('The limit is 3, you selected'+files.length+' files this time, add up to '+files.length + fileList.length'+ totally');
97 + },
98 + beforeRemove(file, fileList) {
99 + return this.$confirm(file.name+'?');
100 + }
101 + }
102 + }
103 +<\/script>`
104 + }
105 + },
106 + methods: {
107 + handleRemove(file, fileList) {
108 + console.log(file, fileList)
109 + },
110 + handlePreview(file) {
111 + console.log(file)
112 + },
113 + handleExceed(files, fileList) {
114 + this.$message.warning(
115 + `The limit is 3, you selected ${files.length} files this time, add up to ${files.length + fileList.length} totally`
116 + )
117 + },
118 + beforeRemove(file, fileList) {
119 + return this.$confirm(`${file.name}?`)
120 + }
121 + },
122 + components: {
123 + ThemePicker
124 + }
125 +})
126 +</script>
127 +
128 +<style lang="scss" scoped>
129 +.demo-box {
130 + padding: 20px;
131 + margin-bottom: 20px;
132 +}
133 +pre {
134 + margin: 0;
135 + background: white;
136 +}
137 +code {
138 + padding: 0;
139 +}
140 +.block {
141 + max-width: 360px;
142 +}
143 +
144 +@media (max-width: 768px) {
145 + code {
146 + font-size: 70%;
147 + }
148 +}
149 +</style>
src/views/ui/HelperClasses.vue new
+349
@@ -0,0 +1,349 @@
1 +<template>
2 + <div class="page-helper-classes scrollable ph-20">
3 + <div class="page-header">
4 + <h1>Helper Classes</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>UI</el-breadcrumb-item>
8 + <el-breadcrumb-item>Helper Classes</el-breadcrumb-item>
9 + </el-breadcrumb>
10 + </div>
11 +
12 + <div class="card-base card-shadow--medium p-30 mb-40">
13 + <ul class="color-box">
14 + <li class="bg-primary white-text">.bg-primary</li>
15 + <li class="bg-primary-light white-text">.bg-primary-light</li>
16 + <li class="bg-primary-lighter">.bg-primary-lighter</li>
17 + </ul>
18 + <ul class="color-box">
19 + <li class="bg-accent white-text">.bg-accent</li>
20 + <li class="bg-accent-light">.bg-accent-light</li>
21 + <li class="bg-accent-lighter">.bg-accent-lighter</li>
22 + </ul>
23 + <ul class="color-box">
24 + <li class="bg-success white-text">.bg-success, .bg-green</li>
25 + <li class="bg-success-light">.bg-success-light</li>
26 + <li class="bg-success-lighter">.bg-success-lighter</li>
27 + </ul>
28 + <ul class="color-box">
29 + <li class="bg-warning white-text">.bg-warning, .bg-orange</li>
30 + <li class="bg-warning-light">.bg-warning-light</li>
31 + <li class="bg-warning-lighter">.bg-warning-lighter</li>
32 + </ul>
33 + <ul class="color-box">
34 + <li class="bg-danger white-text">.bg-danger, .bg-red</li>
35 + <li class="bg-danger-light">.bg-danger-light</li>
36 + <li class="bg-danger-lighter">.bg-danger-lighter</li>
37 + </ul>
38 + <ul class="color-box">
39 + <li class="bg-info white-text">.bg-info, .bg-grey</li>
40 + <li class="bg-info-light">.bg-info-light</li>
41 + <li class="bg-info-lighter">.bg-info-lighter</li>
42 + </ul>
43 + <ul class="color-box">
44 + <li class="bg-black white-text">.bg-black</li>
45 + <li class="bg-white">.bg-white</li>
46 + </ul>
47 + </div>
48 +
49 + <div class="card-base card-shadow--medium p-30">
50 + <div class="flex center demo-box">
51 + <div class="left-box">card shadow</div>
52 + <div class="right-box box grow c-box">
53 + <div class="card-base card-shadow--small">card-shadow--small</div>
54 + <div class="card-base card-shadow--medium">card-shadow--medium</div>
55 + <div class="card-base card-shadow--large">card-shadow--large</div>
56 + <div class="card-base card-shadow--extraLarge">card-shadow--extraLarge</div>
57 + </div>
58 + </div>
59 + <div class="flex center demo-box">
60 + <div class="left-box">align-vertical</div>
61 + <div class="right-box box grow align-box">
62 + <div class="align-vertical scrollable p-10" style="height: 250px; min-width: 306px">
63 + <div class="align-vertical-top card-base card-shadow--small p-20 m-20">align-vertical-top</div>
64 + <div class="align-vertical-middle card-base card-shadow--small p-20 m-20">align-vertical-middle</div>
65 + <div class="align-vertical-bottom card-base card-shadow--small p-20 m-20">align-vertical-bottom</div>
66 + </div>
67 + </div>
68 + </div>
69 +
70 + <div class="flex center demo-box">
71 + <div class="left-box">box scrollable</div>
72 + <div class="right-box box grow">
73 + <div class="scrollable" style="width: 120px; height: 80px">
74 + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore
75 + magna aliquam erat volutpat. Ut wisi enim ad minim veniam.
76 + </div>
77 + </div>
78 + </div>
79 +
80 + <div class="flex center demo-box">
81 + <div class="left-box">borders</div>
82 + <div class="right-box box grow" v-for="i in border" :key="i">
83 + <div :class="i" class="b-box">{{ i }}</div>
84 + </div>
85 + </div>
86 +
87 + <div class="text-divider">PADDINGS ( from <strong class="mh-7">1px</strong> to <strong class="mh-7">200px</strong> )</div>
88 + <br />
89 + <div class="flex center demo-box">
90 + <div class="left-box">padding ex: p-20, pt-10, padding-bottom-8, padding-horizontal-5</div>
91 + <div class="right-box box grow" style="overflow: hidden">
92 + <div class="p-box pt-10">
93 + <div class="p-box-label">pt-10</div>
94 + </div>
95 + <div class="p-box pb-10">
96 + <div class="p-box-label">pb-10</div>
97 + </div>
98 + <div class="p-box pr-10">
99 + <div class="p-box-label">pr-10</div>
100 + </div>
101 + <div class="p-box pl-10">
102 + <div class="p-box-label">pl-10</div>
103 + </div>
104 + <div class="p-box ph-10">
105 + <div class="p-box-label">ph-10</div>
106 + </div>
107 + <div class="p-box pv-10">
108 + <div class="p-box-label">pv-10</div>
109 + </div>
110 + <div class="p-box no-p">
111 + <div class="p-box-label">no-p</div>
112 + </div>
113 + <div v-for="(i, index) in padding" :key="index" :class="'p-box p-' + (1 + index)">
114 + <div class="p-box-label">p-{{ 1 + index }}</div>
115 + </div>
116 + </div>
117 + </div>
118 +
119 + <div class="text-divider">MARGINS ( from <strong class="mh-7">1px</strong> to <strong class="mh-7">200px</strong> )</div>
120 + <br />
121 + <div class="flex center demo-box">
122 + <div class="left-box">margins ex: m-20, mt-10, margin-bottom-8, margin-horizontal-5</div>
123 + <div class="right-box box grow" style="overflow: hidden">
124 + <div class="m-box-wrap">
125 + <div class="m-box">
126 + <div class="m-box-label mt-10">mt-10</div>
127 + </div>
128 + </div>
129 + <div class="m-box-wrap">
130 + <div class="m-box">
131 + <div class="m-box-label mb-10">mb-10</div>
132 + </div>
133 + </div>
134 + <div class="m-box-wrap">
135 + <div class="m-box">
136 + <div class="m-box-label mr-10">mr-10</div>
137 + </div>
138 + </div>
139 + <div class="m-box-wrap">
140 + <div class="m-box">
141 + <div class="m-box-label ml-10">ml-10</div>
142 + </div>
143 + </div>
144 + <div class="m-box-wrap">
145 + <div class="m-box">
146 + <div class="m-box-label mh-10">mh-10</div>
147 + </div>
148 + </div>
149 + <div class="m-box-wrap">
150 + <div class="m-box">
151 + <div class="m-box-label mv-10">mv-10</div>
152 + </div>
153 + </div>
154 + <div class="m-box-wrap">
155 + <div class="m-box">
156 + <div class="m-box-label no-m">no-m</div>
157 + </div>
158 + </div>
159 + <div class="m-box-wrap" v-for="(i, index) in margin" :key="index">
160 + <div class="m-box">
161 + <div :class="'m-box-label m-' + (1 + index)">m-{{ 1 + index }}</div>
162 + </div>
163 + </div>
164 + </div>
165 + </div>
166 +
167 + <div class="text-divider">BORDER RADIUS ( from <strong class="mh-7">1px</strong> to <strong class="mh-7">50px</strong> )</div>
168 + <br />
169 + <div class="flex center demo-box">
170 + <div class="left-box">border-radius</div>
171 + <div class="right-box box grow">
172 + <div class="no-b-rad br-box">no-b-rad</div>
173 + <div v-for="(i, index) in borderRadius" :key="index" :class="'b-rad-' + (1 + index)" class="br-box">
174 + b-rad-{{ 1 + index }}
175 + </div>
176 + </div>
177 + </div>
178 +
179 + <div class="text-divider">OPACITY ( from <strong class="mh-7">0</strong> to <strong class="mh-7">1</strong> )</div>
180 + <br />
181 + <div class="flex center demo-box">
182 + <div class="left-box">opacity ex: o-0, o-1, o-055, o-70</div>
183 + <div class="right-box box grow">
184 + <div :class="'o-0' + i + '0 o-box'" v-for="i in 9" :key="i">o-0{{ i }}0</div>
185 + </div>
186 + </div>
187 + </div>
188 + </div>
189 +</template>
190 +
191 +<script>
192 +import { defineComponent } from "@vue/runtime-core"
193 +
194 +export default defineComponent({
195 + name: "HelperClasses",
196 + data() {
197 + return {
198 + border: ["border", "border-top", "border-right", "border-bottom", "border-left", "border-horizontal", "border-vertical"],
199 + padding: Array(10),
200 + margin: Array(10),
201 + borderRadius: Array(20)
202 + }
203 + }
204 +})
205 +</script>
206 +
207 +<style lang="scss" scoped>
208 +@import "../../assets/scss/_variables";
209 +
210 +.card-base {
211 + .text-divider {
212 + margin-top: 80px;
213 + margin-bottom: 5px;
214 + }
215 +
216 + .demo-box {
217 + margin-bottom: 40px;
218 +
219 + .left-box {
220 + width: 150px;
221 + padding: 20px;
222 + color: transparentize($text-color-primary, 0.7);
223 + }
224 +
225 + .c-box {
226 + background: $background-color;
227 + padding: 10px;
228 +
229 + & > div {
230 + margin: 20px;
231 + padding: 20px;
232 + }
233 + }
234 +
235 + .p-box {
236 + width: 100px;
237 + height: 50px;
238 + box-sizing: border-box;
239 + border: 1px solid $text-color-primary;
240 + background: #6ce46c;
241 + display: block;
242 + float: left;
243 + margin: 10px;
244 +
245 + .p-box-label {
246 + width: 100%;
247 + height: 100%;
248 + background: $background-color;
249 + text-align: center;
250 + line-height: 30px;
251 + }
252 + }
253 +
254 + .m-box-wrap {
255 + display: block;
256 + float: left;
257 + margin: 10px;
258 + width: 125px;
259 + height: 75px;
260 +
261 + .m-box {
262 + box-sizing: border-box;
263 + border: 1px solid $text-color-primary;
264 + background: #ffd383;
265 +
266 + .m-box-label {
267 + width: 100px;
268 + height: 50px;
269 + background: $background-color;
270 + border: 1px dashed $text-color-accent;
271 + text-align: center;
272 + line-height: 30px;
273 + }
274 + }
275 + }
276 +
277 + .b-box {
278 + background: $background-color;
279 + border-color: $text-color-primary;
280 + padding: 10px;
281 + margin: 10px;
282 + display: block;
283 + float: left;
284 + }
285 +
286 + .br-box {
287 + background: $background-color;
288 + border: 1px solid $text-color-primary;
289 + padding: 10px;
290 + margin: 10px;
291 + display: block;
292 + float: left;
293 + }
294 +
295 + .o-box {
296 + background-color: $text-color-primary;
297 + color: $background-color;
298 + padding: 10px;
299 + margin: 10px;
300 + display: block;
301 + float: left;
302 + }
303 + }
304 +
305 + .color-box {
306 + font-size: 16px;
307 + list-style: none;
308 + padding: 0;
309 + margin: 0;
310 + width: 210px;
311 + border-radius: 5px;
312 + overflow: hidden;
313 + margin-right: 15px;
314 + margin-bottom: 15px;
315 + display: inline-block;
316 + box-shadow:
317 + 0 3px 6px 0 rgba(40, 40, 90, 0.09),
318 + 0 1px 1px 0 rgba(0, 0, 0, 0.065);
319 +
320 + li {
321 + list-style: none;
322 + padding: 15px;
323 + }
324 + }
325 +
326 + .align-box {
327 + background: $background-color;
328 + }
329 +}
330 +
331 +@media (max-width: 768px) {
332 + .card-base {
333 + .demo-box {
334 + display: block;
335 + overflow: hidden;
336 +
337 + .left-box {
338 + padding: 20px 0;
339 + }
340 +
341 + .left-box,
342 + .right-box {
343 + width: 100%;
344 + display: block;
345 + }
346 + }
347 + }
348 +}
349 +</style>
src/views/ui/Icons/FlagIcons.vue new
+331
@@ -0,0 +1,331 @@
1 +<template>
2 + <div class="page-flag-icons flex column">
3 + <div class="page-header">
4 + <h1>Flag icons</h1>
5 + <h4>
6 + <a href="https://github.com/lipis/flag-icon-css" target="_blank"
7 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
8 + >
9 + </h4>
10 + <el-breadcrumb separator="/">
11 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
12 + <el-breadcrumb-item>UI</el-breadcrumb-item>
13 + <el-breadcrumb-item>Icons</el-breadcrumb-item>
14 + <el-breadcrumb-item>Flag icons</el-breadcrumb-item>
15 + </el-breadcrumb>
16 + </div>
17 +
18 + <div class="card-base card-shadow--small icons-list scrollable only-y p-10">
19 + <div class="icon" v-for="i in icons" :key="i">
20 + <i class="flag-icon" :class="{ ['flag-icon-' + i]: true }"></i>
21 + <div>flag-icon-{{ i }}</div>
22 + </div>
23 + </div>
24 + </div>
25 +</template>
26 +
27 +<script>
28 +import "flag-icon-css/css/flag-icons.min.css"
29 +import { defineComponent } from "@vue/runtime-core"
30 +
31 +export default defineComponent({
32 + name: "FlagIcons",
33 + data() {
34 + return {
35 + icons: [
36 + "ad",
37 + "ae",
38 + "af",
39 + "ag",
40 + "ai",
41 + "al",
42 + "am",
43 + "ao",
44 + "aq",
45 + "ar",
46 + "as",
47 + "at",
48 + "au",
49 + "aw",
50 + "ax",
51 + "az",
52 + "ba",
53 + "bb",
54 + "bd",
55 + "be",
56 + "bf",
57 + "bg",
58 + "bh",
59 + "bi",
60 + "bj",
61 + "bl",
62 + "bm",
63 + "bn",
64 + "bo",
65 + "bq",
66 + "br",
67 + "bs",
68 + "bt",
69 + "bv",
70 + "bw",
71 + "by",
72 + "bz",
73 + "ca",
74 + "cc",
75 + "cd",
76 + "cf",
77 + "cg",
78 + "ch",
79 + "ci",
80 + "ck",
81 + "cl",
82 + "cm",
83 + "cn",
84 + "co",
85 + "cr",
86 + "cu",
87 + "cv",
88 + "cw",
89 + "cx",
90 + "cy",
91 + "cz",
92 + "de",
93 + "dj",
94 + "dk",
95 + "dm",
96 + "do",
97 + "dz",
98 + "ec",
99 + "ee",
100 + "eg",
101 + "eh",
102 + "er",
103 + "es",
104 + "et",
105 + "fi",
106 + "fj",
107 + "fk",
108 + "fm",
109 + "fo",
110 + "fr",
111 + "ga",
112 + "gb",
113 + "gd",
114 + "ge",
115 + "gf",
116 + "gg",
117 + "gh",
118 + "gi",
119 + "gl",
120 + "gm",
121 + "gn",
122 + "gp",
123 + "gq",
124 + "gr",
125 + "gs",
126 + "gt",
127 + "gu",
128 + "gw",
129 + "gy",
130 + "hk",
131 + "hm",
132 + "hn",
133 + "hr",
134 + "ht",
135 + "hu",
136 + "id",
137 + "ie",
138 + "il",
139 + "im",
140 + "in",
141 + "io",
142 + "iq",
143 + "ir",
144 + "is",
145 + "it",
146 + "je",
147 + "jm",
148 + "jo",
149 + "jp",
150 + "ke",
151 + "kg",
152 + "kh",
153 + "ki",
154 + "km",
155 + "kn",
156 + "kp",
157 + "kr",
158 + "kw",
159 + "ky",
160 + "kz",
161 + "la",
162 + "lb",
163 + "lc",
164 + "li",
165 + "lk",
166 + "lr",
167 + "ls",
168 + "lt",
169 + "lu",
170 + "lv",
171 + "ly",
172 + "ma",
173 + "mc",
174 + "md",
175 + "me",
176 + "mf",
177 + "mg",
178 + "mh",
179 + "mk",
180 + "ml",
181 + "mm",
182 + "mn",
183 + "mo",
184 + "mp",
185 + "mq",
186 + "mr",
187 + "ms",
188 + "mt",
189 + "mu",
190 + "mv",
191 + "mw",
192 + "mx",
193 + "my",
194 + "mz",
195 + "na",
196 + "nc",
197 + "ne",
198 + "nf",
199 + "ng",
200 + "ni",
201 + "nl",
202 + "no",
203 + "np",
204 + "nr",
205 + "nu",
206 + "nz",
207 + "om",
208 + "pa",
209 + "pe",
210 + "pf",
211 + "pg",
212 + "ph",
213 + "pk",
214 + "pl",
215 + "pm",
216 + "pn",
217 + "pr",
218 + "ps",
219 + "pt",
220 + "pw",
221 + "py",
222 + "qa",
223 + "re",
224 + "ro",
225 + "rs",
226 + "ru",
227 + "rw",
228 + "sa",
229 + "sb",
230 + "sc",
231 + "sd",
232 + "se",
233 + "sg",
234 + "sh",
235 + "si",
236 + "sj",
237 + "sk",
238 + "sl",
239 + "sm",
240 + "sn",
241 + "so",
242 + "sr",
243 + "ss",
244 + "st",
245 + "sv",
246 + "sx",
247 + "sy",
248 + "sz",
249 + "tc",
250 + "td",
251 + "tf",
252 + "tg",
253 + "th",
254 + "tj",
255 + "tk",
256 + "tl",
257 + "tm",
258 + "tn",
259 + "to",
260 + "tr",
261 + "tt",
262 + "tv",
263 + "tw",
264 + "tz",
265 + "ua",
266 + "ug",
267 + "um",
268 + "us",
269 + "uy",
270 + "uz",
271 + "va",
272 + "vc",
273 + "ve",
274 + "vg",
275 + "vi",
276 + "vn",
277 + "vu",
278 + "wf",
279 + "ws",
280 + "ye",
281 + "yt",
282 + "za",
283 + "zm",
284 + "zw"
285 + ]
286 + }
287 + }
288 +})
289 +</script>
290 +
291 +<style lang="scss" scoped>
292 +@import "@/assets/scss/_variables";
293 +
294 +.page-flag-icons {
295 + .icons-list {
296 + .icon {
297 + width: 120px;
298 + height: 90px;
299 + margin: 10px;
300 + display: inline-block;
301 + text-align: center;
302 + padding: 10px;
303 + box-sizing: border-box;
304 +
305 + i {
306 + width: 50px;
307 + height: 50px;
308 + }
309 + }
310 + }
311 +}
312 +
313 +@media (max-width: 768px) {
314 + .page-flag-icons {
315 + overflow-x: hidden !important;
316 + overflow-y: auto !important;
317 + flex: none !important;
318 + display: block !important;
319 + width: 100%;
320 +
321 + .icons-list {
322 + .icon {
323 + width: 110px;
324 + height: 80px;
325 + margin: 6px;
326 + padding: 6px;
327 + }
328 + }
329 + }
330 +}
331 +</style>
src/views/ui/Icons/Icons.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Icons"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/ui/Icons/MdIcons.vue new
+5581
@@ -0,0 +1,5581 @@
1 +<template>
2 + <div class="page-icons flex column" id="page-icons">
3 + <div class="page-header">
4 + <h1>Material Design Icons</h1>
5 + <h4 class="hidden-xs-only">in this page you can search <strong>Material Design Icons</strong> for your project</h4>
6 + <el-breadcrumb separator="/">
7 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
8 + <el-breadcrumb-item>UI</el-breadcrumb-item>
9 + <el-breadcrumb-item>Icons</el-breadcrumb-item>
10 + <el-breadcrumb-item>Material Design Icons</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 +
14 + <div class="search-wrap flex align-center">
15 + <div><i class="mdi mdi-magnify"></i></div>
16 + <input v-model="search" placeholder="Search an icon" class="box grow" />
17 + <div class="icons-tot">{{ iconsFiltered.length }} icons</div>
18 + <div>
19 + <a href="https://materialdesignicons.com/" target="_blank"> all icons <i class="mdi mdi-arrow-right"></i>reference </a>
20 + </div>
21 + </div>
22 + <resize-observer @notify="handleResize" />
23 + <div class="card-base card-shadow--medium box grow" id="icons-wrapper" v-loading="!asyncComponent">
24 + <component
25 + :is="asyncComponent"
26 + :cellSizeAndPositionGetter="cellSizeAndPositionGetter"
27 + :collection="iconsFiltered"
28 + :height="height"
29 + :width="width"
30 + class="icons-list scrollable only-y"
31 + >
32 + <template #cell="props" class="icon">
33 + <div class="icon">
34 + <i :class="'mdi mdi-' + props.data"></i>
35 + <div class="title">{{ props.data }}</div>
36 + <div class="class">"mdi mdi-{{ props.data }}"</div>
37 + </div>
38 + </template>
39 + </component>
40 + </div>
41 + </div>
42 +</template>
43 +
44 +<script>
45 +import _ from "lodash"
46 +import { defineComponent } from "@vue/runtime-core"
47 +import ResizeObserver from "@/components/vue-resize/ResizeObserver.vue"
48 +import VirtualCollection from "/node_modules/vue-virtual-collection/src/VirtualCollection.vue"
49 +
50 +export default defineComponent({
51 + name: "MdIcons",
52 + data() {
53 + const icons = [
54 + "ab-testing",
55 + "abjad-arabic",
56 + "abjad-hebrew",
57 + "abugida-devanagari",
58 + "abugida-thai",
59 + "access-point",
60 + "access-point-network",
61 + "access-point-network-off",
62 + "account",
63 + "account-alert",
64 + "account-alert-outline",
65 + "account-arrow-left",
66 + "account-arrow-left-outline",
67 + "account-arrow-right",
68 + "account-arrow-right-outline",
69 + "account-box",
70 + "account-box-multiple",
71 + "account-box-multiple-outline",
72 + "account-box-outline",
73 + "account-cancel",
74 + "account-cancel-outline",
75 + "account-cash",
76 + "account-cash-outline",
77 + "account-check",
78 + "account-check-outline",
79 + "account-child",
80 + "account-child-circle",
81 + "account-child-outline",
82 + "account-circle",
83 + "account-circle-outline",
84 + "account-clock",
85 + "account-clock-outline",
86 + "account-cog",
87 + "account-cog-outline",
88 + "account-convert",
89 + "account-convert-outline",
90 + "account-cowboy-hat",
91 + "account-details",
92 + "account-details-outline",
93 + "account-edit",
94 + "account-edit-outline",
95 + "account-group",
96 + "account-group-outline",
97 + "account-hard-hat",
98 + "account-heart",
99 + "account-heart-outline",
100 + "account-key",
101 + "account-key-outline",
102 + "account-lock",
103 + "account-lock-outline",
104 + "account-minus",
105 + "account-minus-outline",
106 + "account-multiple",
107 + "account-multiple-check",
108 + "account-multiple-check-outline",
109 + "account-multiple-minus",
110 + "account-multiple-minus-outline",
111 + "account-multiple-outline",
112 + "account-multiple-plus",
113 + "account-multiple-plus-outline",
114 + "account-multiple-remove",
115 + "account-multiple-remove-outline",
116 + "account-music",
117 + "account-music-outline",
118 + "account-network",
119 + "account-network-outline",
120 + "account-off",
121 + "account-off-outline",
122 + "account-outline",
123 + "account-plus",
124 + "account-plus-outline",
125 + "account-question",
126 + "account-question-outline",
127 + "account-remove",
128 + "account-remove-outline",
129 + "account-search",
130 + "account-search-outline",
131 + "account-settings",
132 + "account-settings-outline",
133 + "account-star",
134 + "account-star-outline",
135 + "account-supervisor",
136 + "account-supervisor-circle",
137 + "account-supervisor-outline",
138 + "account-switch",
139 + "account-switch-outline",
140 + "account-tie",
141 + "account-tie-outline",
142 + "account-tie-voice",
143 + "account-tie-voice-off",
144 + "account-tie-voice-off-outline",
145 + "account-tie-voice-outline",
146 + "account-voice",
147 + "adjust",
148 + "adobe",
149 + "adobe-acrobat",
150 + "air-conditioner",
151 + "air-filter",
152 + "air-horn",
153 + "air-humidifier",
154 + "air-humidifier-off",
155 + "air-purifier",
156 + "airbag",
157 + "airballoon",
158 + "airballoon-outline",
159 + "airplane",
160 + "airplane-landing",
161 + "airplane-off",
162 + "airplane-takeoff",
163 + "airport",
164 + "alarm",
165 + "alarm-bell",
166 + "alarm-check",
167 + "alarm-light",
168 + "alarm-light-outline",
169 + "alarm-multiple",
170 + "alarm-note",
171 + "alarm-note-off",
172 + "alarm-off",
173 + "alarm-plus",
174 + "alarm-snooze",
175 + "album",
176 + "alert",
177 + "alert-box",
178 + "alert-box-outline",
179 + "alert-circle",
180 + "alert-circle-check",
181 + "alert-circle-check-outline",
182 + "alert-circle-outline",
183 + "alert-decagram",
184 + "alert-decagram-outline",
185 + "alert-minus",
186 + "alert-minus-outline",
187 + "alert-octagon",
188 + "alert-octagon-outline",
189 + "alert-octagram",
190 + "alert-octagram-outline",
191 + "alert-outline",
192 + "alert-plus",
193 + "alert-plus-outline",
194 + "alert-remove",
195 + "alert-remove-outline",
196 + "alert-rhombus",
197 + "alert-rhombus-outline",
198 + "alien",
199 + "alien-outline",
200 + "align-horizontal-center",
201 + "align-horizontal-left",
202 + "align-horizontal-right",
203 + "align-vertical-bottom",
204 + "align-vertical-center",
205 + "align-vertical-top",
206 + "all-inclusive",
207 + "allergy",
208 + "alpha",
209 + "alpha-a",
210 + "alpha-a-box",
211 + "alpha-a-box-outline",
212 + "alpha-a-circle",
213 + "alpha-a-circle-outline",
214 + "alpha-b",
215 + "alpha-b-box",
216 + "alpha-b-box-outline",
217 + "alpha-b-circle",
218 + "alpha-b-circle-outline",
219 + "alpha-c",
220 + "alpha-c-box",
221 + "alpha-c-box-outline",
222 + "alpha-c-circle",
223 + "alpha-c-circle-outline",
224 + "alpha-d",
225 + "alpha-d-box",
226 + "alpha-d-box-outline",
227 + "alpha-d-circle",
228 + "alpha-d-circle-outline",
229 + "alpha-e",
230 + "alpha-e-box",
231 + "alpha-e-box-outline",
232 + "alpha-e-circle",
233 + "alpha-e-circle-outline",
234 + "alpha-f",
235 + "alpha-f-box",
236 + "alpha-f-box-outline",
237 + "alpha-f-circle",
238 + "alpha-f-circle-outline",
239 + "alpha-g",
240 + "alpha-g-box",
241 + "alpha-g-box-outline",
242 + "alpha-g-circle",
243 + "alpha-g-circle-outline",
244 + "alpha-h",
245 + "alpha-h-box",
246 + "alpha-h-box-outline",
247 + "alpha-h-circle",
248 + "alpha-h-circle-outline",
249 + "alpha-i",
250 + "alpha-i-box",
251 + "alpha-i-box-outline",
252 + "alpha-i-circle",
253 + "alpha-i-circle-outline",
254 + "alpha-j",
255 + "alpha-j-box",
256 + "alpha-j-box-outline",
257 + "alpha-j-circle",
258 + "alpha-j-circle-outline",
259 + "alpha-k",
260 + "alpha-k-box",
261 + "alpha-k-box-outline",
262 + "alpha-k-circle",
263 + "alpha-k-circle-outline",
264 + "alpha-l",
265 + "alpha-l-box",
266 + "alpha-l-box-outline",
267 + "alpha-l-circle",
268 + "alpha-l-circle-outline",
269 + "alpha-m",
270 + "alpha-m-box",
271 + "alpha-m-box-outline",
272 + "alpha-m-circle",
273 + "alpha-m-circle-outline",
274 + "alpha-n",
275 + "alpha-n-box",
276 + "alpha-n-box-outline",
277 + "alpha-n-circle",
278 + "alpha-n-circle-outline",
279 + "alpha-o",
280 + "alpha-o-box",
281 + "alpha-o-box-outline",
282 + "alpha-o-circle",
283 + "alpha-o-circle-outline",
284 + "alpha-p",
285 + "alpha-p-box",
286 + "alpha-p-box-outline",
287 + "alpha-p-circle",
288 + "alpha-p-circle-outline",
289 + "alpha-q",
290 + "alpha-q-box",
291 + "alpha-q-box-outline",
292 + "alpha-q-circle",
293 + "alpha-q-circle-outline",
294 + "alpha-r",
295 + "alpha-r-box",
296 + "alpha-r-box-outline",
297 + "alpha-r-circle",
298 + "alpha-r-circle-outline",
299 + "alpha-s",
300 + "alpha-s-box",
301 + "alpha-s-box-outline",
302 + "alpha-s-circle",
303 + "alpha-s-circle-outline",
304 + "alpha-t",
305 + "alpha-t-box",
306 + "alpha-t-box-outline",
307 + "alpha-t-circle",
308 + "alpha-t-circle-outline",
309 + "alpha-u",
310 + "alpha-u-box",
311 + "alpha-u-box-outline",
312 + "alpha-u-circle",
313 + "alpha-u-circle-outline",
314 + "alpha-v",
315 + "alpha-v-box",
316 + "alpha-v-box-outline",
317 + "alpha-v-circle",
318 + "alpha-v-circle-outline",
319 + "alpha-w",
320 + "alpha-w-box",
321 + "alpha-w-box-outline",
322 + "alpha-w-circle",
323 + "alpha-w-circle-outline",
324 + "alpha-x",
325 + "alpha-x-box",
326 + "alpha-x-box-outline",
327 + "alpha-x-circle",
328 + "alpha-x-circle-outline",
329 + "alpha-y",
330 + "alpha-y-box",
331 + "alpha-y-box-outline",
332 + "alpha-y-circle",
333 + "alpha-y-circle-outline",
334 + "alpha-z",
335 + "alpha-z-box",
336 + "alpha-z-box-outline",
337 + "alpha-z-circle",
338 + "alpha-z-circle-outline",
339 + "alphabet-aurebesh",
340 + "alphabet-cyrillic",
341 + "alphabet-greek",
342 + "alphabet-latin",
343 + "alphabet-piqad",
344 + "alphabet-tengwar",
345 + "alphabetical",
346 + "alphabetical-off",
347 + "alphabetical-variant",
348 + "alphabetical-variant-off",
349 + "altimeter",
350 + "amazon",
351 + "amazon-alexa",
352 + "ambulance",
353 + "ammunition",
354 + "ampersand",
355 + "amplifier",
356 + "amplifier-off",
357 + "anchor",
358 + "android",
359 + "android-auto",
360 + "android-debug-bridge",
361 + "android-messages",
362 + "android-studio",
363 + "angle-acute",
364 + "angle-obtuse",
365 + "angle-right",
366 + "angular",
367 + "angularjs",
368 + "animation",
369 + "animation-outline",
370 + "animation-play",
371 + "animation-play-outline",
372 + "ansible",
373 + "antenna",
374 + "anvil",
375 + "apache-kafka",
376 + "api",
377 + "api-off",
378 + "apple",
379 + "apple-airplay",
380 + "apple-finder",
381 + "apple-icloud",
382 + "apple-ios",
383 + "apple-keyboard-caps",
384 + "apple-keyboard-command",
385 + "apple-keyboard-control",
386 + "apple-keyboard-option",
387 + "apple-keyboard-shift",
388 + "apple-safari",
389 + "application",
390 + "application-export",
391 + "application-import",
392 + "approximately-equal",
393 + "approximately-equal-box",
394 + "apps",
395 + "apps-box",
396 + "arch",
397 + "archive",
398 + "archive-arrow-down",
399 + "archive-arrow-down-outline",
400 + "archive-arrow-up",
401 + "archive-arrow-up-outline",
402 + "archive-outline",
403 + "arm-flex",
404 + "arm-flex-outline",
405 + "arrange-bring-forward",
406 + "arrange-bring-to-front",
407 + "arrange-send-backward",
408 + "arrange-send-to-back",
409 + "arrow-all",
410 + "arrow-bottom-left",
411 + "arrow-bottom-left-bold-outline",
412 + "arrow-bottom-left-thick",
413 + "arrow-bottom-right",
414 + "arrow-bottom-right-bold-outline",
415 + "arrow-bottom-right-thick",
416 + "arrow-collapse",
417 + "arrow-collapse-all",
418 + "arrow-collapse-down",
419 + "arrow-collapse-horizontal",
420 + "arrow-collapse-left",
421 + "arrow-collapse-right",
422 + "arrow-collapse-up",
423 + "arrow-collapse-vertical",
424 + "arrow-decision",
425 + "arrow-decision-auto",
426 + "arrow-decision-auto-outline",
427 + "arrow-decision-outline",
428 + "arrow-down",
429 + "arrow-down-bold",
430 + "arrow-down-bold-box",
431 + "arrow-down-bold-box-outline",
432 + "arrow-down-bold-circle",
433 + "arrow-down-bold-circle-outline",
434 + "arrow-down-bold-hexagon-outline",
435 + "arrow-down-bold-outline",
436 + "arrow-down-box",
437 + "arrow-down-circle",
438 + "arrow-down-circle-outline",
439 + "arrow-down-drop-circle",
440 + "arrow-down-drop-circle-outline",
441 + "arrow-down-thick",
442 + "arrow-expand",
443 + "arrow-expand-all",
444 + "arrow-expand-down",
445 + "arrow-expand-horizontal",
446 + "arrow-expand-left",
447 + "arrow-expand-right",
448 + "arrow-expand-up",
449 + "arrow-expand-vertical",
450 + "arrow-horizontal-lock",
451 + "arrow-left",
452 + "arrow-left-bold",
453 + "arrow-left-bold-box",
454 + "arrow-left-bold-box-outline",
455 + "arrow-left-bold-circle",
456 + "arrow-left-bold-circle-outline",
457 + "arrow-left-bold-hexagon-outline",
458 + "arrow-left-bold-outline",
459 + "arrow-left-box",
460 + "arrow-left-circle",
461 + "arrow-left-circle-outline",
462 + "arrow-left-drop-circle",
463 + "arrow-left-drop-circle-outline",
464 + "arrow-left-right",
465 + "arrow-left-right-bold",
466 + "arrow-left-right-bold-outline",
467 + "arrow-left-thick",
468 + "arrow-right",
469 + "arrow-right-bold",
470 + "arrow-right-bold-box",
471 + "arrow-right-bold-box-outline",
472 + "arrow-right-bold-circle",
473 + "arrow-right-bold-circle-outline",
474 + "arrow-right-bold-hexagon-outline",
475 + "arrow-right-bold-outline",
476 + "arrow-right-box",
477 + "arrow-right-circle",
478 + "arrow-right-circle-outline",
479 + "arrow-right-drop-circle",
480 + "arrow-right-drop-circle-outline",
481 + "arrow-right-thick",
482 + "arrow-split-horizontal",
483 + "arrow-split-vertical",
484 + "arrow-top-left",
485 + "arrow-top-left-bold-outline",
486 + "arrow-top-left-bottom-right",
487 + "arrow-top-left-bottom-right-bold",
488 + "arrow-top-left-thick",
489 + "arrow-top-right",
490 + "arrow-top-right-bold-outline",
491 + "arrow-top-right-bottom-left",
492 + "arrow-top-right-bottom-left-bold",
493 + "arrow-top-right-thick",
494 + "arrow-up",
495 + "arrow-up-bold",
496 + "arrow-up-bold-box",
497 + "arrow-up-bold-box-outline",
498 + "arrow-up-bold-circle",
499 + "arrow-up-bold-circle-outline",
500 + "arrow-up-bold-hexagon-outline",
501 + "arrow-up-bold-outline",
502 + "arrow-up-box",
503 + "arrow-up-circle",
504 + "arrow-up-circle-outline",
505 + "arrow-up-down",
506 + "arrow-up-down-bold",
507 + "arrow-up-down-bold-outline",
508 + "arrow-up-drop-circle",
509 + "arrow-up-drop-circle-outline",
510 + "arrow-up-thick",
511 + "arrow-vertical-lock",
512 + "artstation",
513 + "aspect-ratio",
514 + "assistant",
515 + "asterisk",
516 + "at",
517 + "atlassian",
518 + "atm",
519 + "atom",
520 + "atom-variant",
521 + "attachment",
522 + "audio-video",
523 + "audio-video-off",
524 + "augmented-reality",
525 + "auto-download",
526 + "auto-fix",
527 + "auto-upload",
528 + "autorenew",
529 + "av-timer",
530 + "aws",
531 + "axe",
532 + "axis",
533 + "axis-arrow",
534 + "axis-arrow-info",
535 + "axis-arrow-lock",
536 + "axis-lock",
537 + "axis-x-arrow",
538 + "axis-x-arrow-lock",
539 + "axis-x-rotate-clockwise",
540 + "axis-x-rotate-counterclockwise",
541 + "axis-x-y-arrow-lock",
542 + "axis-y-arrow",
543 + "axis-y-arrow-lock",
544 + "axis-y-rotate-clockwise",
545 + "axis-y-rotate-counterclockwise",
546 + "axis-z-arrow",
547 + "axis-z-arrow-lock",
548 + "axis-z-rotate-clockwise",
549 + "axis-z-rotate-counterclockwise",
550 + "babel",
551 + "baby",
552 + "baby-bottle",
553 + "baby-bottle-outline",
554 + "baby-buggy",
555 + "baby-carriage",
556 + "baby-carriage-off",
557 + "baby-face",
558 + "baby-face-outline",
559 + "backburger",
560 + "backspace",
561 + "backspace-outline",
562 + "backspace-reverse",
563 + "backspace-reverse-outline",
564 + "backup-restore",
565 + "bacteria",
566 + "bacteria-outline",
567 + "badge-account",
568 + "badge-account-alert",
569 + "badge-account-alert-outline",
570 + "badge-account-horizontal",
571 + "badge-account-horizontal-outline",
572 + "badge-account-outline",
573 + "badminton",
574 + "bag-carry-on",
575 + "bag-carry-on-check",
576 + "bag-carry-on-off",
577 + "bag-checked",
578 + "bag-personal",
579 + "bag-personal-off",
580 + "bag-personal-off-outline",
581 + "bag-personal-outline",
582 + "baguette",
583 + "balloon",
584 + "ballot",
585 + "ballot-outline",
586 + "ballot-recount",
587 + "ballot-recount-outline",
588 + "bandage",
589 + "bandcamp",
590 + "bank",
591 + "bank-minus",
592 + "bank-outline",
593 + "bank-plus",
594 + "bank-remove",
595 + "bank-transfer",
596 + "bank-transfer-in",
597 + "bank-transfer-out",
598 + "barcode",
599 + "barcode-off",
600 + "barcode-scan",
601 + "barley",
602 + "barley-off",
603 + "barn",
604 + "barrel",
605 + "baseball",
606 + "baseball-bat",
607 + "bash",
608 + "basket",
609 + "basket-fill",
610 + "basket-outline",
611 + "basket-unfill",
612 + "basketball",
613 + "basketball-hoop",
614 + "basketball-hoop-outline",
615 + "bat",
616 + "battery",
617 + "battery-10",
618 + "battery-10-bluetooth",
619 + "battery-20",
620 + "battery-20-bluetooth",
621 + "battery-30",
622 + "battery-30-bluetooth",
623 + "battery-40",
624 + "battery-40-bluetooth",
625 + "battery-50",
626 + "battery-50-bluetooth",
627 + "battery-60",
628 + "battery-60-bluetooth",
629 + "battery-70",
630 + "battery-70-bluetooth",
631 + "battery-80",
632 + "battery-80-bluetooth",
633 + "battery-90",
634 + "battery-90-bluetooth",
635 + "battery-alert",
636 + "battery-alert-bluetooth",
637 + "battery-alert-variant",
638 + "battery-alert-variant-outline",
639 + "battery-bluetooth",
640 + "battery-bluetooth-variant",
641 + "battery-charging",
642 + "battery-charging-10",
643 + "battery-charging-100",
644 + "battery-charging-20",
645 + "battery-charging-30",
646 + "battery-charging-40",
647 + "battery-charging-50",
648 + "battery-charging-60",
649 + "battery-charging-70",
650 + "battery-charging-80",
651 + "battery-charging-90",
652 + "battery-charging-high",
653 + "battery-charging-low",
654 + "battery-charging-medium",
655 + "battery-charging-outline",
656 + "battery-charging-wireless",
657 + "battery-charging-wireless-10",
658 + "battery-charging-wireless-20",
659 + "battery-charging-wireless-30",
660 + "battery-charging-wireless-40",
661 + "battery-charging-wireless-50",
662 + "battery-charging-wireless-60",
663 + "battery-charging-wireless-70",
664 + "battery-charging-wireless-80",
665 + "battery-charging-wireless-90",
666 + "battery-charging-wireless-alert",
667 + "battery-charging-wireless-outline",
668 + "battery-heart",
669 + "battery-heart-outline",
670 + "battery-heart-variant",
671 + "battery-high",
672 + "battery-low",
673 + "battery-medium",
674 + "battery-minus",
675 + "battery-negative",
676 + "battery-off",
677 + "battery-off-outline",
678 + "battery-outline",
679 + "battery-plus",
680 + "battery-positive",
681 + "battery-unknown",
682 + "battery-unknown-bluetooth",
683 + "battlenet",
684 + "beach",
685 + "beaker",
686 + "beaker-alert",
687 + "beaker-alert-outline",
688 + "beaker-check",
689 + "beaker-check-outline",
690 + "beaker-minus",
691 + "beaker-minus-outline",
692 + "beaker-outline",
693 + "beaker-plus",
694 + "beaker-plus-outline",
695 + "beaker-question",
696 + "beaker-question-outline",
697 + "beaker-remove",
698 + "beaker-remove-outline",
699 + "bed",
700 + "bed-double",
701 + "bed-double-outline",
702 + "bed-empty",
703 + "bed-king",
704 + "bed-king-outline",
705 + "bed-outline",
706 + "bed-queen",
707 + "bed-queen-outline",
708 + "bed-single",
709 + "bed-single-outline",
710 + "bee",
711 + "bee-flower",
712 + "beehive-off-outline",
713 + "beehive-outline",
714 + "beer",
715 + "beer-outline",
716 + "bell",
717 + "bell-alert",
718 + "bell-alert-outline",
719 + "bell-cancel",
720 + "bell-cancel-outline",
721 + "bell-check",
722 + "bell-check-outline",
723 + "bell-circle",
724 + "bell-circle-outline",
725 + "bell-minus",
726 + "bell-minus-outline",
727 + "bell-off",
728 + "bell-off-outline",
729 + "bell-outline",
730 + "bell-plus",
731 + "bell-plus-outline",
732 + "bell-remove",
733 + "bell-remove-outline",
734 + "bell-ring",
735 + "bell-ring-outline",
736 + "bell-sleep",
737 + "bell-sleep-outline",
738 + "beta",
739 + "betamax",
740 + "biathlon",
741 + "bicycle",
742 + "bicycle-basket",
743 + "bike",
744 + "bike-fast",
745 + "billboard",
746 + "billiards",
747 + "billiards-rack",
748 + "binoculars",
749 + "bio",
750 + "biohazard",
751 + "bitbucket",
752 + "bitcoin",
753 + "black-mesa",
754 + "blender",
755 + "blender-software",
756 + "blinds",
757 + "blinds-open",
758 + "block-helper",
759 + "blogger",
760 + "blood-bag",
761 + "bluetooth",
762 + "bluetooth-audio",
763 + "bluetooth-connect",
764 + "bluetooth-off",
765 + "bluetooth-settings",
766 + "bluetooth-transfer",
767 + "blur",
768 + "blur-linear",
769 + "blur-off",
770 + "blur-radial",
771 + "bolnisi-cross",
772 + "bolt",
773 + "bomb",
774 + "bomb-off",
775 + "bone",
776 + "book",
777 + "book-account",
778 + "book-account-outline",
779 + "book-alphabet",
780 + "book-cross",
781 + "book-information-variant",
782 + "book-lock",
783 + "book-lock-open",
784 + "book-minus",
785 + "book-minus-multiple",
786 + "book-minus-multiple-outline",
787 + "book-multiple",
788 + "book-multiple-outline",
789 + "book-music",
790 + "book-open",
791 + "book-open-outline",
792 + "book-open-page-variant",
793 + "book-open-variant",
794 + "book-outline",
795 + "book-play",
796 + "book-play-outline",
797 + "book-plus",
798 + "book-plus-multiple",
799 + "book-plus-multiple-outline",
800 + "book-remove",
801 + "book-remove-multiple",
802 + "book-remove-multiple-outline",
803 + "book-search",
804 + "book-search-outline",
805 + "book-variant",
806 + "book-variant-multiple",
807 + "bookmark",
808 + "bookmark-check",
809 + "bookmark-check-outline",
810 + "bookmark-minus",
811 + "bookmark-minus-outline",
812 + "bookmark-multiple",
813 + "bookmark-multiple-outline",
814 + "bookmark-music",
815 + "bookmark-music-outline",
816 + "bookmark-off",
817 + "bookmark-off-outline",
818 + "bookmark-outline",
819 + "bookmark-plus",
820 + "bookmark-plus-outline",
821 + "bookmark-remove",
822 + "bookmark-remove-outline",
823 + "bookshelf",
824 + "boom-gate",
825 + "boom-gate-alert",
826 + "boom-gate-alert-outline",
827 + "boom-gate-down",
828 + "boom-gate-down-outline",
829 + "boom-gate-outline",
830 + "boom-gate-up",
831 + "boom-gate-up-outline",
832 + "boombox",
833 + "boomerang",
834 + "bootstrap",
835 + "border-all",
836 + "border-all-variant",
837 + "border-bottom",
838 + "border-bottom-variant",
839 + "border-color",
840 + "border-horizontal",
841 + "border-inside",
842 + "border-left",
843 + "border-left-variant",
844 + "border-none",
845 + "border-none-variant",
846 + "border-outside",
847 + "border-right",
848 + "border-right-variant",
849 + "border-style",
850 + "border-top",
851 + "border-top-variant",
852 + "border-vertical",
853 + "bottle-soda",
854 + "bottle-soda-classic",
855 + "bottle-soda-classic-outline",
856 + "bottle-soda-outline",
857 + "bottle-tonic",
858 + "bottle-tonic-outline",
859 + "bottle-tonic-plus",
860 + "bottle-tonic-plus-outline",
861 + "bottle-tonic-skull",
862 + "bottle-tonic-skull-outline",
863 + "bottle-wine",
864 + "bottle-wine-outline",
865 + "bow-tie",
866 + "bowl",
867 + "bowl-mix",
868 + "bowl-mix-outline",
869 + "bowl-outline",
870 + "bowling",
871 + "box",
872 + "box-cutter",
873 + "box-cutter-off",
874 + "box-shadow",
875 + "boxing-glove",
876 + "braille",
877 + "brain",
878 + "bread-slice",
879 + "bread-slice-outline",
880 + "bridge",
881 + "briefcase",
882 + "briefcase-account",
883 + "briefcase-account-outline",
884 + "briefcase-check",
885 + "briefcase-check-outline",
886 + "briefcase-clock",
887 + "briefcase-clock-outline",
888 + "briefcase-download",
889 + "briefcase-download-outline",
890 + "briefcase-edit",
891 + "briefcase-edit-outline",
892 + "briefcase-minus",
893 + "briefcase-minus-outline",
894 + "briefcase-outline",
895 + "briefcase-plus",
896 + "briefcase-plus-outline",
897 + "briefcase-remove",
898 + "briefcase-remove-outline",
899 + "briefcase-search",
900 + "briefcase-search-outline",
901 + "briefcase-upload",
902 + "briefcase-upload-outline",
903 + "briefcase-variant",
904 + "briefcase-variant-outline",
905 + "brightness-1",
906 + "brightness-2",
907 + "brightness-3",
908 + "brightness-4",
909 + "brightness-5",
910 + "brightness-6",
911 + "brightness-7",
912 + "brightness-auto",
913 + "brightness-percent",
914 + "broom",
915 + "brush",
916 + "bucket",
917 + "bucket-outline",
918 + "buddhism",
919 + "buffer",
920 + "buffet",
921 + "bug",
922 + "bug-check",
923 + "bug-check-outline",
924 + "bug-outline",
925 + "bugle",
926 + "bulldozer",
927 + "bullet",
928 + "bulletin-board",
929 + "bullhorn",
930 + "bullhorn-outline",
931 + "bullseye",
932 + "bullseye-arrow",
933 + "bulma",
934 + "bunk-bed",
935 + "bunk-bed-outline",
936 + "bus",
937 + "bus-alert",
938 + "bus-articulated-end",
939 + "bus-articulated-front",
940 + "bus-clock",
941 + "bus-double-decker",
942 + "bus-marker",
943 + "bus-multiple",
944 + "bus-school",
945 + "bus-side",
946 + "bus-stop",
947 + "bus-stop-covered",
948 + "bus-stop-uncovered",
949 + "cable-data",
950 + "cached",
951 + "cactus",
952 + "cake",
953 + "cake-layered",
954 + "cake-variant",
955 + "calculator",
956 + "calculator-variant",
957 + "calendar",
958 + "calendar-account",
959 + "calendar-account-outline",
960 + "calendar-alert",
961 + "calendar-arrow-left",
962 + "calendar-arrow-right",
963 + "calendar-blank",
964 + "calendar-blank-multiple",
965 + "calendar-blank-outline",
966 + "calendar-check",
967 + "calendar-check-outline",
968 + "calendar-clock",
969 + "calendar-edit",
970 + "calendar-export",
971 + "calendar-heart",
972 + "calendar-import",
973 + "calendar-minus",
974 + "calendar-month",
975 + "calendar-month-outline",
976 + "calendar-multiple",
977 + "calendar-multiple-check",
978 + "calendar-multiselect",
979 + "calendar-outline",
980 + "calendar-plus",
981 + "calendar-question",
982 + "calendar-range",
983 + "calendar-range-outline",
984 + "calendar-refresh",
985 + "calendar-refresh-outline",
986 + "calendar-remove",
987 + "calendar-remove-outline",
988 + "calendar-search",
989 + "calendar-star",
990 + "calendar-sync",
991 + "calendar-sync-outline",
992 + "calendar-text",
993 + "calendar-text-outline",
994 + "calendar-today",
995 + "calendar-week",
996 + "calendar-week-begin",
997 + "calendar-weekend",
998 + "calendar-weekend-outline",
999 + "call-made",
1000 + "call-merge",
1001 + "call-missed",
1002 + "call-received",
1003 + "call-split",
1004 + "camcorder",
1005 + "camcorder-off",
1006 + "camera",
1007 + "camera-account",
1008 + "camera-burst",
1009 + "camera-control",
1010 + "camera-enhance",
1011 + "camera-enhance-outline",
1012 + "camera-front",
1013 + "camera-front-variant",
1014 + "camera-gopro",
1015 + "camera-image",
1016 + "camera-iris",
1017 + "camera-metering-center",
1018 + "camera-metering-matrix",
1019 + "camera-metering-partial",
1020 + "camera-metering-spot",
1021 + "camera-off",
1022 + "camera-outline",
1023 + "camera-party-mode",
1024 + "camera-plus",
1025 + "camera-plus-outline",
1026 + "camera-rear",
1027 + "camera-rear-variant",
1028 + "camera-retake",
1029 + "camera-retake-outline",
1030 + "camera-switch",
1031 + "camera-switch-outline",
1032 + "camera-timer",
1033 + "camera-wireless",
1034 + "camera-wireless-outline",
1035 + "campfire",
1036 + "cancel",
1037 + "candle",
1038 + "candycane",
1039 + "cannabis",
1040 + "caps-lock",
1041 + "car",
1042 + "car-2-plus",
1043 + "car-3-plus",
1044 + "car-arrow-left",
1045 + "car-arrow-right",
1046 + "car-back",
1047 + "car-battery",
1048 + "car-brake-abs",
1049 + "car-brake-alert",
1050 + "car-brake-hold",
1051 + "car-brake-parking",
1052 + "car-brake-retarder",
1053 + "car-child-seat",
1054 + "car-clutch",
1055 + "car-cog",
1056 + "car-connected",
1057 + "car-convertible",
1058 + "car-coolant-level",
1059 + "car-cruise-control",
1060 + "car-defrost-front",
1061 + "car-defrost-rear",
1062 + "car-door",
1063 + "car-door-lock",
1064 + "car-electric",
1065 + "car-esp",
1066 + "car-estate",
1067 + "car-hatchback",
1068 + "car-info",
1069 + "car-key",
1070 + "car-light-dimmed",
1071 + "car-light-fog",
1072 + "car-light-high",
1073 + "car-limousine",
1074 + "car-multiple",
1075 + "car-off",
1076 + "car-parking-lights",
1077 + "car-pickup",
1078 + "car-seat",
1079 + "car-seat-cooler",
1080 + "car-seat-heater",
1081 + "car-settings",
1082 + "car-shift-pattern",
1083 + "car-side",
1084 + "car-sports",
1085 + "car-tire-alert",
1086 + "car-traction-control",
1087 + "car-turbocharger",
1088 + "car-wash",
1089 + "car-windshield",
1090 + "car-windshield-outline",
1091 + "carabiner",
1092 + "caravan",
1093 + "card",
1094 + "card-account-details",
1095 + "card-account-details-outline",
1096 + "card-account-details-star",
1097 + "card-account-details-star-outline",
1098 + "card-account-mail",
1099 + "card-account-mail-outline",
1100 + "card-account-phone",
1101 + "card-account-phone-outline",
1102 + "card-bulleted",
1103 + "card-bulleted-off",
1104 + "card-bulleted-off-outline",
1105 + "card-bulleted-outline",
1106 + "card-bulleted-settings",
1107 + "card-bulleted-settings-outline",
1108 + "card-outline",
1109 + "card-plus",
1110 + "card-plus-outline",
1111 + "card-search",
1112 + "card-search-outline",
1113 + "card-text",
1114 + "card-text-outline",
1115 + "cards",
1116 + "cards-club",
1117 + "cards-diamond",
1118 + "cards-diamond-outline",
1119 + "cards-heart",
1120 + "cards-outline",
1121 + "cards-playing-outline",
1122 + "cards-spade",
1123 + "cards-variant",
1124 + "carrot",
1125 + "cart",
1126 + "cart-arrow-down",
1127 + "cart-arrow-right",
1128 + "cart-arrow-up",
1129 + "cart-minus",
1130 + "cart-off",
1131 + "cart-outline",
1132 + "cart-plus",
1133 + "cart-remove",
1134 + "case-sensitive-alt",
1135 + "cash",
1136 + "cash-100",
1137 + "cash-marker",
1138 + "cash-minus",
1139 + "cash-multiple",
1140 + "cash-plus",
1141 + "cash-refund",
1142 + "cash-register",
1143 + "cash-remove",
1144 + "cash-usd",
1145 + "cash-usd-outline",
1146 + "cassette",
1147 + "cast",
1148 + "cast-audio",
1149 + "cast-connected",
1150 + "cast-education",
1151 + "cast-off",
1152 + "castle",
1153 + "cat",
1154 + "cctv",
1155 + "ceiling-light",
1156 + "cellphone",
1157 + "cellphone-android",
1158 + "cellphone-arrow-down",
1159 + "cellphone-basic",
1160 + "cellphone-charging",
1161 + "cellphone-cog",
1162 + "cellphone-dock",
1163 + "cellphone-erase",
1164 + "cellphone-information",
1165 + "cellphone-iphone",
1166 + "cellphone-key",
1167 + "cellphone-link",
1168 + "cellphone-link-off",
1169 + "cellphone-lock",
1170 + "cellphone-message",
1171 + "cellphone-message-off",
1172 + "cellphone-nfc",
1173 + "cellphone-nfc-off",
1174 + "cellphone-off",
1175 + "cellphone-play",
1176 + "cellphone-screenshot",
1177 + "cellphone-settings",
1178 + "cellphone-sound",
1179 + "cellphone-text",
1180 + "cellphone-wireless",
1181 + "celtic-cross",
1182 + "centos",
1183 + "certificate",
1184 + "certificate-outline",
1185 + "chair-rolling",
1186 + "chair-school",
1187 + "charity",
1188 + "chart-arc",
1189 + "chart-areaspline",
1190 + "chart-areaspline-variant",
1191 + "chart-bar",
1192 + "chart-bar-stacked",
1193 + "chart-bell-curve",
1194 + "chart-bell-curve-cumulative",
1195 + "chart-bubble",
1196 + "chart-donut",
1197 + "chart-donut-variant",
1198 + "chart-gantt",
1199 + "chart-histogram",
1200 + "chart-line",
1201 + "chart-line-stacked",
1202 + "chart-line-variant",
1203 + "chart-multiline",
1204 + "chart-multiple",
1205 + "chart-pie",
1206 + "chart-ppf",
1207 + "chart-sankey",
1208 + "chart-sankey-variant",
1209 + "chart-scatter-plot",
1210 + "chart-scatter-plot-hexbin",
1211 + "chart-timeline",
1212 + "chart-timeline-variant",
1213 + "chart-tree",
1214 + "chat",
1215 + "chat-alert",
1216 + "chat-alert-outline",
1217 + "chat-minus",
1218 + "chat-minus-outline",
1219 + "chat-outline",
1220 + "chat-plus",
1221 + "chat-plus-outline",
1222 + "chat-processing",
1223 + "chat-processing-outline",
1224 + "chat-remove",
1225 + "chat-remove-outline",
1226 + "chat-sleep",
1227 + "chat-sleep-outline",
1228 + "check",
1229 + "check-all",
1230 + "check-bold",
1231 + "check-box-multiple-outline",
1232 + "check-box-outline",
1233 + "check-circle",
1234 + "check-circle-outline",
1235 + "check-decagram",
1236 + "check-network",
1237 + "check-network-outline",
1238 + "check-outline",
1239 + "check-underline",
1240 + "check-underline-circle",
1241 + "check-underline-circle-outline",
1242 + "checkbook",
1243 + "checkbox-blank",
1244 + "checkbox-blank-circle",
1245 + "checkbox-blank-circle-outline",
1246 + "checkbox-blank-off",
1247 + "checkbox-blank-off-outline",
1248 + "checkbox-blank-outline",
1249 + "checkbox-intermediate",
1250 + "checkbox-marked",
1251 + "checkbox-marked-circle",
1252 + "checkbox-marked-circle-outline",
1253 + "checkbox-marked-outline",
1254 + "checkbox-multiple-blank",
1255 + "checkbox-multiple-blank-circle",
1256 + "checkbox-multiple-blank-circle-outline",
1257 + "checkbox-multiple-blank-outline",
1258 + "checkbox-multiple-marked",
1259 + "checkbox-multiple-marked-circle",
1260 + "checkbox-multiple-marked-circle-outline",
1261 + "checkbox-multiple-marked-outline",
1262 + "checkerboard",
1263 + "checkerboard-minus",
1264 + "checkerboard-plus",
1265 + "checkerboard-remove",
1266 + "cheese",
1267 + "cheese-off",
1268 + "chef-hat",
1269 + "chemical-weapon",
1270 + "chess-bishop",
1271 + "chess-king",
1272 + "chess-knight",
1273 + "chess-pawn",
1274 + "chess-queen",
1275 + "chess-rook",
1276 + "chevron-double-down",
1277 + "chevron-double-left",
1278 + "chevron-double-right",
1279 + "chevron-double-up",
1280 + "chevron-down",
1281 + "chevron-down-box",
1282 + "chevron-down-box-outline",
1283 + "chevron-down-circle",
1284 + "chevron-down-circle-outline",
1285 + "chevron-left",
1286 + "chevron-left-box",
1287 + "chevron-left-box-outline",
1288 + "chevron-left-circle",
1289 + "chevron-left-circle-outline",
1290 + "chevron-right",
1291 + "chevron-right-box",
1292 + "chevron-right-box-outline",
1293 + "chevron-right-circle",
1294 + "chevron-right-circle-outline",
1295 + "chevron-triple-down",
1296 + "chevron-triple-left",
1297 + "chevron-triple-right",
1298 + "chevron-triple-up",
1299 + "chevron-up",
1300 + "chevron-up-box",
1301 + "chevron-up-box-outline",
1302 + "chevron-up-circle",
1303 + "chevron-up-circle-outline",
1304 + "chili-hot",
1305 + "chili-medium",
1306 + "chili-mild",
1307 + "chili-off",
1308 + "chip",
1309 + "christianity",
1310 + "christianity-outline",
1311 + "church",
1312 + "cigar",
1313 + "cigar-off",
1314 + "circle",
1315 + "circle-double",
1316 + "circle-edit-outline",
1317 + "circle-expand",
1318 + "circle-half",
1319 + "circle-half-full",
1320 + "circle-medium",
1321 + "circle-multiple",
1322 + "circle-multiple-outline",
1323 + "circle-off-outline",
1324 + "circle-outline",
1325 + "circle-slice-1",
1326 + "circle-slice-2",
1327 + "circle-slice-3",
1328 + "circle-slice-4",
1329 + "circle-slice-5",
1330 + "circle-slice-6",
1331 + "circle-slice-7",
1332 + "circle-slice-8",
1333 + "circle-small",
1334 + "circular-saw",
1335 + "city",
1336 + "city-variant",
1337 + "city-variant-outline",
1338 + "clipboard",
1339 + "clipboard-account",
1340 + "clipboard-account-outline",
1341 + "clipboard-alert",
1342 + "clipboard-alert-outline",
1343 + "clipboard-arrow-down",
1344 + "clipboard-arrow-down-outline",
1345 + "clipboard-arrow-left",
1346 + "clipboard-arrow-left-outline",
1347 + "clipboard-arrow-right",
1348 + "clipboard-arrow-right-outline",
1349 + "clipboard-arrow-up",
1350 + "clipboard-arrow-up-outline",
1351 + "clipboard-check",
1352 + "clipboard-check-multiple",
1353 + "clipboard-check-multiple-outline",
1354 + "clipboard-check-outline",
1355 + "clipboard-file",
1356 + "clipboard-file-outline",
1357 + "clipboard-flow",
1358 + "clipboard-flow-outline",
1359 + "clipboard-list",
1360 + "clipboard-list-outline",
1361 + "clipboard-multiple",
1362 + "clipboard-multiple-outline",
1363 + "clipboard-outline",
1364 + "clipboard-play",
1365 + "clipboard-play-multiple",
1366 + "clipboard-play-multiple-outline",
1367 + "clipboard-play-outline",
1368 + "clipboard-plus",
1369 + "clipboard-plus-outline",
1370 + "clipboard-pulse",
1371 + "clipboard-pulse-outline",
1372 + "clipboard-text",
1373 + "clipboard-text-multiple",
1374 + "clipboard-text-multiple-outline",
1375 + "clipboard-text-outline",
1376 + "clipboard-text-play",
1377 + "clipboard-text-play-outline",
1378 + "clippy",
1379 + "clock",
1380 + "clock-alert",
1381 + "clock-alert-outline",
1382 + "clock-check",
1383 + "clock-check-outline",
1384 + "clock-digital",
1385 + "clock-end",
1386 + "clock-fast",
1387 + "clock-in",
1388 + "clock-out",
1389 + "clock-outline",
1390 + "clock-start",
1391 + "clock-time-eight",
1392 + "clock-time-eight-outline",
1393 + "clock-time-eleven",
1394 + "clock-time-eleven-outline",
1395 + "clock-time-five",
1396 + "clock-time-five-outline",
1397 + "clock-time-four",
1398 + "clock-time-four-outline",
1399 + "clock-time-nine",
1400 + "clock-time-nine-outline",
1401 + "clock-time-one",
1402 + "clock-time-one-outline",
1403 + "clock-time-seven",
1404 + "clock-time-seven-outline",
1405 + "clock-time-six",
1406 + "clock-time-six-outline",
1407 + "clock-time-ten",
1408 + "clock-time-ten-outline",
1409 + "clock-time-three",
1410 + "clock-time-three-outline",
1411 + "clock-time-twelve",
1412 + "clock-time-twelve-outline",
1413 + "clock-time-two",
1414 + "clock-time-two-outline",
1415 + "close",
1416 + "close-box",
1417 + "close-box-multiple",
1418 + "close-box-multiple-outline",
1419 + "close-box-outline",
1420 + "close-circle",
1421 + "close-circle-multiple",
1422 + "close-circle-multiple-outline",
1423 + "close-circle-outline",
1424 + "close-network",
1425 + "close-network-outline",
1426 + "close-octagon",
1427 + "close-octagon-outline",
1428 + "close-outline",
1429 + "close-thick",
1430 + "closed-caption",
1431 + "closed-caption-outline",
1432 + "cloud",
1433 + "cloud-alert",
1434 + "cloud-braces",
1435 + "cloud-check",
1436 + "cloud-check-outline",
1437 + "cloud-circle",
1438 + "cloud-download",
1439 + "cloud-download-outline",
1440 + "cloud-lock",
1441 + "cloud-lock-outline",
1442 + "cloud-off-outline",
1443 + "cloud-outline",
1444 + "cloud-print",
1445 + "cloud-print-outline",
1446 + "cloud-question",
1447 + "cloud-refresh",
1448 + "cloud-search",
1449 + "cloud-search-outline",
1450 + "cloud-sync",
1451 + "cloud-sync-outline",
1452 + "cloud-tags",
1453 + "cloud-upload",
1454 + "cloud-upload-outline",
1455 + "clover",
1456 + "coach-lamp",
1457 + "coat-rack",
1458 + "code-array",
1459 + "code-braces",
1460 + "code-braces-box",
1461 + "code-brackets",
1462 + "code-equal",
1463 + "code-greater-than",
1464 + "code-greater-than-or-equal",
1465 + "code-json",
1466 + "code-less-than",
1467 + "code-less-than-or-equal",
1468 + "code-not-equal",
1469 + "code-not-equal-variant",
1470 + "code-parentheses",
1471 + "code-parentheses-box",
1472 + "code-string",
1473 + "code-tags",
1474 + "code-tags-check",
1475 + "codepen",
1476 + "coffee",
1477 + "coffee-maker",
1478 + "coffee-off",
1479 + "coffee-off-outline",
1480 + "coffee-outline",
1481 + "coffee-to-go",
1482 + "coffee-to-go-outline",
1483 + "coffin",
1484 + "cog",
1485 + "cog-box",
1486 + "cog-clockwise",
1487 + "cog-counterclockwise",
1488 + "cog-off",
1489 + "cog-off-outline",
1490 + "cog-outline",
1491 + "cog-refresh",
1492 + "cog-refresh-outline",
1493 + "cog-sync",
1494 + "cog-sync-outline",
1495 + "cog-transfer",
1496 + "cog-transfer-outline",
1497 + "cogs",
1498 + "collage",
1499 + "collapse-all",
1500 + "collapse-all-outline",
1501 + "color-helper",
1502 + "comma",
1503 + "comma-box",
1504 + "comma-box-outline",
1505 + "comma-circle",
1506 + "comma-circle-outline",
1507 + "comment",
1508 + "comment-account",
1509 + "comment-account-outline",
1510 + "comment-alert",
1511 + "comment-alert-outline",
1512 + "comment-arrow-left",
1513 + "comment-arrow-left-outline",
1514 + "comment-arrow-right",
1515 + "comment-arrow-right-outline",
1516 + "comment-check",
1517 + "comment-check-outline",
1518 + "comment-edit",
1519 + "comment-edit-outline",
1520 + "comment-eye",
1521 + "comment-eye-outline",
1522 + "comment-multiple",
1523 + "comment-multiple-outline",
1524 + "comment-outline",
1525 + "comment-plus",
1526 + "comment-plus-outline",
1527 + "comment-processing",
1528 + "comment-processing-outline",
1529 + "comment-question",
1530 + "comment-question-outline",
1531 + "comment-quote",
1532 + "comment-quote-outline",
1533 + "comment-remove",
1534 + "comment-remove-outline",
1535 + "comment-search",
1536 + "comment-search-outline",
1537 + "comment-text",
1538 + "comment-text-multiple",
1539 + "comment-text-multiple-outline",
1540 + "comment-text-outline",
1541 + "compare",
1542 + "compare-horizontal",
1543 + "compare-vertical",
1544 + "compass",
1545 + "compass-off",
1546 + "compass-off-outline",
1547 + "compass-outline",
1548 + "compass-rose",
1549 + "concourse-ci",
1550 + "console",
1551 + "console-line",
1552 + "console-network",
1553 + "console-network-outline",
1554 + "consolidate",
1555 + "contactless-payment",
1556 + "contactless-payment-circle",
1557 + "contactless-payment-circle-outline",
1558 + "contacts",
1559 + "contacts-outline",
1560 + "contain",
1561 + "contain-end",
1562 + "contain-start",
1563 + "content-copy",
1564 + "content-cut",
1565 + "content-duplicate",
1566 + "content-paste",
1567 + "content-save",
1568 + "content-save-alert",
1569 + "content-save-alert-outline",
1570 + "content-save-all",
1571 + "content-save-all-outline",
1572 + "content-save-cog",
1573 + "content-save-cog-outline",
1574 + "content-save-edit",
1575 + "content-save-edit-outline",
1576 + "content-save-move",
1577 + "content-save-move-outline",
1578 + "content-save-outline",
1579 + "content-save-settings",
1580 + "content-save-settings-outline",
1581 + "contrast",
1582 + "contrast-box",
1583 + "contrast-circle",
1584 + "controller-classic",
1585 + "controller-classic-outline",
1586 + "cookie",
1587 + "coolant-temperature",
1588 + "copyright",
1589 + "cordova",
1590 + "corn",
1591 + "corn-off",
1592 + "cosine-wave",
1593 + "counter",
1594 + "cow",
1595 + "cpu-32-bit",
1596 + "cpu-64-bit",
1597 + "crane",
1598 + "creation",
1599 + "creative-commons",
1600 + "credit-card",
1601 + "credit-card-check",
1602 + "credit-card-check-outline",
1603 + "credit-card-clock",
1604 + "credit-card-clock-outline",
1605 + "credit-card-marker",
1606 + "credit-card-marker-outline",
1607 + "credit-card-minus",
1608 + "credit-card-minus-outline",
1609 + "credit-card-multiple",
1610 + "credit-card-multiple-outline",
1611 + "credit-card-off",
1612 + "credit-card-off-outline",
1613 + "credit-card-outline",
1614 + "credit-card-plus",
1615 + "credit-card-plus-outline",
1616 + "credit-card-refund",
1617 + "credit-card-refund-outline",
1618 + "credit-card-remove",
1619 + "credit-card-remove-outline",
1620 + "credit-card-scan",
1621 + "credit-card-scan-outline",
1622 + "credit-card-settings",
1623 + "credit-card-settings-outline",
1624 + "credit-card-wireless",
1625 + "credit-card-wireless-off",
1626 + "credit-card-wireless-off-outline",
1627 + "credit-card-wireless-outline",
1628 + "cricket",
1629 + "crop",
1630 + "crop-free",
1631 + "crop-landscape",
1632 + "crop-portrait",
1633 + "crop-rotate",
1634 + "crop-square",
1635 + "crosshairs",
1636 + "crosshairs-gps",
1637 + "crosshairs-off",
1638 + "crosshairs-question",
1639 + "crown",
1640 + "crown-outline",
1641 + "cryengine",
1642 + "crystal-ball",
1643 + "cube",
1644 + "cube-off",
1645 + "cube-off-outline",
1646 + "cube-outline",
1647 + "cube-scan",
1648 + "cube-send",
1649 + "cube-unfolded",
1650 + "cup",
1651 + "cup-off",
1652 + "cup-off-outline",
1653 + "cup-outline",
1654 + "cup-water",
1655 + "cupboard",
1656 + "cupboard-outline",
1657 + "cupcake",
1658 + "curling",
1659 + "currency-bdt",
1660 + "currency-brl",
1661 + "currency-btc",
1662 + "currency-cny",
1663 + "currency-eth",
1664 + "currency-eur",
1665 + "currency-eur-off",
1666 + "currency-gbp",
1667 + "currency-ils",
1668 + "currency-inr",
1669 + "currency-jpy",
1670 + "currency-krw",
1671 + "currency-kzt",
1672 + "currency-ngn",
1673 + "currency-php",
1674 + "currency-rial",
1675 + "currency-rub",
1676 + "currency-sign",
1677 + "currency-try",
1678 + "currency-twd",
1679 + "currency-usd",
1680 + "currency-usd-circle",
1681 + "currency-usd-circle-outline",
1682 + "currency-usd-off",
1683 + "current-ac",
1684 + "current-dc",
1685 + "cursor-default",
1686 + "cursor-default-click",
1687 + "cursor-default-click-outline",
1688 + "cursor-default-gesture",
1689 + "cursor-default-gesture-outline",
1690 + "cursor-default-outline",
1691 + "cursor-move",
1692 + "cursor-pointer",
1693 + "cursor-text",
1694 + "database",
1695 + "database-check",
1696 + "database-edit",
1697 + "database-export",
1698 + "database-import",
1699 + "database-lock",
1700 + "database-marker",
1701 + "database-minus",
1702 + "database-plus",
1703 + "database-refresh",
1704 + "database-remove",
1705 + "database-search",
1706 + "database-settings",
1707 + "database-sync",
1708 + "death-star",
1709 + "death-star-variant",
1710 + "deathly-hallows",
1711 + "debian",
1712 + "debug-step-into",
1713 + "debug-step-out",
1714 + "debug-step-over",
1715 + "decagram",
1716 + "decagram-outline",
1717 + "decimal",
1718 + "decimal-comma",
1719 + "decimal-comma-decrease",
1720 + "decimal-comma-increase",
1721 + "decimal-decrease",
1722 + "decimal-increase",
1723 + "delete",
1724 + "delete-alert",
1725 + "delete-alert-outline",
1726 + "delete-circle",
1727 + "delete-circle-outline",
1728 + "delete-empty",
1729 + "delete-empty-outline",
1730 + "delete-forever",
1731 + "delete-forever-outline",
1732 + "delete-off",
1733 + "delete-off-outline",
1734 + "delete-outline",
1735 + "delete-restore",
1736 + "delete-sweep",
1737 + "delete-sweep-outline",
1738 + "delete-variant",
1739 + "delta",
1740 + "desk",
1741 + "desk-lamp",
1742 + "deskphone",
1743 + "desktop-classic",
1744 + "desktop-mac",
1745 + "desktop-mac-dashboard",
1746 + "desktop-tower",
1747 + "desktop-tower-monitor",
1748 + "details",
1749 + "dev-to",
1750 + "developer-board",
1751 + "deviantart",
1752 + "devices",
1753 + "diabetes",
1754 + "dialpad",
1755 + "diameter",
1756 + "diameter-outline",
1757 + "diameter-variant",
1758 + "diamond",
1759 + "diamond-outline",
1760 + "diamond-stone",
1761 + "dice-1",
1762 + "dice-1-outline",
1763 + "dice-2",
1764 + "dice-2-outline",
1765 + "dice-3",
1766 + "dice-3-outline",
1767 + "dice-4",
1768 + "dice-4-outline",
1769 + "dice-5",
1770 + "dice-5-outline",
1771 + "dice-6",
1772 + "dice-6-outline",
1773 + "dice-d10",
1774 + "dice-d10-outline",
1775 + "dice-d12",
1776 + "dice-d12-outline",
1777 + "dice-d20",
1778 + "dice-d20-outline",
1779 + "dice-d4",
1780 + "dice-d4-outline",
1781 + "dice-d6",
1782 + "dice-d6-outline",
1783 + "dice-d8",
1784 + "dice-d8-outline",
1785 + "dice-multiple",
1786 + "dice-multiple-outline",
1787 + "digital-ocean",
1788 + "dip-switch",
1789 + "directions",
1790 + "directions-fork",
1791 + "disc",
1792 + "disc-alert",
1793 + "disc-player",
1794 + "discord",
1795 + "dishwasher",
1796 + "dishwasher-alert",
1797 + "dishwasher-off",
1798 + "disqus",
1799 + "distribute-horizontal-center",
1800 + "distribute-horizontal-left",
1801 + "distribute-horizontal-right",
1802 + "distribute-vertical-bottom",
1803 + "distribute-vertical-center",
1804 + "distribute-vertical-top",
1805 + "diving-flippers",
1806 + "diving-helmet",
1807 + "diving-scuba",
1808 + "diving-scuba-flag",
1809 + "diving-scuba-tank",
1810 + "diving-scuba-tank-multiple",
1811 + "diving-snorkel",
1812 + "division",
1813 + "division-box",
1814 + "dlna",
1815 + "dna",
1816 + "dns",
1817 + "dns-outline",
1818 + "do-not-disturb",
1819 + "do-not-disturb-off",
1820 + "dock-bottom",
1821 + "dock-left",
1822 + "dock-right",
1823 + "dock-window",
1824 + "docker",
1825 + "doctor",
1826 + "dog",
1827 + "dog-service",
1828 + "dog-side",
1829 + "dolby",
1830 + "dolly",
1831 + "domain",
1832 + "domain-off",
1833 + "domain-plus",
1834 + "domain-remove",
1835 + "dome-light",
1836 + "domino-mask",
1837 + "donkey",
1838 + "door",
1839 + "door-closed",
1840 + "door-closed-lock",
1841 + "door-open",
1842 + "doorbell",
1843 + "doorbell-video",
1844 + "dot-net",
1845 + "dots-horizontal",
1846 + "dots-horizontal-circle",
1847 + "dots-horizontal-circle-outline",
1848 + "dots-vertical",
1849 + "dots-vertical-circle",
1850 + "dots-vertical-circle-outline",
1851 + "douban",
1852 + "download",
1853 + "download-box",
1854 + "download-box-outline",
1855 + "download-circle",
1856 + "download-circle-outline",
1857 + "download-lock",
1858 + "download-lock-outline",
1859 + "download-multiple",
1860 + "download-network",
1861 + "download-network-outline",
1862 + "download-off",
1863 + "download-off-outline",
1864 + "download-outline",
1865 + "drag",
1866 + "drag-horizontal",
1867 + "drag-horizontal-variant",
1868 + "drag-variant",
1869 + "drag-vertical",
1870 + "drag-vertical-variant",
1871 + "drama-masks",
1872 + "draw",
1873 + "drawing",
1874 + "drawing-box",
1875 + "dresser",
1876 + "dresser-outline",
1877 + "drone",
1878 + "dropbox",
1879 + "drupal",
1880 + "duck",
1881 + "dumbbell",
1882 + "dump-truck",
1883 + "ear-hearing",
1884 + "ear-hearing-off",
1885 + "earth",
1886 + "earth-arrow-right",
1887 + "earth-box",
1888 + "earth-box-minus",
1889 + "earth-box-off",
1890 + "earth-box-plus",
1891 + "earth-box-remove",
1892 + "earth-minus",
1893 + "earth-off",
1894 + "earth-plus",
1895 + "earth-remove",
1896 + "egg",
1897 + "egg-easter",
1898 + "egg-off",
1899 + "egg-off-outline",
1900 + "egg-outline",
1901 + "eight-track",
1902 + "eject",
1903 + "eject-outline",
1904 + "electric-switch",
1905 + "electric-switch-closed",
1906 + "electron-framework",
1907 + "elephant",
1908 + "elevation-decline",
1909 + "elevation-rise",
1910 + "elevator",
1911 + "elevator-down",
1912 + "elevator-passenger",
1913 + "elevator-up",
1914 + "ellipse",
1915 + "ellipse-outline",
1916 + "email",
1917 + "email-alert",
1918 + "email-alert-outline",
1919 + "email-box",
1920 + "email-check",
1921 + "email-check-outline",
1922 + "email-edit",
1923 + "email-edit-outline",
1924 + "email-lock",
1925 + "email-mark-as-unread",
1926 + "email-minus",
1927 + "email-minus-outline",
1928 + "email-multiple",
1929 + "email-multiple-outline",
1930 + "email-newsletter",
1931 + "email-off",
1932 + "email-off-outline",
1933 + "email-open",
1934 + "email-open-multiple",
1935 + "email-open-multiple-outline",
1936 + "email-open-outline",
1937 + "email-outline",
1938 + "email-plus",
1939 + "email-plus-outline",
1940 + "email-receive",
1941 + "email-receive-outline",
1942 + "email-search",
1943 + "email-search-outline",
1944 + "email-send",
1945 + "email-send-outline",
1946 + "email-sync",
1947 + "email-sync-outline",
1948 + "email-variant",
1949 + "ember",
1950 + "emby",
1951 + "emoticon",
1952 + "emoticon-angry",
1953 + "emoticon-angry-outline",
1954 + "emoticon-confused",
1955 + "emoticon-confused-outline",
1956 + "emoticon-cool",
1957 + "emoticon-cool-outline",
1958 + "emoticon-cry",
1959 + "emoticon-cry-outline",
1960 + "emoticon-dead",
1961 + "emoticon-dead-outline",
1962 + "emoticon-devil",
1963 + "emoticon-devil-outline",
1964 + "emoticon-excited",
1965 + "emoticon-excited-outline",
1966 + "emoticon-frown",
1967 + "emoticon-frown-outline",
1968 + "emoticon-happy",
1969 + "emoticon-happy-outline",
1970 + "emoticon-kiss",
1971 + "emoticon-kiss-outline",
1972 + "emoticon-lol",
1973 + "emoticon-lol-outline",
1974 + "emoticon-neutral",
1975 + "emoticon-neutral-outline",
1976 + "emoticon-outline",
1977 + "emoticon-poop",
1978 + "emoticon-poop-outline",
1979 + "emoticon-sad",
1980 + "emoticon-sad-outline",
1981 + "emoticon-tongue",
1982 + "emoticon-tongue-outline",
1983 + "emoticon-wink",
1984 + "emoticon-wink-outline",
1985 + "engine",
1986 + "engine-off",
1987 + "engine-off-outline",
1988 + "engine-outline",
1989 + "epsilon",
1990 + "equal",
1991 + "equal-box",
1992 + "equalizer",
1993 + "equalizer-outline",
1994 + "eraser",
1995 + "eraser-variant",
1996 + "escalator",
1997 + "escalator-box",
1998 + "escalator-down",
1999 + "escalator-up",
2000 + "eslint",
2001 + "et",
2002 + "ethereum",
2003 + "ethernet",
2004 + "ethernet-cable",
2005 + "ethernet-cable-off",
2006 + "ev-station",
2007 + "evernote",
2008 + "excavator",
2009 + "exclamation",
2010 + "exclamation-thick",
2011 + "exit-run",
2012 + "exit-to-app",
2013 + "expand-all",
2014 + "expand-all-outline",
2015 + "expansion-card",
2016 + "expansion-card-variant",
2017 + "exponent",
2018 + "exponent-box",
2019 + "export",
2020 + "export-variant",
2021 + "eye",
2022 + "eye-check",
2023 + "eye-check-outline",
2024 + "eye-circle",
2025 + "eye-circle-outline",
2026 + "eye-minus",
2027 + "eye-minus-outline",
2028 + "eye-off",
2029 + "eye-off-outline",
2030 + "eye-outline",
2031 + "eye-plus",
2032 + "eye-plus-outline",
2033 + "eye-settings",
2034 + "eye-settings-outline",
2035 + "eyedropper",
2036 + "eyedropper-minus",
2037 + "eyedropper-off",
2038 + "eyedropper-plus",
2039 + "eyedropper-remove",
2040 + "eyedropper-variant"
2041 + /*"face",
2042 + "face-agent",
2043 + "face-outline",
2044 + "face-profile",
2045 + "face-profile-woman",
2046 + "face-recognition",
2047 + "face-woman",
2048 + "face-woman-outline",
2049 + "facebook",
2050 + "facebook-messenger",
2051 + "facebook-workplace",
2052 + "factory",
2053 + "fan",
2054 + "fan-alert",
2055 + "fan-chevron-down",
2056 + "fan-chevron-up",
2057 + "fan-minus",
2058 + "fan-off",
2059 + "fan-plus",
2060 + "fan-remove",
2061 + "fan-speed-1",
2062 + "fan-speed-2",
2063 + "fan-speed-3",
2064 + "fast-forward",
2065 + "fast-forward-10",
2066 + "fast-forward-30",
2067 + "fast-forward-5",
2068 + "fast-forward-outline",
2069 + "fax",
2070 + "feather",
2071 + "feature-search",
2072 + "feature-search-outline",
2073 + "fedora",
2074 + "fencing",
2075 + "ferris-wheel",
2076 + "ferry",
2077 + "file",
2078 + "file-account",
2079 + "file-account-outline",
2080 + "file-alert",
2081 + "file-alert-outline",
2082 + "file-cabinet",
2083 + "file-cad",
2084 + "file-cad-box",
2085 + "file-cancel",
2086 + "file-cancel-outline",
2087 + "file-certificate",
2088 + "file-certificate-outline",
2089 + "file-chart",
2090 + "file-chart-outline",
2091 + "file-check",
2092 + "file-check-outline",
2093 + "file-clock",
2094 + "file-clock-outline",
2095 + "file-cloud",
2096 + "file-cloud-outline",
2097 + "file-code",
2098 + "file-code-outline",
2099 + "file-cog",
2100 + "file-cog-outline",
2101 + "file-compare",
2102 + "file-delimited",
2103 + "file-delimited-outline",
2104 + "file-document",
2105 + "file-document-edit",
2106 + "file-document-edit-outline",
2107 + "file-document-outline",
2108 + "file-download",
2109 + "file-download-outline",
2110 + "file-edit",
2111 + "file-edit-outline",
2112 + "file-excel",
2113 + "file-excel-box",
2114 + "file-excel-box-outline",
2115 + "file-excel-outline",
2116 + "file-export",
2117 + "file-export-outline",
2118 + "file-eye",
2119 + "file-eye-outline",
2120 + "file-find",
2121 + "file-find-outline",
2122 + "file-hidden",
2123 + "file-image",
2124 + "file-image-outline",
2125 + "file-import",
2126 + "file-import-outline",
2127 + "file-key",
2128 + "file-key-outline",
2129 + "file-link",
2130 + "file-link-outline",
2131 + "file-lock",
2132 + "file-lock-outline",
2133 + "file-move",
2134 + "file-move-outline",
2135 + "file-multiple",
2136 + "file-multiple-outline",
2137 + "file-music",
2138 + "file-music-outline",
2139 + "file-outline",
2140 + "file-pdf",
2141 + "file-pdf-box",
2142 + "file-pdf-box-outline",
2143 + "file-pdf-outline",
2144 + "file-percent",
2145 + "file-percent-outline",
2146 + "file-phone",
2147 + "file-phone-outline",
2148 + "file-plus",
2149 + "file-plus-outline",
2150 + "file-powerpoint",
2151 + "file-powerpoint-box",
2152 + "file-powerpoint-box-outline",
2153 + "file-powerpoint-outline",
2154 + "file-presentation-box",
2155 + "file-question",
2156 + "file-question-outline",
2157 + "file-refresh",
2158 + "file-refresh-outline",
2159 + "file-remove",
2160 + "file-remove-outline",
2161 + "file-replace",
2162 + "file-replace-outline",
2163 + "file-restore",
2164 + "file-restore-outline",
2165 + "file-search",
2166 + "file-search-outline",
2167 + "file-send",
2168 + "file-send-outline",
2169 + "file-settings",
2170 + "file-settings-outline",
2171 + "file-star",
2172 + "file-star-outline",
2173 + "file-swap",
2174 + "file-swap-outline",
2175 + "file-sync",
2176 + "file-sync-outline",
2177 + "file-table",
2178 + "file-table-box",
2179 + "file-table-box-multiple",
2180 + "file-table-box-multiple-outline",
2181 + "file-table-box-outline",
2182 + "file-table-outline",
2183 + "file-tree",
2184 + "file-tree-outline",
2185 + "file-undo",
2186 + "file-undo-outline",
2187 + "file-upload",
2188 + "file-upload-outline",
2189 + "file-video",
2190 + "file-video-outline",
2191 + "file-word",
2192 + "file-word-box",
2193 + "file-word-box-outline",
2194 + "file-word-outline",
2195 + "film",
2196 + "filmstrip",
2197 + "filmstrip-box",
2198 + "filmstrip-box-multiple",
2199 + "filmstrip-off",
2200 + "filter",
2201 + "filter-menu",
2202 + "filter-menu-outline",
2203 + "filter-minus",
2204 + "filter-minus-outline",
2205 + "filter-outline",
2206 + "filter-plus",
2207 + "filter-plus-outline",
2208 + "filter-remove",
2209 + "filter-remove-outline",
2210 + "filter-variant",
2211 + "filter-variant-minus",
2212 + "filter-variant-plus",
2213 + "filter-variant-remove",
2214 + "finance",
2215 + "find-replace",
2216 + "fingerprint",
2217 + "fingerprint-off",
2218 + "fire",
2219 + "fire-extinguisher",
2220 + "fire-hydrant",
2221 + "fire-hydrant-alert",
2222 + "fire-hydrant-off",
2223 + "fire-truck",
2224 + "firebase",
2225 + "firefox",
2226 + "fireplace",
2227 + "fireplace-off",
2228 + "firework",
2229 + "fish",
2230 + "fish-off",
2231 + "fishbowl",
2232 + "fishbowl-outline",
2233 + "fit-to-page",
2234 + "fit-to-page-outline",
2235 + "flag",
2236 + "flag-checkered",
2237 + "flag-minus",
2238 + "flag-minus-outline",
2239 + "flag-outline",
2240 + "flag-plus",
2241 + "flag-plus-outline",
2242 + "flag-remove",
2243 + "flag-remove-outline",
2244 + "flag-triangle",
2245 + "flag-variant",
2246 + "flag-variant-outline",
2247 + "flare",
2248 + "flash",
2249 + "flash-alert",
2250 + "flash-alert-outline",
2251 + "flash-auto",
2252 + "flash-circle",
2253 + "flash-off",
2254 + "flash-outline",
2255 + "flash-red-eye",
2256 + "flashlight",
2257 + "flashlight-off",
2258 + "flask",
2259 + "flask-empty",
2260 + "flask-empty-minus",
2261 + "flask-empty-minus-outline",
2262 + "flask-empty-off",
2263 + "flask-empty-off-outline",
2264 + "flask-empty-outline",
2265 + "flask-empty-plus",
2266 + "flask-empty-plus-outline",
2267 + "flask-empty-remove",
2268 + "flask-empty-remove-outline",
2269 + "flask-minus",
2270 + "flask-minus-outline",
2271 + "flask-off",
2272 + "flask-off-outline",
2273 + "flask-outline",
2274 + "flask-plus",
2275 + "flask-plus-outline",
2276 + "flask-remove",
2277 + "flask-remove-outline",
2278 + "flask-round-bottom",
2279 + "flask-round-bottom-empty",
2280 + "flask-round-bottom-empty-outline",
2281 + "flask-round-bottom-outline",
2282 + "fleur-de-lis",
2283 + "flip-horizontal",
2284 + "flip-to-back",
2285 + "flip-to-front",
2286 + "flip-vertical",
2287 + "floor-lamp",
2288 + "floor-lamp-dual",
2289 + "floor-lamp-variant",
2290 + "floor-plan",
2291 + "floppy",
2292 + "floppy-variant",
2293 + "flower",
2294 + "flower-outline",
2295 + "flower-poppy",
2296 + "flower-tulip",
2297 + "flower-tulip-outline",
2298 + "focus-auto",
2299 + "focus-field",
2300 + "focus-field-horizontal",
2301 + "focus-field-vertical",
2302 + "folder",
2303 + "folder-account",
2304 + "folder-account-outline",
2305 + "folder-alert",
2306 + "folder-alert-outline",
2307 + "folder-clock",
2308 + "folder-clock-outline",
2309 + "folder-cog",
2310 + "folder-cog-outline",
2311 + "folder-download",
2312 + "folder-download-outline",
2313 + "folder-edit",
2314 + "folder-edit-outline",
2315 + "folder-google-drive",
2316 + "folder-heart",
2317 + "folder-heart-outline",
2318 + "folder-home",
2319 + "folder-home-outline",
2320 + "folder-image",
2321 + "folder-information",
2322 + "folder-information-outline",
2323 + "folder-key",
2324 + "folder-key-network",
2325 + "folder-key-network-outline",
2326 + "folder-key-outline",
2327 + "folder-lock",
2328 + "folder-lock-open",
2329 + "folder-marker",
2330 + "folder-marker-outline",
2331 + "folder-move",
2332 + "folder-move-outline",
2333 + "folder-multiple",
2334 + "folder-multiple-image",
2335 + "folder-multiple-outline",
2336 + "folder-multiple-plus",
2337 + "folder-multiple-plus-outline",
2338 + "folder-music",
2339 + "folder-music-outline",
2340 + "folder-network",
2341 + "folder-network-outline",
2342 + "folder-open",
2343 + "folder-open-outline",
2344 + "folder-outline",
2345 + "folder-plus",
2346 + "folder-plus-outline",
2347 + "folder-pound",
2348 + "folder-pound-outline",
2349 + "folder-refresh",
2350 + "folder-refresh-outline",
2351 + "folder-remove",
2352 + "folder-remove-outline",
2353 + "folder-search",
2354 + "folder-search-outline",
2355 + "folder-settings",
2356 + "folder-settings-outline",
2357 + "folder-star",
2358 + "folder-star-multiple",
2359 + "folder-star-multiple-outline",
2360 + "folder-star-outline",
2361 + "folder-swap",
2362 + "folder-swap-outline",
2363 + "folder-sync",
2364 + "folder-sync-outline",
2365 + "folder-table",
2366 + "folder-table-outline",
2367 + "folder-text",
2368 + "folder-text-outline",
2369 + "folder-upload",
2370 + "folder-upload-outline",
2371 + "folder-zip",
2372 + "folder-zip-outline",
2373 + "font-awesome",
2374 + "food",
2375 + "food-apple",
2376 + "food-apple-outline",
2377 + "food-croissant",
2378 + "food-drumstick",
2379 + "food-drumstick-off",
2380 + "food-drumstick-off-outline",
2381 + "food-drumstick-outline",
2382 + "food-fork-drink",
2383 + "food-off",
2384 + "food-steak",
2385 + "food-steak-off",
2386 + "food-variant",
2387 + "food-variant-off",
2388 + "foot-print",
2389 + "football",
2390 + "football-australian",
2391 + "football-helmet",
2392 + "forklift",
2393 + "form-dropdown",
2394 + "form-select",
2395 + "form-textarea",
2396 + "form-textbox",
2397 + "form-textbox-lock",
2398 + "form-textbox-password",
2399 + "format-align-bottom",
2400 + "format-align-center",
2401 + "format-align-justify",
2402 + "format-align-left",
2403 + "format-align-middle",
2404 + "format-align-right",
2405 + "format-align-top",
2406 + "format-annotation-minus",
2407 + "format-annotation-plus",
2408 + "format-bold",
2409 + "format-clear",
2410 + "format-color-fill",
2411 + "format-color-highlight",
2412 + "format-color-marker-cancel",
2413 + "format-color-text",
2414 + "format-columns",
2415 + "format-float-center",
2416 + "format-float-left",
2417 + "format-float-none",
2418 + "format-float-right",
2419 + "format-font",
2420 + "format-font-size-decrease",
2421 + "format-font-size-increase",
2422 + "format-header-1",
2423 + "format-header-2",
2424 + "format-header-3",
2425 + "format-header-4",
2426 + "format-header-5",
2427 + "format-header-6",
2428 + "format-header-decrease",
2429 + "format-header-equal",
2430 + "format-header-increase",
2431 + "format-header-pound",
2432 + "format-horizontal-align-center",
2433 + "format-horizontal-align-left",
2434 + "format-horizontal-align-right",
2435 + "format-indent-decrease",
2436 + "format-indent-increase",
2437 + "format-italic",
2438 + "format-letter-case",
2439 + "format-letter-case-lower",
2440 + "format-letter-case-upper",
2441 + "format-letter-ends-with",
2442 + "format-letter-matches",
2443 + "format-letter-starts-with",
2444 + "format-line-spacing",
2445 + "format-line-style",
2446 + "format-line-weight",
2447 + "format-list-bulleted",
2448 + "format-list-bulleted-square",
2449 + "format-list-bulleted-triangle",
2450 + "format-list-bulleted-type",
2451 + "format-list-checkbox",
2452 + "format-list-checks",
2453 + "format-list-numbered",
2454 + "format-list-numbered-rtl",
2455 + "format-list-text",
2456 + "format-overline",
2457 + "format-page-break",
2458 + "format-paint",
2459 + "format-paragraph",
2460 + "format-pilcrow",
2461 + "format-quote-close",
2462 + "format-quote-close-outline",
2463 + "format-quote-open",
2464 + "format-quote-open-outline",
2465 + "format-rotate-90",
2466 + "format-section",
2467 + "format-size",
2468 + "format-strikethrough",
2469 + "format-strikethrough-variant",
2470 + "format-subscript",
2471 + "format-superscript",
2472 + "format-text",
2473 + "format-text-rotation-angle-down",
2474 + "format-text-rotation-angle-up",
2475 + "format-text-rotation-down",
2476 + "format-text-rotation-down-vertical",
2477 + "format-text-rotation-none",
2478 + "format-text-rotation-up",
2479 + "format-text-rotation-vertical",
2480 + "format-text-variant",
2481 + "format-text-wrapping-clip",
2482 + "format-text-wrapping-overflow",
2483 + "format-text-wrapping-wrap",
2484 + "format-textbox",
2485 + "format-textdirection-l-to-r",
2486 + "format-textdirection-r-to-l",
2487 + "format-title",
2488 + "format-underline",
2489 + "format-vertical-align-bottom",
2490 + "format-vertical-align-center",
2491 + "format-vertical-align-top",
2492 + "format-wrap-inline",
2493 + "format-wrap-square",
2494 + "format-wrap-tight",
2495 + "format-wrap-top-bottom",
2496 + "forum",
2497 + "forum-outline",
2498 + "forward",
2499 + "forwardburger",
2500 + "fountain",
2501 + "fountain-pen",
2502 + "fountain-pen-tip",
2503 + "freebsd",
2504 + "frequently-asked-questions",
2505 + "fridge",
2506 + "fridge-alert",
2507 + "fridge-alert-outline",
2508 + "fridge-bottom",
2509 + "fridge-off",
2510 + "fridge-off-outline",
2511 + "fridge-outline",
2512 + "fridge-top",
2513 + "fruit-cherries",
2514 + "fruit-cherries-off",
2515 + "fruit-citrus",
2516 + "fruit-citrus-off",
2517 + "fruit-grapes",
2518 + "fruit-grapes-outline",
2519 + "fruit-pineapple",
2520 + "fruit-watermelon",
2521 + "fuel",
2522 + "fullscreen",
2523 + "fullscreen-exit",
2524 + "function",
2525 + "function-variant",
2526 + "furigana-horizontal",
2527 + "furigana-vertical",
2528 + "fuse",
2529 + "fuse-alert",
2530 + "fuse-blade",
2531 + "fuse-off",
2532 + "gamepad",
2533 + "gamepad-circle",
2534 + "gamepad-circle-down",
2535 + "gamepad-circle-left",
2536 + "gamepad-circle-outline",
2537 + "gamepad-circle-right",
2538 + "gamepad-circle-up",
2539 + "gamepad-down",
2540 + "gamepad-left",
2541 + "gamepad-right",
2542 + "gamepad-round",
2543 + "gamepad-round-down",
2544 + "gamepad-round-left",
2545 + "gamepad-round-outline",
2546 + "gamepad-round-right",
2547 + "gamepad-round-up",
2548 + "gamepad-square",
2549 + "gamepad-square-outline",
2550 + "gamepad-up",
2551 + "gamepad-variant",
2552 + "gamepad-variant-outline",
2553 + "gamma",
2554 + "gantry-crane",
2555 + "garage",
2556 + "garage-alert",
2557 + "garage-alert-variant",
2558 + "garage-open",
2559 + "garage-open-variant",
2560 + "garage-variant",
2561 + "gas-cylinder",
2562 + "gas-station",
2563 + "gas-station-off",
2564 + "gas-station-off-outline",
2565 + "gas-station-outline",
2566 + "gate",
2567 + "gate-and",
2568 + "gate-arrow-right",
2569 + "gate-nand",
2570 + "gate-nor",
2571 + "gate-not",
2572 + "gate-open",
2573 + "gate-or",
2574 + "gate-xnor",
2575 + "gate-xor",
2576 + "gatsby",
2577 + "gauge",
2578 + "gauge-empty",
2579 + "gauge-full",
2580 + "gauge-low",
2581 + "gavel",
2582 + "gender-female",
2583 + "gender-male",
2584 + "gender-male-female",
2585 + "gender-male-female-variant",
2586 + "gender-non-binary",
2587 + "gender-transgender",
2588 + "gentoo",
2589 + "gesture",
2590 + "gesture-double-tap",
2591 + "gesture-pinch",
2592 + "gesture-spread",
2593 + "gesture-swipe",
2594 + "gesture-swipe-down",
2595 + "gesture-swipe-horizontal",
2596 + "gesture-swipe-left",
2597 + "gesture-swipe-right",
2598 + "gesture-swipe-up",
2599 + "gesture-swipe-vertical",
2600 + "gesture-tap",
2601 + "gesture-tap-box",
2602 + "gesture-tap-button",
2603 + "gesture-tap-hold",
2604 + "gesture-two-double-tap",
2605 + "gesture-two-tap",
2606 + "ghost",
2607 + "ghost-off",
2608 + "gif",
2609 + "gift",
2610 + "gift-outline",
2611 + "git",
2612 + "github",
2613 + "gitlab",
2614 + "glass-cocktail",
2615 + "glass-flute",
2616 + "glass-mug",
2617 + "glass-mug-variant",
2618 + "glass-pint-outline",
2619 + "glass-stange",
2620 + "glass-tulip",
2621 + "glass-wine",
2622 + "glasses",
2623 + "globe-light",
2624 + "globe-model",
2625 + "gmail",
2626 + "gnome",
2627 + "go-kart",
2628 + "go-kart-track",
2629 + "gog",
2630 + "gold",
2631 + "golf",
2632 + "golf-cart",
2633 + "golf-tee",
2634 + "gondola",
2635 + "goodreads",
2636 + "google",
2637 + "google-ads",
2638 + "google-analytics",
2639 + "google-assistant",
2640 + "google-cardboard",
2641 + "google-chrome",
2642 + "google-circles",
2643 + "google-circles-communities",
2644 + "google-circles-extended",
2645 + "google-circles-group",
2646 + "google-classroom",
2647 + "google-cloud",
2648 + "google-controller",
2649 + "google-controller-off",
2650 + "google-downasaur",
2651 + "google-drive",
2652 + "google-earth",
2653 + "google-fit",
2654 + "google-glass",
2655 + "google-hangouts",
2656 + "google-home",
2657 + "google-keep",
2658 + "google-lens",
2659 + "google-maps",
2660 + "google-my-business",
2661 + "google-nearby",
2662 + "google-photos",
2663 + "google-play",
2664 + "google-plus",
2665 + "google-podcast",
2666 + "google-spreadsheet",
2667 + "google-street-view",
2668 + "google-translate",
2669 + "gradient",
2670 + "grain",
2671 + "graph",
2672 + "graph-outline",
2673 + "graphql",
2674 + "grave-stone",
2675 + "grease-pencil",
2676 + "greater-than",
2677 + "greater-than-or-equal",
2678 + "grid",
2679 + "grid-large",
2680 + "grid-off",
2681 + "grill",
2682 + "grill-outline",
2683 + "group",
2684 + "guitar-acoustic",
2685 + "guitar-electric",
2686 + "guitar-pick",
2687 + "guitar-pick-outline",
2688 + "guy-fawkes-mask",
2689 + "hail",
2690 + "hair-dryer",
2691 + "hair-dryer-outline",
2692 + "halloween",
2693 + "hamburger",
2694 + "hammer",
2695 + "hammer-screwdriver",
2696 + "hammer-wrench",
2697 + "hand",
2698 + "hand-heart",
2699 + "hand-left",
2700 + "hand-okay",
2701 + "hand-peace",
2702 + "hand-peace-variant",
2703 + "hand-pointing-down",
2704 + "hand-pointing-left",
2705 + "hand-pointing-right",
2706 + "hand-pointing-up",
2707 + "hand-right",
2708 + "hand-saw",
2709 + "hand-water",
2710 + "handball",
2711 + "handcuffs",
2712 + "handshake",
2713 + "hanger",
2714 + "hard-hat",
2715 + "harddisk",
2716 + "harddisk-plus",
2717 + "harddisk-remove",
2718 + "hat-fedora",
2719 + "hazard-lights",
2720 + "hdr",
2721 + "hdr-off",
2722 + "head",
2723 + "head-alert",
2724 + "head-alert-outline",
2725 + "head-check",
2726 + "head-check-outline",
2727 + "head-cog",
2728 + "head-cog-outline",
2729 + "head-dots-horizontal",
2730 + "head-dots-horizontal-outline",
2731 + "head-flash",
2732 + "head-flash-outline",
2733 + "head-heart",
2734 + "head-heart-outline",
2735 + "head-lightbulb",
2736 + "head-lightbulb-outline",
2737 + "head-minus",
2738 + "head-minus-outline",
2739 + "head-outline",
2740 + "head-plus",
2741 + "head-plus-outline",
2742 + "head-question",
2743 + "head-question-outline",
2744 + "head-remove",
2745 + "head-remove-outline",
2746 + "head-snowflake",
2747 + "head-snowflake-outline",
2748 + "head-sync",
2749 + "head-sync-outline",
2750 + "headphones",
2751 + "headphones-bluetooth",
2752 + "headphones-box",
2753 + "headphones-off",
2754 + "headphones-settings",
2755 + "headset",
2756 + "headset-dock",
2757 + "headset-off",
2758 + "heart",
2759 + "heart-box",
2760 + "heart-box-outline",
2761 + "heart-broken",
2762 + "heart-broken-outline",
2763 + "heart-circle",
2764 + "heart-circle-outline",
2765 + "heart-flash",
2766 + "heart-half",
2767 + "heart-half-full",
2768 + "heart-half-outline",
2769 + "heart-minus",
2770 + "heart-minus-outline",
2771 + "heart-multiple",
2772 + "heart-multiple-outline",
2773 + "heart-off",
2774 + "heart-off-outline",
2775 + "heart-outline",
2776 + "heart-plus",
2777 + "heart-plus-outline",
2778 + "heart-pulse",
2779 + "heart-remove",
2780 + "heart-remove-outline",
2781 + "helicopter",
2782 + "help",
2783 + "help-box",
2784 + "help-circle",
2785 + "help-circle-outline",
2786 + "help-network",
2787 + "help-network-outline",
2788 + "help-rhombus",
2789 + "help-rhombus-outline",
2790 + "hexadecimal",
2791 + "hexagon",
2792 + "hexagon-multiple",
2793 + "hexagon-multiple-outline",
2794 + "hexagon-outline",
2795 + "hexagon-slice-1",
2796 + "hexagon-slice-2",
2797 + "hexagon-slice-3",
2798 + "hexagon-slice-4",
2799 + "hexagon-slice-5",
2800 + "hexagon-slice-6",
2801 + "hexagram",
2802 + "hexagram-outline",
2803 + "high-definition",
2804 + "high-definition-box",
2805 + "highway",
2806 + "hiking",
2807 + "hinduism",
2808 + "history",
2809 + "hockey-puck",
2810 + "hockey-sticks",
2811 + "hololens",
2812 + "home",
2813 + "home-account",
2814 + "home-alert",
2815 + "home-analytics",
2816 + "home-assistant",
2817 + "home-automation",
2818 + "home-circle",
2819 + "home-circle-outline",
2820 + "home-city",
2821 + "home-city-outline",
2822 + "home-currency-usd",
2823 + "home-edit",
2824 + "home-edit-outline",
2825 + "home-export-outline",
2826 + "home-flood",
2827 + "home-floor-0",
2828 + "home-floor-1",
2829 + "home-floor-2",
2830 + "home-floor-3",
2831 + "home-floor-a",
2832 + "home-floor-b",
2833 + "home-floor-g",
2834 + "home-floor-l",
2835 + "home-floor-negative-1",
2836 + "home-group",
2837 + "home-heart",
2838 + "home-import-outline",
2839 + "home-lightbulb",
2840 + "home-lightbulb-outline",
2841 + "home-lock",
2842 + "home-lock-open",
2843 + "home-map-marker",
2844 + "home-minus",
2845 + "home-minus-outline",
2846 + "home-modern",
2847 + "home-outline",
2848 + "home-plus",
2849 + "home-plus-outline",
2850 + "home-remove",
2851 + "home-remove-outline",
2852 + "home-roof",
2853 + "home-search",
2854 + "home-search-outline",
2855 + "home-thermometer",
2856 + "home-thermometer-outline",
2857 + "home-variant",
2858 + "home-variant-outline",
2859 + "hook",
2860 + "hook-off",
2861 + "hops",
2862 + "horizontal-rotate-clockwise",
2863 + "horizontal-rotate-counterclockwise",
2864 + "horseshoe",
2865 + "hospital",
2866 + "hospital-box",
2867 + "hospital-box-outline",
2868 + "hospital-building",
2869 + "hospital-marker",
2870 + "hot-tub",
2871 + "hours-24",
2872 + "hubspot",
2873 + "hulu",
2874 + "human",
2875 + "human-baby-changing-table",
2876 + "human-child",
2877 + "human-female",
2878 + "human-female-boy",
2879 + "human-female-female",
2880 + "human-female-girl",
2881 + "human-greeting",
2882 + "human-handsdown",
2883 + "human-handsup",
2884 + "human-male",
2885 + "human-male-boy",
2886 + "human-male-child",
2887 + "human-male-female",
2888 + "human-male-girl",
2889 + "human-male-height",
2890 + "human-male-height-variant",
2891 + "human-male-male",
2892 + "human-pregnant",
2893 + "human-wheelchair",
2894 + "humble-bundle",
2895 + "hvac",
2896 + "hydraulic-oil-level",
2897 + "hydraulic-oil-temperature",
2898 + "hydro-power",
2899 + "ice-cream",
2900 + "ice-cream-off",
2901 + "ice-pop",
2902 + "id-card",
2903 + "identifier",
2904 + "ideogram-cjk",
2905 + "ideogram-cjk-variant",
2906 + "iframe",
2907 + "iframe-array",
2908 + "iframe-array-outline",
2909 + "iframe-braces",
2910 + "iframe-braces-outline",
2911 + "iframe-outline",
2912 + "iframe-parentheses",
2913 + "iframe-parentheses-outline",
2914 + "iframe-variable",
2915 + "iframe-variable-outline",
2916 + "image",
2917 + "image-album",
2918 + "image-area",
2919 + "image-area-close",
2920 + "image-auto-adjust",
2921 + "image-broken",
2922 + "image-broken-variant",
2923 + "image-edit",
2924 + "image-edit-outline",
2925 + "image-filter-black-white",
2926 + "image-filter-center-focus",
2927 + "image-filter-center-focus-strong",
2928 + "image-filter-center-focus-strong-outline",
2929 + "image-filter-center-focus-weak",
2930 + "image-filter-drama",
2931 + "image-filter-frames",
2932 + "image-filter-hdr",
2933 + "image-filter-none",
2934 + "image-filter-tilt-shift",
2935 + "image-filter-vintage",
2936 + "image-frame",
2937 + "image-minus",
2938 + "image-move",
2939 + "image-multiple",
2940 + "image-multiple-outline",
2941 + "image-off",
2942 + "image-off-outline",
2943 + "image-outline",
2944 + "image-plus",
2945 + "image-remove",
2946 + "image-search",
2947 + "image-search-outline",
2948 + "image-size-select-actual",
2949 + "image-size-select-large",
2950 + "image-size-select-small",
2951 + "import",
2952 + "inbox",
2953 + "inbox-arrow-down",
2954 + "inbox-arrow-down-outline",
2955 + "inbox-arrow-up",
2956 + "inbox-arrow-up-outline",
2957 + "inbox-full",
2958 + "inbox-full-outline",
2959 + "inbox-multiple",
2960 + "inbox-multiple-outline",
2961 + "inbox-outline",
2962 + "incognito",
2963 + "incognito-circle",
2964 + "incognito-circle-off",
2965 + "incognito-off",
2966 + "infinity",
2967 + "information",
2968 + "information-outline",
2969 + "information-variant",
2970 + "instagram",
2971 + "instrument-triangle",
2972 + "invert-colors",
2973 + "invert-colors-off",
2974 + "iobroker",
2975 + "ip",
2976 + "ip-network",
2977 + "ip-network-outline",
2978 + "ipod",
2979 + "islam",
2980 + "island",
2981 + "iv-bag",
2982 + "jabber",
2983 + "jeepney",
2984 + "jellyfish",
2985 + "jellyfish-outline",
2986 + "jira",
2987 + "jquery",
2988 + "jsfiddle",
2989 + "judaism",
2990 + "jump-rope",
2991 + "kabaddi",
2992 + "karate",
2993 + "keg",
2994 + "kettle",
2995 + "kettle-alert",
2996 + "kettle-alert-outline",
2997 + "kettle-off",
2998 + "kettle-off-outline",
2999 + "kettle-outline",
3000 + "kettle-steam",
3001 + "kettle-steam-outline",
3002 + "kettlebell",
3003 + "key",
3004 + "key-arrow-right",
3005 + "key-change",
3006 + "key-link",
3007 + "key-minus",
3008 + "key-outline",
3009 + "key-plus",
3010 + "key-remove",
3011 + "key-star",
3012 + "key-variant",
3013 + "key-wireless",
3014 + "keyboard",
3015 + "keyboard-backspace",
3016 + "keyboard-caps",
3017 + "keyboard-close",
3018 + "keyboard-esc",
3019 + "keyboard-f1",
3020 + "keyboard-f10",
3021 + "keyboard-f11",
3022 + "keyboard-f12",
3023 + "keyboard-f2",
3024 + "keyboard-f3",
3025 + "keyboard-f4",
3026 + "keyboard-f5",
3027 + "keyboard-f6",
3028 + "keyboard-f7",
3029 + "keyboard-f8",
3030 + "keyboard-f9",
3031 + "keyboard-off",
3032 + "keyboard-off-outline",
3033 + "keyboard-outline",
3034 + "keyboard-return",
3035 + "keyboard-settings",
3036 + "keyboard-settings-outline",
3037 + "keyboard-space",
3038 + "keyboard-tab",
3039 + "keyboard-variant",
3040 + "khanda",
3041 + "kickstarter",
3042 + "klingon",
3043 + "knife",
3044 + "knife-military",
3045 + "kodi",
3046 + "kubernetes",
3047 + "label",
3048 + "label-multiple",
3049 + "label-multiple-outline",
3050 + "label-off",
3051 + "label-off-outline",
3052 + "label-outline",
3053 + "label-percent",
3054 + "label-percent-outline",
3055 + "label-variant",
3056 + "label-variant-outline",
3057 + "ladybug",
3058 + "lambda",
3059 + "lamp",
3060 + "lan",
3061 + "lan-check",
3062 + "lan-connect",
3063 + "lan-disconnect",
3064 + "lan-pending",
3065 + "language-c",
3066 + "language-cpp",
3067 + "language-csharp",
3068 + "language-css3",
3069 + "language-fortran",
3070 + "language-go",
3071 + "language-haskell",
3072 + "language-html5",
3073 + "language-java",
3074 + "language-javascript",
3075 + "language-kotlin",
3076 + "language-lua",
3077 + "language-markdown",
3078 + "language-markdown-outline",
3079 + "language-php",
3080 + "language-python",
3081 + "language-r",
3082 + "language-ruby",
3083 + "language-ruby-on-rails",
3084 + "language-swift",
3085 + "language-typescript",
3086 + "language-xaml",
3087 + "laptop",
3088 + "laptop-chromebook",
3089 + "laptop-mac",
3090 + "laptop-off",
3091 + "laptop-windows",
3092 + "laravel",
3093 + "laser-pointer",
3094 + "lasso",
3095 + "lastpass",
3096 + "latitude",
3097 + "launch",
3098 + "lava-lamp",
3099 + "layers",
3100 + "layers-minus",
3101 + "layers-off",
3102 + "layers-off-outline",
3103 + "layers-outline",
3104 + "layers-plus",
3105 + "layers-remove",
3106 + "layers-search",
3107 + "layers-search-outline",
3108 + "layers-triple",
3109 + "layers-triple-outline",
3110 + "lead-pencil",
3111 + "leaf",
3112 + "leaf-maple",
3113 + "leaf-maple-off",
3114 + "leaf-off",
3115 + "leak",
3116 + "leak-off",
3117 + "led-off",
3118 + "led-on",
3119 + "led-outline",
3120 + "led-strip",
3121 + "led-strip-variant",
3122 + "led-variant-off",
3123 + "led-variant-on",
3124 + "led-variant-outline",
3125 + "leek",
3126 + "less-than",
3127 + "less-than-or-equal",
3128 + "library",
3129 + "library-shelves",
3130 + "license",
3131 + "lifebuoy",
3132 + "light-switch",
3133 + "lightbulb",
3134 + "lightbulb-cfl",
3135 + "lightbulb-cfl-off",
3136 + "lightbulb-cfl-spiral",
3137 + "lightbulb-cfl-spiral-off",
3138 + "lightbulb-group",
3139 + "lightbulb-group-off",
3140 + "lightbulb-group-off-outline",
3141 + "lightbulb-group-outline",
3142 + "lightbulb-multiple",
3143 + "lightbulb-multiple-off",
3144 + "lightbulb-multiple-off-outline",
3145 + "lightbulb-multiple-outline",
3146 + "lightbulb-off",
3147 + "lightbulb-off-outline",
3148 + "lightbulb-on",
3149 + "lightbulb-on-outline",
3150 + "lightbulb-outline",
3151 + "lighthouse",
3152 + "lighthouse-on",
3153 + "lightning-bolt",
3154 + "lightning-bolt-outline",
3155 + "lingerie",
3156 + "link",
3157 + "link-box",
3158 + "link-box-outline",
3159 + "link-box-variant",
3160 + "link-box-variant-outline",
3161 + "link-lock",
3162 + "link-off",
3163 + "link-plus",
3164 + "link-variant",
3165 + "link-variant-minus",
3166 + "link-variant-off",
3167 + "link-variant-plus",
3168 + "link-variant-remove",
3169 + "linkedin",
3170 + "linux",
3171 + "linux-mint",
3172 + "lipstick",
3173 + "litecoin",
3174 + "loading",
3175 + "location-enter",
3176 + "location-exit",
3177 + "lock",
3178 + "lock-alert",
3179 + "lock-check",
3180 + "lock-clock",
3181 + "lock-open",
3182 + "lock-open-alert",
3183 + "lock-open-check",
3184 + "lock-open-outline",
3185 + "lock-open-variant",
3186 + "lock-open-variant-outline",
3187 + "lock-outline",
3188 + "lock-pattern",
3189 + "lock-plus",
3190 + "lock-question",
3191 + "lock-reset",
3192 + "lock-smart",
3193 + "locker",
3194 + "locker-multiple",
3195 + "login",
3196 + "login-variant",
3197 + "logout",
3198 + "logout-variant",
3199 + "longitude",
3200 + "looks",
3201 + "loupe",
3202 + "lumx",
3203 + "lungs",
3204 + "magnet",
3205 + "magnet-on",
3206 + "magnify",
3207 + "magnify-close",
3208 + "magnify-minus",
3209 + "magnify-minus-cursor",
3210 + "magnify-minus-outline",
3211 + "magnify-plus",
3212 + "magnify-plus-cursor",
3213 + "magnify-plus-outline",
3214 + "magnify-remove-cursor",
3215 + "magnify-remove-outline",
3216 + "magnify-scan",
3217 + "mail",
3218 + "mailbox",
3219 + "mailbox-open",
3220 + "mailbox-open-outline",
3221 + "mailbox-open-up",
3222 + "mailbox-open-up-outline",
3223 + "mailbox-outline",
3224 + "mailbox-up",
3225 + "mailbox-up-outline",
3226 + "map",
3227 + "map-check",
3228 + "map-check-outline",
3229 + "map-clock",
3230 + "map-clock-outline",
3231 + "map-legend",
3232 + "map-marker",
3233 + "map-marker-alert",
3234 + "map-marker-alert-outline",
3235 + "map-marker-check",
3236 + "map-marker-check-outline",
3237 + "map-marker-circle",
3238 + "map-marker-distance",
3239 + "map-marker-down",
3240 + "map-marker-left",
3241 + "map-marker-left-outline",
3242 + "map-marker-minus",
3243 + "map-marker-minus-outline",
3244 + "map-marker-multiple",
3245 + "map-marker-multiple-outline",
3246 + "map-marker-off",
3247 + "map-marker-off-outline",
3248 + "map-marker-outline",
3249 + "map-marker-path",
3250 + "map-marker-plus",
3251 + "map-marker-plus-outline",
3252 + "map-marker-question",
3253 + "map-marker-question-outline",
3254 + "map-marker-radius",
3255 + "map-marker-radius-outline",
3256 + "map-marker-remove",
3257 + "map-marker-remove-outline",
3258 + "map-marker-remove-variant",
3259 + "map-marker-right",
3260 + "map-marker-right-outline",
3261 + "map-marker-up",
3262 + "map-minus",
3263 + "map-outline",
3264 + "map-plus",
3265 + "map-search",
3266 + "map-search-outline",
3267 + "mapbox",
3268 + "margin",
3269 + "marker",
3270 + "marker-cancel",
3271 + "marker-check",
3272 + "mastodon",
3273 + "material-design",
3274 + "material-ui",
3275 + "math-compass",
3276 + "math-cos",
3277 + "math-integral",
3278 + "math-integral-box",
3279 + "math-log",
3280 + "math-norm",
3281 + "math-norm-box",
3282 + "math-sin",
3283 + "math-tan",
3284 + "matrix",
3285 + "medal",
3286 + "medal-outline",
3287 + "medical-bag",
3288 + "meditation",
3289 + "memory",
3290 + "menu",
3291 + "menu-down",
3292 + "menu-down-outline",
3293 + "menu-left",
3294 + "menu-left-outline",
3295 + "menu-open",
3296 + "menu-right",
3297 + "menu-right-outline",
3298 + "menu-swap",
3299 + "menu-swap-outline",
3300 + "menu-up",
3301 + "menu-up-outline",
3302 + "merge",
3303 + "message",
3304 + "message-alert",
3305 + "message-alert-outline",
3306 + "message-arrow-left",
3307 + "message-arrow-left-outline",
3308 + "message-arrow-right",
3309 + "message-arrow-right-outline",
3310 + "message-bulleted",
3311 + "message-bulleted-off",
3312 + "message-cog",
3313 + "message-cog-outline",
3314 + "message-draw",
3315 + "message-image",
3316 + "message-image-outline",
3317 + "message-lock",
3318 + "message-lock-outline",
3319 + "message-minus",
3320 + "message-minus-outline",
3321 + "message-outline",
3322 + "message-plus",
3323 + "message-plus-outline",
3324 + "message-processing",
3325 + "message-processing-outline",
3326 + "message-reply",
3327 + "message-reply-text",
3328 + "message-settings",
3329 + "message-settings-outline",
3330 + "message-text",
3331 + "message-text-clock",
3332 + "message-text-clock-outline",
3333 + "message-text-lock",
3334 + "message-text-lock-outline",
3335 + "message-text-outline",
3336 + "message-video",
3337 + "meteor",
3338 + "metronome",
3339 + "metronome-tick",
3340 + "micro-sd",
3341 + "microphone",
3342 + "microphone-minus",
3343 + "microphone-off",
3344 + "microphone-outline",
3345 + "microphone-plus",
3346 + "microphone-settings",
3347 + "microphone-variant",
3348 + "microphone-variant-off",
3349 + "microscope",
3350 + "microsoft",
3351 + "microsoft-access",
3352 + "microsoft-azure",
3353 + "microsoft-azure-devops",
3354 + "microsoft-bing",
3355 + "microsoft-dynamics-365",
3356 + "microsoft-edge",
3357 + "microsoft-edge-legacy",
3358 + "microsoft-excel",
3359 + "microsoft-internet-explorer",
3360 + "microsoft-office",
3361 + "microsoft-onedrive",
3362 + "microsoft-onenote",
3363 + "microsoft-outlook",
3364 + "microsoft-powerpoint",
3365 + "microsoft-sharepoint",
3366 + "microsoft-teams",
3367 + "microsoft-visual-studio",
3368 + "microsoft-visual-studio-code",
3369 + "microsoft-windows",
3370 + "microsoft-windows-classic",
3371 + "microsoft-word",
3372 + "microsoft-xbox",
3373 + "microsoft-xbox-controller",
3374 + "microsoft-xbox-controller-battery-alert",
3375 + "microsoft-xbox-controller-battery-charging",
3376 + "microsoft-xbox-controller-battery-empty",
3377 + "microsoft-xbox-controller-battery-full",
3378 + "microsoft-xbox-controller-battery-low",
3379 + "microsoft-xbox-controller-battery-medium",
3380 + "microsoft-xbox-controller-battery-unknown",
3381 + "microsoft-xbox-controller-menu",
3382 + "microsoft-xbox-controller-off",
3383 + "microsoft-xbox-controller-view",
3384 + "microsoft-yammer",
3385 + "microwave",
3386 + "microwave-off",
3387 + "middleware",
3388 + "middleware-outline",
3389 + "midi",
3390 + "midi-port",
3391 + "mine",
3392 + "minecraft",
3393 + "mini-sd",
3394 + "minidisc",
3395 + "minus",
3396 + "minus-box",
3397 + "minus-box-multiple",
3398 + "minus-box-multiple-outline",
3399 + "minus-box-outline",
3400 + "minus-circle",
3401 + "minus-circle-multiple",
3402 + "minus-circle-multiple-outline",
3403 + "minus-circle-off",
3404 + "minus-circle-off-outline",
3405 + "minus-circle-outline",
3406 + "minus-network",
3407 + "minus-network-outline",
3408 + "mirror",
3409 + "mixed-martial-arts",
3410 + "mixed-reality",
3411 + "mixer",
3412 + "molecule",
3413 + "molecule-co",
3414 + "molecule-co2",
3415 + "monitor",
3416 + "monitor-cellphone",
3417 + "monitor-cellphone-star",
3418 + "monitor-clean",
3419 + "monitor-dashboard",
3420 + "monitor-edit",
3421 + "monitor-eye",
3422 + "monitor-lock",
3423 + "monitor-multiple",
3424 + "monitor-off",
3425 + "monitor-screenshot",
3426 + "monitor-share",
3427 + "monitor-speaker",
3428 + "monitor-speaker-off",
3429 + "monitor-star",
3430 + "moon-first-quarter",
3431 + "moon-full",
3432 + "moon-last-quarter",
3433 + "moon-new",
3434 + "moon-waning-crescent",
3435 + "moon-waning-gibbous",
3436 + "moon-waxing-crescent",
3437 + "moon-waxing-gibbous",
3438 + "moped",
3439 + "more",
3440 + "mother-heart",
3441 + "mother-nurse",
3442 + "motion-sensor",
3443 + "motion-sensor-off",
3444 + "motorbike",
3445 + "mouse",
3446 + "mouse-bluetooth",
3447 + "mouse-off",
3448 + "mouse-variant",
3449 + "mouse-variant-off",
3450 + "move-resize",
3451 + "move-resize-variant",
3452 + "movie",
3453 + "movie-edit",
3454 + "movie-edit-outline",
3455 + "movie-filter",
3456 + "movie-filter-outline",
3457 + "movie-open",
3458 + "movie-open-outline",
3459 + "movie-outline",
3460 + "movie-roll",
3461 + "movie-search",
3462 + "movie-search-outline",
3463 + "muffin",
3464 + "multiplication",
3465 + "multiplication-box",
3466 + "mushroom",
3467 + "mushroom-off",
3468 + "mushroom-off-outline",
3469 + "mushroom-outline",
3470 + "music",
3471 + "music-accidental-double-flat",
3472 + "music-accidental-double-sharp",
3473 + "music-accidental-flat",
3474 + "music-accidental-natural",
3475 + "music-accidental-sharp",
3476 + "music-box",
3477 + "music-box-multiple",
3478 + "music-box-multiple-outline",
3479 + "music-box-outline",
3480 + "music-circle",
3481 + "music-circle-outline",
3482 + "music-clef-alto",
3483 + "music-clef-bass",
3484 + "music-clef-treble",
3485 + "music-note",
3486 + "music-note-bluetooth",
3487 + "music-note-bluetooth-off",
3488 + "music-note-eighth",
3489 + "music-note-eighth-dotted",
3490 + "music-note-half",
3491 + "music-note-half-dotted",
3492 + "music-note-off",
3493 + "music-note-off-outline",
3494 + "music-note-outline",
3495 + "music-note-plus",
3496 + "music-note-quarter",
3497 + "music-note-quarter-dotted",
3498 + "music-note-sixteenth",
3499 + "music-note-sixteenth-dotted",
3500 + "music-note-whole",
3501 + "music-note-whole-dotted",
3502 + "music-off",
3503 + "music-rest-eighth",
3504 + "music-rest-half",
3505 + "music-rest-quarter",
3506 + "music-rest-sixteenth",
3507 + "music-rest-whole",
3508 + "nail",
3509 + "nas",
3510 + "nativescript",
3511 + "nature",
3512 + "nature-people",
3513 + "navigation",
3514 + "near-me",
3515 + "necklace",
3516 + "needle",
3517 + "netflix",
3518 + "network",
3519 + "network-off",
3520 + "network-off-outline",
3521 + "network-outline",
3522 + "network-strength-1",
3523 + "network-strength-1-alert",
3524 + "network-strength-2",
3525 + "network-strength-2-alert",
3526 + "network-strength-3",
3527 + "network-strength-3-alert",
3528 + "network-strength-4",
3529 + "network-strength-4-alert",
3530 + "network-strength-off",
3531 + "network-strength-off-outline",
3532 + "network-strength-outline",
3533 + "new-box",
3534 + "newspaper",
3535 + "newspaper-minus",
3536 + "newspaper-plus",
3537 + "newspaper-variant",
3538 + "newspaper-variant-multiple",
3539 + "newspaper-variant-multiple-outline",
3540 + "newspaper-variant-outline",
3541 + "nfc",
3542 + "nfc-search-variant",
3543 + "nfc-tap",
3544 + "nfc-variant",
3545 + "nfc-variant-off",
3546 + "ninja",
3547 + "nintendo-game-boy",
3548 + "nintendo-switch",
3549 + "nintendo-wii",
3550 + "nintendo-wiiu",
3551 + "nix",
3552 + "nodejs",
3553 + "noodles",
3554 + "not-equal",
3555 + "not-equal-variant",
3556 + "note",
3557 + "note-multiple",
3558 + "note-multiple-outline",
3559 + "note-outline",
3560 + "note-plus",
3561 + "note-plus-outline",
3562 + "note-text",
3563 + "note-text-outline",
3564 + "notebook",
3565 + "notebook-multiple",
3566 + "notebook-outline",
3567 + "notification-clear-all",
3568 + "npm",
3569 + "nuke",
3570 + "null",
3571 + "numeric",
3572 + "numeric-0",
3573 + "numeric-0-box",
3574 + "numeric-0-box-multiple",
3575 + "numeric-0-box-multiple-outline",
3576 + "numeric-0-box-outline",
3577 + "numeric-0-circle",
3578 + "numeric-0-circle-outline",
3579 + "numeric-1",
3580 + "numeric-1-box",
3581 + "numeric-1-box-multiple",
3582 + "numeric-1-box-multiple-outline",
3583 + "numeric-1-box-outline",
3584 + "numeric-1-circle",
3585 + "numeric-1-circle-outline",
3586 + "numeric-10",
3587 + "numeric-10-box",
3588 + "numeric-10-box-multiple",
3589 + "numeric-10-box-multiple-outline",
3590 + "numeric-10-box-outline",
3591 + "numeric-10-circle",
3592 + "numeric-10-circle-outline",
3593 + "numeric-2",
3594 + "numeric-2-box",
3595 + "numeric-2-box-multiple",
3596 + "numeric-2-box-multiple-outline",
3597 + "numeric-2-box-outline",
3598 + "numeric-2-circle",
3599 + "numeric-2-circle-outline",
3600 + "numeric-3",
3601 + "numeric-3-box",
3602 + "numeric-3-box-multiple",
3603 + "numeric-3-box-multiple-outline",
3604 + "numeric-3-box-outline",
3605 + "numeric-3-circle",
3606 + "numeric-3-circle-outline",
3607 + "numeric-4",
3608 + "numeric-4-box",
3609 + "numeric-4-box-multiple",
3610 + "numeric-4-box-multiple-outline",
3611 + "numeric-4-box-outline",
3612 + "numeric-4-circle",
3613 + "numeric-4-circle-outline",
3614 + "numeric-5",
3615 + "numeric-5-box",
3616 + "numeric-5-box-multiple",
3617 + "numeric-5-box-multiple-outline",
3618 + "numeric-5-box-outline",
3619 + "numeric-5-circle",
3620 + "numeric-5-circle-outline",
3621 + "numeric-6",
3622 + "numeric-6-box",
3623 + "numeric-6-box-multiple",
3624 + "numeric-6-box-multiple-outline",
3625 + "numeric-6-box-outline",
3626 + "numeric-6-circle",
3627 + "numeric-6-circle-outline",
3628 + "numeric-7",
3629 + "numeric-7-box",
3630 + "numeric-7-box-multiple",
3631 + "numeric-7-box-multiple-outline",
3632 + "numeric-7-box-outline",
3633 + "numeric-7-circle",
3634 + "numeric-7-circle-outline",
3635 + "numeric-8",
3636 + "numeric-8-box",
3637 + "numeric-8-box-multiple",
3638 + "numeric-8-box-multiple-outline",
3639 + "numeric-8-box-outline",
3640 + "numeric-8-circle",
3641 + "numeric-8-circle-outline",
3642 + "numeric-9",
3643 + "numeric-9-box",
3644 + "numeric-9-box-multiple",
3645 + "numeric-9-box-multiple-outline",
3646 + "numeric-9-box-outline",
3647 + "numeric-9-circle",
3648 + "numeric-9-circle-outline",
3649 + "numeric-9-plus",
3650 + "numeric-9-plus-box",
3651 + "numeric-9-plus-box-multiple",
3652 + "numeric-9-plus-box-multiple-outline",
3653 + "numeric-9-plus-box-outline",
3654 + "numeric-9-plus-circle",
3655 + "numeric-9-plus-circle-outline",
3656 + "numeric-negative-1",
3657 + "nut",
3658 + "nutrition",
3659 + "nuxt",
3660 + "oar",
3661 + "ocarina",
3662 + "oci",
3663 + "ocr",
3664 + "octagon",
3665 + "octagon-outline",
3666 + "octagram",
3667 + "octagram-outline",
3668 + "odnoklassniki",
3669 + "offer",
3670 + "office-building",
3671 + "oil",
3672 + "oil-lamp",
3673 + "oil-level",
3674 + "oil-temperature",
3675 + "omega",
3676 + "one-up",
3677 + "onepassword",
3678 + "opacity",
3679 + "open-in-app",
3680 + "open-in-new",
3681 + "open-source-initiative",
3682 + "openid",
3683 + "opera",
3684 + "orbit",
3685 + "order-alphabetical-ascending",
3686 + "order-alphabetical-descending",
3687 + "order-bool-ascending",
3688 + "order-bool-ascending-variant",
3689 + "order-bool-descending",
3690 + "order-bool-descending-variant",
3691 + "order-numeric-ascending",
3692 + "order-numeric-descending",
3693 + "origin",
3694 + "ornament",
3695 + "ornament-variant",
3696 + "outdoor-lamp",
3697 + "overscan",
3698 + "owl",
3699 + "pac-man",
3700 + "package",
3701 + "package-down",
3702 + "package-up",
3703 + "package-variant",
3704 + "package-variant-closed",
3705 + "page-first",
3706 + "page-last",
3707 + "page-layout-body",
3708 + "page-layout-footer",
3709 + "page-layout-header",
3710 + "page-layout-header-footer",
3711 + "page-layout-sidebar-left",
3712 + "page-layout-sidebar-right",
3713 + "page-next",
3714 + "page-next-outline",
3715 + "page-previous",
3716 + "page-previous-outline",
3717 + "pail",
3718 + "pail-minus",
3719 + "pail-minus-outline",
3720 + "pail-off",
3721 + "pail-off-outline",
3722 + "pail-outline",
3723 + "pail-plus",
3724 + "pail-plus-outline",
3725 + "pail-remove",
3726 + "pail-remove-outline",
3727 + "palette",
3728 + "palette-advanced",
3729 + "palette-outline",
3730 + "palette-swatch",
3731 + "palette-swatch-outline",
3732 + "palm-tree",
3733 + "pan",
3734 + "pan-bottom-left",
3735 + "pan-bottom-right",
3736 + "pan-down",
3737 + "pan-horizontal",
3738 + "pan-left",
3739 + "pan-right",
3740 + "pan-top-left",
3741 + "pan-top-right",
3742 + "pan-up",
3743 + "pan-vertical",
3744 + "panda",
3745 + "pandora",
3746 + "panorama",
3747 + "panorama-fisheye",
3748 + "panorama-horizontal",
3749 + "panorama-vertical",
3750 + "panorama-wide-angle",
3751 + "paper-cut-vertical",
3752 + "paper-roll",
3753 + "paper-roll-outline",
3754 + "paperclip",
3755 + "parachute",
3756 + "parachute-outline",
3757 + "parking",
3758 + "party-popper",
3759 + "passport",
3760 + "passport-biometric",
3761 + "pasta",
3762 + "patio-heater",
3763 + "patreon",
3764 + "pause",
3765 + "pause-circle",
3766 + "pause-circle-outline",
3767 + "pause-octagon",
3768 + "pause-octagon-outline",
3769 + "paw",
3770 + "paw-off",
3771 + "pdf-box",
3772 + "peace",
3773 + "peanut",
3774 + "peanut-off",
3775 + "peanut-off-outline",
3776 + "peanut-outline",
3777 + "pen",
3778 + "pen-lock",
3779 + "pen-minus",
3780 + "pen-off",
3781 + "pen-plus",
3782 + "pen-remove",
3783 + "pencil",
3784 + "pencil-box",
3785 + "pencil-box-multiple",
3786 + "pencil-box-multiple-outline",
3787 + "pencil-box-outline",
3788 + "pencil-circle",
3789 + "pencil-circle-outline",
3790 + "pencil-lock",
3791 + "pencil-lock-outline",
3792 + "pencil-minus",
3793 + "pencil-minus-outline",
3794 + "pencil-off",
3795 + "pencil-off-outline",
3796 + "pencil-outline",
3797 + "pencil-plus",
3798 + "pencil-plus-outline",
3799 + "pencil-remove",
3800 + "pencil-remove-outline",
3801 + "pencil-ruler",
3802 + "penguin",
3803 + "pentagon",
3804 + "pentagon-outline",
3805 + "percent",
3806 + "percent-outline",
3807 + "periodic-table",
3808 + "perspective-less",
3809 + "perspective-more",
3810 + "pharmacy",
3811 + "phone",
3812 + "phone-alert",
3813 + "phone-alert-outline",
3814 + "phone-bluetooth",
3815 + "phone-bluetooth-outline",
3816 + "phone-cancel",
3817 + "phone-cancel-outline",
3818 + "phone-check",
3819 + "phone-check-outline",
3820 + "phone-classic",
3821 + "phone-classic-off",
3822 + "phone-forward",
3823 + "phone-forward-outline",
3824 + "phone-hangup",
3825 + "phone-hangup-outline",
3826 + "phone-in-talk",
3827 + "phone-in-talk-outline",
3828 + "phone-incoming",
3829 + "phone-incoming-outline",
3830 + "phone-lock",
3831 + "phone-lock-outline",
3832 + "phone-log",
3833 + "phone-log-outline",
3834 + "phone-message",
3835 + "phone-message-outline",
3836 + "phone-minus",
3837 + "phone-minus-outline",
3838 + "phone-missed",
3839 + "phone-missed-outline",
3840 + "phone-off",
3841 + "phone-off-outline",
3842 + "phone-outgoing",
3843 + "phone-outgoing-outline",
3844 + "phone-outline",
3845 + "phone-paused",
3846 + "phone-paused-outline",
3847 + "phone-plus",
3848 + "phone-plus-outline",
3849 + "phone-return",
3850 + "phone-return-outline",
3851 + "phone-ring",
3852 + "phone-ring-outline",
3853 + "phone-rotate-landscape",
3854 + "phone-rotate-portrait",
3855 + "phone-settings",
3856 + "phone-settings-outline",
3857 + "phone-voip",
3858 + "pi",
3859 + "pi-box",
3860 + "pi-hole",
3861 + "piano",
3862 + "pickaxe",
3863 + "picture-in-picture-bottom-right",
3864 + "picture-in-picture-bottom-right-outline",
3865 + "picture-in-picture-top-right",
3866 + "picture-in-picture-top-right-outline",
3867 + "pier",
3868 + "pier-crane",
3869 + "pig",
3870 + "pig-variant",
3871 + "piggy-bank",
3872 + "pill",
3873 + "pillar",
3874 + "pin",
3875 + "pin-off",
3876 + "pin-off-outline",
3877 + "pin-outline",
3878 + "pine-tree",
3879 + "pine-tree-box",
3880 + "pine-tree-fire",
3881 + "pinterest",
3882 + "pinwheel",
3883 + "pinwheel-outline",
3884 + "pipe",
3885 + "pipe-disconnected",
3886 + "pipe-leak",
3887 + "pipe-wrench",
3888 + "pirate",
3889 + "pistol",
3890 + "piston",
3891 + "pizza",
3892 + "play",
3893 + "play-box",
3894 + "play-box-multiple",
3895 + "play-box-multiple-outline",
3896 + "play-box-outline",
3897 + "play-circle",
3898 + "play-circle-outline",
3899 + "play-network",
3900 + "play-network-outline",
3901 + "play-outline",
3902 + "play-pause",
3903 + "play-protected-content",
3904 + "play-speed",
3905 + "playlist-check",
3906 + "playlist-edit",
3907 + "playlist-minus",
3908 + "playlist-music",
3909 + "playlist-music-outline",
3910 + "playlist-play",
3911 + "playlist-plus",
3912 + "playlist-remove",
3913 + "playlist-star",
3914 + "plex",
3915 + "plus",
3916 + "plus-box",
3917 + "plus-box-multiple",
3918 + "plus-box-multiple-outline",
3919 + "plus-box-outline",
3920 + "plus-circle",
3921 + "plus-circle-multiple",
3922 + "plus-circle-multiple-outline",
3923 + "plus-circle-outline",
3924 + "plus-minus",
3925 + "plus-minus-box",
3926 + "plus-minus-variant",
3927 + "plus-network",
3928 + "plus-network-outline",
3929 + "plus-one",
3930 + "plus-outline",
3931 + "plus-thick",
3932 + "podcast",
3933 + "podium",
3934 + "podium-bronze",
3935 + "podium-gold",
3936 + "podium-silver",
3937 + "point-of-sale",
3938 + "pokeball",
3939 + "pokemon-go",
3940 + "poker-chip",
3941 + "polaroid",
3942 + "police-badge",
3943 + "police-badge-outline",
3944 + "poll",
3945 + "poll-box",
3946 + "poll-box-outline",
3947 + "polo",
3948 + "polymer",
3949 + "pool",
3950 + "popcorn",
3951 + "post",
3952 + "post-outline",
3953 + "postage-stamp",
3954 + "pot",
3955 + "pot-mix",
3956 + "pot-mix-outline",
3957 + "pot-outline",
3958 + "pot-steam",
3959 + "pot-steam-outline",
3960 + "pound",
3961 + "pound-box",
3962 + "pound-box-outline",
3963 + "power",
3964 + "power-cycle",
3965 + "power-off",
3966 + "power-on",
3967 + "power-plug",
3968 + "power-plug-off",
3969 + "power-plug-off-outline",
3970 + "power-plug-outline",
3971 + "power-settings",
3972 + "power-sleep",
3973 + "power-socket",
3974 + "power-socket-au",
3975 + "power-socket-de",
3976 + "power-socket-eu",
3977 + "power-socket-fr",
3978 + "power-socket-jp",
3979 + "power-socket-uk",
3980 + "power-socket-us",
3981 + "power-standby",
3982 + "powershell",
3983 + "prescription",
3984 + "presentation",
3985 + "presentation-play",
3986 + "printer",
3987 + "printer-3d",
3988 + "printer-3d-nozzle",
3989 + "printer-3d-nozzle-alert",
3990 + "printer-3d-nozzle-alert-outline",
3991 + "printer-3d-nozzle-outline",
3992 + "printer-alert",
3993 + "printer-check",
3994 + "printer-eye",
3995 + "printer-off",
3996 + "printer-pos",
3997 + "printer-search",
3998 + "printer-settings",
3999 + "printer-wireless",
4000 + "priority-high",
4001 + "priority-low",
4002 + "professional-hexagon",
4003 + "progress-alert",
4004 + "progress-check",
4005 + "progress-clock",
4006 + "progress-close",
4007 + "progress-download",
4008 + "progress-upload",
4009 + "progress-wrench",
4010 + "projector",
4011 + "projector-screen",
4012 + "propane-tank",
4013 + "propane-tank-outline",
4014 + "protocol",
4015 + "publish",
4016 + "pulse",
4017 + "pump",
4018 + "pumpkin",
4019 + "purse",
4020 + "purse-outline",
4021 + "puzzle",
4022 + "puzzle-check",
4023 + "puzzle-check-outline",
4024 + "puzzle-edit",
4025 + "puzzle-edit-outline",
4026 + "puzzle-heart",
4027 + "puzzle-heart-outline",
4028 + "puzzle-minus",
4029 + "puzzle-minus-outline",
4030 + "puzzle-outline",
4031 + "puzzle-plus",
4032 + "puzzle-plus-outline",
4033 + "puzzle-remove",
4034 + "puzzle-remove-outline",
4035 + "puzzle-star",
4036 + "puzzle-star-outline",
4037 + "qi",
4038 + "qqchat",
4039 + "qrcode",
4040 + "qrcode-edit",
4041 + "qrcode-minus",
4042 + "qrcode-plus",
4043 + "qrcode-remove",
4044 + "qrcode-scan",
4045 + "quadcopter",
4046 + "quality-high",
4047 + "quality-low",
4048 + "quality-medium",
4049 + "quora",
4050 + "rabbit",
4051 + "racing-helmet",
4052 + "racquetball",
4053 + "radar",
4054 + "radiator",
4055 + "radiator-disabled",
4056 + "radiator-off",
4057 + "radio",
4058 + "radio-am",
4059 + "radio-fm",
4060 + "radio-handheld",
4061 + "radio-off",
4062 + "radio-tower",
4063 + "radioactive",
4064 + "radioactive-off",
4065 + "radiobox-blank",
4066 + "radiobox-marked",
4067 + "radiology-box",
4068 + "radiology-box-outline",
4069 + "radius",
4070 + "radius-outline",
4071 + "railroad-light",
4072 + "raspberry-pi",
4073 + "ray-end",
4074 + "ray-end-arrow",
4075 + "ray-start",
4076 + "ray-start-arrow",
4077 + "ray-start-end",
4078 + "ray-vertex",
4079 + "react",
4080 + "read",
4081 + "receipt",
4082 + "record",
4083 + "record-circle",
4084 + "record-circle-outline",
4085 + "record-player",
4086 + "record-rec",
4087 + "rectangle",
4088 + "rectangle-outline",
4089 + "recycle",
4090 + "recycle-variant",
4091 + "reddit",
4092 + "redhat",
4093 + "redo",
4094 + "redo-variant",
4095 + "reflect-horizontal",
4096 + "reflect-vertical",
4097 + "refresh",
4098 + "refresh-circle",
4099 + "regex",
4100 + "registered-trademark",
4101 + "relation-many-to-many",
4102 + "relation-many-to-one",
4103 + "relation-many-to-one-or-many",
4104 + "relation-many-to-only-one",
4105 + "relation-many-to-zero-or-many",
4106 + "relation-many-to-zero-or-one",
4107 + "relation-one-or-many-to-many",
4108 + "relation-one-or-many-to-one",
4109 + "relation-one-or-many-to-one-or-many",
4110 + "relation-one-or-many-to-only-one",
4111 + "relation-one-or-many-to-zero-or-many",
4112 + "relation-one-or-many-to-zero-or-one",
4113 + "relation-one-to-many",
4114 + "relation-one-to-one",
4115 + "relation-one-to-one-or-many",
4116 + "relation-one-to-only-one",
4117 + "relation-one-to-zero-or-many",
4118 + "relation-one-to-zero-or-one",
4119 + "relation-only-one-to-many",
4120 + "relation-only-one-to-one",
4121 + "relation-only-one-to-one-or-many",
4122 + "relation-only-one-to-only-one",
4123 + "relation-only-one-to-zero-or-many",
4124 + "relation-only-one-to-zero-or-one",
4125 + "relation-zero-or-many-to-many",
4126 + "relation-zero-or-many-to-one",
4127 + "relation-zero-or-many-to-one-or-many",
4128 + "relation-zero-or-many-to-only-one",
4129 + "relation-zero-or-many-to-zero-or-many",
4130 + "relation-zero-or-many-to-zero-or-one",
4131 + "relation-zero-or-one-to-many",
4132 + "relation-zero-or-one-to-one",
4133 + "relation-zero-or-one-to-one-or-many",
4134 + "relation-zero-or-one-to-only-one",
4135 + "relation-zero-or-one-to-zero-or-many",
4136 + "relation-zero-or-one-to-zero-or-one",
4137 + "relative-scale",
4138 + "reload",
4139 + "reload-alert",
4140 + "reminder",
4141 + "remote",
4142 + "remote-desktop",
4143 + "remote-off",
4144 + "remote-tv",
4145 + "remote-tv-off",
4146 + "rename-box",
4147 + "reorder-horizontal",
4148 + "reorder-vertical",
4149 + "repeat",
4150 + "repeat-off",
4151 + "repeat-once",
4152 + "replay",
4153 + "reply",
4154 + "reply-all",
4155 + "reply-all-outline",
4156 + "reply-circle",
4157 + "reply-outline",
4158 + "reproduction",
4159 + "resistor",
4160 + "resistor-nodes",
4161 + "resize",
4162 + "resize-bottom-right",
4163 + "responsive",
4164 + "restart",
4165 + "restart-alert",
4166 + "restart-off",
4167 + "restore",
4168 + "restore-alert",
4169 + "rewind",
4170 + "rewind-10",
4171 + "rewind-30",
4172 + "rewind-5",
4173 + "rewind-outline",
4174 + "rhombus",
4175 + "rhombus-medium",
4176 + "rhombus-medium-outline",
4177 + "rhombus-outline",
4178 + "rhombus-split",
4179 + "rhombus-split-outline",
4180 + "ribbon",
4181 + "rice",
4182 + "ring",
4183 + "rivet",
4184 + "road",
4185 + "road-variant",
4186 + "robber",
4187 + "robot",
4188 + "robot-industrial",
4189 + "robot-mower",
4190 + "robot-mower-outline",
4191 + "robot-vacuum",
4192 + "robot-vacuum-variant",
4193 + "rocket",
4194 + "rocket-launch",
4195 + "rocket-launch-outline",
4196 + "rocket-outline",
4197 + "rodent",
4198 + "roller-skate",
4199 + "roller-skate-off",
4200 + "rollerblade",
4201 + "rollerblade-off",
4202 + "rollupjs",
4203 + "roman-numeral-1",
4204 + "roman-numeral-10",
4205 + "roman-numeral-2",
4206 + "roman-numeral-3",
4207 + "roman-numeral-4",
4208 + "roman-numeral-5",
4209 + "roman-numeral-6",
4210 + "roman-numeral-7",
4211 + "roman-numeral-8",
4212 + "roman-numeral-9",
4213 + "room-service",
4214 + "room-service-outline",
4215 + "rotate-3d",
4216 + "rotate-3d-variant",
4217 + "rotate-left",
4218 + "rotate-left-variant",
4219 + "rotate-orbit",
4220 + "rotate-right",
4221 + "rotate-right-variant",
4222 + "rounded-corner",
4223 + "router",
4224 + "router-network",
4225 + "router-wireless",
4226 + "router-wireless-settings",
4227 + "routes",
4228 + "routes-clock",
4229 + "rowing",
4230 + "rss",
4231 + "rss-box",
4232 + "rss-off",
4233 + "rug",
4234 + "rugby",
4235 + "ruler",
4236 + "ruler-square",
4237 + "ruler-square-compass",
4238 + "run",
4239 + "run-fast",
4240 + "rv-truck",
4241 + "sack",
4242 + "sack-percent",
4243 + "safe",
4244 + "safe-square",
4245 + "safe-square-outline",
4246 + "safety-goggles",
4247 + "sail-boat",
4248 + "sale",
4249 + "salesforce",
4250 + "sass",
4251 + "satellite",
4252 + "satellite-uplink",
4253 + "satellite-variant",
4254 + "sausage",
4255 + "saw-blade",
4256 + "sawtooth-wave",
4257 + "saxophone",
4258 + "scale",
4259 + "scale-balance",
4260 + "scale-bathroom",
4261 + "scale-off",
4262 + "scan-helper",
4263 + "scanner",
4264 + "scanner-off",
4265 + "scatter-plot",
4266 + "scatter-plot-outline",
4267 + "school",
4268 + "school-outline",
4269 + "scissors-cutting",
4270 + "scooter",
4271 + "scoreboard",
4272 + "scoreboard-outline",
4273 + "screen-rotation",
4274 + "screen-rotation-lock",
4275 + "screw-flat-top",
4276 + "screw-lag",
4277 + "screw-machine-flat-top",
4278 + "screw-machine-round-top",
4279 + "screw-round-top",
4280 + "screwdriver",
4281 + "script",
4282 + "script-outline",
4283 + "script-text",
4284 + "script-text-outline",
4285 + "sd",
4286 + "seal",
4287 + "seal-variant",
4288 + "search-web",
4289 + "seat",
4290 + "seat-flat",
4291 + "seat-flat-angled",
4292 + "seat-individual-suite",
4293 + "seat-legroom-extra",
4294 + "seat-legroom-normal",
4295 + "seat-legroom-reduced",
4296 + "seat-outline",
4297 + "seat-passenger",
4298 + "seat-recline-extra",
4299 + "seat-recline-normal",
4300 + "seatbelt",
4301 + "security",
4302 + "security-network",
4303 + "seed",
4304 + "seed-off",
4305 + "seed-off-outline",
4306 + "seed-outline",
4307 + "segment",
4308 + "select",
4309 + "select-all",
4310 + "select-color",
4311 + "select-compare",
4312 + "select-drag",
4313 + "select-group",
4314 + "select-inverse",
4315 + "select-marker",
4316 + "select-multiple",
4317 + "select-multiple-marker",
4318 + "select-off",
4319 + "select-place",
4320 + "select-search",
4321 + "selection",
4322 + "selection-drag",
4323 + "selection-ellipse",
4324 + "selection-ellipse-arrow-inside",
4325 + "selection-marker",
4326 + "selection-multiple",
4327 + "selection-multiple-marker",
4328 + "selection-off",
4329 + "selection-search",
4330 + "semantic-web",
4331 + "send",
4332 + "send-check",
4333 + "send-check-outline",
4334 + "send-circle",
4335 + "send-circle-outline",
4336 + "send-clock",
4337 + "send-clock-outline",
4338 + "send-lock",
4339 + "send-lock-outline",
4340 + "send-outline",
4341 + "serial-port",
4342 + "server",
4343 + "server-minus",
4344 + "server-network",
4345 + "server-network-off",
4346 + "server-off",
4347 + "server-plus",
4348 + "server-remove",
4349 + "server-security",
4350 + "set-all",
4351 + "set-center",
4352 + "set-center-right",
4353 + "set-left",
4354 + "set-left-center",
4355 + "set-left-right",
4356 + "set-merge",
4357 + "set-none",
4358 + "set-right",
4359 + "set-split",
4360 + "set-square",
4361 + "set-top-box",
4362 + "settings-helper",
4363 + "shaker",
4364 + "shaker-outline",
4365 + "shape",
4366 + "shape-circle-plus",
4367 + "shape-outline",
4368 + "shape-oval-plus",
4369 + "shape-plus",
4370 + "shape-polygon-plus",
4371 + "shape-rectangle-plus",
4372 + "shape-square-plus",
4373 + "share",
4374 + "share-all",
4375 + "share-all-outline",
4376 + "share-circle",
4377 + "share-off",
4378 + "share-off-outline",
4379 + "share-outline",
4380 + "share-variant",
4381 + "sheep",
4382 + "shield",
4383 + "shield-account",
4384 + "shield-account-outline",
4385 + "shield-airplane",
4386 + "shield-airplane-outline",
4387 + "shield-alert",
4388 + "shield-alert-outline",
4389 + "shield-bug",
4390 + "shield-bug-outline",
4391 + "shield-car",
4392 + "shield-check",
4393 + "shield-check-outline",
4394 + "shield-cross",
4395 + "shield-cross-outline",
4396 + "shield-edit",
4397 + "shield-edit-outline",
4398 + "shield-half",
4399 + "shield-half-full",
4400 + "shield-home",
4401 + "shield-home-outline",
4402 + "shield-key",
4403 + "shield-key-outline",
4404 + "shield-link-variant",
4405 + "shield-link-variant-outline",
4406 + "shield-lock",
4407 + "shield-lock-outline",
4408 + "shield-off",
4409 + "shield-off-outline",
4410 + "shield-outline",
4411 + "shield-plus",
4412 + "shield-plus-outline",
4413 + "shield-refresh",
4414 + "shield-refresh-outline",
4415 + "shield-remove",
4416 + "shield-remove-outline",
4417 + "shield-search",
4418 + "shield-star",
4419 + "shield-star-outline",
4420 + "shield-sun",
4421 + "shield-sun-outline",
4422 + "shield-sync",
4423 + "shield-sync-outline",
4424 + "ship-wheel",
4425 + "shoe-formal",
4426 + "shoe-heel",
4427 + "shoe-print",
4428 + "shopping",
4429 + "shopping-music",
4430 + "shopping-outline",
4431 + "shopping-search",
4432 + "shovel",
4433 + "shovel-off",
4434 + "shower",
4435 + "shower-head",
4436 + "shredder",
4437 + "shuffle",
4438 + "shuffle-disabled",
4439 + "shuffle-variant",
4440 + "shuriken",
4441 + "sigma",
4442 + "sigma-lower",
4443 + "sign-caution",
4444 + "sign-direction",
4445 + "sign-direction-minus",
4446 + "sign-direction-plus",
4447 + "sign-direction-remove",
4448 + "sign-real-estate",
4449 + "sign-text",
4450 + "signal",
4451 + "signal-2g",
4452 + "signal-3g",
4453 + "signal-4g",
4454 + "signal-5g",
4455 + "signal-cellular-1",
4456 + "signal-cellular-2",
4457 + "signal-cellular-3",
4458 + "signal-cellular-outline",
4459 + "signal-distance-variant",
4460 + "signal-hspa",
4461 + "signal-hspa-plus",
4462 + "signal-off",
4463 + "signal-variant",
4464 + "signature",
4465 + "signature-freehand",
4466 + "signature-image",
4467 + "signature-text",
4468 + "silo",
4469 + "silverware",
4470 + "silverware-clean",
4471 + "silverware-fork",
4472 + "silverware-fork-knife",
4473 + "silverware-spoon",
4474 + "silverware-variant",
4475 + "sim",
4476 + "sim-alert",
4477 + "sim-off",
4478 + "simple-icons",
4479 + "sina-weibo",
4480 + "sine-wave",
4481 + "sitemap",
4482 + "size-l",
4483 + "size-m",
4484 + "size-s",
4485 + "size-xl",
4486 + "size-xs",
4487 + "size-xxl",
4488 + "size-xxs",
4489 + "size-xxxl",
4490 + "skate",
4491 + "skateboard",
4492 + "skew-less",
4493 + "skew-more",
4494 + "ski",
4495 + "ski-cross-country",
4496 + "ski-water",
4497 + "skip-backward",
4498 + "skip-backward-outline",
4499 + "skip-forward",
4500 + "skip-forward-outline",
4501 + "skip-next",
4502 + "skip-next-circle",
4503 + "skip-next-circle-outline",
4504 + "skip-next-outline",
4505 + "skip-previous",
4506 + "skip-previous-circle",
4507 + "skip-previous-circle-outline",
4508 + "skip-previous-outline",
4509 + "skull",
4510 + "skull-crossbones",
4511 + "skull-crossbones-outline",
4512 + "skull-outline",
4513 + "skull-scan",
4514 + "skull-scan-outline",
4515 + "skype",
4516 + "skype-business",
4517 + "slack",
4518 + "slash-forward",
4519 + "slash-forward-box",
4520 + "sleep",
4521 + "sleep-off",
4522 + "slope-downhill",
4523 + "slope-uphill",
4524 + "slot-machine",
4525 + "slot-machine-outline",
4526 + "smart-card",
4527 + "smart-card-outline",
4528 + "smart-card-reader",
4529 + "smart-card-reader-outline",
4530 + "smog",
4531 + "smoke-detector",
4532 + "smoking",
4533 + "smoking-off",
4534 + "smoking-pipe",
4535 + "smoking-pipe-off",
4536 + "snapchat",
4537 + "snowboard",
4538 + "snowflake",
4539 + "snowflake-alert",
4540 + "snowflake-melt",
4541 + "snowflake-variant",
4542 + "snowman",
4543 + "soccer",
4544 + "soccer-field",
4545 + "sofa",
4546 + "solar-panel",
4547 + "solar-panel-large",
4548 + "solar-power",
4549 + "soldering-iron",
4550 + "solid",
4551 + "sony-playstation",
4552 + "sort",
4553 + "sort-alphabetical-ascending",
4554 + "sort-alphabetical-ascending-variant",
4555 + "sort-alphabetical-descending",
4556 + "sort-alphabetical-descending-variant",
4557 + "sort-alphabetical-variant",
4558 + "sort-ascending",
4559 + "sort-bool-ascending",
4560 + "sort-bool-ascending-variant",
4561 + "sort-bool-descending",
4562 + "sort-bool-descending-variant",
4563 + "sort-descending",
4564 + "sort-numeric-ascending",
4565 + "sort-numeric-ascending-variant",
4566 + "sort-numeric-descending",
4567 + "sort-numeric-descending-variant",
4568 + "sort-numeric-variant",
4569 + "sort-reverse-variant",
4570 + "sort-variant",
4571 + "sort-variant-lock",
4572 + "sort-variant-lock-open",
4573 + "sort-variant-remove",
4574 + "soundcloud",
4575 + "source-branch",
4576 + "source-branch-check",
4577 + "source-branch-minus",
4578 + "source-branch-plus",
4579 + "source-branch-refresh",
4580 + "source-branch-remove",
4581 + "source-branch-sync",
4582 + "source-commit",
4583 + "source-commit-end",
4584 + "source-commit-end-local",
4585 + "source-commit-local",
4586 + "source-commit-next-local",
4587 + "source-commit-start",
4588 + "source-commit-start-next-local",
4589 + "source-fork",
4590 + "source-merge",
4591 + "source-pull",
4592 + "source-repository",
4593 + "source-repository-multiple",
4594 + "soy-sauce",
4595 + "soy-sauce-off",
4596 + "spa",
4597 + "spa-outline",
4598 + "space-invaders",
4599 + "space-station",
4600 + "spade",
4601 + "speaker",
4602 + "speaker-bluetooth",
4603 + "speaker-multiple",
4604 + "speaker-off",
4605 + "speaker-wireless",
4606 + "speedometer",
4607 + "speedometer-medium",
4608 + "speedometer-slow",
4609 + "spellcheck",
4610 + "spider",
4611 + "spider-thread",
4612 + "spider-web",
4613 + "spoon-sugar",
4614 + "spotify",
4615 + "spotlight",
4616 + "spotlight-beam",
4617 + "spray",
4618 + "spray-bottle",
4619 + "sprinkler",
4620 + "sprinkler-variant",
4621 + "sprout",
4622 + "sprout-outline",
4623 + "square",
4624 + "square-edit-outline",
4625 + "square-medium",
4626 + "square-medium-outline",
4627 + "square-off",
4628 + "square-off-outline",
4629 + "square-outline",
4630 + "square-root",
4631 + "square-root-box",
4632 + "square-small",
4633 + "square-wave",
4634 + "squeegee",
4635 + "ssh",
4636 + "stack-exchange",
4637 + "stack-overflow",
4638 + "stackpath",
4639 + "stadium",
4640 + "stadium-variant",
4641 + "stairs",
4642 + "stairs-box",
4643 + "stairs-down",
4644 + "stairs-up",
4645 + "stamper",
4646 + "standard-definition",
4647 + "star",
4648 + "star-box",
4649 + "star-box-multiple",
4650 + "star-box-multiple-outline",
4651 + "star-box-outline",
4652 + "star-circle",
4653 + "star-circle-outline",
4654 + "star-face",
4655 + "star-four-points",
4656 + "star-four-points-outline",
4657 + "star-half",
4658 + "star-half-full",
4659 + "star-off",
4660 + "star-outline",
4661 + "star-three-points",
4662 + "star-three-points-outline",
4663 + "state-machine",
4664 + "steam",
4665 + "steering",
4666 + "steering-off",
4667 + "step-backward",
4668 + "step-backward-2",
4669 + "step-forward",
4670 + "step-forward-2",
4671 + "stethoscope",
4672 + "sticker",
4673 + "sticker-alert",
4674 + "sticker-alert-outline",
4675 + "sticker-check",
4676 + "sticker-check-outline",
4677 + "sticker-circle-outline",
4678 + "sticker-emoji",
4679 + "sticker-minus",
4680 + "sticker-minus-outline",
4681 + "sticker-outline",
4682 + "sticker-plus",
4683 + "sticker-plus-outline",
4684 + "sticker-remove",
4685 + "sticker-remove-outline",
4686 + "stocking",
4687 + "stomach",
4688 + "stop",
4689 + "stop-circle",
4690 + "stop-circle-outline",
4691 + "store",
4692 + "store-24-hour",
4693 + "store-outline",
4694 + "storefront",
4695 + "storefront-outline",
4696 + "stove",
4697 + "strategy",
4698 + "stretch-to-page",
4699 + "stretch-to-page-outline",
4700 + "string-lights",
4701 + "string-lights-off",
4702 + "subdirectory-arrow-left",
4703 + "subdirectory-arrow-right",
4704 + "subtitles",
4705 + "subtitles-outline",
4706 + "subway",
4707 + "subway-alert-variant",
4708 + "subway-variant",
4709 + "summit",
4710 + "sunglasses",
4711 + "surround-sound",
4712 + "surround-sound-2-0",
4713 + "surround-sound-3-1",
4714 + "surround-sound-5-1",
4715 + "surround-sound-7-1",
4716 + "svg",
4717 + "swap-horizontal",
4718 + "swap-horizontal-bold",
4719 + "swap-horizontal-circle",
4720 + "swap-horizontal-circle-outline",
4721 + "swap-horizontal-variant",
4722 + "swap-vertical",
4723 + "swap-vertical-bold",
4724 + "swap-vertical-circle",
4725 + "swap-vertical-circle-outline",
4726 + "swap-vertical-variant",
4727 + "swim",
4728 + "switch",
4729 + "sword",
4730 + "sword-cross",
4731 + "syllabary-hangul",
4732 + "syllabary-hiragana",
4733 + "syllabary-katakana",
4734 + "syllabary-katakana-halfwidth",
4735 + "symfony",
4736 + "sync",
4737 + "sync-alert",
4738 + "sync-circle",
4739 + "sync-off",
4740 + "tab",
4741 + "tab-minus",
4742 + "tab-plus",
4743 + "tab-remove",
4744 + "tab-unselected",
4745 + "table",
4746 + "table-account",
4747 + "table-alert",
4748 + "table-arrow-down",
4749 + "table-arrow-left",
4750 + "table-arrow-right",
4751 + "table-arrow-up",
4752 + "table-border",
4753 + "table-cancel",
4754 + "table-chair",
4755 + "table-check",
4756 + "table-clock",
4757 + "table-cog",
4758 + "table-column",
4759 + "table-column-plus-after",
4760 + "table-column-plus-before",
4761 + "table-column-remove",
4762 + "table-column-width",
4763 + "table-edit",
4764 + "table-eye",
4765 + "table-eye-off",
4766 + "table-furniture",
4767 + "table-headers-eye",
4768 + "table-headers-eye-off",
4769 + "table-heart",
4770 + "table-key",
4771 + "table-large",
4772 + "table-large-plus",
4773 + "table-large-remove",
4774 + "table-lock",
4775 + "table-merge-cells",
4776 + "table-minus",
4777 + "table-multiple",
4778 + "table-network",
4779 + "table-of-contents",
4780 + "table-off",
4781 + "table-plus",
4782 + "table-refresh",
4783 + "table-remove",
4784 + "table-row",
4785 + "table-row-height",
4786 + "table-row-plus-after",
4787 + "table-row-plus-before",
4788 + "table-row-remove",
4789 + "table-search",
4790 + "table-settings",
4791 + "table-split-cell",
4792 + "table-star",
4793 + "table-sync",
4794 + "table-tennis",
4795 + "tablet",
4796 + "tablet-android",
4797 + "tablet-cellphone",
4798 + "tablet-dashboard",
4799 + "tablet-ipad",
4800 + "taco",
4801 + "tag",
4802 + "tag-faces",
4803 + "tag-heart",
4804 + "tag-heart-outline",
4805 + "tag-minus",
4806 + "tag-minus-outline",
4807 + "tag-multiple",
4808 + "tag-multiple-outline",
4809 + "tag-off",
4810 + "tag-off-outline",
4811 + "tag-outline",
4812 + "tag-plus",
4813 + "tag-plus-outline",
4814 + "tag-remove",
4815 + "tag-remove-outline",
4816 + "tag-text",
4817 + "tag-text-outline",
4818 + "tailwind",
4819 + "tank",
4820 + "tanker-truck",
4821 + "tape-measure",
4822 + "target",
4823 + "target-account",
4824 + "target-variant",
4825 + "taxi",
4826 + "tea",
4827 + "tea-outline",
4828 + "teach",
4829 + "teamviewer",
4830 + "telegram",
4831 + "telescope",
4832 + "television",
4833 + "television-ambient-light",
4834 + "television-box",
4835 + "television-classic",
4836 + "television-classic-off",
4837 + "television-clean",
4838 + "television-guide",
4839 + "television-off",
4840 + "television-pause",
4841 + "television-play",
4842 + "television-stop",
4843 + "temperature-celsius",
4844 + "temperature-fahrenheit",
4845 + "temperature-kelvin",
4846 + "tennis",
4847 + "tennis-ball",
4848 + "tent",
4849 + "terraform",
4850 + "terrain",
4851 + "test-tube",
4852 + "test-tube-empty",
4853 + "test-tube-off",
4854 + "text",
4855 + "text-box",
4856 + "text-box-check",
4857 + "text-box-check-outline",
4858 + "text-box-minus",
4859 + "text-box-minus-outline",
4860 + "text-box-multiple",
4861 + "text-box-multiple-outline",
4862 + "text-box-outline",
4863 + "text-box-plus",
4864 + "text-box-plus-outline",
4865 + "text-box-remove",
4866 + "text-box-remove-outline",
4867 + "text-box-search",
4868 + "text-box-search-outline",
4869 + "text-recognition",
4870 + "text-search",
4871 + "text-shadow",
4872 + "text-short",
4873 + "text-subject",
4874 + "text-to-speech",
4875 + "text-to-speech-off",
4876 + "texture",
4877 + "texture-box",
4878 + "theater",
4879 + "theme-light-dark",
4880 + "thermometer",
4881 + "thermometer-alert",
4882 + "thermometer-chevron-down",
4883 + "thermometer-chevron-up",
4884 + "thermometer-high",
4885 + "thermometer-lines",
4886 + "thermometer-low",
4887 + "thermometer-minus",
4888 + "thermometer-plus",
4889 + "thermostat",
4890 + "thermostat-box",
4891 + "thought-bubble",
4892 + "thought-bubble-outline",
4893 + "thumb-down",
4894 + "thumb-down-outline",
4895 + "thumb-up",
4896 + "thumb-up-outline",
4897 + "thumbs-up-down",
4898 + "ticket",
4899 + "ticket-account",
4900 + "ticket-confirmation",
4901 + "ticket-confirmation-outline",
4902 + "ticket-outline",
4903 + "ticket-percent",
4904 + "ticket-percent-outline",
4905 + "tie",
4906 + "tilde",
4907 + "timelapse",
4908 + "timeline",
4909 + "timeline-alert",
4910 + "timeline-alert-outline",
4911 + "timeline-clock",
4912 + "timeline-clock-outline",
4913 + "timeline-help",
4914 + "timeline-help-outline",
4915 + "timeline-outline",
4916 + "timeline-plus",
4917 + "timeline-plus-outline",
4918 + "timeline-text",
4919 + "timeline-text-outline",
4920 + "timer",
4921 + "timer-10",
4922 + "timer-3",
4923 + "timer-off",
4924 + "timer-off-outline",
4925 + "timer-outline",
4926 + "timer-sand",
4927 + "timer-sand-empty",
4928 + "timer-sand-full",
4929 + "timetable",
4930 + "toaster",
4931 + "toaster-off",
4932 + "toaster-oven",
4933 + "toggle-switch",
4934 + "toggle-switch-off",
4935 + "toggle-switch-off-outline",
4936 + "toggle-switch-outline",
4937 + "toilet",
4938 + "toolbox",
4939 + "toolbox-outline",
4940 + "tools",
4941 + "tooltip",
4942 + "tooltip-account",
4943 + "tooltip-edit",
4944 + "tooltip-edit-outline",
4945 + "tooltip-image",
4946 + "tooltip-image-outline",
4947 + "tooltip-outline",
4948 + "tooltip-plus",
4949 + "tooltip-plus-outline",
4950 + "tooltip-text",
4951 + "tooltip-text-outline",
4952 + "tooth",
4953 + "tooth-outline",
4954 + "toothbrush",
4955 + "toothbrush-electric",
4956 + "toothbrush-paste",
4957 + "tortoise",
4958 + "toslink",
4959 + "tournament",
4960 + "tow-truck",
4961 + "tower-beach",
4962 + "tower-fire",
4963 + "toy-brick",
4964 + "toy-brick-marker",
4965 + "toy-brick-marker-outline",
4966 + "toy-brick-minus",
4967 + "toy-brick-minus-outline",
4968 + "toy-brick-outline",
4969 + "toy-brick-plus",
4970 + "toy-brick-plus-outline",
4971 + "toy-brick-remove",
4972 + "toy-brick-remove-outline",
4973 + "toy-brick-search",
4974 + "toy-brick-search-outline",
4975 + "track-light",
4976 + "trackpad",
4977 + "trackpad-lock",
4978 + "tractor",
4979 + "tractor-variant",
4980 + "trademark",
4981 + "traffic-cone",
4982 + "traffic-light",
4983 + "train",
4984 + "train-car",
4985 + "train-variant",
4986 + "tram",
4987 + "tram-side",
4988 + "transcribe",
4989 + "transcribe-close",
4990 + "transfer",
4991 + "transfer-down",
4992 + "transfer-left",
4993 + "transfer-right",
4994 + "transfer-up",
4995 + "transit-connection",
4996 + "transit-connection-variant",
4997 + "transit-detour",
4998 + "transit-transfer",
4999 + "transition",

This file is too large to show in full.

src/views/ui/Layout/Layout.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Layout"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/ui/Layout/LayoutBlank.vue new
+15
@@ -0,0 +1,15 @@
1 +<template>
2 + <div class="page-layout-blank scrollable">Blank page</div>
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "LayoutBlank"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped>
14 +@import "../../../assets/scss/_variables";
15 +</style>
src/views/ui/Layout/LayoutFlexbox.vue new
+225
@@ -0,0 +1,225 @@
1 +<template>
2 + <el-scrollbar class="page-layout-flexbox">
3 + <div class="page-header">
4 + <h1>Layout Flexbox</h1>
5 + <h4>
6 + <a href="https://ixrock.github.io/flexbox/docs/" target="_blank"
7 + ><i class="mdi mdi-book-open-page-variant"></i> see from the complete documentation</a
8 + >
9 + </h4>
10 + </div>
11 + <main class="demo-box code1">
12 + <div class="example">
13 + <div class="flex gaps auto">
14 + <div class="box"></div>
15 + <div class="box"></div>
16 + <div class="box"></div>
17 + <div class="box"></div>
18 + <div class="box"></div>
19 + </div>
20 + </div>
21 +
22 + <div class="example">
23 + <div class="flex gaps">
24 + <div class="box"></div>
25 + <div class="box grow"></div>
26 + <div class="box"></div>
27 + <div class="box"></div>
28 + <div class="box"></div>
29 + </div>
30 + </div>
31 +
32 + <div class="example multi-line">
33 + <div class="flex gaps grid-12">
34 + <div class="col-2"></div>
35 + <div class="col-2"></div>
36 + <div class="col-2"></div>
37 + <div class="col-2"></div>
38 + <div class="col-2"></div>
39 + </div>
40 + <div class="flex gaps grid-12">
41 + <div class="col-3"></div>
42 + <div class="col-3"></div>
43 + <div class="col-3"></div>
44 + <div class="col-3"></div>
45 + </div>
46 + <div class="flex gaps grid-12">
47 + <div class="col-4"></div>
48 + <div class="col-4"></div>
49 + <div class="col-4"></div>
50 + </div>
51 + <div class="flex gaps grid-12">
52 + <div class="col-6"></div>
53 + <div class="col-6"></div>
54 + </div>
55 + </div>
56 +
57 + <div class="example">
58 + <div class="flex grid-6 gaps custom-gaps">
59 + <div class="col-1"></div>
60 + <div class="col-2"></div>
61 + <div class="col-3"></div>
62 + </div>
63 + </div>
64 +
65 + <div class="example">
66 + <div class="flex column gaps">
67 + <div class="box"></div>
68 + <div class="box"></div>
69 + <div class="box bottom"></div>
70 + </div>
71 + </div>
72 +
73 + <div class="example">
74 + <div class="flex column gaps">
75 + <div class="box"></div>
76 + <div class="box grow"></div>
77 + <div class="box"></div>
78 + </div>
79 + </div>
80 +
81 + <div class="example">
82 + <div class="flex center">
83 + <div class="box"></div>
84 + <div class="box"></div>
85 + <div class="box"></div>
86 + <div class="box"></div>
87 + <div class="box"></div>
88 + </div>
89 + </div>
90 +
91 + <div class="example">
92 + <div class="flex">
93 + <div class="box center left"></div>
94 + <div class="box center top"></div>
95 + <div class="box"></div>
96 + </div>
97 + </div>
98 +
99 + <div class="example">
100 + <div class="flex">
101 + <div class="box"></div>
102 + <div class="box center"></div>
103 + <div class="box"></div>
104 + </div>
105 + </div>
106 +
107 + <div class="example">
108 + <div class="flex center">
109 + <div class="box top left"></div>
110 + <div class="box"></div>
111 + <div class="box right bottom"></div>
112 + </div>
113 + </div>
114 +
115 + <div class="example">
116 + <div class="flex auto">
117 + <div class="box self-flex-start"></div>
118 + <div class="box center"></div>
119 + <div class="box self-flex-end"></div>
120 + </div>
121 + </div>
122 +
123 + <div class="example">
124 + <div class="flex justify-center align-center">
125 + <div class="box"></div>
126 + <div class="box"></div>
127 + <div class="box"></div>
128 + <div class="box"></div>
129 + <div class="box"></div>
130 + </div>
131 + </div>
132 +
133 + <div class="example">
134 + <div class="flex justify-space-around">
135 + <div class="box"></div>
136 + <div class="box"></div>
137 + <div class="box"></div>
138 + <div class="box"></div>
139 + <div class="box"></div>
140 + </div>
141 + </div>
142 +
143 + <div class="example">
144 + <div class="flex justify-space-between">
145 + <div class="box"></div>
146 + <div class="box"></div>
147 + <div class="box"></div>
148 + <div class="box"></div>
149 + <div class="box"></div>
150 + </div>
151 + </div>
152 + </main>
153 + </el-scrollbar>
154 +</template>
155 +
156 +<script>
157 +import { defineComponent } from "@vue/runtime-core"
158 +
159 +export default defineComponent({
160 + name: "LayoutFlexbox",
161 + data() {
162 + return {}
163 + },
164 + mounted() {
165 + //console.log('LayoutFlexbox mounted')
166 + }
167 +})
168 +</script>
169 +
170 +<style lang="scss" scoped>
171 +@import "../../../assets/scss/_variables";
172 +
173 +.demo-box {
174 + padding-top: 20px;
175 + font-size: 13px;
176 +}
177 +
178 +main.code1 {
179 + display: flex;
180 + flex-flow: row wrap;
181 + align-items: flex-start;
182 + margin: 0px -20px;
183 +
184 + & > * {
185 + flex: 1 0 240px;
186 + //margin: 30px var(--space);
187 + margin: 30px 20px;
188 + position: relative;
189 + border: 1px solid $text-color-primary;
190 + }
191 + .example > .flex {
192 + min-height: 175px;
193 + }
194 + .example.multi-line > .flex {
195 + min-height: 0;
196 + }
197 + .example.multi-line > .flex:not(:last-child) {
198 + margin-bottom: var(--flex-gap, 1em);
199 + }
200 + .example > :after {
201 + content: 'class="' attr(class) '"';
202 + position: absolute;
203 + left: -1px;
204 + bottom: calc(100% + 1px);
205 + background: darken($background-color, 10%);
206 + color: $text-color-primary;
207 + padding: 0.5rem;
208 + border: 1px solid $text-color-primary;
209 + border-top-left-radius: 10px;
210 + border-top-right-radius: 10px;
211 + border-bottom: 0;
212 + }
213 + .flex > * {
214 + background: darken($background-color, 10%);
215 + text-align: center;
216 + padding: 5px;
217 + }
218 + .flex > *:after {
219 + content: attr(class);
220 + }
221 + .custom-gaps {
222 + --flex-gap: 10px;
223 + }
224 +}
225 +</style>
src/views/ui/Layout/LayoutSidebarLeft.vue new
+199
@@ -0,0 +1,199 @@
1 +<template>
2 + <div class="page-layout-sidebar-left scrollable only-y">
3 + <div class="page-header header-primary card-base card-shadow--small flex">
4 + <div class="box grow">
5 + <h1>Sidebar left</h1>
6 + <el-breadcrumb separator="/">
7 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
8 + <el-breadcrumb-item>UI</el-breadcrumb-item>
9 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
10 + <el-breadcrumb-item>Sidebar left</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 + <div class="menu-btn align-vertical" @click="sidebarOpen = !sidebarOpen">
14 + <i class="mdi mdi-menu align-vertical-middle"></i>
15 + </div>
16 + </div>
17 + <div class="flex">
18 + <div class="sidebar scrollable" :class="{ open: sidebarOpen }">
19 + <el-button size="small" class="close-btn" @click="sidebarOpen = false">close</el-button>
20 + <ul>
21 + <li v-for="i in 20" :key="i">Sidebar Item {{ i }}</li>
22 + </ul>
23 + </div>
24 + <div class="box grow card-base card-shadow--small p-24">
25 + <div style="max-width: 1100px; margin: 0 auto">
26 + <p class="mt-18">
27 + <img src="@/assets/images/photo1.jpg" class="demo-img" alt="demo image" />
28 + </p>
29 + <h1 class="mt-8">Lorem ipsum dolor sit amet</h1>
30 + <p class="mt-0">
31 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent a odio malesuada, vehicula felis in, porttitor
32 + lectus. Donec venenatis nunc metus. Praesent ornare est diam, vitae finibus mauris faucibus quis. Duis magna orci,
33 + aliquam at arcu sit amet, sagittis auctor nisi. Aenean vestibulum sem eu orci ultricies, sed accumsan quam varius.
34 + Sed vulputate quis orci et ornare. Suspendisse in magna eu felis ullamcorper ultrices.
35 + </p>
36 +
37 + <blockquote>
38 + <p>
39 + Aliquam et nunc tincidunt, lobortis risus sit amet, tempor dui. Suspendisse potenti. Curabitur gravida feugiat
40 + lacinia. Sed blandit, magna ac dictum imperdiet, massa nisl vehicula lorem, vitae fermentum eros orci quis
41 + metus. Nam imperdiet enim et velit luctus porttitor. Maecenas in sollicitudin lorem. Curabitur felis ex, gravida
42 + ut mauris vitae, faucibus lobortis mauris. Fusce finibus tortor leo, id pharetra magna tincidunt eu. Duis quis
43 + nisl malesuada, blandit eros non, auctor velit. Donec accumsan euismod interdum. Pellentesque gravida porta
44 + ipsum, hendrerit posuere enim euismod vitae. Nulla luctus lobortis dui, eget rhoncus lacus malesuada id.
45 + </p>
46 + </blockquote>
47 + <p>
48 + Integer vestibulum rhoncus erat ac pulvinar. Quisque vitae lectus nec orci tincidunt laoreet. Praesent feugiat orci
49 + id dui placerat, ut mattis neque bibendum. Aenean cursus justo ac commodo rhoncus. Etiam vestibulum mollis enim, nec
50 + lobortis velit vulputate nec. Proin consequat sapien at nibh aliquet tincidunt. Cras condimentum urna nec justo
51 + elementum, vitae congue nulla ullamcorper. Sed ac leo lobortis, feugiat ex sed, gravida enim. Aliquam nec dolor
52 + vitae ligula iaculis imperdiet at eget ipsum. Nunc a tincidunt libero, nec maximus felis. Donec sed arcu ac sem
53 + imperdiet placerat. Integer fermentum quam eget ex mattis, at scelerisque ante tempor.
54 + </p>
55 + <p>
56 + In eu iaculis ex. Ut tempor dapibus augue, nec mattis ante imperdiet id. Praesent mattis iaculis justo nec
57 + fermentum. Nam auctor sagittis euismod. Sed sagittis erat in vulputate iaculis. Maecenas quis purus sit amet orci
58 + tempor condimentum a vel purus. Ut hendrerit nulla mi. Nunc condimentum sed libero ut fermentum. Donec varius metus
59 + urna, non pretium nulla blandit quis. Aenean vulputate neque eget risus tristique pellentesque. Sed bibendum dolor
60 + sit amet lacus vehicula vestibulum. Nullam vel neque pretium metus dapibus aliquam nec at sem.
61 + </p>
62 + </div>
63 + </div>
64 + </div>
65 + </div>
66 +</template>
67 +
68 +<script>
69 +import { defineComponent } from "@vue/runtime-core"
70 +
71 +export default defineComponent({
72 + name: "LayoutSidebarLeft",
73 + data() {
74 + return {
75 + sidebarOpen: false
76 + }
77 + }
78 +})
79 +</script>
80 +
81 +<style lang="scss" scoped>
82 +@import "../../../assets/scss/_variables";
83 +
84 +.page-layout-sidebar-left {
85 + padding-left: 20px;
86 + padding-right: 15px;
87 + padding-bottom: 20px;
88 +
89 + .page-header {
90 + margin-bottom: 20px;
91 + min-height: 60px;
92 +
93 + .menu-btn {
94 + color: $background-color;
95 + font-size: 20px;
96 + display: none;
97 + cursor: pointer;
98 + }
99 + }
100 +
101 + .demo-img {
102 + width: 100%;
103 + max-width: 500px;
104 + margin-bottom: 10px;
105 + border-radius: 4px;
106 + }
107 +
108 + .sidebar {
109 + box-sizing: border-box;
110 + padding: 24px;
111 + min-width: 250px;
112 + margin-left: -24px;
113 +
114 + .close-btn {
115 + display: none;
116 + width: 100%;
117 + margin-bottom: 10px;
118 + }
119 +
120 + ul {
121 + width: 100%;
122 + list-style: none;
123 + padding: 0;
124 + margin: 0;
125 + }
126 + li {
127 + box-sizing: border-box;
128 + width: 100%;
129 + list-style: none;
130 + padding: 15px 20px;
131 + border-bottom: 1px solid transparentize($text-color-primary, 0.9);
132 + cursor: pointer;
133 + position: relative;
134 +
135 + &::after {
136 + content: "";
137 + display: block;
138 + width: 0%;
139 + height: 100%;
140 + background: $text-color-primary;
141 + position: absolute;
142 + top: 0;
143 + left: 0;
144 + opacity: 0;
145 + transition: all 0.5s;
146 + }
147 +
148 + &:hover {
149 + &::after {
150 + width: 100%;
151 + opacity: 0.3;
152 + }
153 + }
154 + }
155 + }
156 +}
157 +
158 +@media (max-width: 768px) {
159 + .page-layout-sidebar-left {
160 + padding-left: 5px;
161 + padding-right: 5px;
162 +
163 + .page-header {
164 + .menu-btn {
165 + display: block;
166 + }
167 + }
168 + .sidebar {
169 + .close-btn {
170 + display: block;
171 + }
172 +
173 + margin: 0;
174 + text-align: center;
175 + position: absolute;
176 + background: white;
177 + color: #000;
178 + top: 5px;
179 + left: -100%;
180 + opacity: 0;
181 + bottom: 5px;
182 + box-shadow: 40px 0px 160px 80px rgba(0, 0, 0, 0.3);
183 + border-top-right-radius: 4px;
184 + border-bottom-right-radius: 4px;
185 + transition: all 0.5s;
186 +
187 + li {
188 + border-bottom: 1px solid #eee;
189 + }
190 +
191 + &.open {
192 + opacity: 1;
193 + left: 0;
194 + z-index: 999;
195 + }
196 + }
197 + }
198 +}
199 +</style>
src/views/ui/Layout/LayoutSidebarRight.vue new
+198
@@ -0,0 +1,198 @@
1 +<template>
2 + <div class="page-layout-sidebar-right scrollable only-y">
3 + <div class="page-header header-primary card-base card-shadow--small flex">
4 + <div class="box grow">
5 + <h1>Sidebar right</h1>
6 + <el-breadcrumb separator="/">
7 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
8 + <el-breadcrumb-item>UI</el-breadcrumb-item>
9 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
10 + <el-breadcrumb-item>Sidebar right</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 + <div class="menu-btn align-vertical" @click="sidebarOpen = !sidebarOpen">
14 + <i class="mdi mdi-menu align-vertical-middle"></i>
15 + </div>
16 + </div>
17 + <div class="flex">
18 + <div class="box grow card-base card-shadow--small p-24">
19 + <div style="max-width: 1100px; margin: 0 auto">
20 + <p class="mt-18">
21 + <img src="@/assets/images/photo1.jpg" class="demo-img" alt="demo image" />
22 + </p>
23 + <h1 class="mt-8">Lorem ipsum dolor sit amet</h1>
24 + <p class="mt-0">
25 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent a odio malesuada, vehicula felis in, porttitor
26 + lectus. Donec venenatis nunc metus. Praesent ornare est diam, vitae finibus mauris faucibus quis. Duis magna orci,
27 + aliquam at arcu sit amet, sagittis auctor nisi. Aenean vestibulum sem eu orci ultricies, sed accumsan quam varius.
28 + Sed vulputate quis orci et ornare. Suspendisse in magna eu felis ullamcorper ultrices.
29 + </p>
30 + <blockquote>
31 + <p>
32 + Aliquam et nunc tincidunt, lobortis risus sit amet, tempor dui. Suspendisse potenti. Curabitur gravida feugiat
33 + lacinia. Sed blandit, magna ac dictum imperdiet, massa nisl vehicula lorem, vitae fermentum eros orci quis
34 + metus. Nam imperdiet enim et velit luctus porttitor. Maecenas in sollicitudin lorem. Curabitur felis ex, gravida
35 + ut mauris vitae, faucibus lobortis mauris. Fusce finibus tortor leo, id pharetra magna tincidunt eu. Duis quis
36 + nisl malesuada, blandit eros non, auctor velit. Donec accumsan euismod interdum. Pellentesque gravida porta
37 + ipsum, hendrerit posuere enim euismod vitae. Nulla luctus lobortis dui, eget rhoncus lacus malesuada id.
38 + </p>
39 + </blockquote>
40 + <p>
41 + Integer vestibulum rhoncus erat ac pulvinar. Quisque vitae lectus nec orci tincidunt laoreet. Praesent feugiat orci
42 + id dui placerat, ut mattis neque bibendum. Aenean cursus justo ac commodo rhoncus. Etiam vestibulum mollis enim, nec
43 + lobortis velit vulputate nec. Proin consequat sapien at nibh aliquet tincidunt. Cras condimentum urna nec justo
44 + elementum, vitae congue nulla ullamcorper. Sed ac leo lobortis, feugiat ex sed, gravida enim. Aliquam nec dolor
45 + vitae ligula iaculis imperdiet at eget ipsum. Nunc a tincidunt libero, nec maximus felis. Donec sed arcu ac sem
46 + imperdiet placerat. Integer fermentum quam eget ex mattis, at scelerisque ante tempor.
47 + </p>
48 + <p>
49 + In eu iaculis ex. Ut tempor dapibus augue, nec mattis ante imperdiet id. Praesent mattis iaculis justo nec
50 + fermentum. Nam auctor sagittis euismod. Sed sagittis erat in vulputate iaculis. Maecenas quis purus sit amet orci
51 + tempor condimentum a vel purus. Ut hendrerit nulla mi. Nunc condimentum sed libero ut fermentum. Donec varius metus
52 + urna, non pretium nulla blandit quis. Aenean vulputate neque eget risus tristique pellentesque. Sed bibendum dolor
53 + sit amet lacus vehicula vestibulum. Nullam vel neque pretium metus dapibus aliquam nec at sem.
54 + </p>
55 + </div>
56 + </div>
57 + <div class="sidebar scrollable" :class="{ open: sidebarOpen }">
58 + <el-button size="small" class="close-btn" @click="sidebarOpen = false">close</el-button>
59 + <ul>
60 + <li v-for="i in 20" :key="i">Sidebar Item {{ i }}</li>
61 + </ul>
62 + </div>
63 + </div>
64 + </div>
65 +</template>
66 +
67 +<script>
68 +import { defineComponent } from "@vue/runtime-core"
69 +
70 +export default defineComponent({
71 + name: "LayoutSidebarRight",
72 + data() {
73 + return {
74 + sidebarOpen: false
75 + }
76 + }
77 +})
78 +</script>
79 +
80 +<style lang="scss" scoped>
81 +@import "../../../assets/scss/_variables";
82 +
83 +.page-layout-sidebar-right {
84 + padding-left: 20px;
85 + padding-right: 15px;
86 + padding-bottom: 20px;
87 +
88 + .page-header {
89 + margin-bottom: 20px;
90 + min-height: 60px;
91 +
92 + .menu-btn {
93 + color: $background-color;
94 + font-size: 20px;
95 + display: none;
96 + cursor: pointer;
97 + }
98 + }
99 +
100 + .demo-img {
101 + width: 100%;
102 + max-width: 500px;
103 + margin-bottom: 10px;
104 + border-radius: 4px;
105 + }
106 +
107 + .sidebar {
108 + box-sizing: border-box;
109 + padding: 24px;
110 + margin-right: -24px;
111 + //text-align: right;
112 + min-width: 250px;
113 +
114 + .close-btn {
115 + display: none;
116 + width: 100%;
117 + margin-bottom: 10px;
118 + }
119 +
120 + ul {
121 + width: 100%;
122 + list-style: none;
123 + padding: 0;
124 + margin: 0;
125 + }
126 + li {
127 + box-sizing: border-box;
128 + width: 100%;
129 + list-style: none;
130 + padding: 15px 20px;
131 + border-bottom: 1px solid transparentize($text-color-primary, 0.9);
132 + cursor: pointer;
133 + position: relative;
134 +
135 + &::after {
136 + content: "";
137 + display: block;
138 + width: 0%;
139 + height: 100%;
140 + background: $text-color-primary;
141 + position: absolute;
142 + top: 0;
143 + left: 0;
144 + opacity: 0;
145 + transition: all 0.5s;
146 + }
147 +
148 + &:hover {
149 + &::after {
150 + width: 100%;
151 + opacity: 0.3;
152 + }
153 + }
154 + }
155 + }
156 +}
157 +
158 +@media (max-width: 768px) {
159 + .page-layout-sidebar-right {
160 + padding-left: 5px;
161 + padding-right: 5px;
162 + .page-header {
163 + .menu-btn {
164 + display: block;
165 + }
166 + }
167 + .sidebar {
168 + .close-btn {
169 + display: block;
170 + }
171 +
172 + margin: 0;
173 + text-align: center;
174 + position: absolute;
175 + background: white;
176 + color: #000;
177 + top: 5px;
178 + right: -100%;
179 + opacity: 0;
180 + bottom: 5px;
181 + box-shadow: -40px 0px 160px 80px rgba(0, 0, 0, 0.3);
182 + border-top-left-radius: 4px;
183 + border-bottom-left-radius: 4px;
184 + transition: all 0.5s;
185 +
186 + li {
187 + border-bottom: 1px solid #eee;
188 + }
189 +
190 + &.open {
191 + opacity: 1;
192 + right: 0;
193 + z-index: 999;
194 + }
195 + }
196 + }
197 +}
198 +</style>
src/views/ui/Layout/LayoutTabbed.vue new
+166
@@ -0,0 +1,166 @@
1 +<template>
2 + <el-scrollbar class="page-layout-tabbed">
3 + <div class="page-header header-accent card-base card-shadow--small">
4 + <h1>Tabbed page</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>UI</el-breadcrumb-item>
8 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
9 + <el-breadcrumb-item>Tabbed page</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 + <el-tabs type="border-card">
13 + <el-tab-pane label="Tab 1">
14 + <div style="max-width: 1100px; margin: 0 auto" class="pv-20 ph-8">
15 + <p class="mt-0">
16 + <img src="@/assets/images/photo2.jpg" class="demo-img" alt="demo image" />
17 + </p>
18 + <h1 style="display: block; clear: both">Tab 1 Lorem ipsum dolor sit amet</h1>
19 + <p class="mt-0">
20 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent a odio malesuada, vehicula felis in, porttitor
21 + lectus. Donec venenatis nunc metus. Praesent ornare est diam, vitae finibus mauris faucibus quis. Duis magna orci,
22 + aliquam at arcu sit amet, sagittis auctor nisi. Aenean vestibulum sem eu orci ultricies, sed accumsan quam varius.
23 + Sed vulputate quis orci et ornare. Suspendisse in magna eu felis ullamcorper ultrices.
24 + </p>
25 + <blockquote>
26 + <p>
27 + Aliquam et nunc tincidunt, lobortis risus sit amet, tempor dui. Suspendisse potenti. Curabitur gravida feugiat
28 + lacinia. Sed blandit, magna ac dictum imperdiet, massa nisl vehicula lorem, vitae fermentum eros orci quis
29 + metus. Nam imperdiet enim et velit luctus porttitor. Maecenas in sollicitudin lorem. Curabitur felis ex, gravida
30 + ut mauris vitae, faucibus lobortis mauris. Fusce finibus tortor leo, id pharetra magna tincidunt eu. Duis quis
31 + nisl malesuada, blandit eros non, auctor velit. Donec accumsan euismod interdum. Pellentesque gravida porta
32 + ipsum, hendrerit posuere enim euismod vitae. Nulla luctus lobortis dui, eget rhoncus lacus malesuada id.
33 + </p>
34 + </blockquote>
35 + <p>
36 + Integer vestibulum rhoncus erat ac pulvinar. Quisque vitae lectus nec orci tincidunt laoreet. Praesent feugiat orci
37 + id dui placerat, ut mattis neque bibendum. Aenean cursus justo ac commodo rhoncus. Etiam vestibulum mollis enim, nec
38 + lobortis velit vulputate nec. Proin consequat sapien at nibh aliquet tincidunt. Cras condimentum urna nec justo
39 + elementum, vitae congue nulla ullamcorper. Sed ac leo lobortis, feugiat ex sed, gravida enim. Aliquam nec dolor
40 + vitae ligula iaculis imperdiet at eget ipsum. Nunc a tincidunt libero, nec maximus felis. Donec sed arcu ac sem
41 + imperdiet placerat. Integer fermentum quam eget ex mattis, at scelerisque ante tempor.
42 + </p>
43 + <p>
44 + In eu iaculis ex. Ut tempor dapibus augue, nec mattis ante imperdiet id. Praesent mattis iaculis justo nec
45 + fermentum. Nam auctor sagittis euismod. Sed sagittis erat in vulputate iaculis. Maecenas quis purus sit amet orci
46 + tempor condimentum a vel purus. Ut hendrerit nulla mi. Nunc condimentum sed libero ut fermentum. Donec varius metus
47 + urna, non pretium nulla blandit quis. Aenean vulputate neque eget risus tristique pellentesque. Sed bibendum dolor
48 + sit amet lacus vehicula vestibulum. Nullam vel neque pretium metus dapibus aliquam nec at sem.
49 + </p>
50 + </div>
51 + </el-tab-pane>
52 + <el-tab-pane label="Tab 2">
53 + <div style="max-width: 1100px; margin: 0 auto" class="pv-20 ph-8">
54 + <p class="mt-0">
55 + <img src="@/assets/images/photo1.jpg" class="demo-img" alt="demo image" />
56 + </p>
57 + <h1 style="display: block; clear: both">Tab 2 Lorem ipsum dolor sit amet</h1>
58 + <p class="mt-0">
59 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent a odio malesuada, vehicula felis in, porttitor
60 + lectus. Donec venenatis nunc metus. Praesent ornare est diam, vitae finibus mauris faucibus quis. Duis magna orci,
61 + aliquam at arcu sit amet, sagittis auctor nisi. Aenean vestibulum sem eu orci ultricies, sed accumsan quam varius.
62 + Sed vulputate quis orci et ornare. Suspendisse in magna eu felis ullamcorper ultrices.
63 + </p>
64 + <blockquote>
65 + <p>
66 + Aliquam et nunc tincidunt, lobortis risus sit amet, tempor dui. Suspendisse potenti. Curabitur gravida feugiat
67 + lacinia. Sed blandit, magna ac dictum imperdiet, massa nisl vehicula lorem, vitae fermentum eros orci quis
68 + metus. Nam imperdiet enim et velit luctus porttitor. Maecenas in sollicitudin lorem. Curabitur felis ex, gravida
69 + ut mauris vitae, faucibus lobortis mauris. Fusce finibus tortor leo, id pharetra magna tincidunt eu. Duis quis
70 + nisl malesuada, blandit eros non, auctor velit. Donec accumsan euismod interdum. Pellentesque gravida porta
71 + ipsum, hendrerit posuere enim euismod vitae. Nulla luctus lobortis dui, eget rhoncus lacus malesuada id.
72 + </p>
73 + </blockquote>
74 + <p>
75 + Integer vestibulum rhoncus erat ac pulvinar. Quisque vitae lectus nec orci tincidunt laoreet. Praesent feugiat orci
76 + id dui placerat, ut mattis neque bibendum. Aenean cursus justo ac commodo rhoncus. Etiam vestibulum mollis enim, nec
77 + lobortis velit vulputate nec. Proin consequat sapien at nibh aliquet tincidunt. Cras condimentum urna nec justo
78 + elementum, vitae congue nulla ullamcorper. Sed ac leo lobortis, feugiat ex sed, gravida enim. Aliquam nec dolor
79 + vitae ligula iaculis imperdiet at eget ipsum. Nunc a tincidunt libero, nec maximus felis. Donec sed arcu ac sem
80 + imperdiet placerat. Integer fermentum quam eget ex mattis, at scelerisque ante tempor.
81 + </p>
82 + <p>
83 + In eu iaculis ex. Ut tempor dapibus augue, nec mattis ante imperdiet id. Praesent mattis iaculis justo nec
84 + fermentum. Nam auctor sagittis euismod. Sed sagittis erat in vulputate iaculis. Maecenas quis purus sit amet orci
85 + tempor condimentum a vel purus. Ut hendrerit nulla mi. Nunc condimentum sed libero ut fermentum. Donec varius metus
86 + urna, non pretium nulla blandit quis. Aenean vulputate neque eget risus tristique pellentesque. Sed bibendum dolor
87 + sit amet lacus vehicula vestibulum. Nullam vel neque pretium metus dapibus aliquam nec at sem.
88 + </p>
89 + </div>
90 + </el-tab-pane>
91 + <el-tab-pane label="Tab 3">
92 + <div style="max-width: 1100px; margin: 0 auto" class="pv-20 ph-8">
93 + <p class="mt-0">
94 + <img src="@/assets/images/photo3.jpg" class="demo-img" alt="demo image" />
95 + </p>
96 + <h1 style="display: block; clear: both">Tab 3 Lorem ipsum dolor sit amet</h1>
97 + <p class="mt-0">
98 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent a odio malesuada, vehicula felis in, porttitor
99 + lectus. Donec venenatis nunc metus. Praesent ornare est diam, vitae finibus mauris faucibus quis. Duis magna orci,
100 + aliquam at arcu sit amet, sagittis auctor nisi. Aenean vestibulum sem eu orci ultricies, sed accumsan quam varius.
101 + Sed vulputate quis orci et ornare. Suspendisse in magna eu felis ullamcorper ultrices.
102 + </p>
103 + <blockquote>
104 + <p>
105 + Aliquam et nunc tincidunt, lobortis risus sit amet, tempor dui. Suspendisse potenti. Curabitur gravida feugiat
106 + lacinia. Sed blandit, magna ac dictum imperdiet, massa nisl vehicula lorem, vitae fermentum eros orci quis
107 + metus. Nam imperdiet enim et velit luctus porttitor. Maecenas in sollicitudin lorem. Curabitur felis ex, gravida
108 + ut mauris vitae, faucibus lobortis mauris. Fusce finibus tortor leo, id pharetra magna tincidunt eu. Duis quis
109 + nisl malesuada, blandit eros non, auctor velit. Donec accumsan euismod interdum. Pellentesque gravida porta
110 + ipsum, hendrerit posuere enim euismod vitae. Nulla luctus lobortis dui, eget rhoncus lacus malesuada id.
111 + </p>
112 + </blockquote>
113 + <p>
114 + Integer vestibulum rhoncus erat ac pulvinar. Quisque vitae lectus nec orci tincidunt laoreet. Praesent feugiat orci
115 + id dui placerat, ut mattis neque bibendum. Aenean cursus justo ac commodo rhoncus. Etiam vestibulum mollis enim, nec
116 + lobortis velit vulputate nec. Proin consequat sapien at nibh aliquet tincidunt. Cras condimentum urna nec justo
117 + elementum, vitae congue nulla ullamcorper. Sed ac leo lobortis, feugiat ex sed, gravida enim. Aliquam nec dolor
118 + vitae ligula iaculis imperdiet at eget ipsum. Nunc a tincidunt libero, nec maximus felis. Donec sed arcu ac sem
119 + imperdiet placerat. Integer fermentum quam eget ex mattis, at scelerisque ante tempor.
120 + </p>
121 + <p>
122 + In eu iaculis ex. Ut tempor dapibus augue, nec mattis ante imperdiet id. Praesent mattis iaculis justo nec
123 + fermentum. Nam auctor sagittis euismod. Sed sagittis erat in vulputate iaculis. Maecenas quis purus sit amet orci
124 + tempor condimentum a vel purus. Ut hendrerit nulla mi. Nunc condimentum sed libero ut fermentum. Donec varius metus
125 + urna, non pretium nulla blandit quis. Aenean vulputate neque eget risus tristique pellentesque. Sed bibendum dolor
126 + sit amet lacus vehicula vestibulum. Nullam vel neque pretium metus dapibus aliquam nec at sem.
127 + </p>
128 + </div>
129 + </el-tab-pane>
130 + </el-tabs>
131 + </el-scrollbar>
132 +</template>
133 +
134 +<script>
135 +import { defineComponent } from "@vue/runtime-core"
136 +
137 +export default defineComponent({
138 + name: "LayoutTabbed"
139 +})
140 +</script>
141 +
142 +<style lang="scss" scoped>
143 +@import "../../../assets/scss/_variables";
144 +
145 +.page-layout-tabbed {
146 + .page-header {
147 + margin-bottom: 20px;
148 + }
149 +
150 + .el-tabs {
151 + border-radius: 5px;
152 + overflow: hidden;
153 + color: #000;
154 + }
155 +
156 + .demo-img {
157 + width: 100%;
158 + margin-bottom: 10px;
159 + border-radius: 4px;
160 + max-width: 600px;
161 + float: left;
162 + margin-right: 35px;
163 + margin-bottom: 30px;
164 + }
165 +}
166 +</style>
src/views/ui/Layout/PageHeaders.vue new
+82
@@ -0,0 +1,82 @@
1 +<template>
2 + <el-scrollbar class="page-page-headers">
3 + <div class="page-header">
4 + <h1>Basic header</h1>
5 + <h4>sub header</h4>
6 + <el-breadcrumb separator="/">
7 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
8 + <el-breadcrumb-item>UI</el-breadcrumb-item>
9 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
10 + <el-breadcrumb-item>Basic header</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 + <div class="page-header card-base">
14 + <h1>Card header</h1>
15 + <h4>sub header</h4>
16 + <el-breadcrumb separator="/">
17 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
18 + <el-breadcrumb-item>UI</el-breadcrumb-item>
19 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
20 + <el-breadcrumb-item>Card header</el-breadcrumb-item>
21 + </el-breadcrumb>
22 + </div>
23 + <div class="page-header card-base card-shadow--small">
24 + <h1>Card shadow header</h1>
25 + <h4>sub header</h4>
26 + <el-breadcrumb separator="/">
27 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
28 + <el-breadcrumb-item>UI</el-breadcrumb-item>
29 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
30 + <el-breadcrumb-item>Card shadow header</el-breadcrumb-item>
31 + </el-breadcrumb>
32 + </div>
33 + <div class="page-header header-accent-gradient card-base card-shadow--small">
34 + <h1>Gradient header</h1>
35 + <h4>sub header</h4>
36 + <el-breadcrumb separator="/">
37 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
38 + <el-breadcrumb-item>UI</el-breadcrumb-item>
39 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
40 + <el-breadcrumb-item>Gradient header</el-breadcrumb-item>
41 + </el-breadcrumb>
42 + </div>
43 + <div class="page-header header-accent card-base card-shadow--small">
44 + <h1>Accent header</h1>
45 + <h4>sub header</h4>
46 + <el-breadcrumb separator="/">
47 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
48 + <el-breadcrumb-item>UI</el-breadcrumb-item>
49 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
50 + <el-breadcrumb-item>Accent header</el-breadcrumb-item>
51 + </el-breadcrumb>
52 + </div>
53 + <div class="page-header header-primary card-base card-shadow--small">
54 + <h1>Primary header</h1>
55 + <h4>sub header</h4>
56 + <el-breadcrumb separator="/">
57 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
58 + <el-breadcrumb-item>UI</el-breadcrumb-item>
59 + <el-breadcrumb-item>Layout</el-breadcrumb-item>
60 + <el-breadcrumb-item>Primary header</el-breadcrumb-item>
61 + </el-breadcrumb>
62 + </div>
63 + </el-scrollbar>
64 +</template>
65 +
66 +<script>
67 +import { defineComponent } from "@vue/runtime-core"
68 +
69 +export default defineComponent({
70 + name: "PageHeaders"
71 +})
72 +</script>
73 +
74 +<style lang="scss" scoped>
75 +@import "../../../assets/scss/_variables";
76 +
77 +.page-page-headers {
78 + .page-header {
79 + margin-bottom: 50px;
80 + }
81 +}
82 +</style>
src/views/ui/Maps/Datamaps.vue new
+71
@@ -0,0 +1,71 @@
1 +<template>
2 + <div class="page-datamaps scrollable">
3 + <div class="page-header">
4 + <h1>Datamaps</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Maps</el-breadcrumb-item>
9 + <el-breadcrumb-item>Datamaps</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 + <div class="card-base card-shadow--medium">
13 + <div id="container" style="position: relative; width: 100%; max-width: 800px; height: 500px; margin: 0 auto"></div>
14 + </div>
15 +
16 + <h4>
17 + <a href="https://github.com/markmarkoh/datamaps" target="_blank"><i class="mdi mdi-link-variant"></i> reference</a>
18 + </h4>
19 + </div>
20 +</template>
21 +
22 +<script>
23 +import Datamap from "datamaps"
24 +
25 +import { defineComponent } from "@vue/runtime-core"
26 +
27 +export default defineComponent({
28 + name: "DatamapsPage",
29 + data() {
30 + return {}
31 + },
32 + mounted() {
33 + const basic_choropleth = new Datamap({
34 + element: document.getElementById("container"),
35 + projection: "mercator",
36 + fills: {
37 + defaultFill: "#ABDDA4",
38 + authorHasTraveledTo: "#fa0fa0"
39 + },
40 + data: {
41 + USA: { fillKey: "authorHasTraveledTo" },
42 + JPN: { fillKey: "authorHasTraveledTo" },
43 + ITA: { fillKey: "authorHasTraveledTo" },
44 + CRI: { fillKey: "authorHasTraveledTo" },
45 + KOR: { fillKey: "authorHasTraveledTo" },
46 + DEU: { fillKey: "authorHasTraveledTo" }
47 + }
48 + })
49 +
50 + const colors = d3.scale.category10()
51 +
52 + setInterval(() => {
53 + basic_choropleth.updateChoropleth({
54 + USA: colors(Math.random() * 10),
55 + RUS: colors(Math.random() * 100),
56 + AUS: { fillKey: "authorHasTraveledTo" },
57 + BRA: colors(Math.random() * 50),
58 + CAN: colors(Math.random() * 50),
59 + ZAF: colors(Math.random() * 50),
60 + IND: colors(Math.random() * 50)
61 + })
62 + }, 2000)
63 + }
64 +})
65 +</script>
66 +
67 +<style lang="scss">
68 +.datamaps-hoverover {
69 + color: black;
70 +}
71 +</style>
src/views/ui/Maps/Leaflet.vue new
+70
@@ -0,0 +1,70 @@
1 +<template>
2 + <div class="page-leaflet scrollable">
3 + <div class="page-header">
4 + <h1>Leaflet</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Maps</el-breadcrumb-item>
9 + <el-breadcrumb-item>Leaflet</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div class="card-base card-shadow--medium map-box">
14 + <l-map :zoom="zoom" :center="center" :options="{ dragging: dragging }">
15 + <l-tile-layer :url="url" :attribution="attribution"></l-tile-layer>
16 + <l-marker :lat-lng="marker"></l-marker>
17 + </l-map>
18 + </div>
19 +
20 + <h4>
21 + <a href="https://github.com/KoRiGaN/Vue2Leaflet" target="_blank"> <i class="mdi mdi-link-variant"></i> reference </a>
22 + </h4>
23 + </div>
24 +</template>
25 +
26 +<script>
27 +import { defineComponent } from "@vue/runtime-core"
28 +import "leaflet/dist/leaflet.css"
29 +import { LMap, LTileLayer, LMarker } from "@vue-leaflet/vue-leaflet"
30 +
31 +export default defineComponent({
32 + name: "LeafletPage",
33 + data() {
34 + return {
35 + zoom: 13,
36 + center: [47.41322, -1.219482],
37 + url: "http://{s}.tile.osm.org/{z}/{x}/{y}.png",
38 + attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
39 + marker: [47.41322, -1.219482],
40 + innerWidth: 0,
41 + dragging: true
42 + }
43 + },
44 + methods: {
45 + setDragging() {
46 + this.innerWidth = window.innerWidth
47 + if (window.innerWidth <= 768) this.dragging = false
48 + else this.dragging = true
49 + }
50 + },
51 + created() {
52 + this.setDragging()
53 + window.addEventListener("resize", this.setDragging)
54 + },
55 + beforeUnmount() {
56 + window.removeEventListener("resize", this.setDragging)
57 + },
58 + components: { LMap, LTileLayer, LMarker }
59 +})
60 +</script>
61 +
62 +<style lang="scss" scoped>
63 +.page-leaflet {
64 + padding: 0 20px;
65 + .map-box {
66 + height: 500px;
67 + width: 100%;
68 + }
69 +}
70 +</style>
src/views/ui/Maps/Mapbox.vue new
+83
@@ -0,0 +1,83 @@
1 +<template>
2 + <div class="page-mapbox scrollable ph-20">
3 + <div class="page-header">
4 + <h1>Mapbox</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Maps</el-breadcrumb-item>
9 + <el-breadcrumb-item>Mapbox</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 + <div class="card-base card-shadow--medium" v-loading="loading">
13 + <div id="map" v-if="!loading"></div>
14 + </div>
15 +
16 + <h4>
17 + <a href="https://www.mapbox.com/mapbox-gl-js/api" target="_blank"> <i class="mdi mdi-link-variant"></i> reference </a>
18 + </h4>
19 + </div>
20 +</template>
21 +
22 +<script>
23 +import mapboxgl from "mapbox-gl"
24 +import "mapbox-gl/dist/mapbox-gl.css"
25 +import { defineComponent } from "@vue/runtime-core"
26 +
27 +export default defineComponent({
28 + name: "MapboxPage",
29 + data() {
30 + return {
31 + innerWidth: 0,
32 + dragging: true,
33 + loading: false,
34 + map: null
35 + }
36 + },
37 + watch: {
38 + dragging(val) {
39 + this.loading = true
40 + setTimeout(() => {
41 + this.loading = false
42 + setTimeout(() => {
43 + this.initMap()
44 + }, 500)
45 + }, 500)
46 + }
47 + },
48 + methods: {
49 + initMap() {
50 + if (!this.loading) {
51 + mapboxgl.accessToken = "pk.eyJ1IjoibGlua28iLCJhIjoiY2pmZWFoMG1iMHdzeDMzcGtrY3h4cXdjOSJ9.Ad6zNqdn5Ju_sx6a2RUXRA"
52 + this.map = new mapboxgl.Map({
53 + container: "map",
54 + style: "mapbox://styles/mapbox/streets-v9",
55 + dragPan: this.dragging
56 + })
57 + }
58 + },
59 + setDragging() {
60 + this.innerWidth = window.innerWidth
61 + if (window.innerWidth <= 768) this.dragging = false
62 + else this.dragging = true
63 + }
64 + },
65 + created() {
66 + this.setDragging()
67 + window.addEventListener("resize", this.setDragging)
68 + },
69 + beforeUnmount() {
70 + window.removeEventListener("resize", this.setDragging)
71 + },
72 + mounted() {
73 + this.initMap()
74 + }
75 +})
76 +</script>
77 +
78 +<style lang="scss" scoped>
79 +#map {
80 + width: 100%;
81 + height: 500px;
82 +}
83 +</style>
src/views/ui/Maps/Maps.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Maps"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/ui/MultiLanguage.vue new
+108
@@ -0,0 +1,108 @@
1 +<template>
2 + <div class="page-multi-language scrollable ph-20">
3 + <div class="page-header">
4 + <h1>Multi language</h1>
5 + <h4>
6 + <a href="http://kazupon.github.io/vue-i18n/en/" target="_blank"
7 + ><i class="mdi mdi-book-open-page-variant"></i> read the complete documentation
8 + </a>
9 + </h4>
10 + <el-breadcrumb separator="/">
11 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
12 + <el-breadcrumb-item>UI</el-breadcrumb-item>
13 + <el-breadcrumb-item>Multi language</el-breadcrumb-item>
14 + </el-breadcrumb>
15 + </div>
16 +
17 + <div class="card-base card-shadow--small ph-40 pt-20 pb-30">
18 + <p>
19 + Multi language support is provided by the
20 + <a href="https://github.com/kazupon/vue-i18n" target="_blank">vue-i18n</a> plugin. For more information and to find out
21 + about all possible implementations, I invite you to read the
22 + <a href="http://kazupon.github.io/vue-i18n/en/" target="_blank">documentation</a>.
23 + </p>
24 + <p>
25 + In the theme
26 + <a href="https://pragmatic-docs.vercel.app/#/multilanguage" target="_blank">documentation</a> you can find out how it was
27 + implemented.
28 + </p>
29 + <hr class="styled mb-20" />
30 + <div class="flex align-center">
31 + <el-dropdown trigger="click" @command="onCommandLang">
32 + <span class="el-dropdown-link">
33 + <i class="flag-icon mr-5" :class="{ ['flag-icon-' + langIcon]: true }"></i>
34 + {{ $t("languages." + langText) }}
35 + </span>
36 + <template #dropdown>
37 + <el-dropdown-menu>
38 + <el-dropdown-item command="us-English"
39 + ><i class="flag-icon flag-icon-us mr-15"></i>{{ $t("languages.English") }}</el-dropdown-item
40 + >
41 + <el-dropdown-item command="it-Italian"
42 + ><i class="flag-icon flag-icon-it mr-15"></i>{{ $t("languages.Italian") }}</el-dropdown-item
43 + >
44 + <el-dropdown-item command="fr-French"
45 + ><i class="flag-icon flag-icon-fr mr-15"></i>{{ $t("languages.French") }}</el-dropdown-item
46 + >
47 + <el-dropdown-item command="de-German"
48 + ><i class="flag-icon flag-icon-de mr-15"></i>{{ $t("languages.German") }}</el-dropdown-item
49 + >
50 + <el-dropdown-item command="es-Spanish"
51 + ><i class="flag-icon flag-icon-es mr-15"></i>{{ $t("languages.Spanish") }}</el-dropdown-item
52 + >
53 + <el-dropdown-item command="cn-Chinese"
54 + ><i class="flag-icon flag-icon-cn mr-15"></i>{{ $t("languages.Chinese") }}</el-dropdown-item
55 + >
56 + <el-dropdown-item command="jp-Japanese"
57 + ><i class="flag-icon flag-icon-jp mr-15"></i>{{ $t("languages.Japanese") }}</el-dropdown-item
58 + >
59 + </el-dropdown-menu>
60 + </template>
61 + </el-dropdown>
62 + <strong class="ml-20 message">{{ $t("message.hello") }}</strong>
63 + </div>
64 + </div>
65 + </div>
66 +</template>
67 +
68 +<script>
69 +import "flag-icon-css/css/flag-icons.min.css"
70 +import { defineComponent } from "@vue/runtime-core"
71 +
72 +export default defineComponent({
73 + name: "MultiLanguage",
74 + data() {
75 + return {
76 + langIcon: "us",
77 + langText: "English"
78 + }
79 + },
80 + methods: {
81 + onCommandLang(lang) {
82 + if (lang && lang.indexOf("-") !== -1) {
83 + this.langIcon = lang.split("-")[0]
84 + this.langText = lang.split("-")[1]
85 + this.$i18n.locale = this.langIcon
86 + }
87 + }
88 + }
89 +})
90 +</script>
91 +
92 +<style lang="scss" scoped>
93 +@import "../../assets/scss/_variables";
94 +
95 +.el-dropdown-link {
96 + cursor: pointer;
97 + color: $text-color-primary;
98 +
99 + .flag-icon {
100 + background-color: #eee;
101 + border: 1px solid #eee;
102 + }
103 +
104 + &:hover {
105 + border-bottom: 1px solid $text-color-primary;
106 + }
107 +}
108 +</style>
src/views/ui/Tables/Styled.vue new
+290
@@ -0,0 +1,290 @@
1 +<template>
2 + <div class="page-table column scrollable only-y" :class="{ flex: !isMobile, overflow: isMobile }">
3 + <div class="toolbar-box flex align-center">
4 + <div class="box grow">
5 + <el-input placeholder="Search..." v-model="search" clearable></el-input>
6 + </div>
7 + </div>
8 +
9 + <resize-observer @notify="handleResize" />
10 +
11 + <div class="table-box card-base card-shadow--medium box grow" id="table-wrapper" v-loading="!ready">
12 + <el-table :data="listInPage" style="width: 100%" :height="height" v-if="ready" @selection-change="handleSelectionChange">
13 + <el-table-column type="selection" width="34" fixed></el-table-column>
14 + <el-table-column label="Name" min-width="250" prop="full_name" :fixed="!isMobile">
15 + <template #default="scope">
16 + <span class="sel-string" v-html="$options.filters.selected(scope.row.full_name, search)"></span>
17 + </template>
18 + </el-table-column>
19 + <el-table-column label="Birthday" min-width="110" prop="birth_day">
20 + <template #default="scope">
21 + <span class="sel-string" v-html="$options.filters.selected(scope.row.birth_day, search)"></span>
22 + </template>
23 + </el-table-column>
24 + <el-table-column label="Email" prop="email" min-width="300">
25 + <template #default="scope">
26 + <span class="sel-string" v-html="$options.filters.selected(scope.row.email, search)"></span>
27 + </template>
28 + </el-table-column>
29 + <el-table-column label="Gender" prop="gender" min-width="250">
30 + <template #default="scope">
31 + <span class="sel-string" v-html="$options.filters.selected(scope.row.gender, search)"></span>
32 + </template>
33 + </el-table-column>
34 + <el-table-column label="Job title" prop="job_title" min-width="200">
35 + <template #default="scope">
36 + {{ scope.row.job_title }}
37 + </template>
38 + </el-table-column>
39 + <el-table-column label="Company" prop="company" min-width="100"></el-table-column>
40 + <el-table-column label="City" prop="city" min-width="200"></el-table-column>
41 + <el-table-column label="Country" prop="country" min-width="150"></el-table-column>
42 + <el-table-column label="Address" prop="street_address" min-width="200"></el-table-column>
43 + <el-table-column label="Phone" prop="phone" min-width="180"></el-table-column>
44 + <el-table-column label="Username" prop="username" min-width="100"></el-table-column>
45 + </el-table>
46 +
47 + <el-pagination
48 + v-if="ready"
49 + :small="pagination.small"
50 + v-model:current-page="pagination.page"
51 + :page-sizes="pagination.sizes"
52 + v-model:page-size="pagination.size"
53 + :layout="pagination.layout"
54 + :total="total"
55 + ></el-pagination>
56 + </div>
57 + </div>
58 +</template>
59 +
60 +<script>
61 +import users from "@/assets/data/USERS_MOCK_DATA.json"
62 +import _ from "lodash"
63 +import dayjs from "dayjs"
64 +import ResizeObserver from "@/components/vue-resize/ResizeObserver.vue"
65 +
66 +import { defineComponent } from "@vue/runtime-core"
67 +
68 +export default defineComponent({
69 + name: "StyledTablePage",
70 + data() {
71 + return {
72 + isMobile: false,
73 + ready: false,
74 + width: 0,
75 + height: "auto",
76 + loading: false,
77 + search: "",
78 + pagination: {
79 + page: 1,
80 + size: 20,
81 + sizes: [10, 15, 20, 30, 50, 100],
82 + layout: "total, ->, prev, pager, next, jumper, sizes",
83 + small: false
84 + },
85 + list: users,
86 + editMode: false,
87 + itemsChecked: [],
88 + dialogUserVisible: false,
89 + currentId: 0,
90 + dayjs
91 + }
92 + },
93 + computed: {
94 + listFiltered() {
95 + return this.list.filter(obj => {
96 + let ctrl = false
97 + for (let k in obj) {
98 + if (obj[k] && obj[k].toString().toLowerCase().indexOf(this.search.toLowerCase()) !== -1) ctrl = true
99 + }
100 + return ctrl
101 + })
102 + },
103 + listSortered() {
104 + let prop = this.sortingProp
105 + let order = this.sortingOrder
106 + return [].concat(
107 + this.listFiltered.sort((item1, item2) => {
108 + let val1 = ""
109 + let val2 = ""
110 +
111 + val1 = item1[prop]
112 + val2 = item2[prop]
113 + if (order === "descending") {
114 + return val2 < val1 ? -1 : 1
115 + }
116 + return val1 < val2 ? -1 : 1
117 + })
118 + )
119 + },
120 + listInPage() {
121 + let from = (this.currentPage - 1) * this.itemPerPage
122 + let to = from + this.itemPerPage * 1
123 + //return this.listSortered.slice(from, to)
124 + return this.listFiltered.slice(from, to)
125 + },
126 + total() {
127 + return this.listFiltered.length
128 + },
129 + currentPage: {
130 + get() {
131 + return this.pagination.page
132 + },
133 + set(val) {
134 + this.pagination.page = val
135 + }
136 + },
137 + itemPerPage() {
138 + return this.pagination.size
139 + },
140 + selectedItems() {
141 + return this.itemsChecked.length || 0
142 + }
143 + },
144 + watch: {
145 + itemPerPage(val) {
146 + this.ready = false
147 + this.currentPage = 1
148 +
149 + setTimeout(() => {
150 + this.ready = true
151 + }, 500)
152 + },
153 + search(val) {
154 + this.currentPage = 1
155 + }
156 + },
157 + methods: {
158 + calcDims() {
159 + const tableWrapper = document.getElementById("table-wrapper")
160 + if (tableWrapper) this.width = tableWrapper.clientWidth
161 +
162 + if (!this.isMobile && tableWrapper) {
163 + this.height = tableWrapper.clientHeight - 44
164 + }
165 +
166 + if (this.width < 480) {
167 + this.pagination.small = true
168 + this.pagination.layout = "prev, pager, next"
169 + } else if (this.width >= 480 && this.width < 700) {
170 + this.pagination.small = false
171 + this.pagination.layout = "prev, pager, next, ->, sizes"
172 + } else {
173 + this.pagination.small = false
174 + this.pagination.layout = "total, ->, prev, pager, next, jumper, sizes"
175 + }
176 +
177 + this.ready = true
178 + },
179 + handleResize: _.throttle(function (e) {
180 + this.ready = false
181 + this.width = 0
182 + setTimeout(this.calcDims, 1000)
183 + }, 500),
184 + handleSelectionChange(val) {
185 + this.itemsChecked = val
186 + },
187 + init() {
188 + if (window.innerWidth <= 768) this.isMobile = true
189 + }
190 + },
191 + filters: {
192 + selected: function (value, sel) {
193 + if (!value) return ""
194 + if (!sel) return value
195 +
196 + value = value.toString()
197 + sel = sel.toString()
198 +
199 + const startIndex = value.toLowerCase().indexOf(sel.toLowerCase())
200 + if (startIndex !== -1) {
201 + const endLength = sel.length
202 + const matchingString = value.substr(startIndex, endLength)
203 + return value.replace(matchingString, `<span class="sel">${matchingString}</span>`)
204 + }
205 + //return value.toString().replace(new RegExp(sel,"gim"), `<span class="sel">${sel}</span>`)
206 + return value
207 + }
208 + },
209 + created() {
210 + this.init()
211 + },
212 + mounted() {
213 + //ie fix
214 + if (!window.Number.parseInt) window.Number.parseInt = parseInt
215 +
216 + this.calcDims()
217 + },
218 + components: { ResizeObserver }
219 +})
220 +</script>
221 +
222 +<style lang="scss" scoped>
223 +@import "../../../assets/scss/_variables";
224 +
225 +.page-table {
226 + &.overflow {
227 + overflow: auto;
228 + }
229 +
230 + .toolbar-box {
231 + &.hidden {
232 + visibility: hidden;
233 + }
234 + }
235 +
236 + .table-box {
237 + overflow: hidden;
238 +
239 + &.hidden {
240 + visibility: hidden;
241 + }
242 + }
243 +}
244 +</style>
245 +
246 +<style lang="scss">
247 +@import "../../../assets/scss/_variables";
248 +
249 +.page-table {
250 + padding: 20px;
251 +
252 + .toolbar-box {
253 + margin-bottom: 10px;
254 + margin-top: 0;
255 + }
256 +
257 + .clickable {
258 + cursor: pointer;
259 + text-decoration: underline;
260 + font-weight: bold;
261 + }
262 +
263 + .sel-string {
264 + .sel {
265 + background: transparentize($text-color-primary, 0.8);
266 + border-radius: 5px;
267 + //text-transform: uppercase;
268 + }
269 + }
270 +}
271 +
272 +@media (max-width: 768px) {
273 + .page-table {
274 + .toolbar-box {
275 + display: block;
276 + overflow: hidden;
277 + font-size: 80%;
278 + padding-bottom: 10px;
279 +
280 + & > * {
281 + display: inline-block;
282 + min-width: 120px;
283 + height: 22px;
284 + //background: rgba(0, 0, 0, 0.04);
285 + margin-bottom: 16px;
286 + }
287 + }
288 + }
289 +}
290 +</style>
src/views/ui/Tables/Table.vue new
+232
@@ -0,0 +1,232 @@
1 +<template>
2 + <div class="page-table scrollable only-y" id="affix-container">
3 + <div class="page-header">
4 + <h1>Table</h1>
5 + <h4>simple table</h4>
6 + <el-breadcrumb separator="/">
7 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
8 + <el-breadcrumb-item>Components</el-breadcrumb-item>
9 + <el-breadcrumb-item>Tables</el-breadcrumb-item>
10 + <el-breadcrumb-item>Table</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 +
14 + <div class="table-box card-base card-shadow--medium scrollable only-x">
15 + <table class="styled striped">
16 + <thead>
17 + <tr>
18 + <th>ID</th>
19 + <th>First name</th>
20 + <th>Last name</th>
21 + <th>Email</th>
22 + <th>Gender</th>
23 + <th>IP address</th>
24 + </tr>
25 + </thead>
26 + <tbody>
27 + <tr v-for="item in list" :key="item.id">
28 + <td>{{ item.id }}</td>
29 + <td>{{ item.first_name }}</td>
30 + <td>{{ item.last_name }}</td>
31 + <td>{{ item.email }}</td>
32 + <td>{{ item.gender }}</td>
33 + <td>{{ item.ip_address }}</td>
34 + </tr>
35 + </tbody>
36 + </table>
37 + </div>
38 + </div>
39 +</template>
40 +
41 +<script>
42 +import Affix from "@/components/Affix.vue"
43 +
44 +import { defineComponent } from "@vue/runtime-core"
45 +
46 +export default defineComponent({
47 + name: "Table",
48 + data() {
49 + return {
50 + affixEnabled: true,
51 + list: [
52 + {
53 + id: 1,
54 + first_name: "Fidela",
55 + last_name: "MacLaverty",
56 + email: "fmaclaverty0@scribd.com",
57 + gender: "Female",
58 + ip_address: "165.9.197.163"
59 + },
60 + {
61 + id: 2,
62 + first_name: "Garrard",
63 + last_name: "Inge",
64 + email: "ginge1@51.la",
65 + gender: "Male",
66 + ip_address: "138.87.225.97"
67 + },
68 + {
69 + id: 3,
70 + first_name: "Clayborn",
71 + last_name: "Blencoe",
72 + email: "cblencoe2@cbc.ca",
73 + gender: "Male",
74 + ip_address: "237.146.154.222"
75 + },
76 + {
77 + id: 4,
78 + first_name: "Reinaldos",
79 + last_name: "Briiginshaw",
80 + email: "rbriiginshaw3@mashable.com",
81 + gender: "Male",
82 + ip_address: "35.148.222.21"
83 + },
84 + {
85 + id: 5,
86 + first_name: "Abigael",
87 + last_name: "Richmond",
88 + email: "arichmond4@shinystat.com",
89 + gender: "Female",
90 + ip_address: "135.221.192.85"
91 + },
92 + {
93 + id: 6,
94 + first_name: "Elna",
95 + last_name: "Deboick",
96 + email: "edeboick5@4shared.com",
97 + gender: "Female",
98 + ip_address: "53.209.210.199"
99 + },
100 + {
101 + id: 7,
102 + first_name: "Lanna",
103 + last_name: "Prentice",
104 + email: "lprentice6@oracle.com",
105 + gender: "Female",
106 + ip_address: "198.34.29.215"
107 + },
108 + {
109 + id: 8,
110 + first_name: "Sheffie",
111 + last_name: "Fellgett",
112 + email: "sfellgett7@ow.ly",
113 + gender: "Male",
114 + ip_address: "219.29.191.217"
115 + },
116 + {
117 + id: 9,
118 + first_name: "Mamie",
119 + last_name: "Calkin",
120 + email: "mcalkin8@oakley.com",
121 + gender: "Female",
122 + ip_address: "69.0.235.44"
123 + },
124 + {
125 + id: 10,
126 + first_name: "Saudra",
127 + last_name: "Dunniom",
128 + email: "sdunniom9@ameblo.jp",
129 + gender: "Female",
130 + ip_address: "182.157.218.101"
131 + },
132 + {
133 + id: 11,
134 + first_name: "Sile",
135 + last_name: "Rudeforth",
136 + email: "srudefortha@jimdo.com",
137 + gender: "Female",
138 + ip_address: "26.176.141.77"
139 + },
140 + {
141 + id: 12,
142 + first_name: "Nichole",
143 + last_name: "Verrell",
144 + email: "nverrellb@fotki.com",
145 + gender: "Male",
146 + ip_address: "196.88.10.200"
147 + },
148 + {
149 + id: 13,
150 + first_name: "Portie",
151 + last_name: "Sporle",
152 + email: "psporlec@jimdo.com",
153 + gender: "Male",
154 + ip_address: "1.157.38.106"
155 + },
156 + {
157 + id: 14,
158 + first_name: "Cosme",
159 + last_name: "Pauling",
160 + email: "cpaulingd@nytimes.com",
161 + gender: "Male",
162 + ip_address: "209.203.192.28"
163 + },
164 + {
165 + id: 15,
166 + first_name: "Elisha",
167 + last_name: "Tipperton",
168 + email: "etippertone@discovery.com",
169 + gender: "Male",
170 + ip_address: "219.8.155.219"
171 + },
172 + {
173 + id: 16,
174 + first_name: "Skyler",
175 + last_name: "Schwandermann",
176 + email: "sschwandermannf@devhub.com",
177 + gender: "Male",
178 + ip_address: "150.227.132.171"
179 + },
180 + {
181 + id: 17,
182 + first_name: "Anallise",
183 + last_name: "Tuftin",
184 + email: "atufting@ustream.tv",
185 + gender: "Female",
186 + ip_address: "98.234.28.78"
187 + },
188 + {
189 + id: 18,
190 + first_name: "Janka",
191 + last_name: "Hissie",
192 + email: "jhissieh@etsy.com",
193 + gender: "Female",
194 + ip_address: "125.255.226.56"
195 + },
196 + {
197 + id: 19,
198 + first_name: "Tonie",
199 + last_name: "Swede",
200 + email: "tswedei@constantcontact.com",
201 + gender: "Female",
202 + ip_address: "111.113.252.139"
203 + },
204 + {
205 + id: 20,
206 + first_name: "Marve",
207 + last_name: "Egle",
208 + email: "meglej@scribd.com",
209 + gender: "Male",
210 + ip_address: "202.240.145.168"
211 + }
212 + ]
213 + }
214 + },
215 + components: {
216 + Affix
217 + }
218 +})
219 +</script>
220 +
221 +<style lang="scss" scoped>
222 +@import "../../../assets/scss/_variables";
223 +
224 +.page-table {
225 + padding-left: 20px;
226 + padding-right: 15px;
227 + padding-bottom: 20px;
228 +}
229 +.table-box {
230 + overflow: auto;
231 +}
232 +</style>
src/views/ui/Tables/TableElement.vue new
+95
@@ -0,0 +1,95 @@
1 +<template>
2 + <div class="page-table scrollable">
3 + <div class="page-header">
4 + <h1>Element UI Table</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Tables</el-breadcrumb-item>
9 + <el-breadcrumb-item>Element UI Table</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div class="table-box card-base card-shadow--medium">
14 + <el-table :data="tableData" style="width: 100%">
15 + <el-table-column
16 + prop="date"
17 + label="Date"
18 + sortable
19 + width="180"
20 + :filters="[
21 + { text: '2016-05-01', value: '2016-05-01' },
22 + { text: '2016-05-02', value: '2016-05-02' },
23 + { text: '2016-05-03', value: '2016-05-03' },
24 + { text: '2016-05-04', value: '2016-05-04' }
25 + ]"
26 + :filter-method="filterHandler"
27 + ></el-table-column>
28 + <el-table-column prop="name" label="Name" width="180"></el-table-column>
29 + <el-table-column prop="address" label="Address" :formatter="formatter"></el-table-column>
30 + <el-table-column
31 + prop="tag"
32 + label="Tag"
33 + width="100"
34 + :filters="[
35 + { text: 'Home', value: 'Home' },
36 + { text: 'Office', value: 'Office' }
37 + ]"
38 + :filter-method="filterTag"
39 + filter-placement="bottom-end"
40 + >
41 + <template slot-scope="scope">
42 + <el-tag :type="scope.row.tag === 'Home' ? 'primary' : 'success'" close-transition>{{ scope.row.tag }}</el-tag>
43 + </template>
44 + </el-table-column>
45 + </el-table>
46 + </div>
47 +
48 + <h4>
49 + <a href="http://element.eleme.io/#/en-US/component/table" target="_blank"><i class="mdi mdi-link-variant"></i> reference</a>
50 + </h4>
51 + </div>
52 +</template>
53 +
54 +<script>
55 +import { defineComponent } from "@vue/runtime-core"
56 +
57 +export default defineComponent({
58 + name: "TableElement",
59 + data() {
60 + return {
61 + tableData: [
62 + { date: "2016-05-03", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Home" },
63 + { date: "2016-05-02", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Office" },
64 + { date: "2016-05-04", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Home" },
65 + { date: "2016-05-01", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Office" },
66 + { date: "2016-05-01", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Office" },
67 + { date: "2016-05-01", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Office" },
68 + { date: "2016-05-01", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Office" },
69 + { date: "2016-05-01", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Office" },
70 + { date: "2016-05-01", name: "Tom", address: "No. 189, Grove St, Los Angeles", tag: "Office" }
71 + ]
72 + }
73 + },
74 + methods: {
75 + formatter(row, column) {
76 + return row.address
77 + },
78 + filterTag(value, row) {
79 + return row.tag === value
80 + },
81 + filterHandler(value, row, column) {
82 + const property = column["property"]
83 + return row[property] === value
84 + }
85 + }
86 +})
87 +</script>
88 +
89 +<style lang="scss" scoped>
90 +@import "../../../assets/scss/_variables";
91 +
92 +.table-box {
93 + overflow: auto;
94 +}
95 +</style>
src/views/ui/Tables/Tables.vue new
+13
@@ -0,0 +1,13 @@
1 +<template>
2 + <router-view />
3 +</template>
4 +
5 +<script>
6 +import { defineComponent } from "@vue/runtime-core"
7 +
8 +export default defineComponent({
9 + name: "Tables"
10 +})
11 +</script>
12 +
13 +<style lang="scss" scoped></style>
src/views/ui/Tables/TuiGrid.vue new
+264
@@ -0,0 +1,264 @@
1 +<template>
2 + <div class="page-tui-grid flex column">
3 + <div class="page-header card-base header-accent">
4 + <h1>TUI Grid</h1>
5 + <h4>
6 + <a href="http://ui.toast.com/tui-grid/" target="_blank" class="white-text" style="text-decoration-color: white"
7 + >TOAST UI Grid</a
8 + >
9 + is a powerful widget which allows you to visualize and edit data via its table representation
10 + <br />
11 + Vue 3 compatibility provided by
12 + <a
13 + href="https://www.npmjs.com/package/vue3-tui-grid"
14 + target="_blank"
15 + class="white-text"
16 + style="text-decoration-color: white"
17 + >vue3-tui-grid</a
18 + >
19 + </h4>
20 + <el-breadcrumb separator="/">
21 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
22 + <el-breadcrumb-item>Components</el-breadcrumb-item>
23 + <el-breadcrumb-item>Tables</el-breadcrumb-item>
24 + <el-breadcrumb-item>TUI Grid</el-breadcrumb-item>
25 + </el-breadcrumb>
26 + </div>
27 +
28 + <resize-observer @notify="handleResize" />
29 +
30 + <div id="table-box" class="bg-white card-shadow--small b-rad-4 box grow" v-loading="resizing">
31 + <grid
32 + id="grid"
33 + :data="gridProps.data"
34 + :columns="gridProps.columns"
35 + :bodyHeight="gridProps.bodyHeight"
36 + :frozenCount="gridProps.frozenCount"
37 + :virtualScrolling="gridProps.virtualScrolling"
38 + :minRowHeight="gridProps.minRowHeight"
39 + :pagination="gridProps.pagination"
40 + :rowHeaders="gridProps.rowHeaders"
41 + :header="gridProps.header"
42 + :columnOptions="gridProps.columnOptions"
43 + :summary="gridProps.summary"
44 + v-if="!resizing"
45 + />
46 + </div>
47 + </div>
48 +</template>
49 +
50 +<script>
51 +import "tui-grid/dist/tui-grid.css"
52 +import { TuiGrid as Grid } from "vue3-tui-grid"
53 +import ResizeObserver from "@/components/vue-resize/ResizeObserver.vue"
54 +import _ from "lodash"
55 +import Chance from "chance"
56 +const chance = new Chance()
57 +
58 +export default {
59 + name: "TuiGrid",
60 + data() {
61 + const gridData = []
62 +
63 + _.times(500, number => {
64 + gridData.push({
65 + name: chance.name(),
66 + photo: "/static/images/users/user-" + chance.integer({ min: 0, max: 30 }) + ".jpg",
67 + age: chance.age(),
68 + gender: chance.gender(),
69 + city: chance.city(),
70 + email: chance.email(),
71 + guid: chance.guid(),
72 + phone: chance.phone(),
73 + company: chance.company(),
74 + profession: chance.profession(),
75 + id: number
76 + })
77 + })
78 +
79 + return {
80 + grid: null,
81 + gridData,
82 + resizing: true,
83 + height: 300,
84 + gridProps: {
85 + bodyHeight: null,
86 + frozenCount: window.innerWidth <= 768 ? 0 : 2,
87 + virtualScrolling: true,
88 + minRowHeight: 60,
89 + pagination: false,
90 + rowHeaders: ["checkbox", "rowNum"],
91 + header: {},
92 + columnOptions: {
93 + //minWidth: 100,
94 + frozenCount: window.innerWidth <= 768 ? 0 : 2
95 + },
96 + columns: [
97 + {
98 + header: "",
99 + name: "photo",
100 + align: "center",
101 + width: 40,
102 + formatter: function (data) {
103 + var url = data.value.toString()
104 + return '<img src="' + url + '" width="40" height="40" />'
105 + }
106 + },
107 + {
108 + header: "Name",
109 + name: "name",
110 + minWidth: 200,
111 + sortable: true,
112 + editOptions: {
113 + type: "text",
114 + useViewMode: true
115 + }
116 + },
117 + {
118 + header: "Age",
119 + name: "age",
120 + sortable: true,
121 + width: 180
122 + },
123 + {
124 + header: "Gender",
125 + name: "gender",
126 + minWidth: 100,
127 + sortable: true,
128 + editOptions: {
129 + type: "select",
130 + listItems: [
131 + { text: "Female", value: "Female" },
132 + { text: "Male", value: "Male" }
133 + ],
134 + useViewMode: true
135 + }
136 + },
137 + {
138 + header: "City",
139 + name: "city",
140 + sortable: true,
141 + minWidth: 200,
142 + editOptions: {
143 + type: "text",
144 + //maxLength: 10,
145 + useViewMode: false
146 + }
147 + },
148 + {
149 + header: "Email",
150 + name: "email",
151 + minWidth: 200,
152 + formatter: function (data) {
153 + return '<a href="mailto:' + data.value.toString() + '" target="_blank">' + data.value.toString() + "</a>"
154 + }
155 + },
156 + {
157 + header: "Phone",
158 + name: "phone",
159 + minWidth: 200
160 + },
161 + {
162 + header: "Company",
163 + name: "company",
164 + minWidth: 300
165 + },
166 + {
167 + header: "Profession",
168 + name: "profession",
169 + minWidth: 300
170 + },
171 + {
172 + header: "GUID",
173 + name: "guid",
174 + minWidth: 300
175 + }
176 + ],
177 + summary: {
178 + height: 30,
179 + position: "bottom", // or 'top'
180 + columnContent: {
181 + age: {
182 + template: function (valueMap) {
183 + return (
184 + "<small>MAX: <strong>" +
185 + valueMap.max +
186 + "</strong>, MIN: <strong>" +
187 + valueMap.min +
188 + "</strong>, AVG: <strong>" +
189 + valueMap.avg.toFixed(2) +
190 + "</strong></small>"
191 + )
192 + }
193 + }
194 + }
195 + },
196 + data: gridData
197 + }
198 + }
199 + },
200 + methods: {
201 + handleResize: _.throttle(function (e) {
202 + console.log("resize", this.resizing)
203 + if (!this.resizing) {
204 + this.resizing = true
205 + setTimeout(() => {
206 + this.resizing = false
207 + }, 1000)
208 + setTimeout(() => {
209 + this.initGrid()
210 + }, 1500)
211 + }
212 + }, 1000),
213 + initGrid() {
214 + const tableBox = document.getElementById("table-box")
215 + if (tableBox) this.gridProps.bodyHeight = tableBox.clientHeight - 71
216 +
217 + this.gridProps.frozenCount = window.innerWidth <= 768 ? 0 : 2
218 + this.gridProps.columnOptions.frozenCount = window.innerWidth <= 768 ? 0 : 2
219 + }
220 + },
221 + mounted() {
222 + setTimeout(() => {
223 + this.initGrid()
224 + }, 1000)
225 + setTimeout(() => {
226 + this.resizing = false
227 + }, 1500)
228 + },
229 + components: {
230 + Grid,
231 + ResizeObserver
232 + }
233 +}
234 +</script>
235 +
236 +<style lang="scss">
237 +@import "../../../assets/scss/_variables";
238 +
239 +.page-tui-grid {
240 + .page-header {
241 + margin-bottom: 20px;
242 + }
243 +
244 + #table-box {
245 + overflow: hidden;
246 + }
247 +
248 + #grid {
249 + .tui-grid-cell[data-column-name="photo"] {
250 + .tui-grid-cell-content {
251 + padding: 0;
252 + }
253 + }
254 +
255 + .tui-grid-border-line-top {
256 + background-color: transparent;
257 + border-color: white;
258 + }
259 + .tui-grid-cell-head {
260 + border-top-color: transparent;
261 + }
262 + }
263 +}
264 +</style>
src/views/ui/Tables/V2TablePage.vue new
+427
@@ -0,0 +1,427 @@
1 +<template>
2 + <div class="page-table column scrollable only-y" :class="{ flex: !isMobile, overflow: isMobile }">
3 + <div class="page-header">
4 + <h1>V2 Table</h1>
5 + <h4>for a better experience on Mac OS during horizontal scroll is prefered disable the "Swipe between pages" option</h4>
6 + <el-breadcrumb separator="/">
7 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
8 + <el-breadcrumb-item>Components</el-breadcrumb-item>
9 + <el-breadcrumb-item>Tables</el-breadcrumb-item>
10 + <el-breadcrumb-item>V2 Table</el-breadcrumb-item>
11 + </el-breadcrumb>
12 + </div>
13 +
14 + <div class="toolbar-box flex">
15 + <div class="search-box box grow">
16 + <div><i class="mdi mdi-magnify"></i></div>
17 + <input v-model="search" placeholder="Search..." />
18 + </div>
19 + <div class="pagination-box">
20 + <div class="select-box">
21 + <el-select v-model="paginationInfo.pageSize" placeholder="Rows per page" size="small">
22 + <el-option value="10" label="10"></el-option>
23 + <el-option value="15" label="15"></el-option>
24 + <el-option value="20" label="20"></el-option>
25 + <el-option value="30" label="30"></el-option>
26 + <el-option value="50" label="50"></el-option>
27 + <el-option value="100" label="100"></el-option>
28 + </el-select>
29 + </div>
30 + <div class="label">/page</div>
31 + </div>
32 + <div class="csv-box">
33 + <button @click="downloadCSV">download csv ({{ total }})</button>
34 + </div>
35 + <div class="">
36 + <a href="https://github.com/dwqs/v2-table" target="_blank"><i class="mdi mdi-link-variant"></i> reference</a>
37 + </div>
38 + </div>
39 +
40 + <resize-observer @notify="handleResize" />
41 +
42 + <div class="table-box card-base card-shadow--medium box grow" id="table-wrapper" v-loading="!asyncComponent">
43 + <div :style="{ width: width + 'px' }">
44 + <!-- v2-table -->
45 + <component
46 + :is="asyncComponent"
47 + ref="table"
48 + :data="listInPage"
49 + :height="height"
50 + :border="false"
51 + :total="total"
52 + :lazy-load="false"
53 + :loading="loading"
54 + class="styled"
55 + :class="{ mobile: isMobile }"
56 + @page-change="handlePageChange"
57 + :pagination-info="paginationInfo"
58 + :default-sort="{ prop: sortingProp, order: sortingOrder }"
59 + @sort-change="handleSortChange"
60 + @select-change="handleSelectChange"
61 + :show-summary="showSummary"
62 + :shown-pagination="shownPagination"
63 + >
64 + <v2-table-column type="selection" width="45"></v2-table-column>
65 + <v2-table-column label="Name" prop="full_name" sortable width="200" align="left" :fixed="isMobile ? '' : 'left'">
66 + <template slot-scope="row">
67 + <span class="sel-string" v-html="$options.filters.selected(row.full_name, search)"></span>
68 + </template>
69 + </v2-table-column>
70 + <v2-table-column
71 + label="Birthday"
72 + prop="birth_day"
73 + sortable
74 + width="100"
75 + :fixed="isMobile ? '' : 'right'"
76 + ></v2-table-column>
77 + <v2-table-column label="Email" prop="email" sortable width="250">
78 + <template slot-scope="row">
79 + <span class="sel-string" v-html="$options.filters.selected(row.email, search)"></span>
80 + </template>
81 + </v2-table-column>
82 + <v2-table-column label="Gender" prop="gender" sortable></v2-table-column>
83 + <v2-table-column label="Job title" prop="job_title" sortable width="200"></v2-table-column>
84 + <v2-table-column label="Company" prop="company" sortable width="120"></v2-table-column>
85 + <v2-table-column label="City" prop="city" sortable width="200"></v2-table-column>
86 + <v2-table-column label="Country" prop="country" sortable></v2-table-column>
87 + <v2-table-column label="Address" prop="street_address" sortable>
88 + <template slot-scope="row">
89 + <div class="custom-action-row">
90 + <el-tooltip class="item" effect="dark" :content="row.street_address" placement="left">
91 + <span>{{ row.street_address }}</span>
92 + </el-tooltip>
93 + </div>
94 + </template>
95 + </v2-table-column>
96 + <v2-table-column label="Phone" prop="phone" sortable width="150"></v2-table-column>
97 + <v2-table-column label="Username" prop="username" sortable width="200"></v2-table-column>
98 + <v2-table-column label="Action" width="70" :fixed="isMobile ? '' : 'right'">
99 + <template slot-scope="row">
100 + <div class="custom-action-row">
101 + <el-button @click="print(row)"><i class="mdi mdi-eye"></i></el-button>
102 + </div>
103 + </template>
104 + </v2-table-column> </component
105 + ><!-- v2-table -->
106 + </div>
107 + </div>
108 + </div>
109 +</template>
110 +
111 +<script>
112 +import users from "@/assets/data/USERS_MOCK_DATA.json"
113 +import Papa from "papaparse"
114 +import * as FS from "file-saver"
115 +import _ from "lodash"
116 +
117 +import { defineComponent } from "@vue/runtime-core"
118 +
119 +export default defineComponent({
120 + name: "V2TablePage",
121 + data() {
122 + return {
123 + isMobile: false,
124 + asyncComponent: null,
125 + width: 0,
126 + height: "auto",
127 + currentPage: 1,
128 + loading: false,
129 + shownPagination: true,
130 + showSummary: false,
131 + search: "",
132 + paginationInfo: {
133 + //text: `<span><strong>20</strong> per page</span>`,
134 + pageSize: 20,
135 + nextPageText: "›",
136 + prevPageText: "‹"
137 + },
138 + sortingProp: "birth_day",
139 + sortingOrder: "descending",
140 + list: users
141 + }
142 + },
143 + computed: {
144 + listFiltered() {
145 + return this.list.filter(obj => {
146 + let ctrl = false
147 + for (let k in obj) {
148 + if (obj[k] && obj[k].toString().toLowerCase().indexOf(this.search.toLowerCase()) !== -1) ctrl = true
149 + }
150 + return ctrl
151 + })
152 + },
153 + listSortered() {
154 + let prop = this.sortingProp
155 + let order = this.sortingOrder
156 + return [].concat(
157 + this.listFiltered.sort((item1, item2) => {
158 + let val1 = ""
159 + let val2 = ""
160 +
161 + /*if (prop === 'formatted_date') {
162 + val1 = parseInt(moment(item1[prop], 'DD/MM/YYYY').format('x'))
163 + val2 = parseInt(moment(item2[prop], 'DD/MM/YYYY').format('x'))
164 + if (order === 'descending') {
165 + return val2 < val1 ? -1 : 1
166 + }
167 + return val1 < val2 ? -1 : 1
168 + }*/
169 +
170 + val1 = item1[prop]
171 + val2 = item2[prop]
172 + if (order === "descending") {
173 + return val2 < val1 ? -1 : 1
174 + }
175 + return val1 < val2 ? -1 : 1
176 + })
177 + )
178 + },
179 + listInPage() {
180 + let from = (this.currentPage - 1) * this.pageSize
181 + let to = from + this.pageSize * 1
182 + return this.listSortered.slice(from, to)
183 + },
184 + total() {
185 + return this.listFiltered.length
186 + },
187 + pageSize() {
188 + return this.paginationInfo.pageSize
189 + }
190 + },
191 + watch: {
192 + total(val) {
193 + this.updatePaginationText()
194 + },
195 + asyncComponent(val) {
196 + this.updatePaginationText()
197 + },
198 + pageSize(val) {
199 + this.asyncComponent = null
200 + this.currentPage = 1
201 +
202 + setTimeout(() => {
203 + this.asyncComponent = "v2-table"
204 + }, 500)
205 + },
206 + search(val) {
207 + this.currentPage = 1
208 + },
209 + currentPage(val) {
210 + this.$refs.table.curPage = val
211 + }
212 + },
213 + methods: {
214 + updatePaginationText() {
215 + this.paginationInfo.text = `<span>Total of <strong>${this.total}</strong>, <strong>${this.paginationInfo.pageSize}</strong> per page</span>`
216 + },
217 + handlePageChange(page) {
218 + this.currentPage = page
219 + },
220 + handleSortChange({ prop, order }) {
221 + this.sortingProp = prop
222 + this.sortingOrder = order
223 + },
224 + handleSelectChange(rows) {
225 + console.log("handleSelectChange", rows)
226 + },
227 + downloadCSV() {
228 + var dataCSV = Papa.unparse(this.listFiltered, { header: true })
229 + const blob = new Blob([dataCSV], { type: "text/csv;charset=utf-8" })
230 + FS.saveAs(blob, "list.csv")
231 + },
232 + print(row) {
233 + let message = ""
234 +
235 + for (let k in row) {
236 + message += k + ": <strong>" + row[k] + "</strong><br>"
237 + }
238 +
239 + this.$alert(message, row.full_name || "Message", {
240 + dangerouslyUseHTMLString: true
241 + })
242 + },
243 + calcDims() {
244 + this.width = document.getElementById("table-wrapper").clientWidth
245 +
246 + if (!this.isMobile) {
247 + this.height = document.getElementById("table-wrapper").clientHeight - 40
248 + if (this.showSummary) this.height -= 40
249 + if (this.shownPagination) this.height -= 40
250 + }
251 +
252 + this.asyncComponent = "v2-table"
253 + },
254 + handleResize: _.throttle(function (e) {
255 + this.asyncComponent = null
256 + this.width = 0
257 + this.currentPage = 1
258 + setTimeout(this.calcDims, 1000)
259 + }, 500)
260 + },
261 + filters: {
262 + selected: function (value, sel) {
263 + if (!value) return ""
264 + if (!sel) return value
265 + return value.toString().replace(new RegExp(sel, "gim"), `<span class="sel">${sel}</span>`)
266 + }
267 + },
268 + created() {
269 + if (window.innerWidth <= 768) this.isMobile = true
270 +
271 + this.updatePaginationText()
272 + },
273 + mounted() {
274 + //ie fix
275 + if (!window.Number.parseInt) window.Number.parseInt = parseInt
276 +
277 + this.calcDims()
278 + }
279 +})
280 +</script>
281 +
282 +<style lang="scss" scoped>
283 +@import "../../../assets/scss/_variables";
284 +.page-table {
285 + &.overflow {
286 + overflow: auto;
287 + }
288 +
289 + .table-box {
290 + overflow: hidden;
291 + }
292 +}
293 +</style>
294 +<style lang="scss">
295 +@import "../../../assets/scss/_variables";
296 +.page-table {
297 + .custom-action-row {
298 + overflow: hidden;
299 + text-overflow: ellipsis;
300 + white-space: nowrap;
301 +
302 + .el-button {
303 + padding: 1px 5px;
304 + }
305 + }
306 +
307 + .toolbar-box {
308 + .search-box {
309 + & > div {
310 + width: 20px;
311 + display: inline-block;
312 + }
313 +
314 + margin-bottom: 10px;
315 +
316 + i {
317 + display: inline-block;
318 + width: 22px;
319 + }
320 +
321 + input {
322 + outline: none;
323 + background: transparent;
324 + border: none;
325 + font-size: 15px;
326 + position: relative;
327 + padding: 0;
328 + margin-left: -20px;
329 + display: inline-block;
330 + padding-left: 20px;
331 + box-sizing: border-box;
332 + top: -1px;
333 + width: 100%;
334 + color: $text-color-primary;
335 + }
336 +
337 + .icons-tot {
338 + margin-right: 20px;
339 + }
340 + }
341 +
342 + .pagination-box {
343 + width: 120px;
344 + margin: 0 15px;
345 +
346 + .select-box {
347 + width: 70px;
348 + display: inline-block;
349 + }
350 +
351 + .label {
352 + width: 50px;
353 + display: inline-block;
354 + }
355 +
356 + .el-input__inner {
357 + height: 22px;
358 + border: none;
359 + background: transparent;
360 + font-size: 16px;
361 + text-align: right;
362 + font-family: inherit;
363 + padding-right: 20px;
364 + color: $text-color-primary;
365 + }
366 +
367 + .el-input__suffix {
368 + right: -3px;
369 +
370 + .el-select__caret {
371 + color: transparentize($text-color-primary, 0.7);
372 + }
373 + }
374 + }
375 +
376 + a,
377 + button {
378 + padding: 0;
379 + margin: 0 15px;
380 + background: transparent;
381 + border: none;
382 + outline: none;
383 + font-family: inherit;
384 + font-size: inherit;
385 + cursor: pointer;
386 +
387 + border-bottom: 1px solid;
388 + text-decoration: none;
389 + color: $text-color-primary;
390 + &:hover {
391 + opacity: 0.6;
392 + }
393 + }
394 +
395 + a {
396 + margin-right: 0;
397 + }
398 + }
399 +
400 + .sel-string {
401 + .sel {
402 + background: transparentize($text-color-primary, 0.8);
403 + border-radius: 5px;
404 + text-transform: uppercase;
405 + }
406 + }
407 +}
408 +
409 +@media (max-width: 768px) {
410 + .page-table {
411 + .toolbar-box {
412 + display: block;
413 + overflow: hidden;
414 + font-size: 80%;
415 +
416 + & > * {
417 + display: inline-block;
418 + min-width: 120px;
419 + height: 22px;
420 + background: rgba(0, 0, 0, 0.04);
421 + padding: 4px;
422 + margin: 3px !important;
423 + }
424 + }
425 + }
426 +}
427 +</style>
src/views/ui/Tables/VGTableV1.vue new
+95
@@ -0,0 +1,95 @@
1 +<template>
2 + <div class="page-vue-good-table scrollable only-y">
3 + <div class="page-header">
4 + <h1>Vue Good Table</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Tables</el-breadcrumb-item>
9 + <el-breadcrumb-item>Vue good table</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div class="vue-good-table-box card-base card-shadow--medium">
14 + <vue-good-table
15 + :columns="columns"
16 + :rows="rows"
17 + :globalSearch="true"
18 + :paginate="true"
19 + :responsive="true"
20 + :lineNumbers="false"
21 + class="styled"
22 + styleClass="table"
23 + >
24 + </vue-good-table>
25 + </div>
26 +
27 + <h4>
28 + <a href="https://github.com/xaksis/vue-good-table" target="_blank"><i class="mdi mdi-link-variant"></i> reference</a>
29 + </h4>
30 + </div>
31 +</template>
32 +
33 +<script>
34 +import { defineComponent } from "@vue/runtime-core"
35 +
36 +export default defineComponent({
37 + name: "VGTable",
38 + data() {
39 + return {
40 + columns: [
41 + {
42 + label: "Name",
43 + field: "name",
44 + filterable: true
45 + },
46 + {
47 + label: "Age",
48 + field: "age",
49 + type: "number",
50 + html: false,
51 + filterable: true
52 + },
53 + {
54 + label: "Created On",
55 + field: "createdAt",
56 + type: "date",
57 + inputFormat: "YYYY-MM-DD",
58 + outputFormat: "MMM Do YY"
59 + },
60 + {
61 + label: "Percent",
62 + field: "score",
63 + type: "percentage",
64 + html: false
65 + }
66 + ],
67 + rows: [
68 + { id: 1, name: "John", age: 20, createdAt: "2010-10-31", score: 0.03343 },
69 + { id: 2, name: "Jane", age: 24, createdAt: "2011-10-31", score: 0.03343 },
70 + { id: 3, name: "Susan", age: 16, createdAt: "2011-10-30", score: 0.03343 },
71 + { id: 4, name: "Chris", age: 55, createdAt: "2011-10-11", score: 0.03343 },
72 + { id: 5, name: "Dan", age: 40, createdAt: "2011-10-21", score: 0.03343 },
73 + { id: 6, name: "John", age: 20, createdAt: "2011-10-31", score: 0.03343 },
74 + { id: 7, name: "Jane", age: 24, createdAt: "20111031" },
75 + { id: 8, name: "Susan", age: 16, createdAt: "2013-10-31", score: 0.03343 },
76 + { id: 9, name: "Chris", age: 55, createdAt: "2012-10-31", score: 0.03343 },
77 + { id: 10, name: "Dan", age: 40, createdAt: "2011-10-31", score: 0.03343 },
78 + { id: 11, name: "John", age: 20, createdAt: "2011-10-31", score: 0.03343 },
79 + { id: 12, name: "Jane", age: 24, createdAt: "2011-07-31", score: 0.03343 },
80 + { id: 13, name: "Susan", age: 16, createdAt: "2017-02-28", score: 0.03343 },
81 + { id: 14, name: "Chris", age: 55, createdAt: "", score: 0.03343 },
82 + { id: 15, name: "Dan", age: 40, createdAt: "2011-10-31", score: 0.03343 },
83 + { id: 19, name: "Chris", age: 55, createdAt: "2011-10-31", score: 0.03343 },
84 + { id: 20, name: "Dan", age: 40, createdAt: "2011-10-31", score: 0.03343 }
85 + ]
86 + }
87 + }
88 +})
89 +</script>
90 +
91 +<style lang="scss">
92 +.page-vue-good-table {
93 + overflow: hidden;
94 +}
95 +</style>
src/views/ui/Tables/VGTableV2.vue new
+107
@@ -0,0 +1,107 @@
1 +<template>
2 + <div class="page-vue-good-table scrollable only-y">
3 + <div class="page-header">
4 + <h1>Vue Good Table</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>Components</el-breadcrumb-item>
8 + <el-breadcrumb-item>Tables</el-breadcrumb-item>
9 + <el-breadcrumb-item>Vue good table</el-breadcrumb-item>
10 + </el-breadcrumb>
11 + </div>
12 +
13 + <div class="vue-good-table-box card-base card-shadow--medium">
14 + <vue-good-table
15 + :columns="columns"
16 + :rows="rows"
17 + :search-options="{
18 + enabled: true,
19 + placeholder: 'Search this table'
20 + }"
21 + :pagination-options="{
22 + enabled: true,
23 + mode: 'records',
24 + perPage: 10,
25 + perPageDropdown: [10, 20, 30, 40, 50],
26 + nextLabel: 'Next',
27 + prevLabel: 'Prev',
28 + rowsPerPageLabel: 'Rows per page',
29 + ofLabel: 'of',
30 + pageLabel: 'page', // for 'pages' mode
31 + allLabel: 'All'
32 + }"
33 + :lineNumbers="false"
34 + class="styled"
35 + >
36 + </vue-good-table>
37 + </div>
38 +
39 + <h4>
40 + <a href="https://github.com/xaksis/vue-good-table" target="_blank"><i class="mdi mdi-link-variant"></i> reference</a>
41 + </h4>
42 + </div>
43 +</template>
44 +
45 +<script>
46 +import { defineComponent } from "@vue/runtime-core"
47 +
48 +export default defineComponent({
49 + name: "VGTable",
50 + data() {
51 + return {
52 + columns: [
53 + {
54 + label: "Name",
55 + field: "name",
56 + filterable: true
57 + },
58 + {
59 + label: "Age",
60 + field: "age",
61 + type: "number",
62 + html: false,
63 + filterable: true
64 + },
65 + {
66 + label: "Created On",
67 + field: "createdAt",
68 + type: "date",
69 + dateInputFormat: "YYYY-MM-DD",
70 + dateOutputFormat: "MMM Do YY"
71 + },
72 + {
73 + label: "Percent",
74 + field: "score",
75 + type: "percentage",
76 + html: false
77 + }
78 + ],
79 + rows: [
80 + { id: 1, name: "John", age: 20, createdAt: "2010-10-31", score: 0.03343 },
81 + { id: 2, name: "Jane", age: 24, createdAt: "2011-10-31", score: 0.03343 },
82 + { id: 3, name: "Susan", age: 16, createdAt: "2011-10-30", score: 0.03343 },
83 + { id: 4, name: "Chris", age: 55, createdAt: "2011-10-11", score: 0.03343 },
84 + { id: 5, name: "Dan", age: 40, createdAt: "2011-10-21", score: 0.03343 },
85 + { id: 6, name: "John", age: 20, createdAt: "2011-10-31", score: 0.03343 },
86 + { id: 7, name: "Jane", age: 24, createdAt: "20111031" },
87 + { id: 8, name: "Susan", age: 16, createdAt: "2013-10-31", score: 0.03343 },
88 + { id: 9, name: "Chris", age: 55, createdAt: "2012-10-31", score: 0.03343 },
89 + { id: 10, name: "Dan", age: 40, createdAt: "2011-10-31", score: 0.03343 },
90 + { id: 11, name: "John", age: 20, createdAt: "2011-10-31", score: 0.03343 },
91 + { id: 12, name: "Jane", age: 24, createdAt: "2011-07-31", score: 0.03343 },
92 + { id: 13, name: "Susan", age: 16, createdAt: "2017-02-28", score: 0.03343 },
93 + { id: 14, name: "Chris", age: 55, createdAt: "", score: 0.03343 },
94 + { id: 15, name: "Dan", age: 40, createdAt: "2011-10-31", score: 0.03343 },
95 + { id: 19, name: "Chris", age: 55, createdAt: "2011-10-31", score: 0.03343 },
96 + { id: 20, name: "Dan", age: 40, createdAt: "2011-10-31", score: 0.03343 }
97 + ]
98 + }
99 + }
100 +})
101 +</script>
102 +
103 +<style lang="scss">
104 +.page-vue-good-table {
105 + overflow: hidden;
106 +}
107 +</style>
src/views/ui/Themes.vue new
+78
@@ -0,0 +1,78 @@
1 +<template>
2 + <el-scrollbar class="page-themes">
3 + <div class="page-header">
4 + <h1>Themes</h1>
5 + <h4>
6 + <a href="https://pragmatic-docs.vercel.app/#/#/colors" target="_blank"
7 + ><i class="mdi mdi-book-open-page-variant"></i> read the documentation to create endless combinations</a
8 + >
9 + </h4>
10 + <el-breadcrumb separator="/">
11 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
12 + <el-breadcrumb-item>UI</el-breadcrumb-item>
13 + <el-breadcrumb-item>Themes</el-breadcrumb-item>
14 + </el-breadcrumb>
15 + </div>
16 +
17 + <div style="margin: 0 -10px">
18 + <el-row>
19 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
20 + <a class="theme-link" href="https://pragmatic-theme-a.ddmweb.it/"
21 + ><img src="@/assets/images/theme-a.png" alt="theme a image"
22 + /></a>
23 + </el-col>
24 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
25 + <a class="theme-link" href="https://pragmatic-theme-b.ddmweb.it/"
26 + ><img src="@/assets/images/theme-b.png" alt="theme b image"
27 + /></a>
28 + </el-col>
29 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
30 + <a class="theme-link" href="https://pragmatic-theme-c.ddmweb.it/"
31 + ><img src="@/assets/images/theme-c.png" alt="theme c image"
32 + /></a>
33 + </el-col>
34 + <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
35 + <a class="theme-link" href="https://pragmatic-theme-d.ddmweb.it/"
36 + ><img src="@/assets/images/theme-d.png" alt="theme d image"
37 + /></a>
38 + </el-col>
39 + </el-row>
40 + </div>
41 + </el-scrollbar>
42 +</template>
43 +
44 +<script>
45 +import { defineComponent } from "@vue/runtime-core"
46 +
47 +export default defineComponent({
48 + name: "Themes"
49 +})
50 +</script>
51 +
52 +<style lang="scss" scoped>
53 +@import "../../assets/scss/_variables";
54 +
55 +.page-themes {
56 + .theme-link {
57 + display: block;
58 + padding: 10px;
59 + box-sizing: border-box;
60 +
61 + img {
62 + width: 100%;
63 + border-radius: 10px;
64 + box-sizing: border-box;
65 + border: 3px solid white;
66 + box-shadow: 0px 7px 20px -7px rgba(0, 0, 0, 0.55);
67 + transition: all 0.5s;
68 + }
69 +
70 + &:hover {
71 + img {
72 + transform: translateY(5px);
73 + box-shadow: none;
74 + }
75 + }
76 + }
77 +}
78 +</style>
src/views/ui/Typography.vue new
+406
@@ -0,0 +1,406 @@
1 +<template>
2 + <el-scrollbar class="page-typography">
3 + <div class="page-header">
4 + <h1>Typography</h1>
5 + <el-breadcrumb separator="/">
6 + <el-breadcrumb-item :to="{ path: '/' }"><i class="mdi mdi-home-outline"></i></el-breadcrumb-item>
7 + <el-breadcrumb-item>UI</el-breadcrumb-item>
8 + <el-breadcrumb-item>Typography</el-breadcrumb-item>
9 + </el-breadcrumb>
10 + </div>
11 + <div class="card-base card-shadow--medium p-30">
12 + <el-tabs>
13 + <el-tab-pane label="Headers">
14 + <div class="flex center demo-box">
15 + <div class="left-box">big header 1</div>
16 + <div class="right-box box grow"><h1 class="h-big">Lorem ipsum dolor sit amet</h1></div>
17 + </div>
18 + <div class="flex center demo-box">
19 + <div class="left-box">big header 2</div>
20 + <div class="right-box box grow"><h2 class="h-big">Lorem ipsum dolor sit amet</h2></div>
21 + </div>
22 + <div class="flex center demo-box">
23 + <div class="left-box">big header 3</div>
24 + <div class="right-box box grow"><h3 class="h-big">Lorem ipsum dolor sit amet</h3></div>
25 + </div>
26 + <div class="flex center demo-box">
27 + <div class="left-box">header 1</div>
28 + <div class="right-box box grow"><h1>Lorem ipsum dolor sit amet</h1></div>
29 + </div>
30 + <div class="flex center demo-box">
31 + <div class="left-box">header 2</div>
32 + <div class="right-box box grow"><h2>Lorem ipsum dolor sit amet</h2></div>
33 + </div>
34 + <div class="flex center demo-box">
35 + <div class="left-box">header 3</div>
36 + <div class="right-box box grow"><h3>Lorem ipsum dolor sit amet</h3></div>
37 + </div>
38 + <div class="flex center demo-box">
39 + <div class="left-box">subheader 4</div>
40 + <div class="right-box box grow"><h4>Lorem ipsum dolor sit amet</h4></div>
41 + </div>
42 + <div class="flex center demo-box">
43 + <div class="left-box">subheader 5</div>
44 + <div class="right-box box grow"><h5>Lorem ipsum dolor sit amet</h5></div>
45 + </div>
46 + <div class="flex center demo-box">
47 + <div class="left-box">subheader 6</div>
48 + <div class="right-box box grow"><h6>Lorem ipsum dolor sit amet</h6></div>
49 + </div>
50 + <div class="flex center demo-box">
51 + <div class="left-box">paragraph</div>
52 + <div class="right-box box grow">
53 + <p>
54 + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet
55 + dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.
56 + </p>
57 + </div>
58 + </div>
59 + </el-tab-pane>
60 + <el-tab-pane label="Text elements">
61 + <div class="flex center demo-box mt-20">
62 + <div class="left-box">blockquote</div>
63 + <div class="right-box box grow">
64 + <blockquote>
65 + <p>
66 + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
67 + laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.
68 + </p>
69 + <small class="secondary-text"> Lorem ipsum, Lorem ipsum </small>
70 + </blockquote>
71 + </div>
72 + </div>
73 + <div class="flex center demo-box">
74 + <div class="left-box">blockquote reverse</div>
75 + <div class="right-box box grow">
76 + <blockquote class="reverse">
77 + <p>
78 + Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
79 + laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam.
80 + </p>
81 + <small class="secondary-text"> Lorem ipsum, Lorem ipsum </small>
82 + </blockquote>
83 + </div>
84 + </div>
85 + <div class="flex center demo-box">
86 + <div class="left-box">code</div>
87 + <div class="right-box box grow"><pre>import Vue from 'vue'</pre></div>
88 + </div>
89 + <div class="flex center demo-box">
90 + <div class="left-box">definition lists</div>
91 + <div class="right-box box grow">
92 + <dl>
93 + <dt>Definition term</dt>
94 + <dd>This is the definition description</dd>
95 +
96 + <dt>Another definition term</dt>
97 + <dd>This is another definition description</dd>
98 + </dl>
99 + </div>
100 + </div>
101 + <div class="flex center demo-box">
102 + <div class="left-box">definition lists horizontal</div>
103 + <div class="right-box box grow">
104 + <dl class="horizontal">
105 + <dt>Definition term</dt>
106 + <dd>This is the definition description</dd>
107 +
108 + <dt>Another definition term</dt>
109 + <dd>This is another definition description</dd>
110 + </dl>
111 + </div>
112 + </div>
113 + <div class="flex center demo-box">
114 + <div class="left-box">unordered list</div>
115 + <div class="right-box box grow">
116 + <ul>
117 + <li>List Item</li>
118 + <li>
119 + List Item
120 + <ul>
121 + <li>List Item</li>
122 + <li>List Item</li>
123 + <li>List Item</li>
124 + </ul>
125 + </li>
126 + <li>List Item</li>
127 + </ul>
128 + </div>
129 + </div>
130 + <div class="flex center demo-box">
131 + <div class="left-box">ordered list</div>
132 + <div class="right-box box grow">
133 + <ol>
134 + <li>List Item</li>
135 + <li>
136 + List Item
137 + <ol>
138 + <li>List Item</li>
139 + <li>List Item</li>
140 + <li>List Item</li>
141 + </ol>
142 + </li>
143 + <li>List Item</li>
144 + </ol>
145 + </div>
146 + </div>
147 + <div class="flex center demo-box">
148 + <div class="left-box">unstyled list</div>
149 + <div class="right-box box grow">
150 + <ul class="list-unstyled">
151 + <li>List Item</li>
152 + <li>List Item</li>
153 + <li>List Item</li>
154 + </ul>
155 + </div>
156 + </div>
157 + <div class="flex center demo-box">
158 + <div class="left-box">anchor</div>
159 + <div class="right-box box grow">a <a>link</a></div>
160 + </div>
161 + <div class="flex center demo-box">
162 + <div class="left-box">abbreviation</div>
163 + <div class="right-box box grow">
164 + <abbr title="HyperText Markup Language">HTML</abbr>
165 + </div>
166 + </div>
167 + <div class="flex center demo-box">
168 + <div class="left-box">highlight</div>
169 + <div class="right-box box grow">a <mark>highlighted</mark> text</div>
170 + </div>
171 + <div class="flex center demo-box">
172 + <div class="left-box">strike-through</div>
173 + <div class="right-box box grow">a <s>strike-through</s> text</div>
174 + </div>
175 + <div class="flex center demo-box">
176 + <div class="left-box">underline</div>
177 + <div class="right-box box grow">an <u>underlined</u> text</div>
178 + </div>
179 + <div class="flex center demo-box">
180 + <div class="left-box">selected</div>
181 + <div class="right-box box grow">a <span class="text-selected">selected</span> text</div>
182 + </div>
183 + <div class="flex center demo-box">
184 + <div class="left-box">small</div>
185 + <div class="right-box box grow">a <small>small</small> text</div>
186 + </div>
187 + <div class="flex center demo-box">
188 + <div class="left-box">strong</div>
189 + <div class="right-box box grow">a <strong>strong</strong> text</div>
190 + </div>
191 + <div class="flex center demo-box">
192 + <div class="left-box">italic</div>
193 + <div class="right-box box grow">an <em>italic</em> text</div>
194 + </div>
195 + <div class="flex center demo-box">
196 + <div class="left-box">super</div>
197 + <div class="right-box box grow">a <sup>super</sup> text</div>
198 + </div>
199 + <div class="flex center demo-box">
200 + <div class="left-box">sub</div>
201 + <div class="right-box box grow">a <sub>sub</sub> text</div>
202 + </div>
203 + <div class="flex center demo-box">
204 + <div class="left-box">capitalized</div>
205 + <div class="right-box box grow">a <span class="text-capitalized">capitalized</span> text</div>
206 + </div>
207 + <div class="flex center demo-box">
208 + <div class="left-box">lowercase</div>
209 + <div class="right-box box grow">A <span class="text-lowercase">lowercase</span> TEXT</div>
210 + </div>
211 + <div class="flex center demo-box">
212 + <div class="left-box">uppercase</div>
213 + <div class="right-box box grow">an <span class="text-uppercase">uppercase</span> text</div>
214 + </div>
215 + </el-tab-pane>
216 + <el-tab-pane label="Helpers" class="pt-20">
217 + <div class="text-divider" style="margin-top: 0">LIST</div>
218 + <div class="flex center demo-box">
219 + <div class="left-box">unordered styled list</div>
220 + <div class="right-box box grow">
221 + <ul class="styled">
222 + <li>List Item</li>
223 + <li>
224 + List Item
225 + <ul>
226 + <li>List Item</li>
227 + <li>List Item</li>
228 + <li>List Item</li>
229 + </ul>
230 + </li>
231 + <li>List Item</li>
232 + </ul>
233 + </div>
234 + </div>
235 + <div class="flex center demo-box">
236 + <div class="left-box">ordered styled list</div>
237 + <div class="right-box box grow">
238 + <ol class="styled">
239 + <li>List Item</li>
240 + <li>
241 + List Item
242 + <ol>
243 + <li>List Item</li>
244 + <li>List Item</li>
245 + <li>List Item</li>
246 + </ol>
247 + </li>
248 + <li>List Item</li>
249 + </ol>
250 + </div>
251 + </div>
252 + <div class="text-divider">COLORS</div>
253 + <br />
254 + <div class="flex center demo-box" v-for="i in textColors" :key="i">
255 + <div class="left-box">{{ i }}</div>
256 + <div class="right-box box grow">
257 + <span :class="i">Lorem Ipsum is simply dummy text of the printing and typesetting industry</span>
258 + </div>
259 + </div>
260 + <br />
261 + <div class="text-divider">FONT WEIGHT</div>
262 + <br />
263 + <div class="flex center demo-box" v-for="i in fontWeight" :key="i">
264 + <div class="left-box">{{ i }}</div>
265 + <div class="right-box box grow">
266 + <span :class="i">Lorem Ipsum is simply dummy text of the printing and typesetting industry</span>
267 + </div>
268 + </div>
269 + <br />
270 + <div class="text-divider">
271 + FONT SIZE ( from <strong class="mh-7">1px</strong> to <strong class="mh-7">200px</strong> )
272 + </div>
273 + <br />
274 + <div class="flex center demo-box" v-for="(i, index) in fontSize" :key="i">
275 + <div class="left-box">font-size-{{ 10 + index }}</div>
276 + <div class="right-box box grow">
277 + <span :class="'font-size-' + (10 + index)"
278 + >Lorem Ipsum is simply dummy text of the printing and typesetting industry</span
279 + >
280 + </div>
281 + </div>
282 + <br />
283 + <div class="text-divider">
284 + LINE HEIGHT ( from <strong class="mh-7">1px</strong> to <strong class="mh-7">200px</strong> )
285 + </div>
286 + <br />
287 + <div class="flex center demo-box" v-for="(i, index) in lineHeight" :key="i">
288 + <div class="left-box">line-height-{{ 30 + index }}</div>
289 + <div class="right-box box grow">
290 + <span :class="'line-height-' + (30 + index)"
291 + >Lorem Ipsum is simply dummy text of the printing and typesetting industry</span
292 + >
293 + </div>
294 + </div>
295 + <div class="text-divider">TEXT ALIGN</div>
296 + <br />
297 + <div class="flex center demo-box">
298 + <div class="left-box">text-left</div>
299 + <div class="right-box box grow text-left">text align left</div>
300 + </div>
301 + <div class="flex center demo-box">
302 + <div class="left-box">text-center</div>
303 + <div class="right-box box grow text-center">text align center</div>
304 + </div>
305 + <div class="flex center demo-box">
306 + <div class="left-box">text-right</div>
307 + <div class="right-box box grow text-right">text align right</div>
308 + </div>
309 + <div class="flex center demo-box">
310 + <div class="left-box">text-truncate</div>
311 + <div class="right-box box grow text-truncate">
312 + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus laoreet mi vel semper venenatis. Integer eget
313 + convallis libero, sit amet tristique est. Sed lacinia massa eget erat facilisis, et pulvinar arcu pharetra.
314 + Morbi gravida metus et turpis efficitur bibendum. Praesent tortor leo, finibus et finibus in, malesuada vel
315 + massa. Aliquam erat volutpat. Etiam efficitur lectus sit amet odio tempus, quis tempor enim molestie.
316 + </div>
317 + </div>
318 + </el-tab-pane>
319 + </el-tabs>
320 + </div>
321 + </el-scrollbar>
322 +</template>
323 +
324 +<script>
325 +import { defineComponent } from "@vue/runtime-core"
326 +
327 +export default defineComponent({
328 + name: "Typography",
329 + data() {
330 + return {
331 + textColors: [
332 + "primary-text",
333 + "secondary-text",
334 + "hint-text",
335 + "accent-text",
336 + "black-text",
337 + "success-text",
338 + "warning-text",
339 + "danger-text",
340 + "info-text",
341 + "success-light-text",
342 + "warning-light-text",
343 + "danger-light-text",
344 + "info-light-text"
345 + ],
346 + fontWeight: [
347 + "font-weight-100",
348 + "font-weight-200",
349 + "font-weight-300",
350 + "font-weight-400",
351 + "font-weight-500",
352 + "font-weight-600",
353 + "font-weight-700",
354 + "font-weight-800",
355 + "font-weight-900"
356 + ],
357 + fontSize: Array(11),
358 + lineHeight: Array(11)
359 + }
360 + }
361 +})
362 +</script>
363 +
364 +<style lang="scss" scoped>
365 +@import "../../assets/scss/_variables";
366 +
367 +.card-base {
368 + .text-divider {
369 + margin-top: 80px;
370 + margin-bottom: 5px;
371 + }
372 +
373 + .demo-box {
374 + margin-bottom: 40px;
375 +
376 + .left-box {
377 + width: 200px;
378 + padding: 20px 40px;
379 + box-sizing: border-box;
380 + text-align: right;
381 + color: transparentize($text-color-primary, 0.5);
382 + }
383 + }
384 +}
385 +
386 +@media (max-width: 768px) {
387 + .card-base {
388 + .demo-box {
389 + display: block;
390 + overflow: hidden;
391 +
392 + .left-box {
393 + text-align: left;
394 + padding: 30px 0;
395 + padding-bottom: 15px;
396 + }
397 +
398 + .left-box,
399 + .right-box {
400 + width: 100%;
401 + display: block;
402 + }
403 + }
404 + }
405 +}
406 +</style>
tsconfig.json new
+24
@@ -0,0 +1,24 @@
1 +{
2 + "compilerOptions": {
3 + "target": "esnext",
4 + "useDefineForClassFields": true,
5 + "module": "esnext",
6 + "moduleResolution": "node",
7 + "strict": false,
8 + "jsx": "preserve",
9 + "sourceMap": true,
10 + "resolveJsonModule": true,
11 + "isolatedModules": true,
12 + "esModuleInterop": true,
13 + "lib": ["esnext", "dom"],
14 + "skipLibCheck": true,
15 + "allowJs": true,
16 + "paths": {
17 + "@/*": ["./src/*", "./dist/*"],
18 + "preact/*": ["./src/empty.d.ts"]
19 + },
20 + "types": ["vite/client", "node"]
21 + },
22 + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
23 + "references": [{ "path": "./tsconfig.node.json" }]
24 +}
tsconfig.node.json new
+8
@@ -0,0 +1,8 @@
1 +{
2 + "compilerOptions": {
3 + "composite": true,
4 + "module": "esnext",
5 + "moduleResolution": "node"
6 + },
7 + "include": ["vite.config.ts"]
8 +}
tsconfig.vitest.json new
+9
@@ -0,0 +1,9 @@
1 +{
2 + "extends": "./tsconfig.json",
3 + "exclude": [],
4 + "compilerOptions": {
5 + "composite": true,
6 + "lib": [],
7 + "types": ["node", "jsdom"]
8 + }
9 +}
vite.config.ts new
+14
@@ -0,0 +1,14 @@
1 +import { fileURLToPath, URL } from "url"
2 +import { defineConfig } from "vite"
3 +import vue from "@vitejs/plugin-vue"
4 +
5 +// https://vitejs.dev/config/
6 +export default defineConfig({
7 + plugins: [vue()],
8 + resolve: {
9 + alias: {
10 + "@": fileURLToPath(new URL("./src", import.meta.url))
11 + },
12 + dedupe: ["vue"]
13 + }
14 +})