diff --git a/_sass/minima/custom-styles.scss b/_sass/minima/custom-styles.scss index 3bf337a..79b3040 100644 --- a/_sass/minima/custom-styles.scss +++ b/_sass/minima/custom-styles.scss @@ -1,34 +1,43 @@ $default-spacing: 8px; -$lm-button-background-color: #f0f0f0; -$lm-button-hover-background-color: #e1e1e1; +$lm-disabled-text-color: hsl(0 0% 37%); +$dm-disabled-text-color: hsl(0 0% 53%); -$dm-button-background-color: #333333; -$dm-button-hover-background-color: #444444; +$lm-inactive-toggle-text-color: hsl(0 0% 27%); +$dm-inactive-toggle-text-color: hsl(0 0% 53%); +$lm-button-background-color: hsl(0 0% 94%); +$lm-button-hover-background-color: hsl(0 0% 88%); + +$dm-button-background-color: hsl(0 0% 20%); +$dm-button-hover-background-color: hsl(0 0% 27%); + +$disabled-text-color: $lm-disabled-text-color; +$inactive-toggle-text-color: $lm-inactive-toggle-text-color; $button-background-color: $lm-button-background-color; $button-hover-background-color: $lm-button-hover-background-color; -@if $color-scheme-auto { - :root { - --io-button-background-color: #{$lm-button-background-color}; - --io-button-hover-background-color: #{$lm-button-hover-background-color}; - } +:root { + --io-disabled-text-color: #{$lm-disabled-text-color}; + --io-inactive-toggle-text-color: #{$lm-inactive-toggle-text-color}; + --io-button-background-color: #{$lm-button-background-color}; + --io-button-hover-background-color: #{$lm-button-hover-background-color}; +} - @media (prefers-color-scheme: dark) { - :root { - --io-button-background-color: #{$dm-button-background-color}; - --io-button-hover-background-color: #{$dm-button-hover-background-color}; - } +@media (prefers-color-scheme: dark) { + :root { + --io-disabled-text-color: #{$dm-disabled-text-color}; + --io-inactive-toggle-text-color: #{$dm-inactive-toggle-text-color}; + --io-button-background-color: #{$dm-button-background-color}; + --io-button-hover-background-color: #{$dm-button-hover-background-color}; } - - $button-background-color: var(--io-button-background-color); - $button-hover-background-color: var(--io-button-hover-background-color); -} @else if $color-scheme-dark { - $button-background-color: $dm-button-background-color; - $button-hover-background-color: $dm-button-hover-background-color; } +$disabled-text-color: var(--io-disabled-text-color); +$inactive-toggle-text-color: var(--io-inactive-toggle-text-color); +$button-background-color: var(--io-button-background-color); +$button-hover-background-color: var(--io-button-hover-background-color); + html { height: 100%; } @@ -57,7 +66,7 @@ body { button { @include relative-font-size(1); - color: $text-color; + color: $inactive-toggle-text-color; background: $button-background-color; border-style: solid; border-width: 1px; @@ -69,6 +78,13 @@ body { &:hover { background: $button-hover-background-color; } + + &.active { + color: $text-color; + border-style: solid; + border-width: 1px; + border-color: $text-color; + } } #toggle-full-width { @@ -96,6 +112,14 @@ body { textarea { color: $text-color; @include relative-font-size(1); + + &:read-only { + color: $disabled-text-color; + + &:focus { + outline: none; + } + } } #markdown-preview { diff --git a/index.html b/index.html index 58d6918..69d066d 100644 --- a/index.html +++ b/index.html @@ -12,6 +12,9 @@ {%- assign markdown_preview_id = 'markdown-preview' -%} {%- capture toggle_markdown_preview_id -%}toggle-{{ markdown_preview_id }}{%- endcapture -%} +{%- assign read_only_id = 'read-only' -%} +{%- capture toggle_read_only_id -%}toggle-{{ read_only_id }}{%- endcapture -%} + {%- assign textarea_id = 'textarea' -%} {%- capture textarea_placeholder -%} {{ site.tagline }}. @@ -35,6 +38,7 @@
+
@@ -53,23 +57,27 @@ function run() { const toggleFullWidth = document.getElementById('{{ toggle_full_width_id }}'); - loadFullWidthStyle(); + loadFullWidthStyle(toggleFullWidth); addFullWidthToggleClickListener(toggleFullWidth); const toggleMarkdownPreview = document.getElementById('{{ toggle_markdown_preview_id }}'); const textarea = document.getElementById('{{ textarea_id }}'); const markdownPreview = document.getElementById('{{ markdown_preview_id }}'); - loadMarkdownPreviewVisibility(markdownPreview); + loadMarkdownPreviewVisibility(toggleMarkdownPreview, markdownPreview); addMarkdownPreviewToggleClickListener(toggleMarkdownPreview); loadValue(textarea, markdownPreview); addTextareaValueChangeListener(textarea); addTextareaFocusChangeListener(textarea); addURLHashListener(textarea, markdownPreview); + + const toggleReadOnly = document.getElementById('{{ toggle_read_only_id }}'); + loadReadOnlyStyle(toggleReadOnly, textarea); + addReadOnlyToggleClickListener(toggleReadOnly); } - function loadFullWidthStyle() { + function loadFullWidthStyle(toggleFullWidth) { const wrappers = document.getElementsByClassName('wrapper'); Array.from(wrappers).forEach((wrapper) => { if (isFullWidthEnabled()) { @@ -78,48 +86,64 @@ wrapper.style.maxWidth = null; } }); + if (isFullWidthEnabled()) { + toggleFullWidth.classList.add('active'); + } } function addFullWidthToggleClickListener(toggleFullWidth) { toggleFullWidth.addEventListener('click', () => { - const searchParams = new URLSearchParams(window.location.search); - if (isFullWidthEnabled()) { - searchParams.delete('{{ full_width_id }}'); - } else { - searchParams.set('{{ full_width_id }}', 'true'); - } - document.location.search = searchParams.toString(); + toggleSearchParam('{{ full_width_id }}'); }, false); } function isFullWidthEnabled() { - const searchParams = new URLSearchParams(window.location.search); - return searchParams.has('{{ full_width_id }}'); + return isSearchParamEnabled('{{ full_width_id }}'); } function addMarkdownPreviewToggleClickListener(toggleMarkdownPreview) { toggleMarkdownPreview.addEventListener('click', () => { - const searchParams = new URLSearchParams(window.location.search); - if (isMarkdownPreviewEnabled()) { - searchParams.delete('{{ markdown_preview_id }}'); - } else { - searchParams.set('{{ markdown_preview_id }}', 'true'); - } - document.location.search = searchParams.toString(); + toggleSearchParam('{{ markdown_preview_id }}'); }, false); } - function loadMarkdownPreviewVisibility(markdownPreview) { + function loadMarkdownPreviewVisibility(toggleMarkdownPreview, markdownPreview) { if (isMarkdownPreviewEnabled()) { - markdownPreview.style.display = 'block'; + markdownPreview.style.display = null; + + toggleMarkdownPreview.classList.add('active'); } else { markdownPreview.style.display = 'none'; } } function isMarkdownPreviewEnabled() { - const searchParams = new URLSearchParams(window.location.search); - return searchParams.has('{{ markdown_preview_id }}'); + return isSearchParamEnabled('{{ markdown_preview_id }}'); + } + + function loadReadOnlyStyle(toggleReadOnly, textarea) { + if (isReadOnlyEnabled()) { + if (isMarkdownPreviewEnabled()) { + textarea.style.display = 'none'; + } else { + textarea.readOnly = true; + } + + toggleReadOnly.classList.add('active'); + } else { + textarea.style.display = null; + textarea.readOnly = false; + } + } + + function addReadOnlyToggleClickListener(toggleReadOnly) { + toggleReadOnly.addEventListener('click', () => { + toggleSearchParam('{{ read_only_id }}'); + }, false); + } + + function isReadOnlyEnabled() { + return isSearchParamEnabled('{{ read_only_id }}'); } function loadValue(textarea, markdownPreview) { @@ -222,6 +246,21 @@ markdownPreview.innerHTML = html; } + function toggleSearchParam(param) { + const searchParams = new URLSearchParams(window.location.search); + if (isSearchParamEnabled(param)) { + searchParams.delete(param); + } else { + searchParams.set(param, 'true'); + } + document.location.search = searchParams.toString(); + } + + function isSearchParamEnabled(param) { + const searchParams = new URLSearchParams(window.location.search); + return searchParams.has(param); + } + function truncate(string, limit) { if (string.length < limit) { return string; } return string.slice(0, limit - 1) + "…";