Bläddra i källkod

Playground CSS improvements

main
Rocketsoup 1 år sedan
förälder
incheckning
94050d5b9a
1 ändrade filer med 334 tillägg och 203 borttagningar
  1. 334
    203
      playground.html

+ 334
- 203
playground.html Visa fil

6
 		<link rel="icon" href="data:;base64,iVBORw0KGgo=">
6
 		<link rel="icon" href="data:;base64,iVBORw0KGgo=">
7
 		<style type="text/css">
7
 		<style type="text/css">
8
 			/* Structural style */
8
 			/* Structural style */
9
+			:root, body {
10
+				width: 100%; height: 100%;
11
+				padding: 0;
12
+				margin: 0;
13
+			}
14
+			.pane-container {
15
+				position: absolute;
16
+				left: 0; top: 0;
17
+				width: 100%; height: 100%;
18
+				box-sizing: border-box;
19
+
20
+				display: grid;
21
+				grid-template-columns: auto 1fr;
22
+			}
23
+			.left-pane {
24
+				grid-row: 1; grid-column: 1;
25
+				resize: horizontal;
26
+				overflow-x: auto;
27
+				box-sizing: border-box;
28
+				min-width: 40vw;
29
+				max-width: 80vw;
30
+				border-right: 4px solid var(--color-ui-divider);
31
+
32
+				display: grid;
33
+				grid-template-rows: 32px 1fr;
34
+				grid-template-columns: 1fr;
35
+			}
36
+			.right-pane {
37
+				grid-row: 1; grid-column: 2;
38
+				overflow-x: auto;
39
+				overflow-y: scroll;
40
+			}
41
+			.toolbar-pane {
42
+				grid-row: 1; grid-column: 1;
43
+				box-sizing: border-box;
44
+				display: grid;
45
+				grid-template-columns: 1fr 1fr;
46
+			}
47
+			.toolbar-left {
48
+				grid-column: 1;
49
+			}
50
+			.toolbar-right {
51
+				grid-column: 2;
52
+			}
53
+			.editor-pane {
54
+				grid-row: 2; grid-column: 1;
55
+			}
56
+			#markdown-editor {
57
+				box-sizing: border-box;
58
+				position: relative;
59
+				width: 100%;
60
+				height: 100%;
61
+				resize: none;
62
+			}
63
+			@media screen and (max-width: 800px) {
64
+				.pane-container {
65
+					grid-template-columns: 1fr;
66
+					grid-template-rows: auto 1fr;
67
+					column-gap: 0;
68
+				}
69
+				.left-pane {
70
+					grid-row: 2; grid-column: 1;
71
+					resize: none;
72
+					overflow-x: hidden;
73
+					min-width: none;
74
+					max-width: none;
75
+					width: auto !important; /* undo wide mode resizing */
76
+					border-right: none;
77
+					border-top: 4px solid var(--color-ui-divider);
78
+				}
79
+				.right-pane {
80
+					grid-row: 1; grid-column: 1;
81
+					resize: vertical;
82
+					min-height: 40vw;
83
+					max-height: 80vw;
84
+				}
85
+			}
86
+			@media screen and (min-width: 801px) {
87
+				.right-pane {
88
+					height: auto !important; /* undo narrow mode resizing */
89
+				}
90
+			}
91
+
92
+			/* UI aesthetic */
93
+
9
 			:root {
94
 			:root {
10
 				--color-editor-background: #00a;
95
 				--color-editor-background: #00a;
11
 				--color-editor-text: white;
96
 				--color-editor-text: white;
12
-				--toolbar-background: #ccc;
13
-				--toolbar-text: #000;
97
+				--color-toolbar-background: #ccc;
98
+				--color-toolbar-text: #000;
99
+				--color-ui-divider: #000;
14
 			}
100
 			}
