diff --git a/assets/js/app.js b/assets/js/app.js index aa0af12..b466707 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -21,6 +21,55 @@ import "phoenix_html"; import { Socket } from "phoenix"; import { LiveSocket } from "phoenix_live_view"; import topbar from "../vendor/topbar"; +import CodeBlockHook from "./hooks/code_block_hook"; +import { + DropdownAnimation, + SearchableDropdown, +} from "./hooks/searchable_dropdown"; + +let Hooks = { + CodeBlockHook, + SearchableDropdown, + DropdownAnimation, +}; + +Hooks.ClickOutside = { + mounted() { + this.handleClick = (e) => { + if (!this.el.contains(e.target)) { + this.pushEventTo(this.el, "close_dropdown", {}); + } + }; + document.addEventListener("click", this.handleClick); + }, + destroyed() { + document.removeEventListener("click", this.handleClick); + }, +}; + +Hooks.ClientSearch = { + mounted() { + this.options = JSON.parse(this.el.dataset.options); + this.searchInput = this.el.querySelector("input"); + this.optionsContainer = this.el.querySelector( + "#dropdown-options-container", + ); + + this.searchInput.addEventListener("input", (e) => { + const query = e.target.value.toLowerCase(); + const options = this.el.querySelectorAll(".dropdown-option"); + + options.forEach((option) => { + const value = option.dataset.value.toLowerCase(); + if (value.includes(query)) { + option.style.display = ""; + } else { + option.style.display = "none"; + } + }); + }); + }, +}; window.addEventListener("phx:copy", (event) => { let button = event.detail.dispatcher; @@ -40,6 +89,7 @@ let csrfToken = document let liveSocket = new LiveSocket("/live", Socket, { longPollFallbackMs: 2500, params: { _csrf_token: csrfToken }, + hooks: Hooks, }); // Show progress bar on live navigation and form submits diff --git a/assets/js/hooks/code_block_hook.js b/assets/js/hooks/code_block_hook.js new file mode 100644 index 0000000..3868d18 --- /dev/null +++ b/assets/js/hooks/code_block_hook.js @@ -0,0 +1,59 @@ +// assets/js/hooks/code_block_hook.js +import { codeToHtml } from "shiki"; + +const CodeBlockHook = { + mounted() { + const code = this.el.dataset.code; + const language = this.el.dataset.language; + const highlightedLines = JSON.parse( + this.el.dataset.highlightedLines || "[]", + ); + + console.log(code); + console.log("language", language); + + const lines = code.split("\n"); + + // Convert line numbers to decorations + const decorations = highlightedLines + .map((line) => { + // Convert to 0-based index and ensure valid line number + const lineIndex = line - 1; + if (lineIndex < 0 || lineIndex >= lines.length) return null; + + // Get the actual line length + const lineLength = lines[lineIndex].length; + + return { + // Line numbers are 0-indexed + start: { line: lineIndex, character: 0 }, + end: { line: lineIndex, character: lineLength }, + properties: { + // Apply both background color and a class for flexibility + class: "highlight", + style: "background-color: rgba(200,200,255,0.1);", + }, + }; + }) + .filter(Boolean); // Remove any null entries from invalid line numbers + + codeToHtml(code, { + lang: language, + theme: "catppuccin-mocha", + decorations, + }).then((html) => { + console.log(html); + + // Replace the code content while preserving the pre/code structure + const tempDiv = document.createElement("div"); + tempDiv.innerHTML = html; + const codeContent = tempDiv.querySelector("code"); + + if (codeContent) { + this.el.querySelector("code").innerHTML = codeContent.innerHTML; + } + }); + }, +}; + +export default CodeBlockHook; diff --git a/assets/js/hooks/searchable_dropdown.js b/assets/js/hooks/searchable_dropdown.js new file mode 100644 index 0000000..27d2f8e --- /dev/null +++ b/assets/js/hooks/searchable_dropdown.js @@ -0,0 +1,32 @@ +SearchableDropdown = { + mounted() { + this.el.addEventListener("input", (e) => { + const query = e.target.value.toLowerCase(); + const dropdownId = this.el.dataset.dropdownId; + const optionsContainer = document.querySelector(`#${dropdownId}-options`); + const options = optionsContainer.querySelectorAll("li button"); + + options.forEach((option) => { + const text = option.textContent.toLowerCase(); + option.parentElement.style.display = text.includes(query) + ? "block" + : "none"; + }); + }); + }, +}; + +const DropdownAnimation = { + mounted() { + this.el.addEventListener("transitionend", (e) => { + if ( + e.propertyName === "opacity" && + this.el.classList.contains("fade-out") + ) { + this.el.classList.add("hidden"); + } + }); + }, +}; + +export { SearchableDropdown, DropdownAnimation }; diff --git a/assets/node-packages.nix b/assets/node-packages.nix index c91238d..b8e14c8 100644 --- a/assets/node-packages.nix +++ b/assets/node-packages.nix @@ -3,1827 +3,17 @@ {nodeEnv, fetchurl, fetchgit, nix-gitignore, stdenv, lib, globalBuildInputs ? []}: let - sources = { - "@alloc/quick-lru-5.2.0" = { - name = "_at_alloc_slash_quick-lru"; - packageName = "@alloc/quick-lru"; - version = "5.2.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz"; - sha512 = "UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="; - }; - }; - "@catppuccin/tailwindcss-0.1.6" = { - name = "_at_catppuccin_slash_tailwindcss"; - packageName = "@catppuccin/tailwindcss"; - version = "0.1.6"; - src = fetchurl { - url = "https://registry.npmjs.org/@catppuccin/tailwindcss/-/tailwindcss-0.1.6.tgz"; - sha512 = "V+Y0AwZ5SSyvOVAcDl7Ng30xy+m82OKnEJ+9+kcZZ7lRyXuZrAb2GScdq9XR3v+ggt8qiZ/G4TvaC9cJ88AAXA=="; - }; - }; - "@cspotcode/source-map-support-0.8.1" = { - name = "_at_cspotcode_slash_source-map-support"; - packageName = "@cspotcode/source-map-support"; - version = "0.8.1"; - src = fetchurl { - url = "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz"; - sha512 = "IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="; - }; - }; - "@esbuild/linux-x64-0.24.0" = { - name = "_at_esbuild_slash_linux-x64"; - packageName = "@esbuild/linux-x64"; - version = "0.24.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz"; - sha512 = "vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA=="; - }; - }; - "@isaacs/cliui-8.0.2" = { - name = "_at_isaacs_slash_cliui"; - packageName = "@isaacs/cliui"; - version = "8.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz"; - sha512 = "O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="; - }; - }; - "@jridgewell/gen-mapping-0.3.5" = { - name = "_at_jridgewell_slash_gen-mapping"; - packageName = "@jridgewell/gen-mapping"; - version = "0.3.5"; - src = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"; - sha512 = "IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg=="; - }; - }; - "@jridgewell/resolve-uri-3.1.2" = { - name = "_at_jridgewell_slash_resolve-uri"; - packageName = "@jridgewell/resolve-uri"; - version = "3.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"; - sha512 = "bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="; - }; - }; - "@jridgewell/set-array-1.2.1" = { - name = "_at_jridgewell_slash_set-array"; - packageName = "@jridgewell/set-array"; - version = "1.2.1"; - src = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz"; - sha512 = "R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="; - }; - }; - "@jridgewell/sourcemap-codec-1.5.0" = { - name = "_at_jridgewell_slash_sourcemap-codec"; - packageName = "@jridgewell/sourcemap-codec"; - version = "1.5.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"; - sha512 = "gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="; - }; - }; - "@jridgewell/trace-mapping-0.3.25" = { - name = "_at_jridgewell_slash_trace-mapping"; - packageName = "@jridgewell/trace-mapping"; - version = "0.3.25"; - src = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"; - sha512 = "vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="; - }; - }; - "@jridgewell/trace-mapping-0.3.9" = { - name = "_at_jridgewell_slash_trace-mapping"; - packageName = "@jridgewell/trace-mapping"; - version = "0.3.9"; - src = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"; - sha512 = "3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="; - }; - }; - "@nodelib/fs.scandir-2.1.5" = { - name = "_at_nodelib_slash_fs.scandir"; - packageName = "@nodelib/fs.scandir"; - version = "2.1.5"; - src = fetchurl { - url = "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"; - sha512 = "vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="; - }; - }; - "@nodelib/fs.stat-2.0.5" = { - name = "_at_nodelib_slash_fs.stat"; - packageName = "@nodelib/fs.stat"; - version = "2.0.5"; - src = fetchurl { - url = "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"; - sha512 = "RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="; - }; - }; - "@nodelib/fs.walk-1.2.8" = { - name = "_at_nodelib_slash_fs.walk"; - packageName = "@nodelib/fs.walk"; - version = "1.2.8"; - src = fetchurl { - url = "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"; - sha512 = "oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="; - }; - }; - "@shikijs/core-1.22.0" = { - name = "_at_shikijs_slash_core"; - packageName = "@shikijs/core"; - version = "1.22.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz"; - sha512 = "S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q=="; - }; - }; - "@shikijs/engine-javascript-1.22.0" = { - name = "_at_shikijs_slash_engine-javascript"; - packageName = "@shikijs/engine-javascript"; - version = "1.22.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz"; - sha512 = "AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw=="; - }; - }; - "@shikijs/engine-oniguruma-1.22.0" = { - name = "_at_shikijs_slash_engine-oniguruma"; - packageName = "@shikijs/engine-oniguruma"; - version = "1.22.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz"; - sha512 = "5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw=="; - }; - }; - "@shikijs/types-1.22.0" = { - name = "_at_shikijs_slash_types"; - packageName = "@shikijs/types"; - version = "1.22.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz"; - sha512 = "Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww=="; - }; - }; - "@shikijs/vscode-textmate-9.3.0" = { - name = "_at_shikijs_slash_vscode-textmate"; - packageName = "@shikijs/vscode-textmate"; - version = "9.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz"; - sha512 = "jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA=="; - }; - }; - "@swc/core-1.7.39" = { - name = "_at_swc_slash_core"; - packageName = "@swc/core"; - version = "1.7.39"; - src = fetchurl { - url = "https://registry.npmjs.org/@swc/core/-/core-1.7.39.tgz"; - sha512 = "jns6VFeOT49uoTKLWIEfiQqJAlyqldNAt80kAr8f7a5YjX0zgnG3RBiLMpksx4Ka4SlK4O6TJ/lumIM3Trp82g=="; - }; - }; - "@swc/counter-0.1.3" = { - name = "_at_swc_slash_counter"; - packageName = "@swc/counter"; - version = "0.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz"; - sha512 = "e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="; - }; - }; - "@swc/helpers-0.5.13" = { - name = "_at_swc_slash_helpers"; - packageName = "@swc/helpers"; - version = "0.5.13"; - src = fetchurl { - url = "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz"; - sha512 = "UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w=="; - }; - }; - "@swc/types-0.1.13" = { - name = "_at_swc_slash_types"; - packageName = "@swc/types"; - version = "0.1.13"; - src = fetchurl { - url = "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz"; - sha512 = "JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q=="; - }; - }; - "@swc/wasm-1.7.39" = { - name = "_at_swc_slash_wasm"; - packageName = "@swc/wasm"; - version = "1.7.39"; - src = fetchurl { - url = "https://registry.npmjs.org/@swc/wasm/-/wasm-1.7.39.tgz"; - sha512 = "w886OOc+hHnwkZh9UgobaFuV3fXcSw8nY6hF7gzovAFUDCq3TNqg84NEY1WnHUzduWMRNrTe1zGs5WRg7IkF8A=="; - }; - }; - "@tailwindcss/forms-0.5.9" = { - name = "_at_tailwindcss_slash_forms"; - packageName = "@tailwindcss/forms"; - version = "0.5.9"; - src = fetchurl { - url = "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.9.tgz"; - sha512 = "tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg=="; - }; - }; - "@tsconfig/node10-1.0.11" = { - name = "_at_tsconfig_slash_node10"; - packageName = "@tsconfig/node10"; - version = "1.0.11"; - src = fetchurl { - url = "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz"; - sha512 = "DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="; - }; - }; - "@tsconfig/node12-1.0.11" = { - name = "_at_tsconfig_slash_node12"; - packageName = "@tsconfig/node12"; - version = "1.0.11"; - src = fetchurl { - url = "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz"; - sha512 = "cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="; - }; - }; - "@tsconfig/node14-1.0.3" = { - name = "_at_tsconfig_slash_node14"; - packageName = "@tsconfig/node14"; - version = "1.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz"; - sha512 = "ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="; - }; - }; - "@tsconfig/node16-1.0.4" = { - name = "_at_tsconfig_slash_node16"; - packageName = "@tsconfig/node16"; - version = "1.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz"; - sha512 = "vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="; - }; - }; - "@types/hast-3.0.4" = { - name = "_at_types_slash_hast"; - packageName = "@types/hast"; - version = "3.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz"; - sha512 = "WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="; - }; - }; - "@types/mdast-4.0.4" = { - name = "_at_types_slash_mdast"; - packageName = "@types/mdast"; - version = "4.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz"; - sha512 = "kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="; - }; - }; - "@types/node-22.7.8" = { - name = "_at_types_slash_node"; - packageName = "@types/node"; - version = "22.7.8"; - src = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-22.7.8.tgz"; - sha512 = "a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg=="; - }; - }; - "@types/unist-3.0.3" = { - name = "_at_types_slash_unist"; - packageName = "@types/unist"; - version = "3.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz"; - sha512 = "ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="; - }; - }; - "@ungap/structured-clone-1.2.0" = { - name = "_at_ungap_slash_structured-clone"; - packageName = "@ungap/structured-clone"; - version = "1.2.0"; - src = fetchurl { - url = "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz"; - sha512 = "zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="; - }; - }; - "acorn-8.13.0" = { - name = "acorn"; - packageName = "acorn"; - version = "8.13.0"; - src = fetchurl { - url = "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz"; - sha512 = "8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w=="; - }; - }; - "acorn-walk-8.3.4" = { - name = "acorn-walk"; - packageName = "acorn-walk"; - version = "8.3.4"; - src = fetchurl { - url = "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz"; - sha512 = "ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="; - }; - }; - "ansi-regex-5.0.1" = { - name = "ansi-regex"; - packageName = "ansi-regex"; - version = "5.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"; - sha512 = "quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="; - }; - }; - "ansi-regex-6.1.0" = { - name = "ansi-regex"; - packageName = "ansi-regex"; - version = "6.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz"; - sha512 = "7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="; - }; - }; - "ansi-styles-4.3.0" = { - name = "ansi-styles"; - packageName = "ansi-styles"; - version = "4.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"; - sha512 = "zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="; - }; - }; - "ansi-styles-6.2.1" = { - name = "ansi-styles"; - packageName = "ansi-styles"; - version = "6.2.1"; - src = fetchurl { - url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz"; - sha512 = "bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="; - }; - }; - "any-promise-1.3.0" = { - name = "any-promise"; - packageName = "any-promise"; - version = "1.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz"; - sha512 = "7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="; - }; - }; - "anymatch-3.1.3" = { - name = "anymatch"; - packageName = "anymatch"; - version = "3.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"; - sha512 = "KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="; - }; - }; - "arg-4.1.3" = { - name = "arg"; - packageName = "arg"; - version = "4.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz"; - sha512 = "58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="; - }; - }; - "arg-5.0.2" = { - name = "arg"; - packageName = "arg"; - version = "5.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz"; - sha512 = "PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="; - }; - }; - "balanced-match-1.0.2" = { - name = "balanced-match"; - packageName = "balanced-match"; - version = "1.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"; - sha512 = "3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="; - }; - }; - "binary-extensions-2.3.0" = { - name = "binary-extensions"; - packageName = "binary-extensions"; - version = "2.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"; - sha512 = "Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="; - }; - }; - "brace-expansion-2.0.1" = { - name = "brace-expansion"; - packageName = "brace-expansion"; - version = "2.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"; - sha512 = "XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="; - }; - }; - "braces-3.0.3" = { - name = "braces"; - packageName = "braces"; - version = "3.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"; - sha512 = "yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="; - }; - }; - "camelcase-css-2.0.1" = { - name = "camelcase-css"; - packageName = "camelcase-css"; - version = "2.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"; - sha512 = "QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="; - }; - }; - "ccount-2.0.1" = { - name = "ccount"; - packageName = "ccount"; - version = "2.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz"; - sha512 = "eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="; - }; - }; - "character-entities-html4-2.1.0" = { - name = "character-entities-html4"; - packageName = "character-entities-html4"; - version = "2.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz"; - sha512 = "1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="; - }; - }; - "character-entities-legacy-3.0.0" = { - name = "character-entities-legacy"; - packageName = "character-entities-legacy"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz"; - sha512 = "RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="; - }; - }; - "chokidar-3.6.0" = { - name = "chokidar"; - packageName = "chokidar"; - version = "3.6.0"; - src = fetchurl { - url = "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"; - sha512 = "7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="; - }; - }; - "color-convert-2.0.1" = { - name = "color-convert"; - packageName = "color-convert"; - version = "2.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"; - sha512 = "RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="; - }; - }; - "color-name-1.1.4" = { - name = "color-name"; - packageName = "color-name"; - version = "1.1.4"; - src = fetchurl { - url = "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"; - sha512 = "dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="; - }; - }; - "comma-separated-tokens-2.0.3" = { - name = "comma-separated-tokens"; - packageName = "comma-separated-tokens"; - version = "2.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz"; - sha512 = "Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="; - }; - }; - "commander-4.1.1" = { - name = "commander"; - packageName = "commander"; - version = "4.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz"; - sha512 = "NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="; - }; - }; - "create-require-1.1.1" = { - name = "create-require"; - packageName = "create-require"; - version = "1.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz"; - sha512 = "dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="; - }; - }; - "cross-spawn-7.0.3" = { - name = "cross-spawn"; - packageName = "cross-spawn"; - version = "7.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"; - sha512 = "iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="; - }; - }; - "cssesc-3.0.0" = { - name = "cssesc"; - packageName = "cssesc"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"; - sha512 = "/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="; - }; - }; - "dequal-2.0.3" = { - name = "dequal"; - packageName = "dequal"; - version = "2.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz"; - sha512 = "0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="; - }; - }; - "devlop-1.1.0" = { - name = "devlop"; - packageName = "devlop"; - version = "1.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz"; - sha512 = "RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="; - }; - }; - "didyoumean-1.2.2" = { - name = "didyoumean"; - packageName = "didyoumean"; - version = "1.2.2"; - src = fetchurl { - url = "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz"; - sha512 = "gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="; - }; - }; - "diff-4.0.2" = { - name = "diff"; - packageName = "diff"; - version = "4.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"; - sha512 = "58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="; - }; - }; - "dlv-1.1.3" = { - name = "dlv"; - packageName = "dlv"; - version = "1.1.3"; - src = fetchurl { - url = "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz"; - sha512 = "+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="; - }; - }; - "eastasianwidth-0.2.0" = { - name = "eastasianwidth"; - packageName = "eastasianwidth"; - version = "0.2.0"; - src = fetchurl { - url = "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz"; - sha512 = "I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="; - }; - }; - "emoji-regex-8.0.0" = { - name = "emoji-regex"; - packageName = "emoji-regex"; - version = "8.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"; - sha512 = "MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="; - }; - }; - "emoji-regex-9.2.2" = { - name = "emoji-regex"; - packageName = "emoji-regex"; - version = "9.2.2"; - src = fetchurl { - url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"; - sha512 = "L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="; - }; - }; - "esbuild-0.24.0" = { - name = "esbuild"; - packageName = "esbuild"; - version = "0.24.0"; - src = fetchurl { - url = "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz"; - sha512 = "FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ=="; - }; - }; - "fast-glob-3.3.2" = { - name = "fast-glob"; - packageName = "fast-glob"; - version = "3.3.2"; - src = fetchurl { - url = "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz"; - sha512 = "oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="; - }; - }; - "fastq-1.17.1" = { - name = "fastq"; - packageName = "fastq"; - version = "1.17.1"; - src = fetchurl { - url = "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz"; - sha512 = "sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="; - }; - }; - "fill-range-7.1.1" = { - name = "fill-range"; - packageName = "fill-range"; - version = "7.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"; - sha512 = "YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="; - }; - }; - "foreground-child-3.3.0" = { - name = "foreground-child"; - packageName = "foreground-child"; - version = "3.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz"; - sha512 = "Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg=="; - }; - }; - "function-bind-1.1.2" = { - name = "function-bind"; - packageName = "function-bind"; - version = "1.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"; - sha512 = "7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="; - }; - }; - "glob-10.4.5" = { - name = "glob"; - packageName = "glob"; - version = "10.4.5"; - src = fetchurl { - url = "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz"; - sha512 = "7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="; - }; - }; - "glob-parent-5.1.2" = { - name = "glob-parent"; - packageName = "glob-parent"; - version = "5.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"; - sha512 = "AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="; - }; - }; - "glob-parent-6.0.2" = { - name = "glob-parent"; - packageName = "glob-parent"; - version = "6.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"; - sha512 = "XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="; - }; - }; - "hasown-2.0.2" = { - name = "hasown"; - packageName = "hasown"; - version = "2.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"; - sha512 = "0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="; - }; - }; - "hast-util-to-html-9.0.3" = { - name = "hast-util-to-html"; - packageName = "hast-util-to-html"; - version = "9.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz"; - sha512 = "M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg=="; - }; - }; - "hast-util-whitespace-3.0.0" = { - name = "hast-util-whitespace"; - packageName = "hast-util-whitespace"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz"; - sha512 = "88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="; - }; - }; - "html-void-elements-3.0.0" = { - name = "html-void-elements"; - packageName = "html-void-elements"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz"; - sha512 = "bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="; - }; - }; - "is-binary-path-2.1.0" = { - name = "is-binary-path"; - packageName = "is-binary-path"; - version = "2.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"; - sha512 = "ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="; - }; - }; - "is-core-module-2.15.1" = { - name = "is-core-module"; - packageName = "is-core-module"; - version = "2.15.1"; - src = fetchurl { - url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz"; - sha512 = "z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ=="; - }; - }; - "is-extglob-2.1.1" = { - name = "is-extglob"; - packageName = "is-extglob"; - version = "2.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"; - sha512 = "SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="; - }; - }; - "is-fullwidth-code-point-3.0.0" = { - name = "is-fullwidth-code-point"; - packageName = "is-fullwidth-code-point"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"; - sha512 = "zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="; - }; - }; - "is-glob-4.0.3" = { - name = "is-glob"; - packageName = "is-glob"; - version = "4.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"; - sha512 = "xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="; - }; - }; - "is-number-7.0.0" = { - name = "is-number"; - packageName = "is-number"; - version = "7.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"; - sha512 = "41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="; - }; - }; - "isexe-2.0.0" = { - name = "isexe"; - packageName = "isexe"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"; - sha512 = "RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="; - }; - }; - "jackspeak-3.4.3" = { - name = "jackspeak"; - packageName = "jackspeak"; - version = "3.4.3"; - src = fetchurl { - url = "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz"; - sha512 = "OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="; - }; - }; - "jiti-1.21.6" = { - name = "jiti"; - packageName = "jiti"; - version = "1.21.6"; - src = fetchurl { - url = "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz"; - sha512 = "2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w=="; - }; - }; - "lilconfig-2.1.0" = { - name = "lilconfig"; - packageName = "lilconfig"; - version = "2.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz"; - sha512 = "utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="; - }; - }; - "lilconfig-3.1.2" = { - name = "lilconfig"; - packageName = "lilconfig"; - version = "3.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz"; - sha512 = "eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow=="; - }; - }; - "lines-and-columns-1.2.4" = { - name = "lines-and-columns"; - packageName = "lines-and-columns"; - version = "1.2.4"; - src = fetchurl { - url = "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"; - sha512 = "7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="; - }; - }; - "lru-cache-10.4.3" = { - name = "lru-cache"; - packageName = "lru-cache"; - version = "10.4.3"; - src = fetchurl { - url = "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz"; - sha512 = "JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="; - }; - }; - "make-error-1.3.6" = { - name = "make-error"; - packageName = "make-error"; - version = "1.3.6"; - src = fetchurl { - url = "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz"; - sha512 = "s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="; - }; - }; - "mdast-util-to-hast-13.2.0" = { - name = "mdast-util-to-hast"; - packageName = "mdast-util-to-hast"; - version = "13.2.0"; - src = fetchurl { - url = "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz"; - sha512 = "QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="; - }; - }; - "merge2-1.4.1" = { - name = "merge2"; - packageName = "merge2"; - version = "1.4.1"; - src = fetchurl { - url = "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"; - sha512 = "8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="; - }; - }; - "micromark-util-character-2.1.0" = { - name = "micromark-util-character"; - packageName = "micromark-util-character"; - version = "2.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz"; - sha512 = "KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ=="; - }; - }; - "micromark-util-encode-2.0.0" = { - name = "micromark-util-encode"; - packageName = "micromark-util-encode"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz"; - sha512 = "pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA=="; - }; - }; - "micromark-util-sanitize-uri-2.0.0" = { - name = "micromark-util-sanitize-uri"; - packageName = "micromark-util-sanitize-uri"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz"; - sha512 = "WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw=="; - }; - }; - "micromark-util-symbol-2.0.0" = { - name = "micromark-util-symbol"; - packageName = "micromark-util-symbol"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz"; - sha512 = "8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw=="; - }; - }; - "micromark-util-types-2.0.0" = { - name = "micromark-util-types"; - packageName = "micromark-util-types"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz"; - sha512 = "oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w=="; - }; - }; - "micromatch-4.0.8" = { - name = "micromatch"; - packageName = "micromatch"; - version = "4.0.8"; - src = fetchurl { - url = "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz"; - sha512 = "PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="; - }; - }; - "mini-svg-data-uri-1.4.4" = { - name = "mini-svg-data-uri"; - packageName = "mini-svg-data-uri"; - version = "1.4.4"; - src = fetchurl { - url = "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz"; - sha512 = "r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg=="; - }; - }; - "minimatch-9.0.5" = { - name = "minimatch"; - packageName = "minimatch"; - version = "9.0.5"; - src = fetchurl { - url = "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"; - sha512 = "G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="; - }; - }; - "minipass-7.1.2" = { - name = "minipass"; - packageName = "minipass"; - version = "7.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"; - sha512 = "qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="; - }; - }; - "mz-2.7.0" = { - name = "mz"; - packageName = "mz"; - version = "2.7.0"; - src = fetchurl { - url = "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz"; - sha512 = "z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="; - }; - }; - "nanoid-3.3.7" = { - name = "nanoid"; - packageName = "nanoid"; - version = "3.3.7"; - src = fetchurl { - url = "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz"; - sha512 = "eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="; - }; - }; - "normalize-path-3.0.0" = { - name = "normalize-path"; - packageName = "normalize-path"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"; - sha512 = "6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="; - }; - }; - "object-assign-4.1.1" = { - name = "object-assign"; - packageName = "object-assign"; - version = "4.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"; - sha512 = "rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="; - }; - }; - "object-hash-3.0.0" = { - name = "object-hash"; - packageName = "object-hash"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz"; - sha512 = "RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="; - }; - }; - "oniguruma-to-js-0.4.3" = { - name = "oniguruma-to-js"; - packageName = "oniguruma-to-js"; - version = "0.4.3"; - src = fetchurl { - url = "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz"; - sha512 = "X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ=="; - }; - }; - "package-json-from-dist-1.0.1" = { - name = "package-json-from-dist"; - packageName = "package-json-from-dist"; - version = "1.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz"; - sha512 = "UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="; - }; - }; - "path-key-3.1.1" = { - name = "path-key"; - packageName = "path-key"; - version = "3.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"; - sha512 = "ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="; - }; - }; - "path-parse-1.0.7" = { - name = "path-parse"; - packageName = "path-parse"; - version = "1.0.7"; - src = fetchurl { - url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"; - sha512 = "LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="; - }; - }; - "path-scurry-1.11.1" = { - name = "path-scurry"; - packageName = "path-scurry"; - version = "1.11.1"; - src = fetchurl { - url = "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz"; - sha512 = "Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="; - }; - }; - "phoenix-1.7.14" = { - name = "phoenix"; - packageName = "phoenix"; - version = "1.7.14"; - src = fetchurl { - url = "https://registry.npmjs.org/phoenix/-/phoenix-1.7.14.tgz"; - sha512 = "3tZ76PiH/2g+Kyzhz8+GIFYrnx3lRnwi/Qt3ZUH04xpMxXL7Guerd5aaxtpWal73X+H8iLAjo2c+AgRy2KYQcQ=="; - }; - }; - "phoenix_html-3.3.4" = { - name = "phoenix_html"; - packageName = "phoenix_html"; - version = "3.3.4"; - src = fetchurl { - url = "https://registry.npmjs.org/phoenix_html/-/phoenix_html-3.3.4.tgz"; - sha512 = "IkKAeP4sAuFzwtSSUbSNP/nL0H6WHcHfpe+/F7wOzyjYtijkAO2wTH8maA7vpTRhUBU5Dck5V8SEEhDuUy1mMA=="; - }; - }; - "phoenix_live_view-1.0.0-rc.7" = { - name = "phoenix_live_view"; - packageName = "phoenix_live_view"; - version = "1.0.0-rc.7"; - src = fetchurl { - url = "https://registry.npmjs.org/phoenix_live_view/-/phoenix_live_view-1.0.0-rc.7.tgz"; - sha512 = "G3fv7X/JtzrHIpNqR7REc9gAxTZkhICQWhQs6VvDgzXfkyHMQs9NqOpN00HOgCXHJPb1jxYhSMPRuyLBOmbgng=="; - }; - }; - "picocolors-1.1.1" = { - name = "picocolors"; - packageName = "picocolors"; - version = "1.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"; - sha512 = "xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="; - }; - }; - "picomatch-2.3.1" = { - name = "picomatch"; - packageName = "picomatch"; - version = "2.3.1"; - src = fetchurl { - url = "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"; - sha512 = "JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="; - }; - }; - "pify-2.3.0" = { - name = "pify"; - packageName = "pify"; - version = "2.3.0"; - src = fetchurl { - url = "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"; - sha512 = "udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="; - }; - }; - "pirates-4.0.6" = { - name = "pirates"; - packageName = "pirates"; - version = "4.0.6"; - src = fetchurl { - url = "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz"; - sha512 = "saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="; - }; - }; - "postcss-8.4.47" = { - name = "postcss"; - packageName = "postcss"; - version = "8.4.47"; - src = fetchurl { - url = "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz"; - sha512 = "56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ=="; - }; - }; - "postcss-import-15.1.0" = { - name = "postcss-import"; - packageName = "postcss-import"; - version = "15.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz"; - sha512 = "hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="; - }; - }; - "postcss-js-4.0.1" = { - name = "postcss-js"; - packageName = "postcss-js"; - version = "4.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz"; - sha512 = "dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="; - }; - }; - "postcss-load-config-4.0.2" = { - name = "postcss-load-config"; - packageName = "postcss-load-config"; - version = "4.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz"; - sha512 = "bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="; - }; - }; - "postcss-nested-6.2.0" = { - name = "postcss-nested"; - packageName = "postcss-nested"; - version = "6.2.0"; - src = fetchurl { - url = "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz"; - sha512 = "HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="; - }; - }; - "postcss-selector-parser-6.1.2" = { - name = "postcss-selector-parser"; - packageName = "postcss-selector-parser"; - version = "6.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"; - sha512 = "Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="; - }; - }; - "postcss-value-parser-4.2.0" = { - name = "postcss-value-parser"; - packageName = "postcss-value-parser"; - version = "4.2.0"; - src = fetchurl { - url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"; - sha512 = "1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="; - }; - }; - "property-information-6.5.0" = { - name = "property-information"; - packageName = "property-information"; - version = "6.5.0"; - src = fetchurl { - url = "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz"; - sha512 = "PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="; - }; - }; - "queue-microtask-1.2.3" = { - name = "queue-microtask"; - packageName = "queue-microtask"; - version = "1.2.3"; - src = fetchurl { - url = "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"; - sha512 = "NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="; - }; - }; - "read-cache-1.0.0" = { - name = "read-cache"; - packageName = "read-cache"; - version = "1.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz"; - sha512 = "Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="; - }; - }; - "readdirp-3.6.0" = { - name = "readdirp"; - packageName = "readdirp"; - version = "3.6.0"; - src = fetchurl { - url = "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"; - sha512 = "hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="; - }; - }; - "regex-4.3.3" = { - name = "regex"; - packageName = "regex"; - version = "4.3.3"; - src = fetchurl { - url = "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz"; - sha512 = "r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg=="; - }; - }; - "resolve-1.22.8" = { - name = "resolve"; - packageName = "resolve"; - version = "1.22.8"; - src = fetchurl { - url = "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"; - sha512 = "oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="; - }; - }; - "reusify-1.0.4" = { - name = "reusify"; - packageName = "reusify"; - version = "1.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"; - sha512 = "U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="; - }; - }; - "run-parallel-1.2.0" = { - name = "run-parallel"; - packageName = "run-parallel"; - version = "1.2.0"; - src = fetchurl { - url = "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"; - sha512 = "5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="; - }; - }; - "shebang-command-2.0.0" = { - name = "shebang-command"; - packageName = "shebang-command"; - version = "2.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"; - sha512 = "kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="; - }; - }; - "shebang-regex-3.0.0" = { - name = "shebang-regex"; - packageName = "shebang-regex"; - version = "3.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"; - sha512 = "7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="; - }; - }; - "shiki-1.22.0" = { - name = "shiki"; - packageName = "shiki"; - version = "1.22.0"; - src = fetchurl { - url = "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz"; - sha512 = "/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw=="; - }; - }; - "signal-exit-4.1.0" = { - name = "signal-exit"; - packageName = "signal-exit"; - version = "4.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"; - sha512 = "bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="; - }; - }; - "source-map-js-1.2.1" = { - name = "source-map-js"; - packageName = "source-map-js"; - version = "1.2.1"; - src = fetchurl { - url = "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"; - sha512 = "UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="; - }; - }; - "space-separated-tokens-2.0.2" = { - name = "space-separated-tokens"; - packageName = "space-separated-tokens"; - version = "2.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz"; - sha512 = "PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="; - }; - }; - "string-width-4.2.3" = { - name = "string-width"; - packageName = "string-width"; - version = "4.2.3"; - src = fetchurl { - url = "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"; - sha512 = "wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="; - }; - }; - "string-width-5.1.2" = { - name = "string-width"; - packageName = "string-width"; - version = "5.1.2"; - src = fetchurl { - url = "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz"; - sha512 = "HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="; - }; - }; - "string-width-cjs-4.2.3" = { - name = "string-width-cjs"; - packageName = "string-width-cjs"; - version = "4.2.3"; - src = fetchurl { - url = "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"; - sha512 = "wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="; - }; - }; - "stringify-entities-4.0.4" = { - name = "stringify-entities"; - packageName = "stringify-entities"; - version = "4.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz"; - sha512 = "IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="; - }; - }; - "strip-ansi-6.0.1" = { - name = "strip-ansi"; - packageName = "strip-ansi"; - version = "6.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"; - sha512 = "Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="; - }; - }; - "strip-ansi-7.1.0" = { - name = "strip-ansi"; - packageName = "strip-ansi"; - version = "7.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz"; - sha512 = "iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="; - }; - }; - "strip-ansi-cjs-6.0.1" = { - name = "strip-ansi-cjs"; - packageName = "strip-ansi-cjs"; - version = "6.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"; - sha512 = "Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="; - }; - }; - "sucrase-3.35.0" = { - name = "sucrase"; - packageName = "sucrase"; - version = "3.35.0"; - src = fetchurl { - url = "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz"; - sha512 = "8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="; - }; - }; - "supports-preserve-symlinks-flag-1.0.0" = { - name = "supports-preserve-symlinks-flag"; - packageName = "supports-preserve-symlinks-flag"; - version = "1.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"; - sha512 = "ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="; - }; - }; - "tailwindcss-3.4.14" = { - name = "tailwindcss"; - packageName = "tailwindcss"; - version = "3.4.14"; - src = fetchurl { - url = "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz"; - sha512 = "IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA=="; - }; - }; - "thenify-3.3.1" = { - name = "thenify"; - packageName = "thenify"; - version = "3.3.1"; - src = fetchurl { - url = "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz"; - sha512 = "RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="; - }; - }; - "thenify-all-1.6.0" = { - name = "thenify-all"; - packageName = "thenify-all"; - version = "1.6.0"; - src = fetchurl { - url = "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz"; - sha512 = "RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="; - }; - }; - "to-regex-range-5.0.1" = { - name = "to-regex-range"; - packageName = "to-regex-range"; - version = "5.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"; - sha512 = "65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="; - }; - }; - "trim-lines-3.0.1" = { - name = "trim-lines"; - packageName = "trim-lines"; - version = "3.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz"; - sha512 = "kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="; - }; - }; - "ts-interface-checker-0.1.13" = { - name = "ts-interface-checker"; - packageName = "ts-interface-checker"; - version = "0.1.13"; - src = fetchurl { - url = "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz"; - sha512 = "Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="; - }; - }; - "ts-node-10.9.2" = { - name = "ts-node"; - packageName = "ts-node"; - version = "10.9.2"; - src = fetchurl { - url = "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz"; - sha512 = "f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="; - }; - }; - "tslib-2.8.0" = { - name = "tslib"; - packageName = "tslib"; - version = "2.8.0"; - src = fetchurl { - url = "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz"; - sha512 = "jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA=="; - }; - }; - "typescript-5.6.3" = { - name = "typescript"; - packageName = "typescript"; - version = "5.6.3"; - src = fetchurl { - url = "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz"; - sha512 = "hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="; - }; - }; - "undici-types-6.19.8" = { - name = "undici-types"; - packageName = "undici-types"; - version = "6.19.8"; - src = fetchurl { - url = "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz"; - sha512 = "ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="; - }; - }; - "unist-util-is-6.0.0" = { - name = "unist-util-is"; - packageName = "unist-util-is"; - version = "6.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz"; - sha512 = "2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="; - }; - }; - "unist-util-position-5.0.0" = { - name = "unist-util-position"; - packageName = "unist-util-position"; - version = "5.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz"; - sha512 = "fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="; - }; - }; - "unist-util-stringify-position-4.0.0" = { - name = "unist-util-stringify-position"; - packageName = "unist-util-stringify-position"; - version = "4.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz"; - sha512 = "0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="; - }; - }; - "unist-util-visit-5.0.0" = { - name = "unist-util-visit"; - packageName = "unist-util-visit"; - version = "5.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz"; - sha512 = "MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="; - }; - }; - "unist-util-visit-parents-6.0.1" = { - name = "unist-util-visit-parents"; - packageName = "unist-util-visit-parents"; - version = "6.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz"; - sha512 = "L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="; - }; - }; - "util-deprecate-1.0.2" = { - name = "util-deprecate"; - packageName = "util-deprecate"; - version = "1.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"; - sha512 = "EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="; - }; - }; - "v8-compile-cache-lib-3.0.1" = { - name = "v8-compile-cache-lib"; - packageName = "v8-compile-cache-lib"; - version = "3.0.1"; - src = fetchurl { - url = "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"; - sha512 = "wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="; - }; - }; - "vfile-6.0.3" = { - name = "vfile"; - packageName = "vfile"; - version = "6.0.3"; - src = fetchurl { - url = "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz"; - sha512 = "KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="; - }; - }; - "vfile-message-4.0.2" = { - name = "vfile-message"; - packageName = "vfile-message"; - version = "4.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz"; - sha512 = "jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="; - }; - }; - "which-2.0.2" = { - name = "which"; - packageName = "which"; - version = "2.0.2"; - src = fetchurl { - url = "https://registry.npmjs.org/which/-/which-2.0.2.tgz"; - sha512 = "BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="; - }; - }; - "wrap-ansi-8.1.0" = { - name = "wrap-ansi"; - packageName = "wrap-ansi"; - version = "8.1.0"; - src = fetchurl { - url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"; - sha512 = "si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="; - }; - }; - "wrap-ansi-cjs-7.0.0" = { - name = "wrap-ansi-cjs"; - packageName = "wrap-ansi-cjs"; - version = "7.0.0"; - src = fetchurl { - url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"; - sha512 = "YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="; - }; - }; - "yaml-2.6.0" = { - name = "yaml"; - packageName = "yaml"; - version = "2.6.0"; - src = fetchurl { - url = "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz"; - sha512 = "a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ=="; - }; - }; - "yn-3.1.1" = { - name = "yn"; - packageName = "yn"; - version = "3.1.1"; - src = fetchurl { - url = "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"; - sha512 = "Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="; - }; - }; - "zwitch-2.0.4" = { - name = "zwitch"; - packageName = "zwitch"; - version = "2.0.4"; - src = fetchurl { - url = "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz"; - sha512 = "bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="; - }; - }; - }; + sources = {}; args = { name = "zoeys-computer-assets"; packageName = "zoeys-computer-assets"; src = ./.; - dependencies = [ - sources."@alloc/quick-lru-5.2.0" - sources."@catppuccin/tailwindcss-0.1.6" - (sources."@cspotcode/source-map-support-0.8.1" // { - dependencies = [ - sources."@jridgewell/trace-mapping-0.3.9" - ]; - }) - sources."@esbuild/linux-x64-0.24.0" - sources."@isaacs/cliui-8.0.2" - sources."@jridgewell/gen-mapping-0.3.5" - sources."@jridgewell/resolve-uri-3.1.2" - sources."@jridgewell/set-array-1.2.1" - sources."@jridgewell/sourcemap-codec-1.5.0" - sources."@jridgewell/trace-mapping-0.3.25" - sources."@nodelib/fs.scandir-2.1.5" - sources."@nodelib/fs.stat-2.0.5" - sources."@nodelib/fs.walk-1.2.8" - sources."@shikijs/core-1.22.0" - sources."@shikijs/engine-javascript-1.22.0" - sources."@shikijs/engine-oniguruma-1.22.0" - sources."@shikijs/types-1.22.0" - sources."@shikijs/vscode-textmate-9.3.0" - sources."@swc/core-1.7.39" - sources."@swc/counter-0.1.3" - sources."@swc/helpers-0.5.13" - sources."@swc/types-0.1.13" - sources."@swc/wasm-1.7.39" - sources."@tailwindcss/forms-0.5.9" - sources."@tsconfig/node10-1.0.11" - sources."@tsconfig/node12-1.0.11" - sources."@tsconfig/node14-1.0.3" - sources."@tsconfig/node16-1.0.4" - sources."@types/hast-3.0.4" - sources."@types/mdast-4.0.4" - sources."@types/node-22.7.8" - sources."@types/unist-3.0.3" - sources."@ungap/structured-clone-1.2.0" - sources."acorn-8.13.0" - sources."acorn-walk-8.3.4" - sources."ansi-regex-5.0.1" - sources."ansi-styles-6.2.1" - sources."any-promise-1.3.0" - sources."anymatch-3.1.3" - sources."arg-5.0.2" - sources."balanced-match-1.0.2" - sources."binary-extensions-2.3.0" - sources."brace-expansion-2.0.1" - sources."braces-3.0.3" - sources."camelcase-css-2.0.1" - sources."ccount-2.0.1" - sources."character-entities-html4-2.1.0" - sources."character-entities-legacy-3.0.0" - (sources."chokidar-3.6.0" // { - dependencies = [ - sources."glob-parent-5.1.2" - ]; - }) - sources."color-convert-2.0.1" - sources."color-name-1.1.4" - sources."comma-separated-tokens-2.0.3" - sources."commander-4.1.1" - sources."create-require-1.1.1" - sources."cross-spawn-7.0.3" - sources."cssesc-3.0.0" - sources."dequal-2.0.3" - sources."devlop-1.1.0" - sources."didyoumean-1.2.2" - sources."diff-4.0.2" - sources."dlv-1.1.3" - sources."eastasianwidth-0.2.0" - sources."emoji-regex-9.2.2" - sources."esbuild-0.24.0" - (sources."fast-glob-3.3.2" // { - dependencies = [ - sources."glob-parent-5.1.2" - ]; - }) - sources."fastq-1.17.1" - sources."fill-range-7.1.1" - sources."foreground-child-3.3.0" - sources."function-bind-1.1.2" - sources."glob-10.4.5" - sources."glob-parent-6.0.2" - sources."hasown-2.0.2" - sources."hast-util-to-html-9.0.3" - sources."hast-util-whitespace-3.0.0" - sources."html-void-elements-3.0.0" - sources."is-binary-path-2.1.0" - sources."is-core-module-2.15.1" - sources."is-extglob-2.1.1" - sources."is-fullwidth-code-point-3.0.0" - sources."is-glob-4.0.3" - sources."is-number-7.0.0" - sources."isexe-2.0.0" - sources."jackspeak-3.4.3" - sources."jiti-1.21.6" - sources."lilconfig-2.1.0" - sources."lines-and-columns-1.2.4" - sources."lru-cache-10.4.3" - sources."make-error-1.3.6" - sources."mdast-util-to-hast-13.2.0" - sources."merge2-1.4.1" - sources."micromark-util-character-2.1.0" - sources."micromark-util-encode-2.0.0" - sources."micromark-util-sanitize-uri-2.0.0" - sources."micromark-util-symbol-2.0.0" - sources."micromark-util-types-2.0.0" - sources."micromatch-4.0.8" - sources."mini-svg-data-uri-1.4.4" - sources."minimatch-9.0.5" - sources."minipass-7.1.2" - sources."mz-2.7.0" - sources."nanoid-3.3.7" - sources."normalize-path-3.0.0" - sources."object-assign-4.1.1" - sources."object-hash-3.0.0" - sources."oniguruma-to-js-0.4.3" - sources."package-json-from-dist-1.0.1" - sources."path-key-3.1.1" - sources."path-parse-1.0.7" - sources."path-scurry-1.11.1" - sources."phoenix-1.7.14" - sources."phoenix_html-3.3.4" - sources."phoenix_live_view-1.0.0-rc.7" - sources."picocolors-1.1.1" - sources."picomatch-2.3.1" - sources."pify-2.3.0" - sources."pirates-4.0.6" - sources."postcss-8.4.47" - sources."postcss-import-15.1.0" - sources."postcss-js-4.0.1" - (sources."postcss-load-config-4.0.2" // { - dependencies = [ - sources."lilconfig-3.1.2" - ]; - }) - sources."postcss-nested-6.2.0" - sources."postcss-selector-parser-6.1.2" - sources."postcss-value-parser-4.2.0" - sources."property-information-6.5.0" - sources."queue-microtask-1.2.3" - sources."read-cache-1.0.0" - sources."readdirp-3.6.0" - sources."regex-4.3.3" - sources."resolve-1.22.8" - sources."reusify-1.0.4" - sources."run-parallel-1.2.0" - sources."shebang-command-2.0.0" - sources."shebang-regex-3.0.0" - sources."shiki-1.22.0" - sources."signal-exit-4.1.0" - sources."source-map-js-1.2.1" - sources."space-separated-tokens-2.0.2" - sources."string-width-5.1.2" - (sources."string-width-cjs-4.2.3" // { - dependencies = [ - sources."emoji-regex-8.0.0" - sources."strip-ansi-6.0.1" - ]; - }) - sources."stringify-entities-4.0.4" - (sources."strip-ansi-7.1.0" // { - dependencies = [ - sources."ansi-regex-6.1.0" - ]; - }) - sources."strip-ansi-cjs-6.0.1" - sources."sucrase-3.35.0" - sources."supports-preserve-symlinks-flag-1.0.0" - sources."tailwindcss-3.4.14" - sources."thenify-3.3.1" - sources."thenify-all-1.6.0" - sources."to-regex-range-5.0.1" - sources."trim-lines-3.0.1" - sources."ts-interface-checker-0.1.13" - (sources."ts-node-10.9.2" // { - dependencies = [ - sources."arg-4.1.3" - ]; - }) - sources."tslib-2.8.0" - sources."typescript-5.6.3" - sources."undici-types-6.19.8" - sources."unist-util-is-6.0.0" - sources."unist-util-position-5.0.0" - sources."unist-util-stringify-position-4.0.0" - sources."unist-util-visit-5.0.0" - sources."unist-util-visit-parents-6.0.1" - sources."util-deprecate-1.0.2" - sources."v8-compile-cache-lib-3.0.1" - sources."vfile-6.0.3" - sources."vfile-message-4.0.2" - sources."which-2.0.2" - sources."wrap-ansi-8.1.0" - (sources."wrap-ansi-cjs-7.0.0" // { - dependencies = [ - sources."ansi-styles-4.3.0" - sources."emoji-regex-8.0.0" - sources."string-width-4.2.3" - sources."strip-ansi-6.0.1" - ]; - }) - sources."yaml-2.6.0" - sources."yn-3.1.1" - sources."zwitch-2.0.4" - ]; buildInputs = globalBuildInputs; meta = { }; production = true; bypassCache = true; - reconstructLock = true; + reconstructLock = false; }; in { diff --git a/assets/package-lock.json b/assets/package-lock.json index ad4288c..e8ff1de 100644 --- a/assets/package-lock.json +++ b/assets/package-lock.json @@ -10,11 +10,13 @@ "@esbuild/linux-x64": "^0.24.0", "@tailwindcss/forms": "^0.5.9", "esbuild": "^0.24.0", + "i": "^0.3.7", "phoenix": "^1.7.14", "phoenix_html": "^3.3.4", "phoenix_live_view": "^1.0.0-rc.7", - "shiki": "^1.22.0", - "tailwindcss": "^3.4.14" + "shiki": "^1.22.1", + "tailwindcss": "^3.4.14", + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@types/phoenix": "^1.6.5", @@ -536,44 +538,44 @@ } }, "node_modules/@shikijs/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz", - "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.1.tgz", + "integrity": "sha512-bqAhT/Ri5ixV4oYsvJNH8UJjpjbINWlWyXY6tBTsP4OmD6XnFv43nRJ+lTdxd2rmG5pgam/x+zGR6kLRXrpEKA==", "license": "MIT", "dependencies": { - "@shikijs/engine-javascript": "1.22.0", - "@shikijs/engine-oniguruma": "1.22.0", - "@shikijs/types": "1.22.0", + "@shikijs/engine-javascript": "1.22.1", + "@shikijs/engine-oniguruma": "1.22.1", + "@shikijs/types": "1.22.1", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.3" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz", - "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.1.tgz", + "integrity": "sha512-540pyoy0LWe4jj2BVbgELwOFu1uFvRI7lg4hdsExrSXA9x7gqfzZ/Nnh4RfX86aDAgJ647gx4TCmRwACbnQSvw==", "license": "MIT", "dependencies": { - "@shikijs/types": "1.22.0", + "@shikijs/types": "1.22.1", "@shikijs/vscode-textmate": "^9.3.0", "oniguruma-to-js": "0.4.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz", - "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.1.tgz", + "integrity": "sha512-L+1Vmd+a2kk8HtogUFymQS6BjUfJnzcWoUp1BUgxoDiklbKSMvrsMuLZGevTOP1m0rEjgnC5MsDmsr8lX1lC+Q==", "license": "MIT", "dependencies": { - "@shikijs/types": "1.22.0", + "@shikijs/types": "1.22.1", "@shikijs/vscode-textmate": "^9.3.0" } }, "node_modules/@shikijs/types": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz", - "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.1.tgz", + "integrity": "sha512-+45f8mu/Hxqs6Kyhfm98Nld5n7Q7lwhjU8UtdQwrOPs7BnM4VAb929O3IQ2ce+4D7SlNFlZGd8CnKRSnwbQreQ==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^9.3.0", @@ -1134,6 +1136,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1858,15 +1868,15 @@ } }, "node_modules/shiki": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz", - "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.1.tgz", + "integrity": "sha512-PbJ6XxrWLMwB2rm3qdjIHNm3zq4SfFnOx0B3rEoi4AN8AUngsdyZ1tRe5slMPtn6jQkbUURLNZPpLR7Do3k78g==", "license": "MIT", "dependencies": { - "@shikijs/core": "1.22.0", - "@shikijs/engine-javascript": "1.22.0", - "@shikijs/engine-oniguruma": "1.22.0", - "@shikijs/types": "1.22.0", + "@shikijs/core": "1.22.1", + "@shikijs/engine-javascript": "1.22.1", + "@shikijs/engine-oniguruma": "1.22.1", + "@shikijs/types": "1.22.1", "@shikijs/vscode-textmate": "^9.3.0", "@types/hast": "^3.0.4" } @@ -2083,6 +2093,15 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", diff --git a/assets/package.json b/assets/package.json index 32ad0f3..2952499 100644 --- a/assets/package.json +++ b/assets/package.json @@ -11,11 +11,13 @@ "@esbuild/linux-x64": "^0.24.0", "@tailwindcss/forms": "^0.5.9", "esbuild": "^0.24.0", + "i": "^0.3.7", "phoenix": "^1.7.14", "phoenix_html": "^3.3.4", "phoenix_live_view": "^1.0.0-rc.7", - "shiki": "^1.22.0", - "tailwindcss": "^3.4.14" + "shiki": "^1.22.1", + "tailwindcss": "^3.4.14", + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@types/phoenix": "^1.6.5", diff --git a/assets/tailwind.config.js b/assets/tailwind.config.js index 2117d3a..3c3c0e8 100644 --- a/assets/tailwind.config.js +++ b/assets/tailwind.config.js @@ -12,7 +12,45 @@ module.exports = { "../lib/zoeyscomputer_web/**/*.*ex", ], theme: { + fontSize: { + sm: "1rem", + base: "1.2rem", + xl: "1.45rem", + "2xl": "1.563rem", + "3xl": "1.953rem", + "4xl": "2.441rem", + "5xl": "3.052rem", + }, + fontFamily: { + sans: ["Iosevka Web", "monospace"], + }, extend: { + keyframes: { + "fade-in": { + "0%": { opacity: 0 }, + "100%": { opacity: 1 }, + }, + "fade-out": { + "0%": { opacity: 1 }, + "100%": { opacity: 0 }, + }, + "zoom-in": { + "0%": { transform: "scale(0.95)" }, + "100%": { transform: "scale(1)" }, + }, + "zoom-out": { + "0%": { transform: "scale(1)" }, + "100%": { transform: "scale(0.95)" }, + }, + }, + animation: { + "fade-in-0": "fade-in 0.2s ease-in-out", + "fade-in": "fade-in 0.3s ease-in-out", + "fade-out-0": "fade-out 0.2s ease-in-out", + "fade-out": "fade-out 0.3s ease-in-out", + "zoom-in-95": "zoom-in 0.2s ease-in-out", + "zoom-out-95": "zoom-out 0.2s ease-in-out", + }, colors: { brand: "#FD4F00", }, @@ -25,6 +63,7 @@ module.exports = { // //
// + require("tailwindcss-animate"), require("@catppuccin/tailwindcss")({ prefix: "ctp", defaultFlavor: "mocha", diff --git a/lib/zoeyscomputer/gists.ex b/lib/zoeyscomputer/gists.ex new file mode 100644 index 0000000..6951c36 --- /dev/null +++ b/lib/zoeyscomputer/gists.ex @@ -0,0 +1,104 @@ +defmodule Zoeyscomputer.Gists do + @moduledoc """ + The Gists context. + """ + + import Ecto.Query, warn: false + alias Zoeyscomputer.Repo + + alias Zoeyscomputer.Gists.Gist + + @doc """ + Returns the list of gists. + + ## Examples + + iex> list_gists() + [%Gist{}, ...] + + """ + def list_gists do + Repo.all(Gist) + end + + @doc """ + Gets a single gist. + + Raises `Ecto.NoResultsError` if the Gist does not exist. + + ## Examples + + iex> get_gist!(123) + %Gist{} + + iex> get_gist!(456) + ** (Ecto.NoResultsError) + + """ + def get_gist!(id), do: Repo.get!(Gist, id) + + @doc """ + Creates a gist. + + ## Examples + + iex> create_gist(%{field: value}) + {:ok, %Gist{}} + + iex> create_gist(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_gist(attrs \\ %{}) do + %Gist{} + |> Gist.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a gist. + + ## Examples + + iex> update_gist(gist, %{field: new_value}) + {:ok, %Gist{}} + + iex> update_gist(gist, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_gist(%Gist{} = gist, attrs) do + gist + |> Gist.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a gist. + + ## Examples + + iex> delete_gist(gist) + {:ok, %Gist{}} + + iex> delete_gist(gist) + {:error, %Ecto.Changeset{}} + + """ + def delete_gist(%Gist{} = gist) do + Repo.delete(gist) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking gist changes. + + ## Examples + + iex> change_gist(gist) + %Ecto.Changeset{data: %Gist{}} + + """ + def change_gist(%Gist{} = gist, attrs \\ %{}) do + Gist.changeset(gist, attrs) + end +end diff --git a/lib/zoeyscomputer/gists/gist.ex b/lib/zoeyscomputer/gists/gist.ex new file mode 100644 index 0000000..3cd67df --- /dev/null +++ b/lib/zoeyscomputer/gists/gist.ex @@ -0,0 +1,18 @@ +defmodule Zoeyscomputer.Gists.Gist do + use Ecto.Schema + import Ecto.Changeset + + schema "gists" do + field :code, :string + field :lang, :string + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(gist, attrs) do + gist + |> cast(attrs, [:code, :lang]) + |> validate_required([:code, :lang]) + end +end diff --git a/lib/zoeyscomputer_web/components/code_block.ex b/lib/zoeyscomputer_web/components/code_block.ex new file mode 100644 index 0000000..2217398 --- /dev/null +++ b/lib/zoeyscomputer_web/components/code_block.ex @@ -0,0 +1,93 @@ +defmodule ZoeyscomputerWeb.CodeBlock do + use Phoenix.Component + alias Phoenix.LiveView.JS + + @moduledoc """ + A code block component with syntax highlighting using Shiki. + + ## Features: + - Syntax highlighting with Shiki + - Optional line numbers + - Optional highlighted lines + - Optional title + - Copy button + - Catppuccin theme styling + """ + + @doc """ + Renders a code block with syntax highlighting. + + ## Examples + + <.code_block + code="def hello, do: :world" + language="elixir" + title="Example Code" + line_numbers={true} + highlighted_lines={[1, 3]} + /> + + ## Options + * `:code` - Required. The code string to highlight + * `:language` - Required. Programming language for syntax highlighting + * `:title` - Optional. Title displayed above the code block + * `:line_numbers` - Optional. Show line numbers (default: false) + * `:highlighted_lines` - Optional. List of line numbers to highlight + """ + attr :code, :string, required: true + attr :language, :string, required: true + attr :title, :string, default: nil + attr :line_numbers, :boolean, default: false + attr :highlighted_lines, :list, default: [] + + def code_block(assigns) do + # Calculate the number of lines for line numbers + assigns = assign(assigns, :num_lines, String.split(assigns.code, "\n") |> length()) + + ~H""" +
+ <%= if @title do %> +
+

<%= @title %>

+
+ <% end %> + +
+ <%= if @line_numbers do %> +
+ <%= for line_num <- 1..@num_lines do %> + + <%= line_num %> + + <% end %> +
+ <% end %> + +
+
<%= @code %>
+
+
+ +
+ +
+
+ """ + end +end diff --git a/lib/zoeyscomputer_web/components/layouts/app.html.heex b/lib/zoeyscomputer_web/components/layouts/app.html.heex index 55cd5d1..3f97e57 100644 --- a/lib/zoeyscomputer_web/components/layouts/app.html.heex +++ b/lib/zoeyscomputer_web/components/layouts/app.html.heex @@ -1,29 +1,3 @@ -<%!--
--%> -<%!-- --%> -<%!--
--%>
<.flash_group flash={@flash} /> diff --git a/lib/zoeyscomputer_web/components/layouts/root.html.heex b/lib/zoeyscomputer_web/components/layouts/root.html.heex index 730204b..6b3f424 100644 --- a/lib/zoeyscomputer_web/components/layouts/root.html.heex +++ b/lib/zoeyscomputer_web/components/layouts/root.html.heex @@ -8,20 +8,37 @@ <%= assigns[:page_title] || "" %> + - + <%= if @current_user do %>
-
+
<.link - class="text-ctp-mauve font-bold hover:border-b-2 border-ctp-mauve" + class="text-ctp-mauve text-sm font-bold hover:border-b-2 border-ctp-mauve" navigate={~p"/"} > zoey
+
+ <.link + class="text-ctp-pink text-sm hover:border-b-2 border-ctp-pink" + navigate={~p"/images"} + > + image + +
+
+ <.link + class="text-ctp-pink text-sm hover:border-b-2 border-ctp-pink" + navigate={~p"/gists"} + > + gists + +
  • <%= @current_user.email %> diff --git a/lib/zoeyscomputer_web/components/searchable_dropdown.ex b/lib/zoeyscomputer_web/components/searchable_dropdown.ex new file mode 100644 index 0000000..94a5152 --- /dev/null +++ b/lib/zoeyscomputer_web/components/searchable_dropdown.ex @@ -0,0 +1,81 @@ +defmodule ZoeyscomputerWeb.SearchableDropdown do + use Phoenix.Component + alias Phoenix.LiveView.JS + + attr :id, :string, required: true + attr :options, :list, required: true + attr :selected, :string, default: nil + attr :class, :string, default: nil + attr :name, :string, required: true + attr :form, :any, required: true + + def searchable_dropdown(assigns) do + ~H""" +
    +
    + + + +
    +
    + """ + end +end diff --git a/lib/zoeyscomputer_web/controllers/gist_controller.ex b/lib/zoeyscomputer_web/controllers/gist_controller.ex new file mode 100644 index 0000000..138da01 --- /dev/null +++ b/lib/zoeyscomputer_web/controllers/gist_controller.ex @@ -0,0 +1,43 @@ +defmodule ZoeyscomputerWeb.GistController do + use ZoeyscomputerWeb, :controller + + alias Zoeyscomputer.Gists + alias Zoeyscomputer.Gists.Gist + + action_fallback ZoeyscomputerWeb.FallbackController + + def index(conn, _params) do + gists = Gists.list_gists() + render(conn, :index, gists: gists) + end + + def create(conn, %{"gist" => gist_params}) do + with {:ok, %Gist{} = gist} <- Gists.create_gist(gist_params) do + conn + |> put_status(:created) + |> put_resp_header("location", ~p"/api/gists/#{gist}") + |> render(:show, gist: gist) + end + end + + def show(conn, %{"id" => id}) do + gist = Gists.get_gist!(id) + render(conn, :show, gist: gist) + end + + def update(conn, %{"id" => id, "gist" => gist_params}) do + gist = Gists.get_gist!(id) + + with {:ok, %Gist{} = gist} <- Gists.update_gist(gist, gist_params) do + render(conn, :show, gist: gist) + end + end + + def delete(conn, %{"id" => id}) do + gist = Gists.get_gist!(id) + + with {:ok, %Gist{}} <- Gists.delete_gist(gist) do + send_resp(conn, :no_content, "") + end + end +end diff --git a/lib/zoeyscomputer_web/controllers/gist_json.ex b/lib/zoeyscomputer_web/controllers/gist_json.ex new file mode 100644 index 0000000..aaea474 --- /dev/null +++ b/lib/zoeyscomputer_web/controllers/gist_json.ex @@ -0,0 +1,25 @@ +defmodule ZoeyscomputerWeb.GistJSON do + alias Zoeyscomputer.Gists.Gist + + @doc """ + Renders a list of gists. + """ + def index(%{gists: gists}) do + %{data: for(gist <- gists, do: data(gist))} + end + + @doc """ + Renders a single gist. + """ + def show(%{gist: gist}) do + %{data: data(gist)} + end + + defp data(%Gist{} = gist) do + %{ + id: gist.id, + code: gist.code, + lang: gist.lang + } + end +end diff --git a/lib/zoeyscomputer_web/controllers/page_html/home.html.heex b/lib/zoeyscomputer_web/controllers/page_html/home.html.heex deleted file mode 100644 index 8975782..0000000 --- a/lib/zoeyscomputer_web/controllers/page_html/home.html.heex +++ /dev/null @@ -1,9 +0,0 @@ -
    -
    -

    zoey

    -

    Software Engineer 🏳️‍⚧️

    -

    - Currently cooking this up, stay tuned... in the meantime, you can monitor my server's resources. -

    -
    -
    diff --git a/lib/zoeyscomputer_web/live/gist_live/form_component.ex b/lib/zoeyscomputer_web/live/gist_live/form_component.ex new file mode 100644 index 0000000..ad6039b --- /dev/null +++ b/lib/zoeyscomputer_web/live/gist_live/form_component.ex @@ -0,0 +1,83 @@ +defmodule ZoeyscomputerWeb.GistLive.FormComponent do + use ZoeyscomputerWeb, :live_component + + alias Zoeyscomputer.Gists + + @impl true + def render(assigns) do + ~H""" +
    + <.header> + <%= @title %> + <:subtitle>Use this form to manage gist records in your database. + + + <.simple_form + for={@form} + id="gist-form" + phx-target={@myself} + phx-change="validate" + phx-submit="save" + > + <.input field={@form[:code]} type="text" label="Code" /> + <.input field={@form[:lang]} type="text" label="Lang" /> + <:actions> + <.button phx-disable-with="Saving...">Save Gist + + +
    + """ + end + + @impl true + def update(%{gist: gist} = assigns, socket) do + {:ok, + socket + |> assign(assigns) + |> assign_new(:form, fn -> + to_form(Gists.change_gist(gist)) + end)} + end + + @impl true + def handle_event("validate", %{"gist" => gist_params}, socket) do + changeset = Gists.change_gist(socket.assigns.gist, gist_params) + {:noreply, assign(socket, form: to_form(changeset, action: :validate))} + end + + def handle_event("save", %{"gist" => gist_params}, socket) do + save_gist(socket, socket.assigns.action, gist_params) + end + + defp save_gist(socket, :edit, gist_params) do + case Gists.update_gist(socket.assigns.gist, gist_params) do + {:ok, gist} -> + notify_parent({:saved, gist}) + + {:noreply, + socket + |> put_flash(:info, "Gist updated successfully") + |> push_patch(to: socket.assigns.patch)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign(socket, form: to_form(changeset))} + end + end + + defp save_gist(socket, :new, gist_params) do + case Gists.create_gist(gist_params) do + {:ok, gist} -> + notify_parent({:saved, gist}) + + {:noreply, + socket + |> put_flash(:info, "Gist created successfully") + |> push_patch(to: socket.assigns.patch)} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign(socket, form: to_form(changeset))} + end + end + + defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) +end diff --git a/lib/zoeyscomputer_web/live/gist_live/index.ex b/lib/zoeyscomputer_web/live/gist_live/index.ex new file mode 100644 index 0000000..607c8d4 --- /dev/null +++ b/lib/zoeyscomputer_web/live/gist_live/index.ex @@ -0,0 +1,47 @@ +defmodule ZoeyscomputerWeb.GistLive.Index do + use ZoeyscomputerWeb, :live_view + + alias Zoeyscomputer.Gists + alias Zoeyscomputer.Gists.Gist + + @impl true + def mount(_params, _session, socket) do + {:ok, stream(socket, :gists, Gists.list_gists())} + end + + @impl true + def handle_params(params, _url, socket) do + {:noreply, apply_action(socket, socket.assigns.live_action, params)} + end + + defp apply_action(socket, :edit, %{"id" => id}) do + socket + |> assign(:page_title, "Edit Gist") + |> assign(:gist, Gists.get_gist!(id)) + end + + defp apply_action(socket, :new, _params) do + socket + |> assign(:page_title, "New Gist") + |> assign(:gist, %Gist{}) + end + + defp apply_action(socket, :index, _params) do + socket + |> assign(:page_title, "Listing Gists") + |> assign(:gist, nil) + end + + @impl true + def handle_info({ZoeyscomputerWeb.GistLive.FormComponent, {:saved, gist}}, socket) do + {:noreply, stream_insert(socket, :gists, gist)} + end + + @impl true + def handle_event("delete", %{"id" => id}, socket) do + gist = Gists.get_gist!(id) + {:ok, _} = Gists.delete_gist(gist) + + {:noreply, stream_delete(socket, :gists, gist)} + end +end diff --git a/lib/zoeyscomputer_web/live/gist_live/index.html.heex b/lib/zoeyscomputer_web/live/gist_live/index.html.heex new file mode 100644 index 0000000..88b300b --- /dev/null +++ b/lib/zoeyscomputer_web/live/gist_live/index.html.heex @@ -0,0 +1,42 @@ +<.header> + Listing Gists + <:actions> + <.link patch={~p"/gists/new"}> + <.button>New Gist + + + + +<.table + id="gists" + rows={@streams.gists} + row_click={fn {_id, gist} -> JS.navigate(~p"/gists/#{gist}") end} +> + <:col :let={{_id, gist}} label="Code"><%= gist.code %> + <:col :let={{_id, gist}} label="Lang"><%= gist.lang %> + <:action :let={{_id, gist}}> +
    + <.link navigate={~p"/gists/#{gist}"}>Show +
    + <.link patch={~p"/gists/#{gist}/edit"}>Edit + + <:action :let={{id, gist}}> + <.link + phx-click={JS.push("delete", value: %{id: gist.id}) |> hide("##{id}")} + data-confirm="Are you sure?" + > + Delete + + + + +<.modal :if={@live_action in [:new, :edit]} id="gist-modal" show on_cancel={JS.patch(~p"/gists")}> + <.live_component + module={ZoeyscomputerWeb.GistLive.FormComponent} + id={@gist.id || :new} + title={@page_title} + action={@live_action} + gist={@gist} + patch={~p"/gists"} + /> + diff --git a/lib/zoeyscomputer_web/live/gist_live/show.ex b/lib/zoeyscomputer_web/live/gist_live/show.ex new file mode 100644 index 0000000..6013783 --- /dev/null +++ b/lib/zoeyscomputer_web/live/gist_live/show.ex @@ -0,0 +1,21 @@ +defmodule ZoeyscomputerWeb.GistLive.Show do + use ZoeyscomputerWeb, :live_view + + alias Zoeyscomputer.Gists + + @impl true + def mount(_params, _session, socket) do + {:ok, socket} + end + + @impl true + def handle_params(%{"id" => id}, _, socket) do + {:noreply, + socket + |> assign(:page_title, page_title(socket.assigns.live_action)) + |> assign(:gist, Gists.get_gist!(id))} + end + + defp page_title(:show), do: "Show Gist" + defp page_title(:edit), do: "Edit Gist" +end diff --git a/lib/zoeyscomputer_web/live/gist_live/show.html.heex b/lib/zoeyscomputer_web/live/gist_live/show.html.heex new file mode 100644 index 0000000..5a428fd --- /dev/null +++ b/lib/zoeyscomputer_web/live/gist_live/show.html.heex @@ -0,0 +1,27 @@ +<.header> + Gist <%= @gist.id %> + <:subtitle>This is a gist record from your database. + <:actions> + <.link patch={~p"/gists/#{@gist}/show/edit"} phx-click={JS.push_focus()}> + <.button>Edit gist + + + + +<.list> + <:item title="Code"><%= @gist.code %> + <:item title="Lang"><%= @gist.lang %> + + +<.back navigate={~p"/gists"}>Back to gists + +<.modal :if={@live_action == :edit} id="gist-modal" show on_cancel={JS.patch(~p"/gists/#{@gist}")}> + <.live_component + module={ZoeyscomputerWeb.GistLive.FormComponent} + id={@gist.id} + title={@page_title} + action={@live_action} + gist={@gist} + patch={~p"/gists/#{@gist}"} + /> + diff --git a/lib/zoeyscomputer_web/live/home_live.ex b/lib/zoeyscomputer_web/live/home_live.ex index 76005ee..b8b3d5a 100644 --- a/lib/zoeyscomputer_web/live/home_live.ex +++ b/lib/zoeyscomputer_web/live/home_live.ex @@ -1,5 +1,4 @@ defmodule ZoeyscomputerWeb.HomeLive do - alias Hex.API.Key use ZoeyscomputerWeb, :live_view def mount(_params, _session, socket) do @@ -40,8 +39,8 @@ defmodule ZoeyscomputerWeb.HomeLive do def render(assigns) do ~H""" -
    -
    +
    +

    zoey

    Software Engineer 🏳️‍⚧️

    diff --git a/lib/zoeyscomputer_web/live/link_live/form_component.ex b/lib/zoeyscomputer_web/live/link_live/form_component.ex deleted file mode 100644 index 2027d72..0000000 --- a/lib/zoeyscomputer_web/live/link_live/form_component.ex +++ /dev/null @@ -1,82 +0,0 @@ -defmodule ZoeyscomputerWeb.LinkLive.FormComponent do - use ZoeyscomputerWeb, :live_component - - alias Zoeyscomputer.Links - - @impl true - def render(assigns) do - ~H""" -

    - <.header> - <%= @title %> - <:subtitle>Use this form to manage link records in your database. - - - <.simple_form - for={@form} - id="link-form" - phx-target={@myself} - phx-change="validate" - phx-submit="save" - > - <.input field={@form[:url]} type="text" label="Url" /> - <:actions> - <.button phx-disable-with="Saving...">Save Link - - -
    - """ - end - - @impl true - def update(%{link: link} = assigns, socket) do - {:ok, - socket - |> assign(assigns) - |> assign_new(:form, fn -> - to_form(Links.change_link(link)) - end)} - end - - @impl true - def handle_event("validate", %{"link" => link_params}, socket) do - changeset = Links.change_link(socket.assigns.link, link_params) - {:noreply, assign(socket, form: to_form(changeset, action: :validate))} - end - - def handle_event("save", %{"link" => link_params}, socket) do - save_link(socket, socket.assigns.action, link_params) - end - - defp save_link(socket, :edit, link_params) do - case Links.update_link(socket.assigns.link, link_params) do - {:ok, link} -> - notify_parent({:saved, link}) - - {:noreply, - socket - |> put_flash(:info, "Link updated successfully") - |> push_patch(to: socket.assigns.patch)} - - {:error, %Ecto.Changeset{} = changeset} -> - {:noreply, assign(socket, form: to_form(changeset))} - end - end - - defp save_link(socket, :new, link_params) do - case Links.create_link(link_params) do - {:ok, link} -> - notify_parent({:saved, link}) - - {:noreply, - socket - |> put_flash(:info, "Link created successfully") - |> push_patch(to: socket.assigns.patch)} - - {:error, %Ecto.Changeset{} = changeset} -> - {:noreply, assign(socket, form: to_form(changeset))} - end - end - - defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) -end diff --git a/lib/zoeyscomputer_web/live/link_live/index.ex b/lib/zoeyscomputer_web/live/link_live/index.ex deleted file mode 100644 index 5b3c939..0000000 --- a/lib/zoeyscomputer_web/live/link_live/index.ex +++ /dev/null @@ -1,39 +0,0 @@ -defmodule ZoeyscomputerWeb.LinkLive.Index do - use ZoeyscomputerWeb, :live_view - - alias Zoeyscomputer.Links - - def mount(_params, _session, socket) do - user_id = socket.assigns.current_user.id - - changeset = Links.Link.changeset(%Links.Link{}) - - socket = - socket - |> assign(:links, Links.list_links(user_id)) - |> assign(:form, to_form(changeset)) - - {:ok, socket} - end - - def handle_event("submit", %{"link" => link_params}, socket) do - params = - link_params - |> Map.put("user_id", socket.assigns.current_user.id) - - case Links.create_link(params) do - {:ok, link} -> - socket = - socket - |> assign(:links, [link | socket.assigns.links]) - - {:noreply, socket} - - {:error, changeset} -> - socket - |> assign(:form, to_form(changeset)) - - {:noreply, socket} - end - end -end diff --git a/lib/zoeyscomputer_web/live/link_live/index.html.heex b/lib/zoeyscomputer_web/live/link_live/index.html.heex deleted file mode 100644 index 7b5671b..0000000 --- a/lib/zoeyscomputer_web/live/link_live/index.html.heex +++ /dev/null @@ -1,30 +0,0 @@ -
    -

    Links

    - - <.link - navigate={~p"/links/new"} - class="bg-black border border-black hover:bg-gray-700 text-white font-bold py-2 px-3 rounded-md" - > - Add Link - -
    - -
    -
    -
    -
    <%= link.url %>
    -
    <%= link.inserted_at %>
    -
    -
    -
    - -<.form for={@form} phx-submit="submit"> -
    -
    - <.input field={@form[:url]} type="text" label="url" /> -
    - -
    - diff --git a/lib/zoeyscomputer_web/live/link_live/new.ex b/lib/zoeyscomputer_web/live/link_live/new.ex deleted file mode 100644 index 41e4398..0000000 --- a/lib/zoeyscomputer_web/live/link_live/new.ex +++ /dev/null @@ -1,37 +0,0 @@ -defmodule ZoeyscomputerWeb.LinkLive.New do - use ZoeyscomputerWeb, :live_view - - alias Zoeyscomputer.Links - - def mount(_params, _session, socket) do - changeset = Links.Link.changeset(%Links.Link{}) - - socket = - socket - |> assign(:form, to_form(changeset)) - - {:ok, socket} - end - - def handle_event("submit", %{"link" => link_params}, socket) do - params = - link_params - |> Map.put("user_id", socket.assigns.current_user.id) - - case Links.create_link(params) do - {:ok, _link} -> - socket = - socket - |> put_flash(:info, "Link created successfully") - |> push_navigate(to: ~p"/links") - - {:noreply, socket} - - {:error, changeset} -> - socket - |> assign(:form, to_form(changeset)) - - {:noreply, socket} - end - end -end diff --git a/lib/zoeyscomputer_web/live/link_live/new.html.heex b/lib/zoeyscomputer_web/live/link_live/new.html.heex deleted file mode 100644 index e901859..0000000 --- a/lib/zoeyscomputer_web/live/link_live/new.html.heex +++ /dev/null @@ -1,12 +0,0 @@ -

    Create a new link

    - -<.form for={@form} phx-submit="submit"> -
    -
    - <.input field={@form[:url]} type="text" label="url" /> -
    - -
    - diff --git a/lib/zoeyscomputer_web/plugs/discord_handler.ex b/lib/zoeyscomputer_web/plugs/discord_handler.ex index 5a89cd5..307b0b3 100644 --- a/lib/zoeyscomputer_web/plugs/discord_handler.ex +++ b/lib/zoeyscomputer_web/plugs/discord_handler.ex @@ -1,6 +1,5 @@ defmodule ZoeyscomputerWeb.DiscordHandler do require Logger - alias ElixirSense.Log alias ExAws.S3 import Plug.Conn import Mogrify @@ -15,7 +14,7 @@ defmodule ZoeyscomputerWeb.DiscordHandler do def call(%{path_info: ["images", _id | _]} = conn, _opts) do user_agent = List.first(get_req_header(conn, "user-agent")) - request_id = Logger.metadata()[:request_id] + Logger.metadata()[:request_id] Logger.info("Processing image request:\n user_agent: #{user_agent}") diff --git a/lib/zoeyscomputer_web/router.ex b/lib/zoeyscomputer_web/router.ex index 1d5a3ac..51b2023 100644 --- a/lib/zoeyscomputer_web/router.ex +++ b/lib/zoeyscomputer_web/router.ex @@ -1,6 +1,5 @@ defmodule ZoeyscomputerWeb.Router do require Logger - alias ExAws.S3 use ZoeyscomputerWeb, :router import ZoeyscomputerWeb.UserAuth @@ -29,9 +28,11 @@ defmodule ZoeyscomputerWeb.Router do pipe_through :api resources "/images", ImageController, except: [:create, :edit] + resources "/gists", GistController, except: [:new, :edit] pipe_through [:api_authentication] post "/images/create", ImageController, :create + post "/gists/create", GistController, :create end # Enable LiveDashboard and Swoosh mailbox preview in development @@ -77,15 +78,17 @@ defmodule ZoeyscomputerWeb.Router do on_mount: [{ZoeyscomputerWeb.UserAuth, :ensure_authenticated}] do live "/users/settings", UserSettingsLive, :edit live "/users/settings/confirm_email/:token", UserSettingsLive, :confirm_email - live "/links", LinkLive.Index - live "/links/new", LinkLive.New live "/images/new", ImageLive.Index, :new + live "/gists/new", GistLive.Index, :new live "/images/:id/edit", ImageLive.Index, :edit + live "/gists/:id/edit", GistLive.Index, :edit live "/images", ImageLive.Index, :index + live "/gists", GistLive.Index live "/images/:id/show/edit", ImageLive.Show, :edit + live "/gists/:id/show/edit", GistLive.Show, :edit live "/api-keys", ApiKeyLive.Index, :index live "/api-keys/new", ApiKeyLive.Index, :new @@ -108,27 +111,7 @@ defmodule ZoeyscomputerWeb.Router do live "/", HomeLive, :index live "/images/:id", ImageLive.Show, :show - end - end - - scope "/", ZoeyscomputerWeb do - pipe_through [:browser, :require_authenticated_user] - end - - defp download_from_s3(bucket, key) do - case S3.get_object(bucket, key) |> ExAws.request() do - {:ok, %{body: image_binary, headers: headers}} -> - content_type = - Enum.find_value(headers, fn - {"Content-Type", value} -> value - {"content-type", value} -> value - _ -> nil - end) - - {:ok, image_binary, content_type || "application/octet-stream"} - - error -> - error + live "/gists/:id", GistLive.Show, :show end end end diff --git a/priv/repo/migrations/20241026033548_create_gists.exs b/priv/repo/migrations/20241026033548_create_gists.exs new file mode 100644 index 0000000..e332df0 --- /dev/null +++ b/priv/repo/migrations/20241026033548_create_gists.exs @@ -0,0 +1,12 @@ +defmodule Zoeyscomputer.Repo.Migrations.CreateGists do + use Ecto.Migration + + def change do + create table(:gists) do + add :code, :string + add :lang, :string + + timestamps(type: :utc_datetime) + end + end +end diff --git a/priv/repo/migrations/20241026035058_remove_links.exs b/priv/repo/migrations/20241026035058_remove_links.exs new file mode 100644 index 0000000..2859699 --- /dev/null +++ b/priv/repo/migrations/20241026035058_remove_links.exs @@ -0,0 +1,7 @@ +defmodule Zoeyscomputer.Repo.Migrations.RemoveLinks do + use Ecto.Migration + + def change do + drop table(:links) + end +end diff --git a/priv/static/fonts/Iosevka.css b/priv/static/fonts/Iosevka.css new file mode 100644 index 0000000..f9f3062 --- /dev/null +++ b/priv/static/fonts/Iosevka.css @@ -0,0 +1,630 @@ + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-Thin.woff2') format('woff2'), url('TTF/Iosevka-Thin.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedThin.woff2') format('woff2'), url('TTF/Iosevka-ExtendedThin.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-ThinOblique.woff2') format('woff2'), url('TTF/Iosevka-ThinOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + src: url('WOFF2/Iosevka-ThinOblique.woff2') format('woff2'), url('TTF/Iosevka-ThinOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedThinOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedThinOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedThinOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedThinOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-ThinItalic.woff2') format('woff2'), url('TTF/Iosevka-ThinItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 100; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedThinItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedThinItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-ExtraLight.woff2') format('woff2'), url('TTF/Iosevka-ExtraLight.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedExtraLight.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraLight.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtraLightOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtraLightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + src: url('WOFF2/Iosevka-ExtraLightOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtraLightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedExtraLightOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraLightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedExtraLightOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraLightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-ExtraLightItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtraLightItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 200; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedExtraLightItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraLightItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-Light.woff2') format('woff2'), url('TTF/Iosevka-Light.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedLight.woff2') format('woff2'), url('TTF/Iosevka-ExtendedLight.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-LightOblique.woff2') format('woff2'), url('TTF/Iosevka-LightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + src: url('WOFF2/Iosevka-LightOblique.woff2') format('woff2'), url('TTF/Iosevka-LightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedLightOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedLightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedLightOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedLightOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-LightItalic.woff2') format('woff2'), url('TTF/Iosevka-LightItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 300; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedLightItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedLightItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-Regular.woff2') format('woff2'), url('TTF/Iosevka-Regular.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-Extended.woff2') format('woff2'), url('TTF/Iosevka-Extended.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-Oblique.woff2') format('woff2'), url('TTF/Iosevka-Oblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + src: url('WOFF2/Iosevka-Oblique.woff2') format('woff2'), url('TTF/Iosevka-Oblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-Italic.woff2') format('woff2'), url('TTF/Iosevka-Italic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 400; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-Medium.woff2') format('woff2'), url('TTF/Iosevka-Medium.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedMedium.woff2') format('woff2'), url('TTF/Iosevka-ExtendedMedium.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-MediumOblique.woff2') format('woff2'), url('TTF/Iosevka-MediumOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + src: url('WOFF2/Iosevka-MediumOblique.woff2') format('woff2'), url('TTF/Iosevka-MediumOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedMediumOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedMediumOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedMediumOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedMediumOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-MediumItalic.woff2') format('woff2'), url('TTF/Iosevka-MediumItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 500; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedMediumItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedMediumItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-SemiBold.woff2') format('woff2'), url('TTF/Iosevka-SemiBold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedSemiBold.woff2') format('woff2'), url('TTF/Iosevka-ExtendedSemiBold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-SemiBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-SemiBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + src: url('WOFF2/Iosevka-SemiBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-SemiBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedSemiBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedSemiBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedSemiBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedSemiBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-SemiBoldItalic.woff2') format('woff2'), url('TTF/Iosevka-SemiBoldItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 600; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedSemiBoldItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedSemiBoldItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-Bold.woff2') format('woff2'), url('TTF/Iosevka-Bold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedBold.woff2') format('woff2'), url('TTF/Iosevka-ExtendedBold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-BoldOblique.woff2') format('woff2'), url('TTF/Iosevka-BoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + src: url('WOFF2/Iosevka-BoldOblique.woff2') format('woff2'), url('TTF/Iosevka-BoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-BoldItalic.woff2') format('woff2'), url('TTF/Iosevka-BoldItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 700; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedBoldItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedBoldItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-ExtraBold.woff2') format('woff2'), url('TTF/Iosevka-ExtraBold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedExtraBold.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraBold.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtraBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtraBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + src: url('WOFF2/Iosevka-ExtraBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtraBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedExtraBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedExtraBoldOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraBoldOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-ExtraBoldItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtraBoldItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 800; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedExtraBoldItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedExtraBoldItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + font-style: normal; + src: url('WOFF2/Iosevka-Heavy.woff2') format('woff2'), url('TTF/Iosevka-Heavy.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + font-style: normal; + src: url('WOFF2/Iosevka-ExtendedHeavy.woff2') format('woff2'), url('TTF/Iosevka-ExtendedHeavy.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + font-style: oblique; + src: url('WOFF2/Iosevka-HeavyOblique.woff2') format('woff2'), url('TTF/Iosevka-HeavyOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + src: url('WOFF2/Iosevka-HeavyOblique.woff2') format('woff2'), url('TTF/Iosevka-HeavyOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + font-style: oblique; + src: url('WOFF2/Iosevka-ExtendedHeavyOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedHeavyOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web Oblique'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + src: url('WOFF2/Iosevka-ExtendedHeavyOblique.woff2') format('woff2'), url('TTF/Iosevka-ExtendedHeavyOblique.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: normal; + font-style: italic; + src: url('WOFF2/Iosevka-HeavyItalic.woff2') format('woff2'), url('TTF/Iosevka-HeavyItalic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Iosevka Web'; + font-display: swap; + font-weight: 900; + font-stretch: expanded; + font-style: italic; + src: url('WOFF2/Iosevka-ExtendedHeavyItalic.woff2') format('woff2'), url('TTF/Iosevka-ExtendedHeavyItalic.ttf') format('truetype'); +} diff --git a/priv/static/fonts/WOFF2/Iosevka-Bold.woff2 b/priv/static/fonts/WOFF2/Iosevka-Bold.woff2 new file mode 100644 index 0000000..56e0dcb Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Bold.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-BoldItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-BoldItalic.woff2 new file mode 100644 index 0000000..fcf38eb Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-BoldItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-BoldOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-BoldOblique.woff2 new file mode 100644 index 0000000..b196a8c Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-BoldOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Extended.woff2 b/priv/static/fonts/WOFF2/Iosevka-Extended.woff2 new file mode 100644 index 0000000..f787e86 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Extended.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedBold.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedBold.woff2 new file mode 100644 index 0000000..937c020 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedBold.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedBoldItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedBoldItalic.woff2 new file mode 100644 index 0000000..2dcd8ee Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedBoldItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedBoldOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedBoldOblique.woff2 new file mode 100644 index 0000000..f7ef500 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedBoldOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBold.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBold.woff2 new file mode 100644 index 0000000..f8abca4 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBold.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBoldItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBoldItalic.woff2 new file mode 100644 index 0000000..120780d Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBoldItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBoldOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBoldOblique.woff2 new file mode 100644 index 0000000..2b4fc38 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraBoldOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLight.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLight.woff2 new file mode 100644 index 0000000..7fcd7cf Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLight.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLightItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLightItalic.woff2 new file mode 100644 index 0000000..91eab54 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLightItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLightOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLightOblique.woff2 new file mode 100644 index 0000000..3c9e13b Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedExtraLightOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavy.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavy.woff2 new file mode 100644 index 0000000..8b65f19 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavy.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavyItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavyItalic.woff2 new file mode 100644 index 0000000..18494df Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavyItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavyOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavyOblique.woff2 new file mode 100644 index 0000000..8ecd7d9 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedHeavyOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedItalic.woff2 new file mode 100644 index 0000000..bb30c88 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedLight.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedLight.woff2 new file mode 100644 index 0000000..cf5f1e7 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedLight.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedLightItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedLightItalic.woff2 new file mode 100644 index 0000000..ed3d9b6 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedLightItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedLightOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedLightOblique.woff2 new file mode 100644 index 0000000..54d64b2 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedLightOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedMedium.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedMedium.woff2 new file mode 100644 index 0000000..5072bc0 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedMedium.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedMediumItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedMediumItalic.woff2 new file mode 100644 index 0000000..425e425 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedMediumItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedMediumOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedMediumOblique.woff2 new file mode 100644 index 0000000..fb7e695 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedMediumOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedOblique.woff2 new file mode 100644 index 0000000..f9dfa26 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBold.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBold.woff2 new file mode 100644 index 0000000..623e28c Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBold.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBoldItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBoldItalic.woff2 new file mode 100644 index 0000000..afcc25e Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBoldItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBoldOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBoldOblique.woff2 new file mode 100644 index 0000000..e2eca29 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedSemiBoldOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedThin.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedThin.woff2 new file mode 100644 index 0000000..2726a84 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedThin.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedThinItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedThinItalic.woff2 new file mode 100644 index 0000000..965fb5f Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedThinItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtendedThinOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtendedThinOblique.woff2 new file mode 100644 index 0000000..8bbdee3 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtendedThinOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtraBold.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtraBold.woff2 new file mode 100644 index 0000000..51e4b52 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtraBold.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtraBoldItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtraBoldItalic.woff2 new file mode 100644 index 0000000..b135255 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtraBoldItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtraBoldOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtraBoldOblique.woff2 new file mode 100644 index 0000000..44d8f11 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtraBoldOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtraLight.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtraLight.woff2 new file mode 100644 index 0000000..8cc815a Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtraLight.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtraLightItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtraLightItalic.woff2 new file mode 100644 index 0000000..2007ee2 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtraLightItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ExtraLightOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ExtraLightOblique.woff2 new file mode 100644 index 0000000..b26ce81 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ExtraLightOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Heavy.woff2 b/priv/static/fonts/WOFF2/Iosevka-Heavy.woff2 new file mode 100644 index 0000000..3db12b1 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Heavy.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-HeavyItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-HeavyItalic.woff2 new file mode 100644 index 0000000..b19a90c Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-HeavyItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-HeavyOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-HeavyOblique.woff2 new file mode 100644 index 0000000..e9a0c2c Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-HeavyOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Italic.woff2 b/priv/static/fonts/WOFF2/Iosevka-Italic.woff2 new file mode 100644 index 0000000..3664251 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Italic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Light.woff2 b/priv/static/fonts/WOFF2/Iosevka-Light.woff2 new file mode 100644 index 0000000..8719016 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Light.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-LightItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-LightItalic.woff2 new file mode 100644 index 0000000..0706cd0 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-LightItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-LightOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-LightOblique.woff2 new file mode 100644 index 0000000..d4b7a76 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-LightOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Medium.woff2 b/priv/static/fonts/WOFF2/Iosevka-Medium.woff2 new file mode 100644 index 0000000..5bc7071 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Medium.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-MediumItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-MediumItalic.woff2 new file mode 100644 index 0000000..633a999 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-MediumItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-MediumOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-MediumOblique.woff2 new file mode 100644 index 0000000..88d144e Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-MediumOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Oblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-Oblique.woff2 new file mode 100644 index 0000000..e08ccbd Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Oblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Regular.woff2 b/priv/static/fonts/WOFF2/Iosevka-Regular.woff2 new file mode 100644 index 0000000..5d674c5 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Regular.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-SemiBold.woff2 b/priv/static/fonts/WOFF2/Iosevka-SemiBold.woff2 new file mode 100644 index 0000000..cc2bc56 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-SemiBold.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-SemiBoldItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-SemiBoldItalic.woff2 new file mode 100644 index 0000000..e085c22 Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-SemiBoldItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-SemiBoldOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-SemiBoldOblique.woff2 new file mode 100644 index 0000000..b78a03b Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-SemiBoldOblique.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-Thin.woff2 b/priv/static/fonts/WOFF2/Iosevka-Thin.woff2 new file mode 100644 index 0000000..d614b5c Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-Thin.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ThinItalic.woff2 b/priv/static/fonts/WOFF2/Iosevka-ThinItalic.woff2 new file mode 100644 index 0000000..0e5c3ae Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ThinItalic.woff2 differ diff --git a/priv/static/fonts/WOFF2/Iosevka-ThinOblique.woff2 b/priv/static/fonts/WOFF2/Iosevka-ThinOblique.woff2 new file mode 100644 index 0000000..f3429fd Binary files /dev/null and b/priv/static/fonts/WOFF2/Iosevka-ThinOblique.woff2 differ diff --git a/test/support/fixtures/gists_fixtures.ex b/test/support/fixtures/gists_fixtures.ex new file mode 100644 index 0000000..9632ded --- /dev/null +++ b/test/support/fixtures/gists_fixtures.ex @@ -0,0 +1,21 @@ +defmodule Zoeyscomputer.GistsFixtures do + @moduledoc """ + This module defines test helpers for creating + entities via the `Zoeyscomputer.Gists` context. + """ + + @doc """ + Generate a gist. + """ + def gist_fixture(attrs \\ %{}) do + {:ok, gist} = + attrs + |> Enum.into(%{ + code: "some code", + lang: "some lang" + }) + |> Zoeyscomputer.Gists.create_gist() + + gist + end +end diff --git a/test/zoeyscomputer/gists_test.exs b/test/zoeyscomputer/gists_test.exs new file mode 100644 index 0000000..8b82545 --- /dev/null +++ b/test/zoeyscomputer/gists_test.exs @@ -0,0 +1,61 @@ +defmodule Zoeyscomputer.GistsTest do + use Zoeyscomputer.DataCase + + alias Zoeyscomputer.Gists + + describe "gists" do + alias Zoeyscomputer.Gists.Gist + + import Zoeyscomputer.GistsFixtures + + @invalid_attrs %{code: nil, lang: nil} + + test "list_gists/0 returns all gists" do + gist = gist_fixture() + assert Gists.list_gists() == [gist] + end + + test "get_gist!/1 returns the gist with given id" do + gist = gist_fixture() + assert Gists.get_gist!(gist.id) == gist + end + + test "create_gist/1 with valid data creates a gist" do + valid_attrs = %{code: "some code", lang: "some lang"} + + assert {:ok, %Gist{} = gist} = Gists.create_gist(valid_attrs) + assert gist.code == "some code" + assert gist.lang == "some lang" + end + + test "create_gist/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Gists.create_gist(@invalid_attrs) + end + + test "update_gist/2 with valid data updates the gist" do + gist = gist_fixture() + update_attrs = %{code: "some updated code", lang: "some updated lang"} + + assert {:ok, %Gist{} = gist} = Gists.update_gist(gist, update_attrs) + assert gist.code == "some updated code" + assert gist.lang == "some updated lang" + end + + test "update_gist/2 with invalid data returns error changeset" do + gist = gist_fixture() + assert {:error, %Ecto.Changeset{}} = Gists.update_gist(gist, @invalid_attrs) + assert gist == Gists.get_gist!(gist.id) + end + + test "delete_gist/1 deletes the gist" do + gist = gist_fixture() + assert {:ok, %Gist{}} = Gists.delete_gist(gist) + assert_raise Ecto.NoResultsError, fn -> Gists.get_gist!(gist.id) end + end + + test "change_gist/1 returns a gist changeset" do + gist = gist_fixture() + assert %Ecto.Changeset{} = Gists.change_gist(gist) + end + end +end diff --git a/test/zoeyscomputer_web/controllers/gist_controller_test.exs b/test/zoeyscomputer_web/controllers/gist_controller_test.exs new file mode 100644 index 0000000..97a0cd3 --- /dev/null +++ b/test/zoeyscomputer_web/controllers/gist_controller_test.exs @@ -0,0 +1,88 @@ +defmodule ZoeyscomputerWeb.GistControllerTest do + use ZoeyscomputerWeb.ConnCase + + import Zoeyscomputer.GistsFixtures + + alias Zoeyscomputer.Gists.Gist + + @create_attrs %{ + code: "some code", + lang: "some lang" + } + @update_attrs %{ + code: "some updated code", + lang: "some updated lang" + } + @invalid_attrs %{code: nil, lang: nil} + + setup %{conn: conn} do + {:ok, conn: put_req_header(conn, "accept", "application/json")} + end + + describe "index" do + test "lists all gists", %{conn: conn} do + conn = get(conn, ~p"/api/gists") + assert json_response(conn, 200)["data"] == [] + end + end + + describe "create gist" do + test "renders gist when data is valid", %{conn: conn} do + conn = post(conn, ~p"/api/gists", gist: @create_attrs) + assert %{"id" => id} = json_response(conn, 201)["data"] + + conn = get(conn, ~p"/api/gists/#{id}") + + assert %{ + "id" => ^id, + "code" => "some code", + "lang" => "some lang" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, ~p"/api/gists", gist: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "update gist" do + setup [:create_gist] + + test "renders gist when data is valid", %{conn: conn, gist: %Gist{id: id} = gist} do + conn = put(conn, ~p"/api/gists/#{gist}", gist: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] + + conn = get(conn, ~p"/api/gists/#{id}") + + assert %{ + "id" => ^id, + "code" => "some updated code", + "lang" => "some updated lang" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn, gist: gist} do + conn = put(conn, ~p"/api/gists/#{gist}", gist: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "delete gist" do + setup [:create_gist] + + test "deletes chosen gist", %{conn: conn, gist: gist} do + conn = delete(conn, ~p"/api/gists/#{gist}") + assert response(conn, 204) + + assert_error_sent 404, fn -> + get(conn, ~p"/api/gists/#{gist}") + end + end + end + + defp create_gist(_) do + gist = gist_fixture() + %{gist: gist} + end +end diff --git a/test/zoeyscomputer_web/live/gist_live_test.exs b/test/zoeyscomputer_web/live/gist_live_test.exs new file mode 100644 index 0000000..64f4535 --- /dev/null +++ b/test/zoeyscomputer_web/live/gist_live_test.exs @@ -0,0 +1,113 @@ +defmodule ZoeyscomputerWeb.GistLiveTest do + use ZoeyscomputerWeb.ConnCase + + import Phoenix.LiveViewTest + import Zoeyscomputer.GistsFixtures + + @create_attrs %{code: "some code", lang: "some lang"} + @update_attrs %{code: "some updated code", lang: "some updated lang"} + @invalid_attrs %{code: nil, lang: nil} + + defp create_gist(_) do + gist = gist_fixture() + %{gist: gist} + end + + describe "Index" do + setup [:create_gist] + + test "lists all gists", %{conn: conn, gist: gist} do + {:ok, _index_live, html} = live(conn, ~p"/gists") + + assert html =~ "Listing Gists" + assert html =~ gist.code + end + + test "saves new gist", %{conn: conn} do + {:ok, index_live, _html} = live(conn, ~p"/gists") + + assert index_live |> element("a", "New Gist") |> render_click() =~ + "New Gist" + + assert_patch(index_live, ~p"/gists/new") + + assert index_live + |> form("#gist-form", gist: @invalid_attrs) + |> render_change() =~ "can't be blank" + + assert index_live + |> form("#gist-form", gist: @create_attrs) + |> render_submit() + + assert_patch(index_live, ~p"/gists") + + html = render(index_live) + assert html =~ "Gist created successfully" + assert html =~ "some code" + end + + test "updates gist in listing", %{conn: conn, gist: gist} do + {:ok, index_live, _html} = live(conn, ~p"/gists") + + assert index_live |> element("#gists-#{gist.id} a", "Edit") |> render_click() =~ + "Edit Gist" + + assert_patch(index_live, ~p"/gists/#{gist}/edit") + + assert index_live + |> form("#gist-form", gist: @invalid_attrs) + |> render_change() =~ "can't be blank" + + assert index_live + |> form("#gist-form", gist: @update_attrs) + |> render_submit() + + assert_patch(index_live, ~p"/gists") + + html = render(index_live) + assert html =~ "Gist updated successfully" + assert html =~ "some updated code" + end + + test "deletes gist in listing", %{conn: conn, gist: gist} do + {:ok, index_live, _html} = live(conn, ~p"/gists") + + assert index_live |> element("#gists-#{gist.id} a", "Delete") |> render_click() + refute has_element?(index_live, "#gists-#{gist.id}") + end + end + + describe "Show" do + setup [:create_gist] + + test "displays gist", %{conn: conn, gist: gist} do + {:ok, _show_live, html} = live(conn, ~p"/gists/#{gist}") + + assert html =~ "Show Gist" + assert html =~ gist.code + end + + test "updates gist within modal", %{conn: conn, gist: gist} do + {:ok, show_live, _html} = live(conn, ~p"/gists/#{gist}") + + assert show_live |> element("a", "Edit") |> render_click() =~ + "Edit Gist" + + assert_patch(show_live, ~p"/gists/#{gist}/show/edit") + + assert show_live + |> form("#gist-form", gist: @invalid_attrs) + |> render_change() =~ "can't be blank" + + assert show_live + |> form("#gist-form", gist: @update_attrs) + |> render_submit() + + assert_patch(show_live, ~p"/gists/#{gist}") + + html = render(show_live) + assert html =~ "Gist updated successfully" + assert html =~ "some updated code" + end + end +end