From 4309453f5183d9ce70a52be9df153ee7d6c473a0 Mon Sep 17 00:00:00 2001 From: Daniel Nitsikopoulos Date: Mon, 15 May 2023 19:42:56 +1000 Subject: [PATCH] Version assets --- Gemfile.lock | 6 +- app/templates/layouts/app.html.slim | 4 +- lib/adamantium/context.rb | 12 + public/assets/asset-manifest.json | 1 + public/assets/dist/gallery-SO2jW2qeQ-oB.js | 103 + public/assets/dist/index-SO2jW2qeQ-oB.css | 2225 ++++++++++++++++++ public/assets/dist/index-SO2jW2qeQ-oB.js | 31 + public/assets/index.css | 13 +- slices/admin/templates/layouts/app.html.slim | 4 +- version_assets.rb | 27 + 10 files changed, 2418 insertions(+), 8 deletions(-) create mode 100644 public/assets/asset-manifest.json create mode 100644 public/assets/dist/gallery-SO2jW2qeQ-oB.js create mode 100644 public/assets/dist/index-SO2jW2qeQ-oB.css create mode 100644 public/assets/dist/index-SO2jW2qeQ-oB.js create mode 100644 version_assets.rb diff --git a/Gemfile.lock b/Gemfile.lock index 711a614..9378f88 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -288,9 +288,9 @@ GEM net-ssh (7.1.0) netrc (0.11.0) nio4r (2.5.9) - nokogiri (1.14.3-x86_64-darwin) + nokogiri (1.14.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.14.3-x86_64-linux) + nokogiri (1.14.4-x86_64-linux) racc (~> 1.4) notiffany (0.1.3) nenv (~> 0.1) @@ -422,7 +422,7 @@ GEM standardrb (1.0.1) standard temple (0.10.0) - thor (1.2.1) + thor (1.2.2) tilt (2.1.0) time_math2 (0.1.1) timecop (0.9.6) diff --git a/app/templates/layouts/app.html.slim b/app/templates/layouts/app.html.slim index 01826bb..9908bbc 100644 --- a/app/templates/layouts/app.html.slim +++ b/app/templates/layouts/app.html.slim @@ -21,12 +21,12 @@ html link rel="me" href=Hanami.app.settings.mastodon_url link rel="me" href=Hanami.app.settings.github_url - link rel="stylesheet" href="/assets/index.css" + link rel="stylesheet" href=asset_from_manifest("index.css") link rel="icon" type="image/x-icon" href="/assets/favicon.ico" script data-domain="dnitza.com" src="https://stats.dnitza.com/js/script.js" defer="true" script src="/assets/gallery.js" - script src="/assets/index.js" + script src=asset_from_manifest("index.js") script src="https://unpkg.com/htmx.org@1.8.4" integrity="sha384-wg5Y/JwF7VxGk4zLsJEcAojRtlVp1FKKdGy1qN+OMtdq72WRvX/EdRdqg/LOhYeV" crossorigin="anonymous" script src="https://cdn.jsdelivr.net/npm/alpinejs@3.12.0/dist/cdn.min.js" defer="true" diff --git a/lib/adamantium/context.rb b/lib/adamantium/context.rb index 82f8082..ba00433 100644 --- a/lib/adamantium/context.rb +++ b/lib/adamantium/context.rb @@ -5,10 +5,22 @@ module Adamantium super(**options) end + def asset_from_manifest(filename) + return "/assets/#{filename}" if Hanami.env != :production + hashed_filename = asset_manifest[filename] + "/assets/dist/#{hashed_filename}" + end + def link_active? path # TODO: waiting for Hanami View to be released # to access current_path false end + + private + + def asset_manifest + @asset_manifest ||= JSON.parse(File.read("public/assets/asset-manifest.json")) + end end end diff --git a/public/assets/asset-manifest.json b/public/assets/asset-manifest.json new file mode 100644 index 0000000..f4740b8 --- /dev/null +++ b/public/assets/asset-manifest.json @@ -0,0 +1 @@ +{"gallery.js":"gallery-SO2jW2qeQ-oB.js","index.js":"index-SO2jW2qeQ-oB.js","index.css":"index-SO2jW2qeQ-oB.css"} \ No newline at end of file diff --git a/public/assets/dist/gallery-SO2jW2qeQ-oB.js b/public/assets/dist/gallery-SO2jW2qeQ-oB.js new file mode 100644 index 0000000..8ff6fc3 --- /dev/null +++ b/public/assets/dist/gallery-SO2jW2qeQ-oB.js @@ -0,0 +1,103 @@ +/* +Markdown Gallery +-- v1.0 2016 +-- Created by Lee Penney +-- Released under GPLv3 +*/ + +function md_gallery(config) { + var config = config || {}, + list_type = config.list_type || 'ul', + class_name = config.class_name || 'gallery', + tag_type = config.tag_type || 'div'; + + function find_lists(list_type) { + var lists = document.getElementsByTagName(list_type), matching_lists = []; + for (var i = 0; i < lists.length; i++) { + var list_elements = lists[i].children; + var total_matches = 0; + for (var c = 0; c < list_elements.length; c++) { + if (!list_elements[c].textContent.length && (list_elements[c].firstChild.tagName == 'A' || list_elements[c].firstChild.tagName == 'IMG') && (!list_elements[c].firstChild.firstChild || (list_elements[c].firstChild.firstChild && list_elements[c].firstChild.firstChild.tagName == 'IMG') )) { + total_matches++; + } + } + if (total_matches == list_elements.length) { + matching_lists[matching_lists.length] = lists[i]; + } + } + return matching_lists; + } + + function prepend_tag(img_lists, list_tag, prepend_tag, class_name) { + for (var i = 0; i < img_lists.length; i++) { + // add_figure_tags(img_lists[i]); + add_anchor(img_lists[i]); + wrap_tag(img_lists[i], prepend_tag, class_name, null, true); + strip_tag(img_lists[i], 'li'); + strip_tag(img_lists[i].parentNode, list_tag); + } + } + + function append_caption(el) { + if ((el.tagName == 'A' && el.firstChild.tagName == 'IMG' && el.firstChild.hasAttribute('alt') && el.firstChild.getAttribute('alt').length > 0) || (el.tagName == 'IMG' && el.hasAttribute('alt') && el.getAttribute('alt').length > 0)) { + var caption = document.createElement('figcaption'); + try { + caption.textContent = el.firstChild.getAttribute('alt') + el.appendChild(caption); + } catch (e) { + caption.textContent = el.getAttribute('alt'); + el.parentNode.appendChild(caption); + } + } + } + + function strip_tag(el, tag_type) { + var start_tag_regex = new RegExp('<'+tag_type+'>', 'gi'); + var end_tag_regex = new RegExp('<\/'+tag_type+'>', 'gi'); + el.innerHTML = el.innerHTML.replace(start_tag_regex,'').replace(end_tag_regex,''); + } + + function add_figure_tags(img_list) { + var list_elements = img_list.children; + for (var i = 0; i < list_elements.length; i++) { + append_caption(list_elements[i].firstChild); + wrap_tag(list_elements[i], 'figure'); + } + } + + function add_anchor(img_list) { + var list_elements = img_list.children; + for (var i = 0; i < list_elements.length; i++) { + let img = list_elements[i].getElementsByTagName('img')[0]; + let src = img.getAttribute("src"); + let alt = img.getAttribute("alt"); + wrap_tag(list_elements[i], + 'a', + 'hover:cursor-pointer', + "$dispatch('img-modal', { imgModalSrc: '" + src + "', imgModalDesc: '" + alt + "' })", + false + ); + } + } + + function wrap_tag(el, tag_type, class_name, click, root) { + var wrap = document.createElement(tag_type); + if (root) { + wrap.setAttribute('x-data', "{}"); + } + if (class_name) { + wrap.setAttribute('class', class_name); + } + if (click) { + wrap.setAttribute('x-on:click.prevent', click); + wrap.setAttribute('href', '#'); + } + el.parentNode.replaceChild(wrap, el); + wrap.appendChild(el); + } + + var found_img_lists = find_lists(list_type); + if (found_img_lists.length) { + prepend_tag(found_img_lists, list_type, tag_type, class_name); + } +} \ No newline at end of file diff --git a/public/assets/dist/index-SO2jW2qeQ-oB.css b/public/assets/dist/index-SO2jW2qeQ-oB.css new file mode 100644 index 0000000..a3c3425 --- /dev/null +++ b/public/assets/dist/index-SO2jW2qeQ-oB.css @@ -0,0 +1,2225 @@ +/* +! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.prose { + color: var(--tw-prose-body); + max-width: 65ch; +} + +.prose :where(p):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where([class~="lead"]):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; +} + +.prose :where(a):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-links); + text-decoration: underline; + font-weight: 500; +} + +.prose :where(strong):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-bold); + font-weight: 600; +} + +.prose :where(a strong):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote strong):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th strong):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(ol):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-left: 1.625em; +} + +.prose :where(ol[type="A"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="A" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="I"]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i"]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="I" s]):not(:where([class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i" s]):not(:where([class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="1"]):not(:where([class~="not-prose"] *)) { + list-style-type: decimal; +} + +.prose :where(ul):not(:where([class~="not-prose"] *)) { + list-style-type: disc; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-left: 1.625em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); +} + +.prose :where(hr):not(:where([class~="not-prose"] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; +} + +.prose :where(blockquote):not(:where([class~="not-prose"] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-left-width: 0.25rem; + border-left-color: var(--tw-prose-quote-borders); + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-left: 1em; +} + +.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"] *))::before { + content: open-quote; +} + +.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"] *))::after { + content: close-quote; +} + +.prose :where(h1):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.prose :where(h1 strong):not(:where([class~="not-prose"] *)) { + font-weight: 900; + color: inherit; +} + +.prose :where(h2):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.prose :where(h2 strong):not(:where([class~="not-prose"] *)) { + font-weight: 800; + color: inherit; +} + +.prose :where(h3):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; +} + +.prose :where(h3 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(h4):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.prose :where(h4 strong):not(:where([class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(img):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure > *):not(:where([class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(figcaption):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; +} + +.prose :where(code):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::before { + content: "`"; +} + +.prose :where(code):not(:where([class~="not-prose"] *))::after { + content: "`"; +} + +.prose :where(a code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h1 code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h2 code):not(:where([class~="not-prose"] *)) { + color: inherit; + font-size: 0.875em; +} + +.prose :where(h3 code):not(:where([class~="not-prose"] *)) { + color: inherit; + font-size: 0.9em; +} + +.prose :where(h4 code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th code):not(:where([class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(pre):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-right: 1.1428571em; + padding-bottom: 0.8571429em; + padding-left: 1.1428571em; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::before { + content: none; +} + +.prose :where(pre code):not(:where([class~="not-prose"] *))::after { + content: none; +} + +.prose :where(table):not(:where([class~="not-prose"] *)) { + width: 100%; + table-layout: auto; + text-align: left; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; +} + +.prose :where(thead):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); +} + +.prose :where(thead th):not(:where([class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose :where(tbody tr):not(:where([class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); +} + +.prose :where(tbody tr:last-child):not(:where([class~="not-prose"] *)) { + border-bottom-width: 0; +} + +.prose :where(tbody td):not(:where([class~="not-prose"] *)) { + vertical-align: baseline; +} + +.prose :where(tfoot):not(:where([class~="not-prose"] *)) { + border-top-width: 1px; + border-top-color: var(--tw-prose-th-borders); +} + +.prose :where(tfoot td):not(:where([class~="not-prose"] *)) { + vertical-align: top; +} + +.prose { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; +} + +.prose :where(video):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(figure):not(:where([class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(li):not(:where([class~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; +} + +.prose :where(ul > li):not(:where([class~="not-prose"] *)) { + padding-left: 0.375em; +} + +.prose :where(.prose > ul > li p):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(.prose > ul > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ul > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(.prose > ol > li > *:first-child):not(:where([class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ol > li > *:last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(hr + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h2 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h3 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h4 + *):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(thead th:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(thead th:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose :where(tbody td, tfoot td):not(:where([class~="not-prose"] *)) { + padding-top: 0.5714286em; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; +} + +.prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"] *)) { + padding-left: 0; +} + +.prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"] *)) { + padding-right: 0; +} + +.prose :where(.prose > :first-child):not(:where([class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(.prose > :last-child):not(:where([class~="not-prose"] *)) { + margin-bottom: 0; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-0 { + inset: 0px; +} + +.-top-4 { + top: -1rem; +} + +.z-50 { + z-index: 50; +} + +.col-span-1 { + grid-column: span 1 / span 1; +} + +.col-span-4 { + grid-column: span 4 / span 4; +} + +.col-span-5 { + grid-column: span 5 / span 5; +} + +.col-span-7 { + grid-column: span 7 / span 7; +} + +.float-right { + float: right; +} + +.float-left { + float: left; +} + +.m-0 { + margin: 0px; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-auto { + margin-top: auto; + margin-bottom: auto; +} + +.mb-0 { + margin-bottom: 0px; +} + +.mb-12 { + margin-bottom: 3rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.mb-\[20\] { + margin-bottom: 20; +} + +.ml-\[5\] { + margin-left: 5; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mr-1\.5 { + margin-right: 0.375rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.mt-0 { + margin-top: 0px; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.h-16 { + height: 4rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-44 { + height: 11rem; +} + +.h-48 { + height: 12rem; +} + +.max-h-12 { + max-height: 3rem; +} + +.max-h-full { + max-height: 100%; +} + +.w-1 { + width: 0.25rem; +} + +.w-16 { + width: 4rem; +} + +.w-2 { + width: 0.5rem; +} + +.w-24 { + width: 6rem; +} + +.w-36 { + width: 9rem; +} + +.w-4 { + width: 1rem; +} + +.w-44 { + width: 11rem; +} + +.w-48 { + width: 12rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-full { + width: 100%; +} + +.max-w-3xl { + max-width: 48rem; +} + +.max-w-prose { + max-width: 65ch; +} + +.max-w-screen-md { + max-width: 768px; +} + +.max-w-xs { + max-width: 20rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-none { + flex: none; +} + +.grow { + flex-grow: 1; +} + +.basis-1\/5 { + flex-basis: 20%; +} + +.basis-2\/5 { + flex-basis: 40%; +} + +.table-auto { + table-layout: auto; +} + +.-rotate-45 { + --tw-rotate: -45deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.grid-flow-row { + grid-auto-flow: row; +} + +.grid-flow-col { + grid-auto-flow: column; +} + +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.grid-rows-1 { + grid-template-rows: repeat(1, minmax(0, 1fr)); +} + +.flex-col { + flex-direction: column; +} + +.content-center { + align-content: center; +} + +.items-center { + align-items: center; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-4 { + gap: 1rem; +} + +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.break-normal { + overflow-wrap: normal; + word-break: normal; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-b-2 { + border-bottom-width: 2px; +} + +.border-l-2 { + border-left-width: 2px; +} + +.border-t-4 { + border-top-width: 4px; +} + +.border-solid { + border-style: solid; +} + +.border-blue-400 { + --tw-border-opacity: 1; + border-color: rgb(96 165 250 / var(--tw-border-opacity)); +} + +.border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity)); +} + +.border-lime-200 { + --tw-border-opacity: 1; + border-color: rgb(217 249 157 / var(--tw-border-opacity)); +} + +.border-orange-200 { + --tw-border-opacity: 1; + border-color: rgb(254 215 170 / var(--tw-border-opacity)); +} + +.border-transparent { + border-color: transparent; +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + +.bg-blue-400 { + --tw-bg-opacity: 1; + background-color: rgb(96 165 250 / var(--tw-bg-opacity)); +} + +.bg-blue-50 { + --tw-bg-opacity: 1; + background-color: rgb(239 246 255 / var(--tw-bg-opacity)); +} + +.bg-fuchsia-100 { + --tw-bg-opacity: 1; + background-color: rgb(250 232 255 / var(--tw-bg-opacity)); +} + +.bg-fuchsia-50 { + --tw-bg-opacity: 1; + background-color: rgb(253 244 255 / var(--tw-bg-opacity)); +} + +.bg-lime-300 { + --tw-bg-opacity: 1; + background-color: rgb(190 242 100 / var(--tw-bg-opacity)); +} + +.bg-orange-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 237 213 / var(--tw-bg-opacity)); +} + +.bg-pink-100 { + --tw-bg-opacity: 1; + background-color: rgb(252 231 243 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-yellow-100\/60 { + background-color: rgb(254 249 195 / 0.6); +} + +.bg-fuchsia-400 { + --tw-bg-opacity: 1; + background-color: rgb(232 121 249 / var(--tw-bg-opacity)); +} + +.bg-opacity-75 { + --tw-bg-opacity: 0.75; +} + +.fill-blue-100 { + fill: #dbeafe; +} + +.fill-current { + fill: currentColor; +} + +.fill-pink-100 { + fill: #fce7f3; +} + +.fill-purple-100 { + fill: #f3e8ff; +} + +.object-contain { + -o-object-fit: contain; + object-fit: contain; +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-1 { + padding: 0.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.pb-10 { + padding-bottom: 2.5rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pb-8 { + padding-bottom: 2rem; +} + +.pl-6 { + padding-left: 1.5rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-4xl { + font-size: 2.441rem; +} + +.text-\[2\.041rem\] { + font-size: 2.041rem; +} + +.text-base { + font-size: 1rem; +} + +.text-sm { + font-size: 0.8rem; +} + +.text-xl { + font-size: 1.25rem; +} + +.text-xsm { + font-size: 0.75rem; +} + +.font-bold { + font-weight: 700; +} + +.font-extrabold { + font-weight: 800; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.leading-10 { + line-height: 2.5rem; +} + +.leading-6 { + line-height: 1.5rem; +} + +.leading-relaxed { + line-height: 1.625; +} + +.text-blue-400 { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.text-gray-200 { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.text-lime-900 { + --tw-text-opacity: 1; + color: rgb(54 83 20 / var(--tw-text-opacity)); +} + +.text-red-600 { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.underline { + text-decoration-line: underline; +} + +.no-underline { + text-decoration-line: none; +} + +.decoration-wavy { + text-decoration-style: wavy; +} + +.shadow-solid { + --tw-shadow: 10px 10px 1px 2px; + --tw-shadow-colored: 10px 10px 1px 2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-pink-100 { + --tw-shadow-color: #fce7f3; + --tw-shadow: var(--tw-shadow-colored); +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +@tailwind typography; + +@font-face { + font-family: "Rubik"; + + src: url("/app/assets/Rubik-VariableFont_wght.ttf") format("truetype"); + + font-display: swap; +} + +@font-face { + font-family: "JetBrainsMono"; + + src: url("/app/assets/JetBrainsMono-VariableFont_wght.ttf") format("truetype"); + + font-display: swap; +} + +@font-face { + font-family: "Karla"; + + src: url("/app/assets/Karla-VariableFont_wght.ttf") format("truetype"); + + font-display: swap; +} + +* { + font-family: "Karla", Helvetica, Arial, sans-serif; +} + +h1, h2, h3, h4, h5, h6, h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + font-family: "Rubik", Helvetica, Arial, sans-serif; +} + +.prose h1 a { + border-bottom: none; + text-decoration: none; +} + +.prose h1 a:hover { + opacity: 0.8; +} + +.gist tr { + border-bottom: none; +} + +.gist span { + font-family: "JetBrainsMono", Monaco, monospace; +} + +@media (prefers-color-scheme: dark) { + .dark\:prose-invert { + --tw-prose-body: var(--tw-prose-invert-body); + --tw-prose-headings: var(--tw-prose-invert-headings); + --tw-prose-lead: var(--tw-prose-invert-lead); + --tw-prose-links: var(--tw-prose-invert-links); + --tw-prose-bold: var(--tw-prose-invert-bold); + --tw-prose-counters: var(--tw-prose-invert-counters); + --tw-prose-bullets: var(--tw-prose-invert-bullets); + --tw-prose-hr: var(--tw-prose-invert-hr); + --tw-prose-quotes: var(--tw-prose-invert-quotes); + --tw-prose-quote-borders: var(--tw-prose-invert-quote-borders); + --tw-prose-captions: var(--tw-prose-invert-captions); + --tw-prose-code: var(--tw-prose-invert-code); + --tw-prose-pre-code: var(--tw-prose-invert-pre-code); + --tw-prose-pre-bg: var(--tw-prose-invert-pre-bg); + --tw-prose-th-borders: var(--tw-prose-invert-th-borders); + --tw-prose-td-borders: var(--tw-prose-invert-td-borders); + } +} + +.selection\:bg-blue-100 *::-moz-selection { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + +.selection\:bg-blue-100 *::selection { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + +.selection\:text-blue-900 *::-moz-selection { + --tw-text-opacity: 1; + color: rgb(30 58 138 / var(--tw-text-opacity)); +} + +.selection\:text-blue-900 *::selection { + --tw-text-opacity: 1; + color: rgb(30 58 138 / var(--tw-text-opacity)); +} + +.selection\:bg-blue-100::-moz-selection { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + +.selection\:bg-blue-100::selection { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + +.selection\:text-blue-900::-moz-selection { + --tw-text-opacity: 1; + color: rgb(30 58 138 / var(--tw-text-opacity)); +} + +.selection\:text-blue-900::selection { + --tw-text-opacity: 1; + color: rgb(30 58 138 / var(--tw-text-opacity)); +} + +.hover\:border-b-2:hover { + border-bottom-width: 2px; +} + +.hover\:border-blue-600:hover { + --tw-border-opacity: 1; + border-color: rgb(37 99 235 / var(--tw-border-opacity)); +} + +.hover\:border-blue-800:hover { + --tw-border-opacity: 1; + border-color: rgb(30 64 175 / var(--tw-border-opacity)); +} + +.hover\:bg-blue-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(30 64 175 / var(--tw-bg-opacity)); +} + +.hover\:bg-fuchsia-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(245 208 254 / var(--tw-bg-opacity)); +} + +.hover\:bg-lime-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(217 249 157 / var(--tw-bg-opacity)); +} + +.hover\:bg-orange-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 237 213 / var(--tw-bg-opacity)); +} + +.hover\:bg-pink-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(251 207 232 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity)); +} + +.hover\:bg-yellow-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 240 138 / var(--tw-bg-opacity)); +} + +.hover\:fill-blue-400:hover { + fill: #60a5fa; +} + +.hover\:fill-pink-400:hover { + fill: #f472b6; +} + +.hover\:fill-purple-400:hover { + fill: #c084fc; +} + +.hover\:text-blue-100:hover { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity)); +} + +.hover\:text-blue-400:hover { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity)); +} + +.hover\:text-blue-600:hover { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.hover\:text-gray-400:hover { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.hover\:text-orange-400:hover { + --tw-text-opacity: 1; + color: rgb(251 146 60 / var(--tw-text-opacity)); +} + +.hover\:text-red-400:hover { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.hover\:opacity-80:hover { + opacity: 0.8; +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.prose-p\:mb-0 :is(:where(p):not(:where([class~="not-prose"] *))) { + margin-bottom: 0px; +} + +.prose-a\:rounded-sm :is(:where(a):not(:where([class~="not-prose"] *))) { + border-radius: 0.125rem; +} + +.prose-a\:p-0 :is(:where(a):not(:where([class~="not-prose"] *))) { + padding: 0px; +} + +.prose-a\:p-0\.5 :is(:where(a):not(:where([class~="not-prose"] *))) { + padding: 0.125rem; +} + +.prose-a\:text-blue-600 :is(:where(a):not(:where([class~="not-prose"] *))) { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.prose-a\:no-underline :is(:where(a):not(:where([class~="not-prose"] *))) { + text-decoration-line: none; +} + +.prose-a\:decoration-wavy :is(:where(a):not(:where([class~="not-prose"] *))) { + text-decoration-style: wavy; +} + +.hover\:prose-a\:text-blue-400 :is(:where(a):not(:where([class~="not-prose"] *))):hover { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity)); +} + +.hover\:prose-a\:underline :is(:where(a):not(:where([class~="not-prose"] *))):hover { + text-decoration-line: underline; +} + +.prose-em\:bg-blue-600 :is(:where(em):not(:where([class~="not-prose"] *))) { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} + +.prose-em\:px-1 :is(:where(em):not(:where([class~="not-prose"] *))) { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.prose-em\:font-bold :is(:where(em):not(:where([class~="not-prose"] *))) { + font-weight: 700; +} + +.prose-em\:not-italic :is(:where(em):not(:where([class~="not-prose"] *))) { + font-style: normal; +} + +.prose-em\:text-blue-100 :is(:where(em):not(:where([class~="not-prose"] *))) { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity)); +} + +.prose-ul\:list-none :is(:where(ul):not(:where([class~="not-prose"] *))) { + list-style-type: none; +} + +.prose-ul\:pl-0 :is(:where(ul):not(:where([class~="not-prose"] *))) { + padding-left: 0px; +} + +.prose-li\:pl-0 :is(:where(li):not(:where([class~="not-prose"] *))) { + padding-left: 0px; +} + +.prose-img\:my-2 :is(:where(img):not(:where([class~="not-prose"] *))) { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.prose-img\:rounded :is(:where(img):not(:where([class~="not-prose"] *))) { + border-radius: 0.25rem; +} + +@media (prefers-color-scheme: dark) { + .dark\:block { + display: block; + } + + .dark\:hidden { + display: none; + } + + .dark\:border-gray-600 { + --tw-border-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-border-opacity)); + } + + .dark\:border-orange-400 { + --tw-border-opacity: 1; + border-color: rgb(251 146 60 / var(--tw-border-opacity)); + } + + .dark\:bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); + } + + .dark\:bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + } + + .dark\:bg-blue-900 { + --tw-bg-opacity: 1; + background-color: rgb(30 58 138 / var(--tw-bg-opacity)); + } + + .dark\:bg-blue-900\/60 { + background-color: rgb(30 58 138 / 0.6); + } + + .dark\:bg-fuchsia-800 { + --tw-bg-opacity: 1; + background-color: rgb(134 25 143 / var(--tw-bg-opacity)); + } + + .dark\:bg-fuchsia-900 { + --tw-bg-opacity: 1; + background-color: rgb(112 26 117 / var(--tw-bg-opacity)); + } + + .dark\:bg-orange-400 { + --tw-bg-opacity: 1; + background-color: rgb(251 146 60 / var(--tw-bg-opacity)); + } + + .dark\:bg-orange-600 { + --tw-bg-opacity: 1; + background-color: rgb(234 88 12 / var(--tw-bg-opacity)); + } + + .dark\:bg-pink-600 { + --tw-bg-opacity: 1; + background-color: rgb(219 39 119 / var(--tw-bg-opacity)); + } + + .dark\:bg-yellow-400 { + --tw-bg-opacity: 1; + background-color: rgb(250 204 21 / var(--tw-bg-opacity)); + } + + .dark\:bg-fuchsia-100 { + --tw-bg-opacity: 1; + background-color: rgb(250 232 255 / var(--tw-bg-opacity)); + } + + .dark\:text-blue-200 { + --tw-text-opacity: 1; + color: rgb(191 219 254 / var(--tw-text-opacity)); + } + + .dark\:text-gray-200 { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); + } + + .dark\:text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); + } + + .dark\:text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); + } + + .dark\:text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); + } + + .dark\:text-red-400 { + --tw-text-opacity: 1; + color: rgb(248 113 113 / var(--tw-text-opacity)); + } + + .dark\:text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity)); + } + + .dark\:shadow-pink-200 { + --tw-shadow-color: #fbcfe8; + --tw-shadow: var(--tw-shadow-colored); + } + + .dark\:selection\:bg-blue-600 *::-moz-selection { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + } + + .dark\:selection\:bg-blue-600 *::selection { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + } + + .dark\:selection\:text-blue-100 *::-moz-selection { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity)); + } + + .dark\:selection\:text-blue-100 *::selection { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity)); + } + + .dark\:selection\:bg-blue-600::-moz-selection { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + } + + .dark\:selection\:bg-blue-600::selection { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + } + + .dark\:selection\:text-blue-100::-moz-selection { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity)); + } + + .dark\:selection\:text-blue-100::selection { + --tw-text-opacity: 1; + color: rgb(219 234 254 / var(--tw-text-opacity)); + } + + .dark\:hover\:bg-blue-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(191 219 254 / var(--tw-bg-opacity)); + } + + .dark\:hover\:bg-fuchsia-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(162 28 175 / var(--tw-bg-opacity)); + } + + .dark\:hover\:bg-orange-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 215 170 / var(--tw-bg-opacity)); + } + + .dark\:hover\:bg-red-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 202 202 / var(--tw-bg-opacity)); + } + + .dark\:hover\:bg-yellow-400\/80:hover { + background-color: rgb(250 204 21 / 0.8); + } + + .hover\:dark\:bg-pink-900:hover { + --tw-bg-opacity: 1; + background-color: rgb(131 24 67 / var(--tw-bg-opacity)); + } + + .dark\:hover\:text-yellow-100:hover { + --tw-text-opacity: 1; + color: rgb(254 249 195 / var(--tw-text-opacity)); + } + + .prose-a\:dark\:text-gray-100 :is(:where(a):not(:where([class~="not-prose"] *))) { + --tw-text-opacity: 1; + color: rgb(243 244 246 / var(--tw-text-opacity)); + } +} + +@media (min-width: 640px) { + .sm\:col-span-1 { + grid-column: span 1 / span 1; + } + + .sm\:col-span-6 { + grid-column: span 6 / span 6; + } +} + +@media (min-width: 768px) { + .md\:mx-0 { + margin-left: 0px; + margin-right: 0px; + } + + .md\:mb-12 { + margin-bottom: 3rem; + } + + .md\:block { + display: block; + } + + .md\:h-10 { + height: 2.5rem; + } + + .md\:h-4 { + height: 1rem; + } + + .md\:w-10 { + width: 2.5rem; + } + + .md\:w-4 { + width: 1rem; + } + + .md\:flex-auto { + flex: 1 1 auto; + } + + .md\:pt-8 { + padding-top: 2rem; + } + + .md\:text-sm { + font-size: 0.8rem; + } + + .md\:text-xl { + font-size: 1.25rem; + } +} + diff --git a/public/assets/dist/index-SO2jW2qeQ-oB.js b/public/assets/dist/index-SO2jW2qeQ-oB.js new file mode 100644 index 0000000..c28f04d --- /dev/null +++ b/public/assets/dist/index-SO2jW2qeQ-oB.js @@ -0,0 +1,31 @@ +(function() { + document.addEventListener('alpine:init', () => { + Alpine.magic('clipboard', () => { + return subject => navigator.clipboard.writeText(subject) + }) + }) + document.addEventListener("DOMContentLoaded", function () { + const times = document.querySelectorAll('time'); + times.forEach((time) => { + const oldDtime = Date.parse(time.dateTime); + time.innerHTML = new Date(oldDtime).toLocaleDateString(navigator.language, { weekday:"long", year:"numeric", month:"short", day:"numeric"}); + + md_gallery({ + "class_name": "grid gap-4 grid-cols-2 prose-img:m-0" + }); + }); + // mapboxgl.accessToken = 'pk.eyJ1IjoiZG5pdHphIiwiYSI6ImNsZWIyY3ZzaTE0cjUzdm4xdnZ6czRlYjUifQ.FRETOXYRID6T2IoB7qqRLg'; + // var map = new mapboxgl.Map({ + // container: 'map', + // style: 'mapbox://styles/mapbox/streets-v11' + // }); + // const mapContainer = document.getElementById("map"); + // const markers = JSON.parse(mapContainer.dataset["markers"]); + // for (var i = 0; i < markers.length; i++) { + // const marker = markers[i]; + // new mapboxgl.Marker() + // .setLngLat(marker) + // .addTo(map); + // } + }); +})(); diff --git a/public/assets/index.css b/public/assets/index.css index 3cc5b17..d2c5a56 100644 --- a/public/assets/index.css +++ b/public/assets/index.css @@ -1,5 +1,5 @@ /* -! tailwindcss v3.3.0 | MIT License | https://tailwindcss.com +! tailwindcss v3.3.2 | MIT License | https://tailwindcss.com */ /* @@ -436,6 +436,9 @@ video { --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; @@ -483,6 +486,9 @@ video { --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; @@ -2072,6 +2078,11 @@ h1, h2, h3, h4, h5, h6, h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { background-color: rgb(250 204 21 / var(--tw-bg-opacity)); } + .dark\:bg-green-800 { + --tw-bg-opacity: 1; + background-color: rgb(22 101 52 / var(--tw-bg-opacity)); + } + .dark\:text-blue-200 { --tw-text-opacity: 1; color: rgb(191 219 254 / var(--tw-text-opacity)); diff --git a/slices/admin/templates/layouts/app.html.slim b/slices/admin/templates/layouts/app.html.slim index 35276a2..6b490ea 100644 --- a/slices/admin/templates/layouts/app.html.slim +++ b/slices/admin/templates/layouts/app.html.slim @@ -8,10 +8,10 @@ html title Admin // Daniel Nitsikopoulos - link rel="stylesheet" href="/assets/index.css" + link rel="stylesheet" href=asset_from_manifest("index.css") link rel="icon" type="image/x-icon" href="/assets/favicon.ico" - script src="/assets/index.js" + script src=asset_from_manifest("index.js") script src="https://unpkg.com/htmx.org@1.9.2" integrity="sha384-L6OqL9pRWyyFU3+/bjdSri+iIphTN/bvYyM37tICVyOJkWZLpP2vGn6VUEXgzg6h" crossorigin="anonymous" script src="https://cdn.jsdelivr.net/npm/alpinejs@3.12.0/dist/cdn.min.js" defer="true" diff --git a/version_assets.rb b/version_assets.rb new file mode 100644 index 0000000..d711665 --- /dev/null +++ b/version_assets.rb @@ -0,0 +1,27 @@ +# get index.css, index.js +# generate hash +# rename files +# write asset manifest + +require "securerandom" +require "json" +require "fileutils" + +folder_path = File.join(__dir__, "/public/assets") +dist_path = File.join(__dir__, "/public/assets/dist") +hash = SecureRandom.urlsafe_base64(9) +filenames = {} + +FileUtils.rm_rf("#{dist_path}/.", secure: true) + +Dir.glob(folder_path + "/*.{js,css}").each do |f| + FileUtils.cp(f, dist_path) +end + +Dir.glob(dist_path + "/*.{js,css}").each_with_object(filenames) do |f, memo| + filename = File.basename(f, File.extname(f)) + memo[filename + File.extname(f)] = filename + "-" + hash + File.extname(f) + File.rename(f, dist_path + "/" + filename + "-" + hash + File.extname(f)) +end + +File.open(folder_path + "/asset-manifest.json", "wb") {|f| f.write(JSON.generate(filenames)) }