├── .gitignore ├── .prettierignore ├── .replit ├── LICENSE ├── README.md ├── csscomb.config.json ├── dist ├── js │ └── toggle.min.js ├── v1 │ ├── dark.css │ ├── dark.min.css │ ├── library.css │ ├── library.min.css │ ├── light.css │ └── light.min.css └── v2 │ ├── forms.css │ ├── forms.min.css │ ├── full │ ├── dark.css │ ├── dark.min.css │ ├── light.css │ └── light.min.css │ ├── images.css │ ├── images.min.css │ ├── tables.css │ ├── tables.min.css │ ├── themes │ ├── dark.css │ ├── dark.min.css │ ├── light.css │ └── light.min.css │ ├── typography.css │ └── typography.min.css ├── eslint.config.json ├── package.json ├── prettier.config.json ├── replit.nix ├── src ├── builds │ ├── forms.css │ ├── full │ │ ├── dark.css │ │ └── light.css │ ├── images.css │ ├── tables.css │ ├── themes │ │ ├── dark.css │ │ └── light.css │ └── typography.css ├── preview │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── files.html │ ├── furretcss │ │ ├── js │ │ │ └── theme-toggle.js │ │ └── v1 │ │ │ ├── dark.css │ │ │ ├── dark.min.css │ │ │ ├── library.css │ │ │ ├── library.min.css │ │ │ ├── light.css │ │ │ └── light.min.css │ ├── highlightjs │ │ ├── dark.css │ │ ├── highlight.js │ │ └── light.css │ ├── index.html │ ├── logo.png │ ├── mstile-150x150.png │ ├── safari-pinned-tab.svg │ ├── site.webmanifest │ └── theming.html └── styles │ ├── assets │ ├── mail.svg │ ├── message.svg │ └── phone.svg │ ├── core.css │ ├── partials │ ├── _code.css │ ├── _footer.css │ ├── _forms.css │ ├── _images.css │ ├── _lists.css │ ├── _meta.css │ ├── _misc.css │ ├── _nav.css │ ├── _tables.css │ └── _typography.css │ ├── themes │ ├── variables-dark.css │ └── variables-light.css │ └── variables.css ├── stylelint.config.json ├── website ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── files.html ├── furretcss │ ├── js │ │ ├── theme-toggle.js │ │ └── theme-toggle.js.map │ ├── v1 │ │ ├── dark.css │ │ ├── dark.min.css │ │ ├── library.css │ │ ├── library.min.css │ │ ├── light.css │ │ └── light.min.css │ └── v2 │ │ ├── forms.css │ │ ├── forms.min.css │ │ ├── full │ │ ├── dark.css │ │ ├── dark.min.css │ │ ├── light.css │ │ └── light.min.css │ │ ├── images.css │ │ ├── images.min.css │ │ ├── tables.css │ │ ├── tables.min.css │ │ ├── themes │ │ ├── dark.css │ │ ├── dark.min.css │ │ ├── light.css │ │ └── light.min.css │ │ ├── typography.css │ │ └── typography.min.css ├── highlightjs │ ├── dark.css │ ├── furret.css │ ├── highlight.js │ ├── highlight.js.map │ └── light.css ├── index.html ├── logo.png ├── mstile-150x150.png ├── safari-pinned-tab.svg ├── site.webmanifest └── theming.html └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | 93 | # Gatsby files 94 | .cache/ 95 | # Comment in the public line in if your project uses Gatsby and not Next.js 96 | # https://nextjs.org/blog/next-9-1#public-directory-support 97 | # public 98 | 99 | # vuepress build output 100 | .vuepress/dist 101 | 102 | # vuepress v2.x temp and cache directory 103 | .temp 104 | .cache 105 | 106 | # Docusaurus cache and generated files 107 | .docusaurus 108 | 109 | # Serverless directories 110 | .serverless/ 111 | 112 | # FuseBox cache 113 | .fusebox/ 114 | 115 | # DynamoDB Local files 116 | .dynamodb/ 117 | 118 | # TernJS port file 119 | .tern-port 120 | 121 | # Stores VSCode versions used for testing VSCode extensions 122 | .vscode-test 123 | 124 | # yarn v2 125 | .yarn/cache 126 | .yarn/unplugged 127 | .yarn/build-state.yml 128 | .yarn/install-state.gz 129 | .pnp.* 130 | yarn-error.log 131 | 132 | # replit 133 | .upm 134 | .config 135 | .cache -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | yarn-error.log 132 | 133 | # distribution files 134 | dist/ 135 | website/ 136 | 137 | # replit 138 | .upm/ 139 | .config/ 140 | .cache/ -------------------------------------------------------------------------------- /.replit: -------------------------------------------------------------------------------- 1 | entrypoint = "src/styles/core.css" 2 | run = "yarn prod" 3 | 4 | hidden = [".config"] 5 | 6 | [nix] 7 | channel = "stable-21_11" 8 | 9 | [env] 10 | XDG_CONFIG_HOME = "/home/runner/.config" 11 | 12 | [packager] 13 | language = "nodejs" 14 | 15 | [packager.features] 16 | packageSearch = true 17 | guessImports = true 18 | enabledForHosting = false 19 | 20 | [languages.javascript] 21 | pattern = "**/{*.js,*.jsx,*.ts,*.tsx}" 22 | 23 | [languages.javascript.languageServer] 24 | start = [ "typescript-language-server", "--stdio" ] 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ray Arayilakath 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # furret.css 2 | 3 | My personal website styling toolkit, modeled after the lovely [Water.css](https://watercss.kognise.dev/) 4 | by Kognise. Written to allow quick and beautiful styling for simple document-like 5 | websites. Visit the [website](https://css.furret.codes/) see it in action and get 6 | started! 7 | 8 | You can also use a batteries-in furret.css template [on Replit](https://replit.com/@RayhanADev/furretcss). 9 | 10 | [](https://replit.com/@RayhanADev/furretcss) 11 | 12 | Or even more simply, paste the following into the `
` of your HTML: 13 | 14 | ```html 15 | 16 | ``` 17 | 18 |  19 | -------------------------------------------------------------------------------- /csscomb.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "always-semicolon": true, 3 | "color-case": "lower", 4 | "block-indent": "\t", 5 | "color-shorthand": false, 6 | "element-case": "lower", 7 | "eof-newline": true, 8 | "leading-zero": true, 9 | "quotes": "double", 10 | "sort-order-fallback": "abc", 11 | "space-before-colon": "", 12 | "space-after-colon": " ", 13 | "space-before-combinator": " ", 14 | "space-after-combinator": " ", 15 | "space-between-declarations": "\n", 16 | "space-before-opening-brace": " ", 17 | "space-after-opening-brace": "\n", 18 | "space-after-selector-delimiter": "\n", 19 | "space-before-selector-delimiter": "", 20 | "space-before-closing-brace": "\n", 21 | "strip-spaces": true, 22 | "unitless-zero": true, 23 | "vendor-prefix-align": true 24 | } 25 | -------------------------------------------------------------------------------- /dist/js/toggle.min.js: -------------------------------------------------------------------------------- 1 | "use strict";function _createForOfIteratorHelper(o,allowArrayLike){var it="undefined"!=typeof Symbol&&o[Symbol.iterator]||o["@@iterator"];if(!it){if(Array.isArray(o)||(it=_unsupportedIterableToArray(o))||allowArrayLike&&o&&"number"==typeof o.length){it&&(o=it);var i=0,F=function(){};return{s:F,n:function(){return i>=o.length?{done:!0}:{done:!1,value:o[i++]}},e:function(_e){throw _e},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var err,normalCompletion=!0,didErr=!1;return{s:function(){it=it.call(o)},n:function(){var step=it.next();return normalCompletion=step.done,step},e:function(_e2){didErr=!0,err=_e2},f:function(){try{normalCompletion||null==it.return||it.return()}finally{if(didErr)throw err}}}}function _unsupportedIterableToArray(o,minLen){if(o){if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);return"Object"===n&&o.constructor&&(n=o.constructor.name),"Map"===n||"Set"===n?Array.from(o):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(o,minLen):void 0}}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i
63 | This page includes all the files available on the furret.css CDN.
64 | Note that all .css
files come with minified versions
65 | that are available by adding replacing .css
with
66 | .min.css
.
67 |
Item | 73 |Description | 74 |
---|---|
Plugins | 79 ||
/furretcss/js/theme-toggle.js | 82 |Plugin that allows for theme toggling capabilities. | 83 |
Version 1 | 86 ||
/furretcss/v1/dark.css | 89 |90 | Dark-themed variant of furret.css version 1. Includes 91 | all features of furret.css in one file. 92 | | 93 |
/furretcss/v1/library.css | 96 |97 | Automatically-themed variant of furret.css version 1. 98 | Includes all features of furret.css in one file. 99 | | 100 |
/furretcss/v1/light.css | 103 |104 | Light-themed variant of furret.css version 1. Includes 105 | all features of furret.css in one file. 106 | | 107 |
Version 2 | 110 ||
/furretcss/v2/full/dark.css | 113 |114 | Dark-themed variant of furret.css version 2. Includes 115 | all features of furret.css in one file. 116 | | 117 |
/furretcss/v2/full/light.css | 120 |121 | Light-themed variant of furret.css version 2. Includes 122 | all features of furret.css in one file. 123 | | 124 |
/furretcss/v2/themes/dark.css | 127 |128 | Exclusively dark theme variables for furret.css version 129 | 2. Must be paired with a cherry-picked file. 130 | | 131 |
/furretcss/v2/themes/light.css | 134 |135 | Exclusively light theme variables for furret.css version 136 | 2. Must be paired with a cherry-picked file. 137 | | 138 |
/furretcss/v2/forms.css | 141 |142 | Furret.css version 2 styling for all form-related 143 | elements. Must be paired with at least one themed file. 144 | | 145 |
/furretcss/v2/images.css | 148 |149 | Furret.css version 2 styling for all media-related 150 | elements. Must be paired with at least one theme file. 151 | | 152 |
/furretcss/v2/tables.css | 155 |156 | Furret.css version 2 styling for all table-related 157 | elements. Must be paired with at least one theme file. 158 | | 159 |
/furretcss/v2/typography.css | 162 |163 | Furret.css version 2 styling for all typography-related 164 | elements. Must be paired with at least one theme file. 165 | | 166 |
65 | Furret.css was built with beauty as a key point. As such, it comes 66 | with seperate light and dark themes, along with syntax highlighting 67 | and theme toggling! 68 |
69 | 70 | 78 | 79 |
81 | To use the dark theme, change the light in the stylesheet url
82 | to dark, or add the following to the to the
83 | <head>
of your HTML:
84 |
<link rel="stylesheet" href="https://css.furret.dev/furretcss/v2/full/dark.min.css" />
88 |
89 |
91 | Furret.css does not include syntax highlighting out of the box,
92 | however it can be used with
93 | highlight.js and a custom
94 | stylesheet. To use the syntax highlighter, add the following to the
95 | <head>
of your HTML:
96 |
<link rel="stylesheet" href="https://css.furret.dev/highlightjs/light.css" />
100 | <script src="https://css.furret.dev/highlightjs/highlight.js"></script>
101 | And the following to the end of your <body>
:
<script>hljs.highlightAll();</script>
105 |
106 | You can use the dark syntax highlighting theme by replacing
107 | light.css
with dark.css
.
108 |
111 | In order to provide the best experience with for developers and
112 | users, furret.css defaults to a single theme and comes with
113 | Javascript that allows for a toggleable light and dark theme. This
114 | will respect user preferences and allows for persisted themes. To
115 | add toggleable theming, add the following script to the
116 | <head>
of your HTML:
117 |
<script src="https://css.furret.dev/furretcss/js/theme-toggle.js"></script>
121 | And the following to the end of your <body>
:
<script>furrets.addThemeToggle();</script>
125 |
126 |
130 |
134 |
135 |
136 |
--------------------------------------------------------------------------------
/src/styles/assets/mail.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/styles/assets/message.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/styles/assets/phone.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/styles/core.css:
--------------------------------------------------------------------------------
1 | @import "variables.css";
2 | @import "partials/_meta.css";
3 | @import "partials/_nav.css";
4 | @import "partials/_typography.css";
5 | @import "partials/_code.css";
6 | @import "partials/_lists.css";
7 | @import "partials/_images.css";
8 | @import "partials/_tables.css";
9 | @import "partials/_forms.css";
10 | @import "partials/_footer.css";
11 | @import "partials/_misc.css";
12 |
--------------------------------------------------------------------------------
/src/styles/partials/_code.css:
--------------------------------------------------------------------------------
1 | code,
2 | samp {
3 | font-family: var(--font-monospace);
4 | font-size: 1.6rem;
5 | line-height: 2.2rem;
6 | overflow-x: auto;
7 | padding: 0.25rem;
8 | color: var(--primary-2);
9 | border-radius: 0.5rem;
10 | background: var(--background-2);
11 | }
12 |
13 | samp:before {
14 | content: "~$ ";
15 | color: var(--primary-3);
16 | }
17 |
18 | kbd {
19 | font-family: var(--font-monospace);
20 | font-size: 1.6rem;
21 | line-height: 1.6rem;
22 | padding: 0.25rem;
23 | cursor: help;
24 | text-transform: uppercase;
25 | color: var(--color-strong);
26 | border-radius: 0.5rem;
27 | background: var(--background-1);
28 | }
29 |
30 | pre {
31 | font-family: var(--font-monospace);
32 | font-size: 1.6rem;
33 | line-height: 2.2rem;
34 | overflow-x: auto;
35 | padding: 0.5rem;
36 | color: var(--primary-2);
37 | border-radius: 0.5rem;
38 | background: var(--background-2);
39 | }
40 |
41 | var {
42 | font-family: var(--font-monospace);
43 | font-style: italic;
44 | color: var(--primary-2);
45 | }
46 |
--------------------------------------------------------------------------------
/src/styles/partials/_footer.css:
--------------------------------------------------------------------------------
1 | footer {
2 | font-size: 1.2rem;
3 | line-height: initial;
4 | margin-top: 50px;
5 | padding-top: 8px;
6 | text-align: center;
7 | letter-spacing: 1.2px;
8 | text-transform: uppercase;
9 | color: var(--primary-2);
10 | border-top: 2px solid var(--accent-2);
11 | }
12 |
13 | footer a {
14 | transform-origin: 0 -10px;
15 | }
16 |
17 | footer a:before {
18 | transform-origin: 0 11px;
19 | }
20 |
21 | footer a:after {
22 | bottom: 0;
23 | border: 5.5px solid transparent;
24 | }
25 |
26 | @media (prefers-reduced-motion: no-preference) {
27 | footer a:hover:before {
28 | transition: 100ms ease-out;
29 | transform: scaleY(0.25);
30 | background: var(--accent-2);
31 | }
32 |
33 | footer a:after {
34 | right: -7.75px;
35 | transition: transform 50ms ease-out 100ms;
36 | transform: none;
37 | }
38 | }
39 |
40 | @media (--breakpoint-mobile) {
41 | footer a:before {
42 | transform-origin: 0 9px;
43 | }
44 |
45 | footer a:after {
46 | bottom: -1px;
47 | border: 4px solid transparent;
48 | }
49 |
50 | footer a:hover:after {
51 | right: -6px;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/styles/partials/_images.css:
--------------------------------------------------------------------------------
1 | img,
2 | video,
3 | object,
4 | canvas {
5 | height: auto;
6 | max-width: 100%;
7 | }
8 |
9 | figure {
10 | width: 100%;
11 | display: flex;
12 | align-content: center;
13 | justify-content: center;
14 | flex-wrap: wrap;
15 | margin: 20px 0 20px 0;
16 | flex-direction: column;
17 | }
18 |
19 | figure img {
20 | height: auto;
21 | max-width: 80%;
22 | margin: auto;
23 | }
24 |
25 | figure figcaption p {
26 | flex-basis: 100%;
27 | color: var(--primary-3);
28 | font-size: 1.6rem;
29 | line-height: 2.2rem;
30 | text-align: center;
31 | margin-top: 10px;
32 | }
33 |
--------------------------------------------------------------------------------
/src/styles/partials/_lists.css:
--------------------------------------------------------------------------------
1 | ul {
2 | margin: 5px 0 15px;
3 | padding: 0;
4 | }
5 |
6 | ul > li {
7 | position: relative;
8 | padding: 0 0 0 20px;
9 | list-style: none;
10 | font-family: var(--font-body);
11 | font-size: 1.6rem;
12 | font-weight: 400;
13 | line-height: 1.8em;
14 | color: var(--primary-2);
15 | }
16 |
17 | ul > li:before {
18 | position: absolute;
19 | top: 14px;
20 | left: 0;
21 | width: 5px;
22 | height: 5px;
23 | content: "";
24 | transform: rotate(45deg);
25 | border: 1px solid var(--accent-2);
26 | border-width: 2px 2px 0 0;
27 | }
28 |
29 | @media (--breakpoint-mobile) {
30 | ul > li:before {
31 | top: 8px;
32 | }
33 | }
34 |
35 | ul input ~ li:before {
36 | list-style-type: none;
37 | }
38 |
39 | ul input[type="checkbox"] {
40 | font: inherit;
41 | display: inline-grid;
42 | width: 20px;
43 | height: 20px;
44 | margin: 0;
45 | margin-right: 10px;
46 | color: var(--background-3);
47 | border: 2px solid var(--primary-2);
48 | background: var(--background-3);
49 | appearance: none;
50 | place-content: center;
51 | cursor: pointer;
52 | }
53 |
54 | ul input[type="checkbox"] {
55 | border-radius: 25%;
56 | }
57 |
58 | ul input[type="checkbox"]:before {
59 | width: 12px;
60 | height: 12px;
61 | content: "";
62 | transition: 120ms transform ease-in-out;
63 | transform: scale(0);
64 | box-shadow: inset 10px 10px var(--accent-2);
65 | cursor: pointer;
66 | }
67 |
68 | ul input[type="checkbox"]:before {
69 | border-radius: 25%;
70 | transform-origin: bottom left;
71 | clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
72 | }
73 |
74 | ul input[type="checkbox"]:checked:before {
75 | transform: scale(1);
76 | }
77 |
78 | ul input[type="checkbox"]:disabled {
79 | border-color: var(--background-1);
80 | background-color: var(--background-3);
81 | }
82 |
83 | ul input[type="checkbox"]:disabled + label {
84 | color: var(--primary-3);
85 | cursor: not-allowed;
86 | }
87 |
88 | @media (--breakpoint-mobile) {
89 | ul input[type="checkbox"] {
90 | width: 15px;
91 | height: 15px;
92 | transform: translateY(3px);
93 | }
94 |
95 | ul input[type="checkbox"]:before {
96 | width: 10px;
97 | height: 10px;
98 | }
99 | }
100 |
101 | ol {
102 | margin: 5px 0 15px;
103 | padding: 0;
104 | counter-reset: item;
105 | }
106 |
107 | ol > li {
108 | position: relative;
109 | padding: 0 0 0 20px;
110 | list-style: none;
111 | counter-increment: item;
112 | font-family: var(--font-body);
113 | font-size: 1.6rem;
114 | font-weight: 400;
115 | line-height: 1.8em;
116 | color: var(--primary-2);
117 | }
118 |
119 | ol > li:before {
120 | font-family: var(--font-body);
121 | font-size: 1.6rem;
122 | position: absolute;
123 | top: 0;
124 | left: -4px;
125 | width: 5px;
126 | height: 5px;
127 | content: counter(item) ")";
128 | color: var(--accent-2);
129 | }
130 |
131 | dl {
132 | margin: 5px 0 15px;
133 | padding: 0;
134 | }
135 |
136 | dl > dt {
137 | position: relative;
138 | font-family: var(--font-body);
139 | font-size: 1.6rem;
140 | font-weight: 400;
141 | line-height: 1.8em;
142 | color: var(--primary-2);
143 | }
144 |
145 | dl > dd {
146 | position: relative;
147 | font-family: var(--font-body);
148 | font-size: 1.6rem;
149 | font-weight: 400;
150 | line-height: 1.8em;
151 | color: var(--primary-2);
152 | margin-top: -20px;
153 | margin-inline-start: 30px;
154 | }
155 |
156 | @media (--breakpoint-mobile) {
157 | ol > li:before {
158 | left: 0;
159 | }
160 |
161 | dl > dd {
162 | margin-top: -15px;
163 | margin-inline-start: 20px;
164 | }
165 | }
166 |
167 | address {
168 | width: 100%;
169 | display: flex;
170 | flex-direction: column;
171 | font-style: normal;
172 | margin: -5px 0 -5px 0;
173 | }
174 |
175 | address a {
176 | font-size: 1.6rem;
177 | line-height: 2rem;
178 | margin: 5px 0 5px 0;
179 | }
180 |
181 | address a:before,
182 | address a:hover:before,
183 | address a:active:before,
184 | address a:focus-visible:before {
185 | border: none;
186 | background: none;
187 | transform: none;
188 | }
189 |
190 | address a:hover:before,
191 | address a:active:before,
192 | address a:focus-visible:before {
193 | animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
194 | }
195 |
196 | address a:after {
197 | border: none;
198 | }
199 |
200 | address a[href^="mailto\:"]:before {
201 | content: "📧 ";
202 | display: inline-block;
203 | position: relative;
204 | transform-origin: center;
205 | width: 25px;
206 | margin-right: 5px;
207 | text-decoration: none;
208 | }
209 |
210 | address a[href^="tel\:"]:before {
211 | content: "📞 ";
212 | display: inline-block;
213 | position: relative;
214 | transform-origin: center;
215 | width: 25px;
216 | margin-right: 5px;
217 | text-decoration: none;
218 | }
219 |
220 | address a[href^="sms\:"]:before {
221 | content: "💬 ";
222 | display: inline-block;
223 | position: relative;
224 | transform-origin: center;
225 | width: 25px;
226 | margin-right: 5px;
227 | text-decoration: none;
228 | }
229 |
230 | @keyframes shake {
231 | 0% {
232 | transform: translateX(0);
233 | }
234 | 25% {
235 | transform: translateY(-9px);
236 | }
237 | 35% {
238 | transform: translateY(-9px) rotate(17deg);
239 | }
240 | 55% {
241 | transform: translateY(-9px) rotate(-17deg);
242 | }
243 | 65% {
244 | transform: translateY(-9px) rotate(17deg);
245 | }
246 | 75% {
247 | transform: translateY(-9px) rotate(-17deg);
248 | }
249 | 100% {
250 | transform: translateY(0) rotate(0);
251 | }
252 | }
253 |
--------------------------------------------------------------------------------
/src/styles/partials/_meta.css:
--------------------------------------------------------------------------------
1 | *,
2 | *:before,
3 | *:after {
4 | box-sizing: inherit;
5 | }
6 |
7 | html {
8 | box-sizing: border-box;
9 | background-color: var(--background-3);
10 | transition: all 0.44s ease;
11 | overflow-x: hidden;
12 | }
13 |
14 | html,
15 | body {
16 | font-family: var(--font-display);
17 | font-size: 70%;
18 | line-height: 70%;
19 | margin: 0;
20 | padding: 0;
21 | -webkit-font-smoothing: antialiased;
22 | -webkit-tap-highlight-color: transparent;
23 | }
24 |
25 | body {
26 | height: fit-content;
27 | margin: 40px auto 0;
28 | max-width: 700px;
29 | padding: 20px;
30 | }
31 |
32 | p:target {
33 | padding-left: 5px;
34 | background-color: var(--background-1);
35 | }
36 |
37 | ::selection {
38 | background-color: var(--selection-color);
39 | }
40 |
41 | ::-webkit-scrollbar {
42 | width: 7.5px;
43 | height: 5px;
44 | }
45 |
46 | ::-webkit-scrollbar-track {
47 | border-radius: 0.5rem;
48 | background: var(--background-1);
49 | }
50 |
51 | ::-webkit-scrollbar-thumb {
52 | border-radius: 0.5rem;
53 | background: var(--primary-3);
54 | }
55 |
56 | ::-webkit-scrollbar-thumb:hover {
57 | border-radius: 0.5rem;
58 | background: var(--primary-2);
59 | }
60 |
61 | @media (--breakpoint-mobile) {
62 | html,
63 | body {
64 | font-size: 50%;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/styles/partials/_misc.css:
--------------------------------------------------------------------------------
1 | flex-break {
2 | width: 0;
3 | flex-basis: 100%;
4 | }
5 |
6 | hr {
7 | border: 2px solid var(--background-2);
8 | }
9 |
10 | .theme-toggle-btn {
11 | background: none;
12 | border: none;
13 | height: 75px;
14 | width: 75px;
15 | min-width: 75px;
16 | margin: 0;
17 | padding: 0;
18 | position: fixed;
19 | margin-left: -275px;
20 | font-size: 2.4rem;
21 | bottom: 20px;
22 | right: 20px;
23 | border-radius: 50%;
24 | }
25 |
26 | .theme-toggle-btn:hover {
27 | width: 75px;
28 | }
29 |
30 | @media (--breakpoint-mobile-outer) {
31 | .theme-toggle-btn {
32 | font-size: 2.4rem;
33 | top: initial;
34 | margin: 0;
35 | margin-bottom: 10px;
36 | position: relative;
37 | float: right;
38 | width: 48px;
39 | height: 48px;
40 | min-width: 48px;
41 | font-size: 1.6rem;
42 | }
43 |
44 | .theme-toggle-btn:hover {
45 | width: 48px;
46 | height: 48px;
47 | min-width: 48px;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/styles/partials/_nav.css:
--------------------------------------------------------------------------------
1 | nav {
2 | margin-top: -10px;
3 | width: 250px;
4 | position: fixed;
5 | margin-left: -275px;
6 | top: 200px;
7 | max-height: 400px;
8 | overflow-x: hidden;
9 | overflow-y: auto;
10 | padding-right: 10px;
11 | }
12 |
13 | nav button {
14 | position: fixed;
15 | z-index: 20;
16 | padding: 20px 20px 5px 20px;
17 | margin: -20px;
18 | }
19 |
20 | nav header {
21 | content: "Navigation:";
22 | flex-basis: 100%;
23 | color: var(--accent-2);
24 | font: var(--font-display);
25 | font-size: 3.6rem;
26 | font-weight: 700;
27 | line-height: 4rem;
28 | text-align: right;
29 | position: fixed;
30 | z-index: 10;
31 | padding: 20px 20px 5px 20px;
32 | margin: 0;
33 | }
34 |
35 | nav a {
36 | background: none;
37 | border: none;
38 | padding: 0;
39 | margin: 2px 10px;
40 | color: var(--primary-3);
41 | text-decoration: underline;
42 | text-decoration-thickness: 1px;
43 | text-decoration-color: var(--primary-3);
44 | transition: color 0.1s ease;
45 | transition: text-decoration-color 0.1s ease;
46 | }
47 |
48 | nav a:hover:before,
49 | nav a:active:before,
50 | nav a:focus-visible:before {
51 | background: none;
52 | border: none;
53 | text-decoration-color: var(--accent-2);
54 | }
55 |
56 | nav a:hover:after,
57 | nav a:active:after,
58 | nav a:focus-visible:after {
59 | bottom: 5px;
60 | }
61 |
62 | nav ul {
63 | display: flex;
64 | align-content: flex-end;
65 | justify-content: flex-end;
66 | flex-wrap: wrap;
67 | flex-direction: column;
68 | width: initial;
69 | margin-top: 65px;
70 | }
71 |
72 | nav ul > li {
73 | list-style: none;
74 | padding: 0;
75 | text-align: right;
76 | }
77 |
78 | nav ul > li:before {
79 | content: none;
80 | }
81 |
82 | @media (--breakpoint-mobile-outer) {
83 | nav {
84 | width: 100%;
85 | position: relative;
86 | margin: 0;
87 | top: initial;
88 | }
89 |
90 | nav ul {
91 | flex-direction: column;
92 | width: auto;
93 | align-content: flex-start;
94 | justify-content: flex-start;
95 | flex-wrap: wrap;
96 | margin-top: 10px;
97 | max-height: 80px;
98 | }
99 |
100 | nav header {
101 | margin: 0;
102 | padding: 0;
103 | position: relative;
104 | width: min-content;
105 | }
106 |
107 | nav ul > li {
108 | text-align: left;
109 | }
110 | }
111 |
112 | nav::-webkit-scrollbar {
113 | width: 3px;
114 | }
115 |
--------------------------------------------------------------------------------
/src/styles/partials/_tables.css:
--------------------------------------------------------------------------------
1 | table {
2 | width: 100%;
3 | max-width: 100%;
4 | border: 1px solid var(--background-2);
5 | border-collapse: collapse;
6 | border-spacing: 0;
7 | display: block;
8 | overflow-x: auto;
9 | margin: 20px 0 20px 0;
10 | }
11 |
12 | table thead {
13 | display: table-header-group;
14 | width: 100%;
15 | }
16 |
17 | table thead tr {
18 | border: 1px solid var(--accent-2);
19 | width: auto;
20 | min-width: 100%;
21 | }
22 |
23 | table thead tr th {
24 | border: 1px solid var(--accent-2);
25 | background-color: var(--accent-2);
26 | color: var(--primary-2);
27 | font-size: 1.6rem;
28 | line-height: 2.2rem;
29 | height: 2.8rem;
30 | padding: 10px;
31 | overflow-x: auto;
32 | min-width: 220px;
33 | }
34 |
35 | table tbody {
36 | display: table-row-group;
37 | width: 100%;
38 | }
39 |
40 | table tbody tr {
41 | border: 1px solid var(--background-2);
42 | width: auto;
43 | min-width: 100%;
44 | }
45 |
46 | table tbody tr td {
47 | border: 1px solid var(--background-2);
48 | color: var(--primary-2);
49 | font-size: 1.6rem;
50 | line-height: 2.2rem;
51 | height: 2.8rem;
52 | padding: 10px;
53 | overflow-x: auto;
54 | min-width: 220px;
55 | }
56 |
57 | table tbody tr th {
58 | border: 1px solid var(--background-2);
59 | color: var(--primary-2);
60 | font-size: 1.6rem;
61 | font-weight: 700;
62 | line-height: 2.2rem;
63 | height: 2.8rem;
64 | padding: 10px;
65 | overflow-x: auto;
66 | min-width: 220px;
67 | }
68 |
69 | table tfoot {
70 | display: table-footer-group;
71 | width: 100%;
72 | }
73 |
74 | table tfoot tr {
75 | border: 1px solid var(--background-2);
76 | width: auto;
77 | min-width: 100%;
78 | }
79 |
80 | table tfoot tr td {
81 | border: 1px solid var(--background-2);
82 | color: var(--primary-3);
83 | font-size: 1.6rem;
84 | line-height: 2.2rem;
85 | height: 2.8rem;
86 | padding: 10px;
87 | overflow-x: auto;
88 | min-width: 220px;
89 | }
90 |
91 | table tfoot tr th {
92 | border: 1px solid var(--background-2);
93 | color: var(--primary-3);
94 | font-size: 1.6rem;
95 | font-weight: 700;
96 | line-height: 2.2rem;
97 | height: 2.8rem;
98 | padding: 10px;
99 | overflow-x: auto;
100 | min-width: 220px;
101 | }
102 |
103 | table caption {
104 | caption-side: bottom;
105 | color: var(--primary-2);
106 | font-size: 1.6rem;
107 | line-height: 2.2rem;
108 | height: 2.8rem;
109 | text-align: center;
110 | }
111 |
--------------------------------------------------------------------------------
/src/styles/partials/_typography.css:
--------------------------------------------------------------------------------
1 | /* Headings */
2 |
3 | h1 {
4 | font-size: 6rem;
5 | line-height: 6rem;
6 | display: table;
7 | margin: 0;
8 | margin-top: 5rem;
9 | margin-bottom: 1.5rem;
10 | padding: 10px 20px 0 13.25px;
11 | letter-spacing: -1px;
12 | color: var(--primary-1);
13 | background: linear-gradient(
14 | 120deg,
15 | var(--highlight-color) 0%,
16 | var(--highlight-color) 100%
17 | );
18 | background-repeat: no-repeat;
19 | background-position: 0 30%;
20 | background-size: 100% 65%;
21 | }
22 |
23 | h2 {
24 | font-size: 5rem;
25 | line-height: 5rem;
26 | display: table;
27 | margin: 0;
28 | margin-top: 3.5rem;
29 | margin-bottom: 1.5rem;
30 | padding: 8.75px 17.5px 0 13.25px;
31 | letter-spacing: -1px;
32 | color: var(--primary-1);
33 | background: linear-gradient(
34 | 120deg,
35 | var(--highlight-color) 0%,
36 | var(--highlight-color) 100%
37 | );
38 | background-repeat: no-repeat;
39 | background-position: 0 30%;
40 | background-size: 100% 65%;
41 | }
42 |
43 | h3 {
44 | font-size: 4rem;
45 | line-height: 4rem;
46 | display: table;
47 | margin: 0;
48 | margin-top: 3.5rem;
49 | margin-bottom: 1.5rem;
50 | padding: 7.5px 15px 0 13.25px;
51 | letter-spacing: -1px;
52 | color: var(--primary-1);
53 | background: linear-gradient(
54 | 120deg,
55 | var(--highlight-color) 0%,
56 | var(--highlight-color) 100%
57 | );
58 | background-repeat: no-repeat;
59 | background-position: 0 30%;
60 | background-size: 100% 65%;
61 | }
62 |
63 | h4 {
64 | font-size: 3rem;
65 | line-height: 3rem;
66 | display: table;
67 | margin: 0;
68 | margin-top: 3.5rem;
69 | margin-bottom: 1.5rem;
70 | padding: 9px 13.25px 0 13.25px;
71 | letter-spacing: -1px;
72 | color: var(--primary-1);
73 | background: linear-gradient(
74 | 120deg,
75 | var(--highlight-color) 0%,
76 | var(--highlight-color) 100%
77 | );
78 | background-repeat: no-repeat;
79 | background-position: 0 30%;
80 | background-size: 100% 65%;
81 | }
82 |
83 | h5 {
84 | font-size: 2.5rem;
85 | line-height: 2.5rem;
86 | display: table;
87 | margin: 0;
88 | margin-top: 3.5rem;
89 | margin-bottom: 1.5rem;
90 | padding: 9px 13.25px 0 13.25px;
91 | letter-spacing: -1px;
92 | color: var(--primary-1);
93 | }
94 |
95 | h6 {
96 | font-size: 2rem;
97 | line-height: 2rem;
98 | display: table;
99 | margin: 0;
100 | margin-top: 3.5rem;
101 | margin-bottom: 1.5rem;
102 | padding: 9px 13.25px 0 13.25px;
103 | letter-spacing: -1px;
104 | color: var(--primary-1);
105 | }
106 |
107 | /* Paragraph Text */
108 |
109 | p {
110 | font-family: var(--font-body);
111 | font-size: 1.6rem;
112 | font-weight: 400;
113 | line-height: 2.88rem;
114 | color: var(--primary-2);
115 | }
116 |
117 | strong {
118 | font-weight: 700;
119 | color: var(--accent-2);
120 | }
121 |
122 | b {
123 | font-weight: 700;
124 | }
125 |
126 | em {
127 | font-weight: 300;
128 | font-style: italic;
129 | color: var(--accent-1);
130 | }
131 |
132 | i {
133 | font-weight: 300;
134 | font-style: italic;
135 | }
136 |
137 | u {
138 | text-decoration-color: var(--accent-3);
139 | }
140 |
141 | s {
142 | color: var(--primary-3);
143 | }
144 |
145 | s:before,
146 | s:after {
147 | clip-path: inset(100%);
148 | clip: rect(1px, 1px, 1px, 1px);
149 | height: 1px;
150 | overflow: hidden;
151 | position: absolute;
152 | white-space: nowrap;
153 | width: 1px;
154 | }
155 |
156 | s:before {
157 | content: " [start of stricken text] ";
158 | }
159 |
160 | s:after {
161 | content: " [end of stricken text] ";
162 | }
163 |
164 | del {
165 | color: var(--primary-3);
166 | }
167 |
168 | del:before,
169 | del:after {
170 | clip-path: inset(100%);
171 | clip: rect(1px, 1px, 1px, 1px);
172 | height: 1px;
173 | overflow: hidden;
174 | position: absolute;
175 | white-space: nowrap;
176 | width: 1px;
177 | }
178 |
179 | del:before {
180 | content: " [deletion start] ";
181 | }
182 |
183 | del:after {
184 | content: " [deletion end] ";
185 | }
186 |
187 | ins {
188 | text-decoration-style: wavy;
189 | text-decoration-color: var(--accent-3);
190 | }
191 |
192 | ins:before,
193 | ins:after {
194 | clip-path: inset(100%);
195 | clip: rect(1px, 1px, 1px, 1px);
196 | height: 1px;
197 | overflow: hidden;
198 | position: absolute;
199 | white-space: nowrap;
200 | width: 1px;
201 | }
202 |
203 | ins:before {
204 | content: " [insertion start] ";
205 | }
206 |
207 | ins:after {
208 | content: " [insertion end] ";
209 | }
210 |
211 | mark {
212 | color: var(--primary-1);
213 | background: var(--marked-color);
214 | padding: 2px;
215 | }
216 |
217 | small {
218 | color: var(--primary-3);
219 | line-height: 1.6rem;
220 | }
221 |
222 | abbr {
223 | cursor: help;
224 | text-decoration: underline;
225 | text-decoration-color: var(--accent-3) !important;
226 | text-decoration-style: dotted !important;
227 | }
228 |
229 | dfn {
230 | cursor: help;
231 | }
232 |
233 | a,
234 | a:before,
235 | a:after {
236 | background: none;
237 | border: none;
238 | padding: 0;
239 | text-decoration: underline;
240 | text-decoration-thickness: 1px;
241 | text-decoration-color: var(--primary-2);
242 | transition: text-decoration-color 0.1s ease;
243 | color: var(--primary-2);
244 | }
245 |
246 | a:hover,
247 | a:hover:before,
248 | a:hover:after {
249 | background: none;
250 | border: none;
251 | text-decoration-color: var(--accent-2);
252 | }
253 |
254 | sup a {
255 | color: var(--primary-2);
256 | }
257 |
258 | sup a:hover,
259 | sup a:active,
260 | sup a:focus-visible {
261 | color: var(--primary-1);
262 | cursor: pointer;
263 | }
264 |
265 | sup a:before {
266 | background: none;
267 | border: none;
268 | }
269 |
270 | sup a:hover:before {
271 | background: none;
272 | border: none;
273 | }
274 |
275 | sup a:after {
276 | background: none;
277 | border: none;
278 | }
279 |
280 | sup a:hover:after {
281 | background: none;
282 | border: none;
283 | }
284 |
285 | blockquote {
286 | font-family: var(--font-body);
287 | font-size: 1.6rem;
288 | font-weight: 400;
289 | line-height: 1.8em;
290 | margin: 0;
291 | padding: 1.25px 0 1.25px 10px;
292 | color: var(--primary-2);
293 | border-left: 8px solid var(--accent-2);
294 | }
295 |
296 | blockquote p {
297 | margin: 2.5px 0;
298 | }
299 |
300 | blockquote footer {
301 | font-size: 1.4rem;
302 | font-style: none;
303 | line-height: 1.4rem;
304 | margin: 20px 0 20px 0;
305 | text-align: left;
306 | letter-spacing: 0;
307 | text-transform: none;
308 | color: var(--primary-3);
309 | border: none;
310 | }
311 |
312 | aside {
313 | height: 0;
314 | margin: 0;
315 | padding: 0;
316 | left: 110%;
317 | position: relative;
318 | width: 60%;
319 | top: 15px;
320 | }
321 |
322 | @media (--breakpoint-mobile-outer) {
323 | aside {
324 | top: 0;
325 | left: 0;
326 | height: auto;
327 | width: 100%;
328 | padding: 1.25px 0 1.25px 75px;
329 | text-align: right;
330 | }
331 | }
332 |
333 | section {
334 | background-color: var(--background-2);
335 | color: var(--primary-2);
336 | padding: 10px;
337 | margin: 20px 0 20px 0;
338 | border-radius: 5px;
339 | }
340 |
341 | section header {
342 | font-size: 2.6rem;
343 | line-height: 2.8rem;
344 | margin-top: 1rem;
345 | font-weight: 700;
346 | color: var(--accent-2);
347 | }
348 |
--------------------------------------------------------------------------------
/src/styles/themes/variables-dark.css:
--------------------------------------------------------------------------------
1 | :root,
2 | :before,
3 | :after {
4 | --primary-1: #f3f3f3;
5 | --primary-2: #e3e3e3;
6 | --primary-3: #bfbfbf;
7 | --accent-1: #59a6b8;
8 | --accent-2: #107fae;
9 | --accent-3: #3b6678;
10 | --background-1: #41405c;
11 | --background-2: #272639;
12 | --background-3: #14131e;
13 | --highlight-color: rgba(15, 154, 210, 0.8);
14 | --marked-color: rgba(68, 50, 100, 0.8);
15 | --selection-color: rgba(15, 154, 210, 0.2);
16 | --date-icon-filter: invert(87%) sepia(35%) saturate(1833%)
17 | hue-rotate(161deg) brightness(77%) contrast(83%);
18 | }
19 |
--------------------------------------------------------------------------------
/src/styles/themes/variables-light.css:
--------------------------------------------------------------------------------
1 | :before,
2 | :after,
3 | :root {
4 | --primary-1: #14131e;
5 | --primary-2: #272639;
6 | --primary-3: #41405c;
7 | --accent-1: #63accb;
8 | --accent-2: #7ad3e9;
9 | --accent-3: #ace3f0;
10 | --background-1: #e3e3e3;
11 | --background-2: #f3f3f3;
12 | --background-3: #ffffff;
13 | --highlight-color: rgba(122, 211, 233, 0.8);
14 | --marked-color: rgba(227, 227, 227, 0.6);
15 | --selection-color: rgba(122, 211, 233, 0.2);
16 | --date-icon-filter: invert(73%) sepia(31%) saturate(593%) hue-rotate(158deg)
17 | brightness(82%) contrast(92%);
18 | }
19 |
--------------------------------------------------------------------------------
/src/styles/variables.css:
--------------------------------------------------------------------------------
1 | :root,
2 | ::before,
3 | ::after {
4 | --font-display: "Outfit", -apple-system, blinkmacsystemfont, "Segoe UI",
5 | roboto, helvetica, arial, sans-serif, "Apple Color Emoji",
6 | "Segoe UI Emoji", "Segoe UI Symbol";
7 | --font-body: "Outfit", -apple-system, blinkmacsystemfont, "Segoe UI", roboto,
8 | helvetica, arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
9 | "Segoe UI Symbol";
10 | --font-monospace: "DM Mono", monospace;
11 | }
12 |
13 | @custom-media --breakpoint-mobile (max-width: 500px);
14 | @custom-media --breakpoint-mobile-outer (max-width: 1300px);
15 |
--------------------------------------------------------------------------------
/stylelint.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["stylelint-config-standard", "stylelint-config-prettier"],
3 | "rules": {
4 | "no-descending-specificity": null
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/website/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rayhanadev/furretcss/9b69f8c9d9c8fbc4d76da92c1fd9d84ca54264f9/website/android-chrome-192x192.png
--------------------------------------------------------------------------------
/website/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rayhanadev/furretcss/9b69f8c9d9c8fbc4d76da92c1fd9d84ca54264f9/website/android-chrome-512x512.png
--------------------------------------------------------------------------------
/website/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rayhanadev/furretcss/9b69f8c9d9c8fbc4d76da92c1fd9d84ca54264f9/website/apple-touch-icon.png
--------------------------------------------------------------------------------
/website/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 | This page includes all the files available on the furret.css CDN. Note that all .css
files come with minified versions that are available by adding replacing .css
with .min.css
.
Item | Description |
---|---|
Plugins | |
/furretcss/js/theme-toggle.js | Plugin that allows for theme toggling capabilities. |
Version 1 | |
/furretcss/v1/dark.css | Dark-themed variant of furret.css version 1. Includes all features of furret.css in one file. |
/furretcss/v1/library.css | Automatically-themed variant of furret.css version 1. Includes all features of furret.css in one file. |
/furretcss/v1/light.css | Light-themed variant of furret.css version 1. Includes all features of furret.css in one file. |
Version 2 | |
/furretcss/v2/full/dark.css | Dark-themed variant of furret.css version 2. Includes all features of furret.css in one file. |
/furretcss/v2/full/light.css | Light-themed variant of furret.css version 2. Includes all features of furret.css in one file. |
/furretcss/v2/themes/dark.css | Exclusively dark theme variables for furret.css version 2. Must be paired with a cherry-picked file. |
/furretcss/v2/themes/light.css | Exclusively light theme variables for furret.css version 2. Must be paired with a cherry-picked file. |
/furretcss/v2/forms.css | Furret.css version 2 styling for all form-related elements. Must be paired with at least one themed file. |
/furretcss/v2/images.css | Furret.css version 2 styling for all media-related elements. Must be paired with at least one theme file. |
/furretcss/v2/tables.css | Furret.css version 2 styling for all table-related elements. Must be paired with at least one theme file. |
/furretcss/v2/typography.css | Furret.css version 2 styling for all typography-related elements. Must be paired with at least one theme file. |
We recently switched domains! You'll find that
https://css.furret.codes
will redirect here and all of our examples now use our new domainhttps://css.furret.dev
. The old domain will be sunset permanently on March 1st, 2023 at which point it will not take any requests. Migrate on over here y'all :D.
My personal website styling toolkit, modeled after the lovely Water.css by Kognise. Written to allow quick and beautiful styling for simple document-like websites. Furret.css also allows for higher-quality and semantically correct HTML markup because of its extensive tag support. Grab a copy at the cdn.
To get started quickly with furret.css, add the following to the <head>
of your HTML:
<link rel="stylesheet" href="https://css.furret.dev/furretcss/v2/full/light.min.css" />
Furret.css comes in full versions and partials that allow for cherry picking. You can find more information about the partials at this page.
Furret.css also uses the fonts Outfit and DM Mono (both of which can be found in Google Fonts), however it works equally as well with the browser-based fallbacks. To use these two fonts add the following to your <head>
:
<link rel="preconnect" href="https://fonts.googleapis.com/" />
2 | <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin />
3 | <link
4 | href="https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,300;0,400;0,500;1,300;1,400;1,500&family=Outfit:wght@100;200;300;400;500;600;700;800;900&display=swap"
5 | rel="stylesheet"
6 | />
Furret.css has flexible and extensive theming options. To learn more on how to setup theming, visit the theming page.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Animi perspiciatis iste a, quisquam nemo aut sit eligendi exercitationem iure tempore laborum necessitatibus ab odio ad, veniam debitis voluptatibus possimus perferendis.
This is strong, this is bold, this is emphasized, this is italicised, this is underlined, this is striken through, this is marked, this is small, this is deletedand inserted.
This is abbreviated, this is a definition.
This is linked.
The HTML blockquote Element (or HTML Block Quotation Element) indicates that the enclosed text is an extended quotation. Usually, this is rendered visually by indentation (see Notes for how to change it). A URL for the source of the quotation may be given using the
cite
attribute, while a text representation of the source can be given using the<cite>
cite element.
This is a section of text. Lorem ipsum dolor sit amet consectetur adipisicing elit. Deleniti, aliquid? Voluptates ut, asperiores quibusdam, illo ipsa rem cum autem maiores officiis beatae sint odio eius laboriosam qui repellat eaque atque?
This is a variable, this is inline-code
, this is CTRL+C (keyboard) and this is a block of preformatted text:
// Hello World in Javascript
7 | class Author {
8 | constructor(firstName, lastName, yearBorn) {
9 | this.firstName = firstName;
10 | this.lastName = lastName;
11 | this.yearBorn = yearBorn;
12 | }
13 |
14 | getFullName() {
15 | return this.firstName + ' ' + this.lastName;
16 | }
17 | }
18 |
19 | // Create a new Author
20 | const author = new Author('Douglas', 'Adams', 1952);
21 | author.firstName = 'Doug';
22 |
23 | // Prints "Doug Adams"
24 | const fullName = author.getFullName();
25 | console.log(fullName);
This text is sample output: ls -a
This is an unordered list:
Item A
Item B
Item C
This is an ordered list:
Item 1
Item 2
Item 3
This is a definition list:
Item 1
About Item 1
Item 2
About Item 2
Item 3
About Item 3
This is an address:
rayhanadev@protonmail.com (+1) 817-555-0100 817-555-0100Item | Description | Count | Availability |
---|---|---|---|
Item 1 | Lorem ipsum dolor sit, amet consectetur adipisicing elit. | 10 | True |
Item 2 | Lorem ipsum dolor sit, amet consectetur adipisicing elit. | 10 | True |
Item 3 | Lorem ipsum dolor sit, amet consectetur adipisicing elit. | 10 | False |
Item 4 | Lorem ipsum dolor sit, amet consectetur adipisicing elit. | 10 | True |
Totals | 40 Total Items | 75% Availability |
RayhanADev's Logo
Furret.css was built with beauty as a key point. As such, it comes with seperate light and dark themes, along with syntax highlighting and theme toggling!
To use the dark theme, change the light in the stylesheet url to dark, or add the following to the to the <head>
of your HTML:
<link rel="stylesheet" href="https://css.furret.dev/furretcss/v2/full/dark.min.css" />
Furret.css does not include syntax highlighting out of the box, however it can be used with highlight.js and a custom stylesheet. To use the syntax highlighter, add the following to the <head>
of your HTML:
<link rel="stylesheet" href="https://css.furret.dev/highlightjs/light.css" />
2 | <script src="https://css.furret.dev/highlightjs/highlight.js"></script>
And the following to the end of your <body>
:
<script>hljs.highlightAll();</script>
You can use the dark syntax highlighting theme by replacing light.css
with dark.css
.
In order to provide the best experience with for developers and users, furret.css defaults to a single theme and comes with Javascript that allows for a toggleable light and dark theme. This will respect user preferences and allows for persisted themes. To add toggleable theming, add the following script to the <head>
of your HTML:
<script src="https://css.furret.dev/furretcss/js/theme-toggle.js"></script>
And the following to the end of your <body>
:
<script>furrets.addThemeToggle();</script>
--------------------------------------------------------------------------------