From f2ebfbbe0932c4c9c642c0dc43c2d9990b7018b2 Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Tue, 15 Sep 2026 10:55:15 -0400 Subject: [PATCH 01/27] Build first pass structure and styling --- .gitignore | 62 + Gemfile | 4 + Gemfile.lock | 234 + README.md | 44 +- _config.yml | 19 + _data/site.yml | 31 + _includes/footer.html | 3 + _includes/header.html | 25 + _layouts/default.html | 19 + _layouts/home.html | 78 + assets/css/site.css | 4048 +++++++++++++++++ assets/css/tailwind.css | 33 + assets/images/hero-placeholder.svg | 27 + assets/images/release-coastal-placeholder.svg | 4 + assets/images/release-harbor-placeholder.svg | 4 + assets/images/release-tracks-placeholder.svg | 4 + assets/js/navigation.js | 29 + index.md | 166 + package-lock.json | 1419 ++++++ package.json | 17 + tailwind.config.js | 52 + 21 files changed, 6321 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 _config.yml create mode 100644 _data/site.yml create mode 100644 _includes/footer.html create mode 100644 _includes/header.html create mode 100644 _layouts/default.html create mode 100644 _layouts/home.html create mode 100644 assets/css/site.css create mode 100644 assets/css/tailwind.css create mode 100644 assets/images/hero-placeholder.svg create mode 100644 assets/images/release-coastal-placeholder.svg create mode 100644 assets/images/release-harbor-placeholder.svg create mode 100644 assets/images/release-tracks-placeholder.svg create mode 100644 assets/js/navigation.js create mode 100644 index.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 tailwind.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..18a8f22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,62 @@ +# ------------------ +# Jekyll +# ------------------ + +_site/ +.jekyll-cache/ +.jekyll-metadata +.sass-cache/ + +# ------------------ +# Ruby / Bundler +# ------------------ + +.bundle/ +vendor/bundle/ + +# Keep Gemfile.lock committed for a website/application. +# Gemfile.lock + +# ------------------ +# Node / npm +# ------------------ + +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# ------------------ +# Environment files +# ------------------ + +.env +.env.* +!.env.example + +# ------------------ +# macOS +# ------------------ + +.DS_Store +.AppleDouble +.LSOverride + +# ------------------ +# Editors +# ------------------ + +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# ------------------ +# Temporary files +# ------------------ + +*.tmp +*.temp +*.log \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..ddaadd8 --- /dev/null +++ b/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem "jekyll", "~> 4.3" +gem "webrick", "~> 1.9" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..88277b0 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,234 @@ +GEM + remote: https://rubygems.org/ + specs: + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + base64 (0.3.0) + bigdecimal (4.1.3) + colorator (1.1.0) + concurrent-ruby (1.3.8) + csv (3.3.6) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + ffi (1.17.4) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86-linux-gnu) + ffi (1.17.4-x86-linux-musl) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + forwardable-extended (2.6.0) + google-protobuf (4.36.1) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-aarch64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-aarch64-linux-musl) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-arm64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-x86-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-x86-linux-musl) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-x86_64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-x86_64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.36.1-x86_64-linux-musl) + bigdecimal + rake (~> 13.3) + http_parser.rb (0.8.1) + i18n (1.15.2) + concurrent-ruby (~> 1.0) + jekyll (4.4.1) + addressable (~> 2.4) + base64 (~> 0.2) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.3, >= 0.3.6) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) + jekyll-watch (2.2.1) + listen (~> 3.0) + json (2.21.2) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.10.0) + logger + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) + mercenary (0.4.0) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (7.0.5) + rake (13.4.2) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.4.4) + rouge (4.7.0) + safe_yaml (1.0.5) + sass-embedded (1.104.1) + google-protobuf (~> 4.31) + rake (>= 13) + sass-embedded (1.104.1-aarch64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-arm-linux-androideabi) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-riscv64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-riscv64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-riscv64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-x86_64-linux-android) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.104.1-x86_64-linux-musl) + google-protobuf (~> 4.31) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + unicode-display_width (2.6.0) + webrick (1.9.2) + +PLATFORMS + aarch64-linux-android + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-androideabi + arm-linux-gnu + arm-linux-gnueabihf + arm-linux-musl + arm-linux-musleabihf + arm64-darwin + riscv64-linux-android + riscv64-linux-gnu + riscv64-linux-musl + ruby + x86-linux-gnu + x86-linux-musl + x86_64-darwin + x86_64-linux-android + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + jekyll (~> 4.3) + webrick (~> 1.9) + +CHECKSUMS + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + bigdecimal (4.1.3) sha256=61ebe1e5e559bdc3cc6f2c0ee7f427321fc838f59611c294356eb04d6e21cf66 + bundler (4.0.20) sha256=7978a8ac648767f5e635bc522445b79e80a52b907a39a36c2d8085ed6bc762ae + colorator (1.1.0) sha256=e2f85daf57af47d740db2a32191d1bdfb0f6503a0dfbc8327d0c9154d5ddfc38 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 + csv (3.3.6) sha256=aba61e7e507a66f03d45cb1f3c4b6359861c3504038b422962875dce099e4456 + em-websocket (0.5.3) sha256=f56a92bde4e6cb879256d58ee31f124181f68f8887bd14d53d5d9a292758c6a8 + eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 + ffi (1.17.4) sha256=bcd1642e06f0d16fc9e09ac6d49c3a7298b9789bcb58127302f934e437d60acf + ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df + ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39 + ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564 + ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95 + ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b + ffi (1.17.4-x86-linux-gnu) sha256=38e150df5f4ca555e25beca4090823ae09657bceded154e3c52f8631c1ed72cf + ffi (1.17.4-x86-linux-musl) sha256=fbeec0fc7c795bcf86f623bb18d31ea1820f7bd580e1703a3d3740d527437809 + ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496 + ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d + ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e + forwardable-extended (2.6.0) sha256=1bec948c469bbddfadeb3bd90eb8c85f6e627a412a3e852acfd7eaedbac3ec97 + google-protobuf (4.36.1) sha256=893ac9d66b36b6ea50da5418f856bc7c2d2072099a578aeefc2d7757dcab6a77 + google-protobuf (4.36.1-aarch64-linux-gnu) sha256=3883fa1b0e99221f68f4a8511bc4fb1888897dcb6cc8bf2805c92c16fc99b499 + google-protobuf (4.36.1-aarch64-linux-musl) sha256=6da393554ecc96168ae6ddf663392bf8ce4e4fce7c18fda348882ce2e97d6a87 + google-protobuf (4.36.1-arm64-darwin) sha256=4d82184f4582dfa123f9793cd7a73beca9b0d3f0d3717948c4120b6cc0d50f2d + google-protobuf (4.36.1-x86-linux-gnu) sha256=4ea208a8d1a2369728da03e256fc7b454c6781bac486cbfa57d0ed7a0e6352f0 + google-protobuf (4.36.1-x86-linux-musl) sha256=ec302210ea53f136027f556904b0d13eaf7b4d17fd88b15ddd64b2f321c85dfd + google-protobuf (4.36.1-x86_64-darwin) sha256=e92bf3c90c0a9c410cbe430cf366190b1b9b5b2b784f6195a43a178c2ef7e338 + google-protobuf (4.36.1-x86_64-linux-gnu) sha256=e735a3f3d6596b1010013c2030778bc030770e659106fe7e4ae0f07631b551cb + google-protobuf (4.36.1-x86_64-linux-musl) sha256=ae2712b7960e8b1f96d52fef8c2c0dc1cd230f2be13e48492dad0aa2a6a7cf03 + http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a + i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 + jekyll (4.4.1) sha256=4c1144d857a5b2b80d45b8cf5138289579a9f8136aadfa6dd684b31fe2bc18c1 + jekyll-sass-converter (3.1.0) sha256=83925d84f1d134410c11d0c6643b0093e82e3a3cf127e90757a85294a3862443 + jekyll-watch (2.2.1) sha256=bc44ed43f5e0a552836245a54dbff3ea7421ecc2856707e8a1ee203a8387a7e1 + json (2.21.2) sha256=1f1d3b7cf2b3ba1a69beca0bb6db13d5438b80bff3cd54cdaaa620b9b07c1c6a + kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + liquid (4.0.4) sha256=4fcfebb1a045e47918388dbb7a0925e7c3893e58d2bd6c3b3c73ec17a2d8fdb3 + listen (3.10.0) sha256=c6e182db62143aeccc2e1960033bebe7445309c7272061979bb098d03760c9d2 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138 + pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 + rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe + rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 + safe_yaml (1.0.5) sha256=a6ac2d64b7eb027bdeeca1851fe7e7af0d668e133e8a88066a0c6f7087d9f848 + sass-embedded (1.104.1) sha256=baebf97913ef0bb942d0a513655cc09c49f184170b8bcfa7b2bf8a4f27376183 + sass-embedded (1.104.1-aarch64-linux-android) sha256=96d19b72a3cdf59700c225d70fdabc88eb2d629472296b5828cb4feaba97235a + sass-embedded (1.104.1-aarch64-linux-gnu) sha256=74462d649b6d6089dffa0696a0e5f9da68aae76693401396ef51c4b593f4511a + sass-embedded (1.104.1-aarch64-linux-musl) sha256=1b417b5a0399d532fb3b2eee514a430bc2f349d5d2d68c5f5699b95c64ce66a1 + sass-embedded (1.104.1-arm-linux-androideabi) sha256=758a24665dd5b8cb5bd951cb74612734054481af6a2418c6f31384d28b7fed70 + sass-embedded (1.104.1-arm-linux-gnueabihf) sha256=30b5b4bd2210daebc0263d77c236baeb946b5fee37d71e0dde6f2edda733742f + sass-embedded (1.104.1-arm-linux-musleabihf) sha256=e3465c79e2a74a6a7fa9de2b3c02fb8b3a1c0e7edf39c4c79cc285d6f4d088b7 + sass-embedded (1.104.1-arm64-darwin) sha256=521c17268d62be96803661c1ad9551205aafa3553eb71bb56d4106d6872b3c30 + sass-embedded (1.104.1-riscv64-linux-android) sha256=a28ab9ef7bfa998666c16bc12f95db8cd306a457ae11e6ce263fb88a777d5ede + sass-embedded (1.104.1-riscv64-linux-gnu) sha256=c672b56e36b125cc57234c543d50cc468f36f6dc858154341920953d19590b98 + sass-embedded (1.104.1-riscv64-linux-musl) sha256=4bafa3ce08e5b107668e5b75f94fba58a1644d2ec09808d9a807306a43d8bf1d + sass-embedded (1.104.1-x86_64-darwin) sha256=aca394ec6d9911f8bb589cb39e6ef7cfdc9d3467c4f06866a2921a77ee060e0e + sass-embedded (1.104.1-x86_64-linux-android) sha256=a096345383293ffe20558059b1db779e4509f4b7270bad1fa9f517159fdda7b9 + sass-embedded (1.104.1-x86_64-linux-gnu) sha256=a9223bd34c4f5616412f4affbc8c450e5c547f69940ce42c92d23fca9111ea87 + sass-embedded (1.104.1-x86_64-linux-musl) sha256=bcb547d0a8aeace54c2d0a7252792763d2570cf0118060d6181ca18e7916f509 + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 + +BUNDLED WITH + 4.0.20 diff --git a/README.md b/README.md index 665d437..346f1c3 100644 --- a/README.md +++ b/README.md @@ -1 +1,43 @@ -# MARINA-shipdata +# MARINA Jekyll theme starter + +A one-page Jekyll starter based on the supplied dataset landing-page design. It uses Tailwind CSS 3 and daisyUI 4. Editors manage homepage content from the clearly commented front matter in `index.md`, while site-wide header, navigation, and footer settings live in `_data/site.yml`. + +## Run locally + +Requirements: Ruby 3+, Bundler, and Node 18+. + +```bash +bundle install +npm install +npm run dev +``` + +Open `http://127.0.0.1:4000`. + +## Production build + +```bash +npm run build +``` + +The generated site will be in `_site/`. + +## Editing content + +- `index.md` — the single content-editing file for the homepage +- `_data/site.yml` — site-wide branding, navigation, header CTA, and footer organization +- `_layouts/home.html` — protected page structure and Liquid templates +- `tailwind.config.js` — brand colors and the daisyUI theme +- `assets/css/tailwind.css` — reusable Tailwind component classes +- `_includes/header.html` and `_includes/footer.html` — shared chrome +- `assets/js/navigation.js` — reveals the separate fixed navigation after the hero tiles scroll away + +Keep URLs beginning with `#` in quotation marks, for example `url: "#overview"`. For button styles, use only `primary` or `outline`. + +## Next steps + +1. Replace the placeholder content in `index.md`. +2. Add optimized hero/release images under `assets/images/`. +3. Connect the request form to Netlify Forms or your preferred backend. +4. Convert releases into a Jekyll collection later if each needs a detail page. +5. Add analytics, a privacy statement, and finalized accessibility content before launch. diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..8255868 --- /dev/null +++ b/_config.yml @@ -0,0 +1,19 @@ +title: MARINA Dataset +description: A labeled maritime acoustic dataset. +url: "" +baseurl: "" + +exclude: + - node_modules + - package.json + - package-lock.json + - Gemfile + - Gemfile.lock + - README.md + - tailwind.config.js + +defaults: + - scope: + path: "" + values: + layout: default diff --git a/_data/site.yml b/_data/site.yml new file mode 100644 index 0000000..d06fa44 --- /dev/null +++ b/_data/site.yml @@ -0,0 +1,31 @@ +# ================================================== +# SITE-WIDE BRANDING, CALL TO ACTION, AND NAVIGATION +# ================================================== + +brand: + logo: + src_reversed: "/assets/images/marina-logo-light.svg" + src: "/assets/images/marina-logo.svg" + alt: MARINA + +cta: + button: + label: Get the data + url: "#request" + +# These links populate both the homepage navigation tiles and fixed header. +# Always quote URLs beginning with # because YAML treats # as a comment. +navigation: + - label: Overview + url: "#overview" + - label: Capabilities + url: "#capabilities" + - label: Releases + url: "#releases" + - label: Request access + url: "#request" + - label: Citation + url: "#citation" + +footer: + organization: Kitware, Inc. diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..41b9e36 --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,3 @@ + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..ae96d9b --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,25 @@ + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..ec356a2 --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,19 @@ + + + + + + + {{ page.title | default: site.title }} + + + + + + + {% include header.html %} +
{{ content }}
+ {% include footer.html %} + + + diff --git a/_layouts/home.html b/_layouts/home.html new file mode 100644 index 0000000..5de82b3 --- /dev/null +++ b/_layouts/home.html @@ -0,0 +1,78 @@ +--- +layout: default +--- + +
+ +
+
+ {% if page.hero.subheadline %}

{{ page.hero.subheadline | escape }}

{% endif %} +

{{ page.hero.headline | escape }}

+ {% if page.hero.text %}

{{ page.hero.text | escape }}

{% endif %} + {% if page.hero.buttons %}
{% for button in page.hero.buttons %}{% if button.style == "primary" %}{{ button.label | escape }}{% else %}{{ button.label | escape }}{% endif %}{% endfor %}
{% endif %} +
+
+ {% if page.hero.annotation %}{% endif %} + +
+ +
+
+
{% if page.overview.subheadline %}

{{ page.overview.subheadline | escape }}

{% endif %}

{{ page.overview.headline | escape }}

{% if page.overview.paragraphs %}
{% for paragraph in page.overview.paragraphs %}{{ paragraph | markdownify }}{% endfor %}
{% endif %}
+ {% if page.overview.stats %}
{% for stat in page.overview.stats %}
{{ stat.label | escape }}
{{ stat.value | escape }}
{% endfor %}
{% endif %} +
+
+ +
+ {% if page.capabilities.subheadline %}

{{ page.capabilities.subheadline | escape }}

{% endif %}

{{ page.capabilities.headline | escape }}

+ {% if page.capabilities.items %}
{% for item in page.capabilities.items %}
0{{ forloop.index }}

{{ item.title | escape }}

{{ item.text | escape }}

{% endfor %}
{% endif %} +
+ +
+ {% if page.releases.subheadline %}

{{ page.releases.subheadline | escape }}

{% endif %}

{{ page.releases.headline | escape }}

{% if page.releases.text %}

{{ page.releases.text | escape }}

{% endif %} + {% if page.releases.items %}
{% for release in page.releases.items %}
{% if release.image %}{{ release.image_alt | escape }}{% endif %}

{{ release.title | escape }}

{{ release.description | escape }}

▣ {{ release.size | escape }}▦ {{ release.views | escape }}◉ {{ release.date | escape }}
{% if release.buttons %}
{% for button in release.buttons %}{{ button.label | escape }}{% endfor %}
{% endif %}
{% endfor %}
{% endif %} +
+ +
+
+
+ {% if page.request.subheadline %}

{{ page.request.subheadline | escape }}

{% endif %} +

{{ page.request.headline | escape }}

+ {% if page.request.text %}

{{ page.request.text | escape }}

{% endif %} + {% if page.request.benefits %} +
    + {% for benefit in page.request.benefits %}
  • {{ benefit | escape }}
  • {% endfor %} +
+ {% endif %} +
+ +
+ + + + + + + +
+
+
+ +
+ {% if page.citation.subheadline %}

{{ page.citation.subheadline | escape }}

{% endif %}

{{ page.citation.headline | escape }}

{% if page.citation.text %}

{{ page.citation.text | escape }}

{% endif %}
{{ page.citation.code | escape }}

{{ page.citation.contact.headline | escape }}

{{ page.citation.contact.text | escape }}