15
 			@media (prefers-color-scheme: dark) {
101
 			@media (prefers-color-scheme: dark) {
16
 				:root {
102
 				:root {
17
 					--toolbar-background: #aaa;
103
 					--toolbar-background: #aaa;
104
+					--color-ui-divider: #999;
18
 				}
105
 				}
19
 			}
106
 			}
20
-			:root, body {
21
-				width: 100%;
22
-				height: 100%;
23
-				padding: 0;
24
-				margin: 0;
25
-				background-color: var(--color-background);
26
-				color: var(--color-text);
107
+			.toolbar-pane,
108
+			dialog {
109
+				font-family: sans-serif;
27
 			}
110
 			}
28
-			.inputhalf {
29
-				position: absolute;
30
-				width: 50%;
31
-				height: 100%;
32
-				left: 0;
33
-				top: 0;
111
+
112
+			.toolbar-pane {
113
+				background-color: var(--color-toolbar-background);
114
+				color: var(--color-toolbar-text);
115
+				border-bottom: 1px solid var(--color-ui-divider);
116
+				padding: 4px 20px;
117
+			}
118
+			.toolbar-left {
119
+				text-align: left;
120
+			}
121
+			.toolbar-right {
122
+				text-align: right;
123
+			}
124
+			#markdown-editor {
125
+				padding: 1em 2em;
126
+				border: none;
127
+				outline: none;
34
 				background-color: var(--color-editor-background);
128
 				background-color: var(--color-editor-background);
35
 				color: var(--color-editor-text);
129
 				color: var(--color-editor-text);
36
 			}
130
 			}
37
-			.previewhalf {
38
-				position: absolute;
39
-				width: 50%;
40
-				height: 100%;
41
-				left: 50%;
42
-				top: 0;
43
-				overflow-y: auto;
44
-			}
45
-			#preview {
131
+			.preview-container {
46
 				padding: 1em;
132
 				padding: 1em;
47
 				margin: 0 auto;
133
 				margin: 0 auto;
48
 				max-width: 600px;
134
 				max-width: 600px;
135
+				background-color: var(--color-background);
136
+				color: var(--color-text);
49
 			}
137
 			}
50
-			.toolbar {
51
-				position: absolute;
52
-				z-index: 1;
53
-				background-color: var(--toolbar-background);
54
-				color: var(--toolbar-text);
55
-				min-height: 32px;
56
-				/* max-height: 300px; */
57
-				width: 100%;
58
-				border-bottom: 1px solid black;
59
-				box-sizing: border-box;
60
-				padding: 4px 20px;
61
-				font-family: sans-serif;
138
+
139
+			dialog#readers-dialog {
140
+				max-width: 400px;
141
+				max-height: 400px;
62
 			}
142
 			}
63
-			.codeswitch-cont {
64
-				position: absolute;
65
-				top: 0;
66
-				right: 0;
67
-				height: 31px;
68
-				z-index: 2;
69
-				background-color: var(--toolbar-background);
70
-				color: var(--toolbar-text);
71
-				padding: 3px 10px;
72
-				box-sizing: border-box;
143
+			.dialog-layout {
144
+				position: relative;
145
+				width: 100%; height: 100%;
146
+
147
+				display: grid;
148
+				grid-template-rows: 32px 368px; /* can't get overflow to work without explicit height :( */
149
+			}
150
+			.dialog-titlebar {
151
+				grid-row: 1;
152
+
153
+				display: grid;
154
+				grid-template-columns: 1fr auto;
73
 			}
155
 			}
74
-			#readercontainer {
156
+			.dialog-title {
157
+				grid-column: 1;
158
+				font-weight: bold;
159
+			}
160
+			.dialog-close {
161
+				grid-column: 2;
162
+				text-align: right;
163
+			}
164
+			.dialog-content {
165
+				grid-row: 2;
75
 				overflow-y: scroll;
166
 				overflow-y: scroll;
76
 			}
167
 			}
