├── .gitignore
├── LICENSE
├── README.md
├── main.ts
├── src
├── flora.ts
├── frameworks.ts
└── types.ts
├── static
└── styles
│ ├── attri.css
│ ├── awsm.css
│ ├── basic.css
│ ├── marx.css
│ ├── openprops.css
│ ├── sakura.css
│ ├── stylize.css
│ ├── tufte.css
│ └── writ.css
└── test.html
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # classless-css-demo
--------------------------------------------------------------------------------
/main.ts:
--------------------------------------------------------------------------------
1 | import { serve } from "https://deno.land/std@0.152.0/http/server.ts";
2 | import { join } from "https://deno.land/std@0.152.0/path/mod.ts";
3 | import { contentType } from "https://deno.land/std@0.152.0/media_types/mod.ts";
4 | import template from "./src/flora.ts";
5 |
6 | import { Route, Framework } from "./src/types.ts";
7 | import frameworks from "./src/frameworks.ts";
8 |
9 | class StaticFileHandler {
10 |
11 | #basePath: string = "";
12 |
13 | constructor(base: string) {
14 | this.#basePath = base;
15 | }
16 |
17 | handler(request: Request): Response {
18 | const pathname = new URL(request.url).pathname;
19 | const extension = pathname.substr(pathname.lastIndexOf("."));
20 | const resolvedPathname = (pathname == "" || pathname == "/") ? "/index.html" : pathname;
21 | const path = join(Deno.cwd(), this.#basePath, resolvedPathname)
22 | const file = Deno.readFile(path)
23 | .then(data => new Response(data, { status: 200, headers: { 'content-type': contentType(extension) } })) // Need to think about content tyoes.
24 | .catch(_ => new Response("Not found", { status: 404 }));
25 |
26 | return file;
27 | }
28 |
29 | get pattern(): URLPattern {
30 | return new URLPattern({ pathname: "*" })
31 | }
32 | }
33 |
34 | const render = (currentFramework) => {
35 | return template`
36 |
37 |
38 | Compare Classless CSS frameworks — currently using "${frameworks[currentFramework].name}"
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | I was struggling to make a simple page I was building look decent.
49 | I knew there were stylesheets that just used 'semantic html' (like Tufte) and didn't require any special class names
50 | (i.e <button class="btn-primary">a button</button>
), however I was struggling to find them.
51 |
52 |
53 | So I asked Twitter :
54 | I should know this, but I'm looking for a simple CSS stylesheet that would replace the default user agent
55 | and make it look half decent. Google-fu is failing me, all I can find is resets and full frameworks. :\\
56 |
57 |
58 | Once I found examples of 'class-less CSS', it was then a bit of a pain to find them and compare all the different
59 | examples. Hence this page.
60 |
61 | This page is designed to collate all the CSS frameworks into one place and let you compare and contrast them.
62 |
63 | Here is the list of class-less CSS frameworks that you can checkout:
64 |
65 |
69 |
70 | If you have a framework you would like include, create PR against frameworks.ts
72 |
73 | Check out my other site.
74 |
75 |
76 | This page is rendered using ${frameworks[currentFramework].name}.
77 | Some of the entries are taken from the layout from stylize .
79 |
80 |
81 |
82 | Typography:
83 | This is a H1 heading
84 | This is a H2 heading
85 | This is a H3 heading
86 | This is a H4 heading
87 | This is a H5 heading
88 | This is a H6 heading
89 | This is a paragraph of text. It's my paragraph. I like it a lot.
90 |
91 | This is a Strong / Bold text
92 |
93 | This is an Emphasized / Italic text
94 |
95 | This is a Marked / Highlighted text
96 |
97 | This is a Small text
98 |
99 | This is a Deleted text
100 |
101 | This is a Underlined / Inserted text
102 |
103 | This is a Subscript text
104 |
105 | This is a Superscript text
106 |
107 | This is a preformatted text.
108 | This is a Blockquote.
109 |
110 | Use an aside
to emphasize a content related to the main content.
111 |
112 | This is a sample output.
113 |
114 | This is the <code>
& kbd
115 |
116 | Links & navigation:
117 |
118 | Nav Link 1
119 | Nav Link 2
120 |
123 |
124 |
125 |
126 | Normal link
127 |
128 | Lists:
129 |
130 | Unordered list item 1
131 | Unordered list item 2
132 |
133 | Unordered list item 3
134 |
135 | Unordered list item 4
136 | Unordered list item 5
137 |
138 |
139 | Ordered list item 1
140 | Ordered list item 2
141 |
142 | Ordered list item 3
143 |
144 | Ordered list item 4
145 | Ordered list item 5
146 |
147 |
148 | Banana
149 | A yellow fruit that is easy to peel.
150 | Which also grows on a tree.
151 | Cashew
152 | A tan nut without a peel.
153 | Cherry
154 | A red fruit that is hard to peel.
155 |
156 |
157 | Form:
158 |
159 | This is a legend on fieldset
160 |
190 |
191 |
192 | Button
193 | Anchor role=button
194 |
195 | Button
196 |
197 | Progress bar
198 |
199 |
200 | Table:
201 |
202 |
203 |
204 | #
205 | Name
206 | Username
207 | Location
208 |
209 |
210 |
211 |
212 | 1
213 | Vasanth
214 | @vsnthv
215 | Chennai, India
216 |
217 |
218 | 2
219 | John
220 | @john
221 | USA
222 |
223 |
224 | 3
225 | Chan
226 | @chan
227 | Hong Kong
228 |
229 |
230 |
231 | Table with border=1
232 |
233 |
234 |
235 | #
236 | Name
237 | Username
238 | Location
239 |
240 |
241 |
242 |
243 | 1
244 | Vasanth
245 | @vsnthv
246 | Chennai, India
247 |
248 |
249 | 2
250 | John
251 | @john
252 | USA
253 |
254 |
255 | 3
256 | Chan
257 | @chan
258 | Hong Kong
259 |
260 |
261 |
262 |
263 | Images
264 |
265 |
266 | A photo placeholder text
267 |
268 |
269 |
270 |
271 |
272 | `
273 | .then(data => new Response(data, { status: 200, headers: { 'content-type': 'text/html' } }));
274 | }
275 |
276 | serve((req: Request) => {
277 | const url = req.url;
278 | const staticFiles = new StaticFileHandler('static');
279 | let response: Response = new Response(new Response("Not found", { status: 404 }));
280 |
281 | // Probably only needs to be a static site
282 | const routes: Array = [
283 | [
284 | new URLPattern({ pathname: "/" }),
285 | (request, patternResult) => {
286 | console.log(window.location)
287 | return render(""); // index
288 | }
289 | ],
290 | [
291 | new URLPattern({ pathname: "/:framework.html" }),
292 | (request, patternResult) => {
293 | const pathname = new URL(request.url).pathname;
294 | const { framework } = patternResult.pathname.groups;
295 |
296 | if (framework == null) {
297 | return new Response("Not found", { status: 404 })
298 | }
299 |
300 | return render(framework);
301 | }
302 | ],
303 | // Fall through.
304 | [
305 | staticFiles.pattern,
306 | staticFiles.handler.bind(staticFiles)
307 | ]
308 | ];
309 |
310 | for (const [pattern, handler] of routes) {
311 | const patternResult = pattern.exec(url);
312 | console.log(pattern, url, patternResult)
313 | if (patternResult != null) {
314 | // Find the first matching route.
315 | const responseFromHandler = handler(req, patternResult);
316 |
317 | response = responseFromHandler;
318 | break;
319 | }
320 | }
321 |
322 | return response;
323 | });
--------------------------------------------------------------------------------
/src/flora.ts:
--------------------------------------------------------------------------------
1 | const encoder = new TextEncoder();
2 |
3 | const pipeInto = async (from, controller) => {
4 | const reader = from.getReader();
5 |
6 | return reader.read().then(function process(result) {
7 | if (result.done) {
8 | return;
9 | }
10 | const value = result.value;
11 | const isTypedArray = (value instanceof Int8Array
12 | || value instanceof Int16Array
13 | || value instanceof Int32Array
14 | || value instanceof Uint8Array
15 | || value instanceof Uint8ClampedArray
16 | || value instanceof Uint16Array
17 | || value instanceof Uint32Array
18 | || value instanceof Float32Array
19 | || value instanceof Float64Array)
20 | if((isTypedArray === false && !!result.value) || (isTypedArray && value.length > 0)) {
21 | controller.enqueue(result.value);
22 | }
23 | return reader.read().then(process);
24 | });
25 | };
26 |
27 | const enqueueItem = async (val, controller) => {
28 | if (val instanceof ReadableStream) {
29 | await pipeInto(val, controller);
30 | }
31 | else if (val instanceof Promise) {
32 | let newVal;
33 | newVal = await val;
34 |
35 | if (newVal instanceof ReadableStream) {
36 | await pipeInto(newVal, controller);
37 | } else {
38 | await enqueueItem(newVal, controller);
39 | }
40 | }
41 | else {
42 | if (Array.isArray(val)) {
43 | for (let item of val) {
44 | await enqueueItem(item, controller)
45 | }
46 | }
47 | else if (!!val) {
48 | controller.enqueue(encoder.encode(val));
49 | }
50 | }
51 | }
52 |
53 | export default async (strings, ...values):ReadableStream => {
54 | return new ReadableStream({
55 | start(controller) {
56 | async function push() {
57 | let i = 0;
58 | while (i < values.length) {
59 | let html = strings[i];
60 | controller.enqueue(encoder.encode(html));
61 | await enqueueItem(values[i], controller);
62 |
63 | i++;
64 | }
65 | controller.enqueue(encoder.encode(strings[i]));
66 | controller.close();
67 | }
68 |
69 | push();
70 | }
71 | });
72 | };
--------------------------------------------------------------------------------
/src/frameworks.ts:
--------------------------------------------------------------------------------
1 | /*
2 | To add a framework, add in the details below:
3 | + Please keep it in alphabetical order.
4 | + If you need to add a version of the stylesheet, add it to the /static/styles folder (otherwise a link is fine).
5 | + Make sure to add a link to the homepage.
6 | */
7 |
8 | const frameworks: Record = {
11 | "": { name: "Browser default style", htmlUrl: "/", cssUrl: `/styles/index.css`, siteUrl: "https://meiert.com/en/blog/user-agent-style-sheets/" }, // This is a hack to use my default style
12 | "attri": { name: "AttriCSS", htmlUrl: "/attri.html", cssUrl: "/styles/attri.css", siteUrl: "https://raj457036.github.io/attriCSS/" },
13 | "awsm": { name: "Awsm.css", htmlUrl: "/awsm.html", cssUrl: "/styles/awsm.css", siteUrl: "https://igoradamenko.github.io/awsm.css/elements.html" },
14 | "basic": { name: "Basic.css", htmlUrl: "/basic.html", cssUrl: "/styles/basic.css", siteUrl: "https://vladocar.github.io/Basic.css/" },
15 | "bahunya": { name: "Bahunya", htmlUrl: "/bahunya.html", cssUrl: " https://cdn.jsdelivr.net/gh/kimeiga/bahunya/dist/bahunya.min.css", siteUrl: "https://hakanalpay.com/bahunya/" },
16 | "bedrocss": { name: "Bedrocss", htmlUrl: "/bedrocss.html", cssUrl: "https://unpkg.com/bedrocss", siteUrl: "https://bedrocss.austingil.com/" },
17 | "classless": { name: "Classless.css", htmlUrl: "/classless.html", cssUrl: "https://classless.de/classless.css", siteUrl: "https://classless.de/" },
18 | "downstyler": { name: "Downstyler", htmlUrl: "/downstyler.html", cssUrl: "https://raw.githack.com/waldyrious/downstyler/master/downstyler.css", siteUrl: "https://waldyrious.net/downstyler/" },
19 | "holiday": { name: "Holiday.css", htmlUrl: "/holiday.html", cssUrl: "https://cdn.jsdelivr.net/npm/holiday.css@0.9.8", siteUrl: "https://holidaycss.js.org/" },
20 | "marx": { name: "Marx", htmlUrl: "/marx.html", cssUrl: "/styles/marx.css", siteUrl: "https://mblode.github.io/marx/" },
21 | "mvp": { name: "MVP.css", htmlUrl: "/mvp.html", cssUrl: "https://unpkg.com/mvp.css", siteUrl: "https://andybrewer.github.io/mvp/" },
22 | "openprops": { name: "OpenProps + Normalize.css", htmlUrl: "/openprops.html", cssUrl: "/styles/openprops.css", siteUrl: "https://open-props.style" },
23 | "pico": { name: "Pico", htmlUrl: "/pico.html", cssUrl: "https://unpkg.com/@picocss/pico@latest/css/pico.min.css", siteUrl: "https://picocss.com/" },
24 | "sakura": { name: "Sakura", htmlUrl: "/sakura.html", cssUrl: "/styles/sakura.css", siteUrl: "https://github.com/oxalorg/sakura" },
25 | "simple": { name: "Simple.css", htmlUrl: "/simple.html", cssUrl: "https://cdn.simplecss.org/simple.min.css", siteUrl: "https://simplecss.org/demo" },
26 | "stylize": { name: "Stylize", htmlUrl: "/stylize.html", cssUrl: "/styles/stylize.css", siteUrl: "https://vasanthv.com/stylize.css/demo.html" },
27 | "tacit": { name: "Tacit", htmlUrl: "/tacit.html", cssUrl: "https://cdn.jsdelivr.net/gh/yegor256/tacit@gh-pages/tacit-css-1.5.5.min.css", siteUrl: "https://yegor256.github.io/tacit/" },
28 | "tufte": { name: "Tufte.css", htmlUrl: "/tufte.html", cssUrl: "/styles/tufte.css", siteUrl: "https://github.com/edwardtufte/tufte-css" },
29 | "water": { name: "Water.css", htmlUrl: "/water.html", cssUrl: "https://cdn.jsdelivr.net/npm/water.css@2/out/water.css", siteUrl: "https://watercss.kognise.dev/" },
30 | "wing": { name: "Wing", htmlUrl: "/wing.html", cssUrl: "https://unpkg.com/wingcss", siteUrl: "https://kbrsh.github.io/wing/" },
31 | "writ": { name: "Writ", htmlUrl: "/writ.html", cssUrl: "/styles/writ.css", siteUrl: "https://writ.cmcenroe.me/writ.css" },
32 | }
33 |
34 | export default frameworks;
35 |
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | export type Route = [URLPattern, RequestHandler];
2 | export type RequestHandler = (Request) => Response;
3 | export type Framewprk = [string, URL]
--------------------------------------------------------------------------------
/static/styles/attri.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css?family=Nunito");html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,textarea,input,select,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{font-family:"Nunito",sans-serif;color:#000}body,html{padding:0;margin:0;overflow-x:hidden;background-color:#fff}nav{font-family:"Nunito",sans-serif;background-color:#212121;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex}nav header{padding:8px;display:inline}nav header a{text-decoration:none;color:#fff}nav header a:hover{color:#00c853}nav header+input:checked+div{display:block}nav div{display:none;margin-left:auto}nav div ul{list-style:none;display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 10px}nav div ul li a{display:inline-block;padding:8px;color:#fff;text-decoration:none}nav div ul li:hover{background-color:#00c853}nav div ul li ul{right:0;position:relative;background:pink}@media (max-width: 630px){nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}nav header{text-align:center}nav div{margin:auto}nav div ul{padding:0}nav div ul li{border-top-left-radius:5px;border-top-right-radius:5px}nav div ul li[active],nav div ul li.active{border:1px solid #00c853;border-bottom:none}blockquote{border-left:4px solid #00c853;padding:8px 5px;margin:0}blockquote p{font-size:0.4rem}}@media (min-width: 630px){nav div ul li.active,nav div ul li[active]{border:1px solid #00c853;border-bottom:none;border-top:none}nav header label{display:none}}section[container]{max-width:38em;margin:auto;padding:5px}h1{font-size:2.35em}h2{font-size:2em}h3{font-size:1.75em}h4{font-size:1.5em}h5{font-size:1.25em}h6{font-size:1em}a{color:#00c853}a:hover{color:#212121}mark{background-color:#00c853}code{font-family:monospace;background-color:#bdbdbd;padding-left:5px;padding-right:5px}blockquote{border-left:4px solid #00c853;padding:8px 10px;width:100%}blockquote p{font-style:italic;font-size:1.1rem}blockquote footer::before{content:"\2014 \00A0"}blockquote footer cite{font-style:italic;color:#bdbdbd}pre{background:#eee;overflow-x:auto;text-align:left;padding:5px}pre code{display:block;padding:0 10px;background:transparent}table{display:table;padding:5px;border-collapse:collapse}table thead,table tbody{text-align:left}table tr th,table tr td{padding:5px 10px;border-bottom:1px solid #00c853}div[overflow]{overflow-x:auto;max-width:100vw}div[overflow] ::-webkit-scrollbar{height:0}img{max-width:100%;border-radius:5px}form div{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:10px 5px}form div p{margin:0px}form input,form select{font-size:1rem;padding:5px;border:1px solid #bdbdbd;color:#212121}form input:active,form input:focus,form select:active,form select:focus{outline-color:#00c853}form input[type="submit"]{padding:10px;background-color:#00c853;color:#000;border-radius:5px;border:none;cursor:pointer}form input[type="submit"]:active,form input[type="submit"]:focus{outline:none}form input[type="submit"]:active{background-color:#212121;color:#00c853}form input[type="submit"]:disabled{background:#bdbdbd;cursor:not-allowed}form input[type="submit"][secondary]{background-color:#212121;color:#00c853}form input[type="submit"][secondary]:active{background-color:#00c853;color:initial}textarea{color:#212121;width:-webkit-fill-available;font-size:1rem;padding:5px}textarea:active,textarea:focus{outline-color:#00c853}button{padding:10px;background-color:#00c853;color:#000;border-radius:5px;border:none;cursor:pointer}button:active,button:focus{outline:none}button:active{background-color:#212121;color:#00c853}button:disabled{background:#bdbdbd;cursor:not-allowed}button[secondary]{background-color:#212121;color:#00c853}button[secondary]:active{background-color:#00c853;color:initial}body>footer{background-color:#212121;position:relative;bottom:0;width:100%;padding:5px;color:#fff}
2 |
--------------------------------------------------------------------------------
/static/styles/awsm.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 | /*!
3 | * awsm.css v3.0.7 (https://igoradamenko.github.io/awsm.css/)
4 | * Copyright 2015 Igor Adamenko (https://igoradamenko.com)
5 | * Licensed under MIT (https://github.com/igoradamenko/awsm.css/blob/master/LICENSE.md)
6 | */
7 | html{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"PT Sans","Open Sans","Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%;line-height:1.4;background:#fff;color:#000;-webkit-overflow-scrolling:touch}body{margin:1.2em;font-size:1rem}@media (min-width:20rem){body{font-size:calc(1rem + .00625*(100vw - 20rem))}}@media (min-width:40rem){body{font-size:1.125rem}}body article,body footer,body header,body main{position:relative;max-width:40rem;margin:0 auto}body>header{margin-bottom:3.5em}body>header h1{margin:0;font-size:1.5em}body>header p{margin:0;font-size:.85em}body>footer{margin-top:6em;padding-bottom:1.5em;text-align:center;font-size:.8rem;color:#aaa}details,nav{margin:1em 0}nav ul{list-style:none;margin:0;padding:0}nav li{display:inline-block;margin-right:1em;margin-bottom:.25em}nav li:last-child{margin-right:0}a,nav a:visited{color:#0064c1}article header h1 a:visited:hover,article header h2 a:visited:hover,nav a:hover{color:#f00000}ol,ul{margin-top:0;padding-top:0;padding-left:2.5em}article header h1+p,article header h2+p,ol li+li,ul li+li{margin-top:.25em}ol li>details,ul li>details{margin:0}p{margin:1em 0;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}aside:first-child,form legend:first-child+label,p:first-child{margin-top:0}aside:last-child,p:last-child{margin-bottom:0}p+ol,p+ul{margin-top:-.75em}p img,p picture{float:right;margin-bottom:.5em;margin-left:.5em}p picture img{float:none;margin:0}blockquote,dd{padding-left:2.5em}dd{margin-bottom:1em;margin-left:0}dt{font-weight:700}blockquote{margin:0}aside{margin:.5em 0;font-style:italic;color:#aaa}@media (min-width:65rem){aside{position:absolute;right:-12.5rem;width:9.375rem;max-width:9.375rem;margin:0;padding-left:.5em;font-size:.8em;border-left:1px solid #f2f2f2}}section+section{margin-top:2em}h1,h2,h3,h4,h5,h6{margin:1.25em 0 0;line-height:1.2}h1:focus>a[href^="#"][id]:empty,h1:hover>a[href^="#"][id]:empty,h2:focus>a[href^="#"][id]:empty,h2:hover>a[href^="#"][id]:empty,h3:focus>a[href^="#"][id]:empty,h3:hover>a[href^="#"][id]:empty,h4:focus>a[href^="#"][id]:empty,h4:hover>a[href^="#"][id]:empty,h5:focus>a[href^="#"][id]:empty,h5:hover>a[href^="#"][id]:empty,h6:focus>a[href^="#"][id]:empty,h6:hover>a[href^="#"][id]:empty{opacity:1}figure+p,h1+details,h1+p,h2+details,h2+p,h3+details,h3+p,h4+details,h4+p,h5+details,h5+p,h6+details,h6+p{margin-top:.5em}h1>a[href^="#"][id]:empty,h2>a[href^="#"][id]:empty,h3>a[href^="#"][id]:empty,h4>a[href^="#"][id]:empty,h5>a[href^="#"][id]:empty,h6>a[href^="#"][id]:empty{position:absolute;left:-.65em;opacity:0;text-decoration:none;font-weight:400;line-height:1;color:#aaa}@media (min-width:40rem){h1>a[href^="#"][id]:empty,h2>a[href^="#"][id]:empty,h3>a[href^="#"][id]:empty,h4>a[href^="#"][id]:empty,h5>a[href^="#"][id]:empty,h6>a[href^="#"][id]:empty{left:-.8em}}h1>a[href^="#"][id]:empty:focus,h1>a[href^="#"][id]:empty:hover,h1>a[href^="#"][id]:empty:target,h2>a[href^="#"][id]:empty:focus,h2>a[href^="#"][id]:empty:hover,h2>a[href^="#"][id]:empty:target,h3>a[href^="#"][id]:empty:focus,h3>a[href^="#"][id]:empty:hover,h3>a[href^="#"][id]:empty:target,h4>a[href^="#"][id]:empty:focus,h4>a[href^="#"][id]:empty:hover,h4>a[href^="#"][id]:empty:target,h5>a[href^="#"][id]:empty:focus,h5>a[href^="#"][id]:empty:hover,h5>a[href^="#"][id]:empty:target,h6>a[href^="#"][id]:empty:focus,h6>a[href^="#"][id]:empty:hover,h6>a[href^="#"][id]:empty:target{opacity:1;box-shadow:none;color:#000}h1>a[href^="#"][id]:empty:target:focus,h2>a[href^="#"][id]:empty:target:focus,h3>a[href^="#"][id]:empty:target:focus,h4>a[href^="#"][id]:empty:target:focus,h5>a[href^="#"][id]:empty:target:focus,h6>a[href^="#"][id]:empty:target:focus{outline:0}h1>a[href^="#"][id]:empty::before,h2>a[href^="#"][id]:empty::before,h3>a[href^="#"][id]:empty::before,h4>a[href^="#"][id]:empty::before,h5>a[href^="#"][id]:empty::before,h6>a[href^="#"][id]:empty::before{content:"§ "}h1{font-size:2.5em}h2{font-size:1.75em}h3{font-size:1.25em}h4{font-size:1.15em}a abbr,h5,h6{font-size:1em}h6{margin-top:1em}article+article{margin-top:4em}article header p{font-size:.6em;color:#aaa}article header p+h1,article header p+h2{margin-top:-.25em}article header h1 a,article header h2 a{color:#000}article header h1 a:visited,article header h2 a:visited,h6,legend{color:#aaa}article>footer{margin-top:1.5em;font-size:.85em}a:visited{color:#8d39d0}a:active,a:hover{outline-width:0}a:hover{color:#f00000}abbr{margin-right:-.075em;text-decoration:none;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;letter-spacing:.075em;font-size:.9em}img,picture{display:block;max-width:100%;margin:0 auto}audio,video{width:100%;max-width:100%}figure{margin:1em 0 .5em;padding:0}figure figcaption{opacity:.65;font-size:.85em}table{display:inline-block;border-spacing:0;border-collapse:collapse;overflow-x:auto;max-width:100%;text-align:left;vertical-align:top;background:linear-gradient(rgba(0,0,0,.15) 0%,rgba(0,0,0,.15) 100%) 0 0,linear-gradient(rgba(0,0,0,.15) 0%,rgba(0,0,0,.15) 100%) 100% 0;background-attachment:scroll,scroll;background-size:1px 100%,1px 100%;background-repeat:no-repeat,no-repeat}table caption{font-size:.9em;background:#fff}table td,table th{padding:.35em .75em;vertical-align:top;font-size:.9em;border:1px solid #f2f2f2;border-top:0;border-left:0}table td:first-child,table th:first-child{padding-left:0;background-image:linear-gradient(to right,#fff 50%,rgba(255,255,255,0) 100%);background-size:2px 100%;background-repeat:no-repeat}table td:last-child,table th:last-child{padding-right:0;border-right:0;background-image:linear-gradient(to left,#fff 50%,rgba(255,255,255,0) 100%);background-position:100% 0;background-size:2px 100%;background-repeat:no-repeat}table td:only-child,table th:only-child{background-image:linear-gradient(to right,#fff 50%,rgba(255,255,255,0) 100%),linear-gradient(to left,#fff 50%,rgba(255,255,255,0) 100%);background-position:0 0,100% 0;background-size:2px 100%,2px 100%;background-repeat:no-repeat,no-repeat}table th{line-height:1.2}form{margin-right:auto;margin-left:auto}@media (min-width:40rem){form{max-width:80%}}form label,form select,output{display:block}form label:not(:first-child){margin-top:1em}form p label{display:inline}form p label+label{margin-left:1em}form input[type],form select,form textarea{margin-bottom:1em}form input[type=checkbox],form input[type=radio]{margin-bottom:0}button,fieldset{margin:0;border:1px solid #aaa}fieldset{padding:.5em 1em}button{outline:0;box-sizing:border-box;height:2em;padding:calc(.25em - 1px) .5em;font-family:inherit;font-size:1em;border-radius:2px;background:#fff;display:inline-block;width:auto;background:#f2f2f2;color:#000;cursor:pointer}button:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,input[type^=date]:focus,select:focus{border:1px solid #000}button:not([disabled]):hover,input[type=button]:not([disabled]):hover,input[type=file]:not([disabled]):hover,input[type=reset]:not([disabled]):hover,input[type=submit]:not([disabled]):hover,select:not([disabled]):hover{border:1px solid #000}button:active,select:active{background-color:#aaa}button[disabled],select[disabled]{color:#aaa;cursor:not-allowed}select{outline:0;box-sizing:border-box;height:2em;margin:0;padding:calc(.25em - 1px) .5em;font-family:inherit;font-size:1em;border:1px solid #aaa;border-radius:2px;background:#fff;display:inline-block;width:auto;background:#f2f2f2;color:#000;cursor:pointer;padding-right:1.2em;background-position:top 55% right .35em;background-size:.5em;background-repeat:no-repeat;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 3 2'%3E%3Cpath fill='rgb(170, 170, 170)' fill-rule='nonzero' d='M1.5 2L3 0H0z'/%3E%3C/svg%3E")}select:not([disabled]):focus,select:not([disabled]):hover{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 3 2'%3E%3Cpath fill='rgb(0, 0, 0)' fill-rule='nonzero' d='M1.5 2L3 0H0z'/%3E%3C/svg%3E")}input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],input[type^=date]{outline:0;box-sizing:border-box;height:2em;margin:0;padding:calc(.25em - 1px) .5em;font-family:inherit;font-size:1em;border:1px solid #aaa;border-radius:2px;background:#fff;color:#000;display:block;width:100%;line-height:calc(2em - 1px*2 - (.25em - 1px)*2);-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=email]::-moz-placeholder,input[type=month]::-moz-placeholder,input[type=number]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=search]::-moz-placeholder,input[type=tel]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=time]::-moz-placeholder,input[type=url]::-moz-placeholder,input[type=week]::-moz-placeholder,input[type^=date]::-moz-placeholder{color:#aaa}input[type=email]::-webkit-input-placeholder,input[type=month]::-webkit-input-placeholder,input[type=number]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=search]::-webkit-input-placeholder,input[type=tel]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=time]::-webkit-input-placeholder,input[type=url]::-webkit-input-placeholder,input[type=week]::-webkit-input-placeholder,input[type^=date]::-webkit-input-placeholder{color:#aaa}input[type=email]:-ms-input-placeholder,input[type=month]:-ms-input-placeholder,input[type=number]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=search]:-ms-input-placeholder,input[type=tel]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=time]:-ms-input-placeholder,input[type=url]:-ms-input-placeholder,input[type=week]:-ms-input-placeholder,input[type^=date]:-ms-input-placeholder{color:#aaa}input[type=button],input[type=reset],input[type=submit]{outline:0;box-sizing:border-box;height:2em;margin:0;padding:calc(.25em - 1px) .5em;font-family:inherit;font-size:1em;border:1px solid #aaa;border-radius:2px;background:#fff;display:inline-block;width:auto;background:#f2f2f2;color:#000;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=button]:focus,input[type=reset]:focus,input[type=submit]:focus{border:1px solid #000}input[type=button]:active,input[type=reset]:active,input[type=submit]:active{background-color:#aaa}input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{color:#aaa;cursor:not-allowed}input[type=color]{outline:0;box-sizing:border-box;height:2em;margin:0;padding:calc(.25em - 1px) .5em;font-family:inherit;font-size:1em;border:1px solid #aaa;border-radius:2px;background:#fff;color:#000;display:block;line-height:calc(2em - 1px*2 - (.25em - 1px)*2);-webkit-appearance:none;-moz-appearance:none;appearance:none;width:6em}input[type=color]:focus{border:1px solid #000}input[type=color]::-moz-placeholder,textarea::-moz-placeholder{color:#aaa}input[type=color]::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa}input[type=color]:-ms-input-placeholder{color:#aaa}input[type=color]:hover{border:1px solid #000}input[type=file]{outline:0;box-sizing:border-box;margin:0;padding:calc(.25em - 1px) .5em;font-family:inherit;border:1px solid #aaa;border-radius:2px;background:#fff;background:#f2f2f2;color:#000;cursor:pointer;display:block;width:100%;height:auto;padding:.75em .5em;font-size:12px;line-height:1}input[type=file]:focus,textarea:focus{border:1px solid #000}input[type=file]:active{background-color:#aaa}input[type=file][disabled]{color:#aaa;cursor:not-allowed}input[type=checkbox],input[type=radio]{margin:-.2em .75em 0 0;vertical-align:middle}textarea{outline:0;box-sizing:border-box;margin:0;padding:calc(.25em - 1px) .5em;font-family:inherit;font-size:1em;border:1px solid #aaa;border-radius:2px;background:#fff;color:#000;display:block;width:100%;line-height:calc(2em - 1px*2 - (.25em - 1px)*2);-webkit-appearance:none;-moz-appearance:none;appearance:none;height:4.5em;resize:vertical;padding-top:.5em;padding-bottom:.5em}textarea:-ms-input-placeholder{color:#aaa}code,kbd,samp,var{font-family:Consolas,"Lucida Console",Monaco,monospace;font-style:normal}pre{overflow-x:auto;font-size:.8em;background:linear-gradient(rgba(0,0,0,.15) 0%,rgba(0,0,0,.15) 100%) 0 0,linear-gradient(rgba(0,0,0,.15) 0%,rgba(0,0,0,.15) 100%) 100% 0;background-attachment:scroll,scroll;background-size:1px 100%,1px 100%;background-repeat:no-repeat,no-repeat}pre>code,summary{display:inline-block}pre>code{overflow-x:visible;box-sizing:border-box;min-width:100%;border-right:3px solid #fff;border-left:1px solid #fff}hr{height:1px;margin:2em 0;border:0;background:#f2f2f2}details[open]{padding-bottom:.5em;border-bottom:1px solid #f2f2f2}summary{font-weight:700;border-bottom:1px dashed;cursor:pointer}summary::-webkit-details-marker{display:none}noscript{color:#d00000}::selection{background:rgba(0,100,193,.25)}
--------------------------------------------------------------------------------
/static/styles/basic.css:
--------------------------------------------------------------------------------
1 | *{box-sizing:border-box}:root{--sans:1em/1.6 system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Droid Sans,Helvetica Neue,Fira Sans,sans-serif;--mono:SFMono-Regular,Consolas,'Liberation Mono',Menlo,Courier,'Courier New',monospace;--c1:#0074d9;--c2:#eee;--c3:#fff;--c4:#000;--c5:#fff;--m1:8px;--rc:8px}@media (prefers-color-scheme:dark){:root{--c2:#333;--c3:#1e1f20;--c4:#fff}}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0;font:var(--sans);font-weight:400;font-style:normal;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;background-color:var(--c3);color:var(--c4)}iframe,img{border:none;max-width:100%}a{color:var(--c1);text-decoration:none}a:hover{color:var(--c1);text-decoration:underline}pre{font:1em/1.6 var(--mono);background:var(--c2);padding:1em;overflow:auto}code{font:1em/1.6 var(--mono)}blockquote{border-left:5px solid var(--c2);padding:1em 1.5em;margin:0}hr{border:0;border-bottom:1px solid var(--c4)}h1,h2,h3,h4,h5,h6{margin:.6em 0;font-weight:400}h1{font-size:2.625em;line-height:1.2}h2{font-size:1.625em;line-height:1.2}h3{font-size:1.3125em;line-height:1.24}h4{font-size:1.1875em;line-height:1.23}h5,h6{font-size:1em;font-weight:700}table{border-collapse:collapse;border-spacing:0;margin:1em 0}td,th{text-align:left;vertical-align:top;border:1px solid;padding:.4em}tfoot,thead{background:var(--c2)}button,code,img,input,pre,select,textarea{border-radius:var(--rc)}input,select,textarea{font-size:1em;color:var(--c4);background:var(--c2);border:0;padding:.6em}button,input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:none;font-size:1em;display:inline-block;color:var(--c5);background:var(--c1);border:0;margin:4px;padding:.6em;cursor:pointer;text-align:center}button:focus,button:hover,input:hover,select:hover,textarea:hover{opacity:.8}section{display:flex;flex-flow:row wrap}[style*="--c:"],article,aside,section>section{flex:var(--c,1);margin:var(--m1)}article{background:var(--c2);border-radius:var(--rc);padding:1em;box-shadow:0 1px 0 rgba(0,0,0,.3)}[style*="--c:"]:first-child,article:first-child,section>section:first-child{margin-left:0}[style*="--c:"]:last-child, section>section:last-child, article:last-child {margin-right:0}
2 |
--------------------------------------------------------------------------------
/static/styles/marx.css:
--------------------------------------------------------------------------------
1 | /*! Marx v4.0.1 - The classless CSS reset (perfect for Communists) | MIT License | https://github.com/mblode/marx */*,:after,:before{background-repeat:no-repeat;box-sizing:border-box}:after,:before{text-decoration:inherit;vertical-align:inherit}:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;cursor:default;line-height:1.5;overflow-wrap:break-word;-moz-tab-size:4;-o-tab-size:4;tab-size:4}:where(body){margin:0}:where(h1){font-size:2em;margin:.67em 0}:where(dl,ol,ul) :where(dl,ol,ul){margin:0}:where(hr){color:inherit;height:0}:where(nav) :where(ol,ul){list-style-type:none;padding:0}:where(navli):before{content:"\200B";float:left}:where(pre){font-family:monospace,monospace;font-size:1em;overflow:auto}:where(abbr[title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,samp){font-family:monospace,monospace;font-size:1em}:where(small){font-size:80%}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}:where(iframe){border-style:none}:where(svg:not([fill])){fill:currentColor}:where(table){border-collapse:collapse;border-color:currentColor;text-indent:0}:where(button,input,select){margin:0}:where(button,[type=button i],[type=reset i],[type=submit i]){-webkit-appearance:button}:where(fieldset){border:1px solid #a0a0a0}:where(progress){vertical-align:baseline}:where(textarea){margin:0;resize:vertical}:where([type=search i]){-webkit-appearance:textfield;outline-offset:-2px}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}:where(dialog){background-color:#fff;border:solid;color:#000;height:-moz-fit-content;height:-webkit-fit-content;height:fit-content;left:0;margin:auto;padding:1em;position:absolute;right:0;width:-moz-fit-content;width:-webkit-fit-content;width:fit-content}:where(dialog:not([open])){display:none}:where(details>summary:first-of-type){display:list-item}:where([aria-busy=true i]){cursor:progress}:where([aria-disabled=true i],[disabled]){cursor:not-allowed}:where([aria-hidden=false i][hidden]){display:initial}:where([aria-hidden=false i][hidden]:not(:focus)){clip:rect(0,0,0,0);position:absolute}:root{--br:4px;--xs-pad:4px;--sm-pad:8px;--md-pad:16px;--lg-pad:20px;--xlg-pad:40px;--sm-breakpoint:400px;--lg-breakpoint:768px;--primary-400:#60a5fa;--primary:#3b82f6;--primary-600:#2563eb;--accent:#64ffda;--red:#f43f5e;--red-600:#dc2626;--yellow:#eab308;--grey:#f7f7f9;--white:#fff;--black:#000;--text:rgba(0,0,0,.8);--secondary:rgba(0,0,0,.54);--disabled:rgba(0,0,0,.38);--dividers:rgba(0,0,0,.12);--link-color:var(--primary);--link-hover-color:var(--primary-600);--sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--serif:Georgia,Times,"Times New Roman",serif;--monospace:Menlo,Monaco,Consolas,"Courier New",monospace;--font-family:var(--sans-serif);--font-size-base:16px;--font-size-sm:14px;--font-size-h1:40px;--font-size-h2:32px;--font-size-h3:28px;--font-size-h4:24px;--font-size-h5:20px;--font-size-h6:16px;--line-height-base:1.5;--border:1px solid var(--dividers)}article,aside,details,footer,header,main,section,summary{margin:0 auto;margin-bottom:var(--md-pad);width:100%}main{display:block;margin:0 auto;max-width:var(--lg-breakpoint);padding:0 var(--md-pad) var(--md-pad)}footer{border-top:var(--border);padding:var(--md-pad) 0;text-align:center}footer p{margin-bottom:0}hr{border:0;border-top:var(--border);box-sizing:content-box;display:block;height:0;margin-bottom:var(--md-pad);margin-top:var(--md-pad);overflow:visible;width:100%}img{height:auto;max-width:100%;vertical-align:baseline}@media screen and (max-width:var(--sm-breakpoint)){article,aside,section{clear:both;display:block;max-width:100%}img{margin-right:var(--md-pad)}}embed,iframe,video{border:0}body{color:var(--text);font-family:var(--font-family);font-size:var(--font-size-base);line-height:var(--line-height-base)}p{margin:0;margin-bottom:var(--md-pad)}h1,h2,h3,h4,h5,h6{color:inherit;font-family:inherit;font-weight:500;line-height:1.2}h1{font-size:var(--font-size-h1)}h1,h2{margin:var(--lg-pad) 0 var(--md-pad)}h2{font-size:var(--font-size-h2)}h3{font-size:var(--font-size-h3)}h3,h4{margin:var(--md-pad) 0 var(--xs-pad)}h4{font-size:var(--font-size-h4)}h5{font-size:var(--font-size-h5);margin:var(--md-pad 0) var(--xs-pad)}h6{font-size:var(--font-size-h6);margin:var(--md-pad) 0 var(--xs-pad)}small{color:var(--secondary);vertical-align:bottom}pre{background-color:var(--grey);display:block;margin:var(--md-pad 0);overflow-wrap:break-word;padding:var(--md-pad);white-space:pre-wrap}code,pre{color:var(--text);font-family:var(--monospace);font-size:var(--font-size-base)}code{word-wrap:break-word;line-height:inherit;margin:0;padding:0;vertical-align:baseline;word-break:break-all}a{background-color:transparent;color:var(--link-color);text-decoration:none}a:focus,a:hover{color:var(--link-hover-color);text-decoration:underline}dl{margin-bottom:var(--md-pad)}dd{margin-left:var(--xlg-pad)}ol,ul{margin-bottom:var(--sm-pad);padding-left:var(--xlg-pad);vertical-align:baseline}blockquote{border-left:2px solid var(--text);font-style:italic;margin:var(--md-pad 0);padding-left:var(--md-pad)}blockquote,figcaption{font-family:var(--serif)}u{text-decoration:underline}s{text-decoration:line-through}sup{vertical-align:super}sub,sup{font-size:var(--font-size-sm)}sub{vertical-align:sub}mark{background-color:var(--yellow)}input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{background:var(--white);background-clip:padding-box;border:var(--border);border-radius:var(--br);color:var(--text);display:block;font-family:var(--sans-serif);font-size:1rem;line-height:1.5;padding:var(--sm-pad) var(--md-pad);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%;word-break:normal}input[type=color]{background-color:var(--white);display:inline-block;vertical-align:middle}input:not([type]),input[type=color]{border:var(--border);border-radius:var(--br)}input:not([type]){-webkit-appearance:none;background:var(--white);background-clip:padding-box;color:var(--text);display:block;line-height:1.5;padding:var(--sm-pad) var(--md-pad);text-align:left;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%;word-break:normal}input:not([type]):focus,input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus,select:focus,textarea:focus{background-color:var(--white);border-color:var(--primary-400);box-shadow:0 0 0 .2rem rgba(59,130,246,.5);outline:0}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:1px thin var(--dividers)}input:not([type])[disabled],input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled],select[disabled],textarea[disabled]{background-color:var(--dividers);color:var(--secondary);cursor:not-allowed;opacity:1}input[readonly],select[readonly],textarea[readonly]{border-color:var(--dividers);color:var(--secondary)}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{border-color:var(--red-600);color:var(--red)}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:var(--red)}select{border:var(--border);vertical-align:sub}select:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select[multiple]{height:auto}label{display:inline-block;line-height:2}fieldset{border:0;margin:0}fieldset,legend{padding:var(--sm-pad 0)}legend{border-bottom:var(--border);color:var(--text);display:block;margin-bottom:var(--sm-pad);width:100%}textarea{overflow:auto;resize:vertical}input[type=checkbox],input[type=radio]{box-sizing:border-box;display:inline;padding:0}button,input[type=button],input[type=reset],input[type=submit]{background-color:var(--primary);border:1px solid transparent;border-radius:var(--br);color:var(--white);display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:var(--sm-pad) var(--md-pad);text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}button::-moz-focus-inner,input[type=button]::-moz-focus-inner,input[type=reset]::-moz-focus-inner,input[type=submit]::-moz-focus-inner{padding:0}button:hover,button:not(:disabled):active,input[type=button]:hover,input[type=button]:not(:disabled):active,input[type=reset]:hover,input[type=reset]:not(:disabled):active,input[type=submit]:hover,input[type=submit]:not(:disabled):active{background-color:var(--primary-600);border-color:var(--primary-600);color:var(--white)}button:focus,input[type=button]:focus,input[type=reset]:focus,input[type=submit]:focus{box-shadow:0 0 0 .2rem rgba(59,130,246,.5);outline:0}button:disabled,input[type=button]:disabled,input[type=reset]:disabled,input[type=submit]:disabled{background-color:var(--primary);border-color:var(--primary);color:var(--white);cursor:not-allowed;opacity:.65}table{border-top:var(--border);margin-bottom:var(--md-pad)}caption{padding:var(--sm-pad 0)}thead th{border:0;border-bottom:2px solid var(--dividers);text-align:left}tr{margin-bottom:var(--sm-pad)}td,th{border-bottom:var(--border);padding:var(--md-pad);vertical-align:inherit}tfoot tr{text-align:left}tfoot td{color:var(--secondary);font-size:var(--sm-pad);font-style:italic;padding:var(--md-pad) var(--xs-pad)}
--------------------------------------------------------------------------------
/static/styles/openprops.css:
--------------------------------------------------------------------------------
1 | @import "https://unpkg.com/open-props" layer(base);
2 | @import "https://unpkg.com/open-props/normalize.min.css" layer(base);
3 | @import "https://unpkg.com/open-props/buttons.min.css" layer(base);
--------------------------------------------------------------------------------
/static/styles/sakura.css:
--------------------------------------------------------------------------------
1 | /* Sakura.css v1.4.1
2 | * ================
3 | * Minimal css theme.
4 | * Project: https://github.com/oxalorg/sakura/
5 | */
6 | /* Body */
7 | html {
8 | font-size: 62.5%;
9 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
10 | }
11 |
12 | body {
13 | font-size: 1.8rem;
14 | line-height: 1.618;
15 | max-width: 38em;
16 | margin: auto;
17 | color: #4a4a4a;
18 | background-color: #f9f9f9;
19 | padding: 13px;
20 | }
21 |
22 | @media (max-width: 684px) {
23 | body {
24 | font-size: 1.53rem;
25 | }
26 | }
27 | @media (max-width: 382px) {
28 | body {
29 | font-size: 1.35rem;
30 | }
31 | }
32 | h1, h2, h3, h4, h5, h6 {
33 | line-height: 1.1;
34 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
35 | font-weight: 700;
36 | margin-top: 3rem;
37 | margin-bottom: 1.5rem;
38 | overflow-wrap: break-word;
39 | word-wrap: break-word;
40 | -ms-word-break: break-all;
41 | word-break: break-word;
42 | }
43 |
44 | h1 {
45 | font-size: 2.35em;
46 | }
47 |
48 | h2 {
49 | font-size: 2em;
50 | }
51 |
52 | h3 {
53 | font-size: 1.75em;
54 | }
55 |
56 | h4 {
57 | font-size: 1.5em;
58 | }
59 |
60 | h5 {
61 | font-size: 1.25em;
62 | }
63 |
64 | h6 {
65 | font-size: 1em;
66 | }
67 |
68 | p {
69 | margin-top: 0px;
70 | margin-bottom: 2.5rem;
71 | }
72 |
73 | small, sub, sup {
74 | font-size: 75%;
75 | }
76 |
77 | hr {
78 | border-color: #1d7484;
79 | }
80 |
81 | a {
82 | text-decoration: none;
83 | color: #1d7484;
84 | }
85 | a:visited {
86 | color: #144f5a;
87 | }
88 | a:hover {
89 | color: #982c61;
90 | border-bottom: 2px solid #4a4a4a;
91 | }
92 |
93 | ul {
94 | padding-left: 1.4em;
95 | margin-top: 0px;
96 | margin-bottom: 2.5rem;
97 | }
98 |
99 | li {
100 | margin-bottom: 0.4em;
101 | }
102 |
103 | blockquote {
104 | margin-left: 0px;
105 | margin-right: 0px;
106 | padding-left: 1em;
107 | padding-top: 0.8em;
108 | padding-bottom: 0.8em;
109 | padding-right: 0.8em;
110 | border-left: 5px solid #1d7484;
111 | margin-bottom: 2.5rem;
112 | background-color: #f1f1f1;
113 | }
114 |
115 | blockquote p {
116 | margin-bottom: 0;
117 | }
118 |
119 | img, video {
120 | height: auto;
121 | max-width: 100%;
122 | margin-top: 0px;
123 | margin-bottom: 2.5rem;
124 | }
125 |
126 | /* Pre and Code */
127 | pre {
128 | background-color: #f1f1f1;
129 | display: block;
130 | padding: 1em;
131 | overflow-x: auto;
132 | margin-top: 0px;
133 | margin-bottom: 2.5rem;
134 | font-size: 0.9em;
135 | }
136 |
137 | code, kbd, samp {
138 | font-size: 0.9em;
139 | padding: 0 0.5em;
140 | background-color: #f1f1f1;
141 | white-space: pre-wrap;
142 | }
143 |
144 | pre > code {
145 | padding: 0;
146 | background-color: transparent;
147 | white-space: pre;
148 | font-size: 1em;
149 | }
150 |
151 | /* Tables */
152 | table {
153 | text-align: justify;
154 | width: 100%;
155 | border-collapse: collapse;
156 | }
157 |
158 | td, th {
159 | padding: 0.5em;
160 | border-bottom: 1px solid #f1f1f1;
161 | }
162 |
163 | /* Buttons, forms and input */
164 | input, textarea {
165 | border: 1px solid #4a4a4a;
166 | }
167 | input:focus, textarea:focus {
168 | border: 1px solid #1d7484;
169 | }
170 |
171 | textarea {
172 | width: 100%;
173 | }
174 |
175 | .button, button, input[type=submit], input[type=reset], input[type=button] {
176 | display: inline-block;
177 | padding: 5px 10px;
178 | text-align: center;
179 | text-decoration: none;
180 | white-space: nowrap;
181 | background-color: #1d7484;
182 | color: #f9f9f9;
183 | border-radius: 1px;
184 | border: 1px solid #1d7484;
185 | cursor: pointer;
186 | box-sizing: border-box;
187 | }
188 | .button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled] {
189 | cursor: default;
190 | opacity: 0.5;
191 | }
192 | .button:focus:enabled, .button:hover:enabled, button:focus:enabled, button:hover:enabled, input[type=submit]:focus:enabled, input[type=submit]:hover:enabled, input[type=reset]:focus:enabled, input[type=reset]:hover:enabled, input[type=button]:focus:enabled, input[type=button]:hover:enabled {
193 | background-color: #982c61;
194 | border-color: #982c61;
195 | color: #f9f9f9;
196 | outline: 0;
197 | }
198 |
199 | textarea, select, input {
200 | color: #4a4a4a;
201 | padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
202 | margin-bottom: 10px;
203 | background-color: #f1f1f1;
204 | border: 1px solid #f1f1f1;
205 | border-radius: 4px;
206 | box-shadow: none;
207 | box-sizing: border-box;
208 | }
209 | textarea:focus, select:focus, input:focus {
210 | border: 1px solid #1d7484;
211 | outline: 0;
212 | }
213 |
214 | input[type=checkbox]:focus {
215 | outline: 1px dotted #1d7484;
216 | }
217 |
218 | label, legend, fieldset {
219 | display: block;
220 | margin-bottom: 0.5rem;
221 | font-weight: 600;
222 | }
--------------------------------------------------------------------------------
/static/styles/stylize.css:
--------------------------------------------------------------------------------
1 | /*! stylize.css v1.0.0 | License MIT | https://github.com/vasanthv/stylize.css */
2 | :root{
3 | --text: #333333;
4 | --text-med: #888888;
5 | --text-light: #cccccc;
6 | --text-lighter: #eeeeee;
7 | --blue: #3498db;
8 | --dark-blue: #2980b9;
9 | --yellow: #ffeaa7;
10 | --red: #c0392b;
11 | --border-radius: 3px;
12 | }
13 |
14 | body{
15 | font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; /* To use the system default font. */
16 | line-height: 1.5;
17 | font-size: 1em;
18 | color:var(--text);
19 | margin: 10px;
20 | -webkit-text-size-adjust: 100%;
21 | }
22 |
23 | /* Headings */
24 | h1{
25 | font-size: 2em; /* h1 inside section is treated different in some browsers */
26 | margin: 0.67em 0;
27 | }
28 | h2{
29 | font-size: 1.5em;
30 | margin: 0.83em 0;
31 | }
32 | h3{
33 | font-size: 1.17em;
34 | margin: 1em 0;
35 | }
36 | h4{
37 | font-size: 1em;
38 | margin: 1.17em 0;
39 | }
40 | h5{
41 | font-size: 0.83em;
42 | margin: 1.5em 0;
43 | }
44 | h6{
45 | font-size: 0.67em;
46 | margin: 2em 0;
47 | }
48 |
49 | /* Links */
50 | a{
51 | color:var(--blue);
52 | background-color: transparent;
53 | }
54 | a:visited{
55 | color:var(--dark-blue);
56 | }
57 |
58 | /* Navigation Links*/
59 | nav{
60 | background-color: var(--text-lighter);
61 | padding: 1em;
62 | margin:-10px;
63 | }
64 | nav a{
65 | padding:0.5em;
66 | border-radius: var(--border-radius);
67 | text-decoration: none;
68 | }
69 | nav a:hover{
70 | background-color: var(--text-light);
71 | color: var(--text)
72 | }
73 |
74 | /* Horizontal Line */
75 | hr{
76 | border: 1px solid var(--text-med);
77 | border-bottom: 0px;
78 | height:0px;
79 | }
80 |
81 | /* Text formatting tags */
82 | p{
83 | margin:1em 0;
84 | }
85 | mark{
86 | background-color: var(--yellow);
87 | color:#333333;
88 | }
89 | small{
90 | font-size: 80%;
91 | }
92 | sub,
93 | sup{
94 | font-size: 75%;
95 | }
96 |
97 | /* Quotation and Citation tags*/
98 | blockquote{
99 | border-left: 4px solid var(--text-light);
100 | margin:1em 0;
101 | padding:0.6em 1em;
102 | }
103 | pre{
104 | font-family: monospace;
105 | border:1px solid var(--text-light);
106 | background-color: var(--text-lighter);
107 | padding: 0.8em;
108 | border-radius: var(--border-radius);
109 | font-size: 1em;
110 | white-space: pre-wrap;
111 | word-wrap: break-word;
112 | }
113 | code,
114 | kbd,
115 | samp{
116 | font-family: monospace;
117 | font-size: 1em;
118 | }
119 | code,
120 | kbd{
121 | border-radius: var(--border-radius);
122 | padding:0px 2px;
123 | }
124 | code{
125 | border:1px solid var(--text-light);
126 | background-color: var(--text-lighter);
127 | color:var(--red);
128 | }
129 | kbd{
130 | border:1px solid var(--text);
131 | background-color: var(--text);
132 | color:var(--text-lighter);
133 | }
134 |
135 | /* List items */
136 | ul, ol{
137 | padding-left: 2em;
138 | }
139 |
140 | /* Form elements */
141 |
142 | fieldset{
143 | border: 1px solid var(--text);
144 | border-radius: var(--border-radius);
145 | }
146 | select {
147 | -webkit-appearance: none;
148 | -moz-appearance : none;
149 | appearance : none;
150 | background: transparent;
151 | background-image: url("data:image/svg+xml;utf8, ");
152 | background-repeat: no-repeat;
153 | background-position-x: 100%;
154 | background-position-y: 50%;
155 | }
156 | button,
157 | input,
158 | select,
159 | textarea,
160 | a[role="button"] {
161 | font-family: inherit;
162 | font-size: 100%;
163 | line-height: 1.5;
164 | margin: 0;
165 | padding: 0.33em;
166 | border: 1px solid var(--text-light);
167 | border-radius: var(--border-radius);
168 | box-sizing: border-box;
169 | }
170 | input[type="checkbox"],
171 | input[type="radio"]{
172 | border:none;
173 | border:0;
174 | }
175 |
176 | button,
177 | input[type="button"],
178 | input[type="submit"],
179 | a[role="button"] {
180 | padding: 0.33em 0.66em;
181 | cursor: pointer;
182 | background-color: var(--text-lighter);
183 | color: var(--text);
184 | text-decoration: none;
185 | }
186 | button:hover,
187 | input[type="button"]:hover,
188 | input[type="submit"]:hover,
189 | a[role="button"]:hover {
190 | background-color: var(--text-light);
191 | }
192 | a[role="button"]{
193 | padding:0.5em 0.66em;
194 | }
195 | button:disabled,
196 | input[type="button"]:disabled,
197 | input[type="submit"]:disabled,
198 | a[role="button"]:disabled {
199 | background-color: var(--text-lighter);
200 | color: var(--text-light);
201 | cursor: not-allowed;
202 | }
203 | /* Progress Bar */
204 |
205 | progress[value] {
206 | -webkit-appearance: none;
207 | -moz-appearance: none;
208 | appearance: none;
209 | vertical-align: middle;
210 | border: none;
211 | width: 15em;
212 | height: 0.75em;
213 | background-color: var(--text-light);
214 | color: var(--blue);
215 | }
216 | progress[value]::-webkit-progress-bar {
217 | background-color: var(--text-light);
218 | }
219 | progress[value]::-webkit-progress-value{
220 | background-color: var(--blue);
221 | }
222 |
223 | /* Table Elements */
224 | table{
225 | border-collapse: collapse;
226 | }
227 | table,
228 | table th,
229 | table td {
230 | border-bottom: 1px solid var(--text-light);
231 | padding:0.33em 0.66em;
232 | text-align: left;
233 | vertical-align: middle;
234 | }
235 | table[border="1"],
236 | table[border="1"] th,
237 | table[border="1"] td {
238 | border: 1px solid var(--text-light);
239 | }
240 |
241 | /* Utility classes */
242 | .left{
243 | float: left;
244 | }
245 | .right{
246 | float: right;
247 | }
248 | .center{
249 | text-align: center;
250 | }
251 | .clear{
252 | clear: both;
253 | }
254 | .hide{
255 | display: none;
256 | }
257 | .spacer{
258 | display: block;
259 | height:1em;
260 | border:none;
261 | clear: both;
262 | }
263 | .wrap{
264 | width: 100%;
265 | max-width: 40em;
266 | margin: auto;
267 | }
268 | .reset{
269 | font: inherit;
270 | font-size: 100%;
271 | margin: 0;
272 | padding: 0;
273 | border: 0;
274 | text-decoration: none;
275 | }
276 | ol.reset, ul.reset {
277 | list-style: none;
278 | }
--------------------------------------------------------------------------------
/static/styles/tufte.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";@font-face{font-family:et-book;src:url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot);src:url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff) format("woff"),url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf) format("truetype"),url(et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg#etbookromanosf) format("svg");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:et-book;src:url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot);src:url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff) format("woff"),url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf) format("truetype"),url(et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg#etbookromanosf) format("svg");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:et-book;src:url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot);src:url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff) format("woff"),url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf) format("truetype"),url(et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg#etbookromanosf) format("svg");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:et-book-roman-old-style;src:url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot);src:url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot?#iefix) format("embedded-opentype"),url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff) format("woff"),url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf) format("truetype"),url(et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg#etbookromanosf) format("svg");font-weight:400;font-style:normal;font-display:swap}html{font-size:15px}body{width:87.5%;margin-left:auto;margin-right:auto;padding-left:12.5%;font-family:et-book,Palatino,"Palatino Linotype","Palatino LT STD","Book Antiqua",Georgia,serif;background-color:#fffff8;color:#111;max-width:1400px;counter-reset:sidenote-counter}@media (prefers-color-scheme:dark){body{background-color:#151515;color:#ddd}}h1{font-weight:400;margin-top:4rem;margin-bottom:1.5rem;font-size:3.2rem;line-height:1}h2{font-style:italic;font-weight:400;margin-top:2.1rem;margin-bottom:1.4rem;font-size:2.2rem;line-height:1}h3{font-style:italic;font-weight:400;font-size:1.7rem;margin-top:2rem;margin-bottom:1.4rem;line-height:1}hr{display:block;height:1px;width:55%;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}p.subtitle{font-style:italic;margin-top:1rem;margin-bottom:1rem;font-size:1.8rem;display:block;line-height:1}.numeral{font-family:et-book-roman-old-style}.danger{color:red}article{padding:5rem 0}section{padding-top:1rem;padding-bottom:1rem}dl,ol,p,ul{font-size:1.4rem;line-height:2rem}p{margin-top:1.4rem;margin-bottom:1.4rem;padding-right:0;vertical-align:baseline}div.epigraph{margin:5em 0}div.epigraph>blockquote{margin-top:3em;margin-bottom:3em}div.epigraph>blockquote,div.epigraph>blockquote>p{font-style:italic}div.epigraph>blockquote>footer{font-style:normal}div.epigraph>blockquote>footer>cite{font-style:italic}blockquote{font-size:1.4rem}blockquote p{width:55%;margin-right:40px}blockquote footer{width:55%;font-size:1.1rem;text-align:right}section>footer,section>p,section>table{width:55%}section>dl,section>ol,section>ul{width:50%;-webkit-padding-start:5%}dt:not(:first-child),li:not(:first-child){margin-top:.25rem}figure{padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;max-width:55%;-webkit-margin-start:0;-webkit-margin-end:0;margin:0 0 3em 0}figcaption{float:right;clear:right;margin-top:0;margin-bottom:0;font-size:1.1rem;line-height:1.6;vertical-align:baseline;position:relative;max-width:40%}figure.fullwidth figcaption{margin-right:24%}a:link,a:visited{color:inherit}.no-tufte-underline:link{background:unset;text-shadow:unset}.hover-tufte-underline:hover,.tufte-underline,a:link{text-decoration:none;background:-webkit-linear-gradient(#fffff8,#fffff8),-webkit-linear-gradient(#fffff8,#fffff8),-webkit-linear-gradient(currentColor,currentColor);background:linear-gradient(#fffff8,#fffff8),linear-gradient(#fffff8,#fffff8),linear-gradient(currentColor,currentColor);-webkit-background-size:.05em 1px,.05em 1px,1px 1px;-moz-background-size:.05em 1px,.05em 1px,1px 1px;background-size:.05em 1px,.05em 1px,1px 1px;background-repeat:no-repeat,no-repeat,repeat-x;text-shadow:.03em 0 #fffff8,-.03em 0 #fffff8,0 .03em #fffff8,0 -.03em #fffff8,.06em 0 #fffff8,-.06em 0 #fffff8,.09em 0 #fffff8,-.09em 0 #fffff8,.12em 0 #fffff8,-.12em 0 #fffff8,.15em 0 #fffff8,-.15em 0 #fffff8;background-position:0 93%,100% 93%,0 93%}@media screen and (-webkit-min-device-pixel-ratio:0){.hover-tufte-underline:hover,.tufte-underline,a:link{background-position-y:87%,87%,87%}}@media (prefers-color-scheme:dark){.hover-tufte-underline:hover,.tufte-underline,a:link{text-shadow:.03em 0 #151515,-.03em 0 #151515,0 .03em #151515,0 -.03em #151515,.06em 0 #151515,-.06em 0 #151515,.09em 0 #151515,-.09em 0 #151515,.12em 0 #151515,-.12em 0 #151515,.15em 0 #151515,-.15em 0 #151515}}a:link::-moz-selection,a:link::selection{text-shadow:.03em 0 #b4d5fe,-.03em 0 #b4d5fe,0 .03em #b4d5fe,0 -.03em #b4d5fe,.06em 0 #b4d5fe,-.06em 0 #b4d5fe,.09em 0 #b4d5fe,-.09em 0 #b4d5fe,.12em 0 #b4d5fe,-.12em 0 #b4d5fe,.15em 0 #b4d5fe,-.15em 0 #b4d5fe;background:#b4d5fe}img{max-width:100%}.marginnote,.sidenote{float:right;clear:right;margin-right:-60%;width:50%;margin-top:.3rem;margin-bottom:0;font-size:1.1rem;line-height:1.3;vertical-align:baseline;position:relative}.sidenote-number{counter-increment:sidenote-counter}.sidenote-number:after,.sidenote:before{font-family:et-book-roman-old-style;position:relative;vertical-align:baseline}.sidenote-number:after{content:counter(sidenote-counter);font-size:1rem;top:-.5rem;left:.1rem}.sidenote:before{content:counter(sidenote-counter) " ";font-size:1rem;top:-.5rem}blockquote .marginnote,blockquote .sidenote{margin-right:-82%;min-width:59%;text-align:left}div.fullwidth,table.fullwidth{width:100%}div.table-wrapper{overflow-x:auto;font-family:"Trebuchet MS","Gill Sans","Gill Sans MT",sans-serif}.sans{font-family:"Gill Sans","Gill Sans MT",Calibri,sans-serif;letter-spacing:.03em}code,pre>code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:1rem;line-height:1.42;-webkit-text-size-adjust:100%}.sans>code{font-size:1.2rem}h1>code,h2>code,h3>code{font-size:.8em}.marginnote>code,.sidenote>code{font-size:1rem}pre>code{font-size:.9rem;width:52.5%;margin-left:2.5%;overflow-x:auto;display:block}pre.fullwidth>code{width:90%}.fullwidth{max-width:90%;clear:both}span.newthought{font-variant:small-caps;font-size:1.2em}input.margin-toggle{display:none}label.sidenote-number{display:inline-block;max-height:2rem}label.margin-toggle:not(.sidenote-number){display:none}.iframe-wrapper{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.iframe-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}@media (max-width:760px){body{width:84%;padding-left:8%;padding-right:8%}hr,section>footer,section>p,section>table{width:100%}pre>code{width:97%}section>dl,section>ol,section>ul{width:90%}figure{max-width:90%}figcaption,figure.fullwidth figcaption{margin-right:0;max-width:none}blockquote{margin-left:1.5em;margin-right:0}blockquote footer,blockquote p{width:100%}label.margin-toggle:not(.sidenote-number){display:inline}.marginnote,.sidenote{display:none}.margin-toggle:checked+.marginnote,.margin-toggle:checked+.sidenote{display:block;float:left;left:1rem;clear:both;width:95%;margin:1rem 2.5%;vertical-align:baseline;position:relative}label{cursor:pointer}div.table-wrapper,table{width:85%}img{width:100%}}
2 |
--------------------------------------------------------------------------------
/static/styles/writ.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Writ v1.0.4
3 | *
4 | * Copyright © 2015, Curtis McEnroe
5 | *
6 | * https://cmcenroe.me/writ/LICENSE (ISC)
7 | */
8 |
9 | /* Fonts, sizes & vertical rhythm */
10 |
11 | html {
12 | font-family: Palatino, Georgia, Lucida Bright, Book Antiqua, serif;
13 | font-size: 16px;
14 | line-height: 1.5rem;
15 | }
16 |
17 | code, pre, samp, kbd {
18 | font-family: Consolas, Liberation Mono, Menlo, Courier, monospace;
19 | font-size: 0.833rem;
20 | }
21 |
22 | kbd { font-weight: bold; }
23 | h1, h2, h3, h4, h5, h6, th { font-weight: normal; }
24 |
25 | /* Minor third */
26 | h1 { font-size: 2.488em; }
27 | h2 { font-size: 2.074em; }
28 | h3 { font-size: 1.728em; }
29 | h4 { font-size: 1.44em; }
30 | h5 { font-size: 1.2em; }
31 | h6 { font-size: 1em; }
32 | small { font-size: 0.833em; }
33 |
34 | h1, h2, h3 { line-height: 3rem; }
35 |
36 | p, ul, ol, dl, table, blockquote, pre, h1, h2, h3, h4, h5, h6 {
37 | margin: 1.5rem 0 0;
38 | }
39 | ul ul, ol ol, ul ol, ol ul { margin: 0; }
40 |
41 | hr {
42 | margin: 0;
43 | border: none;
44 | padding: 1.5rem 0 0;
45 | }
46 |
47 | /* Accounting for borders */
48 | table {
49 | line-height: calc(1.5rem - 1px);
50 | margin-bottom: -1px;
51 | }
52 | pre {
53 | margin-top: calc(1.5rem - 1px);
54 | margin-bottom: -1px;
55 | }
56 |
57 | /* Colors */
58 |
59 | body { color: #222; }
60 | code, pre, samp, kbd { color: #111; }
61 | a, header nav a:visited, a code { color: #00e; }
62 | a:visited, a:visited code { color: #60b; }
63 | mark { color: inherit; }
64 |
65 | code, pre, samp, thead, tfoot { background-color: rgba(0, 0, 0, 0.05); }
66 | mark { background-color: #fe0; }
67 |
68 | main aside, blockquote, ins { border: solid rgba(0, 0, 0, 0.05); }
69 | pre, code, samp { border: solid rgba(0, 0, 0, 0.1); }
70 | th, td { border: solid #dbdbdb; }
71 |
72 | /* Layout */
73 |
74 | body { margin: 1.5rem 1ch; }
75 |
76 | body > header { text-align: center; }
77 |
78 | main, body > footer {
79 | display: block; /* Just in case */
80 | max-width: 78ch;
81 | margin: auto;
82 | }
83 |
84 | main figure, main aside {
85 | float: right;
86 | margin: 1.5rem 0 0 1ch;
87 | }
88 |
89 | main aside {
90 | max-width: 26ch;
91 | border-width: 0 0 0 0.5ch;
92 | padding: 0 0 0 0.5ch;
93 | }
94 |
95 | /* Copy blocks */
96 |
97 | blockquote {
98 | margin-right: 3ch;
99 | margin-left: 1.5ch;
100 | border-width: 0 0 0 0.5ch;
101 | padding: 0 0 0 1ch;
102 | }
103 |
104 | pre {
105 | border-width: 1px;
106 | border-radius: 2px;
107 | padding: 0 0.5ch;
108 | overflow-x: auto;
109 | }
110 | pre code {
111 | border: none;
112 | padding: 0;
113 | background-color: transparent;
114 | white-space: inherit;
115 | }
116 |
117 | img { max-width: 100%; }
118 |
119 | /* Lists */
120 |
121 | ul, ol, dd { padding: 0 0 0 3ch; }
122 | dd { margin: 0; }
123 |
124 | ul > li { list-style-type: disc; }
125 | li ul > li { list-style-type: circle; }
126 | li li ul > li { list-style-type: square; }
127 |
128 | ol > li { list-style-type: decimal; }
129 | li ol > li { list-style-type: lower-roman; }
130 | li li ol > li { list-style-type: lower-alpha; }
131 |
132 | nav ul {
133 | padding: 0;
134 | list-style-type: none;
135 | }
136 | nav ul li {
137 | display: inline;
138 | padding-left: 1ch;
139 | white-space: nowrap;
140 | }
141 | nav ul li:first-child { padding-left: 0; }
142 |
143 | /* Tables */
144 |
145 | table {
146 | width: 100%;
147 | border-collapse: collapse;
148 | overflow-x: auto;
149 | }
150 |
151 | th, td {
152 | border-width: 1px;
153 | padding: 0 0.5ch;
154 | }
155 |
156 | /* Copy inline */
157 |
158 | a { text-decoration: none; }
159 |
160 | sup, sub {
161 | font-size: 0.75em;
162 | line-height: 1em;
163 | }
164 |
165 | ins {
166 | border-width: 1px;
167 | padding: 1px;
168 | text-decoration: none;
169 | }
170 |
171 | mark {
172 | padding: 1px;
173 | }
174 |
175 | code, samp {
176 | border-width: 1px;
177 | border-radius: 2px;
178 | padding: 0.1em 0.2em;
179 | white-space: nowrap;
180 | }
--------------------------------------------------------------------------------
/test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Compare Classless CSS frameworks
5 |
6 |
7 |
8 |
9 |
10 |
11 | Welcome
12 | I was struggling to make a simple page I was building look decent.
13 | I knew there were stylesheets just used 'semantic html' (like Tufte) and didn't require any special className
14 | (i.e <button class="btn-primary">a button</button>
), however I was struggling to find them.
15 |
16 | I should know this, but I'm looking for a simple CSS stylesheet that would replace the default user agent
17 | and make it look half decent. Google-fu is failing me, all I can find is resets and full frameworks. :\\
18 | — Twitter :
19 |
20 | Once I found examples of 'class-less CSS', it was a bit of a pain to find them and compare all the different
21 | examples. Hence this page.
22 |
23 | This page is designed to collate all the CSS frameworks into one place and let you compare and contrast them.
24 |
25 | Here is the list of class-less CSS frameworks that you can checkout:
26 |
27 |
31 |
32 | If you have a framework you would like include, create PR against frameworks.ts
34 |
35 | Check out my other site.
36 |
37 |
38 | This page is rendered using ${frameworks[currentFramework].name}.
39 | Some of the entries are taken from the layout from stylize .
41 |
42 |
43 |
44 | Typography:
45 | This is a H1 heading
46 | This is a H2 heading
47 | This is a H3 heading
48 | This is a H4 heading
49 | This is a H5 heading
50 | This is a H6 heading
51 | This is a paragraph of text. It's my paragraph. I like it a lot.
52 |
53 | This is a Strong / Bold text
54 |
55 | This is an Emphasized / Italic text
56 |
57 | This is a Marked / Highlighted text
58 |
59 | This is a Small text
60 |
61 | This is a Deleted text
62 |
63 | This is a Underlined / Inserted text
64 |
65 | This is a Subscript text
66 |
67 | This is a Superscript text
68 |
69 | This is a preformatted text.
70 | This is a Blockquote.
71 | This is a sample output.
72 |
73 | This is the <code>
& kbd
74 |
75 | Links & navigation:
76 |
77 | Nav Link 1
78 | Nav Link 2
79 |
82 |
83 |
84 |
85 | Normal link
86 |
87 | Lists:
88 |
89 | Unordered list item 1
90 | Unordered list item 2
91 |
92 | Unordered list item 3
93 |
94 | Unordered list item 4
95 | Unordered list item 5
96 |
97 |
98 | Ordered list item 1
99 | Ordered list item 2
100 |
101 | Ordered list item 3
102 |
103 | Ordered list item 4
104 | Ordered list item 5
105 |
106 |
107 | Form:
108 |
109 | This is a legend on fieldset
110 |
111 |
112 | Label:
113 |
114 |
115 | Select box:
116 |
117 |
118 | Option 1
119 | Option 2
120 | Option 3
121 |
122 |
123 |
124 | Numeric Field:
125 |
126 |
127 | Checkboxes:
128 | Option 1
129 | Option 2
130 |
131 | Radio buttons:
132 | Yes
133 | No
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 | Button
142 | Anchor role=button
143 |
144 | Button
145 |
146 | Progress bar
147 |
148 |
149 | Table:
150 |
151 |
152 |
153 | #
154 | Name
155 | Username
156 | Location
157 |
158 |
159 |
160 |
161 | 1
162 | Vasanth
163 | @vsnthv
164 | Chennai, India
165 |
166 |
167 | 2
168 | John
169 | @john
170 | USA
171 |
172 |
173 | 3
174 | Chan
175 | @chan
176 | Hong Kong
177 |
178 |
179 |
180 | Table with border=1
181 |
182 |
183 |
184 | #
185 | Name
186 | Username
187 | Location
188 |
189 |
190 |
191 |
192 | 1
193 | Vasanth
194 | @vsnthv
195 | Chennai, India
196 |
197 |
198 | 2
199 | John
200 | @john
201 | USA
202 |
203 |
204 | 3
205 | Chan
206 | @chan
207 | Hong Kong
208 |
209 |
210 |
211 |
212 |
213 |
214 |
--------------------------------------------------------------------------------