{{ page.citation.contact.button_label | escape }}
+
diff --git a/assets/css/site.css b/assets/css/site.css new file mode 100644 index 0000000..438e8bf --- /dev/null +++ b/assets/css/site.css @@ -0,0 +1,4048 @@ +*, ::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: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::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: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +/* +! tailwindcss v3.4.19 | 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. +7. Disable tap highlights on iOS +*/ + +html, +:host { + 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: Inter, ui-sans-serif, system-ui, sans-serif; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +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. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. 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-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +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 */ + letter-spacing: 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, +input:where([type='button']), +input:where([type='reset']), +input:where([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]:where(:not([hidden="until-found"])) { + display: none; +} + +:root, +[data-theme] { + background-color: var(--fallback-b1,oklch(var(--b1)/1)); + color: var(--fallback-bc,oklch(var(--bc)/1)); +} + +@supports not (color: oklch(0% 0 0)) { + :root { + color-scheme: light; + --fallback-p: #491eff; + --fallback-pc: #d4dbff; + --fallback-s: #ff41c7; + --fallback-sc: #fff9fc; + --fallback-a: #00cfbd; + --fallback-ac: #00100d; + --fallback-n: #2b3440; + --fallback-nc: #d7dde4; + --fallback-b1: #ffffff; + --fallback-b2: #e5e6e6; + --fallback-b3: #e5e6e6; + --fallback-bc: #1f2937; + --fallback-in: #00b3f0; + --fallback-inc: #000000; + --fallback-su: #00ca92; + --fallback-suc: #000000; + --fallback-wa: #ffc22d; + --fallback-wac: #000000; + --fallback-er: #ff6f70; + --fallback-erc: #000000; + } + + @media (prefers-color-scheme: dark) { + :root { + color-scheme: dark; + --fallback-p: #7582ff; + --fallback-pc: #050617; + --fallback-s: #ff71cf; + --fallback-sc: #190211; + --fallback-a: #00c7b5; + --fallback-ac: #000e0c; + --fallback-n: #2a323c; + --fallback-nc: #a6adbb; + --fallback-b1: #1d232a; + --fallback-b2: #191e24; + --fallback-b3: #15191e; + --fallback-bc: #a6adbb; + --fallback-in: #00b3f0; + --fallback-inc: #000000; + --fallback-su: #00ca92; + --fallback-suc: #000000; + --fallback-wa: #ffc22d; + --fallback-wac: #000000; + --fallback-er: #ff6f70; + --fallback-erc: #000000; + } + } +} + +html { + -webkit-tap-highlight-color: transparent; +} + +* { + scrollbar-color: color-mix(in oklch, currentColor 35%, transparent) transparent; +} + +*:hover { + scrollbar-color: color-mix(in oklch, currentColor 60%, transparent) transparent; +} + +:root { + --p: 72.5487% 0.204994 141.315419; + --ac: 13.9154% 0.027649 237.697542; + --inc: 91.1915% 0.033075 252.190181; + --suc: 14.5097% 0.040999 141.315419; + --wac: 16.1393% 0.029511 78.563206; + --erc: 12.3961% 0.035848 14.27148; + --rounded-box: 1rem; + --rounded-btn: 0.5rem; + --rounded-badge: 1.9rem; + --animation-btn: 0.25s; + --animation-input: .2s; + --btn-focus-scale: 0.95; + --border-btn: 1px; + --tab-border: 1px; + --tab-radius: 0.5rem; + --pc: 19.2776% 0.047936 251.447471; + --s: 55.9576% 0.165373 252.190181; + --sc: 100% 0 0; + --a: 69.577% 0.138245 237.697542; + --n: 19.2776% 0.047936 251.447471; + --nc: 100% 0 0; + --b1: 100% 0 0; + --b2: 97.2191% 0.003423 247.858112; + --b3: 90.9949% 0.010441 247.941163; + --bc: 23.959% 0.023278 251.447002; + --in: 55.9576% 0.165373 252.190181; + --su: 72.5487% 0.204994 141.315419; + --wa: 80.6967% 0.147554 78.563206; + --er: 61.9804% 0.179242 14.27148; +} + +html { + scroll-behavior: smooth; +} + +body { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1))); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +:focus-visible { + outline-style: solid; + outline-width: 2px; + outline-offset: 4px; + outline-color: #4cc43b; +} + +section[id] { + scroll-margin-top: 4rem; +} + +.prose { + color: var(--tw-prose-body); + max-width: 65ch; +} + +.prose :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; +} + +.prose :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-links); + text-decoration: underline; + font-weight: 500; +} + +.prose :where(strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-bold); + font-weight: 600; +} + +.prose :where(a strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: decimal; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-inline-start: 1.625em; +} + +.prose :where(ol[type="A"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="A" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="I"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="I" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="1"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: decimal; +} + +.prose :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: disc; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-inline-start: 1.625em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); +} + +.prose :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); +} + +.prose :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.25em; +} + +.prose :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; +} + +.prose :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-inline-start-width: 0.25rem; + border-inline-start-color: var(--tw-prose-quote-borders); + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-inline-start: 1em; +} + +.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { + content: open-quote; +} + +.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { + content: close-quote; +} + +.prose :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.prose :where(h1 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 900; + color: inherit; +} + +.prose :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.prose :where(h2 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 800; + color: inherit; +} + +.prose :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; +} + +.prose :where(h3 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.prose :where(h4 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + display: block; + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 500; + font-family: inherit; + color: var(--tw-prose-kbd); + box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows); + font-size: 0.875em; + border-radius: 0.3125rem; + padding-top: 0.1875em; + padding-inline-end: 0.375em; + padding-bottom: 0.1875em; + padding-inline-start: 0.375em; +} + +.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; +} + +.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { + content: "`"; +} + +.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { + content: "`"; +} + +.prose :where(a code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h1 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; + font-size: 0.875em; +} + +.prose :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; + font-size: 0.9em; +} + +.prose :where(h4 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-inline-end: 1.1428571em; + padding-bottom: 0.8571429em; + padding-inline-start: 1.1428571em; +} + +.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { + content: none; +} + +.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { + content: none; +} + +.prose :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + width: 100%; + table-layout: auto; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; +} + +.prose :where(thead):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); +} + +.prose :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-inline-end: 0.5714286em; + padding-bottom: 0.5714286em; + padding-inline-start: 0.5714286em; +} + +.prose :where(tbody tr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); +} + +.prose :where(tbody tr:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-bottom-width: 0; +} + +.prose :where(tbody td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + vertical-align: baseline; +} + +.prose :where(tfoot):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-top-width: 1px; + border-top-color: var(--tw-prose-th-borders); +} + +.prose :where(tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + vertical-align: top; +} + +.prose :where(th, td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + text-align: start; +} + +.prose :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; +} + +.prose { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-kbd: #111827; + --tw-prose-kbd-shadows: rgb(17 24 39 / 10%); + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-kbd: #fff; + --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%); + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; +} + +.prose :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0.375em; +} + +.prose :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0.375em; +} + +.prose :where(.prose > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(.prose > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(.prose > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.5em; + padding-inline-start: 1.625em; +} + +.prose :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0; +} + +.prose :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-end: 0; +} + +.prose :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-top: 0.5714286em; + padding-inline-end: 0.5714286em; + padding-bottom: 0.5714286em; + padding-inline-start: 0.5714286em; +} + +.prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0; +} + +.prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-end: 0; +} + +.prose :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(.prose > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(.prose > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-bottom: 0; +} + +.avatar.placeholder > div { + display: flex; + align-items: center; + justify-content: center; +} + +@media (hover:hover) { + .checkbox-primary:hover { + --tw-border-opacity: 1; + border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); + } + + .label a:hover { + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + } + + .menu li > *:not(ul, .menu-title, details, .btn):active, +.menu li > *:not(ul, .menu-title, details, .btn).active, +.menu li > details > summary:active { + --tw-bg-opacity: 1; + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); + } +} + +.btn { + display: inline-flex; + height: 3rem; + min-height: 3rem; + flex-shrink: 0; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + flex-wrap: wrap; + align-items: center; + justify-content: center; + border-radius: var(--rounded-btn, 0.5rem); + border-color: transparent; + border-color: oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity)); + padding-left: 1rem; + padding-right: 1rem; + text-align: center; + font-size: 0.875rem; + line-height: 1em; + gap: 0.5rem; + font-weight: 600; + text-decoration-line: none; + transition-duration: 200ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + border-width: var(--border-btn, 1px); + transition-property: color, background-color, border-color, opacity, box-shadow, transform; + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + outline-color: var(--fallback-bc,oklch(var(--bc)/1)); + background-color: oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + --tw-border-opacity: 1; +} + +.btn-disabled, + .btn[disabled], + .btn:disabled { + pointer-events: none; +} + +.btn-square { + height: 3rem; + width: 3rem; + padding: 0px; +} + +:where(.btn:is(input[type="checkbox"])), +:where(.btn:is(input[type="radio"])) { + width: auto; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.btn:is(input[type="checkbox"]):after, +.btn:is(input[type="radio"]):after { + --tw-content: attr(aria-label); + content: var(--tw-content); +} + +.checkbox { + flex-shrink: 0; + --chkbg: var(--fallback-bc,oklch(var(--bc)/1)); + --chkfg: var(--fallback-b1,oklch(var(--b1)/1)); + height: 1.5rem; + width: 1.5rem; + cursor: pointer; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: var(--rounded-btn, 0.5rem); + border-width: 1px; + border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); + --tw-border-opacity: 0.2; +} + +.dropdown { + position: relative; + display: inline-block; +} + +.dropdown > *:not(summary):focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.dropdown .dropdown-content { + position: absolute; +} + +.dropdown:is(:not(details)) .dropdown-content { + visibility: hidden; + opacity: 0; + transform-origin: top; + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + transition-duration: 200ms; +} + +.dropdown-end .dropdown-content { + inset-inline-end: 0px; +} + +.dropdown-left .dropdown-content { + bottom: auto; + inset-inline-end: 100%; + top: 0px; + transform-origin: right; +} + +.dropdown-right .dropdown-content { + bottom: auto; + inset-inline-start: 100%; + top: 0px; + transform-origin: left; +} + +.dropdown-bottom .dropdown-content { + bottom: auto; + top: 100%; + transform-origin: top; +} + +.dropdown-top .dropdown-content { + bottom: 100%; + top: auto; + transform-origin: bottom; +} + +.dropdown-end.dropdown-right .dropdown-content { + bottom: 0px; + top: auto; +} + +.dropdown-end.dropdown-left .dropdown-content { + bottom: 0px; + top: auto; +} + +.dropdown.dropdown-open .dropdown-content, +.dropdown:not(.dropdown-hover):focus .dropdown-content, +.dropdown:focus-within .dropdown-content { + visibility: visible; + opacity: 1; +} + +@media (hover: hover) { + .dropdown.dropdown-hover:hover .dropdown-content { + visibility: visible; + opacity: 1; + } + + .btn:hover { + --tw-border-opacity: 1; + border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn:hover { + background-color: color-mix( + in oklab, + oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%, + black + ); + border-color: color-mix( + in oklab, + oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%, + black + ); + } + } + + @supports not (color: oklch(0% 0 0)) { + .btn:hover { + background-color: var(--btn-color, var(--fallback-b2)); + border-color: var(--btn-color, var(--fallback-b2)); + } + } + + .btn.glass:hover { + --glass-opacity: 25%; + --glass-border-opacity: 15%; + } + + .btn-ghost:hover { + border-color: transparent; + } + + @supports (color: oklch(0% 0 0)) { + .btn-ghost:hover { + background-color: var(--fallback-bc,oklch(var(--bc)/0.2)); + } + } + + .btn-outline:hover { + --tw-border-opacity: 1; + border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity))); + } + + .btn-outline.btn-primary:hover { + --tw-text-opacity: 1; + color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-primary:hover { + background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); + } + } + + .btn-outline.btn-secondary:hover { + --tw-text-opacity: 1; + color: var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-secondary:hover { + background-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + } + } + + .btn-outline.btn-accent:hover { + --tw-text-opacity: 1; + color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-accent:hover { + background-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + } + } + + .btn-outline.btn-success:hover { + --tw-text-opacity: 1; + color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-success:hover { + background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + } + } + + .btn-outline.btn-info:hover { + --tw-text-opacity: 1; + color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-info:hover { + background-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black); + } + } + + .btn-outline.btn-warning:hover { + --tw-text-opacity: 1; + color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-warning:hover { + background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + } + } + + .btn-outline.btn-error:hover { + --tw-text-opacity: 1; + color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity))); + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-error:hover { + background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + } + } + + .btn-disabled:hover, + .btn[disabled]:hover, + .btn:disabled:hover { + --tw-border-opacity: 0; + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); + --tw-bg-opacity: 0.2; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --tw-text-opacity: 0.2; + } + + @supports (color: color-mix(in oklab, black, black)) { + .btn:is(input[type="checkbox"]:checked):hover, .btn:is(input[type="radio"]:checked):hover { + background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); + } + } + + .dropdown.dropdown-hover:hover .dropdown-content { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(.active, .btn):hover, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(.active, .btn):hover { + cursor: pointer; + outline: 2px solid transparent; + outline-offset: 2px; + } + + @supports (color: oklch(0% 0 0)) { + :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(.active, .btn):hover, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(.active, .btn):hover { + background-color: var(--fallback-bc,oklch(var(--bc)/0.1)); + } + } +} + +.dropdown:is(details) summary::-webkit-details-marker { + display: none; +} + +.footer { + display: grid; + width: 100%; + grid-auto-flow: row; + place-items: start; + -moz-column-gap: 1rem; + column-gap: 1rem; + row-gap: 2.5rem; + font-size: 0.875rem; + line-height: 1.25rem; +} + +.footer > * { + display: grid; + place-items: start; + gap: 0.5rem; +} + +@media (min-width: 48rem) { + .footer { + grid-auto-flow: column; + } + + .footer-center { + grid-auto-flow: row dense; + } +} + +.form-control { + display: flex; + flex-direction: column; +} + +.label { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: space-between; + padding-left: 0.25rem; + padding-right: 0.25rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.hero { + display: grid; + width: 100%; + place-items: center; + background-size: cover; + background-position: center; +} + +.hero > * { + grid-column-start: 1; + grid-row-start: 1; +} + +.input { + flex-shrink: 1; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + height: 3rem; + padding-left: 1rem; + padding-right: 1rem; + font-size: 1rem; + line-height: 2; + line-height: 1.5rem; + border-radius: var(--rounded-btn, 0.5rem); + border-width: 1px; + border-color: transparent; + --tw-bg-opacity: 1; + background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); +} + +.input[type="number"]::-webkit-inner-spin-button, +.input-md[type="number"]::-webkit-inner-spin-button { + margin-top: -1rem; + margin-bottom: -1rem; + margin-inline-end: -1rem; +} + +.input-sm[type="number"]::-webkit-inner-spin-button { + margin-top: 0px; + margin-bottom: 0px; + margin-inline-end: -0px; +} + +.join .dropdown .join-item:first-child:not(:last-child), + .join *:first-child:not(:last-child) .dropdown .join-item { + border-start-end-radius: inherit; + border-end-end-radius: inherit; +} + +.link { + cursor: pointer; + text-decoration-line: underline; +} + +.menu { + display: flex; + flex-direction: column; + flex-wrap: wrap; + font-size: 0.875rem; + line-height: 1.25rem; + padding: 0.5rem; +} + +.menu :where(li ul) { + position: relative; + white-space: nowrap; + margin-inline-start: 1rem; + padding-inline-start: 0.5rem; +} + +.menu :where(li:not(.menu-title) > *:not(ul, details, .menu-title, .btn)), .menu :where(li:not(.menu-title) > details > summary:not(.menu-title)) { + display: grid; + grid-auto-flow: column; + align-content: flex-start; + align-items: center; + gap: 0.5rem; + grid-auto-columns: minmax(auto, max-content) auto max-content; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.menu li.disabled { + cursor: not-allowed; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + color: var(--fallback-bc,oklch(var(--bc)/0.3)); +} + +.menu :where(li > .menu-dropdown:not(.menu-dropdown-show)) { + display: none; +} + +:where(.menu li) { + position: relative; + display: flex; + flex-shrink: 0; + flex-direction: column; + flex-wrap: wrap; + align-items: stretch; +} + +:where(.menu li) .badge { + justify-self: end; +} + +.select { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + height: 3rem; + min-height: 3rem; + padding-inline-start: 1rem; + padding-inline-end: 2.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + line-height: 2; + border-radius: var(--rounded-btn, 0.5rem); + border-width: 1px; + border-color: transparent; + --tw-bg-opacity: 1; + background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); + background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), + linear-gradient(135deg, currentColor 50%, transparent 50%); + background-position: calc(100% - 20px) calc(1px + 50%), + calc(100% - 16.1px) calc(1px + 50%); + background-size: 4px 4px, + 4px 4px; + background-repeat: no-repeat; +} + +.select[multiple] { + height: auto; +} + +.stats { + display: inline-grid; + border-radius: var(--rounded-box, 1rem); + --tw-bg-opacity: 1; + background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); +} + +:where(.stats) { + grid-auto-flow: column; + overflow-x: auto; +} + +.stat { + display: inline-grid; + width: 100%; + grid-template-columns: repeat(1, 1fr); + -moz-column-gap: 1rem; + column-gap: 1rem; + border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); + --tw-border-opacity: 0.1; + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-top: 1rem; + padding-bottom: 1rem; +} + +.steps { + display: inline-grid; + grid-auto-flow: column; + overflow: hidden; + overflow-x: auto; + counter-reset: step; + grid-auto-columns: 1fr; +} + +.steps .step { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + grid-template-columns: auto; + grid-template-rows: repeat(2, minmax(0, 1fr)); + grid-template-rows: 40px 1fr; + place-items: center; + text-align: center; + min-width: 4rem; +} + +.swap { + position: relative; + display: inline-grid; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + place-content: center; + cursor: pointer; +} + +.swap > * { + grid-column-start: 1; + grid-row-start: 1; + transition-duration: 300ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + transition-property: transform, opacity; +} + +.swap input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.swap .swap-on, +.swap .swap-indeterminate, +.swap input:indeterminate ~ .swap-on { + opacity: 0; +} + +.swap input:checked ~ .swap-off, +.swap-active .swap-off, +.swap input:indeterminate ~ .swap-off { + opacity: 0; +} + +.swap input:checked ~ .swap-on, +.swap-active .swap-on, +.swap input:indeterminate ~ .swap-indeterminate { + opacity: 1; +} + +.textarea { + min-height: 3rem; + flex-shrink: 1; + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + line-height: 2; + border-radius: var(--rounded-btn, 0.5rem); + border-width: 1px; + border-color: transparent; + --tw-bg-opacity: 1; + background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); +} + +.toggle { + flex-shrink: 0; + --tglbg: var(--fallback-b1,oklch(var(--b1)/1)); + --handleoffset: 1.5rem; + --handleoffsetcalculator: calc(var(--handleoffset) * -1); + --togglehandleborder: 0 0; + height: 1.5rem; + width: 3rem; + cursor: pointer; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: var(--rounded-badge, 1.9rem); + border-width: 1px; + border-color: currentColor; + background-color: currentColor; + color: var(--fallback-bc,oklch(var(--bc)/0.5)); + transition: background, + box-shadow var(--animation-input, 0.2s) ease-out; + box-shadow: var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset, + 0 0 0 2px var(--tglbg) inset, + var(--togglehandleborder); +} + +.btm-nav > * .label { + font-size: 1rem; + line-height: 1.5rem; +} + +@media (prefers-reduced-motion: no-preference) { + .btn { + animation: button-pop var(--animation-btn, 0.25s) ease-out; + } +} + +.btn:active:hover, + .btn:active:focus { + animation: button-pop 0s ease-out; + transform: scale(var(--btn-focus-scale, 0.97)); +} + +@supports not (color: oklch(0% 0 0)) { + .btn { + background-color: var(--btn-color, var(--fallback-b2)); + border-color: var(--btn-color, var(--fallback-b2)); + } + + .btn-primary { + --btn-color: var(--fallback-p); + } + + .prose :where(code):not(:where([class~="not-prose"] *, pre *)) { + background-color: var(--fallback-b3,oklch(var(--b3)/1)); + } +} + +@supports (color: color-mix(in oklab, black, black)) { + .btn-outline.btn-primary.btn-active { + background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); + } + + .btn-outline.btn-secondary.btn-active { + background-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-s,oklch(var(--s)/1)) 90%, black); + } + + .btn-outline.btn-accent.btn-active { + background-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black); + } + + .btn-outline.btn-success.btn-active { + background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); + } + + .btn-outline.btn-info.btn-active { + background-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-in,oklch(var(--in)/1)) 90%, black); + } + + .btn-outline.btn-warning.btn-active { + background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); + } + + .btn-outline.btn-error.btn-active { + background-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + border-color: color-mix(in oklab, var(--fallback-er,oklch(var(--er)/1)) 90%, black); + } +} + +.btn:focus-visible { + outline-style: solid; + outline-width: 2px; + outline-offset: 2px; +} + +.btn-primary { + --tw-text-opacity: 1; + color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); + outline-color: var(--fallback-p,oklch(var(--p)/1)); +} + +@supports (color: oklch(0% 0 0)) { + .btn-primary { + --btn-color: var(--p); + } +} + +.btn.glass { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + outline-color: currentColor; +} + +.btn.glass.btn-active { + --glass-opacity: 25%; + --glass-border-opacity: 15%; +} + +.btn-ghost { + border-width: 1px; + border-color: transparent; + background-color: transparent; + color: currentColor; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + outline-color: currentColor; +} + +.btn-ghost.btn-active { + border-color: transparent; + background-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.btn-outline { + border-color: currentColor; + background-color: transparent; + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-outline.btn-active { + --tw-border-opacity: 1; + border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity))); +} + +.btn-outline.btn-primary { + --tw-text-opacity: 1; + color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity))); +} + +.btn-outline.btn-primary.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); +} + +.btn-outline.btn-secondary { + --tw-text-opacity: 1; + color: var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity))); +} + +.btn-outline.btn-secondary.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity))); +} + +.btn-outline.btn-accent { + --tw-text-opacity: 1; + color: var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity))); +} + +.btn-outline.btn-accent.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity))); +} + +.btn-outline.btn-success { + --tw-text-opacity: 1; + color: var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity))); +} + +.btn-outline.btn-success.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); +} + +.btn-outline.btn-info { + --tw-text-opacity: 1; + color: var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity))); +} + +.btn-outline.btn-info.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity))); +} + +.btn-outline.btn-warning { + --tw-text-opacity: 1; + color: var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity))); +} + +.btn-outline.btn-warning.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); +} + +.btn-outline.btn-error { + --tw-text-opacity: 1; + color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity))); +} + +.btn-outline.btn-error.btn-active { + --tw-text-opacity: 1; + color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity))); +} + +.btn.btn-disabled, + .btn[disabled], + .btn:disabled { + --tw-border-opacity: 0; + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); + --tw-bg-opacity: 0.2; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --tw-text-opacity: 0.2; +} + +.btn:is(input[type="checkbox"]:checked), +.btn:is(input[type="radio"]:checked) { + --tw-border-opacity: 1; + border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); +} + +.btn:is(input[type="checkbox"]:checked):focus-visible, .btn:is(input[type="radio"]:checked):focus-visible { + outline-color: var(--fallback-p,oklch(var(--p)/1)); +} + +@keyframes button-pop { + 0% { + transform: scale(var(--btn-focus-scale, 0.98)); + } + + 40% { + transform: scale(1.02); + } + + 100% { + transform: scale(1); + } +} + +.checkbox:focus { + box-shadow: none; +} + +.checkbox:focus-visible { + outline-style: solid; + outline-width: 2px; + outline-offset: 2px; + outline-color: var(--fallback-bc,oklch(var(--bc)/1)); +} + +.checkbox:disabled { + border-width: 0px; + cursor: not-allowed; + border-color: transparent; + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + opacity: 0.2; +} + +.checkbox:checked, + .checkbox[aria-checked="true"] { + background-repeat: no-repeat; + animation: checkmark var(--animation-input, 0.2s) ease-out; + background-color: var(--chkbg); + background-image: linear-gradient(-45deg, transparent 65%, var(--chkbg) 65.99%), + linear-gradient(45deg, transparent 75%, var(--chkbg) 75.99%), + linear-gradient(-45deg, var(--chkbg) 40%, transparent 40.99%), + linear-gradient( + 45deg, + var(--chkbg) 30%, + var(--chkfg) 30.99%, + var(--chkfg) 40%, + transparent 40.99% + ), + linear-gradient(-45deg, var(--chkfg) 50%, var(--chkbg) 50.99%); +} + +.checkbox:indeterminate { + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + background-repeat: no-repeat; + animation: checkmark var(--animation-input, 0.2s) ease-out; + background-image: linear-gradient(90deg, transparent 80%, var(--chkbg) 80%), + linear-gradient(-90deg, transparent 80%, var(--chkbg) 80%), + linear-gradient(0deg, var(--chkbg) 43%, var(--chkfg) 43%, var(--chkfg) 57%, var(--chkbg) 57%); +} + +.checkbox-primary { + --chkbg: var(--fallback-p,oklch(var(--p)/1)); + --chkfg: var(--fallback-pc,oklch(var(--pc)/1)); + --tw-border-opacity: 1; + border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); +} + +.checkbox-primary:focus-visible { + outline-color: var(--fallback-p,oklch(var(--p)/1)); +} + +.checkbox-primary:checked, + .checkbox-primary[aria-checked="true"] { + --tw-border-opacity: 1; + border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); +} + +@keyframes checkmark { + 0% { + background-position-y: 5px; + } + + 50% { + background-position-y: -2px; + } + + 100% { + background-position-y: 0; + } +} + +.dropdown.dropdown-open .dropdown-content, +.dropdown:focus .dropdown-content, +.dropdown:focus-within .dropdown-content { + --tw-scale-x: 1; + --tw-scale-y: 1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.label-text { + font-size: 0.875rem; + line-height: 1.25rem; + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); +} + +.input input { + --tw-bg-opacity: 1; + background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); + background-color: transparent; +} + +.input input:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.input[list]::-webkit-calendar-picker-indicator { + line-height: 1em; +} + +.input-bordered { + border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.input:focus, + .input:focus-within { + box-shadow: none; + border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); + outline-style: solid; + outline-width: 2px; + outline-offset: 2px; + outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.input:has(> input[disabled]), + .input-disabled, + .input:disabled, + .input[disabled] { + cursor: not-allowed; + --tw-border-opacity: 1; + border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); + color: var(--fallback-bc,oklch(var(--bc)/0.4)); +} + +.input:has(> input[disabled])::-moz-placeholder, .input-disabled::-moz-placeholder, .input:disabled::-moz-placeholder, .input[disabled]::-moz-placeholder { + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); + --tw-placeholder-opacity: 0.2; +} + +.input:has(> input[disabled])::placeholder, + .input-disabled::placeholder, + .input:disabled::placeholder, + .input[disabled]::placeholder { + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); + --tw-placeholder-opacity: 0.2; +} + +.input:has(> input[disabled]) > input[disabled] { + cursor: not-allowed; +} + +.input::-webkit-date-and-time-value { + text-align: inherit; +} + +.join > :where(*:not(:first-child)):is(.btn) { + margin-inline-start: calc(var(--border-btn) * -1); +} + +.link:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.link:focus-visible { + outline: 2px solid currentColor; + outline-offset: 2px; +} + +.loading { + pointer-events: none; + display: inline-block; + aspect-ratio: 1 / 1; + width: 1.5rem; + background-color: currentColor; + -webkit-mask-size: 100%; + mask-size: 100%; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E"); + mask-image: url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E"); +} + +:where(.menu li:empty) { + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + opacity: 0.1; + margin: 0.5rem 1rem; + height: 1px; +} + +.menu :where(li ul):before { + position: absolute; + bottom: 0.75rem; + inset-inline-start: 0px; + top: 0.75rem; + width: 1px; + --tw-bg-opacity: 1; + background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); + opacity: 0.1; + content: ""; +} + +.menu :where(li:not(.menu-title) > *:not(ul, details, .menu-title, .btn)), +.menu :where(li:not(.menu-title) > details > summary:not(.menu-title)) { + border-radius: var(--rounded-btn, 0.5rem); + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + text-align: start; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + transition-duration: 200ms; + text-wrap: balance; +} + +:where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(summary, .active, .btn).focus, :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(summary, .active, .btn):focus, :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):is(summary):not(.active, .btn):focus-visible, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(summary, .active, .btn).focus, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(summary, .active, .btn):focus, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):is(summary):not(.active, .btn):focus-visible { + cursor: pointer; + background-color: var(--fallback-bc,oklch(var(--bc)/0.1)); + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + outline: 2px solid transparent; + outline-offset: 2px; +} + +.menu li > *:not(ul, .menu-title, details, .btn):active, +.menu li > *:not(ul, .menu-title, details, .btn).active, +.menu li > details > summary:active { + --tw-bg-opacity: 1; + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); +} + +.menu :where(li > details > summary)::-webkit-details-marker { + display: none; +} + +.menu :where(li > details > summary):after, +.menu :where(li > .menu-dropdown-toggle):after { + justify-self: end; + display: block; + margin-top: -0.5rem; + height: 0.5rem; + width: 0.5rem; + transform: rotate(45deg); + transition-property: transform, margin-top; + transition-duration: 0.3s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + content: ""; + transform-origin: 75% 75%; + box-shadow: 2px 2px; + pointer-events: none; +} + +.menu :where(li > details[open] > summary):after, +.menu :where(li > .menu-dropdown-toggle.menu-dropdown-show):after { + transform: rotate(225deg); + margin-top: 0; +} + +.mockup-phone .camera { + position: relative; + top: 0px; + left: 0px; + background: #000; + height: 25px; + width: 150px; + margin: 0 auto; + border-bottom-left-radius: 17px; + border-bottom-right-radius: 17px; + z-index: 11; +} + +.mockup-phone .camera:before { + content: ""; + position: absolute; + top: 35%; + left: 50%; + width: 50px; + height: 4px; + border-radius: 5px; + background-color: #0c0b0e; + transform: translate(-50%, -50%); +} + +.mockup-phone .camera:after { + content: ""; + position: absolute; + top: 20%; + left: 70%; + width: 8px; + height: 8px; + border-radius: 5px; + background-color: #0f0b25; +} + +.mockup-phone .display { + overflow: hidden; + border-radius: 40px; + margin-top: -25px; +} + +.mockup-browser .mockup-browser-toolbar .input { + position: relative; + margin-left: auto; + margin-right: auto; + display: block; + height: 1.75rem; + width: 24rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + --tw-bg-opacity: 1; + background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); + padding-left: 2rem; + direction: ltr; +} + +.mockup-browser .mockup-browser-toolbar .input:before { + content: ""; + position: absolute; + left: 0.5rem; + top: 50%; + aspect-ratio: 1 / 1; + height: 0.75rem; + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + border-radius: 9999px; + border-width: 2px; + border-color: currentColor; + opacity: 0.6; +} + +.mockup-browser .mockup-browser-toolbar .input:after { + content: ""; + position: absolute; + left: 1.25rem; + top: 50%; + height: 0.5rem; + --tw-translate-y: 25%; + --tw-rotate: -45deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + border-radius: 9999px; + border-width: 1px; + border-color: currentColor; + opacity: 0.6; +} + +@keyframes modal-pop { + 0% { + opacity: 0; + } +} + +@keyframes progress-loading { + 50% { + background-position-x: -115%; + } +} + +@keyframes radiomark { + 0% { + box-shadow: 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset, + 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset; + } + + 50% { + box-shadow: 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset, + 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset; + } + + 100% { + box-shadow: 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset, + 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset; + } +} + +@keyframes rating-pop { + 0% { + transform: translateY(-0.125em); + } + + 40% { + transform: translateY(-0.125em); + } + + 100% { + transform: translateY(0); + } +} + +.select-bordered { + border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.select:focus { + box-shadow: none; + border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); + outline-style: solid; + outline-width: 2px; + outline-offset: 2px; + outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.select-disabled, + .select:disabled, + .select[disabled] { + cursor: not-allowed; + --tw-border-opacity: 1; + border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); + color: var(--fallback-bc,oklch(var(--bc)/0.4)); +} + +.select-disabled::-moz-placeholder, .select:disabled::-moz-placeholder, .select[disabled]::-moz-placeholder { + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); + --tw-placeholder-opacity: 0.2; +} + +.select-disabled::placeholder, + .select:disabled::placeholder, + .select[disabled]::placeholder { + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); + --tw-placeholder-opacity: 0.2; +} + +.select-multiple, + .select[multiple], + .select[size].select:not([size="1"]) { + background-image: none; + padding-right: 1rem; +} + +[dir="rtl"] .select { + background-position: calc(0% + 12px) calc(1px + 50%), + calc(0% + 16px) calc(1px + 50%); +} + +@keyframes skeleton { + from { + background-position: 150%; + } + + to { + background-position: -50%; + } +} + +:where(.stats) > :not([hidden]) ~ :not([hidden]) { + --tw-divide-x-reverse: 0; + border-right-width: calc(1px * var(--tw-divide-x-reverse)); + border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); + --tw-divide-y-reverse: 0; + border-top-width: calc(0px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(0px * var(--tw-divide-y-reverse)); +} + +[dir="rtl"] .stats > *:not([hidden]) ~ *:not([hidden]) { + --tw-divide-x-reverse: 1; +} + +.steps .step:before { + top: 0px; + grid-column-start: 1; + grid-row-start: 1; + height: 0.5rem; + width: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-bg-opacity: 1; + background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + content: ""; + margin-inline-start: -100%; +} + +.steps .step:after { + content: counter(step); + counter-increment: step; + z-index: 1; + position: relative; + grid-column-start: 1; + grid-row-start: 1; + display: grid; + height: 2rem; + width: 2rem; + place-items: center; + place-self: center; + border-radius: 9999px; + --tw-bg-opacity: 1; + background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); +} + +.steps .step:first-child:before { + content: none; +} + +.steps .step[data-content]:after { + content: attr(data-content); +} + +.steps .step-neutral + .step-neutral:before, + .steps .step-neutral:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); +} + +.steps .step-primary + .step-primary:before, + .steps .step-primary:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); +} + +.steps .step-secondary + .step-secondary:before, + .steps .step-secondary:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity))); +} + +.steps .step-accent + .step-accent:before, + .steps .step-accent:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-a,oklch(var(--a)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity))); +} + +.steps .step-info + .step-info:before { + --tw-bg-opacity: 1; + background-color: var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity))); +} + +.steps .step-info:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity))); +} + +.steps .step-success + .step-success:before { + --tw-bg-opacity: 1; + background-color: var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity))); +} + +.steps .step-success:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); +} + +.steps .step-warning + .step-warning:before { + --tw-bg-opacity: 1; + background-color: var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity))); +} + +.steps .step-warning:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); +} + +.steps .step-error + .step-error:before { + --tw-bg-opacity: 1; + background-color: var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity))); +} + +.steps .step-error:after { + --tw-bg-opacity: 1; + background-color: var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity))); + --tw-text-opacity: 1; + color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity))); +} + +.textarea-bordered { + border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.textarea:focus { + box-shadow: none; + border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); + outline-style: solid; + outline-width: 2px; + outline-offset: 2px; + outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.textarea-disabled, + .textarea:disabled, + .textarea[disabled] { + cursor: not-allowed; + --tw-border-opacity: 1; + border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); + --tw-bg-opacity: 1; + background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); + color: var(--fallback-bc,oklch(var(--bc)/0.4)); +} + +.textarea-disabled::-moz-placeholder, .textarea:disabled::-moz-placeholder, .textarea[disabled]::-moz-placeholder { + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); + --tw-placeholder-opacity: 0.2; +} + +.textarea-disabled::placeholder, + .textarea:disabled::placeholder, + .textarea[disabled]::placeholder { + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); + --tw-placeholder-opacity: 0.2; +} + +@keyframes toast-pop { + 0% { + transform: scale(0.9); + opacity: 0; + } + + 100% { + transform: scale(1); + opacity: 1; + } +} + +[dir="rtl"] .toggle { + --handleoffsetcalculator: calc(var(--handleoffset) * 1); +} + +.toggle:focus-visible { + outline-style: solid; + outline-width: 2px; + outline-offset: 2px; + outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.toggle:hover { + background-color: currentColor; +} + +.toggle:checked, + .toggle[aria-checked="true"] { + background-image: none; + --handleoffsetcalculator: var(--handleoffset); + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); +} + +[dir="rtl"] .toggle:checked, [dir="rtl"] .toggle[aria-checked="true"] { + --handleoffsetcalculator: calc(var(--handleoffset) * -1); +} + +.toggle:indeterminate { + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + box-shadow: calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset, + calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset, + 0 0 0 2px var(--tglbg) inset; +} + +[dir="rtl"] .toggle:indeterminate { + box-shadow: calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset, + calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset, + 0 0 0 2px var(--tglbg) inset; +} + +.toggle:disabled { + cursor: not-allowed; + --tw-border-opacity: 1; + border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); + background-color: transparent; + opacity: 0.3; + --togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, + var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset; +} + +:root .prose { + --tw-prose-body: var(--fallback-bc,oklch(var(--bc)/0.8)); + --tw-prose-headings: var(--fallback-bc,oklch(var(--bc)/1)); + --tw-prose-lead: var(--fallback-bc,oklch(var(--bc)/1)); + --tw-prose-links: var(--fallback-bc,oklch(var(--bc)/1)); + --tw-prose-bold: var(--fallback-bc,oklch(var(--bc)/1)); + --tw-prose-counters: var(--fallback-bc,oklch(var(--bc)/1)); + --tw-prose-bullets: var(--fallback-bc,oklch(var(--bc)/0.5)); + --tw-prose-hr: var(--fallback-bc,oklch(var(--bc)/0.2)); + --tw-prose-quotes: var(--fallback-bc,oklch(var(--bc)/1)); + --tw-prose-quote-borders: var(--fallback-bc,oklch(var(--bc)/0.2)); + --tw-prose-captions: var(--fallback-bc,oklch(var(--bc)/0.5)); + --tw-prose-code: var(--fallback-bc,oklch(var(--bc)/1)); + --tw-prose-pre-code: var(--fallback-nc,oklch(var(--nc)/1)); + --tw-prose-pre-bg: var(--fallback-n,oklch(var(--n)/1)); + --tw-prose-th-borders: var(--fallback-bc,oklch(var(--bc)/0.5)); + --tw-prose-td-borders: var(--fallback-bc,oklch(var(--bc)/0.2)); + --tw-prose-kbd: var(--fallback-bc,oklch(var(--bc)/0.8)); +} + +.prose :where(code):not(:where([class~="not-prose"] *, pre *)) { + padding: 1px 8px; + border-radius: var(--rounded-badge); + font-weight: initial; + background-color: var(--fallback-bc,oklch(var(--bc)/0.1)); +} + +.prose :where(code):not(:where([class~="not-prose"], [class~="not-prose"] *))::before, .prose :where(code):not(:where([class~="not-prose"], [class~="not-prose"] *))::after { + display: none; +} + +.prose pre code { + border-radius: 0; + padding: 0; +} + +.prose :where(tbody tr, thead):not(:where([class~="not-prose"] *)) { + border-bottom-color: var(--fallback-bc,oklch(var(--bc)/0.2)); +} + +.btn-sm { + height: 2rem; + min-height: 2rem; + padding-left: 0.75rem; + padding-right: 0.75rem; + font-size: 0.875rem; +} + +.btn-square:where(.btn-xs) { + height: 1.5rem; + width: 1.5rem; + padding: 0px; +} + +.btn-square:where(.btn-sm) { + height: 2rem; + width: 2rem; + padding: 0px; +} + +.btn-square:where(.btn-md) { + height: 3rem; + width: 3rem; + padding: 0px; +} + +.btn-square:where(.btn-lg) { + height: 4rem; + width: 4rem; + padding: 0px; +} + +.btn-circle:where(.btn-sm) { + height: 2rem; + width: 2rem; + border-radius: 9999px; + padding: 0px; +} + +[type="checkbox"].checkbox-xs { + height: 1rem; + width: 1rem; +} + +[type="checkbox"].checkbox-sm { + height: 1.25rem; + width: 1.25rem; +} + +.input-sm { + height: 2rem; + padding-left: 0.75rem; + padding-right: 0.75rem; + font-size: 0.875rem; + line-height: 2rem; +} + +.select-sm { + height: 2rem; + min-height: 2rem; + padding-left: 0.75rem; + padding-right: 2rem; + font-size: 0.875rem; + line-height: 2rem; +} + +[dir="rtl"] .select-sm { + padding-left: 2rem; + padding-right: 0.75rem; +} + +.join.join-vertical > :where(*:not(:first-child)):is(.btn) { + margin-top: calc(var(--border-btn) * -1); +} + +.join.join-horizontal > :where(*:not(:first-child)):is(.btn) { + margin-inline-start: calc(var(--border-btn) * -1); + margin-top: 0px; +} + +.site-container { + margin-left: auto; + margin-right: auto; + width: 100%; + max-width: 64rem; + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +@media (min-width: 1024px) { + .site-container { + padding-left: 2rem; + padding-right: 2rem; + } +} + +.section-pad { + padding-top: 5rem; + padding-bottom: 5rem; +} + +@media (min-width: 768px) { + .section-pad { + padding-top: 7rem; + padding-bottom: 7rem; + } +} + +.eyebrow { + margin-bottom: 1rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.22em; + --tw-text-opacity: 1; + color: rgb(8 117 209 / var(--tw-text-opacity, 1)); +} + +.section-title { + font-size: 1.875rem; + line-height: 2.25rem; + font-weight: 700; + letter-spacing: -0.025em; + --tw-text-opacity: 1; + color: rgb(3 21 41 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + .section-title { + font-size: 2.25rem; + line-height: 2.5rem; + } +} + +.hero-grid { + background-image: + linear-gradient(90deg, rgba(3,21,41,.96) 0%, rgba(3,35,62,.78) 48%, rgba(3,21,41,.45) 100%), + radial-gradient(circle at 72% 30%, rgba(8,117,209,.55), transparent 26%), + linear-gradient(rgba(76,196,59,.08) 1px, transparent 1px), + linear-gradient(90deg, rgba(76,196,59,.08) 1px, transparent 1px); + background-size: auto, auto, 48px 48px, 48px 48px; +} + +.release-art { + position: relative; + overflow: hidden; + --tw-bg-opacity: 1; + background-color: rgb(6 40 71 / var(--tw-bg-opacity, 1)); +} + +.release-art::before { + content: ""; + position: absolute; + inset: 0px; + opacity: 0.7; + background: radial-gradient(circle at 70% 30%, #0875d1, transparent 28%), linear-gradient(145deg, transparent 42%, #4cc43b 43%, transparent 44%); +} + +.release-art::after { + content: ""; + position: absolute; + border-width: 1px; + border-color: rgb(76 196 59 / 0.7); + inset: 28% 18% 22% 36%; +} + +.pointer-events-none { + pointer-events: none; +} + +.pointer-events-auto { + pointer-events: auto; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-0 { + inset: 0px; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.-top-7 { + top: -1.75rem; +} + +.bottom-0 { + bottom: 0px; +} + +.bottom-5 { + bottom: 1.25rem; +} + +.left-0 { + left: 0px; +} + +.left-5 { + left: 1.25rem; +} + +.right-\[12\%\] { + right: 12%; +} + +.top-0 { + top: 0px; +} + +.top-\[18\%\] { + top: 18%; +} + +.z-10 { + z-index: 10; +} + +.z-20 { + z-index: 20; +} + +.z-50 { + z-index: 50; +} + +.z-\[1\] { + z-index: 1; +} + +.order-first { + order: -9999; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.ml-auto { + margin-left: auto; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-12 { + margin-top: 3rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-3 { + margin-top: 0.75rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-5 { + margin-top: 1.25rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + +.mt-7 { + margin-top: 1.75rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.mt-9 { + margin-top: 2.25rem; +} + +.\!mb-3 { + margin-bottom: 0.75rem !important; +} + +.mb-1\.5 { + margin-bottom: 0.375rem; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.aspect-\[16\/9\] { + aspect-ratio: 16/9; +} + +.size-4 { + width: 1rem; + height: 1rem; +} + +.h-16 { + height: 4rem; +} + +.h-28 { + height: 7rem; +} + +.h-40 { + height: 10rem; +} + +.h-8 { + height: 2rem; +} + +.h-full { + height: 100%; +} + +.h-24 { + height: 6rem; +} + +.min-h-screen { + min-height: 100vh; +} + +.w-56 { + width: 14rem; +} + +.w-64 { + width: 16rem; +} + +.w-full { + width: 100%; +} + +.w-auto { + width: auto; +} + +.min-w-0 { + min-width: 0px; +} + +.min-w-\[190px\] { + min-width: 190px; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-7xl { + max-width: 80rem; +} + +.max-w-lg { + max-width: 32rem; +} + +.max-w-none { + max-width: none; +} + +.max-w-xl { + max-width: 36rem; +} + +.max-w-4xl { + max-width: 56rem; +} + +.max-w-md { + max-width: 28rem; +} + +.max-w-5xl { + max-width: 64rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.shrink-0 { + flex-shrink: 0; +} + +.-translate-y-full { + --tw-translate-y: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-0 { + --tw-translate-y: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.cursor-pointer { + cursor: pointer; +} + +.resize-y { + resize: vertical; +} + +.resize { + resize: both; +} + +.snap-x { + scroll-snap-type: x var(--tw-scroll-snap-strictness); +} + +.snap-mandatory { + --tw-scroll-snap-strictness: mandatory; +} + +.snap-start { + scroll-snap-align: start; +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-center { + align-items: center; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-14 { + gap: 3.5rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-5 { + gap: 1.25rem; +} + +.gap-7 { + gap: 1.75rem; +} + +.gap-8 { + gap: 2rem; +} + +.gap-12 { + gap: 3rem; +} + +.gap-x-5 { + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; +} + +.gap-x-8 { + -moz-column-gap: 2rem; + column-gap: 2rem; +} + +.gap-y-2 { + row-gap: 0.5rem; +} + +.gap-y-6 { + row-gap: 1.5rem; +} + +.gap-x-4 { + -moz-column-gap: 1rem; + column-gap: 1rem; +} + +.gap-y-4 { + row-gap: 1rem; +} + +.space-y-10 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(2.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(2.5rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.justify-self-start { + justify-self: start; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.rounded-none { + border-radius: 0px; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.border { + border-width: 1px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-l { + border-left-width: 1px; +} + +.border-r { + border-right-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-base-300 { + --tw-border-opacity: 1; + border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity, 1))); +} + +.border-signal\/40 { + border-color: rgb(76 196 59 / 0.4); +} + +.border-white\/10 { + border-color: rgb(255 255 255 / 0.1); +} + +.border-white\/50 { + border-color: rgb(255 255 255 / 0.5); +} + +.border-white\/15 { + border-color: rgb(255 255 255 / 0.15); +} + +.bg-base-200 { + --tw-bg-opacity: 1; + background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1))); +} + +.bg-navy-950 { + --tw-bg-opacity: 1; + background-color: rgb(3 21 41 / var(--tw-bg-opacity, 1)); +} + +.bg-navy-950\/80 { + background-color: rgb(3 21 41 / 0.8); +} + +.bg-ocean { + --tw-bg-opacity: 1; + background-color: rgb(8 117 209 / var(--tw-bg-opacity, 1)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.bg-white\/95 { + background-color: rgb(255 255 255 / 0.95); +} + +.bg-\[\#020d1d\]\/90 { + background-color: rgb(2 13 29 / 0.9); +} + +.bg-\[\#06172a\] { + --tw-bg-opacity: 1; + background-color: rgb(6 23 42 / var(--tw-bg-opacity, 1)); +} + +.bg-signal\/15 { + background-color: rgb(76 196 59 / 0.15); +} + +.bg-gradient-to-r { + background-image: linear-gradient(to right, var(--tw-gradient-stops)); +} + +.from-navy-950 { + --tw-gradient-from: #031529 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(3 21 41 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.via-navy-900\/90 { + --tw-gradient-to: rgb(6 40 71 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), rgb(6 40 71 / 0.9) var(--tw-gradient-via-position), var(--tw-gradient-to); +} + +.to-navy-800 { + --tw-gradient-to: #073c68 var(--tw-gradient-to-position); +} + +.to-navy-800\/55 { + --tw-gradient-to: rgb(7 60 104 / 0.55) var(--tw-gradient-to-position); +} + +.bg-cover { + background-size: cover; +} + +.bg-center { + background-position: center; +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-2 { + padding: 0.5rem; +} + +.p-6 { + padding: 1.5rem; +} + +.p-7 { + padding: 1.75rem; +} + +.px-0 { + padding-left: 0px; + padding-right: 0px; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-7 { + padding-top: 1.75rem; + padding-bottom: 1.75rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.py-20 { + padding-top: 5rem; + padding-bottom: 5rem; +} + +.pb-40 { + padding-bottom: 10rem; +} + +.pt-10 { + padding-top: 2.5rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-6 { + padding-top: 1.5rem; +} + +.text-center { + text-align: center; +} + +.font-mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.text-\[0\.65rem\] { + font-size: 0.65rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.text-\[0\.6rem\] { + font-size: 0.6rem; +} + +.font-black { + font-weight: 900; +} + +.font-bold { + font-weight: 700; +} + +.font-extrabold { + font-weight: 800; +} + +.font-light { + font-weight: 300; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.leading-6 { + line-height: 1.5rem; +} + +.leading-7 { + line-height: 1.75rem; +} + +.leading-8 { + line-height: 2rem; +} + +.leading-tight { + line-height: 1.25; +} + +.leading-5 { + line-height: 1.25rem; +} + +.tracking-\[0\.16em\] { + letter-spacing: 0.16em; +} + +.tracking-\[0\.18em\] { + letter-spacing: 0.18em; +} + +.tracking-\[0\.2em\] { + letter-spacing: 0.2em; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.tracking-\[0\.14em\] { + letter-spacing: 0.14em; +} + +.\!text-sky-300 { + --tw-text-opacity: 1 !important; + color: rgb(125 211 252 / var(--tw-text-opacity, 1)) !important; +} + +.text-base-content { + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1))); +} + +.text-base-content\/30 { + color: var(--fallback-bc,oklch(var(--bc)/0.3)); +} + +.text-base-content\/50 { + color: var(--fallback-bc,oklch(var(--bc)/0.5)); +} + +.text-base-content\/55 { + color: var(--fallback-bc,oklch(var(--bc)/0.55)); +} + +.text-base-content\/65 { + color: var(--fallback-bc,oklch(var(--bc)/0.65)); +} + +.text-base-content\/70 { + color: var(--fallback-bc,oklch(var(--bc)/0.7)); +} + +.text-navy-950 { + --tw-text-opacity: 1; + color: rgb(3 21 41 / var(--tw-text-opacity, 1)); +} + +.text-ocean { + --tw-text-opacity: 1; + color: rgb(8 117 209 / var(--tw-text-opacity, 1)); +} + +.text-signal { + --tw-text-opacity: 1; + color: rgb(76 196 59 / var(--tw-text-opacity, 1)); +} + +.text-signal\/70 { + color: rgb(76 196 59 / 0.7); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.text-white\/70 { + color: rgb(255 255 255 / 0.7); +} + +.text-white\/75 { + color: rgb(255 255 255 / 0.75); +} + +.text-white\/55 { + color: rgb(255 255 255 / 0.55); +} + +.text-white\/60 { + color: rgb(255 255 255 / 0.6); +} + +.text-white\/65 { + color: rgb(255 255 255 / 0.65); +} + +.opacity-0 { + opacity: 0; +} + +.opacity-100 { + opacity: 1; +} + +.shadow-\[0_-8px_30px_rgba\(3\2c 21\2c 41\2c 0\.08\)\] { + --tw-shadow: 0 -8px 30px rgba(3,21,41,0.08); + --tw-shadow-colored: 0 -8px 30px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-panel { + --tw-shadow: 0 24px 70px rgba(2, 18, 35, 0.18); + --tw-shadow-colored: 0 24px 70px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline { + outline-style: solid; +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.backdrop-blur { + --tw-backdrop-blur: blur(8px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + *, *::before, *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + } +} + +.placeholder\:text-white\/25::-moz-placeholder { + color: rgb(255 255 255 / 0.25); +} + +.placeholder\:text-white\/25::placeholder { + color: rgb(255 255 255 / 0.25); +} + +.first\:border-l:first-child { + border-left-width: 1px; +} + +.hover\:border-white:hover { + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity, 1)); +} + +.hover\:bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.hover\:text-navy-950:hover { + --tw-text-opacity: 1; + color: rgb(3 21 41 / var(--tw-text-opacity, 1)); +} + +.focus\:border-signal:focus { + --tw-border-opacity: 1; + border-color: rgb(76 196 59 / var(--tw-border-opacity, 1)); +} + +.group:hover .group-hover\:translate-x-1 { + --tw-translate-x: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.group:hover .group-hover\:text-ocean { + --tw-text-opacity: 1; + color: rgb(8 117 209 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 640px) { + .sm\:col-span-2 { + grid-column: span 2 / span 2; + } + + .sm\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .sm\:flex-row { + flex-direction: row; + } + + .sm\:items-center { + align-items: center; + } + + .sm\:justify-between { + justify-content: space-between; + } +} + +@media (min-width: 768px) { + .md\:col-span-2 { + grid-column: span 2 / span 2; + } + + .md\:grid { + display: grid; + } + + .md\:min-w-0 { + min-width: 0px; + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:grid-cols-5 { + grid-template-columns: repeat(5, minmax(0, 1fr)); + } + + .md\:grid-cols-\[360px_1fr\] { + grid-template-columns: 360px 1fr; + } + + .md\:items-center { + align-items: center; + } + + .md\:overflow-visible { + overflow: visible; + } + + .md\:py-24 { + padding-top: 6rem; + padding-bottom: 6rem; + } + + .md\:pb-36 { + padding-bottom: 9rem; + } + + .md\:text-6xl { + font-size: 3.75rem; + line-height: 1; + } +} + +@media (min-width: 1024px) { + .lg\:block { + display: block; + } + + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\:grid-cols-\[1\.2fr_1fr\] { + grid-template-columns: 1.2fr 1fr; + } + + .lg\:grid-cols-\[1fr_1\.05fr\] { + grid-template-columns: 1fr 1.05fr; + } + + .lg\:grid-cols-\[0\.9fr_1\.1fr\] { + grid-template-columns: 0.9fr 1.1fr; + } + + .lg\:items-start { + align-items: flex-start; + } + + .lg\:items-center { + align-items: center; + } + + .lg\:gap-16 { + gap: 4rem; + } + + .lg\:px-8 { + padding-left: 2rem; + padding-right: 2rem; + } +} + +@media (min-width: 1280px) { + .xl\:flex { + display: flex; + } + + .xl\:hidden { + display: none; + } +} diff --git a/assets/css/tailwind.css b/assets/css/tailwind.css new file mode 100644 index 0000000..f7d314a --- /dev/null +++ b/assets/css/tailwind.css @@ -0,0 +1,33 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html { scroll-behavior: smooth; } + body { @apply bg-white text-base-content antialiased; } + :focus-visible { @apply outline outline-2 outline-offset-4 outline-signal; } + section[id] { scroll-margin-top: 4rem; } +} + +@layer components { + .site-container { @apply mx-auto w-full max-w-5xl px-6 lg:px-8; } + .section-pad { @apply py-20 md:py-28; } + .eyebrow { @apply mb-4 text-xs font-bold uppercase tracking-[0.22em] text-ocean; } + .section-title { @apply text-3xl font-bold tracking-tight text-navy-950 md:text-4xl; } + .hero-grid { + background-image: + linear-gradient(90deg, rgba(3,21,41,.96) 0%, rgba(3,35,62,.78) 48%, rgba(3,21,41,.45) 100%), + radial-gradient(circle at 72% 30%, rgba(8,117,209,.55), transparent 26%), + linear-gradient(rgba(76,196,59,.08) 1px, transparent 1px), + linear-gradient(90deg, rgba(76,196,59,.08) 1px, transparent 1px); + background-size: auto, auto, 48px 48px, 48px 48px; + } + .release-art { @apply relative overflow-hidden bg-navy-900; } + .release-art::before { content: ""; @apply absolute inset-0 opacity-70; background: radial-gradient(circle at 70% 30%, #0875d1, transparent 28%), linear-gradient(145deg, transparent 42%, #4cc43b 43%, transparent 44%); } + .release-art::after { content: ""; @apply absolute border border-signal/70; inset: 28% 18% 22% 36%; } +} + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + *, *::before, *::after { scroll-behavior: auto !important; transition-duration: 0.01ms !important; } +} diff --git a/assets/images/hero-placeholder.svg b/assets/images/hero-placeholder.svg new file mode 100644 index 0000000..44c20d3 --- /dev/null +++ b/assets/images/hero-placeholder.svg @@ -0,0 +1,27 @@ + + Hero image placeholder + An abstract aerial ocean scene with simplified vessel shapes. + + + + + + + + + + + + + + + + + + + + + + + REPLACE WITH HERO IMAGE + diff --git a/assets/images/release-coastal-placeholder.svg b/assets/images/release-coastal-placeholder.svg new file mode 100644 index 0000000..ce3a155 --- /dev/null +++ b/assets/images/release-coastal-placeholder.svg @@ -0,0 +1,4 @@ + + Coastal vessel placeholderAbstract aerial view of vessels near a coastline. + + diff --git a/assets/images/release-harbor-placeholder.svg b/assets/images/release-harbor-placeholder.svg new file mode 100644 index 0000000..4332341 --- /dev/null +++ b/assets/images/release-harbor-placeholder.svg @@ -0,0 +1,4 @@ + + Harbor activity placeholderAbstract underwater scene with a school of fish and tracking boxes. + + diff --git a/assets/images/release-tracks-placeholder.svg b/assets/images/release-tracks-placeholder.svg new file mode 100644 index 0000000..007cf0e --- /dev/null +++ b/assets/images/release-tracks-placeholder.svg @@ -0,0 +1,4 @@ + + Acoustic tracks placeholderAbstract colored acoustic tracks moving across deep water. + + diff --git a/assets/js/navigation.js b/assets/js/navigation.js new file mode 100644 index 0000000..fa100c0 --- /dev/null +++ b/assets/js/navigation.js @@ -0,0 +1,29 @@ +(() => { + const header = document.querySelector("#fixed-navigation"); + const sectionNavigation = document.querySelector("#section-navigation"); + + if (!header || !sectionNavigation) return; + + const updateHeader = () => { + const navigationBottom = sectionNavigation.getBoundingClientRect().bottom; + const isVisible = navigationBottom <= 0; + + header.classList.toggle("pointer-events-none", !isVisible); + header.classList.toggle("-translate-y-full", !isVisible); + header.classList.toggle("opacity-0", !isVisible); + header.classList.toggle("pointer-events-auto", isVisible); + header.classList.toggle("translate-y-0", isVisible); + header.classList.toggle("opacity-100", isVisible); + header.setAttribute("aria-hidden", String(!isVisible)); + + if (isVisible) { + header.removeAttribute("inert"); + } else { + header.setAttribute("inert", ""); + } + }; + + updateHeader(); + window.addEventListener("scroll", updateHeader, { passive: true }); + window.addEventListener("resize", updateHeader); +})(); diff --git a/index.md b/index.md new file mode 100644 index 0000000..471b6ac --- /dev/null +++ b/index.md @@ -0,0 +1,166 @@ +--- +layout: home +title: MARINA Dataset +description: A large labeled dataset for underwater acoustic target recognition. + +# ================================================== +# HERO AREA +# Button styles: primary or outline +# ================================================== +hero: + # Replace this path with the final hero image in assets/images. + background_image: "/assets/images/hero-placeholder.svg" + subheadline: Open maritime research data + headline: Large labeled dataset for underwater acoustic target recognition + text: >- + Explore annotated recordings, vessel metadata, and analysis-ready + releases built for repeatable maritime research. + annotation: "ID: 005 · TANKER" + buttons: + - label: Browse releases + url: "#releases" + style: primary + - label: Read the overview + url: "#overview" + style: outline + +# ================================================== +# OVERVIEW +# ================================================== +overview: + subheadline: About the dataset + headline: A research foundation for understanding underwater activity. + paragraphs: + - >- + MARINA brings recordings, labels, and contextual metadata together in + one consistent resource. It is designed to reduce setup work and help + teams move more quickly from exploration to useful experiments. + - >- + Replace this introductory copy with the dataset's mission, provenance, + intended uses, limitations, and stewardship information. + stats: + - value: "3,437" + label: Hours of audio + - value: "4,218" + label: Unique vessels + - value: "11" + label: Vessel classes + - value: "2" + label: Spectrogram types + +# ================================================== +# CAPABILITIES +# ================================================== +capabilities: + subheadline: Dataset capabilities + headline: Built to support practical research workflows. + items: + - title: Labeled vessel activity + text: Time-aligned annotations connect acoustic events to vessel classes and activity. + - title: Analysis-ready bundles + text: Curated files, metadata, and clear documentation make exploration easier. + - title: Multiple representations + text: Work with audio alongside complementary spectrogram formats. + - title: Consistent metadata + text: Search and filter releases using a predictable shared schema. + - title: Reproducible releases + text: Versioned public bundles keep downstream work traceable. + - title: Open documentation + text: Examples and reference material support common technical workflows. + +# ================================================== +# DATA RELEASES +# Button styles: primary or outline +# ================================================== +releases: + subheadline: Data releases + headline: Current public releases + text: Choose a release below to download its data or review its annotations. + items: + - title: Coastal vessel benchmark + image: "/assets/images/release-coastal-placeholder.svg" + image_alt: Placeholder aerial view of coastal vessel activity + description: A focused collection of labeled coastal traffic with acoustic and contextual metadata. + size: "1.9 TB" + views: 12 camera views + date: Released March 2026 + buttons: + - label: Download bundle + url: "#request" + style: primary + - label: Annotation details + url: "#" + style: outline + - title: Long-range acoustic tracks + image: "/assets/images/release-tracks-placeholder.svg" + image_alt: Placeholder visualization of long-range acoustic tracks + description: Longer observations prepared for detection, tracking, and activity-understanding tasks. + size: "1.9 TB" + views: 12 camera views + date: Released March 2026 + buttons: + - label: Download bundle + url: "#request" + style: primary + - label: Annotation details + url: "#" + style: outline + - title: Dense harbor activity + image: "/assets/images/release-harbor-placeholder.svg" + image_alt: Placeholder underwater view of dense harbor activity + description: Busy harbor scenes with overlapping vessel activity and detailed annotations. + size: "1.9 TB" + views: 12 camera views + date: Released March 2026 + buttons: + - label: Download bundle + url: "#request" + style: primary + - label: Annotation details + url: "#" + style: outline + +# ================================================== +# REQUEST FORM +# ================================================== +request: + subheadline: Data access + headline: Request the dataset + text: >- + Use this section to explain eligibility, expected response time, + licensing, and what happens after a request is submitted. + benefits: + - Clear licensing and use requirements + - Versioned bundles and documentation + - A defined path for support questions + form: + action: "#" + name_label: Full name + email_label: Work email + organization_label: Organization + release_label: Release requested + release_placeholder: Select a release… + use_label: Research use + agreement_label: I agree to the terms and conditions. + submit_label: Request download + +# ================================================== +# CITATION AND CONTACT +# ================================================== +citation: + subheadline: Citing this dataset + headline: Reference the dataset paper + text: Replace the sample BibTeX below with the publication's canonical citation. + code: | + @inproceedings{marina_dataset, + title = {MARINA: A Labeled Maritime Acoustic Dataset}, + author = {Research Team}, + year = {2026} + } + contact: + headline: Questions, corrections, or collaboration? + text: Our team can help with access and research partnerships. + button_label: Contact the team + email: data@example.org + +--- diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1eeb5f2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1419 @@ +{ + "name": "darpa-marina-jekyll", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "darpa-marina-jekyll", + "devDependencies": { + "@tailwindcss/typography": "^0.5.16", + "concurrently": "^9.1.2", + "daisyui": "^4.12.24", + "tailwindcss": "^3.4.17" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.3.0.tgz", + "integrity": "sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.20.tgz", + "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concurrently": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", + "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.9.0", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/culori": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", + "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/daisyui": { + "version": "4.12.24", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.24.tgz", + "integrity": "sha512-JYg9fhQHOfXyLadrBrEqCDM6D5dWCSSiM6eTNCRrBRzx/VlOCrLS8eDfIw9RVvs64v2mJdLooKXY8EwQzoszAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-selector-tokenizer": "^0.8", + "culori": "^3", + "picocolors": "^1", + "postcss-js": "^4" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.2.tgz", + "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shell-quote": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..15e18c6 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "darpa-marina-jekyll", + "private": true, + "scripts": { + "css:build": "tailwindcss -i ./assets/css/tailwind.css -o ./assets/css/site.css --minify", + "css:watch": "tailwindcss -i ./assets/css/tailwind.css -o ./assets/css/site.css --watch", + "jekyll:serve": "bundle exec jekyll serve --livereload", + "dev": "concurrently \"npm:css:watch\" \"npm:jekyll:serve\"", + "build": "npm run css:build && bundle exec jekyll build" + }, + "devDependencies": { + "@tailwindcss/typography": "^0.5.16", + "concurrently": "^9.1.2", + "daisyui": "^4.12.24", + "tailwindcss": "^3.4.17" + } +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..ff95a04 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,52 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./*.{html,md}", + "./_layouts/**/*.html", + "./_includes/**/*.html", + "./assets/js/**/*.js" + ], + theme: { + extend: { + colors: { + navy: { + 950: "#031529", + 900: "#062847", + 800: "#073c68" + }, + signal: "#4cc43b", + ocean: "#0875d1" + }, + fontFamily: { + sans: ["Inter", "ui-sans-serif", "system-ui", "sans-serif"] + }, + boxShadow: { + panel: "0 24px 70px rgba(2, 18, 35, 0.18)" + } + } + }, + plugins: [require("@tailwindcss/typography"), require("daisyui")], + daisyui: { + themes: [ + { + marina: { + primary: "#4cc43b", + "primary-content": "#031529", + secondary: "#0875d1", + "secondary-content": "#ffffff", + accent: "#30a8e8", + neutral: "#031529", + "neutral-content": "#ffffff", + "base-100": "#ffffff", + "base-200": "#f4f6f8", + "base-300": "#dce2e8", + "base-content": "#17202a", + info: "#0875d1", + success: "#4cc43b", + warning: "#f3b33d", + error: "#dc4c64" + } + } + ] + } +}; From 1b8bbef18bfe26c02b92f113794debafbaec8d0f Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Wed, 16 Sep 2026 11:46:01 -0400 Subject: [PATCH 02/27] Add logo --- _data/site.yml | 4 +-- assets/images/logo-white.svg | 32 +++++++++++++++++++++ assets/images/logo.svg | 56 ++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 assets/images/logo-white.svg create mode 100644 assets/images/logo.svg diff --git a/_data/site.yml b/_data/site.yml index d06fa44..4c986b4 100644 --- a/_data/site.yml +++ b/_data/site.yml @@ -4,8 +4,8 @@ brand: logo: - src_reversed: "/assets/images/marina-logo-light.svg" - src: "/assets/images/marina-logo.svg" + src_reversed: "/assets/images/logo-white.svg" + src: "/assets/images/logo.svg" alt: MARINA cta: diff --git a/assets/images/logo-white.svg b/assets/images/logo-white.svg new file mode 100644 index 0000000..a70f5b2 --- /dev/null +++ b/assets/images/logo-white.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/logo.svg b/assets/images/logo.svg new file mode 100644 index 0000000..1925762 --- /dev/null +++ b/assets/images/logo.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 1d383061e5dc0a3d4cda5b4371caaf2bac498ce6 Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Wed, 16 Sep 2026 13:33:04 -0400 Subject: [PATCH 03/27] Update theme colors --- assets/css/site.css | 295 ++++++++++++---------------------------- assets/css/tailwind.css | 1 + tailwind.config.js | 4 +- 3 files changed, 87 insertions(+), 213 deletions(-) diff --git a/assets/css/site.css b/assets/css/site.css index 438e8bf..f7d7431 100644 --- a/assets/css/site.css +++ b/assets/css/site.css @@ -625,7 +625,7 @@ html { } :root { - --p: 72.5487% 0.204994 141.315419; + --p: 66.1952% 0.194469 141.065623; --ac: 13.9154% 0.027649 237.697542; --inc: 91.1915% 0.033075 252.190181; --suc: 14.5097% 0.040999 141.315419; @@ -673,7 +673,7 @@ body { outline-style: solid; outline-width: 2px; outline-offset: 4px; - outline-color: #4cc43b; + outline-color: #3eae2b; } section[id] { @@ -1579,11 +1579,6 @@ section[id] { } } -.form-control { - display: flex; - flex-direction: column; -} - .label { display: flex; -webkit-user-select: none; @@ -2203,13 +2198,6 @@ section[id] { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } -.label-text { - font-size: 0.875rem; - line-height: 1.25rem; - --tw-text-opacity: 1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); -} - .input input { --tw-bg-opacity: 1; background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); @@ -2891,11 +2879,6 @@ section[id] { width: 1rem; } -[type="checkbox"].checkbox-sm { - height: 1.25rem; - width: 1.25rem; -} - .input-sm { height: 2rem; padding-left: 0.75rem; @@ -2982,36 +2965,9 @@ section[id] { } } -.hero-grid { - background-image: - linear-gradient(90deg, rgba(3,21,41,.96) 0%, rgba(3,35,62,.78) 48%, rgba(3,21,41,.45) 100%), - radial-gradient(circle at 72% 30%, rgba(8,117,209,.55), transparent 26%), - linear-gradient(rgba(76,196,59,.08) 1px, transparent 1px), - linear-gradient(90deg, rgba(76,196,59,.08) 1px, transparent 1px); - background-size: auto, auto, 48px 48px, 48px 48px; -} - -.release-art { - position: relative; - overflow: hidden; - --tw-bg-opacity: 1; - background-color: rgb(6 40 71 / var(--tw-bg-opacity, 1)); -} - -.release-art::before { - content: ""; - position: absolute; - inset: 0px; - opacity: 0.7; - background: radial-gradient(circle at 70% 30%, #0875d1, transparent 28%), linear-gradient(145deg, transparent 42%, #4cc43b 43%, transparent 44%); -} - -.release-art::after { - content: ""; - position: absolute; - border-width: 1px; - border-color: rgb(76 196 59 / 0.7); - inset: 28% 18% 22% 36%; +.btn-primary { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); } .pointer-events-none { @@ -3034,10 +2990,6 @@ section[id] { position: relative; } -.inset-0 { - inset: 0px; -} - .inset-x-0 { left: 0px; right: 0px; @@ -3051,18 +3003,10 @@ section[id] { bottom: 0px; } -.bottom-5 { - bottom: 1.25rem; -} - .left-0 { left: 0px; } -.left-5 { - left: 1.25rem; -} - .right-\[12\%\] { right: 12%; } @@ -3075,10 +3019,6 @@ section[id] { top: 18%; } -.z-10 { - z-index: 10; -} - .z-20 { z-index: 20; } @@ -3100,12 +3040,16 @@ section[id] { margin-right: auto; } +.\!mb-3 { + margin-bottom: 0.75rem !important; +} + .mb-1 { margin-bottom: 0.25rem; } -.mb-2 { - margin-bottom: 0.5rem; +.mb-1\.5 { + margin-bottom: 0.375rem; } .ml-auto { @@ -3152,14 +3096,6 @@ section[id] { margin-top: 2.25rem; } -.\!mb-3 { - margin-bottom: 0.75rem !important; -} - -.mb-1\.5 { - margin-bottom: 0.375rem; -} - .block { display: block; } @@ -3189,8 +3125,8 @@ section[id] { height: 4rem; } -.h-28 { - height: 7rem; +.h-24 { + height: 6rem; } .h-40 { @@ -3205,10 +3141,6 @@ section[id] { height: 100%; } -.h-24 { - height: 6rem; -} - .min-h-screen { min-height: 100vh; } @@ -3221,14 +3153,14 @@ section[id] { width: 16rem; } -.w-full { - width: 100%; -} - .w-auto { width: auto; } +.w-full { + width: 100%; +} + .min-w-0 { min-width: 0px; } @@ -3241,12 +3173,16 @@ section[id] { max-width: 42rem; } +.max-w-5xl { + max-width: 64rem; +} + .max-w-7xl { max-width: 80rem; } -.max-w-lg { - max-width: 32rem; +.max-w-md { + max-width: 28rem; } .max-w-none { @@ -3257,18 +3193,6 @@ section[id] { max-width: 36rem; } -.max-w-4xl { - max-width: 56rem; -} - -.max-w-md { - max-width: 28rem; -} - -.max-w-5xl { - max-width: 64rem; -} - .flex-1 { flex: 1 1 0%; } @@ -3327,10 +3251,6 @@ section[id] { align-items: center; } -.justify-start { - justify-content: flex-start; -} - .justify-center { justify-content: center; } @@ -3339,6 +3259,10 @@ section[id] { justify-content: space-between; } +.gap-12 { + gap: 3rem; +} + .gap-14 { gap: 3.5rem; } @@ -3363,8 +3287,9 @@ section[id] { gap: 2rem; } -.gap-12 { - gap: 3rem; +.gap-x-4 { + -moz-column-gap: 1rem; + column-gap: 1rem; } .gap-x-5 { @@ -3381,31 +3306,20 @@ section[id] { row-gap: 0.5rem; } -.gap-y-6 { - row-gap: 1.5rem; -} - -.gap-x-4 { - -moz-column-gap: 1rem; - column-gap: 1rem; -} - .gap-y-4 { row-gap: 1rem; } +.gap-y-6 { + row-gap: 1.5rem; +} + .space-y-10 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(2.5rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(2.5rem * var(--tw-space-y-reverse)); } -.space-y-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1rem * var(--tw-space-y-reverse)); -} - .space-y-3 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); @@ -3428,10 +3342,6 @@ section[id] { white-space: nowrap; } -.rounded-none { - border-radius: 0px; -} - .rounded-full { border-radius: 9999px; } @@ -3440,6 +3350,10 @@ section[id] { border-radius: 0.5rem; } +.rounded-none { + border-radius: 0px; +} + .rounded-sm { border-radius: 0.125rem; } @@ -3470,19 +3384,28 @@ section[id] { } .border-signal\/40 { - border-color: rgb(76 196 59 / 0.4); + border-color: rgb(62 174 43 / 0.4); } .border-white\/10 { border-color: rgb(255 255 255 / 0.1); } +.border-white\/15 { + border-color: rgb(255 255 255 / 0.15); +} + .border-white\/50 { border-color: rgb(255 255 255 / 0.5); } -.border-white\/15 { - border-color: rgb(255 255 255 / 0.15); +.bg-\[\#020d1d\]\/90 { + background-color: rgb(2 13 29 / 0.9); +} + +.bg-\[\#06172a\] { + --tw-bg-opacity: 1; + background-color: rgb(6 23 42 / var(--tw-bg-opacity, 1)); } .bg-base-200 { @@ -3495,17 +3418,13 @@ section[id] { background-color: rgb(3 21 41 / var(--tw-bg-opacity, 1)); } -.bg-navy-950\/80 { - background-color: rgb(3 21 41 / 0.8); -} - .bg-ocean { --tw-bg-opacity: 1; background-color: rgb(8 117 209 / var(--tw-bg-opacity, 1)); } -.bg-transparent { - background-color: transparent; +.bg-signal\/15 { + background-color: rgb(62 174 43 / 0.15); } .bg-white { @@ -3517,19 +3436,6 @@ section[id] { background-color: rgb(255 255 255 / 0.95); } -.bg-\[\#020d1d\]\/90 { - background-color: rgb(2 13 29 / 0.9); -} - -.bg-\[\#06172a\] { - --tw-bg-opacity: 1; - background-color: rgb(6 23 42 / var(--tw-bg-opacity, 1)); -} - -.bg-signal\/15 { - background-color: rgb(76 196 59 / 0.15); -} - .bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); } @@ -3540,19 +3446,10 @@ section[id] { --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } -.via-navy-900\/90 { - --tw-gradient-to: rgb(6 40 71 / 0) var(--tw-gradient-to-position); - --tw-gradient-stops: var(--tw-gradient-from), rgb(6 40 71 / 0.9) var(--tw-gradient-via-position), var(--tw-gradient-to); -} - .to-navy-800 { --tw-gradient-to: #073c68 var(--tw-gradient-to-position); } -.to-navy-800\/55 { - --tw-gradient-to: rgb(7 60 104 / 0.55) var(--tw-gradient-to-position); -} - .bg-cover { background-size: cover; } @@ -3588,6 +3485,11 @@ section[id] { padding-right: 1.5rem; } +.py-20 { + padding-top: 5rem; + padding-bottom: 5rem; +} + .py-7 { padding-top: 1.75rem; padding-bottom: 1.75rem; @@ -3598,11 +3500,6 @@ section[id] { padding-bottom: 2rem; } -.py-20 { - padding-top: 5rem; - padding-bottom: 5rem; -} - .pb-40 { padding-bottom: 10rem; } @@ -3641,6 +3538,10 @@ section[id] { font-size: 0.65rem; } +.text-\[0\.6rem\] { + font-size: 0.6rem; +} + .text-lg { font-size: 1.125rem; line-height: 1.75rem; @@ -3661,14 +3562,6 @@ section[id] { line-height: 1rem; } -.text-\[0\.6rem\] { - font-size: 0.6rem; -} - -.font-black { - font-weight: 900; -} - .font-bold { font-weight: 700; } @@ -3693,12 +3586,12 @@ section[id] { text-transform: uppercase; } -.leading-6 { - line-height: 1.5rem; +.leading-5 { + line-height: 1.25rem; } -.leading-7 { - line-height: 1.75rem; +.leading-6 { + line-height: 1.5rem; } .leading-8 { @@ -3709,12 +3602,8 @@ section[id] { line-height: 1.25; } -.leading-5 { - line-height: 1.25rem; -} - -.tracking-\[0\.16em\] { - letter-spacing: 0.16em; +.tracking-\[0\.14em\] { + letter-spacing: 0.14em; } .tracking-\[0\.18em\] { @@ -3729,14 +3618,6 @@ section[id] { letter-spacing: -0.025em; } -.tracking-wider { - letter-spacing: 0.05em; -} - -.tracking-\[0\.14em\] { - letter-spacing: 0.14em; -} - .\!text-sky-300 { --tw-text-opacity: 1 !important; color: rgb(125 211 252 / var(--tw-text-opacity, 1)) !important; @@ -3779,11 +3660,11 @@ section[id] { .text-signal { --tw-text-opacity: 1; - color: rgb(76 196 59 / var(--tw-text-opacity, 1)); + color: rgb(62 174 43 / var(--tw-text-opacity, 1)); } .text-signal\/70 { - color: rgb(76 196 59 / 0.7); + color: rgb(62 174 43 / 0.7); } .text-white { @@ -3791,14 +3672,6 @@ section[id] { color: rgb(255 255 255 / var(--tw-text-opacity, 1)); } -.text-white\/70 { - color: rgb(255 255 255 / 0.7); -} - -.text-white\/75 { - color: rgb(255 255 255 / 0.75); -} - .text-white\/55 { color: rgb(255 255 255 / 0.55); } @@ -3811,6 +3684,14 @@ section[id] { color: rgb(255 255 255 / 0.65); } +.text-white\/70 { + color: rgb(255 255 255 / 0.7); +} + +.text-white\/75 { + color: rgb(255 255 255 / 0.75); +} + .opacity-0 { opacity: 0; } @@ -3915,7 +3796,7 @@ section[id] { .focus\:border-signal:focus { --tw-border-opacity: 1; - border-color: rgb(76 196 59 / var(--tw-border-opacity, 1)); + border-color: rgb(62 174 43 / var(--tw-border-opacity, 1)); } .group:hover .group-hover\:translate-x-1 { @@ -3951,10 +3832,6 @@ section[id] { } @media (min-width: 768px) { - .md\:col-span-2 { - grid-column: span 2 / span 2; - } - .md\:grid { display: grid; } @@ -3992,8 +3869,8 @@ section[id] { padding-bottom: 9rem; } - .md\:text-6xl { - font-size: 3.75rem; + .md\:text-5xl { + font-size: 3rem; line-height: 1; } } @@ -4007,18 +3884,14 @@ section[id] { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .lg\:grid-cols-\[1\.2fr_1fr\] { - grid-template-columns: 1.2fr 1fr; - } - - .lg\:grid-cols-\[1fr_1\.05fr\] { - grid-template-columns: 1fr 1.05fr; - } - .lg\:grid-cols-\[0\.9fr_1\.1fr\] { grid-template-columns: 0.9fr 1.1fr; } + .lg\:grid-cols-\[1\.2fr_1fr\] { + grid-template-columns: 1.2fr 1fr; + } + .lg\:items-start { align-items: flex-start; } diff --git a/assets/css/tailwind.css b/assets/css/tailwind.css index f7d314a..7662c78 100644 --- a/assets/css/tailwind.css +++ b/assets/css/tailwind.css @@ -25,6 +25,7 @@ .release-art { @apply relative overflow-hidden bg-navy-900; } .release-art::before { content: ""; @apply absolute inset-0 opacity-70; background: radial-gradient(circle at 70% 30%, #0875d1, transparent 28%), linear-gradient(145deg, transparent 42%, #4cc43b 43%, transparent 44%); } .release-art::after { content: ""; @apply absolute border border-signal/70; inset: 28% 18% 22% 36%; } + .btn-primary { @apply text-white; } } @media (prefers-reduced-motion: reduce) { diff --git a/tailwind.config.js b/tailwind.config.js index ff95a04..9c5610f 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -14,7 +14,7 @@ module.exports = { 900: "#062847", 800: "#073c68" }, - signal: "#4cc43b", + signal: "#3eae2b", ocean: "#0875d1" }, fontFamily: { @@ -30,7 +30,7 @@ module.exports = { themes: [ { marina: { - primary: "#4cc43b", + primary: "#3eae2b", "primary-content": "#031529", secondary: "#0875d1", "secondary-content": "#ffffff", From 844ab871fa80536e237db71a58a4cce9bacc843b Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Wed, 16 Sep 2026 13:33:20 -0400 Subject: [PATCH 04/27] Improve legibility of hero --- _layouts/home.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_layouts/home.html b/_layouts/home.html index 5de82b3..8d4f6ab 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -18,8 +18,8 @@
{% if page.hero.subheadline %}

{{ page.hero.subheadline | escape }}

{% endif %} -

{{ page.hero.headline | escape }}

- {% if page.hero.text %}

{{ page.hero.text | escape }}

{% endif %} +

{{ page.hero.headline | escape }}

+ {% if page.hero.text %}

{{ page.hero.text | escape }}

{% endif %} {% if page.hero.buttons %}
{% for button in page.hero.buttons %}{% if button.style == "primary" %}{{ button.label | escape }}{% else %}{{ button.label | escape }}{% endif %}{% endfor %}
{% endif %}
From bf01cd38c7776bd964acf9df97f1a309f30f4162 Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Wed, 16 Sep 2026 13:39:00 -0400 Subject: [PATCH 05/27] Update releases content --- index.md | 58 +++++++++++++++----------------------------------------- 1 file changed, 15 insertions(+), 43 deletions(-) diff --git a/index.md b/index.md index 471b6ac..dc3d841 100644 --- a/index.md +++ b/index.md @@ -75,50 +75,22 @@ capabilities: releases: subheadline: Data releases headline: Current public releases - text: Choose a release below to download its data or review its annotations. + text: Check back September 22, 2026 for releases. items: - - title: Coastal vessel benchmark - image: "/assets/images/release-coastal-placeholder.svg" - image_alt: Placeholder aerial view of coastal vessel activity - description: A focused collection of labeled coastal traffic with acoustic and contextual metadata. - size: "1.9 TB" - views: 12 camera views - date: Released March 2026 - buttons: - - label: Download bundle - url: "#request" - style: primary - - label: Annotation details - url: "#" - style: outline - - title: Long-range acoustic tracks - image: "/assets/images/release-tracks-placeholder.svg" - image_alt: Placeholder visualization of long-range acoustic tracks - description: Longer observations prepared for detection, tracking, and activity-understanding tasks. - size: "1.9 TB" - views: 12 camera views - date: Released March 2026 - buttons: - - label: Download bundle - url: "#request" - style: primary - - label: Annotation details - url: "#" - style: outline - - title: Dense harbor activity - image: "/assets/images/release-harbor-placeholder.svg" - image_alt: Placeholder underwater view of dense harbor activity - description: Busy harbor scenes with overlapping vessel activity and detailed annotations. - size: "1.9 TB" - views: 12 camera views - date: Released March 2026 - buttons: - - label: Download bundle - url: "#request" - style: primary - - label: Annotation details - url: "#" - style: outline + # - title: Sample title + # image: "/assets/images/release-coastal-placeholder.svg" + # image_alt: Placeholder + # description: Sample text paragraph should go here + # size: "X.X TB" + # views: X camera views + # date: Released March 2026 + # buttons: + # - label: Download bundle + # url: "#request" + # style: primary + # - label: Annotation details + # url: "#" + # style: outline # ================================================== # REQUEST FORM From fc480df4a9638599ef1b1cdee915bfdaa585b6db Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Fri, 18 Sep 2026 15:06:53 -0400 Subject: [PATCH 06/27] Add remixicon --- _layouts/default.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/_layouts/default.html b/_layouts/default.html index ec356a2..8eeea63 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -8,6 +8,10 @@ + From 105dfc0acb526a9f6904df74dca279d46951815f Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Fri, 18 Sep 2026 15:07:52 -0400 Subject: [PATCH 07/27] Format code and add additional functionality --- _layouts/home.html | 312 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 285 insertions(+), 27 deletions(-) diff --git a/_layouts/home.html b/_layouts/home.html index 8d4f6ab..14e05bf 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -17,62 +17,320 @@
- {% if page.hero.subheadline %}

{{ page.hero.subheadline | escape }}

{% endif %} -

{{ page.hero.headline | escape }}

- {% if page.hero.text %}

{{ page.hero.text | escape }}

{% endif %} - {% if page.hero.buttons %}
{% for button in page.hero.buttons %}{% if button.style == "primary" %}{{ button.label | escape }}{% else %}{{ button.label | escape }}{% endif %}{% endfor %}
{% endif %} + {% if page.hero.subheadline %}

{{ page.hero.subheadline }}

{% endif %} +

{{ page.hero.headline }}

+ {% if page.hero.text %}

{{ page.hero.text }}

{% endif %} + {% if page.hero.buttons %} +
+ {% for button in page.hero.buttons %} + {% if button.style == "primary" %} + + {{ button.label | escape }} + + {% else %} + + {{ button.label | escape }} + + {% endif %} + {% endfor %} +
+ {% endif %}
- {% if page.hero.annotation %}{% endif %}
-
{% if page.overview.subheadline %}

{{ page.overview.subheadline | escape }}

{% endif %}

{{ page.overview.headline | escape }}

{% if page.overview.paragraphs %}
{% for paragraph in page.overview.paragraphs %}{{ paragraph | markdownify }}{% endfor %}
{% endif %}
- {% if page.overview.stats %}
{% for stat in page.overview.stats %}
{{ stat.label | escape }}
{{ stat.value | escape }}
{% endfor %}
{% endif %} +
+ {% if page.overview.subheadline %} +

{{ page.overview.subheadline | escape }}

+ {% endif %} +

{{ page.overview.headline | escape }}

+ {% if page.overview.paragraphs %} +
+ {% for paragraph in page.overview.paragraphs %} + {{ paragraph | markdownify }} + {% endfor %} +
+ {% endif %} +
+ {% if page.overview.stats %} +
+ {% for stat in page.overview.stats %} +
+
{{ stat.value | escape }}
+
{{ stat.label | escape }}
+
+ {% endfor %} +
+ {% endif %}
-
- {% if page.capabilities.subheadline %}

{{ page.capabilities.subheadline | escape }}

{% endif %}

{{ page.capabilities.headline | escape }}

- {% if page.capabilities.items %}
{% for item in page.capabilities.items %}
0{{ forloop.index }}

{{ item.title | escape }}

{{ item.text | escape }}

{% endfor %}
{% endif %} +
+ {% if page.difference.subheadline %} +

{{ page.difference.subheadline | escape }}

+ {% endif %} +

{{ page.difference.headline | escape }}

+ {% if page.difference.items %} +
+ {% for item in page.difference.items %} +
+ 0{{ forloop.index }} +

{{ item.title | escape }}

+

{{ item.text | escape }}

+
+ {% endfor %} +
+ {% endif %}
- {% if page.releases.subheadline %}

{{ page.releases.subheadline | escape }}

{% endif %}

{{ page.releases.headline | escape }}

{% if page.releases.text %}

{{ page.releases.text | escape }}

{% endif %} - {% if page.releases.items %}
{% for release in page.releases.items %}
{% if release.image %}{{ release.image_alt | escape }}{% endif %}

{{ release.title | escape }}

{{ release.description | escape }}

▣ {{ release.size | escape }}▦ {{ release.views | escape }}◉ {{ release.date | escape }}
{% if release.buttons %}
{% for button in release.buttons %}{{ button.label | escape }}{% endfor %}
{% endif %}
{% endfor %}
{% endif %} + {% if page.releases.subheadline %} +

{{ page.releases.subheadline | escape }}

+ {% endif %} +

{{ page.releases.headline | escape }}

+ {% if page.releases.text %} +

{{ page.releases.text | escape }}

+ {% endif %} + {% if page.releases.items %} +
+ {% for release in page.releases.items %} +
+ {% if release.image %} + {{ release.image_alt | escape }} + {% endif %} +
+

{{ release.title | escape }}

+

{{ release.description | escape }}

+
+ + + {{ release.size | escape }} + + + + {{ release.views | escape }} + + + + {{ release.date | escape }} + +
+ {% if release.buttons %} +
+ {% for button in release.buttons %} + + {{ button.label | escape }} + + {% endfor %} +
+ {% endif %} +
+
+ {% endfor %} +
+ {% endif %}
- {% if page.request.subheadline %}

{{ page.request.subheadline | escape }}

{% endif %} + {% if page.request.subheadline %} +

{{ page.request.subheadline | escape }}

+ {% endif %}

{{ page.request.headline | escape }}

- {% if page.request.text %}

{{ page.request.text | escape }}

{% endif %} + {% if page.request.text %} +

{{ page.request.text | escape }}

+ {% endif %} {% if page.request.benefits %}
    - {% for benefit in page.request.benefits %}
  • {{ benefit | escape }}
  • {% endfor %} + {% for benefit in page.request.benefits %} +
  • + + {{ benefit | escape }} +
  • + {% endfor %}
{% endif %}
-
- - - - - - - + {% assign form = page.request.form %} + + + {% for field in form.fields %} + {% if field.width == "half" %} + {% assign field_width = "" %} + {% else %} + {% assign field_width = "sm:col-span-2" %} + {% endif %} + + {% if field.type == "checkbox" %} + + + + {% else %} + + + + {% endif %} + {% endfor %} + +
-
- {% if page.citation.subheadline %}

{{ page.citation.subheadline | escape }}

{% endif %}

{{ page.citation.headline | escape }}

{% if page.citation.text %}

{{ page.citation.text | escape }}

{% endif %}
{{ page.citation.code | escape }}

{{ page.citation.contact.headline | escape }}

{{ page.citation.contact.text | escape }}

{{ page.citation.contact.button_label | escape }}
-
+
+
+ {% if page.citation.subheadline %} +

{{ page.citation.subheadline | escape }}

+ {% endif %} +

{{ page.citation.headline | escape }}

+ {% if page.citation.text %} +

{{ page.citation.text | escape }}

+ {% endif %} +
+
{{ page.citation.code | escape }}
+ +
+
+
+

{{ page.citation.contact.headline | escape }}

+

{{ page.citation.contact.text | escape }}

+
+ {{ page.citation.contact.button_label | escape }} +
+
+
+ + From 08722e892cdc139200eb2b79a6a1a005ebb2a66e Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Fri, 18 Sep 2026 15:08:18 -0400 Subject: [PATCH 08/27] Add place for disclaimer to footer --- _includes/footer.html | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index 41b9e36..ed3e2f4 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,3 +1,12 @@ -
- © {{ "now" | date: "%Y" }} {{ site.data.site.footer.organization | escape }} +
+
+
+
+ {{ site.data.site.footer.disclaimer }} +
+
+ © {{ "now" | date: "%Y" }} {{ site.data.site.footer.organization | escape }} +
+
+
From 7a04f0c48bf2ff11fdc2e65554a31ff8784ca1bb Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Fri, 18 Sep 2026 15:08:47 -0400 Subject: [PATCH 09/27] Input real content --- _data/site.yml | 9 ++- index.md | 182 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 126 insertions(+), 65 deletions(-) diff --git a/_data/site.yml b/_data/site.yml index 4c986b4..7a233ae 100644 --- a/_data/site.yml +++ b/_data/site.yml @@ -18,8 +18,8 @@ cta: navigation: - label: Overview url: "#overview" - - label: Capabilities - url: "#capabilities" + - label: The difference + url: "#difference" - label: Releases url: "#releases" - label: Request access @@ -28,4 +28,9 @@ navigation: url: "#citation" footer: + disclaimer: >- + Funded by DARPA under MARINA program, contract W912CG-24-C-0020
+ Disclaimer (DARPA)
+ Data owned by Ocean Networks Canada and available under CC-BY 4.0
+ https://www.oceannetworks.ca/data/data-policy/ organization: Kitware, Inc. diff --git a/index.md b/index.md index dc3d841..4b2364a 100644 --- a/index.md +++ b/index.md @@ -10,12 +10,11 @@ description: A large labeled dataset for underwater acoustic target recognition. hero: # Replace this path with the final hero image in assets/images. background_image: "/assets/images/hero-placeholder.svg" - subheadline: Open maritime research data - headline: Large labeled dataset for underwater acoustic target recognition + subheadline: Open benchmark · Underwater Acoustics + headline: >- + UniqueShip: Large, public underwater acoustic target recognition (UATR) datasets for ships text: >- - Explore annotated recordings, vessel metadata, and analysis-ready - releases built for repeatable maritime research. - annotation: "ID: 005 · TANKER" + 2,460 hours of ship-radiated noise from 4,218 unique vessels, split by vessel ID so no ship appears in both training and test split. Sourced from the Ocean Networks Canada (ONC) repository. buttons: - label: Browse releases url: "#releases" @@ -28,45 +27,40 @@ hero: # OVERVIEW # ================================================== overview: - subheadline: About the dataset - headline: A research foundation for understanding underwater activity. + subheadline: Overview + headline: Built to train generalizable UATR models using leakproof splits paragraphs: - >- - MARINA brings recordings, labels, and contextual metadata together in - one consistent resource. It is designed to reduce setup work and help - teams move more quickly from exploration to useful experiments. - - >- - Replace this introductory copy with the dataset's mission, provenance, - intended uses, limitations, and stewardship information. + UniqueShip pairs hydrophone recordings from seven ONC deployments in the Strait of Georgia (May 2016 – November 2023) with AIS vessel tracking data. Each 5-second sample is labeled with its vessel class and 17 AIS metadata fields. Unlike earlier ONC-based datasets, every split keeps each vessel in a single partition and groups background audio by day, so test accuracy reflects performance on ships the model has never heard. stats: - value: "3,437" - label: Hours of audio + label: Hours of ship & background audio - value: "4,218" label: Unique vessels - value: "11" label: Vessel classes - value: "2" - label: Spectrogram types + label: 5-second recordings # ================================================== -# CAPABILITIES +# THE DIFFERENCE # ================================================== -capabilities: - subheadline: Dataset capabilities - headline: Built to support practical research workflows. +difference: + subheadline: What makes it different? + headline: Larger, more diverse, and free of data leakage that inflates other benchmarks items: - - title: Labeled vessel activity - text: Time-aligned annotations connect acoustic events to vessel classes and activity. - - title: Analysis-ready bundles - text: Curated files, metadata, and clear documentation make exploration easier. - - title: Multiple representations - text: Work with audio alongside complementary spectrogram formats. - - title: Consistent metadata - text: Search and filter releases using a predictable shared schema. - - title: Reproducible releases - text: Versioned public bundles keep downstream work traceable. - - title: Open documentation - text: Examples and reference material support common technical workflows. + - title: Leak-free splits + text: Vessel audio is grouped by MMSI and background by day instead of random splitting. On previous datasets, random splitting inflated accuracy by 10–48 points. + - title: Largest open ONC dataset + text: The balanced benchmark subset alone has 4× the audio and 12× the vessels of DeepShip, and 70% more audio than the unbalanced Oceanship dataset. + - title: Rich AIS metadata + text: 17 fields per sample, including MMSI, distance to hydrophone, speed, course, length, beam, draught, and navigation status. + - title: Ready-made splits + text: Choose anything from a 25-hour quick-start subset to the full 3,437-hour corpus, with five 80/10/10 folds. + - title: Baselines included + text: MobileNetV3, ViT-B/16, and SwinV2 with STFT and Mel inputs. The best result is 66.5% accuracy (Swin + Mel). + - title: Cleaner background class + text: 8km ship-free radius ensures quieter ambient samples for the background class # ================================================== # DATA RELEASES @@ -74,23 +68,41 @@ capabilities: # ================================================== releases: subheadline: Data releases - headline: Current public releases - text: Check back September 22, 2026 for releases. + headline: Current dataset splits + text: All splits are vessel-disjoint and include per-sample AIS metadata. Samples are 5-second clips at 20 kHz; full-length recordings are available through the codebase. items: - # - title: Sample title - # image: "/assets/images/release-coastal-placeholder.svg" - # image_alt: Placeholder - # description: Sample text paragraph should go here - # size: "X.X TB" - # views: X camera views - # date: Released March 2026 - # buttons: - # - label: Download bundle - # url: "#request" - # style: primary - # - label: Annotation details - # url: "#" - # style: outline + - title: 5 Class - Balanced (Benchmark) + image: "/assets/images/release-coastal-placeholder.svg" + image_alt: Placeholder + description: Contains the main 5 classes (Tug/Tow, Tanker, Passengership, Cargo) and balances the total audio for each class such that they are equal. + size: "89 GB (Unzipped), 59 GB (Zipped)" + views: 213h, 3175 vessels, 5 classes + date: Released March 2026 + buttons: + - label: Download bundle + url: "#request" + target: _blank + style: primary + - label: Annotation details + url: "#" + target: _blank + style: outline + - title: 12 Class - 5 Hours Each + image: "/assets/images/release-coastal-placeholder.svg" + image_alt: Placeholder + description: Contains all ship classes and balances the total audio such that it is 5 hours each class. + size: "10 GB (Unzipped), 7 GB (Zipped)" + views: 60h, 4218 vessels, 12 classes + date: Released March 2026 + buttons: + - label: Download bundle + url: "#request" + target: _blank + style: primary + - label: Annotation details + url: "#" + target: _blank + style: outline # ================================================== # REQUEST FORM @@ -99,35 +111,79 @@ request: subheadline: Data access headline: Request the dataset text: >- - Use this section to explain eligibility, expected response time, - licensing, and what happens after a request is submitted. + Datasets are distributed to named researchers under CC BY 4.0. Tell us who you are and what you plan to build, and we'll send signed download links plus the matching annotation and evaluation packages. benefits: - Clear licensing and use requirements - Versioned bundles and documentation - A defined path for support questions form: - action: "#" - name_label: Full name - email_label: Work email - organization_label: Organization - release_label: Release requested - release_placeholder: Select a release… - use_label: Research use - agreement_label: I agree to the terms and conditions. + # GitHub Pages cannot process forms itself. This should point to + # Formspree, Basin, a company API, or another form service. + action: "https://formspree.io/f/your-form-id" + method: post + submit_label: Request download + fields: + - type: text + name: name + label: Full name + width: half + required: true + autocomplete: name + + - type: email + name: email + label: Work email + width: half + required: true + autocomplete: email + + - type: text + name: organization + label: Organization + width: half + autocomplete: organization + + - type: select + name: release + label: Release requested + width: half + placeholder: Select a release + required: true + options: + - Full dataset + - Training split + - Evaluation split + + - type: textarea + name: intended_use + label: Intended research use + width: full + placeholder: Describe how you plan to use the dataset. + required: true + + - type: checkbox + name: agreement + label: I agree to the dataset terms and conditions. + value: accepted + width: full + required: true + # ================================================== # CITATION AND CONTACT # ================================================== citation: subheadline: Citing this dataset headline: Reference the dataset paper - text: Replace the sample BibTeX below with the publication's canonical citation. - code: | - @inproceedings{marina_dataset, - title = {MARINA: A Labeled Maritime Acoustic Dataset}, - author = {Research Team}, - year = {2026} + text: If you use UniqueShip, please cite the paper below. + code: |- + @inproceedings{hashemi_2026_uniqueship, + author = {Hashemi, Connor and Stout, Trevor and Hoogs, Anthony and Parham, Jason}, + title = {UniqueShip: Mitigating Data Leakage in Acoustic Ship Classification Benchmark Datasets}, + booktitle = {OCEANS 2026}, + year = {2026}, + pages = {TODO} } contact: headline: Questions, corrections, or collaboration? From 0238bc61f2c9e8314be3f2cd1303ddceae1818ec Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Fri, 18 Sep 2026 15:08:59 -0400 Subject: [PATCH 10/27] Commit compiled styles --- assets/css/site.css | 846 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 735 insertions(+), 111 deletions(-) diff --git a/assets/css/site.css b/assets/css/site.css index 576d8f5..e7a2b4c 100644 --- a/assets/css/site.css +++ b/assets/css/site.css @@ -625,7 +625,7 @@ html { } :root { - --p: 72.5487% 0.204994 141.315419; + --p: 66.1952% 0.194469 141.065623; --ac: 13.9154% 0.027649 237.697542; --inc: 91.1915% 0.033075 252.190181; --suc: 14.5097% 0.040999 141.315419; @@ -673,10 +673,564 @@ body { outline-style: solid; outline-width: 2px; outline-offset: 4px; - outline-color: #4cc43b; + outline-color: #3eae2b; +} + +section[id] { + scroll-margin-top: 4rem; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.prose { + color: var(--tw-prose-body); + max-width: 65ch; +} + +.prose :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-lead); + font-size: 1.25em; + line-height: 1.6; + margin-top: 1.2em; + margin-bottom: 1.2em; +} + +.prose :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-links); + text-decoration: underline; + font-weight: 500; +} + +.prose :where(strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-bold); + font-weight: 600; +} + +.prose :where(a strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: decimal; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-inline-start: 1.625em; +} + +.prose :where(ol[type="A"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="A" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-alpha; +} + +.prose :where(ol[type="a" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-alpha; +} + +.prose :where(ol[type="I"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="I" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: upper-roman; +} + +.prose :where(ol[type="i" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: lower-roman; +} + +.prose :where(ol[type="1"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: decimal; +} + +.prose :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + list-style-type: disc; + margin-top: 1.25em; + margin-bottom: 1.25em; + padding-inline-start: 1.625em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { + font-weight: 400; + color: var(--tw-prose-counters); +} + +.prose :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { + color: var(--tw-prose-bullets); +} + +.prose :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.25em; +} + +.prose :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-color: var(--tw-prose-hr); + border-top-width: 1px; + margin-top: 3em; + margin-bottom: 3em; +} + +.prose :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 500; + font-style: italic; + color: var(--tw-prose-quotes); + border-inline-start-width: 0.25rem; + border-inline-start-color: var(--tw-prose-quote-borders); + quotes: "\201C""\201D""\2018""\2019"; + margin-top: 1.6em; + margin-bottom: 1.6em; + padding-inline-start: 1em; +} + +.prose :where(blockquote p:first-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { + content: open-quote; +} + +.prose :where(blockquote p:last-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { + content: close-quote; +} + +.prose :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 800; + font-size: 2.25em; + margin-top: 0; + margin-bottom: 0.8888889em; + line-height: 1.1111111; +} + +.prose :where(h1 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 900; + color: inherit; +} + +.prose :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 700; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: 1em; + line-height: 1.3333333; +} + +.prose :where(h2 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 800; + color: inherit; +} + +.prose :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + font-size: 1.25em; + margin-top: 1.6em; + margin-bottom: 0.6em; + line-height: 1.6; +} + +.prose :where(h3 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + margin-top: 1.5em; + margin-bottom: 0.5em; + line-height: 1.5; +} + +.prose :where(h4 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 700; + color: inherit; +} + +.prose :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + display: block; + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + font-weight: 500; + font-family: inherit; + color: var(--tw-prose-kbd); + box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows); + font-size: 0.875em; + border-radius: 0.3125rem; + padding-top: 0.1875em; + padding-inline-end: 0.375em; + padding-bottom: 0.1875em; + padding-inline-start: 0.375em; +} + +.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-code); + font-weight: 600; + font-size: 0.875em; +} + +.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { + content: "`"; +} + +.prose :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { + content: "`"; +} + +.prose :where(a code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h1 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; + font-size: 0.875em; +} + +.prose :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; + font-size: 0.9em; +} + +.prose :where(h4 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(blockquote code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(thead th code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: inherit; +} + +.prose :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-pre-code); + background-color: var(--tw-prose-pre-bg); + overflow-x: auto; + font-weight: 400; + font-size: 0.875em; + line-height: 1.7142857; + margin-top: 1.7142857em; + margin-bottom: 1.7142857em; + border-radius: 0.375rem; + padding-top: 0.8571429em; + padding-inline-end: 1.1428571em; + padding-bottom: 0.8571429em; + padding-inline-start: 1.1428571em; +} + +.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + background-color: transparent; + border-width: 0; + border-radius: 0; + padding: 0; + font-weight: inherit; + color: inherit; + font-size: inherit; + font-family: inherit; + line-height: inherit; +} + +.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { + content: none; +} + +.prose :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { + content: none; +} + +.prose :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + width: 100%; + table-layout: auto; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; +} + +.prose :where(thead):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-th-borders); +} + +.prose :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-headings); + font-weight: 600; + vertical-align: bottom; + padding-inline-end: 0.5714286em; + padding-bottom: 0.5714286em; + padding-inline-start: 0.5714286em; +} + +.prose :where(tbody tr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-bottom-width: 1px; + border-bottom-color: var(--tw-prose-td-borders); +} + +.prose :where(tbody tr:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-bottom-width: 0; +} + +.prose :where(tbody td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + vertical-align: baseline; +} + +.prose :where(tfoot):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + border-top-width: 1px; + border-top-color: var(--tw-prose-th-borders); +} + +.prose :where(tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + vertical-align: top; +} + +.prose :where(th, td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + text-align: start; +} + +.prose :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + color: var(--tw-prose-captions); + font-size: 0.875em; + line-height: 1.4285714; + margin-top: 0.8571429em; +} + +.prose { + --tw-prose-body: #374151; + --tw-prose-headings: #111827; + --tw-prose-lead: #4b5563; + --tw-prose-links: #111827; + --tw-prose-bold: #111827; + --tw-prose-counters: #6b7280; + --tw-prose-bullets: #d1d5db; + --tw-prose-hr: #e5e7eb; + --tw-prose-quotes: #111827; + --tw-prose-quote-borders: #e5e7eb; + --tw-prose-captions: #6b7280; + --tw-prose-kbd: #111827; + --tw-prose-kbd-shadows: rgb(17 24 39 / 10%); + --tw-prose-code: #111827; + --tw-prose-pre-code: #e5e7eb; + --tw-prose-pre-bg: #1f2937; + --tw-prose-th-borders: #d1d5db; + --tw-prose-td-borders: #e5e7eb; + --tw-prose-invert-body: #d1d5db; + --tw-prose-invert-headings: #fff; + --tw-prose-invert-lead: #9ca3af; + --tw-prose-invert-links: #fff; + --tw-prose-invert-bold: #fff; + --tw-prose-invert-counters: #9ca3af; + --tw-prose-invert-bullets: #4b5563; + --tw-prose-invert-hr: #374151; + --tw-prose-invert-quotes: #f3f4f6; + --tw-prose-invert-quote-borders: #374151; + --tw-prose-invert-captions: #9ca3af; + --tw-prose-invert-kbd: #fff; + --tw-prose-invert-kbd-shadows: rgb(255 255 255 / 10%); + --tw-prose-invert-code: #fff; + --tw-prose-invert-pre-code: #d1d5db; + --tw-prose-invert-pre-bg: rgb(0 0 0 / 50%); + --tw-prose-invert-th-borders: #4b5563; + --tw-prose-invert-td-borders: #374151; + font-size: 1rem; + line-height: 1.75; +} + +.prose :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; + margin-bottom: 0; +} + +.prose :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.prose :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0.375em; +} + +.prose :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0.375em; +} + +.prose :where(.prose > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(.prose > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(.prose > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; +} + +.prose :where(.prose > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-bottom: 1.25em; +} + +.prose :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.75em; + margin-bottom: 0.75em; +} + +.prose :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 1.25em; + margin-bottom: 1.25em; +} + +.prose :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0.5em; + padding-inline-start: 1.625em; +} + +.prose :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0; +} + +.prose :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-end: 0; +} + +.prose :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-top: 0.5714286em; + padding-inline-end: 0.5714286em; + padding-bottom: 0.5714286em; + padding-inline-start: 0.5714286em; +} + +.prose :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-start: 0; +} + +.prose :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + padding-inline-end: 0; +} + +.prose :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 2em; + margin-bottom: 2em; +} + +.prose :where(.prose > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-top: 0; +} + +.prose :where(.prose > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { + margin-bottom: 0; +} + +.avatar.placeholder > div { + display: flex; + align-items: center; + justify-content: center; } @media (hover:hover) { + .checkbox-primary:hover { + --tw-border-opacity: 1; + border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); + } + .label a:hover { --tw-text-opacity: 1; color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); @@ -854,6 +1408,16 @@ body { opacity: 1; } + .btm-nav > *.disabled:hover, + .btm-nav > *[disabled]:hover { + pointer-events: none; + --tw-border-opacity: 0; + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); + --tw-bg-opacity: 0.1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --tw-text-opacity: 0.2; + } + .btn:hover { --tw-border-opacity: 1; border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity))); @@ -1345,6 +1909,16 @@ body { var(--togglehandleborder); } +.btm-nav > *.disabled, + .btm-nav > *[disabled] { + pointer-events: none; + --tw-border-opacity: 0; + background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); + --tw-bg-opacity: 0.1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --tw-text-opacity: 0.2; +} + .btm-nav > * .label { font-size: 1rem; line-height: 1.5rem; @@ -1852,42 +2426,6 @@ body { margin-top: 0; } -.mockup-phone .camera { - position: relative; - top: 0px; - left: 0px; - background: #000; - height: 25px; - width: 150px; - margin: 0 auto; - border-bottom-left-radius: 17px; - border-bottom-right-radius: 17px; - z-index: 11; -} - -.mockup-phone .camera:before { - content: ""; - position: absolute; - top: 35%; - left: 50%; - width: 50px; - height: 4px; - border-radius: 5px; - background-color: #0c0b0e; - transform: translate(-50%, -50%); -} - -.mockup-phone .camera:after { - content: ""; - position: absolute; - top: 20%; - left: 70%; - width: 8px; - height: 8px; - border-radius: 5px; - background-color: #0f0b25; -} - .mockup-phone .display { overflow: hidden; border-radius: 40px; @@ -2450,6 +2988,18 @@ body { color: rgb(255 255 255 / var(--tw-text-opacity, 1)); } +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + .pointer-events-none { pointer-events: none; } @@ -2475,28 +3025,28 @@ body { right: 0px; } -.-top-7 { - top: -1.75rem; -} - .bottom-0 { bottom: 0px; } -.left-0 { - left: 0px; -} - -.right-\[12\%\] { - right: 12%; +.right-3 { + right: 0.75rem; } .top-0 { top: 0px; } -.top-\[18\%\] { - top: 18%; +.top-3 { + top: 0.75rem; +} + +.isolate { + isolation: isolate; +} + +.z-10 { + z-index: 10; } .z-20 { @@ -2601,16 +3151,20 @@ body { height: 1rem; } +.h-12 { + height: 3rem; +} + .h-16 { height: 4rem; } -.h-24 { - height: 6rem; +.h-20 { + height: 5rem; } -.h-40 { - height: 10rem; +.h-24 { + height: 6rem; } .h-8 { @@ -2621,14 +3175,6 @@ body { height: 100%; } -.h-12 { - height: 3rem; -} - -.h-20 { - height: 5rem; -} - .min-h-screen { min-height: 100vh; } @@ -2637,10 +3183,6 @@ body { width: 14rem; } -.w-64 { - width: 16rem; -} - .w-auto { width: auto; } @@ -2699,6 +3241,22 @@ body { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } +@keyframes bounce { + 0%, 100% { + transform: translateY(-25%); + animation-timing-function: cubic-bezier(0.8,0,1,1); + } + + 50% { + transform: none; + animation-timing-function: cubic-bezier(0,0,0.2,1); + } +} + +.animate-bounce { + animation: bounce 1s infinite; +} + .cursor-pointer { cursor: pointer; } @@ -2784,11 +3342,6 @@ body { column-gap: 1rem; } -.gap-x-5 { - -moz-column-gap: 1.25rem; - column-gap: 1.25rem; -} - .gap-x-8 { -moz-column-gap: 2rem; column-gap: 2rem; @@ -2818,6 +3371,12 @@ body { margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); } +.space-y-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(2rem * var(--tw-space-y-reverse)); +} + .justify-self-start { justify-self: start; } @@ -2875,10 +3434,6 @@ body { border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity, 1))); } -.border-signal\/40 { - border-color: rgb(62 174 43 / 0.4); -} - .border-white\/10 { border-color: rgb(255 255 255 / 0.1); } @@ -2910,9 +3465,9 @@ body { background-color: rgb(3 21 41 / var(--tw-bg-opacity, 1)); } -.bg-ocean { +.bg-secondary { --tw-bg-opacity: 1; - background-color: rgb(8 117 209 / var(--tw-bg-opacity, 1)); + background-color: var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity, 1))); } .bg-signal\/15 { @@ -2982,16 +3537,16 @@ body { padding-bottom: 4rem; } -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - .py-20 { padding-top: 5rem; padding-bottom: 5rem; } +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + .py-7 { padding-top: 1.75rem; padding-bottom: 1.75rem; @@ -3006,6 +3561,10 @@ body { padding-bottom: 10rem; } +.pr-16 { + padding-right: 4rem; +} + .pt-10 { padding-top: 2.5rem; } @@ -3018,12 +3577,8 @@ body { padding-top: 1.5rem; } -.text-center { - text-align: center; -} - -.font-mono { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +.pt-8 { + padding-top: 2rem; } .text-3xl { @@ -3044,6 +3599,11 @@ body { font-size: 0.6rem; } +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + .text-lg { font-size: 1.125rem; line-height: 1.75rem; @@ -3059,11 +3619,6 @@ body { line-height: 1.75rem; } -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} - .text-xs { font-size: 0.75rem; line-height: 1rem; @@ -3101,12 +3656,20 @@ body { line-height: 1.5rem; } +.leading-7 { + line-height: 1.75rem; +} + .leading-8 { line-height: 2rem; } -.leading-7 { - line-height: 1.75rem; +.leading-normal { + line-height: 1.5; +} + +.leading-relaxed { + line-height: 1.625; } .leading-tight { @@ -3121,15 +3684,14 @@ body { letter-spacing: 0.18em; } +.tracking-\[0\.22em\] { + letter-spacing: 0.22em; +} .tracking-\[0\.2em\] { letter-spacing: 0.2em; } -.tracking-\[0\.22em\] { - letter-spacing: 0.22em; -} - .tracking-tight { letter-spacing: -0.025em; } @@ -3169,9 +3731,14 @@ body { color: rgb(3 21 41 / var(--tw-text-opacity, 1)); } -.text-ocean { +.text-primary { --tw-text-opacity: 1; - color: rgb(8 117 209 / var(--tw-text-opacity, 1)); + color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1))); +} + +.text-secondary { + --tw-text-opacity: 1; + color: var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity, 1))); } .text-signal { @@ -3179,8 +3746,14 @@ body { color: rgb(62 174 43 / var(--tw-text-opacity, 1)); } -.text-signal\/70 { - color: rgb(62 174 43 / 0.7); +.text-sky-300 { + --tw-text-opacity: 1; + color: rgb(125 211 252 / var(--tw-text-opacity, 1)); +} + +.text-success { + --tw-text-opacity: 1; + color: var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity, 1))); } .text-white { @@ -3188,6 +3761,10 @@ body { color: rgb(255 255 255 / var(--tw-text-opacity, 1)); } +.text-white\/45 { + color: rgb(255 255 255 / 0.45); +} + .text-white\/55 { color: rgb(255 255 255 / 0.55); } @@ -3238,10 +3815,6 @@ body { outline-style: solid; } -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - .backdrop-blur { --tw-backdrop-blur: blur(8px); -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); @@ -3268,6 +3841,12 @@ body { transition-duration: 150ms; } +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + .duration-300 { transition-duration: 300ms; } @@ -3320,9 +3899,9 @@ body { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } -.group:hover .group-hover\:text-ocean { +.group:hover .group-hover\:text-secondary { --tw-text-opacity: 1; - color: rgb(8 117 209 / var(--tw-text-opacity, 1)); + color: var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity, 1))); } @media (min-width: 640px) { @@ -3345,6 +3924,20 @@ body { .sm\:justify-between { justify-content: space-between; } + + .sm\:text-5xl { + font-size: 3rem; + line-height: 1; + } + + .sm\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem; + } + + .sm\:leading-8 { + line-height: 2rem; + } } @media (min-width: 768px) { @@ -3392,8 +3985,16 @@ body { } @media (min-width: 1024px) { - .lg\:block { - display: block; + .lg\:flex { + display: flex; + } + + .lg\:w-1\/3 { + width: 33.333333%; + } + + .lg\:w-2\/3 { + width: 66.666667%; } .lg\:grid-cols-3 { @@ -3420,10 +4021,33 @@ body { gap: 4rem; } + .lg\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } + .lg\:px-8 { padding-left: 2rem; padding-right: 2rem; } + + .lg\:pr-8 { + padding-right: 2rem; + } + + .lg\:text-left { + text-align: left; + } + + .lg\:text-right { + text-align: right; + } + + .lg\:text-6xl { + font-size: 3.75rem; + line-height: 1; + } } @media (min-width: 1280px) { From 0b5113aa0dd6ad83afdc58301d8c87b1fc611de9 Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Fri, 18 Sep 2026 15:38:01 -0400 Subject: [PATCH 11/27] Make form more editable --- _layouts/home.html | 277 ++++++++++++++++++++++++++++++-------------- assets/css/site.css | 115 +++++++++++++----- index.md | 12 +- 3 files changed, 288 insertions(+), 116 deletions(-) diff --git a/_layouts/home.html b/_layouts/home.html index 14e05bf..a06b205 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -170,96 +170,162 @@

{{ page.request.headline | escape {% assign form = page.request.form %} -
- {% for field in form.fields %} - {% if field.width == "half" %} - {% assign field_width = "" %} - {% else %} - {% assign field_width = "sm:col-span-2" %} +
+ + {% if form.access_key %} + {% endif %} - {% if field.type == "checkbox" %} - - - - {% else %} - - - + {% if form.subject %} + {% endif %} - {% endfor %} - + + + +

@@ -333,4 +399,45 @@

{{ page.citation.contact.headline | escape }}

} }); }); + + document.querySelectorAll("[data-request-form]").forEach((form) => { + form.addEventListener("submit", async (event) => { + event.preventDefault(); + + const container = form.closest("[data-form-container]"); + const success = container.querySelector("[data-form-success]"); + const errorMessage = form.querySelector("[data-form-error]"); + const submitButton = form.querySelector("[data-submit-button]"); + + const defaultLabel = submitButton.dataset.defaultLabel; + const submittingLabel = submitButton.dataset.submittingLabel; + + errorMessage.classList.add("hidden"); + submitButton.disabled = true; + submitButton.textContent = submittingLabel; + + try { + const response = await fetch(form.action, { + method: form.method || "POST", + body: new FormData(form), + headers: { + Accept: "application/json" + } + }); + + if (!response.ok) { + throw new Error("Form submission failed"); + } + + form.classList.add("hidden"); + success.classList.remove("hidden"); + success.focus(); + form.reset(); + } catch (error) { + errorMessage.classList.remove("hidden"); + submitButton.disabled = false; + submitButton.textContent = defaultLabel; + } + }); + }); diff --git a/assets/css/site.css b/assets/css/site.css index e7a2b4c..44d0247 100644 --- a/assets/css/site.css +++ b/assets/css/site.css @@ -1219,6 +1219,36 @@ section[id] { margin-bottom: 0; } +.alert { + display: grid; + width: 100%; + grid-auto-flow: row; + align-content: flex-start; + align-items: center; + justify-items: center; + gap: 1rem; + text-align: center; + border-radius: var(--rounded-box, 1rem); + border-width: 1px; + --tw-border-opacity: 1; + border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); + padding: 1rem; + --tw-text-opacity: 1; + color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); + --alert-bg: var(--fallback-b2,oklch(var(--b2)/1)); + --alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1)); + background-color: var(--alert-bg); +} + +@media (min-width: 640px) { + .alert { + grid-auto-flow: column; + grid-template-columns: auto minmax(auto,1fr); + justify-items: start; + text-align: start; + } +} + .avatar.placeholder > div { display: flex; align-items: center; @@ -3078,10 +3108,6 @@ section[id] { margin-bottom: 0.25rem; } -.mb-1\.5 { - margin-bottom: 0.375rem; -} - .ml-auto { margin-left: auto; } @@ -3126,6 +3152,14 @@ section[id] { margin-top: 2.25rem; } +.mb-1\.5 { + margin-bottom: 0.375rem; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + .block { display: block; } @@ -3146,6 +3180,11 @@ section[id] { aspect-ratio: 16/9; } +.size-10 { + width: 2.5rem; + height: 2.5rem; +} + .size-4 { width: 1rem; height: 1rem; @@ -3163,10 +3202,6 @@ section[id] { height: 5rem; } -.h-24 { - height: 6rem; -} - .h-8 { height: 2rem; } @@ -3175,6 +3210,10 @@ section[id] { height: 100%; } +.h-24 { + height: 6rem; +} + .min-h-screen { min-height: 100vh; } @@ -3293,6 +3332,10 @@ section[id] { flex-wrap: wrap; } +.items-start { + align-items: flex-start; +} + .items-center { align-items: center; } @@ -3438,21 +3481,16 @@ section[id] { border-color: rgb(255 255 255 / 0.1); } -.border-white\/15 { - border-color: rgb(255 255 255 / 0.15); -} - .border-white\/50 { border-color: rgb(255 255 255 / 0.5); } -.bg-\[\#020d1d\]\/90 { - background-color: rgb(2 13 29 / 0.9); +.border-white\/15 { + border-color: rgb(255 255 255 / 0.15); } -.bg-\[\#06172a\] { - --tw-bg-opacity: 1; - background-color: rgb(6 23 42 / var(--tw-bg-opacity, 1)); +.bg-\[\#020d1d\]\/90 { + background-color: rgb(2 13 29 / 0.9); } .bg-base-200 { @@ -3465,6 +3503,10 @@ section[id] { background-color: rgb(3 21 41 / var(--tw-bg-opacity, 1)); } +.bg-primary\/15 { + background-color: var(--fallback-p,oklch(var(--p)/0.15)); +} + .bg-secondary { --tw-bg-opacity: 1; background-color: var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity, 1))); @@ -3483,6 +3525,11 @@ section[id] { background-color: rgb(255 255 255 / 0.95); } +.bg-\[\#06172a\] { + --tw-bg-opacity: 1; + background-color: rgb(6 23 42 / var(--tw-bg-opacity, 1)); +} + .bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); } @@ -3522,6 +3569,10 @@ section[id] { padding: 1.75rem; } +.p-8 { + padding: 2rem; +} + .px-0 { padding-left: 0px; padding-right: 0px; @@ -3581,6 +3632,11 @@ section[id] { padding-top: 2rem; } +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + .text-3xl { font-size: 1.875rem; line-height: 2.25rem; @@ -3648,10 +3704,6 @@ section[id] { text-transform: uppercase; } -.leading-5 { - line-height: 1.25rem; -} - .leading-6 { line-height: 1.5rem; } @@ -3676,8 +3728,8 @@ section[id] { line-height: 1.25; } -.tracking-\[0\.14em\] { - letter-spacing: 0.14em; +.leading-5 { + line-height: 1.25rem; } .tracking-\[0\.18em\] { @@ -3696,6 +3748,10 @@ section[id] { letter-spacing: -0.025em; } +.tracking-\[0\.14em\] { + letter-spacing: 0.14em; +} + .\!text-sky-300 { --tw-text-opacity: 1 !important; color: rgb(125 211 252 / var(--tw-text-opacity, 1)) !important; @@ -3726,6 +3782,11 @@ section[id] { color: var(--fallback-bc,oklch(var(--bc)/0.7)); } +.text-error { + --tw-text-opacity: 1; + color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1))); +} + .text-navy-950 { --tw-text-opacity: 1; color: rgb(3 21 41 / var(--tw-text-opacity, 1)); @@ -3765,10 +3826,6 @@ section[id] { color: rgb(255 255 255 / 0.45); } -.text-white\/55 { - color: rgb(255 255 255 / 0.55); -} - .text-white\/60 { color: rgb(255 255 255 / 0.6); } @@ -3785,6 +3842,10 @@ section[id] { color: rgb(255 255 255 / 0.75); } +.text-white\/55 { + color: rgb(255 255 255 / 0.55); +} + .opacity-0 { opacity: 0; } diff --git a/index.md b/index.md index 4b2364a..771f282 100644 --- a/index.md +++ b/index.md @@ -117,12 +117,16 @@ request: - Versioned bundles and documentation - A defined path for support questions form: - # GitHub Pages cannot process forms itself. This should point to - # Formspree, Basin, a company API, or another form service. - action: "https://formspree.io/f/your-form-id" + action: "https://your-form-service.com/your-form-id" method: post - submit_label: Request download + submitting_label: Sending request… + error_message: Something went wrong. Please try again. + + success: + eyebrow: Request received + headline: Thanks for your submission + text: We received your request and will contact you with additional information. fields: - type: text From 6be6f5b8fcac67db21fa6f0e88f69e7fe95126a0 Mon Sep 17 00:00:00 2001 From: Connor H Date: Sat, 19 Sep 2026 11:21:38 -0400 Subject: [PATCH 12/27] Added links to Google Drive Dataset --- index.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/index.md b/index.md index 771f282..8599b35 100644 --- a/index.md +++ b/index.md @@ -71,38 +71,38 @@ releases: headline: Current dataset splits text: All splits are vessel-disjoint and include per-sample AIS metadata. Samples are 5-second clips at 20 kHz; full-length recordings are available through the codebase. items: - - title: 5 Class - Balanced (Benchmark) + - title: 5 Class - Balanced image: "/assets/images/release-coastal-placeholder.svg" image_alt: Placeholder - description: Contains the main 5 classes (Tug/Tow, Tanker, Passengership, Cargo) and balances the total audio for each class such that they are equal. + description: Contains the main 5 classes (Tug/Tow, Tanker, Passengership, Cargo) and balances the total audio for each class such that they are equal. Current version = 1.0 size: "89 GB (Unzipped), 59 GB (Zipped)" views: 213h, 3175 vessels, 5 classes - date: Released March 2026 + date: Released September 2026 buttons: - - label: Download bundle - url: "#request" + - label: Download audio + url: "https://drive.google.com/drive/folders/1G0e-2Nhi6CWKuBRStlR8GTtcGyYiT2h6?usp=drive_link" target: _blank style: primary - - label: Annotation details - url: "#" + - label: Download spectrograms + url: "https://drive.google.com/drive/folders/1a6wLqfuBh3PMqSlZfy-IVjTfrJMtqo11?usp=sharing" target: _blank - style: outline + style: primary - title: 12 Class - 5 Hours Each image: "/assets/images/release-coastal-placeholder.svg" image_alt: Placeholder - description: Contains all ship classes and balances the total audio such that it is 5 hours each class. + description: Contains all ship classes and balances the total audio such that it is 5 hours each class. Current version = 1.0 size: "10 GB (Unzipped), 7 GB (Zipped)" views: 60h, 4218 vessels, 12 classes - date: Released March 2026 + date: Released September 2026 buttons: - - label: Download bundle - url: "#request" + - label: Download audio + url: "https://drive.google.com/drive/folders/1HxV8AGh8ckZS3JehAU_gY2fuCnscX-eV?usp=drive_link" target: _blank style: primary - - label: Annotation details - url: "#" + - label: Download spectrograms + url: "https://drive.google.com/drive/folders/1xOXX4dUmtSET7Utb4gfscZp1dlPoT76e?usp=drive_link" target: _blank - style: outline + style: primary # ================================================== # REQUEST FORM From e65f4aa9800b6e638ab737eaaae1a85b0866b3dd Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Sun, 20 Sep 2026 21:17:46 -0400 Subject: [PATCH 13/27] Add copy citation code to global scripts file --- assets/js/uniqueship-scripts.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 assets/js/uniqueship-scripts.js diff --git a/assets/js/uniqueship-scripts.js b/assets/js/uniqueship-scripts.js new file mode 100644 index 0000000..c48c2d4 --- /dev/null +++ b/assets/js/uniqueship-scripts.js @@ -0,0 +1,33 @@ +document.querySelectorAll("[data-copy-button]").forEach((button) => { + button.addEventListener("click", async () => { + const container = button.closest(".relative"); + const source = container.querySelector("[data-copy-source]"); + const icon = button.querySelector("[data-copy-icon]"); + const status = button.querySelector("[data-copy-status]"); + + try { + await navigator.clipboard.writeText(source.textContent); + + icon.classList.remove("ri-file-copy-line"); + icon.classList.add("ri-check-line", "animate-bounce"); + button.classList.add("text-success"); + + button.setAttribute("aria-label", "Citation copied"); + button.setAttribute("title", "Copied!"); + status.textContent = "Citation copied to clipboard"; + + window.setTimeout(() => { + icon.classList.remove("ri-check-line", "animate-bounce"); + icon.classList.add("ri-file-copy-line"); + button.classList.remove("text-success"); + + button.setAttribute("aria-label", "Copy citation"); + button.setAttribute("title", "Copy citation"); + status.textContent = ""; + }, 1600); + } catch (error) { + button.setAttribute("title", "Unable to copy"); + status.textContent = "Unable to copy citation"; + } + }); +}); \ No newline at end of file From a77e1352814cbad84b7c562d37954b64260c9d85 Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Sun, 20 Sep 2026 21:17:55 -0400 Subject: [PATCH 14/27] Create js for web form --- assets/js/web-form.js | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 assets/js/web-form.js diff --git a/assets/js/web-form.js b/assets/js/web-form.js new file mode 100644 index 0000000..478531b --- /dev/null +++ b/assets/js/web-form.js @@ -0,0 +1,97 @@ +(() => { + const forms = document.querySelectorAll( + "[data-request-form]" + ); + + forms.forEach((form) => { + const container = form.closest( + "[data-form-container]" + ); + + const successPanel = container?.querySelector( + "[data-form-success]" + ); + + const errorMessage = form.querySelector( + "[data-form-error]" + ); + + const submitButton = form.querySelector( + "[data-submit-button]" + ); + + const buttonLabel = submitButton?.querySelector( + "[data-button-label]" + ); + + const buttonSpinner = submitButton?.querySelector( + "[data-button-spinner]" + ); + + if ( + !container || + !successPanel || + !submitButton || + !buttonLabel + ) { + return; + } + + const setSubmitting = (isSubmitting) => { + submitButton.disabled = isSubmitting; + + submitButton.setAttribute( + "aria-busy", + String(isSubmitting) + ); + + buttonLabel.textContent = isSubmitting + ? submitButton.dataset.submittingLabel + : submitButton.dataset.defaultLabel; + + buttonSpinner?.classList.toggle( + "hidden", + !isSubmitting + ); + }; + + form.addEventListener("submit", async (event) => { + event.preventDefault(); + + if (!form.reportValidity()) { + return; + } + + errorMessage?.classList.add("hidden"); + setSubmitting(true); + + try { + const formData = new FormData(form); + const body = new URLSearchParams(formData); + + await fetch(form.action, { + method: "POST", + mode: "no-cors", + headers: { + "Content-Type": + "application/x-www-form-urlencoded" + }, + body: body.toString() + }); + + form.reset(); + form.classList.add("hidden"); + successPanel.classList.remove("hidden"); + successPanel.focus(); + } catch (error) { + console.error( + "Google Form submission failed:", + error + ); + + errorMessage?.classList.remove("hidden"); + setSubmitting(false); + } + }); + }); +})(); \ No newline at end of file From 6d03bd165668b647ad8d163a1204a15d8eb0f113 Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Sun, 20 Sep 2026 21:18:10 -0400 Subject: [PATCH 15/27] Attach scripts --- _layouts/default.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_layouts/default.html b/_layouts/default.html index 8eeea63..3116775 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -19,5 +19,8 @@
{{ content }}
{% include footer.html %} + + + From 23eacae48e63c38ef89e9eb6ff94ea0665e2f6bf Mon Sep 17 00:00:00 2001 From: Jared Tomeck Date: Sun, 20 Sep 2026 21:18:38 -0400 Subject: [PATCH 16/27] Update form to link up with google form --- _layouts/home.html | 166 ++++++++++++++------------------------------- index.md | 56 ++++++--------- 2 files changed, 74 insertions(+), 148 deletions(-) diff --git a/_layouts/home.html b/_layouts/home.html index a06b205..dc8b497 100644 --- a/_layouts/home.html +++ b/_layouts/home.html @@ -174,35 +174,13 @@

{{ page.request.headline | escape
- {% if form.access_key %} - - {% endif %} - - {% if form.subject %} - - {% endif %} - - - - {% for field in form.fields %} + {% assign field_id = "request-field-" | append: forloop.index %} + {% if field.width == "half" %} {% assign field_width = "" %} {% else %} @@ -211,23 +189,34 @@

{{ page.request.headline | escape {% if field.type == "checkbox" %} -