168
+			.reader-list {
169
+				position: relative;
170
+				width: 100%; height: 100%;
171
+			}
172
+
173
+
174
+			/* --- old ----------------------------------------- */
175
+
77
 			.reader-header {
176
 			.reader-header {
78
 				margin-top: 0.25em;
177
 				margin-top: 0.25em;
79
 				font-weight: bold;
178
 				font-weight: bold;
82
 				display: inline-block;
181
 				display: inline-block;
83
 				padding: 4px 8px;
182
 				padding: 4px 8px;
84
 				border: 1px dotted gray;
183
 				border: 1px dotted gray;
184
+				border-radius: 8px;
85
 				margin: 4px;
185
 				margin: 4px;
86
 			}
186
 			}
87
-			#markdowninput {
88
-				position: absolute;
89
-				box-sizing: border-box;
90
-				top: 32px;
91
-				width: 100%;
92
-				height: calc(100% - 32px);
93
-				margin: 0;
94
-				padding: 1em 2em;
95
-				border: 0;
96
-				background-color: var(--color-editor-background);
97
-				color: var(--color-editor-text);
98
-			}
99
 			.calculated {
187
 			.calculated {
100
 				background-color: var(--color-calculated-background);
188
 				background-color: var(--color-calculated-background);
101
 				font-style: italic;
189
 				font-style: italic;
112
 			:root {
200
 			:root {
113
 				--color-background: #fffff8;
201
 				--color-background: #fffff8;
114
 				--color-text: #111;
202
 				--color-text: #111;
203
+				--color-text-secondary: #666;
115
 				--color-table-header: #ddd;
204
 				--color-table-header: #ddd;
116
 				--color-table-border: black;
205
 				--color-table-border: black;
117
 				--color-calculated-background: #eee;
206
 				--color-calculated-background: #eee;
118
 				--color-highlight: #ff0;
207
 				--color-highlight: #ff0;
119
 				--color-highlight-text: #111;
208
 				--color-highlight-text: #111;
209
+				--color-rule: #111;
120
 			}
210
 			}
121
 			@media (prefers-color-scheme: dark) {
211
 			@media (prefers-color-scheme: dark) {
122
 				:root {
212
 				:root {
123
 					--color-background: #151515;
213
 					--color-background: #151515;
124
 					--color-text: #ddd;
214
 					--color-text: #ddd;
215
+					--color-text-secondary: #999;
125
 					--color-table-header: #333;
216
 					--color-table-header: #333;
126
 					--color-table-border: #ccc;
217
 					--color-table-border: #ccc;
127
 					--color-calculated-background: #444;
218
 					--color-calculated-background: #444;
128
 					--color-highlight: #88f;
219
 					--color-highlight: #88f;
129
 					--color-highlight-text: #ddd;
220
 					--color-highlight-text: #ddd;
221
+					--color-rule: #ddd;
130
 				}
222
 				}
131
 			}
223
 			}
224
+
132
 			html {
225
 			html {
133
 				font-size: 15px;
226
 				font-size: 15px;
134
 			}
227
 			}
135
 
228
 
136
 			body {
229
 			body {
137
-				/* width: 87.5%;
138
-				margin-left: auto;
139
-				margin-right: auto;
140
-				padding-left: 12.5%; */
141
 				font-family: et-book, Palatino, "Palatino Linotype", "Palatino LT STD", "Book Antiqua", Georgia, serif;
230
 				font-family: et-book, Palatino, "Palatino Linotype", "Palatino LT STD", "Book Antiqua", Georgia, serif;
142
 				background-color: var(--color-background);
231
 				background-color: var(--color-background);
143
 				color: var(--color-text);
232
 				color: var(--color-text);
144
-				/* max-width: 1400px; */
145
 				counter-reset: sidenote-counter;
233
 				counter-reset: sidenote-counter;
146
 			}
234
 			}
147
 
235
 
170
 			}
258
 			}
