├── .github
└── FUNDING.yml
├── .gitignore
├── .prettierrc
├── CHANGELOG.md
├── LICENSE
├── README.md
├── build.ps1
├── build.sh
├── docs
├── API.png
├── config.png
├── duckduckgo.png
├── google.png
├── omnibox.mov
└── searx.md
├── icons
├── cog.svg
├── favicon.ico
├── icon.svg
├── logo.svg
├── logo_128.png
├── logo_16.png
├── logo_32.png
├── logo_48.png
├── logo_96.png
├── logo_full.svg
├── logo_full_google.svg
└── logo_small.svg
├── manifest.json
├── options
├── index.html
└── index.js
├── package-lock.json
├── package.json
├── pnpm-lock.yaml
├── rollup.config.js
├── scss
├── bookmarks.scss
├── injectionBox.scss
├── theme.scss
└── variables.scss
├── src
├── background.js
├── browser.js
├── configuration.js
├── index.js
├── miniflux.js
├── options.svelte
└── searchInjection.js
└── styles
├── index.css
├── spectre-exp.css
├── spectre-icons.css
└── spectre.css
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: Sevichecc
4 | ko_fi: sevichecc
5 | #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
6 | liberapay: SevicheCC
7 | #issuehunt: # Replace with a single IssueHunt username
8 | #otechie: # Replace with a single Otechie username
9 | #lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
10 | #custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Node template
3 | # Logs
4 | logs
5 | *.log
6 | npm-debug.log*
7 | yarn-debug.log*
8 | yarn-error.log*
9 | lerna-debug.log*
10 |
11 | # Diagnostic reports (https://nodejs.org/api/report.html)
12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
13 |
14 | # Runtime data
15 | pids
16 | *.pid
17 | *.seed
18 | *.pid.lock
19 |
20 | # Directory for instrumented libs generated by jscoverage/JSCover
21 | lib-cov
22 |
23 | # Coverage directory used by tools like istanbul
24 | coverage
25 | *.lcov
26 |
27 | # nyc test coverage
28 | .nyc_output
29 |
30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
31 | .grunt
32 |
33 | # Bower dependency directory (https://bower.io/)
34 | bower_components
35 |
36 | # node-waf configuration
37 | .lock-wscript
38 |
39 | # Compiled binary addons (https://nodejs.org/api/addons.html)
40 | build/Release
41 |
42 | # Dependency directories
43 | node_modules/
44 | jspm_packages/
45 |
46 | # Snowpack dependency directory (https://snowpack.dev/)
47 | web_modules/
48 |
49 | # TypeScript cache
50 | *.tsbuildinfo
51 |
52 | # Optional npm cache directory
53 | .npm
54 |
55 | # Optional eslint cache
56 | .eslintcache
57 |
58 | # Microbundle cache
59 | .rpt2_cache/
60 | .rts2_cache_cjs/
61 | .rts2_cache_es/
62 | .rts2_cache_umd/
63 |
64 | # Optional REPL history
65 | .node_repl_history
66 |
67 | # Output of 'npm pack'
68 | *.tgz
69 |
70 | # Yarn Integrity file
71 | .yarn-integrity
72 |
73 | # dotenv environment variables file
74 | .env
75 | .env.test
76 |
77 | # parcel-bundler cache (https://parceljs.org/)
78 | .cache
79 | .parcel-cache
80 |
81 | # Next.js build output
82 | .next
83 | out
84 |
85 | # Nuxt.js build / generate output
86 | .nuxt
87 | dist
88 |
89 | # Gatsby files
90 | .cache/
91 | # Comment in the public line in if your project uses Gatsby and not Next.js
92 | # https://nextjs.org/blog/next-9-1#public-directory-support
93 | # public
94 |
95 | # vuepress build output
96 | .vuepress/dist
97 |
98 | # Serverless directories
99 | .serverless/
100 |
101 | # FuseBox cache
102 | .fusebox/
103 |
104 | # DynamoDB Local files
105 | .dynamodb/
106 |
107 | # TernJS port file
108 | .tern-port
109 |
110 | # Stores VSCode versions used for testing VSCode extensions
111 | .vscode-test
112 |
113 | # yarn v2
114 | .yarn/cache
115 | .yarn/unplugged
116 | .yarn/build-state.yml
117 | .yarn/install-state.gz
118 | .pnp.*
119 |
120 | ### Custom
121 |
122 | .idea
123 | *.iml
124 | /build
125 | /web-ext-artifacts
126 | .web-extension-id
127 | /styles/searchInjection.*
128 |
129 | .DS_Store
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 2,
3 | "useTabs": false,
4 | "semi": true,
5 | "singleQuote": true
6 | }
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## V2.3.3 (31/10/2023)
2 | - Feat: New search engine: Kagi. Thanks to @danbush (see Fivefold/linkding-injector#21)
3 | - Fix: broken Brave Search support, Thanks to @Fivefold (see Fivefold/linkding-injector#22)
4 |
5 | ## V2.3.2 (04/06/2023)
6 | - Rebased release version, all updated with [upsteam](https://github.com/Fivefold/linkding-injector/blob/v1.3.2/CHANGELOG.md)
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Sascha Ißbrücker
4 | Copyright (c) 2022 Jakob Essbüchl
5 | Copyright (c) 2022 SevicheCC
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | Community browser extension for the self-hosted [miniflux](https://miniflux.app/) bookmark service.
4 |
5 | Fork from [linkding-injector](https://github.com/Fivefold/linkding-injector)
6 |
7 | **Features**
8 |
9 | - When searching on a search engine the search term is also sent to your Miniflux instance and results are added in a new box in the sidebar right to the search engine results.
10 | - Supports the following search engines:
11 | - [google](https://www.google.com/)
12 | - [duckduckgo](https://duckduckgo.com/)
13 | - [SearX/SearXNG](https://github.com/searx/searx)*
14 | - [Brave Search](https://search.brave.com/)
15 | - [Kagi](https://kagi.com/)
16 | - Automatic light or dark theme detection
17 | - Open search result in Miniflux
18 | Works with: Firefox, Chrome
19 | - Omnibox support (type keyword 'mj' in searchbar to search in Miniflux)
20 |
21 | _\* experimental, please read [this](docs/searx.md) if you have problems_
22 | ## Usage
23 |
24 | ### 1. Create a Miniflux API Key
25 |
26 | After installation the extension needs to be configured and connected to your Miniflux instance, create your API key in `http://your-miniflux-domain/keys`, then copy that API keys
27 |
28 | 
29 |
30 | ### 2. Setting the extension setting
31 |
32 | Either open the extension options in the browser extension manager or follow the link in the new Miniflux injector box on the search page of google or duckduckgo.
33 |
34 | Then paste the API keys you copy before, and fill in the Base URL with your Miniflux server's URL
35 |
36 |
37 |
38 | Once the extension is properly configured, miniflux search results will show in the right sidebar. If there are no search results nothing will appear.
39 |
40 | **Screenshots**
41 |
42 | 
43 | 
44 | 
45 |
46 | ## Installation
47 |
48 | - FireFox: [Mozilla Addon Store](https://addons.mozilla.org/zh-CN/firefox/addon/miniflux-injector/)
49 | - Chrome : [Chrome Store](https://chromewebstore.google.com/detail/miniflux-injector/olnngmhgopdgnfenhimlmnmemadhofdd)
50 |
51 | ## Build
52 |
53 | **Requirements**
54 |
55 | - Latest LTS Node version (v14+ )
56 | - Latest LTS NPM version (v6+)
57 | - bash (on Linux) or powershell (on Windows)
58 | - npx (included with npm v5.2+)
59 |
60 | Internally, we use `web-ext` to bundle a distribution package for the extension for Firefox. You do not need to install `web-ext`. Note that `web-ext` will generate a zip file which can also be used for the Chrome Web Store.
61 |
62 | Then run the following script to generate a build (might need to make the file executable on Linux using `chmod +x build.sh`):
63 |
64 | ```bash
65 | ./build.sh # Linux
66 | ```
67 |
68 | ```powershell
69 | ./build.ps1 # Windows
70 | ```
71 |
72 | The script does:
73 |
74 | - Install all dependencies using NPM
75 | - Runs rollup to transpile and minify source files, with output written to the `build` directory
76 | - Run web-ext to package the extension for uploading to the Mozilla addon store
77 |
78 | After the build the root directory contains the complete, unpackaged extension. Use the `manifest.json` file to load it manually into the browser.
79 |
80 | The packaged extension can be found in the `web-ext-artifacts` folder.
81 |
82 | ## Acknowledgements
83 |
84 | - This extension reuses and adapts code from the [official linkding extension](https://github.com/sissbruecker/linkding-extension)
85 |
86 | Logo:
87 |
88 | - [Miniflux logo](https://github.com/miniflux/logo) - [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/)
89 | - [Ysabeau](https://github.com/CatharsisFonts/Ysabeau) - [OFL-1.1 license](https://github.com/CatharsisFonts/Ysabeau/blob/master/OFL.txt)
90 |
--------------------------------------------------------------------------------
/build.ps1:
--------------------------------------------------------------------------------
1 | # Update dependencies
2 | npm install
3 |
4 | # Run rollup build
5 | npm run build
6 |
7 | # Lint extension, while excluding dev files
8 | npx web-ext lint --ignore-files .idea dist docs src web-ext-artifacts scss .gitignore *.sh *.ps1 *.iml *.js *.lock
9 | # Build extension, while excluding dev files
10 | npx web-ext build --overwrite-dest --ignore-files .idea dist docs src web-ext-artifacts scss .gitignore *.sh *.ps1 *.iml *.js *.lock
11 |
12 | echo "✅ Done"
13 |
--------------------------------------------------------------------------------
/build.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Update dependencies
4 | pnpm install
5 |
6 | # Run rollup build
7 | pnpm run build
8 |
9 | # Lint extension, while excluding dev files
10 | npx web-ext lint --ignore-files .idea dist docs src web-ext-artifacts scss .gitignore *.sh *.ps1 *.iml *.js *.lock
11 | # Build extension, while excluding dev files
12 | npx web-ext build --overwrite-dest --ignore-files .idea dist docs src web-ext-artifacts scss .gitignore *.sh *.ps1 *.iml *.js *.lock
13 |
14 | echo "✅ Done"
15 |
--------------------------------------------------------------------------------
/docs/API.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/docs/API.png
--------------------------------------------------------------------------------
/docs/config.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/docs/config.png
--------------------------------------------------------------------------------
/docs/duckduckgo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/docs/duckduckgo.png
--------------------------------------------------------------------------------
/docs/google.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/docs/google.png
--------------------------------------------------------------------------------
/docs/omnibox.mov:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/docs/omnibox.mov
--------------------------------------------------------------------------------
/docs/searx.md:
--------------------------------------------------------------------------------
1 | Author: Fivefold
2 |
3 | ---
4 |
5 | **SearX/SearXNG support**
6 |
7 | This extension includes experimental support for self-hosted SearX/SearXNG instances. To work, your instance must follow either of these URL patterns: `*://*/search?*`, `*://*/search`
8 |
9 | Examples that work:
10 | - `https://search.mywebsite.com/search`
11 | - `https://search.mywebsite.com/search?q=searchTerm`
12 | - `http://mysearch.local/search`
13 |
14 | Examples that *don't* work:
15 | - `https://search.mywebsite.com/`
16 | - `http://mywebsite.com/searx/`
17 | - `http://mywebsite.com/searx/search`
18 |
19 | Also, nothing might be injected if you don't use the default "simple" theme.
20 |
21 | If you have the correct URL, you see a linkding injector box in other supported search engines (e.g. google) but not in your SearX instance, please see if someone already [mentioned your issue](https://github.com/Sevichecc/miniflux-injector/issues) on github and if not, [create an issue](https://github.com/Sevichecc/miniflux-injector/issues/new/choose).
22 |
--------------------------------------------------------------------------------
/icons/cog.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/icons/favicon.ico
--------------------------------------------------------------------------------
/icons/icon.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/icons/logo.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/icons/logo_128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/icons/logo_128.png
--------------------------------------------------------------------------------
/icons/logo_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/icons/logo_16.png
--------------------------------------------------------------------------------
/icons/logo_32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/icons/logo_32.png
--------------------------------------------------------------------------------
/icons/logo_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/icons/logo_48.png
--------------------------------------------------------------------------------
/icons/logo_96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sevi418/miniflux-injector/25dec6bf6a99e57508ff741c5d7ce6588f7680fb/icons/logo_96.png
--------------------------------------------------------------------------------
/icons/logo_full.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/icons/logo_full_google.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/icons/logo_small.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest_version": 2,
3 | "name": "Miniflux injector",
4 | "version": "2.3.3",
5 | "description": "Injects Miniflux search results into search pages like Google and Duckduckgo, SearXNG, Brave Search",
6 | "homepage_url": "https://github.com/Sevichecc/miniflux-injector.git",
7 | "icons": {
8 | "16": "icons/logo_16.png",
9 | "32": "icons/logo_32.png",
10 | "48": "icons/logo_48.png",
11 | "96": "icons/logo_96.png",
12 | "128": "icons/logo_128.png"
13 | },
14 | "background": {
15 | "scripts": [
16 | "build/background.js"
17 | ]
18 | },
19 | "omnibox": {
20 | "keyword": "mj"
21 | },
22 | "content_scripts": [
23 | {
24 | "matches": [
25 | "*://duckduckgo.com/*"
26 | ],
27 | "css": [
28 | "build/searchInjection.css"
29 | ],
30 | "js": [
31 | "build/searchInjection.js"
32 | ]
33 | },
34 | {
35 | "matches": [
36 | "*://kagi.com/*"
37 | ],
38 | "css": [
39 | "build/searchInjection.css"
40 | ],
41 | "js": [
42 | "build/searchInjection.js"
43 | ]
44 | },
45 | {
46 | "matches": [
47 | "*://search.brave.com/*"
48 | ],
49 | "css": [
50 | "build/searchInjection.css"
51 | ],
52 | "js": [
53 | "build/searchInjection.js"
54 | ]
55 | },
56 | {
57 | "matches": [
58 | "*://*/search?*",
59 | "*://*/search"
60 | ],
61 | "css": [
62 | "build/searchInjection.css"
63 | ],
64 | "js": [
65 | "build/searchInjection.js"
66 | ]
67 | },
68 | {
69 | "matches": [
70 | "*://*.google.com/*",
71 | "*://*.google.ad/*",
72 | "*://*.google.ae/*",
73 | "*://*.google.com.af/*",
74 | "*://*.google.com.ag/*",
75 | "*://*.google.com.ai/*",
76 | "*://*.google.al/*",
77 | "*://*.google.am/*",
78 | "*://*.google.co.ao/*",
79 | "*://*.google.com.ar/*",
80 | "*://*.google.as/*",
81 | "*://*.google.at/*",
82 | "*://*.google.com.au/*",
83 | "*://*.google.az/*",
84 | "*://*.google.ba/*",
85 | "*://*.google.com.bd/*",
86 | "*://*.google.be/*",
87 | "*://*.google.bf/*",
88 | "*://*.google.bg/*",
89 | "*://*.google.com.bh/*",
90 | "*://*.google.bi/*",
91 | "*://*.google.bj/*",
92 | "*://*.google.com.bn/*",
93 | "*://*.google.com.bo/*",
94 | "*://*.google.com.br/*",
95 | "*://*.google.bs/*",
96 | "*://*.google.bt/*",
97 | "*://*.google.co.bw/*",
98 | "*://*.google.by/*",
99 | "*://*.google.com.bz/*",
100 | "*://*.google.ca/*",
101 | "*://*.google.cd/*",
102 | "*://*.google.cf/*",
103 | "*://*.google.cg/*",
104 | "*://*.google.ch/*",
105 | "*://*.google.ci/*",
106 | "*://*.google.co.ck/*",
107 | "*://*.google.cl/*",
108 | "*://*.google.cm/*",
109 | "*://*.google.cn/*",
110 | "*://*.google.com.co/*",
111 | "*://*.google.co.cr/*",
112 | "*://*.google.com.cu/*",
113 | "*://*.google.cv/*",
114 | "*://*.google.com.cy/*",
115 | "*://*.google.cz/*",
116 | "*://*.google.de/*",
117 | "*://*.google.dj/*",
118 | "*://*.google.dk/*",
119 | "*://*.google.dm/*",
120 | "*://*.google.com.do/*",
121 | "*://*.google.dz/*",
122 | "*://*.google.com.ec/*",
123 | "*://*.google.ee/*",
124 | "*://*.google.com.eg/*",
125 | "*://*.google.es/*",
126 | "*://*.google.com.et/*",
127 | "*://*.google.fi/*",
128 | "*://*.google.com.fj/*",
129 | "*://*.google.fm/*",
130 | "*://*.google.fr/*",
131 | "*://*.google.ga/*",
132 | "*://*.google.ge/*",
133 | "*://*.google.gg/*",
134 | "*://*.google.com.gh/*",
135 | "*://*.google.com.gi/*",
136 | "*://*.google.gl/*",
137 | "*://*.google.gm/*",
138 | "*://*.google.gr/*",
139 | "*://*.google.com.gt/*",
140 | "*://*.google.gy/*",
141 | "*://*.google.com.hk/*",
142 | "*://*.google.hn/*",
143 | "*://*.google.hr/*",
144 | "*://*.google.ht/*",
145 | "*://*.google.hu/*",
146 | "*://*.google.co.id/*",
147 | "*://*.google.ie/*",
148 | "*://*.google.co.il/*",
149 | "*://*.google.im/*",
150 | "*://*.google.coIn/*",
151 | "*://*.google.iq/*",
152 | "*://*.google.is/*",
153 | "*://*.google.it/*",
154 | "*://*.google.je/*",
155 | "*://*.google.com.jm/*",
156 | "*://*.google.jo/*",
157 | "*://*.google.co.jp/*",
158 | "*://*.google.co.ke/*",
159 | "*://*.google.com.kh/*",
160 | "*://*.google.ki/*",
161 | "*://*.google.kg/*",
162 | "*://*.google.co.kr/*",
163 | "*://*.google.com.kw/*",
164 | "*://*.google.kz/*",
165 | "*://*.google.la/*",
166 | "*://*.google.com.lb/*",
167 | "*://*.google.li/*",
168 | "*://*.google.lk/*",
169 | "*://*.google.co.ls/*",
170 | "*://*.google.lt/*",
171 | "*://*.google.lu/*",
172 | "*://*.google.lv/*",
173 | "*://*.google.com.ly/*",
174 | "*://*.google.co.ma/*",
175 | "*://*.google.md/*",
176 | "*://*.google.me/*",
177 | "*://*.google.mg/*",
178 | "*://*.google.mk/*",
179 | "*://*.google.ml/*",
180 | "*://*.google.com.mm/*",
181 | "*://*.google.mn/*",
182 | "*://*.google.ms/*",
183 | "*://*.google.com.mt/*",
184 | "*://*.google.mu/*",
185 | "*://*.google.mv/*",
186 | "*://*.google.mw/*",
187 | "*://*.google.com.mx/*",
188 | "*://*.google.com.my/*",
189 | "*://*.google.co.mz/*",
190 | "*://*.google.com.na/*",
191 | "*://*.google.com.ng/*",
192 | "*://*.google.com.ni/*",
193 | "*://*.google.ne/*",
194 | "*://*.google.nl/*",
195 | "*://*.google.no/*",
196 | "*://*.google.com.np/*",
197 | "*://*.google.nr/*",
198 | "*://*.google.nu/*",
199 | "*://*.google.co.nz/*",
200 | "*://*.google.com.om/*",
201 | "*://*.google.com.pa/*",
202 | "*://*.google.com.pe/*",
203 | "*://*.google.com.pg/*",
204 | "*://*.google.com.ph/*",
205 | "*://*.google.com.pk/*",
206 | "*://*.google.pl/*",
207 | "*://*.google.pn/*",
208 | "*://*.google.com.pr/*",
209 | "*://*.google.ps/*",
210 | "*://*.google.pt/*",
211 | "*://*.google.com.py/*",
212 | "*://*.google.com.qa/*",
213 | "*://*.google.ro/*",
214 | "*://*.google.ru/*",
215 | "*://*.google.rw/*",
216 | "*://*.google.com.sa/*",
217 | "*://*.google.com.sb/*",
218 | "*://*.google.sc/*",
219 | "*://*.google.se/*",
220 | "*://*.google.com.sg/*",
221 | "*://*.google.sh/*",
222 | "*://*.google.si/*",
223 | "*://*.google.sk/*",
224 | "*://*.google.com.sl/*",
225 | "*://*.google.sn/*",
226 | "*://*.google.so/*",
227 | "*://*.google.sm/*",
228 | "*://*.google.sr/*",
229 | "*://*.google.st/*",
230 | "*://*.google.com.sv/*",
231 | "*://*.google.td/*",
232 | "*://*.google.tg/*",
233 | "*://*.google.co.th/*",
234 | "*://*.google.com.tj/*",
235 | "*://*.google.tl/*",
236 | "*://*.google.tm/*",
237 | "*://*.google.tn/*",
238 | "*://*.google.to/*",
239 | "*://*.google.com.tr/*",
240 | "*://*.google.tt/*",
241 | "*://*.google.com.tw/*",
242 | "*://*.google.co.tz/*",
243 | "*://*.google.com.ua/*",
244 | "*://*.google.co.ug/*",
245 | "*://*.google.co.uk/*",
246 | "*://*.google.com.uy/*",
247 | "*://*.google.co.uz/*",
248 | "*://*.google.com.vc/*",
249 | "*://*.google.co.ve/*",
250 | "*://*.google.vg/*",
251 | "*://*.google.co.vi/*",
252 | "*://*.google.com.vn/*",
253 | "*://*.google.vu/*",
254 | "*://*.google.ws/*",
255 | "*://*.google.rs/*",
256 | "*://*.google.co.za/*",
257 | "*://*.google.co.zm/*",
258 | "*://*.google.co.zw/*",
259 | "*://*.google.cat/*"
260 | ],
261 | "css": [
262 | "build/searchInjection.css"
263 | ],
264 | "js": [
265 | "build/searchInjection.js"
266 | ]
267 | }
268 | ],
269 | "options_ui": {
270 | "page": "options/index.html"
271 | },
272 | "web_accessible_resources": [
273 | "icons/*.png",
274 | "icons/*.svg"
275 | ],
276 | "permissions": [
277 | "https://*/*",
278 | "http://*/*",
279 | "storage"
280 | ]
281 | }
--------------------------------------------------------------------------------
/options/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Minilfux Extension Options
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/options/index.js:
--------------------------------------------------------------------------------
1 | var appTarget = document.getElementById("app");
2 | new miniflux.Options({ target: appTarget });
3 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "miniflux-injector",
3 | "version": "2.3.3",
4 | "description": "Injects Miniflux search results into search engine pages such as Google, DuckDuckGo, SearXNG and Brave Search, Kagi Search",
5 | "license": "MIT",
6 | "author": "SevicheCC, Jakob Essbüchl",
7 | "repository": {
8 | "type": "git",
9 | "url": "git+https://github.com/sevichecc/miniflux-injector.git"
10 | },
11 | "bugs": {
12 | "url": "https://github.com/sevichecc/miniflux-injector/issues"
13 | },
14 | "homepage": "https://github.com/sevichecc/miniflux-injector#readme",
15 | "scripts": {
16 | "build": "rollup -c && sass scss/theme.scss build/searchInjection.css",
17 | "dev": "rollup -c -w && sass scss/theme.scss build/searchInjection.css"
18 | },
19 | "dependencies": {
20 | "@rollup/plugin-commonjs": "^17.1.0",
21 | "@rollup/plugin-node-resolve": "^11.2.1",
22 | "rollup": "^2.79.1",
23 | "rollup-plugin-svelte": "^7.1.5",
24 | "rollup-plugin-terser": "^7.0.2",
25 | "spectre.css": "^0.5.9",
26 | "svelte": "^3.59.1"
27 | },
28 | "devDependencies": {
29 | "prettier": "^2.8.8",
30 | "web-ext": "^7.6.2"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import commonjs from "@rollup/plugin-commonjs";
2 | import resolve from "@rollup/plugin-node-resolve";
3 | import svelte from "rollup-plugin-svelte";
4 | import { terser } from "rollup-plugin-terser";
5 |
6 | const production = !process.env.ROLLUP_WATCH;
7 |
8 | export default [
9 | // Main bundle (options page)
10 | {
11 | input: "src/index.js",
12 | output: {
13 | sourcemap: true,
14 | format: "iife",
15 | name: "miniflux",
16 | file: "build/bundle.js",
17 | },
18 | plugins: [
19 | svelte({
20 | emitCss: false,
21 | }),
22 |
23 | // If you have external dependencies installed from
24 | // npm, you'll most likely need these plugins. In
25 | // some cases you'll need additional configuration —
26 | // consult the documentation for details:
27 | // https://github.com/rollup/rollup-plugin-commonjs
28 | resolve({
29 | browser: true,
30 | dedupe: (importee) =>
31 | importee === "svelte" || importee.startsWith("svelte/"),
32 | }),
33 | commonjs(),
34 |
35 | // If we're building for production (npm run build
36 | // instead of npm run dev), minify
37 | production && terser(),
38 | ],
39 | watch: {
40 | clearScreen: false,
41 | },
42 | },
43 | // Background bundle
44 | {
45 | input: "src/background.js",
46 | output: {
47 | sourcemap: true,
48 | format: "iife",
49 | file: "build/background.js",
50 | },
51 | plugins: [
52 | // If you have external dependencies installed from
53 | // npm, you'll most likely need these plugins. In
54 | // some cases you'll need additional configuration —
55 | // consult the documentation for details:
56 | // https://github.com/rollup/rollup-plugin-commonjs
57 | resolve({ browser: true }),
58 | commonjs(),
59 |
60 | // If we're building for production (npm run build
61 | // instead of npm run dev), minify
62 | production && terser(),
63 | ],
64 | watch: {
65 | clearScreen: false,
66 | },
67 | },
68 | // searchInjection bundle
69 | {
70 | input: "src/searchInjection.js",
71 | output: {
72 | sourcemap: true,
73 | format: "iife",
74 | file: "build/searchInjection.js",
75 | },
76 | plugins: [
77 | // If you have external dependencies installed from
78 | // npm, you'll most likely need these plugins. In
79 | // some cases you'll need additional configuration —
80 | // consult the documentation for details:
81 | // https://github.com/rollup/rollup-plugin-commonjs
82 | resolve({ browser: true }),
83 | commonjs(),
84 |
85 | // If we're building for production (npm run build
86 | // instead of npm run dev), minify
87 | production && terser(),
88 | ],
89 | watch: {
90 | clearScreen: false,
91 | },
92 | },
93 | ];
94 |
--------------------------------------------------------------------------------
/scss/bookmarks.scss:
--------------------------------------------------------------------------------
1 | ul#bookmark-list {
2 | list-style: none;
3 | margin: 0;
4 | padding: 0;
5 |
6 | li {
7 | margin-top: 0.4rem;
8 | }
9 |
10 | .description {
11 | color: $gray-color;
12 | a,
13 | a:visited:hover {
14 | color: $alternative-color;
15 | }
16 | }
17 |
18 | @media (prefers-color-scheme: dark) {
19 | &.dark,
20 | .dark-bg &:not(.light), // DuckDuckGo
21 | body[data-dt="1"] &:not(.light), // Google
22 | :root:not(.light) &:not(.light), // Brave Search
23 | html.theme-dark &:not(.light) // SearXNG
24 | {
25 | .description {
26 | color: $gray-color-dark;
27 | }
28 | }
29 | }
30 | }
31 |
32 | ul {
33 | list-style: none;
34 | }
35 |
--------------------------------------------------------------------------------
/scss/injectionBox.scss:
--------------------------------------------------------------------------------
1 | div#bookmark-list-container {
2 | text-wrap: balance;
3 | padding: 20px 22px;
4 | margin-bottom: 20px;
5 | border-radius: 8px;
6 | background-color: #fff;
7 | color: $primary-color;
8 |
9 | ul > li {
10 | margin-top: 0.4rem;
11 | display: flex;
12 | flex-direction: column;
13 | }
14 |
15 | a {
16 | color: $primary-color;
17 |
18 | :hover {
19 | color: $link-color-dark;
20 | cursor: pointer;
21 | }
22 | }
23 |
24 | // Basis elements
25 | #mf-title {
26 | color: $primary-color;
27 | :hover {
28 | color: $link-color;
29 | cursor: pointer;
30 | }
31 | }
32 |
33 | #more-links {
34 | text-align: center;
35 | a {
36 | color: $alternative-color-light-theme;
37 | :hover {
38 | cursor: pointer;
39 | }
40 | }
41 | }
42 |
43 | #error-message a,
44 | #error-message a:visited {
45 | color: $alternative-color !important;
46 | cursor: pointer;
47 | }
48 |
49 | #navbar {
50 | display: flex;
51 | flex-flow: row nowrap;
52 | justify-content: space-between;
53 | align-items: center;
54 | margin-bottom: 12px;
55 |
56 | #mf-logo {
57 | display: flex;
58 | align-items: center;
59 | font-size: 1.2rem;
60 |
61 | h1 {
62 | text-transform: uppercase;
63 | font-size: inherit;
64 | display: inline-block;
65 | margin: 0 0 0 8px;
66 | }
67 | img {
68 | width: auto;
69 | height: 22px;
70 | }
71 | }
72 |
73 | #mf-results_amount {
74 | color: $gray-color;
75 | span {
76 | color: $primary-color;
77 | }
78 | }
79 | }
80 | // duckduckgo-specific styles
81 | box-shadow: 0 2px 3px rgba(0, 0, 0, 0.06);
82 | border: 1px solid $duckduckgo-border-color;
83 |
84 | &.google {
85 | // google-specific styles
86 | width: 369px;
87 | box-sizing: border-box;
88 | box-shadow: none;
89 |
90 | h1 {
91 | font-size: 0.9em;
92 | }
93 |
94 | #navbar #mf-logo {
95 | width: 45%;
96 | }
97 | }
98 |
99 | &.brave {
100 | // brave-specific styles
101 | box-shadow: none;
102 | border: none;
103 | border-radius: 12px;
104 | font-size: 0.655rem;
105 |
106 | #navbar #mf-logo {
107 | flex: 1;
108 | width: 45%;
109 |
110 | img:not(.setup) {
111 | margin-inline-end: 1rem;
112 | }
113 | }
114 |
115 | h1 {
116 | font-size: 0.8em !important;
117 | }
118 | #mf-results_amount {
119 | flex: 1;
120 | }
121 | }
122 |
123 | &.searx {
124 | // searx-specific styles
125 | box-shadow: none;
126 | ul > li {
127 | margin-top: 1rem;
128 | gap: 4px;
129 | }
130 | }
131 |
132 |
133 | &.kagi { // kagi-specific styles
134 | font-size: .875rem;
135 | }
136 |
137 | // --------- dark styling start ---------
138 | @mixin dark-styling {
139 | background-color: $duckduckgo-bg;
140 | border: none;
141 | color: $primary-color-dark;
142 |
143 | a {
144 | color: $primary-color-dark;
145 | }
146 |
147 | #navbar #mf-results_amount span {
148 | color: $alternative-color !important;
149 | }
150 |
151 | #mf-title {
152 | color: $primary-color-dark;
153 | }
154 |
155 | #more-links > a {
156 | color: $alternative-color-dark-light-theme;
157 | }
158 |
159 | body[data-dt='1'] &:not(.light) {
160 | background-color: $google-bg;
161 | border: 1px solid $google-border-color-dark;
162 | }
163 |
164 | #mf-logo img {
165 | filter: invert(100%);
166 | }
167 |
168 | &.google:not(.light) {
169 | background-color: $google-bg;
170 | border: 1px solid $google-border-color-dark;
171 | }
172 |
173 | &.brave:not(.light) {
174 | background-color: $brave-bg;
175 | }
176 |
177 | &.searx:not(.light) {
178 | background-color: $searx-bg-dark;
179 | border: 1px solid $searx-border-color-dark;
180 | }
181 |
182 | &.kagi:not(.light) {
183 | background-color: $kagi-bg-dark;
184 | border: 1px solid $kagi-border-color-dark;
185 | }
186 | }
187 |
188 | /**
189 | .dark-bg is the class duckduckgo globally uses for the dark theme
190 | data-dt=1 is the attribute of the body tag google uses for the dark theme
191 | .dark is the class brave search globally uses for the dark theme
192 | .theme-dark is the class searx globally uses for the dark theme
193 | .theme_dark is the class kagi globally uses for the dark theme
194 |
195 | .light is added if the manual white theme is set and disables these dark
196 | styles, while .dark activates them regardless of global theme.
197 | */
198 | @media (prefers-color-scheme: dark) {
199 | &.dark,
200 | .dark-bg &:not(.light), // DuckDuckGo
201 | body[data-dt="1"] &:not(.light), // Google
202 | :root:not(.light) body.is-pc &:not(.light), // Brave Search
203 | html.theme-dark &:not(.light), // Searx
204 | html.theme_dark &:not(.light) // Kagi
205 | {
206 | @include dark-styling;
207 | }
208 | }
209 | }
210 |
--------------------------------------------------------------------------------
/scss/theme.scss:
--------------------------------------------------------------------------------
1 | // Import custom variables
2 | @import "variables";
3 |
4 | // Import style modules
5 | @import "injectionBox";
6 | @import "bookmarks";
7 |
--------------------------------------------------------------------------------
/scss/variables.scss:
--------------------------------------------------------------------------------
1 | $html-font-size: 18px !default;
2 |
3 | $body-bg: #161822 !default;
4 | $bg-color: lighten($body-bg, 5%) !default;
5 | $bg-color-light: lighten($body-bg, 5%) !default;
6 |
7 | $border-color: #4c4e53 !default;
8 | $border-color-dark: $border-color !default;
9 |
10 | $body-font-color: #b5bec8 !default;
11 | $light-color: #fafafa !default;
12 |
13 | $gray-color: #7f879b !default;
14 | $gray-color-dark: lighten($gray-color, 20%) !default;
15 |
16 | $primary-color: #a8b1ff !default;
17 | $primary-color-dark: saturate($primary-color, 5%) !default;
18 | $secondary-color: lighten($body-bg, 10%) !default;
19 |
20 | $link-color: $primary-color !default;
21 | $link-color-dark: darken($link-color, 5%) !default;
22 | $link-color-light: $link-color !default;
23 |
24 | $alternative-color: #59bdb9;
25 | $alternative-color-dark: #73f1eb;
26 |
27 | /* Dark theme specific */
28 | $dt-primary-button-color: #5761cb !default;
29 |
30 | /* Custom additions to miniflux variables */
31 | $alternative-color-light-theme: #05a6a3;
32 | $alternative-color-dark-light-theme: darken($alternative-color, 5%);
33 |
34 | $duckduckgo-bg: #282828;
35 | $duckduckgo-border-color: #dfe1e5;
36 |
37 | $google-bg: #202124;
38 | $google-border-color-dark: #3c4043;
39 |
40 | $brave-bg: #1e2028;
41 |
42 | $searx-bg-dark: #202124;
43 | $searx-border-color-dark: #3c4043;
44 |
45 |
46 | $kagi-bg: #282828;
47 | $kagi-border-color: #dfe1e5;
48 |
49 | $kagi-bg-dark: #262837;
50 | $kagi-border-color-dark: rgba(229, 229, 229, 0.2);
51 |
52 | $primary-color: #5755d9;
53 |
--------------------------------------------------------------------------------
/src/background.js:
--------------------------------------------------------------------------------
1 | import { getBrowser, openOptions } from "./browser";
2 | import { getConfiguration, isConfigurationComplete } from "./configuration";
3 |
4 | import { MinifluxApi } from "./miniflux";
5 |
6 | const browser = getBrowser();
7 | let api = null;
8 | let configuration = null;
9 | let hasCompleteConfiguration = false;
10 |
11 | // Omnibox
12 | browser.omnibox.onInputStarted.addListener(async () => {
13 | configuration = await getConfiguration();
14 | hasCompleteConfiguration = await isConfigurationComplete();
15 | const description = hasCompleteConfiguration
16 | ? "Search bookmarks in Miniflux"
17 | : "⚠️ Please configure the Miniflux-injector extension first";
18 |
19 | browser.omnibox.setDefaultSuggestion({ description });
20 |
21 | api = hasCompleteConfiguration ? new MinifluxApi(configuration) : null;
22 |
23 | });
24 |
25 | browser.omnibox.onInputChanged.addListener(async (text, suggest) => {
26 | if (!api) return;
27 |
28 | let config = await getConfiguration();
29 |
30 | api
31 | .search(text, { limit: config.resultNum })
32 | .then(async (entries) => {
33 | const entrySuggestions = await Promise.all(
34 | entries.map(async (entry) => ({
35 | content: config.toMiniflux
36 | ? await api.getMinifluxUrl(entry.id)
37 | : entry.url,
38 | description: entry.title,
39 | }))
40 | );
41 | await suggest(entrySuggestions);
42 | })
43 | .catch((error) => {
44 | console.error(error);
45 | });
46 | });
47 |
48 | browser.omnibox.onInputEntered.addListener((content, disposition) => {
49 | if (!hasCompleteConfiguration || !content) {
50 | return;
51 | }
52 |
53 | const isUrl = /^http(s)?:\/\//.test(content);
54 | const url = isUrl
55 | ? content
56 | : `${configuration.baseUrl}/search?q=${encodeURIComponent(content)}`;
57 |
58 | switch (disposition) {
59 | case "currentTab":
60 | browser.tabs.update({ url });
61 | break;
62 | case "newForegroundTab":
63 | browser.tabs.create({ url });
64 | break;
65 | case "newBackgroundTab":
66 | browser.tabs.create({ url, active: false });
67 | break;
68 | }
69 | });
70 |
71 | // Connection to search injection content script
72 | let portFromCS;
73 |
74 | function connected(p) {
75 | portFromCS = p;
76 |
77 | // When the content script sends the search term, search on miniflux and
78 | // return results
79 | portFromCS.onMessage.addListener(async function (m) {
80 | if (m.action == "openOptions") {
81 | // Open the add on options if the user clicks on the options link in the
82 | // injected box
83 | openOptions();
84 | } else if (!(await isConfigurationComplete())) {
85 | portFromCS.postMessage({
86 | message:
87 | "Connection to your Miniflux instance is not configured yet! " +
88 | "Please configure the extension in the options.",
89 | });
90 | } else {
91 | let config = await getConfiguration();
92 | api = new MinifluxApi(config);
93 | // Configuration is complete, execute a search on miniflux
94 | api
95 | .search(m.searchTerm, { limit: config.resultNum })
96 | .then(async (entries) => {
97 | const entrySuggestions = await Promise.all(
98 | entries.map(async (entry) => ({
99 | url: config.toMiniflux
100 | ? await api.getMinifluxUrl(entry.id)
101 | : entry.url,
102 | title: entry.title || entry.url,
103 | author: entry.feed.title,
104 | id: entry.id,
105 | }))
106 | );
107 | await portFromCS.postMessage({
108 | results: entrySuggestions,
109 | config: config,
110 | });
111 | })
112 | .catch((error) => {
113 | console.error(error);
114 | });
115 | }
116 | });
117 | }
118 | browser.runtime.onConnect.addListener(connected);
119 |
--------------------------------------------------------------------------------
/src/browser.js:
--------------------------------------------------------------------------------
1 | export function isChrome() {
2 | return typeof chrome !== "undefined";
3 | }
4 |
5 | export function getBrowser() {
6 | return isChrome() ? chrome : browser;
7 | }
8 |
9 | export function getStorage() {
10 | if (
11 | typeof browser !== "undefined" &&
12 | typeof browser.storage !== "undefined"
13 | ) {
14 | return browser.storage.local;
15 | } else if (
16 | typeof chrome !== "undefined" &&
17 | typeof chrome.storage !== "undefined"
18 | ) {
19 | return chrome.storage.local;
20 | } else {
21 | throw new Error("Storage API not found.");
22 | }
23 | }
24 |
25 | export function openOptions() {
26 | getBrowser().runtime.openOptionsPage();
27 | //window.close();
28 | /*
29 | keeping window.close() introduces a bug in chrome if the options page is
30 | opened and closed without saving options. The background script port closes
31 | seemingly indefinitely. The extension needs to be reloaded to fix it.
32 |
33 | Since miniflux injector does not use the svelte popup from miniflux extension
34 | window.close can be safely omitted because there's no window to close
35 | */
36 | }
37 |
--------------------------------------------------------------------------------
/src/configuration.js:
--------------------------------------------------------------------------------
1 | import { getStorage } from "./browser";
2 |
3 | const CONFIG_KEY = "mf_ext_config";
4 |
5 | export const getConfiguration = async () => {
6 | return new Promise((resolve) => {
7 | getStorage().get(CONFIG_KEY, (data) => {
8 | const config = JSON.parse(data[CONFIG_KEY] || {});
9 | resolve(config);
10 | });
11 | });
12 | };
13 |
14 | export const saveConfiguration = async (config) => {
15 | const configJson = JSON.stringify(config);
16 | await getStorage().set({ [CONFIG_KEY]: configJson });
17 | };
18 |
19 | export const isConfigurationComplete = async () => {
20 | const { baseUrl, token } = await getConfiguration();
21 | return !!baseUrl && !!token;
22 | };
23 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import Options from "./options.svelte";
2 |
3 | export default {
4 | Options,
5 | };
6 |
--------------------------------------------------------------------------------
/src/miniflux.js:
--------------------------------------------------------------------------------
1 | export class MinifluxApi {
2 | constructor(configuration) {
3 | this.configuration = configuration
4 | }
5 |
6 | async fetchWithHeaders(url) {
7 | const { token } = this.configuration
8 | const headers = {
9 | 'X-Auth-Token': token,
10 | }
11 | return fetch(url, { headers })
12 | }
13 |
14 | async search(text, options) {
15 | const { baseUrl } = this.configuration
16 | const q = encodeURIComponent(text)
17 | const limit = options.limit
18 |
19 | const url = `${baseUrl}/v1/entries?search=${q}${
20 | limit ? `&limit=${limit}` : ''
21 | }`
22 |
23 | const response = await this.fetchWithHeaders(url)
24 |
25 | if (response.status === 200) {
26 | const data = await response.json()
27 | return data.entries
28 | }
29 |
30 | throw new Error(`Error searching bookmarks: ${response.statusText}`)
31 | }
32 |
33 | async testConnection() {
34 | const { baseUrl } = this.configuration
35 | const url = `${baseUrl}/v1/entries?limit=1`
36 |
37 | const response = await this.fetchWithHeaders(url)
38 |
39 | if (response.status === 200) {
40 | const data = await response.json()
41 | return !!data.entries
42 | }
43 |
44 | return false
45 | }
46 |
47 | async getMinifluxUrl(id) {
48 | const { baseUrl } = this.configuration
49 | const url = `${baseUrl}/v1/entries/${id}`
50 |
51 | const response = await this.fetchWithHeaders(url)
52 |
53 | if (response.status !== 200) {
54 | throw new Error('Failed to fetch URL')
55 | }
56 |
57 | const { status } = await response.json()
58 | return `${baseUrl}/${status === 'read' ? 'history' : status}/entry/${id}`
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/options.svelte:
--------------------------------------------------------------------------------
1 |
83 |
84 | Configuration
85 |
86 |
271 |
272 |
283 |
--------------------------------------------------------------------------------
/src/searchInjection.js:
--------------------------------------------------------------------------------
1 | function isChrome() {
2 | return typeof chrome !== 'undefined';
3 | }
4 |
5 | function getBrowser() {
6 | return isChrome() ? chrome : browser;
7 | }
8 |
9 | /* Sanitise input to prevent unwanted injection of html or even javascript
10 | through miniflux search results, e.g. in the bookmark title or description
11 | */
12 | function escapeHTML(str) {
13 | let p = document.createElement('p');
14 | p.appendChild(document.createTextNode(str));
15 | return p.innerHTML;
16 | }
17 |
18 | const browser = getBrowser();
19 |
20 | const port = browser.runtime.connect({ name: 'port-from-cs' });
21 | let searchEngine;
22 | if (document.location.hostname.match(/duckduckgo/)) {
23 | searchEngine = 'duckduckgo';
24 | } else if (document.location.hostname.match(/google/)) {
25 | searchEngine = 'google';
26 | } else if (document.location.hostname.match(/search\.brave\.com/)) {
27 | searchEngine = 'brave';
28 | } else if (document.location.hostname.match(/kagi\.com/)) {
29 | searchEngine = 'kagi';
30 | } else if (document.location.href.match(/http.?:\/\/.+\/search/)) {
31 | searchEngine = 'searx';
32 | } else {
33 | console.debug('Miniflux-Injector extension: no search engine found.');
34 | }
35 |
36 | // When background script answers with results, construct html for the result box
37 | port.onMessage.addListener(function (m) {
38 | const parser = new DOMParser();
39 | let themeClass;
40 | let htmlString = '';
41 | let html;
42 |
43 | // In case we don't get results, but a message from the background script,
44 | // display it. This is the case before proper configuration
45 | if ('message' in m) {
46 | htmlString = `
47 |
48 |
59 |
60 | ${m.message}
61 |
62 |
63 | `;
64 |
65 | // Convert the above string into a DOM document
66 | }
67 | // If there is no message and there are actual results display them
68 | else if (m.results.length > 0) {
69 | // If the theme for a search engine is not set to auto, we need to add
70 | // specific CSS classes
71 | // Get the theme configuration
72 | const themes = {
73 | duckduckgo: m.config.themeDuckduckgo,
74 | google: m.config.themeGoogle,
75 | brave: m.config.themeBrave,
76 | searx: m.config.themeSearx,
77 | kagi: m.config.themeKagi,
78 | };
79 |
80 | const theme = themes[searchEngine];
81 |
82 | if (theme == 'auto') {
83 | themeClass = ''; // automatic theme detection
84 | } else {
85 | themeClass = theme; // "dark" for dark theme, "light" for light theme
86 | }
87 |
88 | // URL of the configured miniflux instance (including search term)
89 | let minifluxUrl =
90 | m.config.baseUrl +
91 | (searchTerm.length > 0 ? `/search?q=${searchTerm}` : '/');
92 |
93 | htmlString += `
94 |
95 |
96 |
97 |
102 |
103 |
104 | Found ${m.results.length} ${
105 | m.results.length == 1 ? 'result' : 'results'
106 | }.
107 |
108 |
109 |
112 |
113 |
114 | `;
115 |
116 | htmlString += `
137 |
140 |
141 | `;
142 | } else {
143 | console.error('miniflux injector: no message and no search results');
144 | return;
145 | }
146 |
147 | // Finding the sidebar
148 |
149 | const sidebarSelectors = {
150 | duckduckgo: 'section[data-area=sidebar]',
151 | google: '#rhs',
152 | brave: '#side-right',
153 | searx: '#sidebar',
154 | kagi: '.right-content-box',
155 | };
156 | const sidebarSelector = sidebarSelectors[searchEngine];
157 | let sidebar = document.querySelector(sidebarSelector);
158 |
159 | // Google completely omits the sidebar container if there is no content.
160 | // We need to add it manually before injection
161 | if (searchEngine === 'google' && sidebar === null) {
162 | let sidebarContainerString = `
163 | `;
164 | let sidebarContainer = parser.parseFromString(
165 | sidebarContainerString,
166 | 'text/html'
167 | );
168 | let container = document.querySelector('#rcnt');
169 | container.appendChild(sidebarContainer.body.querySelector('div'));
170 | sidebar = document.querySelector('#rhs');
171 | }
172 |
173 | // Convert the html string into a DOM document
174 | html = parser.parseFromString(htmlString, 'text/html');
175 | // The actual injection
176 | if (!document.querySelector('#bookmark-list-container')) {
177 | sidebar.prepend(html.body.querySelector('div'));
178 | }
179 |
180 | // Event listeners for opening the extension options. These can only be opened
181 | // by the background script, so we need to send a message to it
182 | document.querySelectorAll('.openOptions').forEach((el) => {
183 | el.addEventListener('click', () => {
184 | port.postMessage({ action: 'openOptions' });
185 | });
186 | });
187 | });
188 |
189 | // Start the search by sending a message to background.js with the search term
190 | let queryString = location.search;
191 | let urlParams = new URLSearchParams(queryString);
192 | let searchTerm = escapeHTML(urlParams.get('q'));
193 | if (searchEngine === 'searx') {
194 | searchTerm = escapeHTML(document.querySelector('input#q').value);
195 | }
196 |
197 | port.postMessage({ searchTerm: searchTerm });
198 |
--------------------------------------------------------------------------------
/styles/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 16px;
3 | min-width: 400px;
4 | }
--------------------------------------------------------------------------------
/styles/spectre-exp.css:
--------------------------------------------------------------------------------
1 | /*! Spectre.css Experimentals v0.5.9 | MIT License | github.com/picturepan2/spectre */
2 | .form-autocomplete {
3 | position: relative;
4 | }
5 |
6 | .form-autocomplete .form-autocomplete-input {
7 | align-content: flex-start;
8 | display: -ms-flexbox;
9 | display: flex;
10 | -ms-flex-line-pack: start;
11 | -ms-flex-wrap: wrap;
12 | flex-wrap: wrap;
13 | height: auto;
14 | min-height: 1.6rem;
15 | padding: .1rem;
16 | }
17 |
18 | .form-autocomplete .form-autocomplete-input.is-focused {
19 | border-color: #5755d9;
20 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
21 | }
22 |
23 | .form-autocomplete .form-autocomplete-input .form-input {
24 | border-color: transparent;
25 | box-shadow: none;
26 | display: inline-block;
27 | -ms-flex: 1 0 auto;
28 | flex: 1 0 auto;
29 | height: 1.2rem;
30 | line-height: .8rem;
31 | margin: .1rem;
32 | width: auto;
33 | }
34 |
35 | .form-autocomplete .menu {
36 | left: 0;
37 | position: absolute;
38 | top: 100%;
39 | width: 100%;
40 | }
41 |
42 | .form-autocomplete.autocomplete-oneline .form-autocomplete-input {
43 | -ms-flex-wrap: nowrap;
44 | flex-wrap: nowrap;
45 | overflow-x: auto;
46 | }
47 |
48 | .form-autocomplete.autocomplete-oneline .chip {
49 | -ms-flex: 1 0 auto;
50 | flex: 1 0 auto;
51 | }
52 |
53 | .calendar {
54 | border: .05rem solid #dadee4;
55 | border-radius: .1rem;
56 | display: block;
57 | min-width: 280px;
58 | }
59 |
60 | .calendar .calendar-nav {
61 | align-items: center;
62 | background: #f7f8f9;
63 | border-top-left-radius: .1rem;
64 | border-top-right-radius: .1rem;
65 | display: -ms-flexbox;
66 | display: flex;
67 | -ms-flex-align: center;
68 | font-size: .9rem;
69 | padding: .4rem;
70 | }
71 |
72 | .calendar .calendar-header,
73 | .calendar .calendar-body {
74 | display: -ms-flexbox;
75 | display: flex;
76 | -ms-flex-pack: center;
77 | -ms-flex-wrap: wrap;
78 | flex-wrap: wrap;
79 | justify-content: center;
80 | padding: .4rem 0;
81 | }
82 |
83 | .calendar .calendar-header .calendar-date,
84 | .calendar .calendar-body .calendar-date {
85 | -ms-flex: 0 0 14.28%;
86 | flex: 0 0 14.28%;
87 | max-width: 14.28%;
88 | }
89 |
90 | .calendar .calendar-header {
91 | background: #f7f8f9;
92 | border-bottom: .05rem solid #dadee4;
93 | color: #bcc3ce;
94 | font-size: .7rem;
95 | text-align: center;
96 | }
97 |
98 | .calendar .calendar-body {
99 | color: #66758c;
100 | }
101 |
102 | .calendar .calendar-date {
103 | border: 0;
104 | padding: .2rem;
105 | }
106 |
107 | .calendar .calendar-date .date-item {
108 | -webkit-appearance: none;
109 | -moz-appearance: none;
110 | appearance: none;
111 | background: transparent;
112 | border: .05rem solid transparent;
113 | border-radius: 50%;
114 | color: #66758c;
115 | cursor: pointer;
116 | font-size: .7rem;
117 | height: 1.4rem;
118 | line-height: 1rem;
119 | outline: none;
120 | padding: .1rem;
121 | position: relative;
122 | text-align: center;
123 | text-decoration: none;
124 | transition: background .2s, border .2s, box-shadow .2s, color .2s;
125 | vertical-align: middle;
126 | white-space: nowrap;
127 | width: 1.4rem;
128 | }
129 |
130 | .calendar .calendar-date .date-item.date-today {
131 | border-color: #e5e5f9;
132 | color: #5755d9;
133 | }
134 |
135 | .calendar .calendar-date .date-item:focus {
136 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
137 | }
138 |
139 | .calendar .calendar-date .date-item:focus,
140 | .calendar .calendar-date .date-item:hover {
141 | background: #fefeff;
142 | border-color: #e5e5f9;
143 | color: #5755d9;
144 | text-decoration: none;
145 | }
146 |
147 | .calendar .calendar-date .date-item:active,
148 | .calendar .calendar-date .date-item.active {
149 | background: #4b48d6;
150 | border-color: #3634d2;
151 | color: #fff;
152 | }
153 |
154 | .calendar .calendar-date .date-item.badge::after {
155 | position: absolute;
156 | right: 3px;
157 | top: 3px;
158 | transform: translate(50%, -50%);
159 | }
160 |
161 | .calendar .calendar-date .date-item:disabled,
162 | .calendar .calendar-date .date-item.disabled,
163 | .calendar .calendar-date .calendar-event:disabled,
164 | .calendar .calendar-date .calendar-event.disabled {
165 | cursor: default;
166 | opacity: .25;
167 | pointer-events: none;
168 | }
169 |
170 | .calendar .calendar-date.prev-month .date-item,
171 | .calendar .calendar-date.prev-month .calendar-event,
172 | .calendar .calendar-date.next-month .date-item,
173 | .calendar .calendar-date.next-month .calendar-event {
174 | opacity: .25;
175 | }
176 |
177 | .calendar .calendar-range {
178 | position: relative;
179 | }
180 |
181 | .calendar .calendar-range::before {
182 | background: #f1f1fc;
183 | content: "";
184 | height: 1.4rem;
185 | left: 0;
186 | position: absolute;
187 | right: 0;
188 | top: 50%;
189 | transform: translateY(-50%);
190 | }
191 |
192 | .calendar .calendar-range.range-start::before {
193 | left: 50%;
194 | }
195 |
196 | .calendar .calendar-range.range-end::before {
197 | right: 50%;
198 | }
199 |
200 | .calendar .calendar-range.range-start .date-item,
201 | .calendar .calendar-range.range-end .date-item {
202 | background: #4b48d6;
203 | border-color: #3634d2;
204 | color: #fff;
205 | }
206 |
207 | .calendar .calendar-range .date-item {
208 | color: #5755d9;
209 | }
210 |
211 | .calendar.calendar-lg .calendar-body {
212 | padding: 0;
213 | }
214 |
215 | .calendar.calendar-lg .calendar-body .calendar-date {
216 | border-bottom: .05rem solid #dadee4;
217 | border-right: .05rem solid #dadee4;
218 | display: -ms-flexbox;
219 | display: flex;
220 | -ms-flex-direction: column;
221 | flex-direction: column;
222 | height: 5.5rem;
223 | padding: 0;
224 | }
225 |
226 | .calendar.calendar-lg .calendar-body .calendar-date:nth-child(7n) {
227 | border-right: 0;
228 | }
229 |
230 | .calendar.calendar-lg .calendar-body .calendar-date:nth-last-child(-n+7) {
231 | border-bottom: 0;
232 | }
233 |
234 | .calendar.calendar-lg .date-item {
235 | align-self: flex-end;
236 | -ms-flex-item-align: end;
237 | height: 1.4rem;
238 | margin-right: .2rem;
239 | margin-top: .2rem;
240 | }
241 |
242 | .calendar.calendar-lg .calendar-range::before {
243 | top: 19px;
244 | }
245 |
246 | .calendar.calendar-lg .calendar-range.range-start::before {
247 | left: auto;
248 | width: 19px;
249 | }
250 |
251 | .calendar.calendar-lg .calendar-range.range-end::before {
252 | right: 19px;
253 | }
254 |
255 | .calendar.calendar-lg .calendar-events {
256 | flex-grow: 1;
257 | -ms-flex-positive: 1;
258 | line-height: 1;
259 | overflow-y: auto;
260 | padding: .2rem;
261 | }
262 |
263 | .calendar.calendar-lg .calendar-event {
264 | border-radius: .1rem;
265 | display: block;
266 | font-size: .7rem;
267 | margin: .1rem auto;
268 | overflow: hidden;
269 | padding: 3px 4px;
270 | text-overflow: ellipsis;
271 | white-space: nowrap;
272 | }
273 |
274 | .carousel .carousel-locator:nth-of-type(1):checked ~ .carousel-container .carousel-item:nth-of-type(1),
275 | .carousel .carousel-locator:nth-of-type(2):checked ~ .carousel-container .carousel-item:nth-of-type(2),
276 | .carousel .carousel-locator:nth-of-type(3):checked ~ .carousel-container .carousel-item:nth-of-type(3),
277 | .carousel .carousel-locator:nth-of-type(4):checked ~ .carousel-container .carousel-item:nth-of-type(4),
278 | .carousel .carousel-locator:nth-of-type(5):checked ~ .carousel-container .carousel-item:nth-of-type(5),
279 | .carousel .carousel-locator:nth-of-type(6):checked ~ .carousel-container .carousel-item:nth-of-type(6),
280 | .carousel .carousel-locator:nth-of-type(7):checked ~ .carousel-container .carousel-item:nth-of-type(7),
281 | .carousel .carousel-locator:nth-of-type(8):checked ~ .carousel-container .carousel-item:nth-of-type(8) {
282 | animation: carousel-slidein .75s ease-in-out 1;
283 | opacity: 1;
284 | z-index: 100;
285 | }
286 |
287 | .carousel .carousel-locator:nth-of-type(1):checked ~ .carousel-nav .nav-item:nth-of-type(1),
288 | .carousel .carousel-locator:nth-of-type(2):checked ~ .carousel-nav .nav-item:nth-of-type(2),
289 | .carousel .carousel-locator:nth-of-type(3):checked ~ .carousel-nav .nav-item:nth-of-type(3),
290 | .carousel .carousel-locator:nth-of-type(4):checked ~ .carousel-nav .nav-item:nth-of-type(4),
291 | .carousel .carousel-locator:nth-of-type(5):checked ~ .carousel-nav .nav-item:nth-of-type(5),
292 | .carousel .carousel-locator:nth-of-type(6):checked ~ .carousel-nav .nav-item:nth-of-type(6),
293 | .carousel .carousel-locator:nth-of-type(7):checked ~ .carousel-nav .nav-item:nth-of-type(7),
294 | .carousel .carousel-locator:nth-of-type(8):checked ~ .carousel-nav .nav-item:nth-of-type(8) {
295 | color: #f7f8f9;
296 | }
297 |
298 | .carousel {
299 | background: #f7f8f9;
300 | display: block;
301 | overflow: hidden;
302 | -webkit-overflow-scrolling: touch;
303 | position: relative;
304 | width: 100%;
305 | z-index: 1;
306 | }
307 |
308 | .carousel .carousel-container {
309 | height: 100%;
310 | left: 0;
311 | position: relative;
312 | }
313 |
314 | .carousel .carousel-container::before {
315 | content: "";
316 | display: block;
317 | padding-bottom: 56.25%;
318 | }
319 |
320 | .carousel .carousel-container .carousel-item {
321 | animation: carousel-slideout 1s ease-in-out 1;
322 | height: 100%;
323 | left: 0;
324 | margin: 0;
325 | opacity: 0;
326 | position: absolute;
327 | top: 0;
328 | width: 100%;
329 | }
330 |
331 | .carousel .carousel-container .carousel-item:hover .item-prev,
332 | .carousel .carousel-container .carousel-item:hover .item-next {
333 | opacity: 1;
334 | }
335 |
336 | .carousel .carousel-container .item-prev,
337 | .carousel .carousel-container .item-next {
338 | background: rgba(247, 248, 249, .25);
339 | border-color: rgba(247, 248, 249, .5);
340 | color: #f7f8f9;
341 | opacity: 0;
342 | position: absolute;
343 | top: 50%;
344 | transform: translateY(-50%);
345 | transition: all .4s;
346 | z-index: 100;
347 | }
348 |
349 | .carousel .carousel-container .item-prev {
350 | left: 1rem;
351 | }
352 |
353 | .carousel .carousel-container .item-next {
354 | right: 1rem;
355 | }
356 |
357 | .carousel .carousel-nav {
358 | bottom: .4rem;
359 | display: -ms-flexbox;
360 | display: flex;
361 | -ms-flex-pack: center;
362 | justify-content: center;
363 | left: 50%;
364 | position: absolute;
365 | transform: translateX(-50%);
366 | width: 10rem;
367 | z-index: 100;
368 | }
369 |
370 | .carousel .carousel-nav .nav-item {
371 | color: rgba(247, 248, 249, .5);
372 | display: block;
373 | -ms-flex: 1 0 auto;
374 | flex: 1 0 auto;
375 | height: 1.6rem;
376 | margin: .2rem;
377 | max-width: 2.5rem;
378 | position: relative;
379 | }
380 |
381 | .carousel .carousel-nav .nav-item::before {
382 | background: currentColor;
383 | content: "";
384 | display: block;
385 | height: .1rem;
386 | position: absolute;
387 | top: .5rem;
388 | width: 100%;
389 | }
390 |
391 | @keyframes carousel-slidein {
392 | 0% {
393 | transform: translateX(100%);
394 | }
395 | 100% {
396 | transform: translateX(0);
397 | }
398 | }
399 |
400 | @keyframes carousel-slideout {
401 | 0% {
402 | opacity: 1;
403 | transform: translateX(0);
404 | }
405 | 100% {
406 | opacity: 1;
407 | transform: translateX(-50%);
408 | }
409 | }
410 |
411 | .comparison-slider {
412 | height: 50vh;
413 | overflow: hidden;
414 | -webkit-overflow-scrolling: touch;
415 | position: relative;
416 | width: 100%;
417 | }
418 |
419 | .comparison-slider .comparison-before,
420 | .comparison-slider .comparison-after {
421 | height: 100%;
422 | left: 0;
423 | margin: 0;
424 | overflow: hidden;
425 | position: absolute;
426 | top: 0;
427 | }
428 |
429 | .comparison-slider .comparison-before img,
430 | .comparison-slider .comparison-after img {
431 | height: 100%;
432 | object-fit: cover;
433 | object-position: left center;
434 | position: absolute;
435 | width: 100%;
436 | }
437 |
438 | .comparison-slider .comparison-before {
439 | width: 100%;
440 | z-index: 1;
441 | }
442 |
443 | .comparison-slider .comparison-before .comparison-label {
444 | right: .8rem;
445 | }
446 |
447 | .comparison-slider .comparison-after {
448 | max-width: 100%;
449 | min-width: 0;
450 | z-index: 2;
451 | }
452 |
453 | .comparison-slider .comparison-after::before {
454 | background: transparent;
455 | content: "";
456 | cursor: default;
457 | height: 100%;
458 | left: 0;
459 | position: absolute;
460 | right: .8rem;
461 | top: 0;
462 | z-index: 1;
463 | }
464 |
465 | .comparison-slider .comparison-after::after {
466 | background: currentColor;
467 | border-radius: 50%;
468 | box-shadow: 0 -5px, 0 5px;
469 | color: #fff;
470 | content: "";
471 | height: 3px;
472 | pointer-events: none;
473 | position: absolute;
474 | right: .4rem;
475 | top: 50%;
476 | transform: translate(50%, -50%);
477 | width: 3px;
478 | }
479 |
480 | .comparison-slider .comparison-after .comparison-label {
481 | left: .8rem;
482 | }
483 |
484 | .comparison-slider .comparison-resizer {
485 | animation: first-run 1.5s 1 ease-in-out;
486 | cursor: ew-resize;
487 | height: .8rem;
488 | left: 0;
489 | max-width: 100%;
490 | min-width: .8rem;
491 | opacity: 0;
492 | outline: none;
493 | position: relative;
494 | resize: horizontal;
495 | top: 50%;
496 | transform: translateY(-50%) scaleY(30);
497 | width: 0;
498 | }
499 |
500 | .comparison-slider .comparison-label {
501 | background: rgba(48, 55, 66, .5);
502 | bottom: .8rem;
503 | color: #fff;
504 | padding: .2rem .4rem;
505 | position: absolute;
506 | -webkit-user-select: none;
507 | -moz-user-select: none;
508 | -ms-user-select: none;
509 | user-select: none;
510 | }
511 |
512 | @keyframes first-run {
513 | 0% {
514 | width: 0;
515 | }
516 | 25% {
517 | width: 2.4rem;
518 | }
519 | 50% {
520 | width: .8rem;
521 | }
522 | 75% {
523 | width: 1.2rem;
524 | }
525 | 100% {
526 | width: 0;
527 | }
528 | }
529 |
530 | .filter .filter-tag#tag-0:checked ~ .filter-nav .chip[for="tag-0"],
531 | .filter .filter-tag#tag-1:checked ~ .filter-nav .chip[for="tag-1"],
532 | .filter .filter-tag#tag-2:checked ~ .filter-nav .chip[for="tag-2"],
533 | .filter .filter-tag#tag-3:checked ~ .filter-nav .chip[for="tag-3"],
534 | .filter .filter-tag#tag-4:checked ~ .filter-nav .chip[for="tag-4"],
535 | .filter .filter-tag#tag-5:checked ~ .filter-nav .chip[for="tag-5"],
536 | .filter .filter-tag#tag-6:checked ~ .filter-nav .chip[for="tag-6"],
537 | .filter .filter-tag#tag-7:checked ~ .filter-nav .chip[for="tag-7"],
538 | .filter .filter-tag#tag-8:checked ~ .filter-nav .chip[for="tag-8"] {
539 | background: #5755d9;
540 | color: #fff;
541 | }
542 |
543 | .filter .filter-tag#tag-1:checked ~ .filter-body .filter-item:not([data-tag~="tag-1"]),
544 | .filter .filter-tag#tag-2:checked ~ .filter-body .filter-item:not([data-tag~="tag-2"]),
545 | .filter .filter-tag#tag-3:checked ~ .filter-body .filter-item:not([data-tag~="tag-3"]),
546 | .filter .filter-tag#tag-4:checked ~ .filter-body .filter-item:not([data-tag~="tag-4"]),
547 | .filter .filter-tag#tag-5:checked ~ .filter-body .filter-item:not([data-tag~="tag-5"]),
548 | .filter .filter-tag#tag-6:checked ~ .filter-body .filter-item:not([data-tag~="tag-6"]),
549 | .filter .filter-tag#tag-7:checked ~ .filter-body .filter-item:not([data-tag~="tag-7"]),
550 | .filter .filter-tag#tag-8:checked ~ .filter-body .filter-item:not([data-tag~="tag-8"]) {
551 | display: none;
552 | }
553 |
554 | .filter .filter-nav {
555 | margin: .4rem 0;
556 | }
557 |
558 | .filter .filter-body {
559 | display: -ms-flexbox;
560 | display: flex;
561 | -ms-flex-wrap: wrap;
562 | flex-wrap: wrap;
563 | }
564 |
565 | .meter {
566 | -webkit-appearance: none;
567 | -moz-appearance: none;
568 | appearance: none;
569 | background: #f7f8f9;
570 | border: 0;
571 | border-radius: .1rem;
572 | display: block;
573 | height: .8rem;
574 | width: 100%;
575 | }
576 |
577 | .meter::-webkit-meter-inner-element {
578 | display: block;
579 | }
580 |
581 | .meter::-webkit-meter-bar,
582 | .meter::-webkit-meter-optimum-value,
583 | .meter::-webkit-meter-suboptimum-value,
584 | .meter::-webkit-meter-even-less-good-value {
585 | border-radius: .1rem;
586 | }
587 |
588 | .meter::-webkit-meter-bar {
589 | background: #f7f8f9;
590 | }
591 |
592 | .meter::-webkit-meter-optimum-value {
593 | background: #32b643;
594 | }
595 |
596 | .meter::-webkit-meter-suboptimum-value {
597 | background: #ffb700;
598 | }
599 |
600 | .meter::-webkit-meter-even-less-good-value {
601 | background: #e85600;
602 | }
603 |
604 | .meter::-moz-meter-bar,
605 | .meter:-moz-meter-optimum,
606 | .meter:-moz-meter-sub-optimum,
607 | .meter:-moz-meter-sub-sub-optimum {
608 | border-radius: .1rem;
609 | }
610 |
611 | .meter:-moz-meter-optimum::-moz-meter-bar {
612 | background: #32b643;
613 | }
614 |
615 | .meter:-moz-meter-sub-optimum::-moz-meter-bar {
616 | background: #ffb700;
617 | }
618 |
619 | .meter:-moz-meter-sub-sub-optimum::-moz-meter-bar {
620 | background: #e85600;
621 | }
622 |
623 | .off-canvas {
624 | display: -ms-flexbox;
625 | display: flex;
626 | -ms-flex-flow: nowrap;
627 | flex-flow: nowrap;
628 | height: 100%;
629 | position: relative;
630 | width: 100%;
631 | }
632 |
633 | .off-canvas .off-canvas-toggle {
634 | display: block;
635 | left: .4rem;
636 | position: absolute;
637 | top: .4rem;
638 | transition: none;
639 | z-index: 1;
640 | }
641 |
642 | .off-canvas .off-canvas-sidebar {
643 | background: #f7f8f9;
644 | bottom: 0;
645 | left: 0;
646 | min-width: 10rem;
647 | overflow-y: auto;
648 | position: fixed;
649 | top: 0;
650 | transform: translateX(-100%);
651 | transition: transform .25s;
652 | z-index: 200;
653 | }
654 |
655 | .off-canvas .off-canvas-content {
656 | -ms-flex: 1 1 auto;
657 | flex: 1 1 auto;
658 | height: 100%;
659 | padding: .4rem .4rem .4rem 4rem;
660 | }
661 |
662 | .off-canvas .off-canvas-overlay {
663 | background: rgba(48, 55, 66, .1);
664 | border-color: transparent;
665 | border-radius: 0;
666 | bottom: 0;
667 | display: none;
668 | height: 100%;
669 | left: 0;
670 | position: fixed;
671 | right: 0;
672 | top: 0;
673 | width: 100%;
674 | }
675 |
676 | .off-canvas .off-canvas-sidebar:target,
677 | .off-canvas .off-canvas-sidebar.active {
678 | transform: translateX(0);
679 | }
680 |
681 | .off-canvas .off-canvas-sidebar:target ~ .off-canvas-overlay,
682 | .off-canvas .off-canvas-sidebar.active ~ .off-canvas-overlay {
683 | display: block;
684 | z-index: 100;
685 | }
686 |
687 | @media (min-width: 960px) {
688 | .off-canvas.off-canvas-sidebar-show .off-canvas-toggle {
689 | display: none;
690 | }
691 | .off-canvas.off-canvas-sidebar-show .off-canvas-sidebar {
692 | -ms-flex: 0 0 auto;
693 | flex: 0 0 auto;
694 | position: relative;
695 | transform: none;
696 | }
697 | .off-canvas.off-canvas-sidebar-show .off-canvas-overlay {
698 | display: none !important;
699 | }
700 | }
701 |
702 | .parallax {
703 | display: block;
704 | height: auto;
705 | position: relative;
706 | width: auto;
707 | }
708 |
709 | .parallax .parallax-content {
710 | box-shadow: 0 1rem 2.1rem rgba(48, 55, 66, .3);
711 | height: auto;
712 | transform: perspective(1000px);
713 | transform-style: preserve-3d;
714 | transition: all .4s ease;
715 | width: 100%;
716 | }
717 |
718 | .parallax .parallax-content::before {
719 | content: "";
720 | display: block;
721 | height: 100%;
722 | left: 0;
723 | position: absolute;
724 | top: 0;
725 | width: 100%;
726 | }
727 |
728 | .parallax .parallax-front {
729 | align-items: center;
730 | color: #fff;
731 | display: -ms-flexbox;
732 | display: flex;
733 | -ms-flex-align: center;
734 | -ms-flex-pack: center;
735 | height: 100%;
736 | justify-content: center;
737 | left: 0;
738 | position: absolute;
739 | text-align: center;
740 | text-shadow: 0 0 20px rgba(48, 55, 66, .75);
741 | top: 0;
742 | transform: translateZ(50px) scale(.95);
743 | transition: transform .4s;
744 | width: 100%;
745 | z-index: 1;
746 | }
747 |
748 | .parallax .parallax-top-left {
749 | height: 50%;
750 | left: 0;
751 | outline: none;
752 | position: absolute;
753 | top: 0;
754 | width: 50%;
755 | z-index: 100;
756 | }
757 |
758 | .parallax .parallax-top-left:focus ~ .parallax-content,
759 | .parallax .parallax-top-left:hover ~ .parallax-content {
760 | transform: perspective(1000px) rotateX(3deg) rotateY(-3deg);
761 | }
762 |
763 | .parallax .parallax-top-left:focus ~ .parallax-content::before,
764 | .parallax .parallax-top-left:hover ~ .parallax-content::before {
765 | background: linear-gradient(135deg, rgba(255, 255, 255, .35) 0%, transparent 50%);
766 | }
767 |
768 | .parallax .parallax-top-left:focus ~ .parallax-content .parallax-front,
769 | .parallax .parallax-top-left:hover ~ .parallax-content .parallax-front {
770 | transform: translate3d(4.5px, 4.5px, 50px) scale(.95);
771 | }
772 |
773 | .parallax .parallax-top-right {
774 | height: 50%;
775 | outline: none;
776 | position: absolute;
777 | right: 0;
778 | top: 0;
779 | width: 50%;
780 | z-index: 100;
781 | }
782 |
783 | .parallax .parallax-top-right:focus ~ .parallax-content,
784 | .parallax .parallax-top-right:hover ~ .parallax-content {
785 | transform: perspective(1000px) rotateX(3deg) rotateY(3deg);
786 | }
787 |
788 | .parallax .parallax-top-right:focus ~ .parallax-content::before,
789 | .parallax .parallax-top-right:hover ~ .parallax-content::before {
790 | background: linear-gradient(-135deg, rgba(255, 255, 255, .35) 0%, transparent 50%);
791 | }
792 |
793 | .parallax .parallax-top-right:focus ~ .parallax-content .parallax-front,
794 | .parallax .parallax-top-right:hover ~ .parallax-content .parallax-front {
795 | transform: translate3d(-4.5px, 4.5px, 50px) scale(.95);
796 | }
797 |
798 | .parallax .parallax-bottom-left {
799 | bottom: 0;
800 | height: 50%;
801 | left: 0;
802 | outline: none;
803 | position: absolute;
804 | width: 50%;
805 | z-index: 100;
806 | }
807 |
808 | .parallax .parallax-bottom-left:focus ~ .parallax-content,
809 | .parallax .parallax-bottom-left:hover ~ .parallax-content {
810 | transform: perspective(1000px) rotateX(-3deg) rotateY(-3deg);
811 | }
812 |
813 | .parallax .parallax-bottom-left:focus ~ .parallax-content::before,
814 | .parallax .parallax-bottom-left:hover ~ .parallax-content::before {
815 | background: linear-gradient(45deg, rgba(255, 255, 255, .35) 0%, transparent 50%);
816 | }
817 |
818 | .parallax .parallax-bottom-left:focus ~ .parallax-content .parallax-front,
819 | .parallax .parallax-bottom-left:hover ~ .parallax-content .parallax-front {
820 | transform: translate3d(4.5px, -4.5px, 50px) scale(.95);
821 | }
822 |
823 | .parallax .parallax-bottom-right {
824 | bottom: 0;
825 | height: 50%;
826 | outline: none;
827 | position: absolute;
828 | right: 0;
829 | width: 50%;
830 | z-index: 100;
831 | }
832 |
833 | .parallax .parallax-bottom-right:focus ~ .parallax-content,
834 | .parallax .parallax-bottom-right:hover ~ .parallax-content {
835 | transform: perspective(1000px) rotateX(-3deg) rotateY(3deg);
836 | }
837 |
838 | .parallax .parallax-bottom-right:focus ~ .parallax-content::before,
839 | .parallax .parallax-bottom-right:hover ~ .parallax-content::before {
840 | background: linear-gradient(-45deg, rgba(255, 255, 255, .35) 0%, transparent 50%);
841 | }
842 |
843 | .parallax .parallax-bottom-right:focus ~ .parallax-content .parallax-front,
844 | .parallax .parallax-bottom-right:hover ~ .parallax-content .parallax-front {
845 | transform: translate3d(-4.5px, -4.5px, 50px) scale(.95);
846 | }
847 |
848 | .progress {
849 | -webkit-appearance: none;
850 | -moz-appearance: none;
851 | appearance: none;
852 | background: #eef0f3;
853 | border: 0;
854 | border-radius: .1rem;
855 | color: #5755d9;
856 | height: .2rem;
857 | position: relative;
858 | width: 100%;
859 | }
860 |
861 | .progress::-webkit-progress-bar {
862 | background: transparent;
863 | border-radius: .1rem;
864 | }
865 |
866 | .progress::-webkit-progress-value {
867 | background: #5755d9;
868 | border-radius: .1rem;
869 | }
870 |
871 | .progress::-moz-progress-bar {
872 | background: #5755d9;
873 | border-radius: .1rem;
874 | }
875 |
876 | .progress:indeterminate {
877 | animation: progress-indeterminate 1.5s linear infinite;
878 | background: #eef0f3 linear-gradient(to right, #5755d9 30%, #eef0f3 30%) top left/150% 150% no-repeat;
879 | }
880 |
881 | .progress:indeterminate::-moz-progress-bar {
882 | background: transparent;
883 | }
884 |
885 | @keyframes progress-indeterminate {
886 | 0% {
887 | background-position: 200% 0;
888 | }
889 | 100% {
890 | background-position: -200% 0;
891 | }
892 | }
893 |
894 | .slider {
895 | -webkit-appearance: none;
896 | -moz-appearance: none;
897 | appearance: none;
898 | background: transparent;
899 | display: block;
900 | height: 1.2rem;
901 | width: 100%;
902 | }
903 |
904 | .slider:focus {
905 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
906 | outline: none;
907 | }
908 |
909 | .slider.tooltip:not([data-tooltip])::after {
910 | content: attr(value);
911 | }
912 |
913 | .slider::-webkit-slider-thumb {
914 | -webkit-appearance: none;
915 | background: #5755d9;
916 | border: 0;
917 | border-radius: 50%;
918 | height: .6rem;
919 | margin-top: -.25rem;
920 | -webkit-transition: transform .2s;
921 | transition: transform .2s;
922 | width: .6rem;
923 | }
924 |
925 | .slider::-moz-range-thumb {
926 | background: #5755d9;
927 | border: 0;
928 | border-radius: 50%;
929 | height: .6rem;
930 | -moz-transition: transform .2s;
931 | transition: transform .2s;
932 | width: .6rem;
933 | }
934 |
935 | .slider::-ms-thumb {
936 | background: #5755d9;
937 | border: 0;
938 | border-radius: 50%;
939 | height: .6rem;
940 | -ms-transition: transform .2s;
941 | transition: transform .2s;
942 | width: .6rem;
943 | }
944 |
945 | .slider:active::-webkit-slider-thumb {
946 | transform: scale(1.25);
947 | }
948 |
949 | .slider:active::-moz-range-thumb {
950 | transform: scale(1.25);
951 | }
952 |
953 | .slider:active::-ms-thumb {
954 | transform: scale(1.25);
955 | }
956 |
957 | .slider:disabled::-webkit-slider-thumb,
958 | .slider.disabled::-webkit-slider-thumb {
959 | background: #f7f8f9;
960 | transform: scale(1);
961 | }
962 |
963 | .slider:disabled::-moz-range-thumb,
964 | .slider.disabled::-moz-range-thumb {
965 | background: #f7f8f9;
966 | transform: scale(1);
967 | }
968 |
969 | .slider:disabled::-ms-thumb,
970 | .slider.disabled::-ms-thumb {
971 | background: #f7f8f9;
972 | transform: scale(1);
973 | }
974 |
975 | .slider::-webkit-slider-runnable-track {
976 | background: #eef0f3;
977 | border-radius: .1rem;
978 | height: .1rem;
979 | width: 100%;
980 | }
981 |
982 | .slider::-moz-range-track {
983 | background: #eef0f3;
984 | border-radius: .1rem;
985 | height: .1rem;
986 | width: 100%;
987 | }
988 |
989 | .slider::-ms-track {
990 | background: #eef0f3;
991 | border-radius: .1rem;
992 | height: .1rem;
993 | width: 100%;
994 | }
995 |
996 | .slider::-ms-fill-lower {
997 | background: #5755d9;
998 | }
999 |
1000 | .timeline .timeline-item {
1001 | display: -ms-flexbox;
1002 | display: flex;
1003 | margin-bottom: 1.2rem;
1004 | position: relative;
1005 | }
1006 |
1007 | .timeline .timeline-item::before {
1008 | background: #dadee4;
1009 | content: "";
1010 | height: 100%;
1011 | left: 11px;
1012 | position: absolute;
1013 | top: 1.2rem;
1014 | width: 2px;
1015 | }
1016 |
1017 | .timeline .timeline-item .timeline-left {
1018 | -ms-flex: 0 0 auto;
1019 | flex: 0 0 auto;
1020 | }
1021 |
1022 | .timeline .timeline-item .timeline-content {
1023 | -ms-flex: 1 1 auto;
1024 | flex: 1 1 auto;
1025 | padding: 2px 0 2px .8rem;
1026 | }
1027 |
1028 | .timeline .timeline-item .timeline-icon {
1029 | align-items: center;
1030 | border-radius: 50%;
1031 | color: #fff;
1032 | display: -ms-flexbox;
1033 | display: flex;
1034 | -ms-flex-align: center;
1035 | -ms-flex-pack: center;
1036 | height: 1.2rem;
1037 | justify-content: center;
1038 | text-align: center;
1039 | width: 1.2rem;
1040 | }
1041 |
1042 | .timeline .timeline-item .timeline-icon::before {
1043 | border: .1rem solid #5755d9;
1044 | border-radius: 50%;
1045 | content: "";
1046 | display: block;
1047 | height: .4rem;
1048 | left: .4rem;
1049 | position: absolute;
1050 | top: .4rem;
1051 | width: .4rem;
1052 | }
1053 |
1054 | .timeline .timeline-item .timeline-icon.icon-lg {
1055 | background: #5755d9;
1056 | line-height: 1.2rem;
1057 | }
1058 |
1059 | .timeline .timeline-item .timeline-icon.icon-lg::before {
1060 | content: none;
1061 | }
1062 |
1063 | .viewer-360 {
1064 | align-items: center;
1065 | display: -ms-flexbox;
1066 | display: flex;
1067 | -ms-flex-align: center;
1068 | -ms-flex-direction: column;
1069 | flex-direction: column;
1070 | }
1071 |
1072 | .viewer-360 .viewer-slider[max="36"][value="1"] + .viewer-image {
1073 | background-position-y: 0;
1074 | }
1075 |
1076 | .viewer-360 .viewer-slider[max="36"][value="2"] + .viewer-image {
1077 | background-position-y: 2.8571428571%;
1078 | }
1079 |
1080 | .viewer-360 .viewer-slider[max="36"][value="3"] + .viewer-image {
1081 | background-position-y: 5.7142857143%;
1082 | }
1083 |
1084 | .viewer-360 .viewer-slider[max="36"][value="4"] + .viewer-image {
1085 | background-position-y: 8.5714285714%;
1086 | }
1087 |
1088 | .viewer-360 .viewer-slider[max="36"][value="5"] + .viewer-image {
1089 | background-position-y: 11.4285714286%;
1090 | }
1091 |
1092 | .viewer-360 .viewer-slider[max="36"][value="6"] + .viewer-image {
1093 | background-position-y: 14.2857142857%;
1094 | }
1095 |
1096 | .viewer-360 .viewer-slider[max="36"][value="7"] + .viewer-image {
1097 | background-position-y: 17.1428571429%;
1098 | }
1099 |
1100 | .viewer-360 .viewer-slider[max="36"][value="8"] + .viewer-image {
1101 | background-position-y: 20%;
1102 | }
1103 |
1104 | .viewer-360 .viewer-slider[max="36"][value="9"] + .viewer-image {
1105 | background-position-y: 22.8571428571%;
1106 | }
1107 |
1108 | .viewer-360 .viewer-slider[max="36"][value="10"] + .viewer-image {
1109 | background-position-y: 25.7142857143%;
1110 | }
1111 |
1112 | .viewer-360 .viewer-slider[max="36"][value="11"] + .viewer-image {
1113 | background-position-y: 28.5714285714%;
1114 | }
1115 |
1116 | .viewer-360 .viewer-slider[max="36"][value="12"] + .viewer-image {
1117 | background-position-y: 31.4285714286%;
1118 | }
1119 |
1120 | .viewer-360 .viewer-slider[max="36"][value="13"] + .viewer-image {
1121 | background-position-y: 34.2857142857%;
1122 | }
1123 |
1124 | .viewer-360 .viewer-slider[max="36"][value="14"] + .viewer-image {
1125 | background-position-y: 37.1428571429%;
1126 | }
1127 |
1128 | .viewer-360 .viewer-slider[max="36"][value="15"] + .viewer-image {
1129 | background-position-y: 40%;
1130 | }
1131 |
1132 | .viewer-360 .viewer-slider[max="36"][value="16"] + .viewer-image {
1133 | background-position-y: 42.8571428571%;
1134 | }
1135 |
1136 | .viewer-360 .viewer-slider[max="36"][value="17"] + .viewer-image {
1137 | background-position-y: 45.7142857143%;
1138 | }
1139 |
1140 | .viewer-360 .viewer-slider[max="36"][value="18"] + .viewer-image {
1141 | background-position-y: 48.5714285714%;
1142 | }
1143 |
1144 | .viewer-360 .viewer-slider[max="36"][value="19"] + .viewer-image {
1145 | background-position-y: 51.4285714286%;
1146 | }
1147 |
1148 | .viewer-360 .viewer-slider[max="36"][value="20"] + .viewer-image {
1149 | background-position-y: 54.2857142857%;
1150 | }
1151 |
1152 | .viewer-360 .viewer-slider[max="36"][value="21"] + .viewer-image {
1153 | background-position-y: 57.1428571429%;
1154 | }
1155 |
1156 | .viewer-360 .viewer-slider[max="36"][value="22"] + .viewer-image {
1157 | background-position-y: 60%;
1158 | }
1159 |
1160 | .viewer-360 .viewer-slider[max="36"][value="23"] + .viewer-image {
1161 | background-position-y: 62.8571428571%;
1162 | }
1163 |
1164 | .viewer-360 .viewer-slider[max="36"][value="24"] + .viewer-image {
1165 | background-position-y: 65.7142857143%;
1166 | }
1167 |
1168 | .viewer-360 .viewer-slider[max="36"][value="25"] + .viewer-image {
1169 | background-position-y: 68.5714285714%;
1170 | }
1171 |
1172 | .viewer-360 .viewer-slider[max="36"][value="26"] + .viewer-image {
1173 | background-position-y: 71.4285714286%;
1174 | }
1175 |
1176 | .viewer-360 .viewer-slider[max="36"][value="27"] + .viewer-image {
1177 | background-position-y: 74.2857142857%;
1178 | }
1179 |
1180 | .viewer-360 .viewer-slider[max="36"][value="28"] + .viewer-image {
1181 | background-position-y: 77.1428571429%;
1182 | }
1183 |
1184 | .viewer-360 .viewer-slider[max="36"][value="29"] + .viewer-image {
1185 | background-position-y: 80%;
1186 | }
1187 |
1188 | .viewer-360 .viewer-slider[max="36"][value="30"] + .viewer-image {
1189 | background-position-y: 82.8571428571%;
1190 | }
1191 |
1192 | .viewer-360 .viewer-slider[max="36"][value="31"] + .viewer-image {
1193 | background-position-y: 85.7142857143%;
1194 | }
1195 |
1196 | .viewer-360 .viewer-slider[max="36"][value="32"] + .viewer-image {
1197 | background-position-y: 88.5714285714%;
1198 | }
1199 |
1200 | .viewer-360 .viewer-slider[max="36"][value="33"] + .viewer-image {
1201 | background-position-y: 91.4285714286%;
1202 | }
1203 |
1204 | .viewer-360 .viewer-slider[max="36"][value="34"] + .viewer-image {
1205 | background-position-y: 94.2857142857%;
1206 | }
1207 |
1208 | .viewer-360 .viewer-slider[max="36"][value="35"] + .viewer-image {
1209 | background-position-y: 97.1428571429%;
1210 | }
1211 |
1212 | .viewer-360 .viewer-slider[max="36"][value="36"] + .viewer-image {
1213 | background-position-y: 100%;
1214 | }
1215 |
1216 | .viewer-360 .viewer-slider {
1217 | cursor: ew-resize;
1218 | -ms-flex-order: 2;
1219 | margin: 1rem;
1220 | order: 2;
1221 | width: 60%;
1222 | }
1223 |
1224 | .viewer-360 .viewer-image {
1225 | background-position-y: 0;
1226 | background-repeat: no-repeat;
1227 | background-size: 100%;
1228 | -ms-flex-order: 1;
1229 | max-width: 100%;
1230 | order: 1;
1231 | }
--------------------------------------------------------------------------------
/styles/spectre-icons.css:
--------------------------------------------------------------------------------
1 | /*! Spectre.css Icons v0.5.9 | MIT License | github.com/picturepan2/spectre */
2 | .icon {
3 | box-sizing: border-box;
4 | display: inline-block;
5 | font-size: inherit;
6 | font-style: normal;
7 | height: 1em;
8 | position: relative;
9 | text-indent: -9999px;
10 | vertical-align: middle;
11 | width: 1em;
12 | }
13 |
14 | .icon::before,
15 | .icon::after {
16 | content: "";
17 | display: block;
18 | left: 50%;
19 | position: absolute;
20 | top: 50%;
21 | transform: translate(-50%, -50%);
22 | }
23 |
24 | .icon.icon-2x {
25 | font-size: 1.6rem;
26 | }
27 |
28 | .icon.icon-3x {
29 | font-size: 2.4rem;
30 | }
31 |
32 | .icon.icon-4x {
33 | font-size: 3.2rem;
34 | }
35 |
36 | .accordion .icon,
37 | .btn .icon,
38 | .toast .icon,
39 | .menu .icon {
40 | vertical-align: -10%;
41 | }
42 |
43 | .btn-lg .icon {
44 | vertical-align: -15%;
45 | }
46 |
47 | .icon-arrow-down::before,
48 | .icon-arrow-left::before,
49 | .icon-arrow-right::before,
50 | .icon-arrow-up::before,
51 | .icon-downward::before,
52 | .icon-back::before,
53 | .icon-forward::before,
54 | .icon-upward::before {
55 | border: .1rem solid currentColor;
56 | border-bottom: 0;
57 | border-right: 0;
58 | height: .65em;
59 | width: .65em;
60 | }
61 |
62 | .icon-arrow-down::before {
63 | transform: translate(-50%, -75%) rotate(225deg);
64 | }
65 |
66 | .icon-arrow-left::before {
67 | transform: translate(-25%, -50%) rotate(-45deg);
68 | }
69 |
70 | .icon-arrow-right::before {
71 | transform: translate(-75%, -50%) rotate(135deg);
72 | }
73 |
74 | .icon-arrow-up::before {
75 | transform: translate(-50%, -25%) rotate(45deg);
76 | }
77 |
78 | .icon-back::after,
79 | .icon-forward::after {
80 | background: currentColor;
81 | height: .1rem;
82 | width: .8em;
83 | }
84 |
85 | .icon-downward::after,
86 | .icon-upward::after {
87 | background: currentColor;
88 | height: .8em;
89 | width: .1rem;
90 | }
91 |
92 | .icon-back::after {
93 | left: 55%;
94 | }
95 |
96 | .icon-back::before {
97 | transform: translate(-50%, -50%) rotate(-45deg);
98 | }
99 |
100 | .icon-downward::after {
101 | top: 45%;
102 | }
103 |
104 | .icon-downward::before {
105 | transform: translate(-50%, -50%) rotate(-135deg);
106 | }
107 |
108 | .icon-forward::after {
109 | left: 45%;
110 | }
111 |
112 | .icon-forward::before {
113 | transform: translate(-50%, -50%) rotate(135deg);
114 | }
115 |
116 | .icon-upward::after {
117 | top: 55%;
118 | }
119 |
120 | .icon-upward::before {
121 | transform: translate(-50%, -50%) rotate(45deg);
122 | }
123 |
124 | .icon-caret::before {
125 | border-left: .3em solid transparent;
126 | border-right: .3em solid transparent;
127 | border-top: .3em solid currentColor;
128 | height: 0;
129 | transform: translate(-50%, -25%);
130 | width: 0;
131 | }
132 |
133 | .icon-menu::before {
134 | background: currentColor;
135 | box-shadow: 0 -.35em, 0 .35em;
136 | height: .1rem;
137 | width: 100%;
138 | }
139 |
140 | .icon-apps::before {
141 | background: currentColor;
142 | box-shadow: -.35em -.35em, -.35em 0, -.35em .35em, 0 -.35em, 0 .35em, .35em -.35em, .35em 0, .35em .35em;
143 | height: 3px;
144 | width: 3px;
145 | }
146 |
147 | .icon-resize-horiz::before,
148 | .icon-resize-horiz::after,
149 | .icon-resize-vert::before,
150 | .icon-resize-vert::after {
151 | border: .1rem solid currentColor;
152 | border-bottom: 0;
153 | border-right: 0;
154 | height: .45em;
155 | width: .45em;
156 | }
157 |
158 | .icon-resize-horiz::before,
159 | .icon-resize-vert::before {
160 | transform: translate(-50%, -90%) rotate(45deg);
161 | }
162 |
163 | .icon-resize-horiz::after,
164 | .icon-resize-vert::after {
165 | transform: translate(-50%, -10%) rotate(225deg);
166 | }
167 |
168 | .icon-resize-horiz::before {
169 | transform: translate(-90%, -50%) rotate(-45deg);
170 | }
171 |
172 | .icon-resize-horiz::after {
173 | transform: translate(-10%, -50%) rotate(135deg);
174 | }
175 |
176 | .icon-more-horiz::before,
177 | .icon-more-vert::before {
178 | background: currentColor;
179 | border-radius: 50%;
180 | box-shadow: -.4em 0, .4em 0;
181 | height: 3px;
182 | width: 3px;
183 | }
184 |
185 | .icon-more-vert::before {
186 | box-shadow: 0 -.4em, 0 .4em;
187 | }
188 |
189 | .icon-plus::before,
190 | .icon-minus::before,
191 | .icon-cross::before {
192 | background: currentColor;
193 | height: .1rem;
194 | width: 100%;
195 | }
196 |
197 | .icon-plus::after,
198 | .icon-cross::after {
199 | background: currentColor;
200 | height: 100%;
201 | width: .1rem;
202 | }
203 |
204 | .icon-cross::before {
205 | width: 100%;
206 | }
207 |
208 | .icon-cross::after {
209 | height: 100%;
210 | }
211 |
212 | .icon-cross::before,
213 | .icon-cross::after {
214 | transform: translate(-50%, -50%) rotate(45deg);
215 | }
216 |
217 | .icon-check::before {
218 | border: .1rem solid currentColor;
219 | border-right: 0;
220 | border-top: 0;
221 | height: .5em;
222 | transform: translate(-50%, -75%) rotate(-45deg);
223 | width: .9em;
224 | }
225 |
226 | .icon-stop {
227 | border: .1rem solid currentColor;
228 | border-radius: 50%;
229 | }
230 |
231 | .icon-stop::before {
232 | background: currentColor;
233 | height: .1rem;
234 | transform: translate(-50%, -50%) rotate(45deg);
235 | width: 1em;
236 | }
237 |
238 | .icon-shutdown {
239 | border: .1rem solid currentColor;
240 | border-radius: 50%;
241 | border-top-color: transparent;
242 | }
243 |
244 | .icon-shutdown::before {
245 | background: currentColor;
246 | content: "";
247 | height: .5em;
248 | top: .1em;
249 | width: .1rem;
250 | }
251 |
252 | .icon-refresh::before {
253 | border: .1rem solid currentColor;
254 | border-radius: 50%;
255 | border-right-color: transparent;
256 | height: 1em;
257 | width: 1em;
258 | }
259 |
260 | .icon-refresh::after {
261 | border: .2em solid currentColor;
262 | border-left-color: transparent;
263 | border-top-color: transparent;
264 | height: 0;
265 | left: 80%;
266 | top: 20%;
267 | width: 0;
268 | }
269 |
270 | .icon-search::before {
271 | border: .1rem solid currentColor;
272 | border-radius: 50%;
273 | height: .75em;
274 | left: 5%;
275 | top: 5%;
276 | transform: translate(0, 0) rotate(45deg);
277 | width: .75em;
278 | }
279 |
280 | .icon-search::after {
281 | background: currentColor;
282 | height: .1rem;
283 | left: 80%;
284 | top: 80%;
285 | transform: translate(-50%, -50%) rotate(45deg);
286 | width: .4em;
287 | }
288 |
289 | .icon-edit::before {
290 | border: .1rem solid currentColor;
291 | height: .4em;
292 | transform: translate(-40%, -60%) rotate(-45deg);
293 | width: .85em;
294 | }
295 |
296 | .icon-edit::after {
297 | border: .15em solid currentColor;
298 | border-right-color: transparent;
299 | border-top-color: transparent;
300 | height: 0;
301 | left: 5%;
302 | top: 95%;
303 | transform: translate(0, -100%);
304 | width: 0;
305 | }
306 |
307 | .icon-delete::before {
308 | border: .1rem solid currentColor;
309 | border-bottom-left-radius: .1rem;
310 | border-bottom-right-radius: .1rem;
311 | border-top: 0;
312 | height: .75em;
313 | top: 60%;
314 | width: .75em;
315 | }
316 |
317 | .icon-delete::after {
318 | background: currentColor;
319 | box-shadow: -.25em .2em, .25em .2em;
320 | height: .1rem;
321 | top: .05rem;
322 | width: .5em;
323 | }
324 |
325 | .icon-share {
326 | border: .1rem solid currentColor;
327 | border-radius: .1rem;
328 | border-right: 0;
329 | border-top: 0;
330 | }
331 |
332 | .icon-share::before {
333 | border: .1rem solid currentColor;
334 | border-left: 0;
335 | border-top: 0;
336 | height: .4em;
337 | left: 100%;
338 | top: .25em;
339 | transform: translate(-125%, -50%) rotate(-45deg);
340 | width: .4em;
341 | }
342 |
343 | .icon-share::after {
344 | border: .1rem solid currentColor;
345 | border-bottom: 0;
346 | border-radius: 75% 0;
347 | border-right: 0;
348 | height: .5em;
349 | width: .6em;
350 | }
351 |
352 | .icon-flag::before {
353 | background: currentColor;
354 | height: 1em;
355 | left: 15%;
356 | width: .1rem;
357 | }
358 |
359 | .icon-flag::after {
360 | border: .1rem solid currentColor;
361 | border-bottom-right-radius: .1rem;
362 | border-left: 0;
363 | border-top-right-radius: .1rem;
364 | height: .65em;
365 | left: 60%;
366 | top: 35%;
367 | width: .8em;
368 | }
369 |
370 | .icon-bookmark::before {
371 | border: .1rem solid currentColor;
372 | border-bottom: 0;
373 | border-top-left-radius: .1rem;
374 | border-top-right-radius: .1rem;
375 | height: .9em;
376 | width: .8em;
377 | }
378 |
379 | .icon-bookmark::after {
380 | border: .1rem solid currentColor;
381 | border-bottom: 0;
382 | border-left: 0;
383 | border-radius: .1rem;
384 | height: .5em;
385 | transform: translate(-50%, 35%) rotate(-45deg) skew(15deg, 15deg);
386 | width: .5em;
387 | }
388 |
389 | .icon-download,
390 | .icon-upload {
391 | border-bottom: .1rem solid currentColor;
392 | }
393 |
394 | .icon-download::before,
395 | .icon-upload::before {
396 | border: .1rem solid currentColor;
397 | border-bottom: 0;
398 | border-right: 0;
399 | height: .5em;
400 | transform: translate(-50%, -60%) rotate(-135deg);
401 | width: .5em;
402 | }
403 |
404 | .icon-download::after,
405 | .icon-upload::after {
406 | background: currentColor;
407 | height: .6em;
408 | top: 40%;
409 | width: .1rem;
410 | }
411 |
412 | .icon-upload::before {
413 | transform: translate(-50%, -60%) rotate(45deg);
414 | }
415 |
416 | .icon-upload::after {
417 | top: 50%;
418 | }
419 |
420 | .icon-copy::before {
421 | border: .1rem solid currentColor;
422 | border-bottom: 0;
423 | border-radius: .1rem;
424 | border-right: 0;
425 | height: .8em;
426 | left: 40%;
427 | top: 35%;
428 | width: .8em;
429 | }
430 |
431 | .icon-copy::after {
432 | border: .1rem solid currentColor;
433 | border-radius: .1rem;
434 | height: .8em;
435 | left: 60%;
436 | top: 60%;
437 | width: .8em;
438 | }
439 |
440 | .icon-time {
441 | border: .1rem solid currentColor;
442 | border-radius: 50%;
443 | }
444 |
445 | .icon-time::before {
446 | background: currentColor;
447 | height: .4em;
448 | transform: translate(-50%, -75%);
449 | width: .1rem;
450 | }
451 |
452 | .icon-time::after {
453 | background: currentColor;
454 | height: .3em;
455 | transform: translate(-50%, -75%) rotate(90deg);
456 | transform-origin: 50% 90%;
457 | width: .1rem;
458 | }
459 |
460 | .icon-mail::before {
461 | border: .1rem solid currentColor;
462 | border-radius: .1rem;
463 | height: .8em;
464 | width: 1em;
465 | }
466 |
467 | .icon-mail::after {
468 | border: .1rem solid currentColor;
469 | border-right: 0;
470 | border-top: 0;
471 | height: .5em;
472 | transform: translate(-50%, -90%) rotate(-45deg) skew(10deg, 10deg);
473 | width: .5em;
474 | }
475 |
476 | .icon-people::before {
477 | border: .1rem solid currentColor;
478 | border-radius: 50%;
479 | height: .45em;
480 | top: 25%;
481 | width: .45em;
482 | }
483 |
484 | .icon-people::after {
485 | border: .1rem solid currentColor;
486 | border-radius: 50% 50% 0 0;
487 | height: .4em;
488 | top: 75%;
489 | width: .9em;
490 | }
491 |
492 | .icon-message {
493 | border: .1rem solid currentColor;
494 | border-bottom: 0;
495 | border-radius: .1rem;
496 | border-right: 0;
497 | }
498 |
499 | .icon-message::before {
500 | border: .1rem solid currentColor;
501 | border-bottom-right-radius: .1rem;
502 | border-left: 0;
503 | border-top: 0;
504 | height: .8em;
505 | left: 65%;
506 | top: 40%;
507 | width: .7em;
508 | }
509 |
510 | .icon-message::after {
511 | background: currentColor;
512 | border-radius: .1rem;
513 | height: .3em;
514 | left: 10%;
515 | top: 100%;
516 | transform: translate(0, -90%) rotate(45deg);
517 | width: .1rem;
518 | }
519 |
520 | .icon-photo {
521 | border: .1rem solid currentColor;
522 | border-radius: .1rem;
523 | }
524 |
525 | .icon-photo::before {
526 | border: .1rem solid currentColor;
527 | border-radius: 50%;
528 | height: .25em;
529 | left: 35%;
530 | top: 35%;
531 | width: .25em;
532 | }
533 |
534 | .icon-photo::after {
535 | border: .1rem solid currentColor;
536 | border-bottom: 0;
537 | border-left: 0;
538 | height: .5em;
539 | left: 60%;
540 | transform: translate(-50%, 25%) rotate(-45deg);
541 | width: .5em;
542 | }
543 |
544 | .icon-link::before,
545 | .icon-link::after {
546 | border: .1rem solid currentColor;
547 | border-radius: 5em 0 0 5em;
548 | border-right: 0;
549 | height: .5em;
550 | width: .75em;
551 | }
552 |
553 | .icon-link::before {
554 | transform: translate(-70%, -45%) rotate(-45deg);
555 | }
556 |
557 | .icon-link::after {
558 | transform: translate(-30%, -55%) rotate(135deg);
559 | }
560 |
561 | .icon-location::before {
562 | border: .1rem solid currentColor;
563 | border-radius: 50% 50% 50% 0;
564 | height: .8em;
565 | transform: translate(-50%, -60%) rotate(-45deg);
566 | width: .8em;
567 | }
568 |
569 | .icon-location::after {
570 | border: .1rem solid currentColor;
571 | border-radius: 50%;
572 | height: .2em;
573 | transform: translate(-50%, -80%);
574 | width: .2em;
575 | }
576 |
577 | .icon-emoji {
578 | border: .1rem solid currentColor;
579 | border-radius: 50%;
580 | }
581 |
582 | .icon-emoji::before {
583 | border-radius: 50%;
584 | box-shadow: -.17em -.1em, .17em -.1em;
585 | height: .15em;
586 | width: .15em;
587 | }
588 |
589 | .icon-emoji::after {
590 | border: .1rem solid currentColor;
591 | border-bottom-color: transparent;
592 | border-radius: 50%;
593 | border-right-color: transparent;
594 | height: .5em;
595 | transform: translate(-50%, -40%) rotate(-135deg);
596 | width: .5em;
597 | }
--------------------------------------------------------------------------------
/styles/spectre.css:
--------------------------------------------------------------------------------
1 | /*! Spectre.css v0.5.9 | MIT License | github.com/picturepan2/spectre */
2 | /* Manually forked from Normalize.css */
3 | /* normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
4 | /** 1. Change the default font family in all browsers (opinionated). 2. Correct the line height in all browsers. 3. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS. */
5 | /* Document ========================================================================== */
6 | html {
7 | font-family: sans-serif; /* 1 */
8 | -webkit-text-size-adjust: 100%; /* 3 */
9 | -ms-text-size-adjust: 100%; /* 3 */
10 | }
11 |
12 | /* Sections ========================================================================== */
13 | /** Remove the margin in all browsers (opinionated). */
14 | body {
15 | margin: 0;
16 | }
17 |
18 | /** Add the correct display in IE 9-. */
19 | article,
20 | aside,
21 | footer,
22 | header,
23 | nav,
24 | section {
25 | display: block;
26 | }
27 |
28 | /** Correct the font size and margin on `h1` elements within `section` and `article` contexts in Chrome, Firefox, and Safari. */
29 | h1 {
30 | font-size: 2em;
31 | margin: .67em 0;
32 | }
33 |
34 | /* Grouping content ========================================================================== */
35 | /** Add the correct display in IE 9-. 1. Add the correct display in IE. */
36 | figcaption,
37 | figure,
38 | main {
39 | /* 1 */ display: block;
40 | }
41 |
42 | /** Add the correct margin in IE 8 (removed). */
43 | /** 1. Add the correct box sizing in Firefox. 2. Show the overflow in Edge and IE. */
44 | hr {
45 | box-sizing: content-box; /* 1 */
46 | height: 0; /* 1 */
47 | overflow: visible; /* 2 */
48 | }
49 |
50 | /** 1. Correct the inheritance and scaling of font size in all browsers. (removed) 2. Correct the odd `em` font sizing in all browsers. */
51 | /* Text-level semantics ========================================================================== */
52 | /** 1. Remove the gray background on active links in IE 10. 2. Remove gaps in links underline in iOS 8+ and Safari 8+. */
53 | a {
54 | background-color: transparent; /* 1 */
55 | -webkit-text-decoration-skip: objects; /* 2 */
56 | }
57 |
58 | /** Remove the outline on focused links when they are also active or hovered in all browsers (opinionated). */
59 | a:active,
60 | a:hover {
61 | outline-width: 0;
62 | }
63 |
64 | /** Modify default styling of address. */
65 | address {
66 | font-style: normal;
67 | }
68 |
69 | /** 1. Remove the bottom border in Firefox 39-. 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. (removed) */
70 | /** Prevent the duplicate application of `bolder` by the next rule in Safari 6. */
71 | b,
72 | strong {
73 | font-weight: inherit;
74 | }
75 |
76 | /** Add the correct font weight in Chrome, Edge, and Safari. */
77 | b,
78 | strong {
79 | font-weight: bolder;
80 | }
81 |
82 | /** 1. Correct the inheritance and scaling of font size in all browsers. 2. Correct the odd `em` font sizing in all browsers. */
83 | code,
84 | kbd,
85 | pre,
86 | samp {
87 | font-family: "SF Mono", "Segoe UI Mono", "Roboto Mono", Menlo, Courier, monospace; /* 1 (changed) */
88 | font-size: 1em; /* 2 */
89 | }
90 |
91 | /** Add the correct font style in Android 4.3-. */
92 | dfn {
93 | font-style: italic;
94 | }
95 |
96 | /** Add the correct background and color in IE 9-. (Removed) */
97 | /** Add the correct font size in all browsers. */
98 | small {
99 | font-size: 80%;
100 | font-weight: 400; /* (added) */
101 | }
102 |
103 | /** Prevent `sub` and `sup` elements from affecting the line height in all browsers. */
104 | sub,
105 | sup {
106 | font-size: 75%;
107 | line-height: 0;
108 | position: relative;
109 | vertical-align: baseline;
110 | }
111 |
112 | sub {
113 | bottom: -.25em;
114 | }
115 |
116 | sup {
117 | top: -.5em;
118 | }
119 |
120 | /* Embedded content ========================================================================== */
121 | /** Add the correct display in IE 9-. */
122 | audio,
123 | video {
124 | display: inline-block;
125 | }
126 |
127 | /** Add the correct display in iOS 4-7. */
128 | audio:not([controls]) {
129 | display: none;
130 | height: 0;
131 | }
132 |
133 | /** Remove the border on images inside links in IE 10-. */
134 | img {
135 | border-style: none;
136 | }
137 |
138 | /** Hide the overflow in IE. */
139 | svg:not(:root) {
140 | overflow: hidden;
141 | }
142 |
143 | /* Forms ========================================================================== */
144 | /** 1. Change the font styles in all browsers (opinionated). 2. Remove the margin in Firefox and Safari. */
145 | button,
146 | input,
147 | optgroup,
148 | select,
149 | textarea {
150 | font-family: inherit; /* 1 (changed) */
151 | font-size: inherit; /* 1 (changed) */
152 | line-height: inherit; /* 1 (changed) */
153 | margin: 0; /* 2 */
154 | }
155 |
156 | /** Show the overflow in IE. 1. Show the overflow in Edge. */
157 | button,
158 | input {
159 | /* 1 */ overflow: visible;
160 | }
161 |
162 | /** Remove the inheritance of text transform in Edge, Firefox, and IE. 1. Remove the inheritance of text transform in Firefox. */
163 | button,
164 | select {
165 | /* 1 */ text-transform: none;
166 | }
167 |
168 | /** 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` controls in Android 4. 2. Correct the inability to style clickable types in iOS and Safari. */
169 | button,
170 | html [type="button"],
171 | [type="reset"],
172 | [type="submit"] {
173 | -webkit-appearance: button; /* 2 */
174 | }
175 |
176 | /** Remove the inner border and padding in Firefox. */
177 | button::-moz-focus-inner,
178 | [type="button"]::-moz-focus-inner,
179 | [type="reset"]::-moz-focus-inner,
180 | [type="submit"]::-moz-focus-inner {
181 | border-style: none;
182 | padding: 0;
183 | }
184 |
185 | /** Restore the focus styles unset by the previous rule (removed). */
186 | /** Change the border, margin, and padding in all browsers (opinionated) (changed). */
187 | fieldset {
188 | border: 0;
189 | margin: 0;
190 | padding: 0;
191 | }
192 |
193 | /** 1. Correct the text wrapping in Edge and IE. 2. Correct the color inheritance from `fieldset` elements in IE. 3. Remove the padding so developers are not caught out when they zero out `fieldset` elements in all browsers. */
194 | legend {
195 | box-sizing: border-box; /* 1 */
196 | color: inherit; /* 2 */
197 | display: table; /* 1 */
198 | max-width: 100%; /* 1 */
199 | padding: 0; /* 3 */
200 | white-space: normal; /* 1 */
201 | }
202 |
203 | /** 1. Add the correct display in IE 9-. 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. */
204 | progress {
205 | display: inline-block; /* 1 */
206 | vertical-align: baseline; /* 2 */
207 | }
208 |
209 | /** Remove the default vertical scrollbar in IE. */
210 | textarea {
211 | overflow: auto;
212 | }
213 |
214 | /** 1. Add the correct box sizing in IE 10-. 2. Remove the padding in IE 10-. */
215 | [type="checkbox"],
216 | [type="radio"] {
217 | box-sizing: border-box; /* 1 */
218 | padding: 0; /* 2 */
219 | }
220 |
221 | /** Correct the cursor style of increment and decrement buttons in Chrome. */
222 | [type="number"]::-webkit-inner-spin-button,
223 | [type="number"]::-webkit-outer-spin-button {
224 | height: auto;
225 | }
226 |
227 | /** 1. Correct the odd appearance in Chrome and Safari. 2. Correct the outline style in Safari. */
228 | [type="search"] {
229 | -webkit-appearance: textfield; /* 1 */
230 | outline-offset: -2px; /* 2 */
231 | }
232 |
233 | /** Remove the inner padding and cancel buttons in Chrome and Safari on macOS. */
234 | [type="search"]::-webkit-search-cancel-button,
235 | [type="search"]::-webkit-search-decoration {
236 | -webkit-appearance: none;
237 | }
238 |
239 | /** 1. Correct the inability to style clickable types in iOS and Safari. 2. Change font properties to `inherit` in Safari. */
240 | ::-webkit-file-upload-button {
241 | -webkit-appearance: button; /* 1 */
242 | font: inherit; /* 2 */
243 | }
244 |
245 | /* Interactive ========================================================================== */
246 | /* Add the correct display in IE 9-. 1. Add the correct display in Edge, IE, and Firefox. */
247 | details,
248 | menu {
249 | display: block;
250 | }
251 |
252 | /* Add the correct display in all browsers. */
253 | summary {
254 | display: list-item;
255 | outline: none;
256 | }
257 |
258 | /* Scripting ========================================================================== */
259 | /** Add the correct display in IE 9-. */
260 | canvas {
261 | display: inline-block;
262 | }
263 |
264 | /** Add the correct display in IE. */
265 | template {
266 | display: none;
267 | }
268 |
269 | /* Hidden ========================================================================== */
270 | /** Add the correct display in IE 10-. */
271 | [hidden] {
272 | display: none;
273 | }
274 |
275 | *,
276 | *::before,
277 | *::after {
278 | box-sizing: inherit;
279 | }
280 |
281 | html {
282 | box-sizing: border-box;
283 | font-size: 20px;
284 | line-height: 1.5;
285 | -webkit-tap-highlight-color: transparent;
286 | }
287 |
288 | body {
289 | background: #fff;
290 | color: #3b4351;
291 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
292 | font-size: .8rem;
293 | overflow-x: hidden;
294 | text-rendering: optimizeLegibility;
295 | }
296 |
297 | a {
298 | color: #5755d9;
299 | outline: none;
300 | text-decoration: none;
301 | }
302 |
303 | a:focus {
304 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
305 | }
306 |
307 | a:focus,
308 | a:hover,
309 | a:active,
310 | a.active {
311 | color: #302ecd;
312 | text-decoration: underline;
313 | }
314 |
315 | a:visited {
316 | color: #807fe2;
317 | }
318 |
319 | h1,
320 | h2,
321 | h3,
322 | h4,
323 | h5,
324 | h6 {
325 | color: inherit;
326 | font-weight: 500;
327 | line-height: 1.2;
328 | margin-bottom: .5em;
329 | margin-top: 0;
330 | }
331 |
332 | .h1,
333 | .h2,
334 | .h3,
335 | .h4,
336 | .h5,
337 | .h6 {
338 | font-weight: 500;
339 | }
340 |
341 | h1,
342 | .h1 {
343 | font-size: 2rem;
344 | }
345 |
346 | h2,
347 | .h2 {
348 | font-size: 1.6rem;
349 | }
350 |
351 | h3,
352 | .h3 {
353 | font-size: 1.4rem;
354 | }
355 |
356 | h4,
357 | .h4 {
358 | font-size: 1.2rem;
359 | }
360 |
361 | h5,
362 | .h5 {
363 | font-size: 1rem;
364 | }
365 |
366 | h6,
367 | .h6 {
368 | font-size: .8rem;
369 | }
370 |
371 | p {
372 | margin: 0 0 1.2rem;
373 | }
374 |
375 | a,
376 | ins,
377 | u {
378 | -webkit-text-decoration-skip: ink edges;
379 | text-decoration-skip: ink edges;
380 | }
381 |
382 | abbr[title] {
383 | border-bottom: .05rem dotted;
384 | cursor: help;
385 | text-decoration: none;
386 | }
387 |
388 | kbd {
389 | background: #303742;
390 | border-radius: .1rem;
391 | color: #fff;
392 | font-size: .7rem;
393 | line-height: 1.25;
394 | padding: .1rem .2rem;
395 | }
396 |
397 | mark {
398 | background: #ffe9b3;
399 | border-bottom: .05rem solid #ffd367;
400 | border-radius: .1rem;
401 | color: #3b4351;
402 | padding: .05rem .1rem 0;
403 | }
404 |
405 | blockquote {
406 | border-left: .1rem solid #dadee4;
407 | margin-left: 0;
408 | padding: .4rem .8rem;
409 | }
410 |
411 | blockquote p:last-child {
412 | margin-bottom: 0;
413 | }
414 |
415 | ul,
416 | ol {
417 | margin: .8rem 0 .8rem .8rem;
418 | padding: 0;
419 | }
420 |
421 | ul ul,
422 | ul ol,
423 | ol ul,
424 | ol ol {
425 | margin: .8rem 0 .8rem .8rem;
426 | }
427 |
428 | ul li,
429 | ol li {
430 | margin-top: .4rem;
431 | }
432 |
433 | ul {
434 | list-style: disc inside;
435 | }
436 |
437 | ul ul {
438 | list-style-type: circle;
439 | }
440 |
441 | ol {
442 | list-style: decimal inside;
443 | }
444 |
445 | ol ol {
446 | list-style-type: lower-alpha;
447 | }
448 |
449 | dl dt {
450 | font-weight: bold;
451 | }
452 |
453 | dl dd {
454 | margin: .4rem 0 .8rem 0;
455 | }
456 |
457 | html:lang(zh),
458 | html:lang(zh-Hans),
459 | .lang-zh,
460 | .lang-zh-hans {
461 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", sans-serif;
462 | }
463 |
464 | html:lang(zh-Hant),
465 | .lang-zh-hant {
466 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang TC", "Hiragino Sans CNS", "Microsoft JhengHei", "Helvetica Neue", sans-serif;
467 | }
468 |
469 | html:lang(ja),
470 | .lang-ja {
471 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Hiragino Sans", "Hiragino Kaku Gothic Pro", "Yu Gothic", YuGothic, Meiryo, "Helvetica Neue", sans-serif;
472 | }
473 |
474 | html:lang(ko),
475 | .lang-ko {
476 | font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Malgun Gothic", "Helvetica Neue", sans-serif;
477 | }
478 |
479 | :lang(zh) ins,
480 | :lang(zh) u,
481 | :lang(ja) ins,
482 | :lang(ja) u,
483 | .lang-cjk ins,
484 | .lang-cjk u {
485 | border-bottom: .05rem solid;
486 | text-decoration: none;
487 | }
488 |
489 | :lang(zh) del + del,
490 | :lang(zh) del + s,
491 | :lang(zh) ins + ins,
492 | :lang(zh) ins + u,
493 | :lang(zh) s + del,
494 | :lang(zh) s + s,
495 | :lang(zh) u + ins,
496 | :lang(zh) u + u,
497 | :lang(ja) del + del,
498 | :lang(ja) del + s,
499 | :lang(ja) ins + ins,
500 | :lang(ja) ins + u,
501 | :lang(ja) s + del,
502 | :lang(ja) s + s,
503 | :lang(ja) u + ins,
504 | :lang(ja) u + u,
505 | .lang-cjk del + del,
506 | .lang-cjk del + s,
507 | .lang-cjk ins + ins,
508 | .lang-cjk ins + u,
509 | .lang-cjk s + del,
510 | .lang-cjk s + s,
511 | .lang-cjk u + ins,
512 | .lang-cjk u + u {
513 | margin-left: .125em;
514 | }
515 |
516 | .table {
517 | border-collapse: collapse;
518 | border-spacing: 0;
519 | text-align: left;
520 | width: 100%;
521 | }
522 |
523 | .table.table-striped tbody tr:nth-of-type(odd) {
524 | background: #f7f8f9;
525 | }
526 |
527 | .table tbody tr.active,
528 | .table.table-striped tbody tr.active {
529 | background: #eef0f3;
530 | }
531 |
532 | .table.table-hover tbody tr:hover {
533 | background: #eef0f3;
534 | }
535 |
536 | .table.table-scroll {
537 | display: block;
538 | overflow-x: auto;
539 | padding-bottom: .75rem;
540 | white-space: nowrap;
541 | }
542 |
543 | .table td,
544 | .table th {
545 | border-bottom: .05rem solid #dadee4;
546 | padding: .6rem .4rem;
547 | }
548 |
549 | .table th {
550 | border-bottom-width: .1rem;
551 | }
552 |
553 | .btn {
554 | -webkit-appearance: none;
555 | -moz-appearance: none;
556 | appearance: none;
557 | background: #fff;
558 | border: .05rem solid #5755d9;
559 | border-radius: .1rem;
560 | color: #5755d9;
561 | cursor: pointer;
562 | display: inline-block;
563 | font-size: .8rem;
564 | height: 1.8rem;
565 | line-height: 1.2rem;
566 | outline: none;
567 | padding: .25rem .4rem;
568 | text-align: center;
569 | text-decoration: none;
570 | transition: background .2s, border .2s, box-shadow .2s, color .2s;
571 | -webkit-user-select: none;
572 | -moz-user-select: none;
573 | -ms-user-select: none;
574 | user-select: none;
575 | vertical-align: middle;
576 | white-space: nowrap;
577 | }
578 |
579 | .btn:focus {
580 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
581 | }
582 |
583 | .btn:focus,
584 | .btn:hover {
585 | background: #f1f1fc;
586 | border-color: #4b48d6;
587 | text-decoration: none;
588 | }
589 |
590 | .btn:active,
591 | .btn.active {
592 | background: #4b48d6;
593 | border-color: #3634d2;
594 | color: #fff;
595 | text-decoration: none;
596 | }
597 |
598 | .btn:active.loading::after,
599 | .btn.active.loading::after {
600 | border-bottom-color: #fff;
601 | border-left-color: #fff;
602 | }
603 |
604 | .btn[disabled],
605 | .btn:disabled,
606 | .btn.disabled {
607 | cursor: default;
608 | opacity: .5;
609 | pointer-events: none;
610 | }
611 |
612 | .btn.btn-primary {
613 | background: #5755d9;
614 | border-color: #4b48d6;
615 | color: #fff;
616 | }
617 |
618 | .btn.btn-primary:focus,
619 | .btn.btn-primary:hover {
620 | background: #4240d4;
621 | border-color: #3634d2;
622 | color: #fff;
623 | }
624 |
625 | .btn.btn-primary:active,
626 | .btn.btn-primary.active {
627 | background: #3a38d2;
628 | border-color: #302ecd;
629 | color: #fff;
630 | }
631 |
632 | .btn.btn-primary.loading::after {
633 | border-bottom-color: #fff;
634 | border-left-color: #fff;
635 | }
636 |
637 | .btn.btn-success {
638 | background: #32b643;
639 | border-color: #2faa3f;
640 | color: #fff;
641 | }
642 |
643 | .btn.btn-success:focus {
644 | box-shadow: 0 0 0 .1rem rgba(50, 182, 67, .2);
645 | }
646 |
647 | .btn.btn-success:focus,
648 | .btn.btn-success:hover {
649 | background: #30ae40;
650 | border-color: #2da23c;
651 | color: #fff;
652 | }
653 |
654 | .btn.btn-success:active,
655 | .btn.btn-success.active {
656 | background: #2a9a39;
657 | border-color: #278e34;
658 | color: #fff;
659 | }
660 |
661 | .btn.btn-success.loading::after {
662 | border-bottom-color: #fff;
663 | border-left-color: #fff;
664 | }
665 |
666 | .btn.btn-error {
667 | background: #e85600;
668 | border-color: #d95000;
669 | color: #fff;
670 | }
671 |
672 | .btn.btn-error:focus {
673 | box-shadow: 0 0 0 .1rem rgba(232, 86, 0, .2);
674 | }
675 |
676 | .btn.btn-error:focus,
677 | .btn.btn-error:hover {
678 | background: #de5200;
679 | border-color: #cf4d00;
680 | color: #fff;
681 | }
682 |
683 | .btn.btn-error:active,
684 | .btn.btn-error.active {
685 | background: #c44900;
686 | border-color: #b54300;
687 | color: #fff;
688 | }
689 |
690 | .btn.btn-error.loading::after {
691 | border-bottom-color: #fff;
692 | border-left-color: #fff;
693 | }
694 |
695 | .btn.btn-link {
696 | background: transparent;
697 | border-color: transparent;
698 | color: #5755d9;
699 | }
700 |
701 | .btn.btn-link:focus,
702 | .btn.btn-link:hover,
703 | .btn.btn-link:active,
704 | .btn.btn-link.active {
705 | color: #302ecd;
706 | }
707 |
708 | .btn.btn-sm {
709 | font-size: .7rem;
710 | height: 1.4rem;
711 | padding: .05rem .3rem;
712 | }
713 |
714 | .btn.btn-lg {
715 | font-size: .9rem;
716 | height: 2rem;
717 | padding: .35rem .6rem;
718 | }
719 |
720 | .btn.btn-block {
721 | display: block;
722 | width: 100%;
723 | }
724 |
725 | .btn.btn-action {
726 | padding-left: 0;
727 | padding-right: 0;
728 | width: 1.8rem;
729 | }
730 |
731 | .btn.btn-action.btn-sm {
732 | width: 1.4rem;
733 | }
734 |
735 | .btn.btn-action.btn-lg {
736 | width: 2rem;
737 | }
738 |
739 | .btn.btn-clear {
740 | background: transparent;
741 | border: 0;
742 | color: currentColor;
743 | height: 1rem;
744 | line-height: .8rem;
745 | margin-left: .2rem;
746 | margin-right: -2px;
747 | opacity: 1;
748 | padding: .1rem;
749 | text-decoration: none;
750 | width: 1rem;
751 | }
752 |
753 | .btn.btn-clear:focus,
754 | .btn.btn-clear:hover {
755 | background: rgba(247, 248, 249, .5);
756 | opacity: .95;
757 | }
758 |
759 | .btn.btn-clear::before {
760 | content: "\2715";
761 | }
762 |
763 | .btn-group {
764 | display: -ms-inline-flexbox;
765 | display: inline-flex;
766 | -ms-flex-wrap: wrap;
767 | flex-wrap: wrap;
768 | }
769 |
770 | .btn-group .btn {
771 | -ms-flex: 1 0 auto;
772 | flex: 1 0 auto;
773 | }
774 |
775 | .btn-group .btn:first-child:not(:last-child) {
776 | border-bottom-right-radius: 0;
777 | border-top-right-radius: 0;
778 | }
779 |
780 | .btn-group .btn:not(:first-child):not(:last-child) {
781 | border-radius: 0;
782 | margin-left: -.05rem;
783 | }
784 |
785 | .btn-group .btn:last-child:not(:first-child) {
786 | border-bottom-left-radius: 0;
787 | border-top-left-radius: 0;
788 | margin-left: -.05rem;
789 | }
790 |
791 | .btn-group .btn:focus,
792 | .btn-group .btn:hover,
793 | .btn-group .btn:active,
794 | .btn-group .btn.active {
795 | z-index: 1;
796 | }
797 |
798 | .btn-group.btn-group-block {
799 | display: -ms-flexbox;
800 | display: flex;
801 | }
802 |
803 | .btn-group.btn-group-block .btn {
804 | -ms-flex: 1 0 0;
805 | flex: 1 0 0;
806 | }
807 |
808 | .form-group:not(:last-child) {
809 | margin-bottom: .4rem;
810 | }
811 |
812 | fieldset {
813 | margin-bottom: .8rem;
814 | }
815 |
816 | legend {
817 | font-size: .9rem;
818 | font-weight: 500;
819 | margin-bottom: .8rem;
820 | }
821 |
822 | .form-label {
823 | display: block;
824 | line-height: 1.2rem;
825 | padding: .3rem 0;
826 | }
827 |
828 | .form-label.label-sm {
829 | font-size: .7rem;
830 | padding: .1rem 0;
831 | }
832 |
833 | .form-label.label-lg {
834 | font-size: .9rem;
835 | padding: .4rem 0;
836 | }
837 |
838 | .form-input {
839 | -webkit-appearance: none;
840 | -moz-appearance: none;
841 | appearance: none;
842 | background: #fff;
843 | background-image: none;
844 | border: .05rem solid #bcc3ce;
845 | border-radius: .1rem;
846 | color: #3b4351;
847 | display: block;
848 | font-size: .8rem;
849 | height: 1.8rem;
850 | line-height: 1.2rem;
851 | max-width: 100%;
852 | outline: none;
853 | padding: .25rem .4rem;
854 | position: relative;
855 | transition: background .2s, border .2s, box-shadow .2s, color .2s;
856 | width: 100%;
857 | }
858 |
859 | .form-input:focus {
860 | border-color: #5755d9;
861 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
862 | }
863 |
864 | .form-input:-ms-input-placeholder {
865 | color: #bcc3ce;
866 | }
867 |
868 | .form-input::-ms-input-placeholder {
869 | color: #bcc3ce;
870 | }
871 |
872 | .form-input::placeholder {
873 | color: #bcc3ce;
874 | }
875 |
876 | .form-input.input-sm {
877 | font-size: .7rem;
878 | height: 1.4rem;
879 | padding: .05rem .3rem;
880 | }
881 |
882 | .form-input.input-lg {
883 | font-size: .9rem;
884 | height: 2rem;
885 | padding: .35rem .6rem;
886 | }
887 |
888 | .form-input.input-inline {
889 | display: inline-block;
890 | vertical-align: middle;
891 | width: auto;
892 | }
893 |
894 | .form-input[type="file"] {
895 | height: auto;
896 | }
897 |
898 | textarea.form-input,
899 | textarea.form-input.input-lg,
900 | textarea.form-input.input-sm {
901 | height: auto;
902 | }
903 |
904 | .form-input-hint {
905 | color: #bcc3ce;
906 | font-size: .7rem;
907 | margin-top: .2rem;
908 | }
909 |
910 | .has-success .form-input-hint,
911 | .is-success + .form-input-hint {
912 | color: #32b643;
913 | }
914 |
915 | .has-error .form-input-hint,
916 | .is-error + .form-input-hint {
917 | color: #e85600;
918 | }
919 |
920 | .form-select {
921 | -webkit-appearance: none;
922 | -moz-appearance: none;
923 | appearance: none;
924 | background: #fff;
925 | border: .05rem solid #bcc3ce;
926 | border-radius: .1rem;
927 | color: inherit;
928 | font-size: .8rem;
929 | height: 1.8rem;
930 | line-height: 1.2rem;
931 | outline: none;
932 | padding: .25rem .4rem;
933 | vertical-align: middle;
934 | width: 100%;
935 | }
936 |
937 | .form-select:focus {
938 | border-color: #5755d9;
939 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
940 | }
941 |
942 | .form-select::-ms-expand {
943 | display: none;
944 | }
945 |
946 | .form-select.select-sm {
947 | font-size: .7rem;
948 | height: 1.4rem;
949 | padding: .05rem 1.1rem .05rem .3rem;
950 | }
951 |
952 | .form-select.select-lg {
953 | font-size: .9rem;
954 | height: 2rem;
955 | padding: .35rem 1.4rem .35rem .6rem;
956 | }
957 |
958 | .form-select[size],
959 | .form-select[multiple] {
960 | height: auto;
961 | padding: .25rem .4rem;
962 | }
963 |
964 | .form-select[size] option,
965 | .form-select[multiple] option {
966 | padding: .1rem .2rem;
967 | }
968 |
969 | .form-select:not([multiple]):not([size]) {
970 | background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%204%205'%3E%3Cpath%20fill='%23667189'%20d='M2%200L0%202h4zm0%205L0%203h4z'/%3E%3C/svg%3E") no-repeat right .35rem center/.4rem .5rem;
971 | padding-right: 1.2rem;
972 | }
973 |
974 | .has-icon-left,
975 | .has-icon-right {
976 | position: relative;
977 | }
978 |
979 | .has-icon-left .form-icon,
980 | .has-icon-right .form-icon {
981 | height: .8rem;
982 | margin: 0 .25rem;
983 | position: absolute;
984 | top: 50%;
985 | transform: translateY(-50%);
986 | width: .8rem;
987 | z-index: 2;
988 | }
989 |
990 | .has-icon-left .form-icon {
991 | left: .05rem;
992 | }
993 |
994 | .has-icon-left .form-input {
995 | padding-left: 1.3rem;
996 | }
997 |
998 | .has-icon-right .form-icon {
999 | right: .05rem;
1000 | }
1001 |
1002 | .has-icon-right .form-input {
1003 | padding-right: 1.3rem;
1004 | }
1005 |
1006 | .form-checkbox,
1007 | .form-radio,
1008 | .form-switch {
1009 | display: block;
1010 | line-height: 1.2rem;
1011 | margin: .2rem 0;
1012 | min-height: 1.4rem;
1013 | padding: .1rem .4rem .1rem 1.2rem;
1014 | position: relative;
1015 | }
1016 |
1017 | .form-checkbox input,
1018 | .form-radio input,
1019 | .form-switch input {
1020 | clip: rect(0, 0, 0, 0);
1021 | height: 1px;
1022 | margin: -1px;
1023 | overflow: hidden;
1024 | position: absolute;
1025 | width: 1px;
1026 | }
1027 |
1028 | .form-checkbox input:focus + .form-icon,
1029 | .form-radio input:focus + .form-icon,
1030 | .form-switch input:focus + .form-icon {
1031 | border-color: #5755d9;
1032 | box-shadow: 0 0 0 .1rem rgba(87, 85, 217, .2);
1033 | }
1034 |
1035 | .form-checkbox input:checked + .form-icon,
1036 | .form-radio input:checked + .form-icon,
1037 | .form-switch input:checked + .form-icon {
1038 | background: #5755d9;
1039 | border-color: #5755d9;
1040 | }
1041 |
1042 | .form-checkbox .form-icon,
1043 | .form-radio .form-icon,
1044 | .form-switch .form-icon {
1045 | border: .05rem solid #bcc3ce;
1046 | cursor: pointer;
1047 | display: inline-block;
1048 | position: absolute;
1049 | transition: background .2s, border .2s, box-shadow .2s, color .2s;
1050 | }
1051 |
1052 | .form-checkbox.input-sm,
1053 | .form-radio.input-sm,
1054 | .form-switch.input-sm {
1055 | font-size: .7rem;
1056 | margin: 0;
1057 | }
1058 |
1059 | .form-checkbox.input-lg,
1060 | .form-radio.input-lg,
1061 | .form-switch.input-lg {
1062 | font-size: .9rem;
1063 | margin: .3rem 0;
1064 | }
1065 |
1066 | .form-checkbox .form-icon,
1067 | .form-radio .form-icon {
1068 | background: #fff;
1069 | height: .8rem;
1070 | left: 0;
1071 | top: .3rem;
1072 | width: .8rem;
1073 | }
1074 |
1075 | .form-checkbox input:active + .form-icon,
1076 | .form-radio input:active + .form-icon {
1077 | background: #eef0f3;
1078 | }
1079 |
1080 | .form-checkbox .form-icon {
1081 | border-radius: .1rem;
1082 | }
1083 |
1084 | .form-checkbox input:checked + .form-icon::before {
1085 | background-clip: padding-box;
1086 | border: .1rem solid #fff;
1087 | border-left-width: 0;
1088 | border-top-width: 0;
1089 | content: "";
1090 | height: 9px;
1091 | left: 50%;
1092 | margin-left: -3px;
1093 | margin-top: -6px;
1094 | position: absolute;
1095 | top: 50%;
1096 | transform: rotate(45deg);
1097 | width: 6px;
1098 | }
1099 |
1100 | .form-checkbox input:indeterminate + .form-icon {
1101 | background: #5755d9;
1102 | border-color: #5755d9;
1103 | }
1104 |
1105 | .form-checkbox input:indeterminate + .form-icon::before {
1106 | background: #fff;
1107 | content: "";
1108 | height: 2px;
1109 | left: 50%;
1110 | margin-left: -5px;
1111 | margin-top: -1px;
1112 | position: absolute;
1113 | top: 50%;
1114 | width: 10px;
1115 | }
1116 |
1117 | .form-radio .form-icon {
1118 | border-radius: 50%;
1119 | }
1120 |
1121 | .form-radio input:checked + .form-icon::before {
1122 | background: #fff;
1123 | border-radius: 50%;
1124 | content: "";
1125 | height: 6px;
1126 | left: 50%;
1127 | position: absolute;
1128 | top: 50%;
1129 | transform: translate(-50%, -50%);
1130 | width: 6px;
1131 | }
1132 |
1133 | .form-switch {
1134 | padding-left: 2rem;
1135 | }
1136 |
1137 | .form-switch .form-icon {
1138 | background: #bcc3ce;
1139 | background-clip: padding-box;
1140 | border-radius: .45rem;
1141 | height: .9rem;
1142 | left: 0;
1143 | top: .25rem;
1144 | width: 1.6rem;
1145 | }
1146 |
1147 | .form-switch .form-icon::before {
1148 | background: #fff;
1149 | border-radius: 50%;
1150 | content: "";
1151 | display: block;
1152 | height: .8rem;
1153 | left: 0;
1154 | position: absolute;
1155 | top: 0;
1156 | transition: background .2s, border .2s, box-shadow .2s, color .2s, left .2s;
1157 | width: .8rem;
1158 | }
1159 |
1160 | .form-switch input:checked + .form-icon::before {
1161 | left: 14px;
1162 | }
1163 |
1164 | .form-switch input:active + .form-icon::before {
1165 | background: #f7f8f9;
1166 | }
1167 |
1168 | .input-group {
1169 | display: -ms-flexbox;
1170 | display: flex;
1171 | }
1172 |
1173 | .input-group .input-group-addon {
1174 | background: #f7f8f9;
1175 | border: .05rem solid #bcc3ce;
1176 | border-radius: .1rem;
1177 | line-height: 1.2rem;
1178 | padding: .25rem .4rem;
1179 | white-space: nowrap;
1180 | }
1181 |
1182 | .input-group .input-group-addon.addon-sm {
1183 | font-size: .7rem;
1184 | padding: .05rem .3rem;
1185 | }
1186 |
1187 | .input-group .input-group-addon.addon-lg {
1188 | font-size: .9rem;
1189 | padding: .35rem .6rem;
1190 | }
1191 |
1192 | .input-group .form-input,
1193 | .input-group .form-select {
1194 | -ms-flex: 1 1 auto;
1195 | flex: 1 1 auto;
1196 | width: 1%;
1197 | }
1198 |
1199 | .input-group .input-group-btn {
1200 | z-index: 1;
1201 | }
1202 |
1203 | .input-group .form-input:first-child:not(:last-child),
1204 | .input-group .form-select:first-child:not(:last-child),
1205 | .input-group .input-group-addon:first-child:not(:last-child),
1206 | .input-group .input-group-btn:first-child:not(:last-child) {
1207 | border-bottom-right-radius: 0;
1208 | border-top-right-radius: 0;
1209 | }
1210 |
1211 | .input-group .form-input:not(:first-child):not(:last-child),
1212 | .input-group .form-select:not(:first-child):not(:last-child),
1213 | .input-group .input-group-addon:not(:first-child):not(:last-child),
1214 | .input-group .input-group-btn:not(:first-child):not(:last-child) {
1215 | border-radius: 0;
1216 | margin-left: -.05rem;
1217 | }
1218 |
1219 | .input-group .form-input:last-child:not(:first-child),
1220 | .input-group .form-select:last-child:not(:first-child),
1221 | .input-group .input-group-addon:last-child:not(:first-child),
1222 | .input-group .input-group-btn:last-child:not(:first-child) {
1223 | border-bottom-left-radius: 0;
1224 | border-top-left-radius: 0;
1225 | margin-left: -.05rem;
1226 | }
1227 |
1228 | .input-group .form-input:focus,
1229 | .input-group .form-select:focus,
1230 | .input-group .input-group-addon:focus,
1231 | .input-group .input-group-btn:focus {
1232 | z-index: 2;
1233 | }
1234 |
1235 | .input-group .form-select {
1236 | width: auto;
1237 | }
1238 |
1239 | .input-group.input-inline {
1240 | display: -ms-inline-flexbox;
1241 | display: inline-flex;
1242 | }
1243 |
1244 | .has-success .form-input,
1245 | .form-input.is-success,
1246 | .has-success .form-select,
1247 | .form-select.is-success {
1248 | background: #f9fdfa;
1249 | border-color: #32b643;
1250 | }
1251 |
1252 | .has-success .form-input:focus,
1253 | .form-input.is-success:focus,
1254 | .has-success .form-select:focus,
1255 | .form-select.is-success:focus {
1256 | box-shadow: 0 0 0 .1rem rgba(50, 182, 67, .2);
1257 | }
1258 |
1259 | .has-error .form-input,
1260 | .form-input.is-error,
1261 | .has-error .form-select,
1262 | .form-select.is-error {
1263 | background: #fffaf7;
1264 | border-color: #e85600;
1265 | }
1266 |
1267 | .has-error .form-input:focus,
1268 | .form-input.is-error:focus,
1269 | .has-error .form-select:focus,
1270 | .form-select.is-error:focus {
1271 | box-shadow: 0 0 0 .1rem rgba(232, 86, 0, .2);
1272 | }
1273 |
1274 | .has-error .form-checkbox .form-icon,
1275 | .form-checkbox.is-error .form-icon,
1276 | .has-error .form-radio .form-icon,
1277 | .form-radio.is-error .form-icon,
1278 | .has-error .form-switch .form-icon,
1279 | .form-switch.is-error .form-icon {
1280 | border-color: #e85600;
1281 | }
1282 |
1283 | .has-error .form-checkbox input:checked + .form-icon,
1284 | .form-checkbox.is-error input:checked + .form-icon,
1285 | .has-error .form-radio input:checked + .form-icon,
1286 | .form-radio.is-error input:checked + .form-icon,
1287 | .has-error .form-switch input:checked + .form-icon,
1288 | .form-switch.is-error input:checked + .form-icon {
1289 | background: #e85600;
1290 | border-color: #e85600;
1291 | }
1292 |
1293 | .has-error .form-checkbox input:focus + .form-icon,
1294 | .form-checkbox.is-error input:focus + .form-icon,
1295 | .has-error .form-radio input:focus + .form-icon,
1296 | .form-radio.is-error input:focus + .form-icon,
1297 | .has-error .form-switch input:focus + .form-icon,
1298 | .form-switch.is-error input:focus + .form-icon {
1299 | border-color: #e85600;
1300 | box-shadow: 0 0 0 .1rem rgba(232, 86, 0, .2);
1301 | }
1302 |
1303 | .has-error .form-checkbox input:indeterminate + .form-icon,
1304 | .form-checkbox.is-error input:indeterminate + .form-icon {
1305 | background: #e85600;
1306 | border-color: #e85600;
1307 | }
1308 |
1309 | .form-input:not(:-ms-input-placeholder):invalid {
1310 | border-color: #e85600;
1311 | }
1312 |
1313 | .form-input:not(:placeholder-shown):invalid {
1314 | border-color: #e85600;
1315 | }
1316 |
1317 | .form-input:not(:-ms-input-placeholder):invalid:focus {
1318 | background: #fffaf7;
1319 | box-shadow: 0 0 0 .1rem rgba(232, 86, 0, .2);
1320 | }
1321 |
1322 | .form-input:not(:placeholder-shown):invalid:focus {
1323 | background: #fffaf7;
1324 | box-shadow: 0 0 0 .1rem rgba(232, 86, 0, .2);
1325 | }
1326 |
1327 | .form-input:not(:-ms-input-placeholder):invalid + .form-input-hint {
1328 | color: #e85600;
1329 | }
1330 |
1331 | .form-input:not(:placeholder-shown):invalid + .form-input-hint {
1332 | color: #e85600;
1333 | }
1334 |
1335 | .form-input:disabled,
1336 | .form-input.disabled,
1337 | .form-select:disabled,
1338 | .form-select.disabled {
1339 | background-color: #eef0f3;
1340 | cursor: not-allowed;
1341 | opacity: .5;
1342 | }
1343 |
1344 | .form-input[readonly] {
1345 | background-color: #f7f8f9;
1346 | }
1347 |
1348 | input:disabled + .form-icon,
1349 | input.disabled + .form-icon {
1350 | background: #eef0f3;
1351 | cursor: not-allowed;
1352 | opacity: .5;
1353 | }
1354 |
1355 | .form-switch input:disabled + .form-icon::before,
1356 | .form-switch input.disabled + .form-icon::before {
1357 | background: #fff;
1358 | }
1359 |
1360 | .form-horizontal {
1361 | padding: .4rem 0;
1362 | }
1363 |
1364 | .form-horizontal .form-group {
1365 | display: -ms-flexbox;
1366 | display: flex;
1367 | -ms-flex-wrap: wrap;
1368 | flex-wrap: wrap;
1369 | }
1370 |
1371 | .form-inline {
1372 | display: inline-block;
1373 | }
1374 |
1375 | .label {
1376 | background: #eef0f3;
1377 | border-radius: .1rem;
1378 | color: #455060;
1379 | display: inline-block;
1380 | line-height: 1.25;
1381 | padding: .1rem .2rem;
1382 | }
1383 |
1384 | .label.label-rounded {
1385 | border-radius: 5rem;
1386 | padding-left: .4rem;
1387 | padding-right: .4rem;
1388 | }
1389 |
1390 | .label.label-primary {
1391 | background: #5755d9;
1392 | color: #fff;
1393 | }
1394 |
1395 | .label.label-secondary {
1396 | background: #f1f1fc;
1397 | color: #5755d9;
1398 | }
1399 |
1400 | .label.label-success {
1401 | background: #32b643;
1402 | color: #fff;
1403 | }
1404 |
1405 | .label.label-warning {
1406 | background: #ffb700;
1407 | color: #fff;
1408 | }
1409 |
1410 | .label.label-error {
1411 | background: #e85600;
1412 | color: #fff;
1413 | }
1414 |
1415 | code {
1416 | background: #fcf2f2;
1417 | border-radius: .1rem;
1418 | color: #d73e48;
1419 | font-size: 85%;
1420 | line-height: 1.25;
1421 | padding: .1rem .2rem;
1422 | }
1423 |
1424 | .code {
1425 | border-radius: .1rem;
1426 | color: #3b4351;
1427 | position: relative;
1428 | }
1429 |
1430 | .code::before {
1431 | color: #bcc3ce;
1432 | content: attr(data-lang);
1433 | font-size: .7rem;
1434 | position: absolute;
1435 | right: .4rem;
1436 | top: .1rem;
1437 | }
1438 |
1439 | .code code {
1440 | background: #f7f8f9;
1441 | color: inherit;
1442 | display: block;
1443 | line-height: 1.5;
1444 | overflow-x: auto;
1445 | padding: 1rem;
1446 | width: 100%;
1447 | }
1448 |
1449 | .img-responsive {
1450 | display: block;
1451 | height: auto;
1452 | max-width: 100%;
1453 | }
1454 |
1455 | .img-fit-cover {
1456 | object-fit: cover;
1457 | }
1458 |
1459 | .img-fit-contain {
1460 | object-fit: contain;
1461 | }
1462 |
1463 | .video-responsive {
1464 | display: block;
1465 | overflow: hidden;
1466 | padding: 0;
1467 | position: relative;
1468 | width: 100%;
1469 | }
1470 |
1471 | .video-responsive::before {
1472 | content: "";
1473 | display: block;
1474 | padding-bottom: 56.25%;
1475 | }
1476 |
1477 | .video-responsive iframe,
1478 | .video-responsive object,
1479 | .video-responsive embed {
1480 | border: 0;
1481 | bottom: 0;
1482 | height: 100%;
1483 | left: 0;
1484 | position: absolute;
1485 | right: 0;
1486 | top: 0;
1487 | width: 100%;
1488 | }
1489 |
1490 | video.video-responsive {
1491 | height: auto;
1492 | max-width: 100%;
1493 | }
1494 |
1495 | video.video-responsive::before {
1496 | content: none;
1497 | }
1498 |
1499 | .video-responsive-4-3::before {
1500 | padding-bottom: 75%;
1501 | }
1502 |
1503 | .video-responsive-1-1::before {
1504 | padding-bottom: 100%;
1505 | }
1506 |
1507 | .figure {
1508 | margin: 0 0 .4rem 0;
1509 | }
1510 |
1511 | .figure .figure-caption {
1512 | color: #66758c;
1513 | margin-top: .4rem;
1514 | }
1515 |
1516 | .container {
1517 | margin-left: auto;
1518 | margin-right: auto;
1519 | padding-left: .4rem;
1520 | padding-right: .4rem;
1521 | width: 100%;
1522 | }
1523 |
1524 | .container.grid-xl {
1525 | max-width: 1296px;
1526 | }
1527 |
1528 | .container.grid-lg {
1529 | max-width: 976px;
1530 | }
1531 |
1532 | .container.grid-md {
1533 | max-width: 856px;
1534 | }
1535 |
1536 | .container.grid-sm {
1537 | max-width: 616px;
1538 | }
1539 |
1540 | .container.grid-xs {
1541 | max-width: 496px;
1542 | }
1543 |
1544 | .show-xs,
1545 | .show-sm,
1546 | .show-md,
1547 | .show-lg,
1548 | .show-xl {
1549 | display: none !important;
1550 | }
1551 |
1552 | .cols,
1553 | .columns {
1554 | display: -ms-flexbox;
1555 | display: flex;
1556 | -ms-flex-wrap: wrap;
1557 | flex-wrap: wrap;
1558 | margin-left: -.4rem;
1559 | margin-right: -.4rem;
1560 | }
1561 |
1562 | .cols.col-gapless,
1563 | .columns.col-gapless {
1564 | margin-left: 0;
1565 | margin-right: 0;
1566 | }
1567 |
1568 | .cols.col-gapless > .column,
1569 | .columns.col-gapless > .column {
1570 | padding-left: 0;
1571 | padding-right: 0;
1572 | }
1573 |
1574 | .cols.col-oneline,
1575 | .columns.col-oneline {
1576 | -ms-flex-wrap: nowrap;
1577 | flex-wrap: nowrap;
1578 | overflow-x: auto;
1579 | }
1580 |
1581 | [class~="col-"],
1582 | .column {
1583 | -ms-flex: 1;
1584 | flex: 1;
1585 | max-width: 100%;
1586 | padding-left: .4rem;
1587 | padding-right: .4rem;
1588 | }
1589 |
1590 | [class~="col-"].col-12,
1591 | [class~="col-"].col-11,
1592 | [class~="col-"].col-10,
1593 | [class~="col-"].col-9,
1594 | [class~="col-"].col-8,
1595 | [class~="col-"].col-7,
1596 | [class~="col-"].col-6,
1597 | [class~="col-"].col-5,
1598 | [class~="col-"].col-4,
1599 | [class~="col-"].col-3,
1600 | [class~="col-"].col-2,
1601 | [class~="col-"].col-1,
1602 | [class~="col-"].col-auto,
1603 | .column.col-12,
1604 | .column.col-11,
1605 | .column.col-10,
1606 | .column.col-9,
1607 | .column.col-8,
1608 | .column.col-7,
1609 | .column.col-6,
1610 | .column.col-5,
1611 | .column.col-4,
1612 | .column.col-3,
1613 | .column.col-2,
1614 | .column.col-1,
1615 | .column.col-auto {
1616 | -ms-flex: none;
1617 | flex: none;
1618 | }
1619 |
1620 | .col-12 {
1621 | width: 100%;
1622 | }
1623 |
1624 | .col-11 {
1625 | width: 91.66666667%;
1626 | }
1627 |
1628 | .col-10 {
1629 | width: 83.33333333%;
1630 | }
1631 |
1632 | .col-9 {
1633 | width: 75%;
1634 | }
1635 |
1636 | .col-8 {
1637 | width: 66.66666667%;
1638 | }
1639 |
1640 | .col-7 {
1641 | width: 58.33333333%;
1642 | }
1643 |
1644 | .col-6 {
1645 | width: 50%;
1646 | }
1647 |
1648 | .col-5 {
1649 | width: 41.66666667%;
1650 | }
1651 |
1652 | .col-4 {
1653 | width: 33.33333333%;
1654 | }
1655 |
1656 | .col-3 {
1657 | width: 25%;
1658 | }
1659 |
1660 | .col-2 {
1661 | width: 16.66666667%;
1662 | }
1663 |
1664 | .col-1 {
1665 | width: 8.33333333%;
1666 | }
1667 |
1668 | .col-auto {
1669 | -ms-flex: 0 0 auto;
1670 | flex: 0 0 auto;
1671 | max-width: none;
1672 | width: auto;
1673 | }
1674 |
1675 | .col-mx-auto {
1676 | margin-left: auto;
1677 | margin-right: auto;
1678 | }
1679 |
1680 | .col-ml-auto {
1681 | margin-left: auto;
1682 | }
1683 |
1684 | .col-mr-auto {
1685 | margin-right: auto;
1686 | }
1687 |
1688 | @media (max-width: 1280px) {
1689 | .col-xl-12,
1690 | .col-xl-11,
1691 | .col-xl-10,
1692 | .col-xl-9,
1693 | .col-xl-8,
1694 | .col-xl-7,
1695 | .col-xl-6,
1696 | .col-xl-5,
1697 | .col-xl-4,
1698 | .col-xl-3,
1699 | .col-xl-2,
1700 | .col-xl-1,
1701 | .col-xl-auto {
1702 | -ms-flex: none;
1703 | flex: none;
1704 | }
1705 | .col-xl-12 {
1706 | width: 100%;
1707 | }
1708 | .col-xl-11 {
1709 | width: 91.66666667%;
1710 | }
1711 | .col-xl-10 {
1712 | width: 83.33333333%;
1713 | }
1714 | .col-xl-9 {
1715 | width: 75%;
1716 | }
1717 | .col-xl-8 {
1718 | width: 66.66666667%;
1719 | }
1720 | .col-xl-7 {
1721 | width: 58.33333333%;
1722 | }
1723 | .col-xl-6 {
1724 | width: 50%;
1725 | }
1726 | .col-xl-5 {
1727 | width: 41.66666667%;
1728 | }
1729 | .col-xl-4 {
1730 | width: 33.33333333%;
1731 | }
1732 | .col-xl-3 {
1733 | width: 25%;
1734 | }
1735 | .col-xl-2 {
1736 | width: 16.66666667%;
1737 | }
1738 | .col-xl-1 {
1739 | width: 8.33333333%;
1740 | }
1741 | .col-xl-auto {
1742 | width: auto;
1743 | }
1744 | .hide-xl {
1745 | display: none !important;
1746 | }
1747 | .show-xl {
1748 | display: block !important;
1749 | }
1750 | }
1751 |
1752 | @media (max-width: 960px) {
1753 | .col-lg-12,
1754 | .col-lg-11,
1755 | .col-lg-10,
1756 | .col-lg-9,
1757 | .col-lg-8,
1758 | .col-lg-7,
1759 | .col-lg-6,
1760 | .col-lg-5,
1761 | .col-lg-4,
1762 | .col-lg-3,
1763 | .col-lg-2,
1764 | .col-lg-1,
1765 | .col-lg-auto {
1766 | -ms-flex: none;
1767 | flex: none;
1768 | }
1769 | .col-lg-12 {
1770 | width: 100%;
1771 | }
1772 | .col-lg-11 {
1773 | width: 91.66666667%;
1774 | }
1775 | .col-lg-10 {
1776 | width: 83.33333333%;
1777 | }
1778 | .col-lg-9 {
1779 | width: 75%;
1780 | }
1781 | .col-lg-8 {
1782 | width: 66.66666667%;
1783 | }
1784 | .col-lg-7 {
1785 | width: 58.33333333%;
1786 | }
1787 | .col-lg-6 {
1788 | width: 50%;
1789 | }
1790 | .col-lg-5 {
1791 | width: 41.66666667%;
1792 | }
1793 | .col-lg-4 {
1794 | width: 33.33333333%;
1795 | }
1796 | .col-lg-3 {
1797 | width: 25%;
1798 | }
1799 | .col-lg-2 {
1800 | width: 16.66666667%;
1801 | }
1802 | .col-lg-1 {
1803 | width: 8.33333333%;
1804 | }
1805 | .col-lg-auto {
1806 | width: auto;
1807 | }
1808 | .hide-lg {
1809 | display: none !important;
1810 | }
1811 | .show-lg {
1812 | display: block !important;
1813 | }
1814 | }
1815 |
1816 | @media (max-width: 840px) {
1817 | .col-md-12,
1818 | .col-md-11,
1819 | .col-md-10,
1820 | .col-md-9,
1821 | .col-md-8,
1822 | .col-md-7,
1823 | .col-md-6,
1824 | .col-md-5,
1825 | .col-md-4,
1826 | .col-md-3,
1827 | .col-md-2,
1828 | .col-md-1,
1829 | .col-md-auto {
1830 | -ms-flex: none;
1831 | flex: none;
1832 | }
1833 | .col-md-12 {
1834 | width: 100%;
1835 | }
1836 | .col-md-11 {
1837 | width: 91.66666667%;
1838 | }
1839 | .col-md-10 {
1840 | width: 83.33333333%;
1841 | }
1842 | .col-md-9 {
1843 | width: 75%;
1844 | }
1845 | .col-md-8 {
1846 | width: 66.66666667%;
1847 | }
1848 | .col-md-7 {
1849 | width: 58.33333333%;
1850 | }
1851 | .col-md-6 {
1852 | width: 50%;
1853 | }
1854 | .col-md-5 {
1855 | width: 41.66666667%;
1856 | }
1857 | .col-md-4 {
1858 | width: 33.33333333%;
1859 | }
1860 | .col-md-3 {
1861 | width: 25%;
1862 | }
1863 | .col-md-2 {
1864 | width: 16.66666667%;
1865 | }
1866 | .col-md-1 {
1867 | width: 8.33333333%;
1868 | }
1869 | .col-md-auto {
1870 | width: auto;
1871 | }
1872 | .hide-md {
1873 | display: none !important;
1874 | }
1875 | .show-md {
1876 | display: block !important;
1877 | }
1878 | }
1879 |
1880 | @media (max-width: 600px) {
1881 | .col-sm-12,
1882 | .col-sm-11,
1883 | .col-sm-10,
1884 | .col-sm-9,
1885 | .col-sm-8,
1886 | .col-sm-7,
1887 | .col-sm-6,
1888 | .col-sm-5,
1889 | .col-sm-4,
1890 | .col-sm-3,
1891 | .col-sm-2,
1892 | .col-sm-1,
1893 | .col-sm-auto {
1894 | -ms-flex: none;
1895 | flex: none;
1896 | }
1897 | .col-sm-12 {
1898 | width: 100%;
1899 | }
1900 | .col-sm-11 {
1901 | width: 91.66666667%;
1902 | }
1903 | .col-sm-10 {
1904 | width: 83.33333333%;
1905 | }
1906 | .col-sm-9 {
1907 | width: 75%;
1908 | }
1909 | .col-sm-8 {
1910 | width: 66.66666667%;
1911 | }
1912 | .col-sm-7 {
1913 | width: 58.33333333%;
1914 | }
1915 | .col-sm-6 {
1916 | width: 50%;
1917 | }
1918 | .col-sm-5 {
1919 | width: 41.66666667%;
1920 | }
1921 | .col-sm-4 {
1922 | width: 33.33333333%;
1923 | }
1924 | .col-sm-3 {
1925 | width: 25%;
1926 | }
1927 | .col-sm-2 {
1928 | width: 16.66666667%;
1929 | }
1930 | .col-sm-1 {
1931 | width: 8.33333333%;
1932 | }
1933 | .col-sm-auto {
1934 | width: auto;
1935 | }
1936 | .hide-sm {
1937 | display: none !important;
1938 | }
1939 | .show-sm {
1940 | display: block !important;
1941 | }
1942 | }
1943 |
1944 | @media (max-width: 480px) {
1945 | .col-xs-12,
1946 | .col-xs-11,
1947 | .col-xs-10,
1948 | .col-xs-9,
1949 | .col-xs-8,
1950 | .col-xs-7,
1951 | .col-xs-6,
1952 | .col-xs-5,
1953 | .col-xs-4,
1954 | .col-xs-3,
1955 | .col-xs-2,
1956 | .col-xs-1,
1957 | .col-xs-auto {
1958 | -ms-flex: none;
1959 | flex: none;
1960 | }
1961 | .col-xs-12 {
1962 | width: 100%;
1963 | }
1964 | .col-xs-11 {
1965 | width: 91.66666667%;
1966 | }
1967 | .col-xs-10 {
1968 | width: 83.33333333%;
1969 | }
1970 | .col-xs-9 {
1971 | width: 75%;
1972 | }
1973 | .col-xs-8 {
1974 | width: 66.66666667%;
1975 | }
1976 | .col-xs-7 {
1977 | width: 58.33333333%;
1978 | }
1979 | .col-xs-6 {
1980 | width: 50%;
1981 | }
1982 | .col-xs-5 {
1983 | width: 41.66666667%;
1984 | }
1985 | .col-xs-4 {
1986 | width: 33.33333333%;
1987 | }
1988 | .col-xs-3 {
1989 | width: 25%;
1990 | }
1991 | .col-xs-2 {
1992 | width: 16.66666667%;
1993 | }
1994 | .col-xs-1 {
1995 | width: 8.33333333%;
1996 | }
1997 | .col-xs-auto {
1998 | width: auto;
1999 | }
2000 | .hide-xs {
2001 | display: none !important;
2002 | }
2003 | .show-xs {
2004 | display: block !important;
2005 | }
2006 | }
2007 |
2008 | .hero {
2009 | display: -ms-flexbox;
2010 | display: flex;
2011 | -ms-flex-direction: column;
2012 | flex-direction: column;
2013 | -ms-flex-pack: justify;
2014 | justify-content: space-between;
2015 | padding-bottom: 4rem;
2016 | padding-top: 4rem;
2017 | }
2018 |
2019 | .hero.hero-sm {
2020 | padding-bottom: 2rem;
2021 | padding-top: 2rem;
2022 | }
2023 |
2024 | .hero.hero-lg {
2025 | padding-bottom: 8rem;
2026 | padding-top: 8rem;
2027 | }
2028 |
2029 | .hero .hero-body {
2030 | padding: .4rem;
2031 | }
2032 |
2033 | .navbar {
2034 | align-items: stretch;
2035 | display: -ms-flexbox;
2036 | display: flex;
2037 | -ms-flex-align: stretch;
2038 | -ms-flex-pack: justify;
2039 | -ms-flex-wrap: wrap;
2040 | flex-wrap: wrap;
2041 | justify-content: space-between;
2042 | }
2043 |
2044 | .navbar .navbar-section {
2045 | align-items: center;
2046 | display: -ms-flexbox;
2047 | display: flex;
2048 | -ms-flex: 1 0 0;
2049 | flex: 1 0 0;
2050 | -ms-flex-align: center;
2051 | }
2052 |
2053 | .navbar .navbar-section:not(:first-child):last-child {
2054 | -ms-flex-pack: end;
2055 | justify-content: flex-end;
2056 | }
2057 |
2058 | .navbar .navbar-center {
2059 | align-items: center;
2060 | display: -ms-flexbox;
2061 | display: flex;
2062 | -ms-flex: 0 0 auto;
2063 | flex: 0 0 auto;
2064 | -ms-flex-align: center;
2065 | }
2066 |
2067 | .navbar .navbar-brand {
2068 | font-size: .9rem;
2069 | text-decoration: none;
2070 | }
2071 |
2072 | .accordion input:checked ~ .accordion-header > .icon:first-child,
2073 | .accordion[open] .accordion-header > .icon:first-child {
2074 | transform: rotate(90deg);
2075 | }
2076 |
2077 | .accordion input:checked ~ .accordion-body,
2078 | .accordion[open] .accordion-body {
2079 | max-height: 50rem;
2080 | }
2081 |
2082 | .accordion .accordion-header {
2083 | display: block;
2084 | padding: .2rem .4rem;
2085 | }
2086 |
2087 | .accordion .accordion-header .icon {
2088 | transition: transform .25s;
2089 | }
2090 |
2091 | .accordion .accordion-body {
2092 | margin-bottom: .4rem;
2093 | max-height: 0;
2094 | overflow: hidden;
2095 | transition: max-height .25s;
2096 | }
2097 |
2098 | summary.accordion-header::-webkit-details-marker {
2099 | display: none;
2100 | }
2101 |
2102 | .avatar {
2103 | background: #5755d9;
2104 | border-radius: 50%;
2105 | color: rgba(255, 255, 255, .85);
2106 | display: inline-block;
2107 | font-size: .8rem;
2108 | font-weight: 300;
2109 | height: 1.6rem;
2110 | line-height: 1.25;
2111 | margin: 0;
2112 | position: relative;
2113 | vertical-align: middle;
2114 | width: 1.6rem;
2115 | }
2116 |
2117 | .avatar.avatar-xs {
2118 | font-size: .4rem;
2119 | height: .8rem;
2120 | width: .8rem;
2121 | }
2122 |
2123 | .avatar.avatar-sm {
2124 | font-size: .6rem;
2125 | height: 1.2rem;
2126 | width: 1.2rem;
2127 | }
2128 |
2129 | .avatar.avatar-lg {
2130 | font-size: 1.2rem;
2131 | height: 2.4rem;
2132 | width: 2.4rem;
2133 | }
2134 |
2135 | .avatar.avatar-xl {
2136 | font-size: 1.6rem;
2137 | height: 3.2rem;
2138 | width: 3.2rem;
2139 | }
2140 |
2141 | .avatar img {
2142 | border-radius: 50%;
2143 | height: 100%;
2144 | position: relative;
2145 | width: 100%;
2146 | z-index: 1;
2147 | }
2148 |
2149 | .avatar .avatar-icon,
2150 | .avatar .avatar-presence {
2151 | background: #fff;
2152 | bottom: 14.64%;
2153 | height: 50%;
2154 | padding: .1rem;
2155 | position: absolute;
2156 | right: 14.64%;
2157 | transform: translate(50%, 50%);
2158 | width: 50%;
2159 | z-index: 2;
2160 | }
2161 |
2162 | .avatar .avatar-presence {
2163 | background: #bcc3ce;
2164 | border-radius: 50%;
2165 | box-shadow: 0 0 0 .1rem #fff;
2166 | height: .5em;
2167 | width: .5em;
2168 | }
2169 |
2170 | .avatar .avatar-presence.online {
2171 | background: #32b643;
2172 | }
2173 |
2174 | .avatar .avatar-presence.busy {
2175 | background: #e85600;
2176 | }
2177 |
2178 | .avatar .avatar-presence.away {
2179 | background: #ffb700;
2180 | }
2181 |
2182 | .avatar[data-initial]::before {
2183 | color: currentColor;
2184 | content: attr(data-initial);
2185 | left: 50%;
2186 | position: absolute;
2187 | top: 50%;
2188 | transform: translate(-50%, -50%);
2189 | z-index: 1;
2190 | }
2191 |
2192 | .badge {
2193 | position: relative;
2194 | white-space: nowrap;
2195 | }
2196 |
2197 | .badge[data-badge]::after,
2198 | .badge:not([data-badge])::after {
2199 | background: #5755d9;
2200 | background-clip: padding-box;
2201 | border-radius: .5rem;
2202 | box-shadow: 0 0 0 .1rem #fff;
2203 | color: #fff;
2204 | content: attr(data-badge);
2205 | display: inline-block;
2206 | transform: translate(-.05rem, -.5rem);
2207 | }
2208 |
2209 | .badge[data-badge]::after {
2210 | font-size: .7rem;
2211 | height: .9rem;
2212 | line-height: 1;
2213 | min-width: .9rem;
2214 | padding: .1rem .2rem;
2215 | text-align: center;
2216 | white-space: nowrap;
2217 | }
2218 |
2219 | .badge:not([data-badge])::after,
2220 | .badge[data-badge=""]::after {
2221 | height: 6px;
2222 | min-width: 6px;
2223 | padding: 0;
2224 | width: 6px;
2225 | }
2226 |
2227 | .badge.btn::after {
2228 | position: absolute;
2229 | right: 0;
2230 | top: 0;
2231 | transform: translate(50%, -50%);
2232 | }
2233 |
2234 | .badge.avatar::after {
2235 | position: absolute;
2236 | right: 14.64%;
2237 | top: 14.64%;
2238 | transform: translate(50%, -50%);
2239 | z-index: 100;
2240 | }
2241 |
2242 | .breadcrumb {
2243 | list-style: none;
2244 | margin: .2rem 0;
2245 | padding: .2rem 0;
2246 | }
2247 |
2248 | .breadcrumb .breadcrumb-item {
2249 | color: #66758c;
2250 | display: inline-block;
2251 | margin: 0;
2252 | padding: .2rem 0;
2253 | }
2254 |
2255 | .breadcrumb .breadcrumb-item:not(:last-child) {
2256 | margin-right: .2rem;
2257 | }
2258 |
2259 | .breadcrumb .breadcrumb-item:not(:last-child) a {
2260 | color: #66758c;
2261 | }
2262 |
2263 | .breadcrumb .breadcrumb-item:not(:first-child)::before {
2264 | color: #66758c;
2265 | content: "/";
2266 | padding-right: .4rem;
2267 | }
2268 |
2269 | .bar {
2270 | background: #eef0f3;
2271 | border-radius: .1rem;
2272 | display: -ms-flexbox;
2273 | display: flex;
2274 | -ms-flex-wrap: nowrap;
2275 | flex-wrap: nowrap;
2276 | height: .8rem;
2277 | width: 100%;
2278 | }
2279 |
2280 | .bar.bar-sm {
2281 | height: .2rem;
2282 | }
2283 |
2284 | .bar .bar-item {
2285 | background: #5755d9;
2286 | color: #fff;
2287 | display: block;
2288 | -ms-flex-negative: 0;
2289 | flex-shrink: 0;
2290 | font-size: .7rem;
2291 | height: 100%;
2292 | line-height: .8rem;
2293 | position: relative;
2294 | text-align: center;
2295 | width: 0;
2296 | }
2297 |
2298 | .bar .bar-item:first-child {
2299 | border-bottom-left-radius: .1rem;
2300 | border-top-left-radius: .1rem;
2301 | }
2302 |
2303 | .bar .bar-item:last-child {
2304 | border-bottom-right-radius: .1rem;
2305 | border-top-right-radius: .1rem;
2306 | -ms-flex-negative: 1;
2307 | flex-shrink: 1;
2308 | }
2309 |
2310 | .bar-slider {
2311 | height: .1rem;
2312 | margin: .4rem 0;
2313 | position: relative;
2314 | }
2315 |
2316 | .bar-slider .bar-item {
2317 | left: 0;
2318 | padding: 0;
2319 | position: absolute;
2320 | }
2321 |
2322 | .bar-slider .bar-item:not(:last-child):first-child {
2323 | background: #eef0f3;
2324 | z-index: 1;
2325 | }
2326 |
2327 | .bar-slider .bar-slider-btn {
2328 | background: #5755d9;
2329 | border: 0;
2330 | border-radius: 50%;
2331 | height: .6rem;
2332 | padding: 0;
2333 | position: absolute;
2334 | right: 0;
2335 | top: 50%;
2336 | transform: translate(50%, -50%);
2337 | width: .6rem;
2338 | }
2339 |
2340 | .bar-slider .bar-slider-btn:active {
2341 | box-shadow: 0 0 0 .1rem #5755d9;
2342 | }
2343 |
2344 | .card {
2345 | background: #fff;
2346 | border: .05rem solid #dadee4;
2347 | border-radius: .1rem;
2348 | display: -ms-flexbox;
2349 | display: flex;
2350 | -ms-flex-direction: column;
2351 | flex-direction: column;
2352 | }
2353 |
2354 | .card .card-header,
2355 | .card .card-body,
2356 | .card .card-footer {
2357 | padding: .8rem;
2358 | padding-bottom: 0;
2359 | }
2360 |
2361 | .card .card-header:last-child,
2362 | .card .card-body:last-child,
2363 | .card .card-footer:last-child {
2364 | padding-bottom: .8rem;
2365 | }
2366 |
2367 | .card .card-body {
2368 | -ms-flex: 1 1 auto;
2369 | flex: 1 1 auto;
2370 | }
2371 |
2372 | .card .card-image {
2373 | padding-top: .8rem;
2374 | }
2375 |
2376 | .card .card-image:first-child {
2377 | padding-top: 0;
2378 | }
2379 |
2380 | .card .card-image:first-child img {
2381 | border-top-left-radius: .1rem;
2382 | border-top-right-radius: .1rem;
2383 | }
2384 |
2385 | .card .card-image:last-child img {
2386 | border-bottom-left-radius: .1rem;
2387 | border-bottom-right-radius: .1rem;
2388 | }
2389 |
2390 | .chip {
2391 | align-items: center;
2392 | background: #eef0f3;
2393 | border-radius: 5rem;
2394 | display: -ms-inline-flexbox;
2395 | display: inline-flex;
2396 | -ms-flex-align: center;
2397 | font-size: 90%;
2398 | height: 1.2rem;
2399 | line-height: .8rem;
2400 | margin: .1rem;
2401 | max-width: 320px;
2402 | overflow: hidden;
2403 | padding: .2rem .4rem;
2404 | text-decoration: none;
2405 | text-overflow: ellipsis;
2406 | vertical-align: middle;
2407 | white-space: nowrap;
2408 | }
2409 |
2410 | .chip.active {
2411 | background: #5755d9;
2412 | color: #fff;
2413 | }
2414 |
2415 | .chip .avatar {
2416 | margin-left: -.4rem;
2417 | margin-right: .2rem;
2418 | }
2419 |
2420 | .chip .btn-clear {
2421 | border-radius: 50%;
2422 | transform: scale(.75);
2423 | }
2424 |
2425 | .dropdown {
2426 | display: inline-block;
2427 | position: relative;
2428 | }
2429 |
2430 | .dropdown .menu {
2431 | animation: slide-down .15s ease 1;
2432 | display: none;
2433 | left: 0;
2434 | max-height: 50vh;
2435 | overflow-y: auto;
2436 | position: absolute;
2437 | top: 100%;
2438 | }
2439 |
2440 | .dropdown.dropdown-right .menu {
2441 | left: auto;
2442 | right: 0;
2443 | }
2444 |
2445 | .dropdown.active .menu,
2446 | .dropdown .dropdown-toggle:focus + .menu,
2447 | .dropdown .menu:hover {
2448 | display: block;
2449 | }
2450 |
2451 | .dropdown .btn-group .dropdown-toggle:nth-last-child(2) {
2452 | border-bottom-right-radius: .1rem;
2453 | border-top-right-radius: .1rem;
2454 | }
2455 |
2456 | .empty {
2457 | background: #f7f8f9;
2458 | border-radius: .1rem;
2459 | color: #66758c;
2460 | padding: 3.2rem 1.6rem;
2461 | text-align: center;
2462 | }
2463 |
2464 | .empty .empty-icon {
2465 | margin-bottom: .8rem;
2466 | }
2467 |
2468 | .empty .empty-title,
2469 | .empty .empty-subtitle {
2470 | margin: .4rem auto;
2471 | }
2472 |
2473 | .empty .empty-action {
2474 | margin-top: .8rem;
2475 | }
2476 |
2477 | .menu {
2478 | background: #fff;
2479 | border-radius: .1rem;
2480 | box-shadow: 0 .05rem .2rem rgba(48, 55, 66, .3);
2481 | list-style: none;
2482 | margin: 0;
2483 | min-width: 180px;
2484 | padding: .4rem;
2485 | transform: translateY(.2rem);
2486 | z-index: 300;
2487 | }
2488 |
2489 | .menu.menu-nav {
2490 | background: transparent;
2491 | box-shadow: none;
2492 | }
2493 |
2494 | .menu .menu-item {
2495 | margin-top: 0;
2496 | padding: 0 .4rem;
2497 | position: relative;
2498 | text-decoration: none;
2499 | }
2500 |
2501 | .menu .menu-item > a {
2502 | border-radius: .1rem;
2503 | color: inherit;
2504 | display: block;
2505 | margin: 0 -.4rem;
2506 | padding: .2rem .4rem;
2507 | text-decoration: none;
2508 | }
2509 |
2510 | .menu .menu-item > a:focus,
2511 | .menu .menu-item > a:hover {
2512 | background: #f1f1fc;
2513 | color: #5755d9;
2514 | }
2515 |
2516 | .menu .menu-item > a:active,
2517 | .menu .menu-item > a.active {
2518 | background: #f1f1fc;
2519 | color: #5755d9;
2520 | }
2521 |
2522 | .menu .menu-item .form-checkbox,
2523 | .menu .menu-item .form-radio,
2524 | .menu .menu-item .form-switch {
2525 | margin: .1rem 0;
2526 | }
2527 |
2528 | .menu .menu-item + .menu-item {
2529 | margin-top: .2rem;
2530 | }
2531 |
2532 | .menu .menu-badge {
2533 | align-items: center;
2534 | display: -ms-flexbox;
2535 | display: flex;
2536 | -ms-flex-align: center;
2537 | height: 100%;
2538 | position: absolute;
2539 | right: 0;
2540 | top: 0;
2541 | }
2542 |
2543 | .menu .menu-badge .label {
2544 | margin-right: .4rem;
2545 | }
2546 |
2547 | .modal {
2548 | align-items: center;
2549 | bottom: 0;
2550 | display: none;
2551 | -ms-flex-align: center;
2552 | -ms-flex-pack: center;
2553 | justify-content: center;
2554 | left: 0;
2555 | opacity: 0;
2556 | overflow: hidden;
2557 | padding: .4rem;
2558 | position: fixed;
2559 | right: 0;
2560 | top: 0;
2561 | }
2562 |
2563 | .modal:target,
2564 | .modal.active {
2565 | display: -ms-flexbox;
2566 | display: flex;
2567 | opacity: 1;
2568 | z-index: 400;
2569 | }
2570 |
2571 | .modal:target .modal-overlay,
2572 | .modal.active .modal-overlay {
2573 | background: rgba(247, 248, 249, .75);
2574 | bottom: 0;
2575 | cursor: default;
2576 | display: block;
2577 | left: 0;
2578 | position: absolute;
2579 | right: 0;
2580 | top: 0;
2581 | }
2582 |
2583 | .modal:target .modal-container,
2584 | .modal.active .modal-container {
2585 | animation: slide-down .2s ease 1;
2586 | z-index: 1;
2587 | }
2588 |
2589 | .modal.modal-sm .modal-container {
2590 | max-width: 320px;
2591 | padding: 0 .4rem;
2592 | }
2593 |
2594 | .modal.modal-lg .modal-overlay {
2595 | background: #fff;
2596 | }
2597 |
2598 | .modal.modal-lg .modal-container {
2599 | box-shadow: none;
2600 | max-width: 960px;
2601 | }
2602 |
2603 | .modal-container {
2604 | background: #fff;
2605 | border-radius: .1rem;
2606 | box-shadow: 0 .2rem .5rem rgba(48, 55, 66, .3);
2607 | display: -ms-flexbox;
2608 | display: flex;
2609 | -ms-flex-direction: column;
2610 | flex-direction: column;
2611 | max-height: 75vh;
2612 | max-width: 640px;
2613 | padding: 0 .8rem;
2614 | width: 100%;
2615 | }
2616 |
2617 | .modal-container.modal-fullheight {
2618 | max-height: 100vh;
2619 | }
2620 |
2621 | .modal-container .modal-header {
2622 | color: #303742;
2623 | padding: .8rem;
2624 | }
2625 |
2626 | .modal-container .modal-body {
2627 | overflow-y: auto;
2628 | padding: .8rem;
2629 | position: relative;
2630 | }
2631 |
2632 | .modal-container .modal-footer {
2633 | padding: .8rem;
2634 | text-align: right;
2635 | }
2636 |
2637 | .nav {
2638 | display: -ms-flexbox;
2639 | display: flex;
2640 | -ms-flex-direction: column;
2641 | flex-direction: column;
2642 | list-style: none;
2643 | margin: .2rem 0;
2644 | }
2645 |
2646 | .nav .nav-item a {
2647 | color: #66758c;
2648 | padding: .2rem .4rem;
2649 | text-decoration: none;
2650 | }
2651 |
2652 | .nav .nav-item a:focus,
2653 | .nav .nav-item a:hover {
2654 | color: #5755d9;
2655 | }
2656 |
2657 | .nav .nav-item.active > a {
2658 | color: #505c6e;
2659 | font-weight: bold;
2660 | }
2661 |
2662 | .nav .nav-item.active > a:focus,
2663 | .nav .nav-item.active > a:hover {
2664 | color: #5755d9;
2665 | }
2666 |
2667 | .nav .nav {
2668 | margin-bottom: .4rem;
2669 | margin-left: .8rem;
2670 | }
2671 |
2672 | .pagination {
2673 | display: -ms-flexbox;
2674 | display: flex;
2675 | list-style: none;
2676 | margin: .2rem 0;
2677 | padding: .2rem 0;
2678 | }
2679 |
2680 | .pagination .page-item {
2681 | margin: .2rem .05rem;
2682 | }
2683 |
2684 | .pagination .page-item span {
2685 | display: inline-block;
2686 | padding: .2rem .2rem;
2687 | }
2688 |
2689 | .pagination .page-item a {
2690 | border-radius: .1rem;
2691 | display: inline-block;
2692 | padding: .2rem .4rem;
2693 | text-decoration: none;
2694 | }
2695 |
2696 | .pagination .page-item a:focus,
2697 | .pagination .page-item a:hover {
2698 | color: #5755d9;
2699 | }
2700 |
2701 | .pagination .page-item.disabled a {
2702 | cursor: default;
2703 | opacity: .5;
2704 | pointer-events: none;
2705 | }
2706 |
2707 | .pagination .page-item.active a {
2708 | background: #5755d9;
2709 | color: #fff;
2710 | }
2711 |
2712 | .pagination .page-item.page-prev,
2713 | .pagination .page-item.page-next {
2714 | -ms-flex: 1 0 50%;
2715 | flex: 1 0 50%;
2716 | }
2717 |
2718 | .pagination .page-item.page-next {
2719 | text-align: right;
2720 | }
2721 |
2722 | .pagination .page-item .page-item-title {
2723 | margin: 0;
2724 | }
2725 |
2726 | .pagination .page-item .page-item-subtitle {
2727 | margin: 0;
2728 | opacity: .5;
2729 | }
2730 |
2731 | .panel {
2732 | border: .05rem solid #dadee4;
2733 | border-radius: .1rem;
2734 | display: -ms-flexbox;
2735 | display: flex;
2736 | -ms-flex-direction: column;
2737 | flex-direction: column;
2738 | }
2739 |
2740 | .panel .panel-header,
2741 | .panel .panel-footer {
2742 | -ms-flex: 0 0 auto;
2743 | flex: 0 0 auto;
2744 | padding: .8rem;
2745 | }
2746 |
2747 | .panel .panel-nav {
2748 | -ms-flex: 0 0 auto;
2749 | flex: 0 0 auto;
2750 | }
2751 |
2752 | .panel .panel-body {
2753 | -ms-flex: 1 1 auto;
2754 | flex: 1 1 auto;
2755 | overflow-y: auto;
2756 | padding: 0 .8rem;
2757 | }
2758 |
2759 | .popover {
2760 | display: inline-block;
2761 | position: relative;
2762 | }
2763 |
2764 | .popover .popover-container {
2765 | left: 50%;
2766 | opacity: 0;
2767 | padding: .4rem;
2768 | position: absolute;
2769 | top: 0;
2770 | transform: translate(-50%, -50%) scale(0);
2771 | transition: transform .2s;
2772 | width: 320px;
2773 | z-index: 300;
2774 | }
2775 |
2776 | .popover *:focus + .popover-container,
2777 | .popover:hover .popover-container {
2778 | display: block;
2779 | opacity: 1;
2780 | transform: translate(-50%, -100%) scale(1);
2781 | }
2782 |
2783 | .popover.popover-right .popover-container {
2784 | left: 100%;
2785 | top: 50%;
2786 | }
2787 |
2788 | .popover.popover-right *:focus + .popover-container,
2789 | .popover.popover-right:hover .popover-container {
2790 | transform: translate(0, -50%) scale(1);
2791 | }
2792 |
2793 | .popover.popover-bottom .popover-container {
2794 | left: 50%;
2795 | top: 100%;
2796 | }
2797 |
2798 | .popover.popover-bottom *:focus + .popover-container,
2799 | .popover.popover-bottom:hover .popover-container {
2800 | transform: translate(-50%, 0) scale(1);
2801 | }
2802 |
2803 | .popover.popover-left .popover-container {
2804 | left: 0;
2805 | top: 50%;
2806 | }
2807 |
2808 | .popover.popover-left *:focus + .popover-container,
2809 | .popover.popover-left:hover .popover-container {
2810 | transform: translate(-100%, -50%) scale(1);
2811 | }
2812 |
2813 | .popover .card {
2814 | border: 0;
2815 | box-shadow: 0 .2rem .5rem rgba(48, 55, 66, .3);
2816 | }
2817 |
2818 | .step {
2819 | display: -ms-flexbox;
2820 | display: flex;
2821 | -ms-flex-wrap: nowrap;
2822 | flex-wrap: nowrap;
2823 | list-style: none;
2824 | margin: .2rem 0;
2825 | width: 100%;
2826 | }
2827 |
2828 | .step .step-item {
2829 | -ms-flex: 1 1 0;
2830 | flex: 1 1 0;
2831 | margin-top: 0;
2832 | min-height: 1rem;
2833 | position: relative;
2834 | text-align: center;
2835 | }
2836 |
2837 | .step .step-item:not(:first-child)::before {
2838 | background: #5755d9;
2839 | content: "";
2840 | height: 2px;
2841 | left: -50%;
2842 | position: absolute;
2843 | top: 9px;
2844 | width: 100%;
2845 | }
2846 |
2847 | .step .step-item a {
2848 | color: #5755d9;
2849 | display: inline-block;
2850 | padding: 20px 10px 0;
2851 | text-decoration: none;
2852 | }
2853 |
2854 | .step .step-item a::before {
2855 | background: #5755d9;
2856 | border: .1rem solid #fff;
2857 | border-radius: 50%;
2858 | content: "";
2859 | display: block;
2860 | height: .6rem;
2861 | left: 50%;
2862 | position: absolute;
2863 | top: .2rem;
2864 | transform: translateX(-50%);
2865 | width: .6rem;
2866 | z-index: 1;
2867 | }
2868 |
2869 | .step .step-item.active a::before {
2870 | background: #fff;
2871 | border: .1rem solid #5755d9;
2872 | }
2873 |
2874 | .step .step-item.active ~ .step-item::before {
2875 | background: #dadee4;
2876 | }
2877 |
2878 | .step .step-item.active ~ .step-item a {
2879 | color: #bcc3ce;
2880 | }
2881 |
2882 | .step .step-item.active ~ .step-item a::before {
2883 | background: #dadee4;
2884 | }
2885 |
2886 | .tab {
2887 | align-items: center;
2888 | border-bottom: .05rem solid #dadee4;
2889 | display: -ms-flexbox;
2890 | display: flex;
2891 | -ms-flex-align: center;
2892 | -ms-flex-wrap: wrap;
2893 | flex-wrap: wrap;
2894 | list-style: none;
2895 | margin: .2rem 0 .15rem 0;
2896 | }
2897 |
2898 | .tab .tab-item {
2899 | margin-top: 0;
2900 | }
2901 |
2902 | .tab .tab-item a {
2903 | border-bottom: .1rem solid transparent;
2904 | color: inherit;
2905 | display: block;
2906 | margin: 0 .4rem 0 0;
2907 | padding: .4rem .2rem .3rem .2rem;
2908 | text-decoration: none;
2909 | }
2910 |
2911 | .tab .tab-item a:focus,
2912 | .tab .tab-item a:hover {
2913 | color: #5755d9;
2914 | }
2915 |
2916 | .tab .tab-item.active a,
2917 | .tab .tab-item a.active {
2918 | border-bottom-color: #5755d9;
2919 | color: #5755d9;
2920 | }
2921 |
2922 | .tab .tab-item.tab-action {
2923 | -ms-flex: 1 0 auto;
2924 | flex: 1 0 auto;
2925 | text-align: right;
2926 | }
2927 |
2928 | .tab .tab-item .btn-clear {
2929 | margin-top: -.2rem;
2930 | }
2931 |
2932 | .tab.tab-block .tab-item {
2933 | -ms-flex: 1 0 0;
2934 | flex: 1 0 0;
2935 | text-align: center;
2936 | }
2937 |
2938 | .tab.tab-block .tab-item a {
2939 | margin: 0;
2940 | }
2941 |
2942 | .tab.tab-block .tab-item .badge[data-badge]::after {
2943 | position: absolute;
2944 | right: .1rem;
2945 | top: .1rem;
2946 | transform: translate(0, 0);
2947 | }
2948 |
2949 | .tab:not(.tab-block) .badge {
2950 | padding-right: 0;
2951 | }
2952 |
2953 | .tile {
2954 | align-content: space-between;
2955 | align-items: flex-start;
2956 | display: -ms-flexbox;
2957 | display: flex;
2958 | -ms-flex-align: start;
2959 | -ms-flex-line-pack: justify;
2960 | }
2961 |
2962 | .tile .tile-icon,
2963 | .tile .tile-action {
2964 | -ms-flex: 0 0 auto;
2965 | flex: 0 0 auto;
2966 | }
2967 |
2968 | .tile .tile-content {
2969 | -ms-flex: 1 1 auto;
2970 | flex: 1 1 auto;
2971 | }
2972 |
2973 | .tile .tile-content:not(:first-child) {
2974 | padding-left: .4rem;
2975 | }
2976 |
2977 | .tile .tile-content:not(:last-child) {
2978 | padding-right: .4rem;
2979 | }
2980 |
2981 | .tile .tile-title,
2982 | .tile .tile-subtitle {
2983 | line-height: 1.2rem;
2984 | }
2985 |
2986 | .tile.tile-centered {
2987 | align-items: center;
2988 | -ms-flex-align: center;
2989 | }
2990 |
2991 | .tile.tile-centered .tile-content {
2992 | overflow: hidden;
2993 | }
2994 |
2995 | .tile.tile-centered .tile-title,
2996 | .tile.tile-centered .tile-subtitle {
2997 | margin-bottom: 0;
2998 | overflow: hidden;
2999 | text-overflow: ellipsis;
3000 | white-space: nowrap;
3001 | }
3002 |
3003 | .toast {
3004 | background: rgba(48, 55, 66, .95);
3005 | border: .05rem solid #303742;
3006 | border-color: #303742;
3007 | border-radius: .1rem;
3008 | color: #fff;
3009 | display: block;
3010 | padding: .4rem;
3011 | width: 100%;
3012 | }
3013 |
3014 | .toast.toast-primary {
3015 | background: rgba(87, 85, 217, .95);
3016 | border-color: #5755d9;
3017 | }
3018 |
3019 | .toast.toast-success {
3020 | background: rgba(50, 182, 67, .95);
3021 | border-color: #32b643;
3022 | }
3023 |
3024 | .toast.toast-warning {
3025 | background: rgba(255, 183, 0, .95);
3026 | border-color: #ffb700;
3027 | }
3028 |
3029 | .toast.toast-error {
3030 | background: rgba(232, 86, 0, .95);
3031 | border-color: #e85600;
3032 | }
3033 |
3034 | .toast a {
3035 | color: #fff;
3036 | text-decoration: underline;
3037 | }
3038 |
3039 | .toast a:focus,
3040 | .toast a:hover,
3041 | .toast a:active,
3042 | .toast a.active {
3043 | opacity: .75;
3044 | }
3045 |
3046 | .toast .btn-clear {
3047 | margin: .1rem;
3048 | }
3049 |
3050 | .toast p:last-child {
3051 | margin-bottom: 0;
3052 | }
3053 |
3054 | .tooltip {
3055 | position: relative;
3056 | }
3057 |
3058 | .tooltip::after {
3059 | background: rgba(48, 55, 66, .95);
3060 | border-radius: .1rem;
3061 | bottom: 100%;
3062 | color: #fff;
3063 | content: attr(data-tooltip);
3064 | display: block;
3065 | font-size: .7rem;
3066 | left: 50%;
3067 | max-width: 320px;
3068 | opacity: 0;
3069 | overflow: hidden;
3070 | padding: .2rem .4rem;
3071 | pointer-events: none;
3072 | position: absolute;
3073 | text-overflow: ellipsis;
3074 | transform: translate(-50%, .4rem);
3075 | transition: opacity .2s, transform .2s;
3076 | white-space: pre;
3077 | z-index: 300;
3078 | }
3079 |
3080 | .tooltip:focus::after,
3081 | .tooltip:hover::after {
3082 | opacity: 1;
3083 | transform: translate(-50%, -.2rem);
3084 | }
3085 |
3086 | .tooltip[disabled],
3087 | .tooltip.disabled {
3088 | pointer-events: auto;
3089 | }
3090 |
3091 | .tooltip.tooltip-right::after {
3092 | bottom: 50%;
3093 | left: 100%;
3094 | transform: translate(-.2rem, 50%);
3095 | }
3096 |
3097 | .tooltip.tooltip-right:focus::after,
3098 | .tooltip.tooltip-right:hover::after {
3099 | transform: translate(.2rem, 50%);
3100 | }
3101 |
3102 | .tooltip.tooltip-bottom::after {
3103 | bottom: auto;
3104 | top: 100%;
3105 | transform: translate(-50%, -.4rem);
3106 | }
3107 |
3108 | .tooltip.tooltip-bottom:focus::after,
3109 | .tooltip.tooltip-bottom:hover::after {
3110 | transform: translate(-50%, .2rem);
3111 | }
3112 |
3113 | .tooltip.tooltip-left::after {
3114 | bottom: 50%;
3115 | left: auto;
3116 | right: 100%;
3117 | transform: translate(.4rem, 50%);
3118 | }
3119 |
3120 | .tooltip.tooltip-left:focus::after,
3121 | .tooltip.tooltip-left:hover::after {
3122 | transform: translate(-.2rem, 50%);
3123 | }
3124 |
3125 | @keyframes loading {
3126 | 0% {
3127 | transform: rotate(0deg);
3128 | }
3129 | 100% {
3130 | transform: rotate(360deg);
3131 | }
3132 | }
3133 |
3134 | @keyframes slide-down {
3135 | 0% {
3136 | opacity: 0;
3137 | transform: translateY(-1.6rem);
3138 | }
3139 | 100% {
3140 | opacity: 1;
3141 | transform: translateY(0);
3142 | }
3143 | }
3144 |
3145 | .text-primary {
3146 | color: #5755d9 !important;
3147 | }
3148 |
3149 | a.text-primary:focus,
3150 | a.text-primary:hover {
3151 | color: #4240d4;
3152 | }
3153 |
3154 | a.text-primary:visited {
3155 | color: #6c6ade;
3156 | }
3157 |
3158 | .text-secondary {
3159 | color: #e5e5f9 !important;
3160 | }
3161 |
3162 | a.text-secondary:focus,
3163 | a.text-secondary:hover {
3164 | color: #d1d0f4;
3165 | }
3166 |
3167 | a.text-secondary:visited {
3168 | color: #fafafe;
3169 | }
3170 |
3171 | .text-gray {
3172 | color: #bcc3ce !important;
3173 | }
3174 |
3175 | a.text-gray:focus,
3176 | a.text-gray:hover {
3177 | color: #adb6c4;
3178 | }
3179 |
3180 | a.text-gray:visited {
3181 | color: #cbd0d9;
3182 | }
3183 |
3184 | .text-light {
3185 | color: #fff !important;
3186 | }
3187 |
3188 | a.text-light:focus,
3189 | a.text-light:hover {
3190 | color: #f2f2f2;
3191 | }
3192 |
3193 | a.text-light:visited {
3194 | color: white;
3195 | }
3196 |
3197 | .text-dark {
3198 | color: #3b4351 !important;
3199 | }
3200 |
3201 | a.text-dark:focus,
3202 | a.text-dark:hover {
3203 | color: #303742;
3204 | }
3205 |
3206 | a.text-dark:visited {
3207 | color: #455060;
3208 | }
3209 |
3210 | .text-success {
3211 | color: #32b643 !important;
3212 | }
3213 |
3214 | a.text-success:focus,
3215 | a.text-success:hover {
3216 | color: #2da23c;
3217 | }
3218 |
3219 | a.text-success:visited {
3220 | color: #39c94b;
3221 | }
3222 |
3223 | .text-warning {
3224 | color: #ffb700 !important;
3225 | }
3226 |
3227 | a.text-warning:focus,
3228 | a.text-warning:hover {
3229 | color: #e6a500;
3230 | }
3231 |
3232 | a.text-warning:visited {
3233 | color: #ffbe1a;
3234 | }
3235 |
3236 | .text-error {
3237 | color: #e85600 !important;
3238 | }
3239 |
3240 | a.text-error:focus,
3241 | a.text-error:hover {
3242 | color: #cf4d00;
3243 | }
3244 |
3245 | a.text-error:visited {
3246 | color: #ff6003;
3247 | }
3248 |
3249 | .bg-primary {
3250 | background: #5755d9 !important;
3251 | color: #fff;
3252 | }
3253 |
3254 | .bg-secondary {
3255 | background: #f1f1fc !important;
3256 | }
3257 |
3258 | .bg-dark {
3259 | background: #303742 !important;
3260 | color: #fff;
3261 | }
3262 |
3263 | .bg-gray {
3264 | background: #f7f8f9 !important;
3265 | }
3266 |
3267 | .bg-success {
3268 | background: #32b643 !important;
3269 | color: #fff;
3270 | }
3271 |
3272 | .bg-warning {
3273 | background: #ffb700 !important;
3274 | color: #fff;
3275 | }
3276 |
3277 | .bg-error {
3278 | background: #e85600 !important;
3279 | color: #fff;
3280 | }
3281 |
3282 | .c-hand {
3283 | cursor: pointer;
3284 | }
3285 |
3286 | .c-move {
3287 | cursor: move;
3288 | }
3289 |
3290 | .c-zoom-in {
3291 | cursor: zoom-in;
3292 | }
3293 |
3294 | .c-zoom-out {
3295 | cursor: zoom-out;
3296 | }
3297 |
3298 | .c-not-allowed {
3299 | cursor: not-allowed;
3300 | }
3301 |
3302 | .c-auto {
3303 | cursor: auto;
3304 | }
3305 |
3306 | .d-block {
3307 | display: block;
3308 | }
3309 |
3310 | .d-inline {
3311 | display: inline;
3312 | }
3313 |
3314 | .d-inline-block {
3315 | display: inline-block;
3316 | }
3317 |
3318 | .d-flex {
3319 | display: -ms-flexbox;
3320 | display: flex;
3321 | }
3322 |
3323 | .d-inline-flex {
3324 | display: -ms-inline-flexbox;
3325 | display: inline-flex;
3326 | }
3327 |
3328 | .d-none,
3329 | .d-hide {
3330 | display: none !important;
3331 | }
3332 |
3333 | .d-visible {
3334 | visibility: visible;
3335 | }
3336 |
3337 | .d-invisible {
3338 | visibility: hidden;
3339 | }
3340 |
3341 | .text-hide {
3342 | background: transparent;
3343 | border: 0;
3344 | color: transparent;
3345 | font-size: 0;
3346 | line-height: 0;
3347 | text-shadow: none;
3348 | }
3349 |
3350 | .text-assistive {
3351 | border: 0;
3352 | clip: rect(0, 0, 0, 0);
3353 | height: 1px;
3354 | margin: -1px;
3355 | overflow: hidden;
3356 | padding: 0;
3357 | position: absolute;
3358 | width: 1px;
3359 | }
3360 |
3361 | .divider,
3362 | .divider-vert {
3363 | display: block;
3364 | position: relative;
3365 | }
3366 |
3367 | .divider[data-content]::after,
3368 | .divider-vert[data-content]::after {
3369 | background: #fff;
3370 | color: #bcc3ce;
3371 | content: attr(data-content);
3372 | display: inline-block;
3373 | font-size: .7rem;
3374 | padding: 0 .4rem;
3375 | transform: translateY(-.65rem);
3376 | }
3377 |
3378 | .divider {
3379 | border-top: .05rem solid #f1f3f5;
3380 | height: .05rem;
3381 | margin: .4rem 0;
3382 | }
3383 |
3384 | .divider[data-content] {
3385 | margin: .8rem 0;
3386 | }
3387 |
3388 | .divider-vert {
3389 | display: block;
3390 | padding: .8rem;
3391 | }
3392 |
3393 | .divider-vert::before {
3394 | border-left: .05rem solid #dadee4;
3395 | bottom: .4rem;
3396 | content: "";
3397 | display: block;
3398 | left: 50%;
3399 | position: absolute;
3400 | top: .4rem;
3401 | transform: translateX(-50%);
3402 | }
3403 |
3404 | .divider-vert[data-content]::after {
3405 | left: 50%;
3406 | padding: .2rem 0;
3407 | position: absolute;
3408 | top: 50%;
3409 | transform: translate(-50%, -50%);
3410 | }
3411 |
3412 | .loading {
3413 | color: transparent !important;
3414 | min-height: .8rem;
3415 | pointer-events: none;
3416 | position: relative;
3417 | }
3418 |
3419 | .loading::after {
3420 | animation: loading 500ms infinite linear;
3421 | background: transparent;
3422 | border: .1rem solid #5755d9;
3423 | border-radius: 50%;
3424 | border-right-color: transparent;
3425 | border-top-color: transparent;
3426 | content: "";
3427 | display: block;
3428 | height: .8rem;
3429 | left: 50%;
3430 | margin-left: -.4rem;
3431 | margin-top: -.4rem;
3432 | opacity: 1;
3433 | padding: 0;
3434 | position: absolute;
3435 | top: 50%;
3436 | width: .8rem;
3437 | z-index: 1;
3438 | }
3439 |
3440 | .loading.loading-lg {
3441 | min-height: 2rem;
3442 | }
3443 |
3444 | .loading.loading-lg::after {
3445 | height: 1.6rem;
3446 | margin-left: -.8rem;
3447 | margin-top: -.8rem;
3448 | width: 1.6rem;
3449 | }
3450 |
3451 | .clearfix::after {
3452 | clear: both;
3453 | content: "";
3454 | display: table;
3455 | }
3456 |
3457 | .float-left {
3458 | float: left !important;
3459 | }
3460 |
3461 | .float-right {
3462 | float: right !important;
3463 | }
3464 |
3465 | .p-relative {
3466 | position: relative !important;
3467 | }
3468 |
3469 | .p-absolute {
3470 | position: absolute !important;
3471 | }
3472 |
3473 | .p-fixed {
3474 | position: fixed !important;
3475 | }
3476 |
3477 | .p-sticky {
3478 | position: -webkit-sticky !important;
3479 | position: sticky !important;
3480 | }
3481 |
3482 | .p-centered {
3483 | display: block;
3484 | float: none;
3485 | margin-left: auto;
3486 | margin-right: auto;
3487 | }
3488 |
3489 | .flex-centered {
3490 | align-items: center;
3491 | display: -ms-flexbox;
3492 | display: flex;
3493 | -ms-flex-align: center;
3494 | -ms-flex-pack: center;
3495 | justify-content: center;
3496 | }
3497 |
3498 | .m-0 {
3499 | margin: 0 !important;
3500 | }
3501 |
3502 | .mb-0 {
3503 | margin-bottom: 0 !important;
3504 | }
3505 |
3506 | .ml-0 {
3507 | margin-left: 0 !important;
3508 | }
3509 |
3510 | .mr-0 {
3511 | margin-right: 0 !important;
3512 | }
3513 |
3514 | .mt-0 {
3515 | margin-top: 0 !important;
3516 | }
3517 |
3518 | .mx-0 {
3519 | margin-left: 0 !important;
3520 | margin-right: 0 !important;
3521 | }
3522 |
3523 | .my-0 {
3524 | margin-bottom: 0 !important;
3525 | margin-top: 0 !important;
3526 | }
3527 |
3528 | .m-1 {
3529 | margin: .2rem !important;
3530 | }
3531 |
3532 | .mb-1 {
3533 | margin-bottom: .2rem !important;
3534 | }
3535 |
3536 | .ml-1 {
3537 | margin-left: .2rem !important;
3538 | }
3539 |
3540 | .mr-1 {
3541 | margin-right: .2rem !important;
3542 | }
3543 |
3544 | .mt-1 {
3545 | margin-top: .2rem !important;
3546 | }
3547 |
3548 | .mx-1 {
3549 | margin-left: .2rem !important;
3550 | margin-right: .2rem !important;
3551 | }
3552 |
3553 | .my-1 {
3554 | margin-bottom: .2rem !important;
3555 | margin-top: .2rem !important;
3556 | }
3557 |
3558 | .m-2 {
3559 | margin: .4rem !important;
3560 | }
3561 |
3562 | .mb-2 {
3563 | margin-bottom: .4rem !important;
3564 | }
3565 |
3566 | .ml-2 {
3567 | margin-left: .4rem !important;
3568 | }
3569 |
3570 | .mr-2 {
3571 | margin-right: .4rem !important;
3572 | }
3573 |
3574 | .mt-2 {
3575 | margin-top: .4rem !important;
3576 | }
3577 |
3578 | .mx-2 {
3579 | margin-left: .4rem !important;
3580 | margin-right: .4rem !important;
3581 | }
3582 |
3583 | .my-2 {
3584 | margin-bottom: .4rem !important;
3585 | margin-top: .4rem !important;
3586 | }
3587 |
3588 | .p-0 {
3589 | padding: 0 !important;
3590 | }
3591 |
3592 | .pb-0 {
3593 | padding-bottom: 0 !important;
3594 | }
3595 |
3596 | .pl-0 {
3597 | padding-left: 0 !important;
3598 | }
3599 |
3600 | .pr-0 {
3601 | padding-right: 0 !important;
3602 | }
3603 |
3604 | .pt-0 {
3605 | padding-top: 0 !important;
3606 | }
3607 |
3608 | .px-0 {
3609 | padding-left: 0 !important;
3610 | padding-right: 0 !important;
3611 | }
3612 |
3613 | .py-0 {
3614 | padding-bottom: 0 !important;
3615 | padding-top: 0 !important;
3616 | }
3617 |
3618 | .p-1 {
3619 | padding: .2rem !important;
3620 | }
3621 |
3622 | .pb-1 {
3623 | padding-bottom: .2rem !important;
3624 | }
3625 |
3626 | .pl-1 {
3627 | padding-left: .2rem !important;
3628 | }
3629 |
3630 | .pr-1 {
3631 | padding-right: .2rem !important;
3632 | }
3633 |
3634 | .pt-1 {
3635 | padding-top: .2rem !important;
3636 | }
3637 |
3638 | .px-1 {
3639 | padding-left: .2rem !important;
3640 | padding-right: .2rem !important;
3641 | }
3642 |
3643 | .py-1 {
3644 | padding-bottom: .2rem !important;
3645 | padding-top: .2rem !important;
3646 | }
3647 |
3648 | .p-2 {
3649 | padding: .4rem !important;
3650 | }
3651 |
3652 | .pb-2 {
3653 | padding-bottom: .4rem !important;
3654 | }
3655 |
3656 | .pl-2 {
3657 | padding-left: .4rem !important;
3658 | }
3659 |
3660 | .pr-2 {
3661 | padding-right: .4rem !important;
3662 | }
3663 |
3664 | .pt-2 {
3665 | padding-top: .4rem !important;
3666 | }
3667 |
3668 | .px-2 {
3669 | padding-left: .4rem !important;
3670 | padding-right: .4rem !important;
3671 | }
3672 |
3673 | .py-2 {
3674 | padding-bottom: .4rem !important;
3675 | padding-top: .4rem !important;
3676 | }
3677 |
3678 | .s-rounded {
3679 | border-radius: .1rem;
3680 | }
3681 |
3682 | .s-circle {
3683 | border-radius: 50%;
3684 | }
3685 |
3686 | .text-left {
3687 | text-align: left;
3688 | }
3689 |
3690 | .text-right {
3691 | text-align: right;
3692 | }
3693 |
3694 | .text-center {
3695 | text-align: center;
3696 | }
3697 |
3698 | .text-justify {
3699 | text-align: justify;
3700 | }
3701 |
3702 | .text-lowercase {
3703 | text-transform: lowercase;
3704 | }
3705 |
3706 | .text-uppercase {
3707 | text-transform: uppercase;
3708 | }
3709 |
3710 | .text-capitalize {
3711 | text-transform: capitalize;
3712 | }
3713 |
3714 | .text-normal {
3715 | font-weight: normal;
3716 | }
3717 |
3718 | .text-bold {
3719 | font-weight: bold;
3720 | }
3721 |
3722 | .text-italic {
3723 | font-style: italic;
3724 | }
3725 |
3726 | .text-large {
3727 | font-size: 1.2em;
3728 | }
3729 |
3730 | .text-small {
3731 | font-size: .9em;
3732 | }
3733 |
3734 | .text-tiny {
3735 | font-size: .8em;
3736 | }
3737 |
3738 | .text-muted {
3739 | opacity: .8;
3740 | }
3741 |
3742 | .text-ellipsis {
3743 | overflow: hidden;
3744 | text-overflow: ellipsis;
3745 | white-space: nowrap;
3746 | }
3747 |
3748 | .text-clip {
3749 | overflow: hidden;
3750 | text-overflow: clip;
3751 | white-space: nowrap;
3752 | }
3753 |
3754 | .text-break {
3755 | -webkit-hyphens: auto;
3756 | -ms-hyphens: auto;
3757 | hyphens: auto;
3758 | word-break: break-word;
3759 | word-wrap: break-word;
3760 | }
--------------------------------------------------------------------------------