commit ccb0c914e5b18fa2a8687c6b672ec6553ee6c78c Author: Emanuel Turis Date: Fri Oct 13 22:20:05 2023 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/db.go b/db.go new file mode 100644 index 0000000..3490158 --- /dev/null +++ b/db.go @@ -0,0 +1,30 @@ +package main + +import ( + "database/sql" + + _ "github.com/mattn/go-sqlite3" +) + +var DB *sql.DB + +func openDB() error { + db, err := sql.Open("sqlite3", "./sqlite3.db") + if err != nil { + return err + } + DB = db + return nil +} + +func closeDB() error { + return DB.Close() +} + +func setupDB() error { + _, err := DB.Exec(`create table if not exists tasks (id integer not null primary key, title text, completed boolean default false, position integer);`) + if err != nil { + return err + } + return nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..73a5376 --- /dev/null +++ b/go.mod @@ -0,0 +1,7 @@ +module github.com/webdevfuel/htmx-go-todo + +go 1.21.1 + +require github.com/go-chi/chi/v5 v5.0.10 + +require github.com/mattn/go-sqlite3 v1.14.17 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c744973 --- /dev/null +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= +github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= +github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= diff --git a/main.go b/main.go new file mode 100644 index 0000000..dc3765c --- /dev/null +++ b/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "html/template" + "log" + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func main() { + err := openDB() + if err != nil { + log.Panic(err) + } + defer closeDB() + err = setupDB() + if err != nil { + log.Panic(err) + } + r := chi.NewRouter() + r.Use(middleware.Logger) + r.Handle("/static/*", http.StripPrefix("/static/", http.FileServer(http.Dir("./static")))) + r.Get("/", func(w http.ResponseWriter, _ *http.Request) { + tmpl, _ := template.New("").ParseFiles("templates/index.html") + tmpl.ExecuteTemplate(w, "Base", nil) + }) + http.ListenAndServe("localhost:3000", r) +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..82fd489 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "htmx-go-todo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "concurrently \"vite build --watch\" \"tailwindcss -i ./src/index.css -o ./static/index.css --watch\"" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "autoprefixer": "^10.4.16", + "concurrently": "^8.2.1", + "postcss": "^8.4.31", + "prettier": "^3.0.3", + "prettier-plugin-go-template": "^0.0.15", + "tailwindcss": "^3.3.3", + "vite": "^4.4.11" + }, + "dependencies": { + "htmx.org": "^1.9.6" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..9c44287 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1122 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + htmx.org: + specifier: ^1.9.6 + version: 1.9.6 + +devDependencies: + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.31) + concurrently: + specifier: ^8.2.1 + version: 8.2.1 + postcss: + specifier: ^8.4.31 + version: 8.4.31 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + prettier-plugin-go-template: + specifier: ^0.0.15 + version: 0.0.15(prettier@3.0.3) + tailwindcss: + specifier: ^3.3.3 + version: 3.3.3 + vite: + specifier: ^4.4.11 + version: 4.4.11 + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@babel/runtime@7.23.2: + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001547 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001547 + electron-to-chromium: 1.4.553 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite@1.0.30001547: + resolution: {integrity: sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==} + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concurrently@8.2.1: + resolution: {integrity: sha512-nVraf3aXOpIcNud5pB9M82p1tynmZkrSGQ1p6X/VY8cJ+2LMVqAgXsJxYYefACSHbTYlm92O1xuhdGTjwoEvbQ==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.23.2 + dev: true + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /electron-to-chromium@1.4.553: + resolution: {integrity: sha512-HiRdtyKS2+VhiXvjhMvvxiMC33FJJqTA5EB2YHgFZW6v7HkK4Q9Ahv2V7O2ZPgAjw+MyCJVMQvigj13H8t+wvA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + dev: true + + /htmx.org@1.9.6: + resolution: {integrity: sha512-4Zebo9nzg8u2ZHuIJmvB/nQS6kIMLIoEfhTg/oRwyCIJhL5MLA/jPU1EPEBtGOmG4ZG0k05Vpd3sab2+zfvteQ==} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /jiti@1.20.0: + resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} + hasBin: true + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.31): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.31): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.31 + dev: true + + /postcss-load-config@4.0.1(postcss@8.4.31): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.31 + yaml: 2.3.2 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.31): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prettier-plugin-go-template@0.0.15(prettier@3.0.3): + resolution: {integrity: sha512-WqU92E1NokWYNZ9mLE6ijoRg6LtIGdLMePt2C7UBDjXeDH9okcRI3zRqtnWR4s5AloiqyvZ66jNBAa9tmRY5EQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + prettier: ^3.0.0 + dependencies: + prettier: 3.0.3 + ulid: 2.3.0 + dev: true + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwindcss@3.3.3: + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.20.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-import: 15.1.0(postcss@8.4.31) + postcss-js: 4.0.1(postcss@8.4.31) + postcss-load-config: 4.0.1(postcss@8.4.31) + postcss-nested: 6.0.1(postcss@8.4.31) + postcss-selector-parser: 6.0.13 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /ulid@2.3.0: + resolution: {integrity: sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==} + hasBin: true + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /vite@4.4.11: + resolution: {integrity: sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yaml@2.3.2: + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/prettier.config.cjs b/prettier.config.cjs new file mode 100644 index 0000000..80e06e5 --- /dev/null +++ b/prettier.config.cjs @@ -0,0 +1,14 @@ +/** @type {import("prettier").Config} */ +const config = { + plugins: ["prettier-plugin-go-template"], + overrides: [ + { + files: ["*.html"], + options: { + parser: "go-template", + }, + }, + ], +}; + +module.exports = config; diff --git a/sqlite3.db b/sqlite3.db new file mode 100644 index 0000000..4cb7364 Binary files /dev/null and b/sqlite3.db differ diff --git a/src/htmx.js b/src/htmx.js new file mode 100644 index 0000000..2cd43d0 --- /dev/null +++ b/src/htmx.js @@ -0,0 +1,2 @@ +import htmx from "htmx.org"; +window.htmx = htmx; diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..a90f074 --- /dev/null +++ b/src/index.css @@ -0,0 +1,4 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + diff --git a/static/htmx.js b/static/htmx.js new file mode 100644 index 0000000..f857a06 --- /dev/null +++ b/static/htmx.js @@ -0,0 +1,1720 @@ +var commonjsGlobal = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; +function getDefaultExportFromCjs(Be) { + return Be && Be.__esModule && Object.prototype.hasOwnProperty.call(Be, "default") ? Be.default : Be; +} +var htmx_min = { exports: {} }; +(function(module) { + (function(Be, Yr) { + module.exports ? module.exports = Yr() : Be.htmx = Be.htmx || Yr(); + })(typeof self < "u" ? self : commonjsGlobal, function() { + return function() { + var Y = { onLoad: t, process: Pt, on: Z, off: K, trigger: fe, ajax: wr, find: E, findAll: f, closest: v, values: function(Be, Yr) { + var Mr = nr(Be, Yr || "post"); + return Mr.values; + }, remove: U, addClass: B, removeClass: n, toggleClass: V, takeClass: j, defineExtension: qr, removeExtension: Hr, logAll: X, logNone: F, logger: null, config: { historyEnabled: !0, historyCacheSize: 10, refreshOnHistoryMiss: !1, defaultSwapStyle: "innerHTML", defaultSwapDelay: 0, defaultSettleDelay: 20, includeIndicatorStyles: !0, indicatorClass: "htmx-indicator", requestClass: "htmx-request", addedClass: "htmx-added", settlingClass: "htmx-settling", swappingClass: "htmx-swapping", allowEval: !0, allowScriptTags: !0, inlineScriptNonce: "", attributesToSettle: ["class", "style", "width", "height"], withCredentials: !1, timeout: 0, wsReconnectDelay: "full-jitter", wsBinaryType: "blob", disableSelector: "[hx-disable], [data-hx-disable]", useTemplateFragments: !1, scrollBehavior: "smooth", defaultFocusScroll: !1, getCacheBusterParam: !1, globalViewTransitions: !1, methodsThatUseUrlParams: ["get"], selfRequestsOnly: !1 }, parseInterval: d, _: e, createEventSource: function(Be) { + return new EventSource(Be, { withCredentials: !0 }); + }, createWebSocket: function(Be) { + var Yr = new WebSocket(Be, []); + return Yr.binaryType = Y.config.wsBinaryType, Yr; + }, version: "1.9.6" }, r = { addTriggerHandler: St, bodyContains: oe, canAccessLocalStorage: M, findThisElement: de, filterValues: lr, hasAttribute: o, getAttributeValue: ee, getClosestAttributeValue: re, getClosestMatch: c, getExpressionVars: xr, getHeaders: sr, getInputValues: nr, getInternalData: ie, getSwapSpecification: fr, getTriggerSpecs: Ze, getTarget: ge, makeFragment: l, mergeObjects: se, makeSettleInfo: T, oobSwap: ye, querySelectorExt: le, selectAndSwap: Fe, settleImmediately: Wt, shouldCancel: tt, triggerEvent: fe, triggerErrorEvent: ue, withExtensions: C }, b = ["get", "post", "put", "delete", "patch"], w = b.map(function(Be) { + return "[hx-" + Be + "], [data-hx-" + Be + "]"; + }).join(", "); + function d(Be) { + if (Be != null) + return Be.slice(-2) == "ms" ? parseFloat(Be.slice(0, -2)) || void 0 : Be.slice(-1) == "s" ? parseFloat(Be.slice(0, -1)) * 1e3 || void 0 : Be.slice(-1) == "m" ? parseFloat(Be.slice(0, -1)) * 1e3 * 60 || void 0 : parseFloat(Be) || void 0; + } + function Q(Be, Yr) { + return Be.getAttribute && Be.getAttribute(Yr); + } + function o(Be, Yr) { + return Be.hasAttribute && (Be.hasAttribute(Yr) || Be.hasAttribute("data-" + Yr)); + } + function ee(Be, Yr) { + return Q(Be, Yr) || Q(Be, "data-" + Yr); + } + function u(Be) { + return Be.parentElement; + } + function te() { + return document; + } + function c(Be, Yr) { + for (; Be && !Yr(Be); ) + Be = u(Be); + return Be || null; + } + function O(Be, Yr, Mr) { + var Dr = ee(Yr, Mr), Xr = ee(Yr, "hx-disinherit"); + return Be !== Yr && Xr && (Xr === "*" || Xr.split(" ").indexOf(Mr) >= 0) ? "unset" : Dr; + } + function re(Be, Yr) { + var Mr = null; + if (c(Be, function(Dr) { + return Mr = O(Be, Dr, Yr); + }), Mr !== "unset") + return Mr; + } + function h(Be, Yr) { + var Mr = Be.matches || Be.matchesSelector || Be.msMatchesSelector || Be.mozMatchesSelector || Be.webkitMatchesSelector || Be.oMatchesSelector; + return Mr && Mr.call(Be, Yr); + } + function q(Be) { + var Yr = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, Mr = Yr.exec(Be); + return Mr ? Mr[1].toLowerCase() : ""; + } + function i(Be, Yr) { + for (var Mr = new DOMParser(), Dr = Mr.parseFromString(Be, "text/html"), Xr = Dr.body; Yr > 0; ) + Yr--, Xr = Xr.firstChild; + return Xr == null && (Xr = te().createDocumentFragment()), Xr; + } + function H(Be) { + return Be.match(/", 0); + return Mr.querySelector("template").content; + } else { + var Dr = q(Be); + switch (Dr) { + case "thead": + case "tbody": + case "tfoot": + case "colgroup": + case "caption": + return i("" + Be + "
", 1); + case "col": + return i("" + Be + "
", 2); + case "tr": + return i("" + Be + "
", 2); + case "td": + case "th": + return i("" + Be + "
", 3); + case "script": + case "style": + return i("
" + Be + "
", 1); + default: + return i(Be, 0); + } + } + } + function ne(Be) { + Be && Be(); + } + function L(Be, Yr) { + return Object.prototype.toString.call(Be) === "[object " + Yr + "]"; + } + function A(Be) { + return L(Be, "Function"); + } + function N(Be) { + return L(Be, "Object"); + } + function ie(Be) { + var Yr = "htmx-internal-data", Mr = Be[Yr]; + return Mr || (Mr = Be[Yr] = {}), Mr; + } + function I(Be) { + var Yr = []; + if (Be) + for (var Mr = 0; Mr < Be.length; Mr++) + Yr.push(Be[Mr]); + return Yr; + } + function ae(Be, Yr) { + if (Be) + for (var Mr = 0; Mr < Be.length; Mr++) + Yr(Be[Mr]); + } + function P(Be) { + var Yr = Be.getBoundingClientRect(), Mr = Yr.top, Dr = Yr.bottom; + return Mr < window.innerHeight && Dr >= 0; + } + function oe(Be) { + return Be.getRootNode && Be.getRootNode() instanceof window.ShadowRoot ? te().body.contains(Be.getRootNode().host) : te().body.contains(Be); + } + function k(Be) { + return Be.trim().split(/\s+/); + } + function se(Be, Yr) { + for (var Mr in Yr) + Yr.hasOwnProperty(Mr) && (Be[Mr] = Yr[Mr]); + return Be; + } + function S(Be) { + try { + return JSON.parse(Be); + } catch (Yr) { + return y(Yr), null; + } + } + function M() { + var Be = "htmx:localStorageTest"; + try { + return localStorage.setItem(Be, Be), localStorage.removeItem(Be), !0; + } catch { + return !1; + } + } + function D(Be) { + try { + var Yr = new URL(Be); + return Yr && (Be = Yr.pathname + Yr.search), Be.match("^/$") || (Be = Be.replace(/\/+$/, "")), Be; + } catch { + return Be; + } + } + function e(e) { + return gr(te().body, function() { + return eval(e); + }); + } + function t(Be) { + var Yr = Y.on("htmx:load", function(Mr) { + Be(Mr.detail.elt); + }); + return Yr; + } + function X() { + Y.logger = function(Be, Yr, Mr) { + console && console.log(Yr, Be, Mr); + }; + } + function F() { + Y.logger = null; + } + function E(Be, Yr) { + return Yr ? Be.querySelector(Yr) : E(te(), Be); + } + function f(Be, Yr) { + return Yr ? Be.querySelectorAll(Yr) : f(te(), Be); + } + function U(Be, Yr) { + Be = s(Be), Yr ? setTimeout(function() { + U(Be), Be = null; + }, Yr) : Be.parentElement.removeChild(Be); + } + function B(Be, Yr, Mr) { + Be = s(Be), Mr ? setTimeout(function() { + B(Be, Yr), Be = null; + }, Mr) : Be.classList && Be.classList.add(Yr); + } + function n(Be, Yr, Mr) { + Be = s(Be), Mr ? setTimeout(function() { + n(Be, Yr), Be = null; + }, Mr) : Be.classList && (Be.classList.remove(Yr), Be.classList.length === 0 && Be.removeAttribute("class")); + } + function V(Be, Yr) { + Be = s(Be), Be.classList.toggle(Yr); + } + function j(Be, Yr) { + Be = s(Be), ae(Be.parentElement.children, function(Mr) { + n(Mr, Yr); + }), B(Be, Yr); + } + function v(Be, Yr) { + if (Be = s(Be), Be.closest) + return Be.closest(Yr); + do + if (Be == null || h(Be, Yr)) + return Be; + while (Be = Be && u(Be)); + return null; + } + function g(Be, Yr) { + return Be.substring(0, Yr.length) === Yr; + } + function _(Be, Yr) { + return Be.substring(Be.length - Yr.length) === Yr; + } + function z(Be) { + var Yr = Be.trim(); + return g(Yr, "<") && _(Yr, "/>") ? Yr.substring(1, Yr.length - 2) : Yr; + } + function W(Be, Yr) { + return Yr.indexOf("closest ") === 0 ? [v(Be, z(Yr.substr(8)))] : Yr.indexOf("find ") === 0 ? [E(Be, z(Yr.substr(5)))] : Yr.indexOf("next ") === 0 ? [$(Be, z(Yr.substr(5)))] : Yr.indexOf("previous ") === 0 ? [G(Be, z(Yr.substr(9)))] : Yr === "document" ? [document] : Yr === "window" ? [window] : Yr === "body" ? [document.body] : te().querySelectorAll(z(Yr)); + } + var $ = function(Be, Yr) { + for (var Mr = te().querySelectorAll(Yr), Dr = 0; Dr < Mr.length; Dr++) { + var Xr = Mr[Dr]; + if (Xr.compareDocumentPosition(Be) === Node.DOCUMENT_POSITION_PRECEDING) + return Xr; + } + }, G = function(Be, Yr) { + for (var Mr = te().querySelectorAll(Yr), Dr = Mr.length - 1; Dr >= 0; Dr--) { + var Xr = Mr[Dr]; + if (Xr.compareDocumentPosition(Be) === Node.DOCUMENT_POSITION_FOLLOWING) + return Xr; + } + }; + function le(Be, Yr) { + return Yr ? W(Be, Yr)[0] : W(te().body, Be)[0]; + } + function s(Be) { + return L(Be, "String") ? E(Be) : Be; + } + function J(Be, Yr, Mr) { + return A(Yr) ? { target: te().body, event: Be, listener: Yr } : { target: s(Be), event: Yr, listener: Mr }; + } + function Z(Be, Yr, Mr) { + Nr(function() { + var Xr = J(Be, Yr, Mr); + Xr.target.addEventListener(Xr.event, Xr.listener); + }); + var Dr = A(Yr); + return Dr ? Yr : Mr; + } + function K(Be, Yr, Mr) { + return Nr(function() { + var Dr = J(Be, Yr, Mr); + Dr.target.removeEventListener(Dr.event, Dr.listener); + }), A(Yr) ? Yr : Mr; + } + var he = te().createElement("output"); + function ve(Be, Yr) { + var Mr = re(Be, Yr); + if (Mr) { + if (Mr === "this") + return [de(Be, Yr)]; + var Dr = W(Be, Mr); + return Dr.length === 0 ? (y('The selector "' + Mr + '" on ' + Yr + " returned no matches!"), [he]) : Dr; + } + } + function de(Be, Yr) { + return c(Be, function(Mr) { + return ee(Mr, Yr) != null; + }); + } + function ge(Be) { + var Yr = re(Be, "hx-target"); + if (Yr) + return Yr === "this" ? de(Be, "hx-target") : le(Be, Yr); + var Mr = ie(Be); + return Mr.boosted ? te().body : Be; + } + function me(Be) { + for (var Yr = Y.config.attributesToSettle, Mr = 0; Mr < Yr.length; Mr++) + if (Be === Yr[Mr]) + return !0; + return !1; + } + function pe(Be, Yr) { + ae(Be.attributes, function(Mr) { + !Yr.hasAttribute(Mr.name) && me(Mr.name) && Be.removeAttribute(Mr.name); + }), ae(Yr.attributes, function(Mr) { + me(Mr.name) && Be.setAttribute(Mr.name, Mr.value); + }); + } + function xe(Be, Yr) { + for (var Mr = Lr(Yr), Dr = 0; Dr < Mr.length; Dr++) { + var Xr = Mr[Dr]; + try { + if (Xr.isInlineSwap(Be)) + return !0; + } catch (Fr) { + y(Fr); + } + } + return Be === "outerHTML"; + } + function ye(Be, Yr, Mr) { + var Dr = "#" + Q(Yr, "id"), Xr = "outerHTML"; + Be === "true" || (Be.indexOf(":") > 0 ? (Xr = Be.substr(0, Be.indexOf(":")), Dr = Be.substr(Be.indexOf(":") + 1, Be.length)) : Xr = Be); + var Fr = te().querySelectorAll(Dr); + return Fr ? (ae(Fr, function(Ur) { + var Br, jr = Yr.cloneNode(!0); + Br = te().createDocumentFragment(), Br.appendChild(jr), xe(Xr, Ur) || (Br = jr); + var _r = { shouldSwap: !0, target: Ur, fragment: Br }; + fe(Ur, "htmx:oobBeforeSwap", _r) && (Ur = _r.target, _r.shouldSwap && De(Xr, Ur, Ur, Br, Mr), ae(Mr.elts, function(Qr) { + fe(Qr, "htmx:oobAfterSwap", _r); + })); + }), Yr.parentNode.removeChild(Yr)) : (Yr.parentNode.removeChild(Yr), ue(te().body, "htmx:oobErrorNoTarget", { content: Yr })), Be; + } + function be(Be, Yr, Mr) { + var Dr = re(Be, "hx-select-oob"); + if (Dr) { + var Xr = Dr.split(","); + for (let _r = 0; _r < Xr.length; _r++) { + var Fr = Xr[_r].split(":", 2), Ur = Fr[0].trim(); + Ur.indexOf("#") === 0 && (Ur = Ur.substring(1)); + var Br = Fr[1] || "true", jr = Yr.querySelector("#" + Ur); + jr && ye(Br, jr, Mr); + } + } + ae(f(Yr, "[hx-swap-oob], [data-hx-swap-oob]"), function(_r) { + var Qr = ee(_r, "hx-swap-oob"); + Qr != null && ye(Qr, _r, Mr); + }); + } + function we(Be) { + ae(f(Be, "[hx-preserve], [data-hx-preserve]"), function(Yr) { + var Mr = ee(Yr, "id"), Dr = te().getElementById(Mr); + Dr != null && Yr.parentNode.replaceChild(Dr, Yr); + }); + } + function Se(Be, Yr, Mr) { + ae(Yr.querySelectorAll("[id]"), function(Dr) { + var Xr = Q(Dr, "id"); + if (Xr && Xr.length > 0) { + var Fr = Xr.replace("'", "\\'"), Ur = Dr.tagName.replace(":", "\\:"), Br = Be.querySelector(Ur + "[id='" + Fr + "']"); + if (Br && Br !== Be) { + var jr = Dr.cloneNode(); + pe(Dr, Br), Mr.tasks.push(function() { + pe(Dr, jr); + }); + } + } + }); + } + function Ee(Be) { + return function() { + n(Be, Y.config.addedClass), Pt(Be), Ct(Be), Ce(Be), fe(Be, "htmx:load"); + }; + } + function Ce(Be) { + var Yr = "[autofocus]", Mr = h(Be, Yr) ? Be : Be.querySelector(Yr); + Mr != null && Mr.focus(); + } + function a(Be, Yr, Mr, Dr) { + for (Se(Be, Mr, Dr); Mr.childNodes.length > 0; ) { + var Xr = Mr.firstChild; + B(Xr, Y.config.addedClass), Be.insertBefore(Xr, Yr), Xr.nodeType !== Node.TEXT_NODE && Xr.nodeType !== Node.COMMENT_NODE && Dr.tasks.push(Ee(Xr)); + } + } + function Te(Be, Yr) { + for (var Mr = 0; Mr < Be.length; ) + Yr = (Yr << 5) - Yr + Be.charCodeAt(Mr++) | 0; + return Yr; + } + function Re(Be) { + var Yr = 0; + if (Be.attributes) + for (var Mr = 0; Mr < Be.attributes.length; Mr++) { + var Dr = Be.attributes[Mr]; + Dr.value && (Yr = Te(Dr.name, Yr), Yr = Te(Dr.value, Yr)); + } + return Yr; + } + function Oe(Be) { + var Yr = ie(Be); + if (Yr.onHandlers) { + for (let Mr = 0; Mr < Yr.onHandlers.length; Mr++) { + const Dr = Yr.onHandlers[Mr]; + Be.removeEventListener(Dr.event, Dr.listener); + } + delete Yr.onHandlers; + } + } + function qe(Be) { + var Yr = ie(Be); + Yr.timeout && clearTimeout(Yr.timeout), Yr.webSocket && Yr.webSocket.close(), Yr.sseEventSource && Yr.sseEventSource.close(), Yr.listenerInfos && ae(Yr.listenerInfos, function(Mr) { + Mr.on && Mr.on.removeEventListener(Mr.trigger, Mr.listener); + }), Yr.initHash && (Yr.initHash = null), Oe(Be); + } + function m(Be) { + fe(Be, "htmx:beforeCleanupElement"), qe(Be), Be.children && ae(Be.children, function(Yr) { + m(Yr); + }); + } + function He(Be, Yr, Mr) { + if (Be.tagName === "BODY") + return ke(Be, Yr, Mr); + var Dr, Xr = Be.previousSibling; + for (a(u(Be), Be, Yr, Mr), Xr == null ? Dr = u(Be).firstChild : Dr = Xr.nextSibling, ie(Be).replacedWith = Dr, Mr.elts = Mr.elts.filter(function(Fr) { + return Fr != Be; + }); Dr && Dr !== Be; ) + Dr.nodeType === Node.ELEMENT_NODE && Mr.elts.push(Dr), Dr = Dr.nextElementSibling; + m(Be), u(Be).removeChild(Be); + } + function Le(Be, Yr, Mr) { + return a(Be, Be.firstChild, Yr, Mr); + } + function Ae(Be, Yr, Mr) { + return a(u(Be), Be, Yr, Mr); + } + function Ne(Be, Yr, Mr) { + return a(Be, null, Yr, Mr); + } + function Ie(Be, Yr, Mr) { + return a(u(Be), Be.nextSibling, Yr, Mr); + } + function Pe(Be, Yr, Mr) { + return m(Be), u(Be).removeChild(Be); + } + function ke(Be, Yr, Mr) { + var Dr = Be.firstChild; + if (a(Be, Dr, Yr, Mr), Dr) { + for (; Dr.nextSibling; ) + m(Dr.nextSibling), Be.removeChild(Dr.nextSibling); + m(Dr), Be.removeChild(Dr); + } + } + function Me(Be, Yr, Mr) { + var Dr = Mr || re(Be, "hx-select"); + if (Dr) { + var Xr = te().createDocumentFragment(); + ae(Yr.querySelectorAll(Dr), function(Fr) { + Xr.appendChild(Fr); + }), Yr = Xr; + } + return Yr; + } + function De(Be, Yr, Mr, Dr, Xr) { + switch (Be) { + case "none": + return; + case "outerHTML": + He(Mr, Dr, Xr); + return; + case "afterbegin": + Le(Mr, Dr, Xr); + return; + case "beforebegin": + Ae(Mr, Dr, Xr); + return; + case "beforeend": + Ne(Mr, Dr, Xr); + return; + case "afterend": + Ie(Mr, Dr, Xr); + return; + case "delete": + Pe(Mr); + return; + default: + for (var Fr = Lr(Yr), Ur = 0; Ur < Fr.length; Ur++) { + var Br = Fr[Ur]; + try { + var jr = Br.handleSwap(Be, Mr, Dr, Xr); + if (jr) { + if (typeof jr.length < "u") + for (var _r = 0; _r < jr.length; _r++) { + var Qr = jr[_r]; + Qr.nodeType !== Node.TEXT_NODE && Qr.nodeType !== Node.COMMENT_NODE && Xr.tasks.push(Ee(Qr)); + } + return; + } + } catch (Vr) { + y(Vr); + } + } + Be === "innerHTML" ? ke(Mr, Dr, Xr) : De(Y.config.defaultSwapStyle, Yr, Mr, Dr, Xr); + } + } + function Xe(Be) { + if (Be.indexOf(" -1) { + var Yr = Be.replace(/]*>|>)([\s\S]*?)<\/svg>/gim, ""), Mr = Yr.match(/]*>|>)([\s\S]*?)<\/title>/im); + if (Mr) + return Mr[2]; + } + } + function Fe(Be, Yr, Mr, Dr, Xr, Fr) { + Xr.title = Xe(Dr); + var Ur = l(Dr); + if (Ur) + return be(Mr, Ur, Xr), Ur = Me(Mr, Ur, Fr), we(Ur), De(Be, Mr, Yr, Ur, Xr); + } + function Ue(Be, Yr, Mr) { + var Dr = Be.getResponseHeader(Yr); + if (Dr.indexOf("{") === 0) { + var Xr = S(Dr); + for (var Fr in Xr) + if (Xr.hasOwnProperty(Fr)) { + var Ur = Xr[Fr]; + N(Ur) || (Ur = { value: Ur }), fe(Mr, Fr, Ur); + } + } else + for (var Br = Dr.split(","), jr = 0; jr < Br.length; jr++) + fe(Mr, Br[jr].trim(), []); + } + var p = /[\s,]/, Ve = /[_$a-zA-Z]/, je = /[_$a-zA-Z0-9]/, _e = ['"', "'", "/"], ze = /[^\s]/; + function We(Be) { + for (var Yr = [], Mr = 0; Mr < Be.length; ) { + if (Ve.exec(Be.charAt(Mr))) { + for (var Dr = Mr; je.exec(Be.charAt(Mr + 1)); ) + Mr++; + Yr.push(Be.substr(Dr, Mr - Dr + 1)); + } else if (_e.indexOf(Be.charAt(Mr)) !== -1) { + var Xr = Be.charAt(Mr), Dr = Mr; + for (Mr++; Mr < Be.length && Be.charAt(Mr) !== Xr; ) + Be.charAt(Mr) === "\\" && Mr++, Mr++; + Yr.push(Be.substr(Dr, Mr - Dr + 1)); + } else { + var Fr = Be.charAt(Mr); + Yr.push(Fr); + } + Mr++; + } + return Yr; + } + function $e(Be, Yr, Mr) { + return Ve.exec(Be.charAt(0)) && Be !== "true" && Be !== "false" && Be !== "this" && Be !== Mr && Yr !== "."; + } + function Ge(Be, Yr, Mr) { + if (Yr[0] === "[") { + Yr.shift(); + for (var Dr = 1, Xr = " return (function(" + Mr + "){ return (", Fr = null; Yr.length > 0; ) { + var Ur = Yr[0]; + if (Ur === "]") { + if (Dr--, Dr === 0) { + Fr === null && (Xr = Xr + "true"), Yr.shift(), Xr += ")})"; + try { + var Br = gr(Be, function() { + return Function(Xr)(); + }, function() { + return !0; + }); + return Br.source = Xr, Br; + } catch (jr) { + return ue(te().body, "htmx:syntax:error", { error: jr, source: Xr }), null; + } + } + } else + Ur === "[" && Dr++; + $e(Ur, Fr, Mr) ? Xr += "((" + Mr + "." + Ur + ") ? (" + Mr + "." + Ur + ") : (window." + Ur + "))" : Xr = Xr + Ur, Fr = Yr.shift(); + } + } + } + function x(Be, Yr) { + for (var Mr = ""; Be.length > 0 && !Be[0].match(Yr); ) + Mr += Be.shift(); + return Mr; + } + var Je = "input, textarea, select"; + function Ze(Be) { + var Yr = ee(Be, "hx-trigger"), Mr = []; + if (Yr) { + var Dr = We(Yr); + do { + x(Dr, ze); + var Xr = Dr.length, Fr = x(Dr, /[,\[\s]/); + if (Fr !== "") + if (Fr === "every") { + var Ur = { trigger: "every" }; + x(Dr, ze), Ur.pollInterval = d(x(Dr, /[,\[\s]/)), x(Dr, ze); + var Br = Ge(Be, Dr, "event"); + Br && (Ur.eventFilter = Br), Mr.push(Ur); + } else if (Fr.indexOf("sse:") === 0) + Mr.push({ trigger: "sse", sseEvent: Fr.substr(4) }); + else { + var jr = { trigger: Fr }, Br = Ge(Be, Dr, "event"); + for (Br && (jr.eventFilter = Br); Dr.length > 0 && Dr[0] !== ","; ) { + x(Dr, ze); + var _r = Dr.shift(); + if (_r === "changed") + jr.changed = !0; + else if (_r === "once") + jr.once = !0; + else if (_r === "consume") + jr.consume = !0; + else if (_r === "delay" && Dr[0] === ":") + Dr.shift(), jr.delay = d(x(Dr, p)); + else if (_r === "from" && Dr[0] === ":") { + Dr.shift(); + var Qr = x(Dr, p); + (Qr === "closest" || Qr === "find" || Qr === "next" || Qr === "previous") && (Dr.shift(), Qr += " " + x(Dr, p)), jr.from = Qr; + } else + _r === "target" && Dr[0] === ":" ? (Dr.shift(), jr.target = x(Dr, p)) : _r === "throttle" && Dr[0] === ":" ? (Dr.shift(), jr.throttle = d(x(Dr, p))) : _r === "queue" && Dr[0] === ":" ? (Dr.shift(), jr.queue = x(Dr, p)) : (_r === "root" || _r === "threshold") && Dr[0] === ":" ? (Dr.shift(), jr[_r] = x(Dr, p)) : ue(Be, "htmx:syntax:error", { token: Dr.shift() }); + } + Mr.push(jr); + } + Dr.length === Xr && ue(Be, "htmx:syntax:error", { token: Dr.shift() }), x(Dr, ze); + } while (Dr[0] === "," && Dr.shift()); + } + return Mr.length > 0 ? Mr : h(Be, "form") ? [{ trigger: "submit" }] : h(Be, 'input[type="button"], input[type="submit"]') ? [{ trigger: "click" }] : h(Be, Je) ? [{ trigger: "change" }] : [{ trigger: "click" }]; + } + function Ke(Be) { + ie(Be).cancelled = !0; + } + function Ye(Be, Yr, Mr) { + var Dr = ie(Be); + Dr.timeout = setTimeout(function() { + oe(Be) && Dr.cancelled !== !0 && (nt(Mr, Be, Mt("hx:poll:trigger", { triggerSpec: Mr, target: Be })) || Yr(Be), Ye(Be, Yr, Mr)); + }, Mr.pollInterval); + } + function Qe(Be) { + return location.hostname === Be.hostname && Q(Be, "href") && Q(Be, "href").indexOf("#") !== 0; + } + function et(Be, Yr, Mr) { + if (Be.tagName === "A" && Qe(Be) && (Be.target === "" || Be.target === "_self") || Be.tagName === "FORM") { + Yr.boosted = !0; + var Dr, Xr; + if (Be.tagName === "A") + Dr = "get", Xr = Q(Be, "href"); + else { + var Fr = Q(Be, "method"); + Dr = Fr ? Fr.toLowerCase() : "get", Xr = Q(Be, "action"); + } + Mr.forEach(function(Ur) { + it(Be, function(Br, jr) { + if (v(Br, Y.config.disableSelector)) { + m(Br); + return; + } + ce(Dr, Xr, Br, jr); + }, Yr, Ur, !0); + }); + } + } + function tt(Be, Yr) { + return !!((Be.type === "submit" || Be.type === "click") && (Yr.tagName === "FORM" || h(Yr, 'input[type="submit"], button') && v(Yr, "form") !== null || Yr.tagName === "A" && Yr.href && (Yr.getAttribute("href") === "#" || Yr.getAttribute("href").indexOf("#") !== 0))); + } + function rt(Be, Yr) { + return ie(Be).boosted && Be.tagName === "A" && Yr.type === "click" && (Yr.ctrlKey || Yr.metaKey); + } + function nt(Be, Yr, Mr) { + var Dr = Be.eventFilter; + if (Dr) + try { + return Dr.call(Yr, Mr) !== !0; + } catch (Xr) { + return ue(te().body, "htmx:eventFilter:error", { error: Xr, source: Dr.source }), !0; + } + return !1; + } + function it(Be, Yr, Mr, Dr, Xr) { + var Fr = ie(Be), Ur; + Dr.from ? Ur = W(Be, Dr.from) : Ur = [Be], Dr.changed && Ur.forEach(function(Br) { + var jr = ie(Br); + jr.lastValue = Br.value; + }), ae(Ur, function(Br) { + var jr = function(_r) { + if (!oe(Be)) { + Br.removeEventListener(Dr.trigger, jr); + return; + } + if (!rt(Be, _r) && ((Xr || tt(_r, Be)) && _r.preventDefault(), !nt(Dr, Be, _r))) { + var Qr = ie(_r); + if (Qr.triggerSpec = Dr, Qr.handledFor == null && (Qr.handledFor = []), Qr.handledFor.indexOf(Be) < 0) { + if (Qr.handledFor.push(Be), Dr.consume && _r.stopPropagation(), Dr.target && _r.target && !h(_r.target, Dr.target)) + return; + if (Dr.once) { + if (Fr.triggeredOnce) + return; + Fr.triggeredOnce = !0; + } + if (Dr.changed) { + var Vr = ie(Br); + if (Vr.lastValue === Br.value) + return; + Vr.lastValue = Br.value; + } + if (Fr.delayed && clearTimeout(Fr.delayed), Fr.throttle) + return; + Dr.throttle ? Fr.throttle || (Yr(Be, _r), Fr.throttle = setTimeout(function() { + Fr.throttle = null; + }, Dr.throttle)) : Dr.delay ? Fr.delayed = setTimeout(function() { + Yr(Be, _r); + }, Dr.delay) : (fe(Be, "htmx:trigger"), Yr(Be, _r)); + } + } + }; + Mr.listenerInfos == null && (Mr.listenerInfos = []), Mr.listenerInfos.push({ trigger: Dr.trigger, listener: jr, on: Br }), Br.addEventListener(Dr.trigger, jr); + }); + } + var at = !1, ot = null; + function st() { + ot || (ot = function() { + at = !0; + }, window.addEventListener("scroll", ot), setInterval(function() { + at && (at = !1, ae(te().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"), function(Be) { + lt(Be); + })); + }, 200)); + } + function lt(Be) { + if (!o(Be, "data-hx-revealed") && P(Be)) { + Be.setAttribute("data-hx-revealed", "true"); + var Yr = ie(Be); + Yr.initHash ? fe(Be, "revealed") : Be.addEventListener("htmx:afterProcessNode", function(Mr) { + fe(Be, "revealed"); + }, { once: !0 }); + } + } + function ut(Be, Yr, Mr) { + for (var Dr = k(Mr), Xr = 0; Xr < Dr.length; Xr++) { + var Fr = Dr[Xr].split(/:(.+)/); + Fr[0] === "connect" && ft(Be, Fr[1], 0), Fr[0] === "send" && ht(Be); + } + } + function ft(Be, Yr, Mr) { + if (oe(Be)) { + if (Yr.indexOf("/") == 0) { + var Dr = location.hostname + (location.port ? ":" + location.port : ""); + location.protocol == "https:" ? Yr = "wss://" + Dr + Yr : location.protocol == "http:" && (Yr = "ws://" + Dr + Yr); + } + var Xr = Y.createWebSocket(Yr); + Xr.onerror = function(Fr) { + ue(Be, "htmx:wsError", { error: Fr, socket: Xr }), ct(Be); + }, Xr.onclose = function(Fr) { + if ([1006, 1012, 1013].indexOf(Fr.code) >= 0) { + var Ur = vt(Mr); + setTimeout(function() { + ft(Be, Yr, Mr + 1); + }, Ur); + } + }, Xr.onopen = function(Fr) { + Mr = 0; + }, ie(Be).webSocket = Xr, Xr.addEventListener("message", function(Fr) { + if (!ct(Be)) { + var Ur = Fr.data; + C(Be, function($r) { + Ur = $r.transformResponse(Ur, null, Be); + }); + for (var Br = T(Be), jr = l(Ur), _r = I(jr.children), Qr = 0; Qr < _r.length; Qr++) { + var Vr = _r[Qr]; + ye(ee(Vr, "hx-swap-oob") || "true", Vr, Br); + } + Wt(Br.tasks); + } + }); + } + } + function ct(Be) { + if (!oe(Be)) + return ie(Be).webSocket.close(), !0; + } + function ht(Be) { + var Yr = c(Be, function(Mr) { + return ie(Mr).webSocket != null; + }); + Yr ? Be.addEventListener(Ze(Be)[0].trigger, function(Mr) { + var Dr = ie(Yr).webSocket, Xr = sr(Be, Yr), Fr = nr(Be, "post"), Ur = Fr.errors, Br = Fr.values, jr = xr(Be), _r = se(Br, jr), Qr = lr(_r, Be); + if (Qr.HEADERS = Xr, Ur && Ur.length > 0) { + fe(Be, "htmx:validation:halted", Ur); + return; + } + Dr.send(JSON.stringify(Qr)), tt(Mr, Be) && Mr.preventDefault(); + }) : ue(Be, "htmx:noWebSocketSourceError"); + } + function vt(Be) { + var Yr = Y.config.wsReconnectDelay; + if (typeof Yr == "function") + return Yr(Be); + if (Yr === "full-jitter") { + var Mr = Math.min(Be, 6), Dr = 1e3 * Math.pow(2, Mr); + return Dr * Math.random(); + } + y('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"'); + } + function dt(Be, Yr, Mr) { + for (var Dr = k(Mr), Xr = 0; Xr < Dr.length; Xr++) { + var Fr = Dr[Xr].split(/:(.+)/); + Fr[0] === "connect" && gt(Be, Fr[1]), Fr[0] === "swap" && mt(Be, Fr[1]); + } + } + function gt(Be, Yr) { + var Mr = Y.createEventSource(Yr); + Mr.onerror = function(Dr) { + ue(Be, "htmx:sseError", { error: Dr, source: Mr }), xt(Be); + }, ie(Be).sseEventSource = Mr; + } + function mt(Be, Yr) { + var Mr = c(Be, yt); + if (Mr) { + var Dr = ie(Mr).sseEventSource, Xr = function(Fr) { + if (!xt(Mr)) { + if (!oe(Be)) { + Dr.removeEventListener(Yr, Xr); + return; + } + var Ur = Fr.data; + C(Be, function(Qr) { + Ur = Qr.transformResponse(Ur, null, Be); + }); + var Br = fr(Be), jr = ge(Be), _r = T(Be); + Fe(Br.swapStyle, jr, Be, Ur, _r), Wt(_r.tasks), fe(Be, "htmx:sseMessage", Fr); + } + }; + ie(Be).sseListener = Xr, Dr.addEventListener(Yr, Xr); + } else + ue(Be, "htmx:noSSESourceError"); + } + function pt(Be, Yr, Mr) { + var Dr = c(Be, yt); + if (Dr) { + var Xr = ie(Dr).sseEventSource, Fr = function() { + xt(Dr) || (oe(Be) ? Yr(Be) : Xr.removeEventListener(Mr, Fr)); + }; + ie(Be).sseListener = Fr, Xr.addEventListener(Mr, Fr); + } else + ue(Be, "htmx:noSSESourceError"); + } + function xt(Be) { + if (!oe(Be)) + return ie(Be).sseEventSource.close(), !0; + } + function yt(Be) { + return ie(Be).sseEventSource != null; + } + function bt(Be, Yr, Mr, Dr) { + var Xr = function() { + Mr.loaded || (Mr.loaded = !0, Yr(Be)); + }; + Dr ? setTimeout(Xr, Dr) : Xr(); + } + function wt(Be, Yr, Mr) { + var Dr = !1; + return ae(b, function(Xr) { + if (o(Be, "hx-" + Xr)) { + var Fr = ee(Be, "hx-" + Xr); + Dr = !0, Yr.path = Fr, Yr.verb = Xr, Mr.forEach(function(Ur) { + St(Be, Ur, Yr, function(Br, jr) { + if (v(Br, Y.config.disableSelector)) { + m(Br); + return; + } + ce(Xr, Fr, Br, jr); + }); + }); + } + }), Dr; + } + function St(Be, Yr, Mr, Dr) { + if (Yr.sseEvent) + pt(Be, Dr, Yr.sseEvent); + else if (Yr.trigger === "revealed") + st(), it(Be, Dr, Mr, Yr), lt(Be); + else if (Yr.trigger === "intersect") { + var Xr = {}; + Yr.root && (Xr.root = le(Be, Yr.root)), Yr.threshold && (Xr.threshold = parseFloat(Yr.threshold)); + var Fr = new IntersectionObserver(function(Ur) { + for (var Br = 0; Br < Ur.length; Br++) { + var jr = Ur[Br]; + if (jr.isIntersecting) { + fe(Be, "intersect"); + break; + } + } + }, Xr); + Fr.observe(Be), it(Be, Dr, Mr, Yr); + } else + Yr.trigger === "load" ? nt(Yr, Be, Mt("load", { elt: Be })) || bt(Be, Dr, Mr, Yr.delay) : Yr.pollInterval ? (Mr.polling = !0, Ye(Be, Dr, Yr)) : it(Be, Dr, Mr, Yr); + } + function Et(Be) { + if (Y.config.allowScriptTags && (Be.type === "text/javascript" || Be.type === "module" || Be.type === "")) { + var Yr = te().createElement("script"); + ae(Be.attributes, function(Dr) { + Yr.setAttribute(Dr.name, Dr.value); + }), Yr.textContent = Be.textContent, Yr.async = !1, Y.config.inlineScriptNonce && (Yr.nonce = Y.config.inlineScriptNonce); + var Mr = Be.parentElement; + try { + Mr.insertBefore(Yr, Be); + } catch (Dr) { + y(Dr); + } finally { + Be.parentElement && Be.parentElement.removeChild(Be); + } + } + } + function Ct(Be) { + h(Be, "script") && Et(Be), ae(f(Be, "script"), function(Yr) { + Et(Yr); + }); + } + function Tt() { + return document.querySelector("[hx-boost], [data-hx-boost]"); + } + function Rt(Be) { + var Yr = null, Mr = []; + if (document.evaluate) + for (var Dr = document.evaluate('//*[@*[ starts-with(name(), "hx-on:") or starts-with(name(), "data-hx-on:") ]]', Be); Yr = Dr.iterateNext(); ) + Mr.push(Yr); + else + for (var Xr = document.getElementsByTagName("*"), Fr = 0; Fr < Xr.length; Fr++) + for (var Ur = Xr[Fr].attributes, Br = 0; Br < Ur.length; Br++) { + var jr = Ur[Br].name; + (g(jr, "hx-on:") || g(jr, "data-hx-on:")) && Mr.push(Xr[Fr]); + } + return Mr; + } + function Ot(Be) { + if (Be.querySelectorAll) { + var Yr = Tt() ? ", a" : "", Mr = Be.querySelectorAll(w + Yr + ", form, [type='submit'], [hx-sse], [data-hx-sse], [hx-ws], [data-hx-ws], [hx-ext], [data-hx-ext], [hx-trigger], [data-hx-trigger], [hx-on], [data-hx-on]"); + return Mr; + } else + return []; + } + function qt(Be) { + var Yr = s("#" + Q(Be, "form")) || v(Be, "form"); + if (Yr) { + var Mr = function(Dr) { + var Xr = v(Dr.target, "button, input[type='submit']"); + if (Xr !== null) { + var Fr = ie(Yr); + Fr.lastButtonClicked = Xr; + } + }; + Be.addEventListener("click", Mr), Be.addEventListener("focusin", Mr), Be.addEventListener("focusout", function(Dr) { + var Xr = ie(Yr); + Xr.lastButtonClicked = null; + }); + } + } + function Ht(Be) { + var Yr = We(Be), Mr = 0; + for (let Dr = 0; Dr < Yr.length; Dr++) { + const Xr = Yr[Dr]; + Xr === "{" ? Mr++ : Xr === "}" && Mr--; + } + return Mr; + } + function Lt(Be, Yr, Mr) { + var Dr = ie(Be); + Dr.onHandlers = []; + var Xr, Fr = function(Ur) { + return gr(Be, function() { + Xr || (Xr = new Function("event", Mr)), Xr.call(Be, Ur); + }); + }; + Be.addEventListener(Yr, Fr), Dr.onHandlers.push({ event: Yr, listener: Fr }); + } + function At(Be) { + var Yr = ee(Be, "hx-on"); + if (Yr) { + for (var Mr = {}, Dr = Yr.split(` +`), Xr = null, Fr = 0; Dr.length > 0; ) { + var Ur = Dr.shift(), Br = Ur.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/); + Fr === 0 && Br ? (Ur.split(":"), Xr = Br[1].slice(0, -1), Mr[Xr] = Br[2]) : Mr[Xr] += Ur, Fr += Ht(Ur); + } + for (var jr in Mr) + Lt(Be, jr, Mr[jr]); + } + } + function Nt(Be) { + Oe(Be); + for (var Yr = 0; Yr < Be.attributes.length; Yr++) { + var Mr = Be.attributes[Yr].name, Dr = Be.attributes[Yr].value; + if (g(Mr, "hx-on:") || g(Mr, "data-hx-on:")) { + let Xr = Mr.slice(Mr.indexOf(":") + 1); + g(Xr, ":") && (Xr = "htmx" + Xr), Lt(Be, Xr, Dr); + } + } + } + function It(Be) { + if (v(Be, Y.config.disableSelector)) { + m(Be); + return; + } + var Yr = ie(Be); + if (Yr.initHash !== Re(Be)) { + qe(Be), Yr.initHash = Re(Be), At(Be), fe(Be, "htmx:beforeProcessNode"), Be.value && (Yr.lastValue = Be.value); + var Mr = Ze(Be), Dr = wt(Be, Yr, Mr); + Dr || (re(Be, "hx-boost") === "true" ? et(Be, Yr, Mr) : o(Be, "hx-trigger") && Mr.forEach(function(Ur) { + St(Be, Ur, Yr, function() { + }); + })), (Be.tagName === "FORM" || Q(Be, "type") === "submit" && o(Be, "form")) && qt(Be); + var Xr = ee(Be, "hx-sse"); + Xr && dt(Be, Yr, Xr); + var Fr = ee(Be, "hx-ws"); + Fr && ut(Be, Yr, Fr), fe(Be, "htmx:afterProcessNode"); + } + } + function Pt(Be) { + if (Be = s(Be), v(Be, Y.config.disableSelector)) { + m(Be); + return; + } + It(Be), ae(Ot(Be), function(Yr) { + It(Yr); + }), ae(Rt(Be), Nt); + } + function kt(Be) { + return Be.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(); + } + function Mt(Be, Yr) { + var Mr; + return window.CustomEvent && typeof window.CustomEvent == "function" ? Mr = new CustomEvent(Be, { bubbles: !0, cancelable: !0, detail: Yr }) : (Mr = te().createEvent("CustomEvent"), Mr.initCustomEvent(Be, !0, !0, Yr)), Mr; + } + function ue(Be, Yr, Mr) { + fe(Be, Yr, se({ error: Yr }, Mr)); + } + function Dt(Be) { + return Be === "htmx:afterProcessNode"; + } + function C(Be, Yr) { + ae(Lr(Be), function(Mr) { + try { + Yr(Mr); + } catch (Dr) { + y(Dr); + } + }); + } + function y(Be) { + console.error ? console.error(Be) : console.log && console.log("ERROR: ", Be); + } + function fe(Be, Yr, Mr) { + Be = s(Be), Mr == null && (Mr = {}), Mr.elt = Be; + var Dr = Mt(Yr, Mr); + Y.logger && !Dt(Yr) && Y.logger(Be, Yr, Mr), Mr.error && (y(Mr.error), fe(Be, "htmx:error", { errorInfo: Mr })); + var Xr = Be.dispatchEvent(Dr), Fr = kt(Yr); + if (Xr && Fr !== Yr) { + var Ur = Mt(Fr, Dr.detail); + Xr = Xr && Be.dispatchEvent(Ur); + } + return C(Be, function(Br) { + Xr = Xr && Br.onEvent(Yr, Dr) !== !1 && !Dr.defaultPrevented; + }), Xr; + } + var Xt = location.pathname + location.search; + function Ft() { + var Be = te().querySelector("[hx-history-elt],[data-hx-history-elt]"); + return Be || te().body; + } + function Ut(Be, Yr, Mr, Dr) { + if (M()) { + Be = D(Be); + for (var Xr = S(localStorage.getItem("htmx-history-cache")) || [], Fr = 0; Fr < Xr.length; Fr++) + if (Xr[Fr].url === Be) { + Xr.splice(Fr, 1); + break; + } + var Ur = { url: Be, content: Yr, title: Mr, scroll: Dr }; + for (fe(te().body, "htmx:historyItemCreated", { item: Ur, cache: Xr }), Xr.push(Ur); Xr.length > Y.config.historyCacheSize; ) + Xr.shift(); + for (; Xr.length > 0; ) + try { + localStorage.setItem("htmx-history-cache", JSON.stringify(Xr)); + break; + } catch (Br) { + ue(te().body, "htmx:historyCacheError", { cause: Br, cache: Xr }), Xr.shift(); + } + } + } + function Bt(Be) { + if (!M()) + return null; + Be = D(Be); + for (var Yr = S(localStorage.getItem("htmx-history-cache")) || [], Mr = 0; Mr < Yr.length; Mr++) + if (Yr[Mr].url === Be) + return Yr[Mr]; + return null; + } + function Vt(Be) { + var Yr = Y.config.requestClass, Mr = Be.cloneNode(!0); + return ae(f(Mr, "." + Yr), function(Dr) { + n(Dr, Yr); + }), Mr.innerHTML; + } + function jt() { + var Be = Ft(), Yr = Xt || location.pathname + location.search, Mr; + try { + Mr = te().querySelector('[hx-history="false" i],[data-hx-history="false" i]'); + } catch { + Mr = te().querySelector('[hx-history="false"],[data-hx-history="false"]'); + } + Mr || (fe(te().body, "htmx:beforeHistorySave", { path: Yr, historyElt: Be }), Ut(Yr, Vt(Be), te().title, window.scrollY)), Y.config.historyEnabled && history.replaceState({ htmx: !0 }, te().title, window.location.href); + } + function _t(Be) { + Y.config.getCacheBusterParam && (Be = Be.replace(/org\.htmx\.cache-buster=[^&]*&?/, ""), (_(Be, "&") || _(Be, "?")) && (Be = Be.slice(0, -1))), Y.config.historyEnabled && history.pushState({ htmx: !0 }, "", Be), Xt = Be; + } + function zt(Be) { + Y.config.historyEnabled && history.replaceState({ htmx: !0 }, "", Be), Xt = Be; + } + function Wt(Be) { + ae(Be, function(Yr) { + Yr.call(); + }); + } + function $t(Be) { + var Yr = new XMLHttpRequest(), Mr = { path: Be, xhr: Yr }; + fe(te().body, "htmx:historyCacheMiss", Mr), Yr.open("GET", Be, !0), Yr.setRequestHeader("HX-History-Restore-Request", "true"), Yr.onload = function() { + if (this.status >= 200 && this.status < 400) { + fe(te().body, "htmx:historyCacheMissLoad", Mr); + var Dr = l(this.response); + Dr = Dr.querySelector("[hx-history-elt],[data-hx-history-elt]") || Dr; + var Xr = Ft(), Fr = T(Xr), Ur = Xe(this.response); + if (Ur) { + var Br = E("title"); + Br ? Br.innerHTML = Ur : window.document.title = Ur; + } + ke(Xr, Dr, Fr), Wt(Fr.tasks), Xt = Be, fe(te().body, "htmx:historyRestore", { path: Be, cacheMiss: !0, serverResponse: this.response }); + } else + ue(te().body, "htmx:historyCacheMissLoadError", Mr); + }, Yr.send(); + } + function Gt(Be) { + jt(), Be = Be || location.pathname + location.search; + var Yr = Bt(Be); + if (Yr) { + var Mr = l(Yr.content), Dr = Ft(), Xr = T(Dr); + ke(Dr, Mr, Xr), Wt(Xr.tasks), document.title = Yr.title, setTimeout(function() { + window.scrollTo(0, Yr.scroll); + }, 0), Xt = Be, fe(te().body, "htmx:historyRestore", { path: Be, item: Yr }); + } else + Y.config.refreshOnHistoryMiss ? window.location.reload(!0) : $t(Be); + } + function Jt(Be) { + var Yr = ve(Be, "hx-indicator"); + return Yr == null && (Yr = [Be]), ae(Yr, function(Mr) { + var Dr = ie(Mr); + Dr.requestCount = (Dr.requestCount || 0) + 1, Mr.classList.add.call(Mr.classList, Y.config.requestClass); + }), Yr; + } + function Zt(Be) { + var Yr = ve(Be, "hx-disabled-elt"); + return Yr == null && (Yr = []), ae(Yr, function(Mr) { + var Dr = ie(Mr); + Dr.requestCount = (Dr.requestCount || 0) + 1, Mr.setAttribute("disabled", ""); + }), Yr; + } + function Kt(Be, Yr) { + ae(Be, function(Mr) { + var Dr = ie(Mr); + Dr.requestCount = (Dr.requestCount || 0) - 1, Dr.requestCount === 0 && Mr.classList.remove.call(Mr.classList, Y.config.requestClass); + }), ae(Yr, function(Mr) { + var Dr = ie(Mr); + Dr.requestCount = (Dr.requestCount || 0) - 1, Dr.requestCount === 0 && Mr.removeAttribute("disabled"); + }); + } + function Yt(Be, Yr) { + for (var Mr = 0; Mr < Be.length; Mr++) { + var Dr = Be[Mr]; + if (Dr.isSameNode(Yr)) + return !0; + } + return !1; + } + function Qt(Be) { + return Be.name === "" || Be.name == null || Be.disabled || Be.type === "button" || Be.type === "submit" || Be.tagName === "image" || Be.tagName === "reset" || Be.tagName === "file" ? !1 : Be.type === "checkbox" || Be.type === "radio" ? Be.checked : !0; + } + function er(Be, Yr, Mr) { + if (Be != null && Yr != null) { + var Dr = Mr[Be]; + Dr === void 0 ? Mr[Be] = Yr : Array.isArray(Dr) ? Array.isArray(Yr) ? Mr[Be] = Dr.concat(Yr) : Dr.push(Yr) : Array.isArray(Yr) ? Mr[Be] = [Dr].concat(Yr) : Mr[Be] = [Dr, Yr]; + } + } + function tr(Be, Yr, Mr, Dr, Xr) { + if (!(Dr == null || Yt(Be, Dr))) { + if (Be.push(Dr), Qt(Dr)) { + var Fr = Q(Dr, "name"), Ur = Dr.value; + Dr.multiple && (Ur = I(Dr.querySelectorAll("option:checked")).map(function(jr) { + return jr.value; + })), Dr.files && (Ur = I(Dr.files)), er(Fr, Ur, Yr), Xr && rr(Dr, Mr); + } + if (h(Dr, "form")) { + var Br = Dr.elements; + ae(Br, function(jr) { + tr(Be, Yr, Mr, jr, Xr); + }); + } + } + } + function rr(Be, Yr) { + Be.willValidate && (fe(Be, "htmx:validation:validate"), Be.checkValidity() || (Yr.push({ elt: Be, message: Be.validationMessage, validity: Be.validity }), fe(Be, "htmx:validation:failed", { message: Be.validationMessage, validity: Be.validity }))); + } + function nr(Be, Yr) { + var Mr = [], Dr = {}, Xr = {}, Fr = [], Ur = ie(Be), Br = h(Be, "form") && Be.noValidate !== !0 || ee(Be, "hx-validate") === "true"; + if (Ur.lastButtonClicked && (Br = Br && Ur.lastButtonClicked.formNoValidate !== !0), Yr !== "get" && tr(Mr, Xr, Fr, v(Be, "form"), Br), tr(Mr, Dr, Fr, Be, Br), Ur.lastButtonClicked || Be.tagName === "BUTTON" || Be.tagName === "INPUT" && Q(Be, "type") === "submit") { + var jr = Ur.lastButtonClicked || Be, _r = Q(jr, "name"); + er(_r, jr.value, Xr); + } + var Qr = ve(Be, "hx-include"); + return ae(Qr, function(Vr) { + tr(Mr, Dr, Fr, Vr, Br), h(Vr, "form") || ae(Vr.querySelectorAll(Je), function($r) { + tr(Mr, Dr, Fr, $r, Br); + }); + }), Dr = se(Dr, Xr), { errors: Fr, values: Dr }; + } + function ir(Be, Yr, Mr) { + Be !== "" && (Be += "&"), String(Mr) === "[object Object]" && (Mr = JSON.stringify(Mr)); + var Dr = encodeURIComponent(Mr); + return Be += encodeURIComponent(Yr) + "=" + Dr, Be; + } + function ar(Be) { + var Yr = ""; + for (var Mr in Be) + if (Be.hasOwnProperty(Mr)) { + var Dr = Be[Mr]; + Array.isArray(Dr) ? ae(Dr, function(Xr) { + Yr = ir(Yr, Mr, Xr); + }) : Yr = ir(Yr, Mr, Dr); + } + return Yr; + } + function or(Be) { + var Yr = new FormData(); + for (var Mr in Be) + if (Be.hasOwnProperty(Mr)) { + var Dr = Be[Mr]; + Array.isArray(Dr) ? ae(Dr, function(Xr) { + Yr.append(Mr, Xr); + }) : Yr.append(Mr, Dr); + } + return Yr; + } + function sr(Be, Yr, Mr) { + var Dr = { "HX-Request": "true", "HX-Trigger": Q(Be, "id"), "HX-Trigger-Name": Q(Be, "name"), "HX-Target": ee(Yr, "id"), "HX-Current-URL": te().location.href }; + return dr(Be, "hx-headers", !1, Dr), Mr !== void 0 && (Dr["HX-Prompt"] = Mr), ie(Be).boosted && (Dr["HX-Boosted"] = "true"), Dr; + } + function lr(Be, Yr) { + var Mr = re(Yr, "hx-params"); + if (Mr) { + if (Mr === "none") + return {}; + if (Mr === "*") + return Be; + if (Mr.indexOf("not ") === 0) + return ae(Mr.substr(4).split(","), function(Xr) { + Xr = Xr.trim(), delete Be[Xr]; + }), Be; + var Dr = {}; + return ae(Mr.split(","), function(Xr) { + Xr = Xr.trim(), Dr[Xr] = Be[Xr]; + }), Dr; + } else + return Be; + } + function ur(Be) { + return Q(Be, "href") && Q(Be, "href").indexOf("#") >= 0; + } + function fr(Be, Yr) { + var Mr = Yr || re(Be, "hx-swap"), Dr = { swapStyle: ie(Be).boosted ? "innerHTML" : Y.config.defaultSwapStyle, swapDelay: Y.config.defaultSwapDelay, settleDelay: Y.config.defaultSettleDelay }; + if (ie(Be).boosted && !ur(Be) && (Dr.show = "top"), Mr) { + var Xr = k(Mr); + if (Xr.length > 0) + for (var Fr = 0; Fr < Xr.length; Fr++) { + var Ur = Xr[Fr]; + if (Ur.indexOf("swap:") === 0) + Dr.swapDelay = d(Ur.substr(5)); + else if (Ur.indexOf("settle:") === 0) + Dr.settleDelay = d(Ur.substr(7)); + else if (Ur.indexOf("transition:") === 0) + Dr.transition = Ur.substr(11) === "true"; + else if (Ur.indexOf("ignoreTitle:") === 0) + Dr.ignoreTitle = Ur.substr(12) === "true"; + else if (Ur.indexOf("scroll:") === 0) { + var Br = Ur.substr(7), jr = Br.split(":"), _r = jr.pop(), Qr = jr.length > 0 ? jr.join(":") : null; + Dr.scroll = _r, Dr.scrollTarget = Qr; + } else if (Ur.indexOf("show:") === 0) { + var Vr = Ur.substr(5), jr = Vr.split(":"), $r = jr.pop(), Qr = jr.length > 0 ? jr.join(":") : null; + Dr.show = $r, Dr.showTarget = Qr; + } else if (Ur.indexOf("focus-scroll:") === 0) { + var tn = Ur.substr(13); + Dr.focusScroll = tn == "true"; + } else + Fr == 0 ? Dr.swapStyle = Ur : y("Unknown modifier in hx-swap: " + Ur); + } + } + return Dr; + } + function cr(Be) { + return re(Be, "hx-encoding") === "multipart/form-data" || h(Be, "form") && Q(Be, "enctype") === "multipart/form-data"; + } + function hr(Be, Yr, Mr) { + var Dr = null; + return C(Yr, function(Xr) { + Dr == null && (Dr = Xr.encodeParameters(Be, Mr, Yr)); + }), Dr ?? (cr(Yr) ? or(Mr) : ar(Mr)); + } + function T(Be) { + return { tasks: [], elts: [Be] }; + } + function vr(Be, Yr) { + var Mr = Be[0], Dr = Be[Be.length - 1]; + if (Yr.scroll) { + var Xr = null; + Yr.scrollTarget && (Xr = le(Mr, Yr.scrollTarget)), Yr.scroll === "top" && (Mr || Xr) && (Xr = Xr || Mr, Xr.scrollTop = 0), Yr.scroll === "bottom" && (Dr || Xr) && (Xr = Xr || Dr, Xr.scrollTop = Xr.scrollHeight); + } + if (Yr.show) { + var Xr = null; + if (Yr.showTarget) { + var Fr = Yr.showTarget; + Yr.showTarget === "window" && (Fr = "body"), Xr = le(Mr, Fr); + } + Yr.show === "top" && (Mr || Xr) && (Xr = Xr || Mr, Xr.scrollIntoView({ block: "start", behavior: Y.config.scrollBehavior })), Yr.show === "bottom" && (Dr || Xr) && (Xr = Xr || Dr, Xr.scrollIntoView({ block: "end", behavior: Y.config.scrollBehavior })); + } + } + function dr(Be, Yr, Mr, Dr) { + if (Dr == null && (Dr = {}), Be == null) + return Dr; + var Xr = ee(Be, Yr); + if (Xr) { + var Fr = Xr.trim(), Ur = Mr; + if (Fr === "unset") + return null; + Fr.indexOf("javascript:") === 0 ? (Fr = Fr.substr(11), Ur = !0) : Fr.indexOf("js:") === 0 && (Fr = Fr.substr(3), Ur = !0), Fr.indexOf("{") !== 0 && (Fr = "{" + Fr + "}"); + var Br; + Ur ? Br = gr(Be, function() { + return Function("return (" + Fr + ")")(); + }, {}) : Br = S(Fr); + for (var jr in Br) + Br.hasOwnProperty(jr) && Dr[jr] == null && (Dr[jr] = Br[jr]); + } + return dr(u(Be), Yr, Mr, Dr); + } + function gr(Be, Yr, Mr) { + return Y.config.allowEval ? Yr() : (ue(Be, "htmx:evalDisallowedError"), Mr); + } + function mr(Be, Yr) { + return dr(Be, "hx-vars", !0, Yr); + } + function pr(Be, Yr) { + return dr(Be, "hx-vals", !1, Yr); + } + function xr(Be) { + return se(mr(Be), pr(Be)); + } + function yr(Be, Yr, Mr) { + if (Mr !== null) + try { + Be.setRequestHeader(Yr, Mr); + } catch { + Be.setRequestHeader(Yr, encodeURIComponent(Mr)), Be.setRequestHeader(Yr + "-URI-AutoEncoded", "true"); + } + } + function br(Be) { + if (Be.responseURL && typeof URL < "u") + try { + var Yr = new URL(Be.responseURL); + return Yr.pathname + Yr.search; + } catch { + ue(te().body, "htmx:badResponseUrl", { url: Be.responseURL }); + } + } + function R(Be, Yr) { + return Be.getAllResponseHeaders().match(Yr); + } + function wr(Be, Yr, Mr) { + return Be = Be.toLowerCase(), Mr ? Mr instanceof Element || L(Mr, "String") ? ce(Be, Yr, null, null, { targetOverride: s(Mr), returnPromise: !0 }) : ce(Be, Yr, s(Mr.source), Mr.event, { handler: Mr.handler, headers: Mr.headers, values: Mr.values, targetOverride: s(Mr.target), swapOverride: Mr.swap, returnPromise: !0 }) : ce(Be, Yr, null, null, { returnPromise: !0 }); + } + function Sr(Be) { + for (var Yr = []; Be; ) + Yr.push(Be), Be = Be.parentElement; + return Yr; + } + function Er(Be, Yr, Mr) { + var Dr, Xr; + if (typeof URL == "function") { + Xr = new URL(Yr, document.location.href); + var Fr = document.location.origin; + Dr = Fr === Xr.origin; + } else + Xr = Yr, Dr = g(Yr, document.location.origin); + return Y.config.selfRequestsOnly && !Dr ? !1 : fe(Be, "htmx:validateUrl", se({ url: Xr, sameHost: Dr }, Mr)); + } + function ce(Be, Yr, Mr, Dr, Xr, Fr) { + var Ur = null, Br = null; + if (Xr = Xr ?? {}, Xr.returnPromise && typeof Promise < "u") + var jr = new Promise(function(ln, un) { + Ur = ln, Br = un; + }); + Mr == null && (Mr = te().body); + var _r = Xr.handler || Tr; + if (!oe(Mr)) + return ne(Ur), jr; + var Qr = Xr.targetOverride || ge(Mr); + if (Qr == null || Qr == he) + return ue(Mr, "htmx:targetError", { target: ee(Mr, "hx-target") }), ne(Br), jr; + var Vr = ie(Mr), $r = Vr.lastButtonClicked; + if ($r) { + var tn = Q($r, "formaction"); + tn != null && (Yr = tn); + var gn = Q($r, "formmethod"); + gn != null && (Be = gn); + } + if (!Fr) { + var xn = function() { + return ce(Be, Yr, Mr, Dr, Xr, !0); + }, yn = { target: Qr, elt: Mr, path: Yr, verb: Be, triggeringEvent: Dr, etc: Xr, issueRequest: xn }; + if (fe(Mr, "htmx:confirm", yn) === !1) + return ne(Ur), jr; + } + var nn = Mr, rn = re(Mr, "hx-sync"), an = null, bn = !1; + if (rn) { + var qn = rn.split(":"), Zr = qn[0].trim(); + if (Zr === "this" ? nn = de(Mr, "hx-sync") : nn = le(Mr, Zr), rn = (qn[1] || "drop").trim(), Vr = ie(nn), rn === "drop" && Vr.xhr && Vr.abortable !== !0) + return ne(Ur), jr; + if (rn === "abort") { + if (Vr.xhr) + return ne(Ur), jr; + bn = !0; + } else if (rn === "replace") + fe(nn, "htmx:abort"); + else if (rn.indexOf("queue") === 0) { + var en = rn.split(" "); + an = (en[1] || "last").trim(); + } + } + if (Vr.xhr) + if (Vr.abortable) + fe(nn, "htmx:abort"); + else { + if (an == null) { + if (Dr) { + var fn = ie(Dr); + fn && fn.triggerSpec && fn.triggerSpec.queue && (an = fn.triggerSpec.queue); + } + an == null && (an = "last"); + } + return Vr.queuedRequests == null && (Vr.queuedRequests = []), an === "first" && Vr.queuedRequests.length === 0 ? Vr.queuedRequests.push(function() { + ce(Be, Yr, Mr, Dr, Xr); + }) : an === "all" ? Vr.queuedRequests.push(function() { + ce(Be, Yr, Mr, Dr, Xr); + }) : an === "last" && (Vr.queuedRequests = [], Vr.queuedRequests.push(function() { + ce(Be, Yr, Mr, Dr, Xr); + })), ne(Ur), jr; + } + var zr = new XMLHttpRequest(); + Vr.xhr = zr, Vr.abortable = bn; + var Jr = function() { + if (Vr.xhr = null, Vr.abortable = !1, Vr.queuedRequests != null && Vr.queuedRequests.length > 0) { + var ln = Vr.queuedRequests.shift(); + ln(); + } + }, wn = re(Mr, "hx-prompt"); + if (wn) { + var hn = prompt(wn); + if (hn === null || !fe(Mr, "htmx:prompt", { prompt: hn, target: Qr })) + return ne(Ur), Jr(), jr; + } + var mn = re(Mr, "hx-confirm"); + if (mn && !confirm(mn)) + return ne(Ur), Jr(), jr; + var Wr = sr(Mr, Qr, hn); + Xr.headers && (Wr = se(Wr, Xr.headers)); + var pn = nr(Mr, Be), cn = pn.errors, on = pn.values; + Xr.values && (on = se(on, Xr.values)); + var In = xr(Mr), Ln = se(on, In), dn = lr(Ln, Mr); + Be !== "get" && !cr(Mr) && (Wr["Content-Type"] = "application/x-www-form-urlencoded"), Y.config.getCacheBusterParam && Be === "get" && (dn["org.htmx.cache-buster"] = Q(Qr, "id") || "true"), (Yr == null || Yr === "") && (Yr = te().location.href); + var Rn = dr(Mr, "hx-request"), Hn = ie(Mr).boosted, Sn = Y.config.methodsThatUseUrlParams.indexOf(Be) >= 0, Kr = { boosted: Hn, useUrlParams: Sn, parameters: dn, unfilteredParameters: Ln, headers: Wr, target: Qr, verb: Be, errors: cn, withCredentials: Xr.credentials || Rn.credentials || Y.config.withCredentials, timeout: Xr.timeout || Rn.timeout || Y.config.timeout, path: Yr, triggeringEvent: Dr }; + if (!fe(Mr, "htmx:configRequest", Kr)) + return ne(Ur), Jr(), jr; + if (Yr = Kr.path, Be = Kr.verb, Wr = Kr.headers, dn = Kr.parameters, cn = Kr.errors, Sn = Kr.useUrlParams, cn && cn.length > 0) + return fe(Mr, "htmx:validation:halted", Kr), ne(Ur), Jr(), jr; + var An = Yr.split("#"), Yn = An[0], Tn = An[1], sn = Yr; + if (Sn) { + sn = Yn; + var kn = Object.keys(dn).length !== 0; + kn && (sn.indexOf("?") < 0 ? sn += "?" : sn += "&", sn += ar(dn), Tn && (sn += "#" + Tn)); + } + if (!Er(Mr, sn, Kr)) + return ue(Mr, "htmx:invalidPath", Kr), ne(Br), jr; + if (zr.open(Be.toUpperCase(), sn, !0), zr.overrideMimeType("text/html"), zr.withCredentials = Kr.withCredentials, zr.timeout = Kr.timeout, !Rn.noHeaders) { + for (var On in Wr) + if (Wr.hasOwnProperty(On)) { + var Pn = Wr[On]; + yr(zr, On, Pn); + } + } + var Gr = { xhr: zr, target: Qr, requestConfig: Kr, etc: Xr, boosted: Hn, pathInfo: { requestPath: Yr, finalRequestPath: sn, anchor: Tn } }; + if (zr.onload = function() { + try { + var ln = Sr(Mr); + if (Gr.pathInfo.responsePath = br(zr), _r(Mr, Gr), Kt(En, Cn), fe(Mr, "htmx:afterRequest", Gr), fe(Mr, "htmx:afterOnLoad", Gr), !oe(Mr)) { + for (var un = null; ln.length > 0 && un == null; ) { + var vn = ln.shift(); + oe(vn) && (un = vn); + } + un && (fe(un, "htmx:afterRequest", Gr), fe(un, "htmx:afterOnLoad", Gr)); + } + ne(Ur), Jr(); + } catch (Nn) { + throw ue(Mr, "htmx:onLoadError", se({ error: Nn }, Gr)), Nn; + } + }, zr.onerror = function() { + Kt(En, Cn), ue(Mr, "htmx:afterRequest", Gr), ue(Mr, "htmx:sendError", Gr), ne(Br), Jr(); + }, zr.onabort = function() { + Kt(En, Cn), ue(Mr, "htmx:afterRequest", Gr), ue(Mr, "htmx:sendAbort", Gr), ne(Br), Jr(); + }, zr.ontimeout = function() { + Kt(En, Cn), ue(Mr, "htmx:afterRequest", Gr), ue(Mr, "htmx:timeout", Gr), ne(Br), Jr(); + }, !fe(Mr, "htmx:beforeRequest", Gr)) + return ne(Ur), Jr(), jr; + var En = Jt(Mr), Cn = Zt(Mr); + ae(["loadstart", "loadend", "progress", "abort"], function(ln) { + ae([zr, zr.upload], function(un) { + un.addEventListener(ln, function(vn) { + fe(Mr, "htmx:xhr:" + ln, { lengthComputable: vn.lengthComputable, loaded: vn.loaded, total: vn.total }); + }); + }); + }), fe(Mr, "htmx:beforeSend", Gr); + var Mn = Sn ? null : hr(zr, Mr, dn); + return zr.send(Mn), jr; + } + function Cr(Be, Yr) { + var Mr = Yr.xhr, Dr = null, Xr = null; + if (R(Mr, /HX-Push:/i) ? (Dr = Mr.getResponseHeader("HX-Push"), Xr = "push") : R(Mr, /HX-Push-Url:/i) ? (Dr = Mr.getResponseHeader("HX-Push-Url"), Xr = "push") : R(Mr, /HX-Replace-Url:/i) && (Dr = Mr.getResponseHeader("HX-Replace-Url"), Xr = "replace"), Dr) + return Dr === "false" ? {} : { type: Xr, path: Dr }; + var Fr = Yr.pathInfo.finalRequestPath, Ur = Yr.pathInfo.responsePath, Br = re(Be, "hx-push-url"), jr = re(Be, "hx-replace-url"), _r = ie(Be).boosted, Qr = null, Vr = null; + return Br ? (Qr = "push", Vr = Br) : jr ? (Qr = "replace", Vr = jr) : _r && (Qr = "push", Vr = Ur || Fr), Vr ? Vr === "false" ? {} : (Vr === "true" && (Vr = Ur || Fr), Yr.pathInfo.anchor && Vr.indexOf("#") === -1 && (Vr = Vr + "#" + Yr.pathInfo.anchor), { type: Qr, path: Vr }) : {}; + } + function Tr(Be, Yr) { + var Mr = Yr.xhr, Dr = Yr.target, Xr = Yr.etc; + if (Yr.requestConfig, !!fe(Be, "htmx:beforeOnLoad", Yr)) { + if (R(Mr, /HX-Trigger:/i) && Ue(Mr, "HX-Trigger", Be), R(Mr, /HX-Location:/i)) { + jt(); + var Fr = Mr.getResponseHeader("HX-Location"), Ur; + Fr.indexOf("{") === 0 && (Ur = S(Fr), Fr = Ur.path, delete Ur.path), wr("GET", Fr, Ur).then(function() { + _t(Fr); + }); + return; + } + var Br = R(Mr, /HX-Refresh:/i) && Mr.getResponseHeader("HX-Refresh") === "true"; + if (R(Mr, /HX-Redirect:/i)) { + location.href = Mr.getResponseHeader("HX-Redirect"), Br && location.reload(); + return; + } + if (Br) { + location.reload(); + return; + } + R(Mr, /HX-Retarget:/i) && (Yr.target = te().querySelector(Mr.getResponseHeader("HX-Retarget"))); + var jr = Cr(Be, Yr), _r = Mr.status >= 200 && Mr.status < 400 && Mr.status !== 204, Qr = Mr.response, Vr = Mr.status >= 400, $r = Y.config.ignoreTitle, tn = se({ shouldSwap: _r, serverResponse: Qr, isError: Vr, ignoreTitle: $r }, Yr); + if (fe(Dr, "htmx:beforeSwap", tn)) { + if (Dr = tn.target, Qr = tn.serverResponse, Vr = tn.isError, $r = tn.ignoreTitle, Yr.target = Dr, Yr.failed = Vr, Yr.successful = !Vr, tn.shouldSwap) { + Mr.status === 286 && Ke(Be), C(Be, function(Zr) { + Qr = Zr.transformResponse(Qr, Mr, Be); + }), jr.type && jt(); + var gn = Xr.swapOverride; + R(Mr, /HX-Reswap:/i) && (gn = Mr.getResponseHeader("HX-Reswap")); + var Ur = fr(Be, gn); + Ur.hasOwnProperty("ignoreTitle") && ($r = Ur.ignoreTitle), Dr.classList.add(Y.config.swappingClass); + var xn = null, yn = null, nn = function() { + try { + var Zr = document.activeElement, en = {}; + try { + en = { elt: Zr, start: Zr ? Zr.selectionStart : null, end: Zr ? Zr.selectionEnd : null }; + } catch { + } + var fn; + R(Mr, /HX-Reselect:/i) && (fn = Mr.getResponseHeader("HX-Reselect")); + var zr = T(Dr); + if (Fe(Ur.swapStyle, Dr, Be, Qr, zr, fn), en.elt && !oe(en.elt) && Q(en.elt, "id")) { + var Jr = document.getElementById(Q(en.elt, "id")), wn = { preventScroll: Ur.focusScroll !== void 0 ? !Ur.focusScroll : !Y.config.defaultFocusScroll }; + if (Jr) { + if (en.start && Jr.setSelectionRange) + try { + Jr.setSelectionRange(en.start, en.end); + } catch { + } + Jr.focus(wn); + } + } + if (Dr.classList.remove(Y.config.swappingClass), ae(zr.elts, function(Wr) { + Wr.classList && Wr.classList.add(Y.config.settlingClass), fe(Wr, "htmx:afterSwap", Yr); + }), R(Mr, /HX-Trigger-After-Swap:/i)) { + var hn = Be; + oe(Be) || (hn = te().body), Ue(Mr, "HX-Trigger-After-Swap", hn); + } + var mn = function() { + if (ae(zr.tasks, function(on) { + on.call(); + }), ae(zr.elts, function(on) { + on.classList && on.classList.remove(Y.config.settlingClass), fe(on, "htmx:afterSettle", Yr); + }), jr.type && (jr.type === "push" ? (_t(jr.path), fe(te().body, "htmx:pushedIntoHistory", { path: jr.path })) : (zt(jr.path), fe(te().body, "htmx:replacedInHistory", { path: jr.path }))), Yr.pathInfo.anchor) { + var Wr = E("#" + Yr.pathInfo.anchor); + Wr && Wr.scrollIntoView({ block: "start", behavior: "auto" }); + } + if (zr.title && !$r) { + var pn = E("title"); + pn ? pn.innerHTML = zr.title : window.document.title = zr.title; + } + if (vr(zr.elts, Ur), R(Mr, /HX-Trigger-After-Settle:/i)) { + var cn = Be; + oe(Be) || (cn = te().body), Ue(Mr, "HX-Trigger-After-Settle", cn); + } + ne(xn); + }; + Ur.settleDelay > 0 ? setTimeout(mn, Ur.settleDelay) : mn(); + } catch (Wr) { + throw ue(Be, "htmx:swapError", Yr), ne(yn), Wr; + } + }, rn = Y.config.globalViewTransitions; + if (Ur.hasOwnProperty("transition") && (rn = Ur.transition), rn && fe(Be, "htmx:beforeTransition", Yr) && typeof Promise < "u" && document.startViewTransition) { + var an = new Promise(function(Zr, en) { + xn = Zr, yn = en; + }), bn = nn; + nn = function() { + document.startViewTransition(function() { + return bn(), an; + }); + }; + } + Ur.swapDelay > 0 ? setTimeout(nn, Ur.swapDelay) : nn(); + } + Vr && ue(Be, "htmx:responseError", se({ error: "Response Status Error Code " + Mr.status + " from " + Yr.pathInfo.requestPath }, Yr)); + } + } + } + var Rr = {}; + function Or() { + return { init: function(Be) { + return null; + }, onEvent: function(Be, Yr) { + return !0; + }, transformResponse: function(Be, Yr, Mr) { + return Be; + }, isInlineSwap: function(Be) { + return !1; + }, handleSwap: function(Be, Yr, Mr, Dr) { + return !1; + }, encodeParameters: function(Be, Yr, Mr) { + return null; + } }; + } + function qr(Be, Yr) { + Yr.init && Yr.init(r), Rr[Be] = se(Or(), Yr); + } + function Hr(Be) { + delete Rr[Be]; + } + function Lr(Be, Yr, Mr) { + if (Be == null) + return Yr; + Yr == null && (Yr = []), Mr == null && (Mr = []); + var Dr = ee(Be, "hx-ext"); + return Dr && ae(Dr.split(","), function(Xr) { + if (Xr = Xr.replace(/ /g, ""), Xr.slice(0, 7) == "ignore:") { + Mr.push(Xr.slice(7)); + return; + } + if (Mr.indexOf(Xr) < 0) { + var Fr = Rr[Xr]; + Fr && Yr.indexOf(Fr) < 0 && Yr.push(Fr); + } + }), Lr(u(Be), Yr, Mr); + } + var Ar = !1; + te().addEventListener("DOMContentLoaded", function() { + Ar = !0; + }); + function Nr(Be) { + Ar || te().readyState === "complete" ? Be() : te().addEventListener("DOMContentLoaded", Be); + } + function Ir() { + Y.config.includeIndicatorStyles !== !1 && te().head.insertAdjacentHTML("beforeend", ""); + } + function Pr() { + var Be = te().querySelector('meta[name="htmx-config"]'); + return Be ? S(Be.content) : null; + } + function kr() { + var Be = Pr(); + Be && (Y.config = se(Y.config, Be)); + } + return Nr(function() { + kr(), Ir(); + var Be = te().body; + Pt(Be); + var Yr = te().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']"); + Be.addEventListener("htmx:abort", function(Dr) { + var Xr = Dr.target, Fr = ie(Xr); + Fr && Fr.xhr && Fr.xhr.abort(); + }); + var Mr = window.onpopstate; + window.onpopstate = function(Dr) { + Dr.state && Dr.state.htmx ? (Gt(), ae(Yr, function(Xr) { + fe(Xr, "htmx:restored", { document: te(), triggerEvent: fe }); + })) : Mr && Mr(Dr); + }, setTimeout(function() { + fe(Be, "htmx:load", {}), Be = null; + }, 0); + }), Y; + }(); + }); +})(htmx_min); +var htmx_minExports = htmx_min.exports; +const htmx = /* @__PURE__ */ getDefaultExportFromCjs(htmx_minExports); +window.htmx = htmx; diff --git a/static/index.css b/static/index.css new file mode 100644 index 0000000..b374655 --- /dev/null +++ b/static/index.css @@ -0,0 +1,541 @@ +/* +! tailwindcss v3.3.3 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.text-5xl { + font-size: 3rem; + line-height: 1; +} + diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..05b2502 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["templates/**/*.html"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/task.go b/task.go new file mode 100644 index 0000000..4c5170f --- /dev/null +++ b/task.go @@ -0,0 +1,128 @@ +package main + +import "context" + +type Item struct { + ID int + Title string + Completed bool +} + +type Tasks struct { + Items []Item + Count int + CompletedCount int +} + +func fetchTasks() ([]Item, error) { + var items []Item + rows, err := DB.Query("select id, title, completed from tasks order by postition;") + if err != nil { + return []Item{}, err + } + defer rows.Close() + for rows.Next() { + item := Item{} + err := rows.Scan(&item.ID, &item.Title, &item.Completed) + if err != nil { + return []Item{}, err + } + items = append(items, item) + } + return items, nil +} + +func fetchTask(ID int) (Item, error) { + var item Item + err := DB.QueryRow("select id, title, completed from tasks where id = (?)", ID).Scan(&item.ID, &item.Title, &item.Completed) + if err != nil { + return Item{}, err + } + return item, nil +} + +func updateTask(ID int, title string) (Item, error) { + var item Item + err := DB.QueryRow("update tasks set title = (?) where id = (?) returning id, title, completed", title, ID).Scan(&item.ID, &item.Title, &item.Completed) + if err != nil { + return Item{}, err + } + return item, nil +} + +func fetchCount() (int, error) { + var count int + err := DB.QueryRow("select count(*) from tasks;").Scan(&count) + if err != nil { + return 0, err + } + return count, nil +} + +func insertTask(title string) (Item, error) { + count, err := fetchCount() + if err != nil { + return Item{}, err + } + var id int + err = DB.QueryRow("insert into tasks (title, position) values (?, ?) returning id", title, count).Scan(&id) + if err != nil { + return Item{}, err + } + item := Item{ID: id, Title: title, Completed: false} + return item, nil +} + +func deleteTask(ctx context.Context, ID int) error { + _, err := DB.Exec("delete from tasks where id = (?)", ID) + if err != nil { + return err + } + rows, err := DB.Query("select id from tasks order by position") + if err != nil { + return err + } + var ids []int + for rows.Next() { + var id int + err := rows.Scan(&id) + if err != nil { + return err + } + ids = append(ids, id) + } + tx, err := DB.BeginTx(ctx, nil) + if err != nil { + return err + } + defer tx.Rollback() + for idx, id := range ids { + _, err := DB.Exec("update tasks set position = (?) where id = (?)", idx, id) + if err != nil { + return err + } + } + err = tx.Commit() + if err != nil { + return err + } + return nil +} + +func orderTasks(ctx context.Context, values []int) error { + tx, err := DB.BeginTx(ctx, nil) + if err != nil { + return err + } + defer tx.Rollback() + for i, v := range values { + _, err := tx.Exec("update tasks set position = (?) where id = (?)", i, v) + if err != nil { + return err + } + } + if err := tx.Commit(); err != nil { + return err + } + return nil +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..83c61af --- /dev/null +++ b/templates/index.html @@ -0,0 +1,15 @@ +{{ define "Base" }} + + + + + + HTMX Go Todo + + + + +

Hello, world!

+ + +{{ end }} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..9ec17a7 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,15 @@ +import { resolve } from "path"; +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + lib: { + entry: [resolve(__dirname, "src/htmx.js")], + formats: ["es"], + name: "[name]", + fileName: "[name]", + }, + outDir: "static", + emptyOutDir: false, + }, +});