171
 			.subtext {
259
 			.subtext {
172
 				font-size: 1rem;
260
 				font-size: 1rem;
173
-				color: #888;
261
+				color: var(--color-text-secondary);
174
 				margin-top: 0.25em;
262
 				margin-top: 0.25em;
175
 				margin-bottom: 0.5em;
263
 				margin-bottom: 0.5em;
176
 			}
264
 			}
202
 				height: 1px;
290
 				height: 1px;
203
 				width: 55%;
291
 				width: 55%;
204
 				border: 0;
292
 				border: 0;
205
-				border-top: 1px solid #ccc;
293
+				border-top: 1px solid var(--color-rule);
206
 				margin: 1em 0;
294
 				margin: 1em 0;
207
 				padding: 0;
295
 				padding: 0;
208
 			}
296
 			}
268
 		<script src="js/markdown.js"></script>
356
 		<script src="js/markdown.js"></script>
269
 		<script src="js/spreadsheet.js"></script>
357
 		<script src="js/spreadsheet.js"></script>
270
 		<script>
358
 		<script>
271
-			var blockReaderClasses = {
359
+			const sampleMarkdown = `
360
+## Block Formats {#top}
361
+
362
+A regular paragraph.
363
+
364
+-# Sub text
365
+
366
+* Unordered
367
+* Lists
368
+    * Sub list
369
+
370
+1. Ordered
371
+2. Lists
372
+    6. Sub list
373
+
374
+A blockquote:
375
+
376
+> "The only thing we have to fear is fear itself—nameless, unreasoning,
377
+> unjustified terror which paralyzes needed efforts to convert retreat into
378
+> advance." - Franklin D. Roosevelt's First Inaugural Address
379
+
380
+Some definitions:
381
+
382
+word
383
+: a unit of meaning in a sentence
384
+sentence
385
+: a collection of words
386
+
387
+Code:
388
+
389
+\`\`\`javascript
390
+function foo() {
391
+    return 'Hello world';
392
+}
393
+\`\`\`
394
+
395
+    function bar() {
396
+        return 'Indented code';
397
+    }
398
+
399
+### Heading, hash style
400
+
401
+Heading, underline style
402
+---
403
+
404
+### Modified Heading {style=color:red;}
405
+
406
+| Unit Price | Qty | Subtotal |
407
+| ---: | ---: | ---: |
408
+| $1.23 | 2 | =A*B FILL |
409
+| $4.99 | 6 | |
410
+| Total | | =SUM(C:C) |
411
+
412
+---
413
+
414
+## Inline Formats
415
+
416
+Normal, **double asterisk,** __double underscore,__ *asterisks,* _underscores,_
417
+~~double tildes,~~ ~single tildes,~ ^carets,^ ==double equals==, \`\`double backticks\`\`,
418
+\`single backticks\`.
419
+
420
+Lorem ipsum dolor sit amet,[^1] consectetur adipiscing elit.[^abc] Sed sodales
421
+in odio eget porta. Proin et erat sit amet erat semper mollis vitae ut
422
+turpis.[^foo] Ut ipsum dui, maximus sit amet suscipit at, dictum id nulla.[^bar]
423
+Aenean efficitur rhoncus nulla non fermentum.
424
+
425
+[^1]: Donec ut felis volutpat, gravida ipsum scelerisque, accumsan est.
426
+[^abc]: Cras dictum rutrum quam.
427
+[^foo]: Donec maximus bibendum lorem.
428
+[^bar]: Praesent consectetur tristique leo. Morbi nec nisi sit amet quam
429
+ imperdiet vehicula eu feugiat tortor. 
430
+
431
+The HTML on the WWW is often full of JS and CSS.
432
+
433
+*[HTML]: Hypertext Markup Language
434
+*[WWW]: World Wide Web
435
+*[JS]: JavaScript
436
+*[CSS]: Cascading Style Sheets
437
+
438
+Click [here](#top) to return to the top. Referenced link to [Google][google].
439
+
440
+![alt text](https://picsum.photos/100/75) ![alt text](https://picsum.photos/101/75 "With a title")
441
+![][testimage]
442
+
443
+[testimage]: https://picsum.photos/102/75
444
+[google]: https://google.com  "I prefer Duck Duck Go"
445
+
446
+Some verbatim <span style="color:green;">HTML</span>. A script tag
447
+will be ignored. <scr` + `ipt></sc` + `ript>
448
+			`.trim();
449
+		</script>
450
+		<script>
451
+			const blockReaderClasses = {
272
 				'Heading (underline)': MDUnderlinedHeadingReader,
452
 				'Heading (underline)': MDUnderlinedHeadingReader,
273
 				'Heading (hash)': MDHashHeadingReader,
453
 				'Heading (hash)': MDHashHeadingReader,
274
 				'Subtext': MDSubtextReader,
454
 				'Subtext': MDSubtextReader,
283
 				'Paragraph': MDParagraphReader,
463
 				'Paragraph': MDParagraphReader,
284
 				'Spreadsheets': MDSpreadsheetReader,
464
 				'Spreadsheets': MDSpreadsheetReader,
285
 			};
465
 			};
286
-			var inlineReaderClasses = {
466
+			const inlineReaderClasses = {
287
 				'Emphasis': MDEmphasisReader,
467
 				'Emphasis': MDEmphasisReader,
288
 				'Strong': MDStrongReader,
468
 				'Strong': MDStrongReader,
289
 				'Strikethrough': MDStrikethroughReader,
469
 				'Strikethrough': MDStrikethroughReader,
304
 			};
484
 			};
305
 			var activeReaders = [];
485
 			var activeReaders = [];
306
 			var parser = null;
486
 			var parser = null;
487
+
488
+			function markdownEditorNode() { return document.getElementById('markdown-editor'); }
489
+			function previewNode() { return document.getElementById('preview-container'); }
490
+			function codeJSNode() { return document.getElementById('code-js'); }
491
+			function codePHPNode() { return document.getElementById('code-php'); }
492
+			function readersButtonNode() { return document.getElementById('readers-button'); }
493
+			function readersDialogNode() { return document.getElementById('readers-dialog'); }
494
+			function readerListNode() { return document.getElementById('reader-list'); }
495
+
307
 			function onDocumentLoad() {
496
 			function onDocumentLoad() {
497
+				if (markdownEditorNode().value === '') {
498
+					markdownEditorNode().value = sampleMarkdown;
499
+				}
308
 				activeReaders = [ ...Markdown.allReaders, new MDSpreadsheetReader() ];
500
 				activeReaders = [ ...Markdown.allReaders, new MDSpreadsheetReader() ];
309
 				parser = new Markdown(activeReaders);
501
 				parser = new Markdown(activeReaders);
310
-				document.getElementById('markdowninput').addEventListener('input', onMarkdownChange);
502
+				markdownEditorNode().addEventListener('input', handleMarkdownChange);
311
 				populateReaderCheckboxes();
503
 				populateReaderCheckboxes();
312
-				document.getElementById('sendbutton').addEventListener('click', () => {
313
-					handleSendClicked();
504
+				readersButtonNode().addEventListener('click', handleReadersButtonClicked);
505
+				codeJSNode().addEventListener('change', handleMarkdownChange);
506
+				codePHPNode().addEventListener('change', handleMarkdownChange);
507
+				readersDialogNode().getElementsByClassName("dialog-title")[0].innerHTML = "Readers";
508
+				readersDialogNode().getElementsByClassName("dialog-titlebar")[0].getElementsByTagName("button")[0].addEventListener('click', () => {
509
+					readersDialogNode().close();
314
 				});
510
 				});
315
-				document.getElementById('code-js').addEventListener('change', onMarkdownChange);
316
-				document.getElementById('code-php').addEventListener('change', onMarkdownChange);
317
-				setTimeout(onMarkdownChange, 0);
318
-			}
319
-			function onMarkdownChange() {
320
-				if (document.getElementById('code-php').checked) {
321
-					debouncedSendPreviewRequest();
322
-				} else if (document.getElementById('code-js').checked) {
323
-					updatePreviewLocally();
324
-				}
511
+				setTimeout(handleMarkdownChange, 0);
325
 			}
512
 			}
326
 			function updatePreviewLocally() {
513
 			function updatePreviewLocally() {
327
-				const textarea = document.getElementById('markdowninput');
328
-				let markdown = textarea.value;
514
+				let markdown = markdownEditorNode().value;
329
 				let html = parser.toHTML(markdown, 'foo-');
515
 				let html = parser.toHTML(markdown, 'foo-');
330
-				document.getElementById('preview').innerHTML = html;
516
+				previewNode().innerHTML = html;
331
 			}
517
 			}
332
 			var debounceTimer = null;
518
 			var debounceTimer = null;
333
 			var needsUpdate = false;
519
 			var needsUpdate = false;
348
 				}
534
 				}
349
 			}
535
 			}
350
 			function sendPreviewRequest() {
536
 			function sendPreviewRequest() {
351
-				const markdown = document.getElementById('markdowninput').value;
537
+				const markdown = markdownEditorNode().value;
352
 				const readers = activeReaders.map((r) => r.constructor.name);
538
 				const readers = activeReaders.map((r) => r.constructor.name);
353
 				const request = new XMLHttpRequest();
539
 				const request = new XMLHttpRequest();
354
 				var formData = encodeForm({
540
 				var formData = encodeForm({
359
 				request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
545
 				request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
360
 				request.onreadystatechange = () => {
546
 				request.onreadystatechange = () => {
361
 					if (request.readyState == 4 && request.status == 200) {
547
 					if (request.readyState == 4 && request.status == 200) {
362
-						document.getElementById('preview').innerHTML = request.responseText;
548
+						previewNode().innerHTML = request.responseText;
363
 					}
549
 					}
364
 				};
550
 				};
365
 				request.send(formData);
551
 				request.send(formData);
378
 				return pairs.join('&');
564
 				return pairs.join('&');
379
 			}
565
 			}
380
 			function populateReaderCheckboxes() {
566
 			function populateReaderCheckboxes() {
381
-				const container = document.getElementById('readercontainer');
567
+				const container = document.getElementById('reader-list');
382
 				var header = document.createElement('div');
568
 				var header = document.createElement('div');
383
 				header.classList.add('reader-header');
569
 				header.classList.add('reader-header');
384
 				header.append(document.createTextNode('Block Readers'));
570
 				header.append(document.createTextNode('Block Readers'));
410
 						break;
596
 						break;
411
 					}
597
 					}
412
 				}
598
 				}
599
+				const label = document.createElement('label');
600
+				label.classList.add('reader-check');
413
 				const check = document.createElement('input');
601
 				const check = document.createElement('input');
414
 				check.type = 'checkbox';
602
 				check.type = 'checkbox';
415
 				check.checked = isSelected;
603
 				check.checked = isSelected;
417
 					handleCheckChanged(readerClass, check);
605
 					handleCheckChanged(readerClass, check);
418
 				});
606
 				});
419
 				check.id = `reader-${readerClass.name}`;
607
 				check.id = `reader-${readerClass.name}`;
420
-				const label = document.createElement('label');
421
-				label.htmlFor = check.id;
608
+				label.append(check);
422
 				label.append(document.createTextNode(name));
609
 				label.append(document.createTextNode(name));
423
-				const div = document.createElement('div');
424
-				div.classList.add('reader-check');
425
-				div.append(check);
426
-				div.append(label);
427
-				return div;
610
+				return label;
611
+			}
612
+
613
+			function handleMarkdownChange() {
614
+				if (codePHPNode().checked) {
615
+					debouncedSendPreviewRequest();
616
+				} else if (codeJSNode().checked) {
617
+					updatePreviewLocally();
618
+				}
619
+			}
620
+			function handleReadersButtonClicked() {
621
+				const dlg = readersDialogNode();
622
+				if (dlg.open) {
623
+					dlg.close();
624
+				} else {
625
+					dlg.showModal();
626
+				}
428
 			}
627
 			}
429
 			function handleCheckChanged(readerClass, check) {
628
 			function handleCheckChanged(readerClass, check) {
430
 				if (check.checked) {
629
 				if (check.checked) {
433
 					activeReaders = activeReaders.filter((reader) => reader.constructor.name !== readerClass.name);
632
 					activeReaders = activeReaders.filter((reader) => reader.constructor.name !== readerClass.name);
434
 				}
633
 				}
435
 				parser = new Markdown(activeReaders);
634
 				parser = new Markdown(activeReaders);
436
-				onMarkdownChange();
437
-			}
438
-			function handleSendClicked() {
439
-				sendPreviewRequest();
635
+				handleMarkdownChange();
440
 			}
636
 			}
441
 			document.addEventListener('DOMContentLoaded', onDocumentLoad);
637
 			document.addEventListener('DOMContentLoaded', onDocumentLoad);
442
 		</script>
638
 		</script>
443
 	</head>
639
 	</head>
444
 
640
 
445
 	<body>
641
 	<body>
446
-		<div class="inputhalf half">
447
-			<div class="toolbar">
448
-				<details>
449
-					<summary>Readers</summary>
450
-
451
-					<div id="readercontainer"></div>
452
-				</details>
642
+		<div class="pane-container">
643
+			<div class="left-pane pane">
644
+				<div class="toolbar-pane">
645
+					<div class="toolbar-left">
646
+						<button id="readers-button">Readers</button>
647
+					</div>
648
+					<div class="toolbar-right">
649
+						<label>
650
+							<input type="radio" id="code-js" name="code" value="js" checked>
651
+							Javascript
652
+						</label>
653
+						<label>
654
+							<input type="radio" id="code-php" name="code" value="php">
655
+							PHP
656
+						</label>
657
+					</div>
658
+				</div>
659
+				<div class="editor-pane">
660
+					<textarea id="markdown-editor"></textarea>
661
+				</div>
453
 			</div>
662
 			</div>
454
-			<div class="codeswitch-cont">
455
-				<input type="radio" id="code-js" name="code" value="js" checked>
456
-				<label for="code-js">Javascript</label>
457
-				<input type="radio" id="code-php" name="code" value="php">
458
-				<label for="code-php">PHP</label>
663
+			<div class="right-pane pane">
664
+				<div class="preview-container" id="preview-container">
665
+					<h1>Preview Here</h1>
666
+					<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed turpis. Integer tincidunt eu nibh.</p>
667
+					<p>Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies velit. Nam eget dui et libero pharetra dapibus.</p>
668
+					<p>Vestibulum in vulputate velit. Cras egestas, urna quis dignissim convallis, arcu felis sagittis diam, non fermentum massa justo ac neque. In ornare do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
669
+					<p>Duis phasellus maecenas vestibulum mollis facilisis. Nulla sit amet erat. Suspendisse in justo eu odio suscipit rhoncus. Praesent id massa for ante varius ultrices. Cras sed leo at felis sagittis cursus. Integer turpis est, vulputate ut, elementum ac, condimentum eget, diam.</p>
670
+					<p>Aliquam nec enim. Nulla tempus sem et risus. Proin mi. Etiam sit amet orci eget eros faucibus tincidunt. Duis volutpat nunc vel velit. Suspendisse potenti. Integer sollicitudin dictum est. Donec ut dolor. Nam malesuada magna.</p>
671
+					<p>Sed non lectus. Vivamus consectetuer purus vitae massa. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies velit. Nam eget dui et libero pharetra dapibus</p>
672
+				</div>
459
 			</div>
673
 			</div>
460
-			<div id="sendbuttoncont"><button id="sendbutton">Send</button></div>
461
-			<textarea id="markdowninput">## Block Formats {#top}
462
-
463
-A regular paragraph.
464
-
465
--# Sub text
466
-
467
-* Unordered
468
-* Lists
469
-    * Sub list
470
-
471
-1. Ordered
472
-2. Lists
473
-    6. Sub list
474
-
475
-A blockquote:
476
-
477
-&gt; "The only thing we have to fear is fear itself—nameless, unreasoning,
478
-&gt; unjustified terror which paralyzes needed efforts to convert retreat into
479
-&gt; advance." - Franklin D. Roosevelt's First Inaugural Address
480
-
481
-Some definitions:
482
-
483
-word
484
-: a unit of meaning in a sentence
485
-sentence
486
-: a collection of words
487
-
488
-Code:
489
-
490
-```javascript
491
-function foo() {
492
-    return 'Hello world';
493
-}
494
-```
495
-
496
-    function bar() {
497
-        return 'Indented code';
498
-    }
499
-
500
-### Heading, hash style
501
-
502
-Heading, underline style
503
----
504
-
505
-### Modified Heading {style=color:red;}
506
-
507
-| Unit Price | Qty | Subtotal |
508
-| ---: | ---: | ---: |
509
-| $1.23 | 2 | =A*B FILL |
510
-| $4.99 | 6 | |
511
-| Total | | =SUM(C:C) |
512
-
513
----
514
-
515
-## Inline Formats
516
-
517
-Normal, **double asterisk,** __double underscore,__ *asterisks,* _underscores,_
518
-~~double tildes,~~ ~single tildes,~ ^carets,^ ==double equals==, ``double backticks``,
519
-`single backticks`.
520
-
521
-Lorem ipsum dolor sit amet,[^1] consectetur adipiscing elit.[^abc] Sed sodales
522
-in odio eget porta. Proin et erat sit amet erat semper mollis vitae ut
523
-turpis.[^foo] Ut ipsum dui, maximus sit amet suscipit at, dictum id nulla.[^bar]
524
-Aenean efficitur rhoncus nulla non fermentum.
525
-
526
-[^1]: Donec ut felis volutpat, gravida ipsum scelerisque, accumsan est.
527
-[^abc]: Cras dictum rutrum quam.
528
-[^foo]: Donec maximus bibendum lorem.
529
-[^bar]: Praesent consectetur tristique leo. Morbi nec nisi sit amet quam
530
- imperdiet vehicula eu feugiat tortor. 
531
-
532
-The HTML on the WWW is often full of JS and CSS.
533
-
534
-*[HTML]: Hypertext Markup Language
535
-*[WWW]: World Wide Web
536
-*[JS]: JavaScript
537
-*[CSS]: Cascading Style Sheets
538
-
539
-Click [here](#top) to return to the top. Referenced link to [Google][google].
540
-
541
-![alt text](https://picsum.photos/100/75) ![alt text](https://picsum.photos/101/75 "With a title")
542
-![][testimage]
543
-
544
-[testimage]: https://picsum.photos/102/75
545
-[google]: https://google.com  "I prefer Duck Duck Go"
546
-
547
-Some verbatim &lt;span style="color:green;"&gt;HTML&lt;/span&gt;. A script tag
548
-will be ignored. &lt;script&gt;&lt;/script&gt;</textarea>
549
 		</div>
674
 		</div>
550
-		<div class="previewhalf half">
551
-			<div id="preview">
552
-				<p>Preview here</p>
675
+		<dialog id="readers-dialog">
676
+			<div class="dialog-layout">
677
+				<div class="dialog-titlebar">
678
+					<div class="dialog-title"></div>
679
+					<div class="dialog-close"><button>✕</button></div>
680
+				</div>
681
+				<div class="dialog-content">
682
+					<div class="reader-list" id="reader-list"></div>
683
+				</div>
553
 			</div>
684
 			</div>
554
-		</div>
685
+		</dialog>
555
 	</body>
686
 	</body>
556
 </html>
687
 </html>

Laddar…
Avbryt
Spara