commit dbee8fba4d01545c8a6191ae3b0a86ae49cdba10 Author: Viktor Vsk Date: Mon Mar 30 13:18:39 2026 +0200 Initial commit diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..325bfc0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,51 @@ +# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files. + +# Ignore git directory. +/.git/ +/.gitignore + +# Ignore bundler config. +/.bundle + +# Ignore all environment files. +/.env* + +# Ignore all default key files. +/config/master.key +/config/credentials/*.key + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/.keep + +# Ignore storage (uploaded files in development and any SQLite databases). +/storage/* +!/storage/.keep +/tmp/storage/* +!/tmp/storage/.keep + +# Ignore assets. +/node_modules/ +/app/assets/builds/* +!/app/assets/builds/.keep +/public/assets + +# Ignore CI service files. +/.github + +# Ignore Kamal files. +/config/deploy*.yml +/.kamal + +# Ignore development files +/.devcontainer + +# Ignore Docker-related files +/.dockerignore +/Dockerfile* diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8dc4323 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# See https://git-scm.com/docs/gitattributes for more about git attribute files. + +# Mark the database schema as having been generated. +db/schema.rb linguist-generated + +# Mark any vendored files as having been vendored. +vendor/* linguist-vendored +config/credentials/*.yml.enc diff=rails_credentials +config/credentials.yml.enc diff=rails_credentials diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..83610cf --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 +updates: +- package-ecosystem: bundler + directory: "/" + schedule: + interval: weekly + open-pull-requests-limit: 10 +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + open-pull-requests-limit: 10 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..bb88fe0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,73 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint-and-test: + name: Lint & Test + runs-on: ubuntu-latest + + services: + postgres: + image: postgres:17.5 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: starter_test + ports: + - 5432:5432 + options: >- + --health-cmd="pg_isready -U postgres" + --health-interval=5s + --health-timeout=5s + --health-retries=5 + + redis: + image: redis:8.4-alpine + ports: + - 6379:6379 + options: >- + --health-cmd="redis-cli ping" + --health-interval=5s + --health-timeout=5s + --health-retries=5 + + env: + RAILS_ENV: test + DB_HOST: localhost + DB_PASS: password + DB_USER: postgres + DB_DIRECT_HOST: localhost + DB_DIRECT_PORT: "5432" + REDIS_URL: redis://localhost:6379/1 + RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }} + + steps: + - uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: "4.0.1" + bundler-cache: true + + - name: Install Chromium + run: | + sudo apt-get update -qq + sudo apt-get install -y --no-install-recommends chromium-browser chromium-chromedriver + + - name: Prepare database + run: | + bin/rails db:prepare + bin/rails parallel:prepare + + - name: Run check-fast + run: bin/check-fast diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..ebdd563 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,45 @@ +name: Deploy Status Page + +on: + push: + branches: [main] + workflow_run: + workflows: ["CI"] + types: [completed] + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + deploy: + name: Build & Deploy + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - uses: actions/checkout@v4 + + - name: Build status page + run: | + mkdir -p _site + cp docs/status.html _site/index.html + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: _site + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cba270 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# Temporary files generated by your text editor or operating system +# belong in git's global ignore instead: +# `$XDG_CONFIG_HOME/git/ignore` or `~/.config/git/ignore` + +# Ignore bundler config. +/.bundle + +# Ignore all environment files. +/.env* + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/ +!/tmp/pids/.keep + +# Ignore storage (uploaded files in development and any SQLite databases). +/storage/* +!/storage/.keep +/tmp/storage/* +!/tmp/storage/ +!/tmp/storage/.keep + +/public/assets +/app/assets/builds/* +!/app/assets/builds/.keep +# Ignore key files for decrypting credentials and more. +/config/*.key + diff --git a/.reek.yml b/.reek.yml new file mode 100644 index 0000000..dbc672c --- /dev/null +++ b/.reek.yml @@ -0,0 +1,53 @@ + +--- +detectors: + DuplicateMethodCall: + enabled: false + LongParameterList: + enabled: false + TooManyStatements: + enabled: false + MissingSafeMethod: + enabled: false + TooManyMethods: + max_methods: 25 + TooManyInstanceVariables: + enabled: false + ClassVariable: + enabled: false + TooManyConstants: + enabled: false + IrresponsibleModule: + enabled: false + UncommunicativeVariableName: + enabled: false + UncommunicativeMethodName: + enabled: false + UncommunicativeParameterName: + enabled: false + UtilityFunction: + enabled: true + exclude: + - ExampleRecurringJob + FeatureEnvy: + enabled: false + InstanceVariableAssumption: + enabled: true + exclude: + - TodosController + NilCheck: + enabled: true + BooleanParameter: + enabled: true + + +exclude_paths: + - db/migrate + - db/seeds + - vendor + - config + - bin + - spec + - test + - tmp + - lib/tasks diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..6a7de6e --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,55 @@ + +# Shopify Ruby styling +inherit_gem: + rubocop-shopify: rubocop.yml + +plugins: + + - rubocop-factory_bot + - rubocop-rails + - rubocop-rspec + - rubocop-rspec_rails + - rubocop-haml + +AllCops: + Exclude: + - 'app/javascript/**/*' + - 'node_modules/**/*' + - 'vendor/**/*' + - 'db/**/*' + - 'sorbet/**/*' + - 'agent-scripts/**/*' + +RSpec/MultipleExpectations: + Enabled: false +RSpec/ExampleLength: + Enabled: false +# Disable missing enable directive cop so our inline disables don't throw warnings +Lint/MissingCopEnableDirective: + Enabled: false +Naming/PredicatePrefix: + Enabled: false +RSpec/ContextWording: + Enabled: false +RSpec/InstanceVariable: + Enabled: false +RSpec/IndexedLet: + Enabled: false +RSpec/LetSetup: + Enabled: false +RSpec/NamedSubject: + Enabled: false +RSpec/DescribeMethod: + Enabled: false +Metrics/ParameterLists: + Enabled: false +RSpec/MultipleMemoizedHelpers: + Enabled: false +Rails/UnknownEnv: + Enabled: false + +# Overwrite or add rules to create your own house style +# +# # Use `[a, [b, c]]` not `[ a, [ b, c ] ]` +# Layout/SpaceInsideArrayLiteralBrackets: +# Enabled: false diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..90cdbdc --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-4.0.1 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..187b490 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,87 @@ +# syntax=docker/dockerfile:1 +# check=error=true + +# This Dockerfile is designed for production, not development. Use with Kamal or build'n'run by hand: +# docker build -t starter . +# docker run -d -p 80:80 -e RAILS_MASTER_KEY= --name starter starter + +# For a containerized dev environment, see Dev Containers: https://guides.rubyonrails.org/getting_started_with_devcontainer.html + +# Make sure RUBY_VERSION matches the Ruby version in .ruby-version +ARG RUBY_VERSION=4.0.1 +FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base + +# Rails app lives here +WORKDIR /rails + +# Install base packages +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y curl libjemalloc2 postgresql-client && \ + ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so && \ + rm -rf /var/lib/apt/lists /var/cache/apt/archives + +# Install AnyCable Go +RUN ARCH=$(uname -m) && \ + if [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then \ + ANYCABLE_ARCH="arm64"; \ + else \ + ANYCABLE_ARCH="amd64"; \ + fi && \ + curl -L "https://github.com/anycable/anycable-go/releases/download/v1.6.3/anycable-go-linux-${ANYCABLE_ARCH}" -o /usr/local/bin/anycable-go && \ + chmod +x /usr/local/bin/anycable-go + +# Set production environment variables and enable jemalloc for reduced memory usage and latency. +ENV RAILS_ENV="production" \ + BUNDLE_DEPLOYMENT="1" \ + BUNDLE_PATH="/usr/local/bundle" \ + BUNDLE_WITHOUT="development" \ + LD_PRELOAD="/usr/local/lib/libjemalloc.so" + +# Throw-away build stage to reduce size of final image +FROM base AS build + +# Install packages needed to build gems +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y build-essential git libpq-dev libyaml-dev pkg-config && \ + rm -rf /var/lib/apt/lists /var/cache/apt/archives + +# Install application gems +COPY vendor/* ./vendor/ +COPY Gemfile Gemfile.lock* ./ + +RUN bundle install && \ + rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ + # -j 1 disable parallel compilation to avoid a QEMU bug: https://github.com/rails/bootsnap/issues/495 + bundle exec bootsnap precompile -j 1 --gemfile + +# Copy application code +COPY . . + +# Precompile bootsnap code for faster boot times. +# -j 1 disable parallel compilation to avoid a QEMU bug: https://github.com/rails/bootsnap/issues/495 +RUN bundle exec bootsnap precompile -j 1 app/ lib/ + +# Precompiling assets for production without requiring secret RAILS_MASTER_KEY +RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile + + + + +# Final stage for app image +FROM base + +# Run and own only the runtime files as a non-root user for security +RUN groupadd --system --gid 1000 rails && \ + useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash +USER 1000:1000 + +# Copy built artifacts: gems, application +COPY --chown=rails:rails --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}" +COPY --chown=rails:rails --from=build /rails /rails + +# Entrypoint prepares the database. +ENTRYPOINT ["/rails/bin/docker-entrypoint"] + +# Start server via Thruster by default, this can be overwritten at runtime +EXPOSE 80 +CMD ["./bin/thrust", "./bin/rails", "server"] diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..31af551 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,46 @@ +ARG RUBY_VERSION=4.0.1 +FROM ruby:${RUBY_VERSION}-slim + +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y \ + build-essential \ + libpq-dev \ + libyaml-dev \ + postgresql-client \ + nodejs \ + git \ + curl \ + libjemalloc2 \ + chromium \ + chromium-driver \ + && rm -rf /var/lib/apt/lists /var/cache/apt/archives + +RUN ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so + +# Install AnyCable Go +RUN ARCH=$(uname -m) && \ + if [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then \ + ANYCABLE_ARCH="arm64"; \ + else \ + ANYCABLE_ARCH="amd64"; \ + fi && \ + curl -L "https://github.com/anycable/anycable-go/releases/download/v1.5.6/anycable-go-linux-${ANYCABLE_ARCH}" -o /usr/local/bin/anycable-go && \ + chmod +x /usr/local/bin/anycable-go + +ENV RAILS_ENV=development \ + BUNDLE_PATH=/usr/local/bundle \ + RAILS_LOG_TO_STDOUT=true \ + LD_PRELOAD="/usr/local/lib/libjemalloc.so" + +WORKDIR /rails + +COPY Gemfile Gemfile.lock* ./ +RUN bundle install && gem install foreman + +COPY . . + +RUN chmod +x bin/* + +ENTRYPOINT ["/rails/bin/docker-entrypoint"] +EXPOSE 3000 +CMD ["./bin/rails", "server", "-b", "0.0.0.0", "-p", "3000"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..ef60608 --- /dev/null +++ b/Gemfile @@ -0,0 +1,102 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" +gem "rails", github: "rails/rails", branch: "main" +# The modern asset pipeline for Rails [https://github.com/rails/propshaft] +gem "propshaft" +# Use postgresql as the database for Active Record +gem "pg" +# Use the Puma web server [https://github.com/puma/puma] +gem "puma", ">= 5.0" +# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] +gem "importmap-rails" +# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] +gem "turbo-rails" +# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] +gem "stimulus-rails" + +# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] +# gem "bcrypt", "~> 3.1.7" + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: [:windows, :jruby] + +# Use the database-backed adapters for Rails.cache, Active Job, and Action Cable +# gem "solid_cache" +# gem "solid_queue" +# gem "solid_cable" +# gem "mission_control-jobs" + +# Reduces boot times through caching; required in config/boot.rb +gem "bootsnap", require: false + +# Deploy this application anywhere as a Docker container [https://kamal-deploy.org] +gem "kamal", require: false + +# Add HTTP asset caching/compression and X-Sendfile acceleration to Puma [https://github.com/basecamp/thruster/] +gem "thruster", require: false + +# Use Tailwind CSS [https://github.com/rails/tailwindcss-rails] +gem "tailwindcss-rails" + +# Translations for Rails standard helpers +gem "rails-i18n" + +gem "sidekiq" +gem "sidekiq-cron" +gem "anycable-rails" +gem "redis" + +# Use S3 for Active Storage +gem "aws-sdk-s3" + +gem "haml-rails" +gem "cancancan" +gem "rack-attack" +gem "maintenance_tasks" +gem "ssrf_filter" + +group :development, :test do + gem "parallel_tests" + # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem + gem "debug", platforms: [:mri, :windows], require: "debug/prelude" + + # Audits gems for known security defects (use config/bundler-audit.yml to ignore issues) + gem "bundler-audit", require: false + + # Static analysis for security vulnerabilities [https://brakemanscanner.org/] + gem "brakeman", require: false + + # Shopify Ruby styling [https://github.com/Shopify/ruby-style-guide] + gem "rubocop-shopify", require: false + gem "rubocop-factory_bot", require: false + gem "rubocop-rails", require: false + gem "rubocop-rspec", require: false + gem "rubocop-rspec_rails", require: false + gem "rubocop-haml", require: false + gem "i18n-tasks", require: false + gem "haml_lint", require: false + + gem "flog", require: false + gem "flay", require: false + gem "reek", require: false + gem "skunk", require: false +end + +group :development do + gem "web-console" + gem "foreman" +end + +group :test do + gem "rspec-rails" + gem "shoulda-matchers" + gem "factory_bot_rails" + gem "faker" + gem "rspec-parameterized" + gem "rspec-retry" + gem "capybara" + gem "selenium-webdriver" +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..9605272 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,972 @@ +GIT + remote: https://github.com/rails/rails.git + revision: 706b9daab37664710de20cca273eb9ffa5361ec3 + branch: main + specs: + actioncable (8.2.0.alpha) + actionpack (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (8.2.0.alpha) + actionpack (= 8.2.0.alpha) + activejob (= 8.2.0.alpha) + activerecord (= 8.2.0.alpha) + activestorage (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + mail (>= 2.8.0) + actionmailer (8.2.0.alpha) + actionpack (= 8.2.0.alpha) + actionview (= 8.2.0.alpha) + activejob (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + mail (>= 2.8.0) + rails-dom-testing (~> 2.2) + actionpack (8.2.0.alpha) + actionview (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.7) + useragent (~> 0.16) + actiontext (8.2.0.alpha) + action_text-trix (~> 2.1.16) + actionpack (= 8.2.0.alpha) + activerecord (= 8.2.0.alpha) + activestorage (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (8.2.0.alpha) + activesupport (= 8.2.0.alpha) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.7) + activejob (8.2.0.alpha) + activesupport (= 8.2.0.alpha) + globalid (>= 0.3.6) + activemodel (8.2.0.alpha) + activesupport (= 8.2.0.alpha) + activerecord (8.2.0.alpha) + activemodel (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + timeout (>= 0.4.0) + activestorage (8.2.0.alpha) + actionpack (= 8.2.0.alpha) + activejob (= 8.2.0.alpha) + activerecord (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + marcel (~> 1.0) + activesupport (8.2.0.alpha) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) + minitest (>= 5.1) + psych (>= 4) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + rails (8.2.0.alpha) + actioncable (= 8.2.0.alpha) + actionmailbox (= 8.2.0.alpha) + actionmailer (= 8.2.0.alpha) + actionpack (= 8.2.0.alpha) + actiontext (= 8.2.0.alpha) + actionview (= 8.2.0.alpha) + activejob (= 8.2.0.alpha) + activemodel (= 8.2.0.alpha) + activerecord (= 8.2.0.alpha) + activestorage (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + bundler (>= 1.15.0) + railties (= 8.2.0.alpha) + railties (8.2.0.alpha) + actionpack (= 8.2.0.alpha) + activesupport (= 8.2.0.alpha) + irb (~> 1.13) + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) + zeitwerk (~> 2.6) + +GEM + remote: https://rubygems.org/ + specs: + action_text-trix (2.1.18) + railties + addressable (2.8.9) + public_suffix (>= 2.0.2, < 8.0) + anycable (1.6.3) + anycable-core (= 1.6.3) + grpc (~> 1.6) + anycable-core (1.6.3) + anyway_config (~> 2.2) + base64 (>= 0.2) + google-protobuf (~> 4) + stringio (~> 3) + anycable-rails (1.6.1) + anycable + anycable-rails-core (= 1.6.1) + anycable-rails-core (1.6.1) + actioncable (>= 7.0, < 9.0) + anycable-core (~> 1.6.0) + globalid + anyway_config (2.8.0) + ruby-next-core (~> 1.0) + ast (2.4.3) + aws-eventstream (1.4.0) + aws-partitions (1.1231.0) + aws-sdk-core (3.244.0) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal + jmespath (~> 1, >= 1.6.1) + logger + aws-sdk-kms (1.123.0) + aws-sdk-core (~> 3, >= 3.244.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.217.0) + aws-sdk-core (~> 3, >= 3.244.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) + aws-eventstream (~> 1, >= 1.0.2) + axiom-types (0.1.1) + descendants_tracker (~> 0.0.4) + ice_nine (~> 0.11.0) + thread_safe (~> 0.3, >= 0.3.1) + base64 (0.3.0) + bcrypt_pbkdf (1.1.2) + bigdecimal (4.1.0) + bindex (0.8.1) + binding_of_caller (2.0.0) + debug_inspector (>= 1.2.0) + bootsnap (1.23.0) + msgpack (~> 1.2) + brakeman (8.0.4) + racc + builder (3.3.0) + bundler-audit (0.9.3) + bundler (>= 1.2.0) + thor (~> 1.0) + cancancan (3.6.1) + capybara (3.40.0) + addressable + matrix + mini_mime (>= 0.1.3) + nokogiri (~> 1.11) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + childprocess (5.1.0) + logger (~> 1.5) + coercible (1.0.0) + descendants_tracker (~> 0.0.1) + concurrent-ruby (1.3.6) + connection_pool (3.0.2) + crass (1.0.6) + cronex (0.15.0) + tzinfo + unicode (>= 0.4.4.5) + csv (3.3.5) + date (3.5.1) + debug (1.11.1) + irb (~> 1.10) + reline (>= 0.3.8) + debug_inspector (1.2.0) + descendants_tracker (0.0.4) + thread_safe (~> 0.3, >= 0.3.1) + diff-lcs (1.6.2) + docile (1.4.1) + dotenv (3.2.0) + drb (2.2.3) + dry-configurable (1.3.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-core (1.2.0) + concurrent-ruby (~> 1.0) + logger + zeitwerk (~> 2.6) + dry-inflector (1.3.1) + dry-initializer (3.2.0) + dry-logic (1.6.0) + bigdecimal + concurrent-ruby (~> 1.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-schema (1.16.0) + concurrent-ruby (~> 1.0) + dry-configurable (~> 1.0, >= 1.0.1) + dry-core (~> 1.1) + dry-initializer (~> 3.2) + dry-logic (~> 1.6) + dry-types (~> 1.9, >= 1.9.1) + zeitwerk (~> 2.6) + dry-types (1.9.1) + bigdecimal (>= 3.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-logic (~> 1.4) + zeitwerk (~> 2.6) + ed25519 (1.4.0) + erb (6.0.2) + erubi (1.13.1) + et-orbi (1.4.0) + tzinfo + factory_bot (6.5.6) + activesupport (>= 6.1.0) + factory_bot_rails (6.5.1) + factory_bot (~> 6.5) + railties (>= 6.1.0) + faker (3.6.1) + i18n (>= 1.8.11, < 2) + flay (2.14.3) + erubi (~> 1.10) + path_expander (~> 2.0) + prism (~> 1.7) + sexp_processor (~> 4.0) + flog (4.9.4) + path_expander (~> 2.0) + prism (~> 1.7) + sexp_processor (~> 4.8) + foreman (0.90.0) + thor (~> 1.4) + fugit (1.12.1) + et-orbi (~> 1.4) + raabro (~> 1.4) + globalid (1.3.0) + activesupport (>= 6.1) + google-protobuf (4.34.1) + bigdecimal + rake (~> 13.3) + google-protobuf (4.34.1-aarch64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.34.1-aarch64-linux-musl) + bigdecimal + rake (~> 13.3) + google-protobuf (4.34.1-arm64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.34.1-x86_64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.34.1-x86_64-linux-musl) + bigdecimal + rake (~> 13.3) + googleapis-common-protos-types (1.22.0) + google-protobuf (~> 4.26) + grpc (1.78.1) + google-protobuf (>= 3.25, < 5.0) + googleapis-common-protos-types (~> 1.0) + grpc (1.78.1-aarch64-linux-gnu) + google-protobuf (>= 3.25, < 5.0) + googleapis-common-protos-types (~> 1.0) + grpc (1.78.1-aarch64-linux-musl) + google-protobuf (>= 3.25, < 5.0) + googleapis-common-protos-types (~> 1.0) + grpc (1.78.1-arm64-darwin) + google-protobuf (>= 3.25, < 5.0) + googleapis-common-protos-types (~> 1.0) + grpc (1.78.1-x86_64-linux-gnu) + google-protobuf (>= 3.25, < 5.0) + googleapis-common-protos-types (~> 1.0) + grpc (1.78.1-x86_64-linux-musl) + google-protobuf (>= 3.25, < 5.0) + googleapis-common-protos-types (~> 1.0) + haml (7.2.0) + temple (>= 0.8.2) + thor + tilt + haml-rails (3.0.0) + actionpack (>= 5.1) + activesupport (>= 5.1) + haml (>= 4.0.6) + railties (>= 5.1) + haml_lint (0.72.0) + haml (>= 5.0) + parallel (~> 1.10) + rainbow + rubocop (>= 1.0) + sysexits (~> 1.1) + hamli (0.5.1) + temple + highline (3.1.2) + reline + i18n (1.14.8) + concurrent-ruby (~> 1.0) + i18n-tasks (1.1.2) + activesupport (>= 4.0.2) + ast (>= 2.1.0) + erubi + highline (>= 3.0.0) + i18n + parser (>= 3.2.2.1) + prism + rails-i18n + rainbow (>= 2.2.2, < 4.0) + ruby-progressbar (~> 1.8, >= 1.8.1) + terminal-table (>= 1.5.1) + ice_nine (0.11.2) + importmap-rails (2.2.3) + actionpack (>= 6.0.0) + activesupport (>= 6.0.0) + railties (>= 6.0.0) + io-console (0.8.2) + irb (1.17.0) + pp (>= 0.6.0) + prism (>= 1.3.0) + rdoc (>= 4.0.0) + reline (>= 0.4.2) + jmespath (1.6.2) + job-iteration (1.13.0) + activejob (>= 7.0) + json (2.19.3) + kamal (2.11.0) + activesupport (>= 7.0) + base64 (~> 0.2) + bcrypt_pbkdf (~> 1.0) + concurrent-ruby (~> 1.2) + dotenv (~> 3.1) + ed25519 (~> 1.4) + net-ssh (~> 7.3) + sshkit (>= 1.23.0, < 2.0) + thor (~> 1.3) + zeitwerk (>= 2.6.18, < 3.0) + language_server-protocol (3.17.0.5) + launchy (3.1.1) + addressable (~> 2.8) + childprocess (~> 5.0) + logger (~> 1.6) + lint_roller (1.1.0) + logger (1.7.0) + loofah (2.25.1) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.9.0) + logger + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + maintenance_tasks (2.14.0) + actionpack (>= 7.1) + activejob (>= 7.1) + activerecord (>= 7.1) + csv + job-iteration (>= 1.3.6) + railties (>= 7.1) + zeitwerk (>= 2.6.2) + marcel (1.1.0) + matrix (0.4.3) + mini_mime (1.1.5) + minitest (6.0.2) + drb (~> 2.0) + prism (~> 1.5) + msgpack (1.8.0) + net-imap (0.6.3) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-scp (4.1.0) + net-ssh (>= 2.6.5, < 8.0.0) + net-sftp (4.0.0) + net-ssh (>= 5.0.0, < 8.0.0) + net-smtp (0.5.1) + net-protocol + net-ssh (7.3.2) + nio4r (2.7.5) + nokogiri (1.19.2-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.2-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.19.2-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.2-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.19.2-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.2-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.2-x86_64-linux-musl) + racc (~> 1.4) + ostruct (0.6.3) + parallel (1.27.0) + parallel_tests (5.6.0) + parallel + parser (3.3.11.1) + ast (~> 2.4.1) + racc + path_expander (2.0.1) + pg (1.6.3) + pg (1.6.3-aarch64-linux) + pg (1.6.3-aarch64-linux-musl) + pg (1.6.3-arm64-darwin) + pg (1.6.3-x86_64-linux) + pg (1.6.3-x86_64-linux-musl) + pp (0.6.3) + prettyprint + prettyprint (0.2.0) + prism (1.9.0) + proc_to_ast (0.2.0) + parser + rouge + unparser + propshaft (1.3.1) + actionpack (>= 7.0.0) + activesupport (>= 7.0.0) + rack + psych (5.3.1) + date + stringio + public_suffix (7.0.5) + puma (7.2.0) + nio4r (~> 2.0) + raabro (1.4.0) + racc (1.8.1) + rack (3.2.5) + rack-attack (6.8.0) + rack (>= 1.0, < 4) + rack-session (2.1.1) + base64 (>= 0.1.0) + rack (>= 3.0.0) + rack-test (2.2.0) + rack (>= 1.3) + rackup (2.3.1) + rack (>= 3) + rails-dom-testing (2.3.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.7.0) + loofah (~> 2.25) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) + rails-i18n (8.1.0) + i18n (>= 0.7, < 2) + railties (>= 8.0.0, < 9) + rainbow (3.1.1) + rake (13.3.1) + rdoc (7.2.0) + erb + psych (>= 4.0.0) + tsort + redis (5.4.1) + redis-client (>= 0.22.0) + redis-client (0.28.0) + connection_pool + reek (6.5.0) + dry-schema (~> 1.13) + logger (~> 1.6) + parser (~> 3.3.0) + rainbow (>= 2.0, < 4.0) + rexml (~> 3.1) + regexp_parser (2.11.3) + reline (0.6.3) + io-console (~> 0.5) + rexml (3.4.4) + rouge (4.7.0) + rspec (3.13.2) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-core (3.13.6) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.5) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.8) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-parameterized (2.0.1) + rspec-parameterized-core (>= 2, < 3) + rspec-parameterized-table_syntax (>= 2, < 3) + rspec-parameterized-core (2.0.1) + parser + prism + proc_to_ast (>= 0.2.0) + rspec (>= 2.13, < 4) + unparser + rspec-parameterized-table_syntax (2.1.1) + binding_of_caller (>= 2) + rspec-parameterized-core (>= 2, < 3) + rspec-rails (8.0.4) + actionpack (>= 7.2) + activesupport (>= 7.2) + railties (>= 7.2) + rspec-core (>= 3.13.0, < 5.0.0) + rspec-expectations (>= 3.13.0, < 5.0.0) + rspec-mocks (>= 3.13.0, < 5.0.0) + rspec-support (>= 3.13.0, < 5.0.0) + rspec-retry (0.6.2) + rspec-core (> 3.3) + rspec-support (3.13.7) + rubocop (1.86.0) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.49.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.49.1) + parser (>= 3.3.7.2) + prism (~> 1.7) + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-haml (0.3.1) + hamli (~> 0.5) + lint_roller (>= 1.1) + rubocop (>= 1.72.1) + rubocop-rails (2.34.3) + activesupport (>= 4.2.0) + lint_roller (~> 1.1) + rack (>= 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) + rubocop-rspec (3.9.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) + rubocop-shopify (2.18.0) + rubocop (~> 1.62) + ruby-next-core (1.2.0) + ruby-progressbar (1.13.0) + ruby_parser (3.22.0) + racc (~> 1.5) + sexp_processor (~> 4.16) + rubycritic (4.12.0) + flay (~> 2.13) + flog (~> 4.7) + launchy (>= 2.5.2) + parser (>= 3.3.0.5) + prism (>= 1.6.0) + rainbow (~> 3.1.1) + reek (~> 6.5.0, < 7.0) + rexml + ruby_parser (~> 3.21) + simplecov (>= 0.22.0) + tty-which (~> 0.5.0) + virtus (~> 2.0) + rubyzip (3.2.2) + securerandom (0.4.1) + selenium-webdriver (4.41.0) + base64 (~> 0.2) + logger (~> 1.4) + rexml (~> 3.2, >= 3.2.5) + rubyzip (>= 1.2.2, < 4.0) + websocket (~> 1.0) + sexp_processor (4.17.5) + shoulda-matchers (7.0.1) + activesupport (>= 7.1) + sidekiq (8.1.2) + connection_pool (>= 3.0.0) + json (>= 2.16.0) + logger (>= 1.7.0) + rack (>= 3.2.0) + redis-client (>= 0.26.0) + sidekiq-cron (2.3.1) + cronex (>= 0.13.0) + fugit (~> 1.8, >= 1.11.1) + globalid (>= 1.0.1) + sidekiq (>= 6.5.0) + simplecov (0.22.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.13.2) + simplecov_json_formatter (0.1.4) + skunk (0.5.4) + rubycritic (>= 4.5.2, < 5.0) + terminal-table (~> 3.0) + sshkit (1.25.0) + base64 + logger + net-scp (>= 1.1.2) + net-sftp (>= 2.1.2) + net-ssh (>= 2.8.0) + ostruct + ssrf_filter (1.3.0) + stimulus-rails (1.3.4) + railties (>= 6.0.0) + stringio (3.2.0) + sysexits (1.2.0) + tailwindcss-rails (4.4.0) + railties (>= 7.0.0) + tailwindcss-ruby (~> 4.0) + tailwindcss-ruby (4.2.1) + tailwindcss-ruby (4.2.1-aarch64-linux-gnu) + tailwindcss-ruby (4.2.1-aarch64-linux-musl) + tailwindcss-ruby (4.2.1-arm64-darwin) + tailwindcss-ruby (4.2.1-x86_64-linux-gnu) + tailwindcss-ruby (4.2.1-x86_64-linux-musl) + temple (0.10.4) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + thor (1.5.0) + thread_safe (0.3.6) + thruster (0.1.20) + thruster (0.1.20-aarch64-linux) + thruster (0.1.20-arm64-darwin) + thruster (0.1.20-x86_64-linux) + tilt (2.7.0) + timeout (0.6.1) + tsort (0.2.0) + tty-which (0.5.0) + turbo-rails (2.0.23) + actionpack (>= 7.1.0) + railties (>= 7.1.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode (0.4.4.5) + unicode-display_width (2.6.0) + unparser (0.9.0) + diff-lcs (>= 1.6, < 3) + parser (>= 3.3.0) + prism (>= 1.5.1) + uri (1.1.1) + useragent (0.16.11) + virtus (2.0.0) + axiom-types (~> 0.1) + coercible (~> 1.0) + descendants_tracker (~> 0.0, >= 0.0.3) + web-console (4.3.0) + actionview (>= 8.0.0) + bindex (>= 0.4.0) + railties (>= 8.0.0) + websocket (1.2.11) + websocket-driver (0.8.0) + base64 + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.7.5) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-musl + arm64-darwin-24 + x86_64-linux + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + anycable-rails + aws-sdk-s3 + bootsnap + brakeman + bundler-audit + cancancan + capybara + debug + factory_bot_rails + faker + flay + flog + foreman + haml-rails + haml_lint + i18n-tasks + importmap-rails + kamal + maintenance_tasks + parallel_tests + pg + propshaft + puma (>= 5.0) + rack-attack + rails! + rails-i18n + redis + reek + rspec-parameterized + rspec-rails + rspec-retry + rubocop-factory_bot + rubocop-haml + rubocop-rails + rubocop-rspec + rubocop-rspec_rails + rubocop-shopify + selenium-webdriver + shoulda-matchers + sidekiq + sidekiq-cron + skunk + ssrf_filter + stimulus-rails + tailwindcss-rails + thruster + turbo-rails + tzinfo-data + web-console + +CHECKSUMS + action_text-trix (2.1.18) sha256=3fdb83f8bff4145d098be283cdd47ac41caf5110bfa6df4695ed7127d7fb3642 + actioncable (8.2.0.alpha) + actionmailbox (8.2.0.alpha) + actionmailer (8.2.0.alpha) + actionpack (8.2.0.alpha) + actiontext (8.2.0.alpha) + actionview (8.2.0.alpha) + activejob (8.2.0.alpha) + activemodel (8.2.0.alpha) + activerecord (8.2.0.alpha) + activestorage (8.2.0.alpha) + activesupport (8.2.0.alpha) + addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485 + anycable (1.6.3) sha256=30092c7687c5670c240d1809f417565829e8b6fabd19975219ef28713da0217f + anycable-core (1.6.3) sha256=12f0398509b69e51ee6488bf3724ee2c97f01dfc279001feef21242fc51feca3 + anycable-rails (1.6.1) sha256=b924a83cb30c13f71688e73c75aa7c9a0d1fe364306fee04d4932e26e77396d8 + anycable-rails-core (1.6.1) sha256=97fd349dad1bb1f5fa45ab630cb31ba521af0b12e8c64b46a451043f7170ae7d + anyway_config (2.8.0) sha256=f6797a7231f81202dcd3d0c07284e836e45713e761d320180348b13a5c7c9306 + ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 + aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b + aws-partitions (1.1231.0) sha256=5142ba78d5226deb5dff6c8d17dfc52b0bcec3451d47fcb70fbe8b744b85d004 + aws-sdk-core (3.244.0) sha256=3e458c078b0c5bdee95bc370c3a483374b3224cf730c1f9f0faf849a5d9a18ea + aws-sdk-kms (1.123.0) sha256=d405f37e82f8fa32045ca8980be266c0b45b37aaf2012afe0254321a1e811f20 + aws-sdk-s3 (1.217.0) sha256=6ea709272c666888b14e9c62345abd9a6a967759ae13667c28f01fde6823c24b + aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00 + axiom-types (0.1.1) sha256=c1ff113f3de516fa195b2db7e0a9a95fd1b08475a502ff660d04507a09980383 + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + bcrypt_pbkdf (1.1.2) sha256=c2414c23ce66869b3eb9f643d6a3374d8322dfb5078125c82792304c10b94cf6 + bigdecimal (4.1.0) sha256=6dc07767aa3dc456ccd48e7ae70a07b474e9afd7c5bc576f80bd6da5c8dd6cae + bindex (0.8.1) sha256=7b1ecc9dc539ed8bccfc8cb4d2732046227b09d6f37582ff12e50a5047ceb17e + binding_of_caller (2.0.0) sha256=e53eebf8428a85587aede7b43a83e7419eb85b8b690938a96aa330d03052d517 + bootsnap (1.23.0) sha256=c1254f458d58558b58be0f8eb8f6eec2821456785b7cdd1e16248e2020d3f214 + brakeman (8.0.4) sha256=7bf921fa9638544835df9aa7b3e720a9a72c0267f34f92135955edd80d4dcf6f + builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f + bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cancancan (3.6.1) sha256=975c1d5cbf58d5df48a9452a7f61ae3d254608cd87570402f5925a8864c56b62 + capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef + childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec + coercible (1.0.0) sha256=5081ad24352cc8435ce5472bc2faa30260c7ea7f2102cc6a9f167c4d9bffaadc + concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab + connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a + crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d + cronex (0.15.0) sha256=21c794e085fad2951c4f2e279f440340a35ba2297e0b738f22f263f69fbe2186 + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 + debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 + debug_inspector (1.2.0) sha256=9bdfa02eebc3da163833e6a89b154084232f5766087e59573b70521c77ea68a2 + descendants_tracker (0.0.4) sha256=e9c41dd4cfbb85829a9301ea7e7c48c2a03b26f09319db230e6479ccdc780897 + diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 + docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e + dotenv (3.2.0) sha256=e375b83121ea7ca4ce20f214740076129ab8514cd81378161f11c03853fe619d + drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 + dry-configurable (1.3.0) sha256=882d862858567fc1210d2549d4c090f34370fc1bb7c5c1933de3fe792e18afa8 + dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 + dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc + dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3 + dry-logic (1.6.0) sha256=da6fedbc0f90fc41f9b0cc7e6f05f5d529d1efaef6c8dcc8e0733f685745cea2 + dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 + dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 + ed25519 (1.4.0) sha256=16e97f5198689a154247169f3453ef4cfd3f7a47481fde0ae33206cdfdcac506 + erb (6.0.2) sha256=9fe6264d44f79422c87490a1558479bd0e7dad4dd0e317656e67ea3077b5242b + erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9 + et-orbi (1.4.0) sha256=6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc + factory_bot (6.5.6) sha256=12beb373214dccc086a7a63763d6718c49769d5606f0501e0a4442676917e077 + factory_bot_rails (6.5.1) sha256=d3cc4851eae4dea8a665ec4a4516895045e710554d2b5ac9e68b94d351bc6d68 + faker (3.6.1) sha256=c513d23c1d26b426283e913b25e0b714576011d7c1ad368a9ac6ea2113a1ccde + flay (2.14.3) sha256=7f96a495f4bde880460e77e7345464e752bd44f09f5cd30c80af02afe0ed3f29 + flog (4.9.4) sha256=12cc054fab7a2cbd2a906514397c4d7788954d530564782d6f14939dc2dfbcbb + foreman (0.90.0) sha256=ff675e2d47b607ac58714a6d4ac3e1ee8f06f41d8db084531c31961e2c3f117c + fugit (1.12.1) sha256=5898f478ede9b415f0804e42b8f3fd53f814bd85eebffceebdbc34e1107aaf68 + globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 + google-protobuf (4.34.1) sha256=347181542b8d659c60f028fa3791c9cccce651a91ad27782dbc5c5e374796cdc + google-protobuf (4.34.1-aarch64-linux-gnu) sha256=f9c07607dc139c895f2792a7740fcd01cd94d4d7b0e0a939045b50d7999f0b1d + google-protobuf (4.34.1-aarch64-linux-musl) sha256=db58e5a4a492b43c6614486aea31b7fb86955b175d1d48f28ebf388f058d78a9 + google-protobuf (4.34.1-arm64-darwin) sha256=2745061f973119e6e7f3c81a0c77025d291a3caa6585a2cd24a25bbc7bedb267 + google-protobuf (4.34.1-x86_64-linux-gnu) sha256=87088c9fd8e47b5b40ca498fc1195add6149e941ff7e81c532a5b0b8876d4cc9 + google-protobuf (4.34.1-x86_64-linux-musl) sha256=8c0e91436fbe504ffc64f0bd621f2e69adbcce8ed2c58439d7a21117069cfdd7 + googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7 + grpc (1.78.1) sha256=c9e8a54cf901263c25c1e17af116f9145fbfdf4b69931234581b0be2059f6758 + grpc (1.78.1-aarch64-linux-gnu) sha256=11597d75fd0efc855a5d8898867d00179ad215ddca2ec53ddb4d1b3a9bf313a4 + grpc (1.78.1-aarch64-linux-musl) sha256=ba7d5b82cf935ffd2476196b53f5abce152f1e640fb2011d937a2a6965686e3b + grpc (1.78.1-arm64-darwin) sha256=7378b58db8dc65b19dce8006a47c0da30f1faf5d07160d2e1816c31126d3a388 + grpc (1.78.1-x86_64-linux-gnu) sha256=c0715fe9bc80cf21fbaca2713abf8db6f628f6f31ec1d8762b667151e6ab0c9f + grpc (1.78.1-x86_64-linux-musl) sha256=4e90a3d0f2baa1cd70756ffe116bd81bb7b398ff774272828a23a89ac9a30b06 + haml (7.2.0) sha256=87fd2b71f7feab1724337b090a7d767f5ab2d42f08c974f3ead673f18cfcd55a + haml-rails (3.0.0) sha256=091fe496a85ca521d9cac87fb50f1ecf77a57974a99aa7e267130add81a5585f + haml_lint (0.72.0) sha256=23acb3f5db1602eb99bccec8009372465321702e1229017cca53272957bfc9c8 + hamli (0.5.1) sha256=575321dde83636a7ff5a4f0f7d9d48d59384b6388a2e2b1cfb1d8c3769a616cb + highline (3.1.2) sha256=67cbd34d19f6ef11a7ee1d82ffab5d36dfd5b3be861f450fc1716c7125f4bb4a + i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 + i18n-tasks (1.1.2) sha256=4dcfba49e52a623f30661cb316cb80d84fbba5cb8c6d88ef5e02545fffa3637a + ice_nine (0.11.2) sha256=5d506a7d2723d5592dc121b9928e4931742730131f22a1a37649df1c1e2e63db + importmap-rails (2.2.3) sha256=7101be2a4dc97cf1558fb8f573a718404c5f6bcfe94f304bf1f39e444feeb16a + io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc + irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae + jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1 + job-iteration (1.13.0) sha256=3300844e81309fbd06fd2310d6aa8e1f43bf30fe03a3fc5067580b62f456b7e1 + json (2.19.3) sha256=289b0bb53052a1fa8c34ab33cc750b659ba14a5c45f3fcf4b18762dc67c78646 + kamal (2.11.0) sha256=1408864425e0dec7e0a14d712a3b13f614e9f3a425b7661d3f9d287a51d7dd75 + language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc + launchy (3.1.1) sha256=72b847b5cc961589dde2c395af0108c86ff0119f42d4648d25b5440ebb10059e + lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04 + mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941 + maintenance_tasks (2.14.0) sha256=7331852afdc6d38dd604166cd47ccbb4bd418df1f5aaf707810634ed1255769b + marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee + matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b + mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef + minitest (6.0.2) sha256=db6e57956f6ecc6134683b4c87467d6dd792323c7f0eea7b93f66bd284adbc3d + msgpack (1.8.0) sha256=e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732 + net-imap (0.6.3) sha256=9bab75f876596d09ee7bf911a291da478e0cd6badc54dfb82874855ccc82f2ad + net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3 + net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 + net-scp (4.1.0) sha256=a99b0b92a1e5d360b0de4ffbf2dc0c91531502d3d4f56c28b0139a7c093d1a5d + net-sftp (4.0.0) sha256=65bb91c859c2f93b09826757af11b69af931a3a9155050f50d1b06d384526364 + net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736 + net-ssh (7.3.2) sha256=65029e213c380e20e5fd92ece663934ab0a0fe888e0cd7cc6a5b664074362dd4 + nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1 + nokogiri (1.19.2-aarch64-linux-gnu) sha256=c34d5c8208025587554608e98fd88ab125b29c80f9352b821964e9a5d5cfbd19 + nokogiri (1.19.2-aarch64-linux-musl) sha256=7f6b4b0202d507326841a4f790294bf75098aef50c7173443812e3ac5cb06515 + nokogiri (1.19.2-arm-linux-gnu) sha256=b7fa1139016f3dc850bda1260988f0d749934a939d04ef2da13bec060d7d5081 + nokogiri (1.19.2-arm-linux-musl) sha256=61114d44f6742ff72194a1b3020967201e2eb982814778d130f6471c11f9828c + nokogiri (1.19.2-arm64-darwin) sha256=58d8ea2e31a967b843b70487a44c14c8ba1866daa1b9da9be9dbdf1b43dee205 + nokogiri (1.19.2-x86_64-linux-gnu) sha256=fa8feca882b73e871a9845f3817a72e9734c8e974bdc4fbad6e4bc6e8076b94f + nokogiri (1.19.2-x86_64-linux-musl) sha256=93128448e61a9383a30baef041bf1f5817e22f297a1d400521e90294445069a8 + ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 + parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130 + parallel_tests (5.6.0) sha256=b2d7af382d1c0289daba65308d9143b3ad82d817d500c0ad1b4bde468beb13af + parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54 + path_expander (2.0.1) sha256=2de201164bff4719cc4d0b3767286e9977cc832a59c4d70abab571ec86cb41e4 + pg (1.6.3) sha256=1388d0563e13d2758c1089e35e973a3249e955c659592d10e5b77c468f628a99 + pg (1.6.3-aarch64-linux) sha256=0698ad563e02383c27510b76bf7d4cd2de19cd1d16a5013f375dd473e4be72ea + pg (1.6.3-aarch64-linux-musl) sha256=06a75f4ea04b05140146f2a10550b8e0d9f006a79cdaf8b5b130cde40e3ecc2c + pg (1.6.3-arm64-darwin) sha256=7240330b572e6355d7c75a7de535edb5dfcbd6295d9c7777df4d9dddfb8c0e5f + pg (1.6.3-x86_64-linux) sha256=5d9e188c8f7a0295d162b7b88a768d8452a899977d44f3274d1946d67920ae8d + pg (1.6.3-x86_64-linux-musl) sha256=9c9c90d98c72f78eb04c0f55e9618fe55d1512128e411035fe229ff427864009 + pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6 + prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 + prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 + proc_to_ast (0.2.0) sha256=4bb446419c3878c21d8792f8a129616690168f636b9e460b5a0ed26dd6680bbe + propshaft (1.3.1) sha256=9acc664ef67e819ffa3d95bd7ad4c3623ea799110c5f4dee67fa7e583e74c392 + psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + puma (7.2.0) sha256=bf8ef4ab514a4e6d4554cb4326b2004eba5036ae05cf765cfe51aba9706a72a8 + raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882 + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rack (3.2.5) sha256=4cbd0974c0b79f7a139b4812004a62e4c60b145cba76422e288ee670601ed6d3 + rack-attack (6.8.0) sha256=f2499fdebf85bcc05573a22dff57d24305ac14ec2e4156cd3c28d47cafeeecf2 + rack-session (2.1.1) sha256=0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9 + rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463 + rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868 + rails (8.2.0.alpha) + rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d + rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89 + rails-i18n (8.1.0) sha256=52d5fd6c0abef28d84223cc05647f6ae0fd552637a1ede92deee9545755b6cf3 + railties (8.2.0.alpha) + rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a + rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c + rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192 + redis (5.4.1) sha256=b5e675b57ad22b15c9bcc765d5ac26f60b675408af916d31527af9bd5a81faae + redis-client (0.28.0) sha256=888892f9cd8787a41c0ece00bdf5f556dfff7770326ce40bb2bc11f1bfec824b + reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 + regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4 + reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 + rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587 + rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d + rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836 + rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47 + rspec-parameterized (2.0.1) sha256=5507c3bde0e0f1d6c7183e4936ddf1646a898c00db20c12d03984a8ea25a567c + rspec-parameterized-core (2.0.1) sha256=4f93067b89b8043357e0589d9302a9c856f100e498faf7e49df9094aa3e5211a + rspec-parameterized-table_syntax (2.1.1) sha256=59cc68506162adef218b59952bf62142fd25079d01061f4ff115dcddd91a49df + rspec-rails (8.0.4) sha256=06235692fc0892683d3d34977e081db867434b3a24ae0dd0c6f3516bad4e22df + rspec-retry (0.6.2) sha256=6101ba23a38809811ae3484acde4ab481c54d846ac66d5037ccb40131a60d858 + rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c + rubocop (1.86.0) sha256=4ff1186fe16ebe9baff5e7aad66bb0ad4cabf5cdcd419f773146dbba2565d186 + rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb + rubocop-haml (0.3.1) sha256=f9125a3996079e3c93ed002cd420fd7e8744a01d8e007eafa0bf0350f6b24c96 + rubocop-rails (2.34.3) sha256=10d37989024865ecda8199f311f3faca990143fbac967de943f88aca11eb9ad2 + rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 + rubocop-shopify (2.18.0) sha256=dafa25e5617ce4600ff86b1de3d5b78e43ab3d58cc5729df38e492b8e10294eb + ruby-next-core (1.2.0) sha256=f6a7d00bb5186cecbb02f7f1845a0f3a2c9788d35b6ccff5c9be3f0d46799b86 + ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 + ruby_parser (3.22.0) sha256=1eb4937cd9eb220aa2d194e352a24dba90aef00751e24c8dfffdb14000f15d23 + rubycritic (4.12.0) sha256=024fed90fe656fa939f6ea80aab17569699ac3863d0b52fd72cb99892247abc8 + rubyzip (3.2.2) sha256=c0ed99385f0625415c8f05bcae33fe649ed2952894a95ff8b08f26ca57ea5b3c + securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 + selenium-webdriver (4.41.0) sha256=cdc1173cd55cf186022cea83156cc2d0bec06d337e039b02ad25d94e41bedd22 + sexp_processor (4.17.5) sha256=ae2b48ba98353d5d465ce8759836b7a05f2e12c5879fcd14d7815b026de32f0e + shoulda-matchers (7.0.1) sha256=b4bfd8744c10e0a36c8ac1a687f921ee7e25ed529e50488d61b79a8688749c77 + sidekiq (8.1.2) sha256=4a1266f22bb1dad675d77bf32e8d4c04e990640e3b271650f47ea7299c38fceb + sidekiq-cron (2.3.1) sha256=96ab3da372289a30dc744c1daa2ae2e85960b2444a6f6ed68df1ff7882c44aac + simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 + simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 + simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 + skunk (0.5.4) sha256=627331dc78aec1fdf614feabcf05a88ca84025e364be27aeddca5d7531d1b682 + sshkit (1.25.0) sha256=c8c6543cdb60f91f1d277306d585dd11b6a064cb44eab0972827e4311ff96744 + ssrf_filter (1.3.0) sha256=66882d7de7d09c019098d6d7372412950ae184ebbc7c51478002058307aba6f2 + stimulus-rails (1.3.4) sha256=765676ffa1f33af64ce026d26b48e8ffb2e0b94e0f50e9119e11d6107d67cb06 + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 + sysexits (1.2.0) sha256=598241c4ae57baa403c125182dfdcc0d1ac4c0fb606dd47fbed57e4aaf795662 + tailwindcss-rails (4.4.0) sha256=efa2961351a52acebe616e645a81a30bb4f27fde46cc06ce7688d1cd1131e916 + tailwindcss-ruby (4.2.1) sha256=95886a1e24b42d76792c787d34e47098b53cb3b5a6363845bca4486f52b2e66a + tailwindcss-ruby (4.2.1-aarch64-linux-gnu) sha256=de457ddfc999c6bbbe1a59fbc11eb2168d619f6e0cb72d8d3334d372b331e36f + tailwindcss-ruby (4.2.1-aarch64-linux-musl) sha256=e6ed27704263201f8366316354aa45f9016cc9378ce8fac46fbbe65fafd4da5e + tailwindcss-ruby (4.2.1-arm64-darwin) sha256=bcf222fb8542cf5433925623e5e7b257897fbb8291a2350daae870a32f2eeb91 + tailwindcss-ruby (4.2.1-x86_64-linux-gnu) sha256=201d0e5e5d4aba52cae4ee4bd1acd497d2790c83e7f15da964aab8ec93876831 + tailwindcss-ruby (4.2.1-x86_64-linux-musl) sha256=79fa48ad51e533545f9fdbb04227e1342a65a42c2bd1314118b95473d5612007 + temple (0.10.4) sha256=b7a1e94b6f09038ab0b6e4fe0126996055da2c38bec53a8a336f075748fff72c + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 + thread_safe (0.3.6) sha256=9ed7072821b51c57e8d6b7011a8e282e25aeea3a4065eab326e43f66f063b05a + thruster (0.1.20) sha256=c05f2fbcae527bbe093a6e6d84fb12d9d680617e7c162325d9b97e8e9d4b5201 + thruster (0.1.20-aarch64-linux) sha256=754f1701061235235165dde31e7a3bc87ec88066a02981ff4241fcda0d76d397 + thruster (0.1.20-arm64-darwin) sha256=630cf8c273f562063b92ea5ccd7a721d7ba6130cc422c823727f4744f6d0770e + thruster (0.1.20-x86_64-linux) sha256=d579f252bf67aee6ba6d957e48f566b72e019d7657ba2f267a5db1e4d91d2479 + tilt (2.7.0) sha256=0d5b9ba69f6a36490c64b0eee9f6e9aad517e20dcc848800a06eb116f08c6ab3 + timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb + tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f + tty-which (0.5.0) sha256=5824055f0d6744c97e7c4426544f01d519c40d1806ef2ef47d9854477993f466 + turbo-rails (2.0.23) sha256=ee0d90733aafff056cf51ff11e803d65e43cae258cc55f6492020ec1f9f9315f + tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b + unicode (0.4.4.5) sha256=42f294bfc8e186d29da89d1f766071505a20a22776168a31bb3408e03fa7a9d7 + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + unparser (0.9.0) sha256=4331f174a73a23b69250b13d47da3794ed1449711ee0f9ed8947dc020ba76067 + uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 + useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844 + virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2 + web-console (4.3.0) sha256=e13b71301cdfc2093f155b5aa3a622db80b4672d1f2f713119cc7ec7ac6a6da4 + websocket (1.2.11) sha256=b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737 + websocket-driver (0.8.0) sha256=ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962 + websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241 + xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e + zeitwerk (2.7.5) sha256=d8da92128c09ea6ec62c949011b00ed4a20242b255293dd66bf41545398f73dd + +BUNDLED WITH + 4.0.3 diff --git a/Procfile.dev b/Procfile.dev new file mode 100644 index 0000000..eb184cd --- /dev/null +++ b/Procfile.dev @@ -0,0 +1,4 @@ +web: bin/rails server -p 3000 -b 0.0.0.0 +css: bin/rails tailwindcss:watch +jobs: bundle exec sidekiq -c 5 +# ws: env ANYCABLE_PORT=8081 ANYCABLE_BROADCAST_ADAPTER=redis ANYCABLE_REDIS_URL=${REDIS_URL:-redis://localhost:6379/1} ANYCABLE_RPC_HOST=http://localhost:3000/_anycable anycable-go diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f0846e --- /dev/null +++ b/README.md @@ -0,0 +1,260 @@ +# Rails 8 Starter Kit + +> A production-grade, AI-native fullstack starter kit for Rails 8. +> Zero-config Docker. Parallel tests. Real-time WebSockets. Premium dark UI. +> From `git clone` to running app in one command. + +``` +docker compose up +``` + +That's it. The `setup` container creates your database, seeds sample data, and the `tests` container validates everything with parallel linting and specs — all before your app boots. + +--- + +## What's Inside + +| Layer | Technology | Why | +|---|---|---| +| **Framework** | Rails 8.1 (edge) + Ruby 4.0 | Latest Rails with all modern defaults | +| **Frontend** | Hotwire (Turbo + Stimulus) + Tailwind CSS v4 + DaisyUI | SPA-like UX without a JS build step | +| **Real-time** | AnyCable + AnyCable-Go + Turbo Streams | WebSocket broadcasting at scale | +| **Database** | PostgreSQL 17.5 + PgBouncer | Connection pooling out of the box | +| **Background Jobs** | Sidekiq + Sidekiq-Cron | Reliable async processing with recurring jobs | +| **Object Storage** | Active Storage + LocalStack (S3) | Production-parity file uploads locally | +| **3D Graphics** | Three.js (via importmap) | Ready for WebGL/3D without bundlers | +| **Testing** | RSpec + Capybara + Parallel Tests | Full-stack E2E with headless Chromium | +| **Code Quality** | RuboCop (Shopify) + Brakeman + Reek + Flog + Flay | 8 linters running in parallel | +| **Auth Framework** | CanCanCan | Authorization scaffolding baked in | +| **Security** | Rack::Attack + SSRF Filter + Bundler Audit | Rate limiting and vulnerability scanning | +| **Deployment** | Kamal + Thruster + Multi-stage Dockerfile | Production-ready container deployment | +| **CI** | GitHub Actions + Dependabot | Automated testing and dependency updates | +| **Dev Tools** | Foreman + jemalloc + Bootsnap | Fast boot, low memory, process management | + +--- + +## Quick Start + +### Docker (recommended) + +```bash +git clone https://github.com/viktorvsk/rails-8-starter-kit.git +cd rails-8-starter-kit +docker compose up +``` + +The startup pipeline runs automatically: + +``` +setup → creates DB, runs migrations, seeds data +tests → runs all 8 linters + parallel specs +app → boots Puma + Tailwind watcher + Sidekiq +ws → boots AnyCable-Go WebSocket server +``` + +Your app is live at `http://localhost:3000`, WebSockets at `ws://localhost:8081/cable`. + +### Local (without Docker) + +Requirements: Ruby 4.0+, PostgreSQL, Redis, `anycable-go` + +```bash +bin/setup # install deps, create DB, seed, start server +bin/check-fast # run all linters in parallel +bin/prspec # run specs with parallel_tests +``` + +--- + +## Architecture + +``` +┌─────────────┐ ┌──────────────┐ ┌─────────────┐ +│ Browser │◄──►│ Puma :3000 │◄──►│ PostgreSQL │ +│ │ │ (Rails 8) │ │ + PgBouncer │ +└──────┬──────┘ └──────┬───────┘ └─────────────┘ + │ │ + │ WebSocket │ Pub/Sub + ▼ ▼ +┌──────────────┐ ┌──────────┐ ┌─────────────┐ +│ AnyCable-Go │◄──►│ Redis │◄──►│ Sidekiq │ +│ :8081 │ │ │ │ (workers) │ +└──────────────┘ └──────────┘ └─────────────┘ + │ + ┌────▼────────┐ + │ LocalStack │ + │ (S3) :4566 │ + └──────────────┘ +``` + +--- + +## Testing + +### Parallel Execution + +Tests run across all available CPU cores via `parallel_tests`: + +```bash +bin/prspec # parallel specs (default) +bin/check-fast # 8 linters + specs, all parallel +bin/check --parallel=rubocop,rspec --then=brakeman +``` + +### Headless Browser Testing + +Capybara system specs run with headless Chromium. The driver auto-detects the environment: +- **Docker**: uses `/usr/bin/chromium` (pre-installed in `Dockerfile.dev`) +- **macOS/Linux**: uses Selenium Manager to find native Chrome + +Animations and transitions are automatically disabled in `RAILS_ENV=test` for deterministic, fast specs. + +### Test Pipeline in Docker + +```bash +docker compose up # setup → tests → app (sequential gates) +docker compose run --rm tests # run tests only +``` + +The `tests` service uses `service_completed_successfully` as a gate — your app literally won't boot unless every linter and spec passes. + +--- + +## Code Quality Gates + +| Linter | Purpose | +|---|---| +| `rubocop` | Style enforcement (Shopify conventions) | +| `brakeman` | Static security analysis | +| `bundler-audit` | Known CVE scanning in dependencies | +| `reek` | Code smell detection | +| `flog` | Complexity scoring | +| `flay` | Duplication detection | +| `haml-syntax` | Template validation | +| `rspec` | Unit + system specs (parallel) | + +All 8 run in parallel via `bin/check-fast`. Sequential chains are supported with `bin/check --then=`. + +--- + +## Docker Compose Services + +| Service | Image | Port | Role | +|---|---|---|---| +| `postgres` | `postgres:17.5` | 5432 | Primary database with tuned config | +| `pgbouncer` | `edoburu/pgbouncer` | — | Transaction-mode connection pooling | +| `redis` | `redis:8.4-alpine` | 6379 | Pub/sub + cache + job queue backend | +| `localstack` | `localstack:4.13.1` | 4566 | S3-compatible object storage | +| `ws` | `anycable-go:1.6` | 8081 | WebSocket server | +| `setup` | (app image) | — | DB creation, migrations, seeds | +| `tests` | (app image) | — | Linters + parallel specs gate | +| `app` | (app image) | 3000 | Rails + Tailwind + Sidekiq | + +All three app-derived containers (`setup`, `tests`, `app`) share a single Docker image build to prevent wasteful rebuilds. + +--- + +## Key Decisions + +### Why AnyCable over Action Cable? + +AnyCable-Go handles WebSocket connections in a dedicated Go process, keeping Ruby threads free for business logic. It's a drop-in replacement — the Rails side uses standard Action Cable APIs via `anycable-rails`. + +### Why PgBouncer? + +Transaction-mode connection pooling prevents the "too many connections" problem in production. The `setup` and `tests` services bypass PgBouncer and connect directly to Postgres (required for `CREATE DATABASE`). + +### Why Sidekiq over Solid Queue? + +Sidekiq provides battle-tested async processing with a mature web UI, cron scheduling (`sidekiq-cron`), and deep Redis integration. The `recurring.yml` has example jobs pre-configured. + +### Why jemalloc? + +`LD_PRELOAD=/usr/local/lib/libjemalloc.so` — reduces Ruby memory fragmentation by 30-40% in production. Pre-configured in both Dockerfiles. + +### Why Bootsnap Cache Isolation? + +Each Docker container gets an anonymous volume (`/rails/tmp/cache`) to prevent concurrent Bootsnap compilation from crashing on shared macOS mounts. + +--- + +## Demo Content + +> ⚠️ **The following components exist purely for demonstration.** They show how each layer of the stack works together. **Delete them when starting a real application.** + +| Component | Files | Demonstrates | +|---|---|---| +| **Todo CRUD** | `app/models/todo.rb`, `app/controllers/todos_controller.rb`, `app/views/todos/`, `db/migrate/*_create_todos.rb` | Model → Controller → View with Turbo Frames | +| **Turbo Stream broadcasting** | `after_create_commit` in `todo.rb`, `turbo_stream_from` in `index.html.erb` | Real-time push via AnyCable | +| **Stimulus controller** | `app/javascript/controllers/hello_controller.js` | Basic Stimulus wiring | +| **Three.js import** | `config/importmap.rb` (the `three` pin) | Importmap-based JS library usage | +| **Sample seed** | `db/seeds.rb` (the `Todo.create!` block) | Idempotent database seeding | +| **System spec** | `spec/system/todos_spec.rb` | Capybara + headless Chromium E2E test | +| **Home controller** | `app/controllers/home_controller.rb`, `app/views/home/` | Static page routing | +| **Example job** | `app/jobs/example_recurring_job.rb`, `config/recurring.yml` | Sidekiq-Cron recurring task | + +--- + +## Project Structure + +``` +├── app/ +│ ├── assets/tailwind/ # Tailwind v4 + DaisyUI theme (Halloween dark) +│ ├── controllers/ # Rails controllers +│ ├── javascript/ # Stimulus controllers + application.js +│ ├── models/ # ActiveRecord models +│ └── views/ # ERB + HAML templates +├── bin/ +│ ├── check # Orchestrator: parallel + sequential task runner +│ ├── check-fast # Fast CI mode (8 linters in parallel) +│ ├── prspec # Parallel RSpec runner +│ ├── setup # One-command dev environment setup +│ └── linters/ # Individual linter scripts +├── config/ +│ ├── cable.yml # AnyCable adapter config +│ ├── database.yml # PostgreSQL (env-driven, PgBouncer-aware) +│ └── recurring.yml # Sidekiq-Cron job schedules +├── docker-compose.yml # Full 8-service development stack +├── Dockerfile # Multi-stage production image +├── Dockerfile.dev # Development image (with Chromium) +└── spec/ + ├── support/capybara.rb # Cross-env headless browser driver + └── system/ # E2E browser specs +``` + +--- + +## Environment Variables + +All configuration is driven by environment variables with sensible defaults. See `env.example` for the complete list. Key variables: + +| Variable | Default | Purpose | +|---|---|---| +| `DB_HOST` | `localhost` | PostgreSQL host (use `pgbouncer` in Docker) | +| `DB_DIRECT_HOST` | `localhost` | Direct PG host (bypasses PgBouncer for migrations) | +| `REDIS_URL` | `redis://localhost:6379/1` | Redis connection string | +| `RAILS_MASTER_KEY` | from `config/master.key` | Credentials decryption key | + +--- + +## For AI Agents + +This repository is optimized for LLM-assisted development: + +- **Deterministic setup**: `docker compose up` produces identical environments +- **Fast feedback**: `bin/check-fast` validates all changes in seconds +- **Clear conventions**: Shopify Ruby style, RSpec, Stimulus naming +- **Minimal surface area**: one model, one controller, flat config files +- **No magic**: explicit imports, no metaprogramming in app code + +To modify this project, start by reading: +1. `config/routes.rb` — all routes +2. `Gemfile` — all dependencies +3. `docker-compose.yml` — full infrastructure +4. `bin/check-fast` — validation pipeline + +--- + +## License + +MIT diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..d2a78aa --- /dev/null +++ b/Rakefile @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative "config/application" + +Rails.application.load_tasks diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000..7e37425 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,123 @@ +/* + * This is a manifest file that'll be compiled into application.css. + * + * With Propshaft, assets are served efficiently without preprocessing steps. You can still include + * application-wide styles in this file, but keep in mind that CSS precedence will follow the standard + * cascading order, meaning styles declared later in the document or manifest will override earlier ones, + * depending on specificity. + * + * Consider organizing styles into separate files for maintainability. + */ + +*, *::before, *::after { box-sizing: border-box; } + +body { + font-family: system-ui, -apple-system, sans-serif; + background: #f5f5f5; + color: #333; + margin: 0; + padding: 0; +} + +.container { + max-width: 640px; + margin: 40px auto; + padding: 0 20px; +} + +h1 { + font-size: 2rem; + font-weight: 700; + margin-bottom: 24px; + color: #111; +} + +.todo-form { margin-bottom: 16px; } + +.form-row { + display: flex; + gap: 8px; +} + +.todo-input { + flex: 1; + padding: 10px 14px; + border: 1px solid #ddd; + border-radius: 6px; + font-size: 1rem; + outline: none; + transition: border-color 0.15s; +} + +.todo-input:focus { border-color: #4f46e5; } + +.btn { + padding: 10px 18px; + border: none; + border-radius: 6px; + font-size: 0.9rem; + cursor: pointer; + text-decoration: none; + display: inline-flex; + align-items: center; + transition: opacity 0.15s; +} + +.btn:hover { opacity: 0.85; } +.btn-primary { background: #4f46e5; color: #fff; } +.btn-secondary { background: #e5e7eb; color: #374151; } +.btn-sm { padding: 5px 10px; font-size: 0.8rem; } +.btn-danger { background: #ef4444; color: #fff; } + +.todo-list { + list-style: none; + padding: 0; + margin: 0; +} + +.todo-item { + display: flex; + align-items: center; + gap: 12px; + background: #fff; + border: 1px solid #e5e7eb; + border-radius: 8px; + padding: 12px 16px; + margin-bottom: 8px; + transition: opacity 0.2s; +} + +.todo-item.completed { opacity: 0.55; } +.todo-item.completed .todo-title { text-decoration: line-through; color: #9ca3af; } + +.toggle-btn { background: none; border: none; padding: 0; cursor: pointer; } +.toggle-btn form { margin: 0; } + +.checkbox { + width: 22px; + height: 22px; + border: 2px solid #4f46e5; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.75rem; + color: #4f46e5; + font-weight: bold; + background: #fff; + transition: background 0.15s; +} + +.todo-item.completed .checkbox { background: #4f46e5; color: #fff; } +.todo-title { flex: 1; font-size: 1rem; } +.todo-actions { display: flex; gap: 6px; } + +.error-messages { + background: #fef2f2; + border: 1px solid #fecaca; + border-radius: 6px; + padding: 10px 14px; + margin-bottom: 12px; + color: #b91c1c; + font-size: 0.9rem; +} diff --git a/app/assets/tailwind/application.css b/app/assets/tailwind/application.css new file mode 100644 index 0000000..e1891a4 --- /dev/null +++ b/app/assets/tailwind/application.css @@ -0,0 +1,307 @@ +@import "tailwindcss"; +@layer theme, base, components, utilities, daisyui, daisyui.l1, daisyui.l1.l2, daisyui.l1.l2.l3; +@source not "../tailwind/daisyui{,*}.mjs"; + +@theme { + --font-sans: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +@plugin "../tailwind/daisyui.mjs"; + +[data-theme="halloween"] { + color-scheme: dark; + /* Deep dark backgrounds for premium dark mode */ + --color-base-100: oklch(20% 0.035 278); + --color-base-200: oklch(12% 0.025 278); + --color-base-300: oklch(8% 0.02 278); + --color-base-content: oklch(93% 0.008 265); + + /* Violet primary matching --primary: #a78bfa / #7c3aed */ + --color-primary: oklch(65% 0.2 293); + --color-primary-content: oklch(100% 0 0); + + --color-secondary: oklch(60% 0.2 277); + --color-secondary-content: oklch(96% 0.015 277); + + --color-accent: oklch(68% 0.18 293); + --color-accent-content: oklch(100% 0 0); + + /* Neutral with subtle violet tint */ + --color-neutral: oklch(22% 0.03 278); + --color-neutral-content: oklch(88% 0.015 270); + + --color-info: oklch(72% 0.16 237); + --color-info-content: oklch(100% 0 0); + + --color-success: oklch(72% 0.18 155); + --color-success-content: oklch(100% 0 0); + + --color-warning: oklch(82% 0.16 75); + --color-warning-content: oklch(95% 0.04 85); + + --color-error: oklch(70% 0.2 25); + --color-error-content: oklch(100% 0 0); + + --radius-selector: 0.5rem; + --radius-field: 0.375rem; + --radius-box: 0.75rem; + --size-selector: 0.25rem; + --size-field: 0.25rem; + --border: 1px; + --depth: 1; + --noise: 0; +} + +[data-theme="halloween"] .card { + border: 1px solid oklch(28% 0.04 280); + box-shadow: 0 4px 16px oklch(0% 0 0 / 0.4), 0 0 0 1px oklch(30% 0.04 285 / 0.2), 0 0 30px oklch(65% 0.2 293 / 0.04); +} + +/* Mobile responsiveness: override DaisyUI defaults for small screens */ +@media (max-width: 1023px) { + .label { + display: flex !important; + white-space: normal !important; + flex-wrap: wrap !important; + gap: 0.25rem; + max-width: 100% !important; + overflow-wrap: break-word; + } + + .card, .card-body { + min-width: 0 !important; + max-width: 100% !important; + } +} + +/* ═══════════════════════════════════════════════════════ + HALLOWEEN THEME — Visual Polish (via Tailwind pipeline) + ═══════════════════════════════════════════════════════ */ + +/* ── CodeMirror Dark Override ── */ +[data-theme="halloween"] .cm-editor, +[data-theme="halloween"] .cm-editor .cm-scroller { + background-color: #0f0f14 !important; + color: #e5e7eb !important; + border-radius: 12px; +} + +[data-theme="halloween"] .cm-editor { + border: 1px solid rgba(167, 139, 250, 0.15) !important; + border-radius: 12px !important; + overflow: hidden; + box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.3); +} + +[data-theme="halloween"] .cm-editor .cm-gutters { + background-color: #1a1a20 !important; + color: rgba(167, 139, 250, 0.4) !important; + border-right: 1px solid rgba(167, 139, 250, 0.1) !important; +} + +[data-theme="halloween"] .cm-editor .cm-activeLineGutter { + background-color: rgba(167, 139, 250, 0.08) !important; +} + +[data-theme="halloween"] .cm-editor .cm-activeLine { + background-color: rgba(167, 139, 250, 0.04) !important; +} + +[data-theme="halloween"] .cm-editor .cm-cursor, +[data-theme="halloween"] .cm-editor .cm-dropCursor { + border-left-color: #a78bfa !important; +} + +[data-theme="halloween"] .cm-editor .cm-content { + caret-color: #a78bfa; + font-family: 'JetBrains Mono', 'Fira Code', monospace; +} + +[data-theme="halloween"] .cm-editor .cm-selectionBackground { + background: rgba(167, 139, 250, 0.2) !important; +} + +[data-theme="halloween"] .cm-editor ::selection { + background: rgba(167, 139, 250, 0.2) !important; +} + +/* Syntax highlighting tokens */ +[data-theme="halloween"] .cm-editor .cm-meta { color: #a78bfa; } +[data-theme="halloween"] .cm-editor .cm-keyword { color: #c4b5fd; } +[data-theme="halloween"] .cm-editor .cm-atom { color: #f472b6; } +[data-theme="halloween"] .cm-editor .cm-number { color: #34d399; } +[data-theme="halloween"] .cm-editor .cm-string { color: #fbbf24; } +[data-theme="halloween"] .cm-editor .cm-def { color: #93c5fd; } +[data-theme="halloween"] .cm-editor .cm-comment { color: #6b7280; } +[data-theme="halloween"] .cm-editor .cm-tag { color: #a78bfa; } +[data-theme="halloween"] .cm-editor .cm-attribute { color: #93c5fd; } +[data-theme="halloween"] .cm-editor .cm-property { color: #c4b5fd; } + +/* ── Headings: Tight typography ── */ +[data-theme="halloween"] h1, +[data-theme="halloween"] h2, +[data-theme="halloween"] h3, +[data-theme="halloween"] h4 { + letter-spacing: -0.5px; + font-weight: 700; +} + +[data-theme="halloween"] h1 { + font-size: 1.75rem; + letter-spacing: -1px; + font-weight: 800; +} + +/* ── Links: Violet accent ── */ +[data-theme="halloween"] a:not(.btn):not(.no-accent):not(.menu a) { + color: #a78bfa; + transition: color 0.2s ease; +} + +[data-theme="halloween"] a:not(.btn):not(.no-accent):not(.menu a):hover { + color: #c4b5fd; +} + +/* ── Collapse: Violet borders ── */ +[data-theme="halloween"] .collapse { + background: rgba(255, 255, 255, 0.03); + border: 1px solid rgba(167, 139, 250, 0.12); + border-radius: 12px; +} + +[data-theme="halloween"] .collapse:focus-within { + border-color: rgba(167, 139, 250, 0.25); +} + +/* ── Code blocks: Dark violet ── */ +[data-theme="halloween"] code:not(.cm-content code) { + background: rgba(167, 139, 250, 0.08); + color: #c4b5fd; + padding: 0.15em 0.4em; + border-radius: 4px; + font-size: 0.85em; +} + +[data-theme="halloween"] pre { + background: #0f0f14 !important; + border: 1px solid rgba(167, 139, 250, 0.12); + border-radius: 12px; + padding: 1rem; +} + +/* ── Base badge refinement ── */ +[data-theme="halloween"] .badge { + backdrop-filter: blur(6px); + -webkit-backdrop-filter: blur(6px); + transition: all 0.2s ease; + font-weight: 600; + letter-spacing: 0.02em; +} + +/* ── Status badge styles ── */ +[data-theme="halloween"] .badge-success { + background: rgba(34, 197, 94, 0.15); + border: 1px solid rgba(34, 197, 94, 0.35); + color: #4ade80; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +[data-theme="halloween"] .badge-error { + background: rgba(239, 68, 68, 0.15); + border: 1px solid rgba(239, 68, 68, 0.35); + color: #f87171; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +[data-theme="halloween"] .badge-warning { + background: rgba(234, 179, 8, 0.15); + border: 1px solid rgba(234, 179, 8, 0.35); + color: #fbbf24; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +[data-theme="halloween"] .badge-info { + background: rgba(56, 189, 248, 0.15); + border: 1px solid rgba(56, 189, 248, 0.30); + color: #7dd3fc; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +[data-theme="halloween"] .badge-primary { + background: rgba(167, 139, 250, 0.15); + border: 1px solid rgba(167, 139, 250, 0.30); + color: #c4b5fd; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +[data-theme="halloween"] .badge-accent { + background: rgba(192, 132, 252, 0.15); + border: 1px solid rgba(192, 132, 252, 0.30); + color: #d8b4fe; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06); +} + +[data-theme="halloween"] .badge-ghost { + background: rgba(229, 231, 235, 0.06); + border: 1px solid rgba(229, 231, 235, 0.12); + color: rgba(229, 231, 235, 0.7); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); +} + +/* ── Badge-outline dark contrast: background tints ── */ +[data-theme="halloween"] .badge-outline.badge-info { background: rgba(56, 189, 248, 0.10); } +[data-theme="halloween"] .badge-outline.badge-success { background: rgba(34, 197, 94, 0.10); } +[data-theme="halloween"] .badge-outline.badge-error { background: rgba(239, 68, 68, 0.10); } +[data-theme="halloween"] .badge-outline.badge-warning { background: rgba(234, 179, 8, 0.10); } +[data-theme="halloween"] .badge-outline.badge-primary { background: rgba(167, 139, 250, 0.10); } +[data-theme="halloween"] .badge-outline.badge-accent { background: rgba(192, 132, 252, 0.10); } +[data-theme="halloween"] .badge-outline:not([class*="badge-info"]):not([class*="badge-success"]):not([class*="badge-error"]):not([class*="badge-warning"]):not([class*="badge-primary"]):not([class*="badge-accent"]) { background: rgba(229, 231, 235, 0.06); } + +/* ── Alert dark-theme text contrast ── */ +[data-theme="halloween"] .alert-warning { color: oklch(90% 0.1 85); } +[data-theme="halloween"] .alert-warning svg { color: oklch(82% 0.16 75); } +[data-theme="halloween"] .alert-info { color: oklch(90% 0.05 237); } +[data-theme="halloween"] .alert-info svg { color: oklch(72% 0.16 237); } + +/* ── Menu hover: Violet glow ── */ +[data-theme="halloween"] .menu li > a:hover, +[data-theme="halloween"] .menu li > button:hover { + background: rgba(167, 139, 250, 0.08); +} + +[data-theme="halloween"] .menu li > .active, +[data-theme="halloween"] .menu li > a.active { + background: rgba(167, 139, 250, 0.12); + color: #a78bfa; +} + +/* ── Select dark options ── */ +[data-theme="halloween"] select option { + background: #1a1a20; + color: #e5e7eb; +} + +/* ── Tooltip: Glass ── */ +[data-theme="halloween"] .tooltip::before { + background: rgba(26, 26, 32, 0.95); + border: 1px solid rgba(167, 139, 250, 0.15); + color: #e5e7eb; + backdrop-filter: blur(10px); +} + +/* ── Progress: Violet ── */ +[data-theme="halloween"] progress::-webkit-progress-value { + background: linear-gradient(90deg, #7c3aed, #a78bfa); + border-radius: 4px; +} + +[data-theme="halloween"] progress::-webkit-progress-bar { + background: rgba(255, 255, 255, 0.06); + border-radius: 4px; +} + +/* ── Footer: Subtle ── */ +[data-theme="halloween"] footer { + color: rgba(229, 231, 235, 0.4); + border-top: 1px solid rgba(167, 139, 250, 0.08); +} \ No newline at end of file diff --git a/app/assets/tailwind/daisyui-theme.mjs b/app/assets/tailwind/daisyui-theme.mjs new file mode 100644 index 0000000..7cdb2d3 --- /dev/null +++ b/app/assets/tailwind/daisyui-theme.mjs @@ -0,0 +1,93 @@ +/** 🌼 + * @license MIT + * daisyUI bundle + * https://daisyui.com/ + */ + +// packages/daisyui/functions/plugin.js +var plugin = { + withOptions: (pluginFunction, configFunction = () => ({})) => { + const optionsFunction = (options) => { + const handler = pluginFunction(options); + const config = configFunction(options); + return { handler, config }; + }; + optionsFunction.__isOptionsFunction = true; + return optionsFunction; + } +}; + +// packages/daisyui/theme/object.js +var object_default = { retro: { "color-scheme": "light", "--color-base-100": "oklch(91.637% 0.034 90.515)", "--color-base-200": "oklch(88.272% 0.049 91.774)", "--color-base-300": "oklch(84.133% 0.065 90.856)", "--color-base-content": "oklch(41% 0.112 45.904)", "--color-primary": "oklch(80% 0.114 19.571)", "--color-primary-content": "oklch(39% 0.141 25.723)", "--color-secondary": "oklch(92% 0.084 155.995)", "--color-secondary-content": "oklch(44% 0.119 151.328)", "--color-accent": "oklch(68% 0.162 75.834)", "--color-accent-content": "oklch(41% 0.112 45.904)", "--color-neutral": "oklch(44% 0.011 73.639)", "--color-neutral-content": "oklch(86% 0.005 56.366)", "--color-info": "oklch(58% 0.158 241.966)", "--color-info-content": "oklch(96% 0.059 95.617)", "--color-success": "oklch(51% 0.096 186.391)", "--color-success-content": "oklch(96% 0.059 95.617)", "--color-warning": "oklch(64% 0.222 41.116)", "--color-warning-content": "oklch(96% 0.059 95.617)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(40% 0.123 38.172)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, bumblebee: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(92% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(85% 0.199 91.936)", "--color-primary-content": "oklch(42% 0.095 57.708)", "--color-secondary": "oklch(75% 0.183 55.934)", "--color-secondary-content": "oklch(40% 0.123 38.172)", "--color-accent": "oklch(0% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(37% 0.01 67.558)", "--color-neutral-content": "oklch(92% 0.003 48.717)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(39% 0.09 240.876)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, fantasy: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(27.807% 0.029 256.847)", "--color-primary": "oklch(37.45% 0.189 325.02)", "--color-primary-content": "oklch(87.49% 0.037 325.02)", "--color-secondary": "oklch(53.92% 0.162 241.36)", "--color-secondary-content": "oklch(90.784% 0.032 241.36)", "--color-accent": "oklch(75.98% 0.204 56.72)", "--color-accent-content": "oklch(15.196% 0.04 56.72)", "--color-neutral": "oklch(27.807% 0.029 256.847)", "--color-neutral-content": "oklch(85.561% 0.005 256.847)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, aqua: { "color-scheme": "dark", "--color-base-100": "oklch(37% 0.146 265.522)", "--color-base-200": "oklch(28% 0.091 267.935)", "--color-base-300": "oklch(22% 0.091 267.935)", "--color-base-content": "oklch(90% 0.058 230.902)", "--color-primary": "oklch(85.661% 0.144 198.645)", "--color-primary-content": "oklch(40.124% 0.068 197.603)", "--color-secondary": "oklch(60.682% 0.108 309.782)", "--color-secondary-content": "oklch(96% 0.016 293.756)", "--color-accent": "oklch(93.426% 0.102 94.555)", "--color-accent-content": "oklch(18.685% 0.02 94.555)", "--color-neutral": "oklch(27% 0.146 265.522)", "--color-neutral-content": "oklch(80% 0.146 265.522)", "--color-info": "oklch(54.615% 0.215 262.88)", "--color-info-content": "oklch(90.923% 0.043 262.88)", "--color-success": "oklch(62.705% 0.169 149.213)", "--color-success-content": "oklch(12.541% 0.033 149.213)", "--color-warning": "oklch(66.584% 0.157 58.318)", "--color-warning-content": "oklch(27% 0.077 45.635)", "--color-error": "oklch(73.95% 0.19 27.33)", "--color-error-content": "oklch(14.79% 0.038 27.33)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, garden: { "color-scheme": "light", "--color-base-100": "oklch(92.951% 0.002 17.197)", "--color-base-200": "oklch(86.445% 0.002 17.197)", "--color-base-300": "oklch(79.938% 0.001 17.197)", "--color-base-content": "oklch(16.961% 0.001 17.32)", "--color-primary": "oklch(62.45% 0.278 3.836)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(48.495% 0.11 355.095)", "--color-secondary-content": "oklch(89.699% 0.022 355.095)", "--color-accent": "oklch(56.273% 0.054 154.39)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(24.155% 0.049 89.07)", "--color-neutral-content": "oklch(92.951% 0.002 17.197)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, coffee: { "color-scheme": "dark", "--color-base-100": "oklch(24% 0.023 329.708)", "--color-base-200": "oklch(21% 0.021 329.708)", "--color-base-300": "oklch(16% 0.019 329.708)", "--color-base-content": "oklch(72.354% 0.092 79.129)", "--color-primary": "oklch(71.996% 0.123 62.756)", "--color-primary-content": "oklch(14.399% 0.024 62.756)", "--color-secondary": "oklch(34.465% 0.029 199.194)", "--color-secondary-content": "oklch(86.893% 0.005 199.194)", "--color-accent": "oklch(42.621% 0.074 224.389)", "--color-accent-content": "oklch(88.524% 0.014 224.389)", "--color-neutral": "oklch(16.51% 0.015 326.261)", "--color-neutral-content": "oklch(83.302% 0.003 326.261)", "--color-info": "oklch(79.49% 0.063 184.558)", "--color-info-content": "oklch(15.898% 0.012 184.558)", "--color-success": "oklch(74.722% 0.072 131.116)", "--color-success-content": "oklch(14.944% 0.014 131.116)", "--color-warning": "oklch(88.15% 0.14 87.722)", "--color-warning-content": "oklch(17.63% 0.028 87.722)", "--color-error": "oklch(77.318% 0.128 31.871)", "--color-error-content": "oklch(15.463% 0.025 31.871)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, pastel: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98.462% 0.001 247.838)", "--color-base-300": "oklch(92.462% 0.001 247.838)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(90% 0.063 306.703)", "--color-primary-content": "oklch(49% 0.265 301.924)", "--color-secondary": "oklch(89% 0.058 10.001)", "--color-secondary-content": "oklch(51% 0.222 16.935)", "--color-accent": "oklch(90% 0.093 164.15)", "--color-accent-content": "oklch(50% 0.118 165.612)", "--color-neutral": "oklch(55% 0.046 257.417)", "--color-neutral-content": "oklch(92% 0.013 255.508)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(52% 0.105 223.128)", "--color-success": "oklch(87% 0.15 154.449)", "--color-success-content": "oklch(52% 0.154 150.069)", "--color-warning": "oklch(83% 0.128 66.29)", "--color-warning-content": "oklch(55% 0.195 38.402)", "--color-error": "oklch(80% 0.114 19.571)", "--color-error-content": "oklch(50% 0.213 27.518)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "0", "--noise": "0" }, halloween: { "color-scheme": "dark", "--color-base-100": "oklch(26% 0.04 278)", "--color-base-200": "oklch(14% 0.025 275)", "--color-base-300": "oklch(10% 0.02 272)", "--color-base-content": "oklch(95% 0.008 265)", "--color-primary": "oklch(65% 0.2 293)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(60% 0.2 277)", "--color-secondary-content": "oklch(96% 0.015 277)", "--color-accent": "oklch(68% 0.18 293)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(27% 0.035 278)", "--color-neutral-content": "oklch(88% 0.015 270)", "--color-info": "oklch(72% 0.16 237)", "--color-info-content": "oklch(100% 0 0)", "--color-success": "oklch(72% 0.18 155)", "--color-success-content": "oklch(100% 0 0)", "--color-warning": "oklch(82% 0.16 75)", "--color-warning-content": "oklch(15% 0.03 75)", "--color-error": "oklch(70% 0.2 25)", "--color-error-content": "oklch(100% 0 0)", "--radius-selector": "0.5rem", "--radius-field": "0.375rem", "--radius-box": "0.75rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, cupcake: { "color-scheme": "light", "--color-base-100": "oklch(97.788% 0.004 56.375)", "--color-base-200": "oklch(93.982% 0.007 61.449)", "--color-base-300": "oklch(91.586% 0.006 53.44)", "--color-base-content": "oklch(23.574% 0.066 313.189)", "--color-primary": "oklch(85% 0.138 181.071)", "--color-primary-content": "oklch(43% 0.078 188.216)", "--color-secondary": "oklch(89% 0.061 343.231)", "--color-secondary-content": "oklch(45% 0.187 3.815)", "--color-accent": "oklch(90% 0.076 70.697)", "--color-accent-content": "oklch(47% 0.157 37.304)", "--color-neutral": "oklch(27% 0.006 286.033)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(68% 0.169 237.323)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(69% 0.17 162.48)", "--color-success-content": "oklch(26% 0.051 172.552)", "--color-warning": "oklch(79% 0.184 86.047)", "--color-warning-content": "oklch(28% 0.066 53.813)", "--color-error": "oklch(64% 0.246 16.439)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, lofi: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(15.906% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(21.455% 0.001 17.278)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(26.861% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(79.54% 0.103 205.9)", "--color-info-content": "oklch(15.908% 0.02 205.9)", "--color-success": "oklch(90.13% 0.153 164.14)", "--color-success-content": "oklch(18.026% 0.03 164.14)", "--color-warning": "oklch(88.37% 0.135 79.94)", "--color-warning-content": "oklch(17.674% 0.027 79.94)", "--color-error": "oklch(78.66% 0.15 28.47)", "--color-error-content": "oklch(15.732% 0.03 28.47)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, emerald: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(35.519% 0.032 262.988)", "--color-primary": "oklch(76.662% 0.135 153.45)", "--color-primary-content": "oklch(33.387% 0.04 162.24)", "--color-secondary": "oklch(61.302% 0.202 261.294)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(72.772% 0.149 33.2)", "--color-accent-content": "oklch(0% 0 0)", "--color-neutral": "oklch(35.519% 0.032 262.988)", "--color-neutral-content": "oklch(98.462% 0.001 247.838)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, night: { "color-scheme": "dark", "--color-base-100": "oklch(20.768% 0.039 265.754)", "--color-base-200": "oklch(19.314% 0.037 265.754)", "--color-base-300": "oklch(17.86% 0.034 265.754)", "--color-base-content": "oklch(84.153% 0.007 265.754)", "--color-primary": "oklch(75.351% 0.138 232.661)", "--color-primary-content": "oklch(15.07% 0.027 232.661)", "--color-secondary": "oklch(68.011% 0.158 276.934)", "--color-secondary-content": "oklch(13.602% 0.031 276.934)", "--color-accent": "oklch(72.36% 0.176 350.048)", "--color-accent-content": "oklch(14.472% 0.035 350.048)", "--color-neutral": "oklch(27.949% 0.036 260.03)", "--color-neutral-content": "oklch(85.589% 0.007 260.03)", "--color-info": "oklch(68.455% 0.148 237.251)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(78.452% 0.132 181.911)", "--color-success-content": "oklch(15.69% 0.026 181.911)", "--color-warning": "oklch(83.242% 0.139 82.95)", "--color-warning-content": "oklch(16.648% 0.027 82.95)", "--color-error": "oklch(71.785% 0.17 13.118)", "--color-error-content": "oklch(14.357% 0.034 13.118)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dark: { "color-scheme": "dark", "--color-base-100": "oklch(25.33% 0.016 252.42)", "--color-base-200": "oklch(23.26% 0.014 253.1)", "--color-base-300": "oklch(21.15% 0.012 254.09)", "--color-base-content": "oklch(97.807% 0.029 256.847)", "--color-primary": "oklch(58% 0.233 277.117)", "--color-primary-content": "oklch(96% 0.018 272.314)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, synthwave: { "color-scheme": "dark", "--color-base-100": "oklch(15% 0.09 281.288)", "--color-base-200": "oklch(20% 0.09 281.288)", "--color-base-300": "oklch(25% 0.09 281.288)", "--color-base-content": "oklch(78% 0.115 274.713)", "--color-primary": "oklch(71% 0.202 349.761)", "--color-primary-content": "oklch(28% 0.109 3.907)", "--color-secondary": "oklch(82% 0.111 230.318)", "--color-secondary-content": "oklch(29% 0.066 243.157)", "--color-accent": "oklch(75% 0.183 55.934)", "--color-accent-content": "oklch(26% 0.079 36.259)", "--color-neutral": "oklch(45% 0.24 277.023)", "--color-neutral-content": "oklch(87% 0.065 274.039)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(77% 0.152 181.912)", "--color-success-content": "oklch(27% 0.046 192.524)", "--color-warning": "oklch(90% 0.182 98.111)", "--color-warning-content": "oklch(42% 0.095 57.708)", "--color-error": "oklch(73.7% 0.121 32.639)", "--color-error-content": "oklch(23.501% 0.096 290.329)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, light: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98% 0 0)", "--color-base-300": "oklch(95% 0 0)", "--color-base-content": "oklch(21% 0.006 285.885)", "--color-primary": "oklch(45% 0.24 277.023)", "--color-primary-content": "oklch(93% 0.034 272.788)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, silk: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.0035 67.78)", "--color-base-200": "oklch(95% 0.0081 61.42)", "--color-base-300": "oklch(90% 0.0081 61.42)", "--color-base-content": "oklch(40% 0.0081 61.42)", "--color-primary": "oklch(23.27% 0.0249 284.3)", "--color-primary-content": "oklch(94.22% 0.2505 117.44)", "--color-secondary": "oklch(23.27% 0.0249 284.3)", "--color-secondary-content": "oklch(73.92% 0.2135 50.94)", "--color-accent": "oklch(23.27% 0.0249 284.3)", "--color-accent-content": "oklch(88.92% 0.2061 189.9)", "--color-neutral": "oklch(20% 0 0)", "--color-neutral-content": "oklch(80% 0.0081 61.42)", "--color-info": "oklch(80.39% 0.1148 241.68)", "--color-info-content": "oklch(30.39% 0.1148 241.68)", "--color-success": "oklch(83.92% 0.0901 136.87)", "--color-success-content": "oklch(23.92% 0.0901 136.87)", "--color-warning": "oklch(83.92% 0.1085 80)", "--color-warning-content": "oklch(43.92% 0.1085 80)", "--color-error": "oklch(75.1% 0.1814 22.37)", "--color-error-content": "oklch(35.1% 0.1814 22.37)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, nord: { "color-scheme": "light", "--color-base-100": "oklch(95.127% 0.007 260.731)", "--color-base-200": "oklch(93.299% 0.01 261.788)", "--color-base-300": "oklch(89.925% 0.016 262.749)", "--color-base-content": "oklch(32.437% 0.022 264.182)", "--color-primary": "oklch(59.435% 0.077 254.027)", "--color-primary-content": "oklch(11.887% 0.015 254.027)", "--color-secondary": "oklch(69.651% 0.059 248.687)", "--color-secondary-content": "oklch(13.93% 0.011 248.687)", "--color-accent": "oklch(77.464% 0.062 217.469)", "--color-accent-content": "oklch(15.492% 0.012 217.469)", "--color-neutral": "oklch(45.229% 0.035 264.131)", "--color-neutral-content": "oklch(89.925% 0.016 262.749)", "--color-info": "oklch(69.207% 0.062 332.664)", "--color-info-content": "oklch(13.841% 0.012 332.664)", "--color-success": "oklch(76.827% 0.074 131.063)", "--color-success-content": "oklch(15.365% 0.014 131.063)", "--color-warning": "oklch(85.486% 0.089 84.093)", "--color-warning-content": "oklch(17.097% 0.017 84.093)", "--color-error": "oklch(60.61% 0.12 15.341)", "--color-error-content": "oklch(12.122% 0.024 15.341)", "--radius-selector": "1rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dim: { "color-scheme": "dark", "--color-base-100": "oklch(30.857% 0.023 264.149)", "--color-base-200": "oklch(28.036% 0.019 264.182)", "--color-base-300": "oklch(26.346% 0.018 262.177)", "--color-base-content": "oklch(82.901% 0.031 222.959)", "--color-primary": "oklch(86.133% 0.141 139.549)", "--color-primary-content": "oklch(17.226% 0.028 139.549)", "--color-secondary": "oklch(73.375% 0.165 35.353)", "--color-secondary-content": "oklch(14.675% 0.033 35.353)", "--color-accent": "oklch(74.229% 0.133 311.379)", "--color-accent-content": "oklch(14.845% 0.026 311.379)", "--color-neutral": "oklch(24.731% 0.02 264.094)", "--color-neutral-content": "oklch(82.901% 0.031 222.959)", "--color-info": "oklch(86.078% 0.142 206.182)", "--color-info-content": "oklch(17.215% 0.028 206.182)", "--color-success": "oklch(86.171% 0.142 166.534)", "--color-success-content": "oklch(17.234% 0.028 166.534)", "--color-warning": "oklch(86.163% 0.142 94.818)", "--color-warning-content": "oklch(17.232% 0.028 94.818)", "--color-error": "oklch(82.418% 0.099 33.756)", "--color-error-content": "oklch(16.483% 0.019 33.756)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, business: { "color-scheme": "dark", "--color-base-100": "oklch(24.353% 0 0)", "--color-base-200": "oklch(22.648% 0 0)", "--color-base-300": "oklch(20.944% 0 0)", "--color-base-content": "oklch(84.87% 0 0)", "--color-primary": "oklch(41.703% 0.099 251.473)", "--color-primary-content": "oklch(88.34% 0.019 251.473)", "--color-secondary": "oklch(64.092% 0.027 229.389)", "--color-secondary-content": "oklch(12.818% 0.005 229.389)", "--color-accent": "oklch(67.271% 0.167 35.791)", "--color-accent-content": "oklch(13.454% 0.033 35.791)", "--color-neutral": "oklch(27.441% 0.013 253.041)", "--color-neutral-content": "oklch(85.488% 0.002 253.041)", "--color-info": "oklch(62.616% 0.143 240.033)", "--color-info-content": "oklch(12.523% 0.028 240.033)", "--color-success": "oklch(70.226% 0.094 156.596)", "--color-success-content": "oklch(14.045% 0.018 156.596)", "--color-warning": "oklch(77.482% 0.115 81.519)", "--color-warning-content": "oklch(15.496% 0.023 81.519)", "--color-error": "oklch(51.61% 0.146 29.674)", "--color-error-content": "oklch(90.322% 0.029 29.674)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, corporate: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(22.389% 0.031 278.072)", "--color-primary": "oklch(58% 0.158 241.966)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(55% 0.046 257.417)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(60% 0.118 184.704)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(60% 0.126 221.723)", "--color-info-content": "oklch(100% 0 0)", "--color-success": "oklch(62% 0.194 149.214)", "--color-success-content": "oklch(100% 0 0)", "--color-warning": "oklch(85% 0.199 91.936)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, acid: { "color-scheme": "light", "--color-base-100": "oklch(98% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(91% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(71.9% 0.357 330.759)", "--color-primary-content": "oklch(14.38% 0.071 330.759)", "--color-secondary": "oklch(73.37% 0.224 48.25)", "--color-secondary-content": "oklch(14.674% 0.044 48.25)", "--color-accent": "oklch(92.78% 0.264 122.962)", "--color-accent-content": "oklch(18.556% 0.052 122.962)", "--color-neutral": "oklch(21.31% 0.128 278.68)", "--color-neutral-content": "oklch(84.262% 0.025 278.68)", "--color-info": "oklch(60.72% 0.227 252.05)", "--color-info-content": "oklch(12.144% 0.045 252.05)", "--color-success": "oklch(85.72% 0.266 158.53)", "--color-success-content": "oklch(17.144% 0.053 158.53)", "--color-warning": "oklch(91.01% 0.212 100.5)", "--color-warning-content": "oklch(18.202% 0.042 100.5)", "--color-error": "oklch(64.84% 0.293 29.349)", "--color-error-content": "oklch(12.968% 0.058 29.349)", "--radius-selector": "1rem", "--radius-field": "1rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, caramellatte: { "color-scheme": "light", "--color-base-100": "oklch(98% 0.016 73.684)", "--color-base-200": "oklch(95% 0.038 75.164)", "--color-base-300": "oklch(90% 0.076 70.697)", "--color-base-content": "oklch(40% 0.123 38.172)", "--color-primary": "oklch(0% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(22.45% 0.075 37.85)", "--color-secondary-content": "oklch(90% 0.076 70.697)", "--color-accent": "oklch(46.44% 0.111 37.85)", "--color-accent-content": "oklch(90% 0.076 70.697)", "--color-neutral": "oklch(55% 0.195 38.402)", "--color-neutral-content": "oklch(98% 0.016 73.684)", "--color-info": "oklch(42% 0.199 265.638)", "--color-info-content": "oklch(90% 0.076 70.697)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.076 70.697)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "1" }, sunset: { "color-scheme": "dark", "--color-base-100": "oklch(22% 0.019 237.69)", "--color-base-200": "oklch(20% 0.019 237.69)", "--color-base-300": "oklch(18% 0.019 237.69)", "--color-base-content": "oklch(77.383% 0.043 245.096)", "--color-primary": "oklch(74.703% 0.158 39.947)", "--color-primary-content": "oklch(14.94% 0.031 39.947)", "--color-secondary": "oklch(72.537% 0.177 2.72)", "--color-secondary-content": "oklch(14.507% 0.035 2.72)", "--color-accent": "oklch(71.294% 0.166 299.844)", "--color-accent-content": "oklch(14.258% 0.033 299.844)", "--color-neutral": "oklch(26% 0.019 237.69)", "--color-neutral-content": "oklch(70% 0.019 237.69)", "--color-info": "oklch(85.559% 0.085 206.015)", "--color-info-content": "oklch(17.111% 0.017 206.015)", "--color-success": "oklch(85.56% 0.085 144.778)", "--color-success-content": "oklch(17.112% 0.017 144.778)", "--color-warning": "oklch(85.569% 0.084 74.427)", "--color-warning-content": "oklch(17.113% 0.016 74.427)", "--color-error": "oklch(85.511% 0.078 16.886)", "--color-error-content": "oklch(17.102% 0.015 16.886)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, forest: { "color-scheme": "dark", "--color-base-100": "oklch(20.84% 0.008 17.911)", "--color-base-200": "oklch(18.522% 0.007 17.911)", "--color-base-300": "oklch(16.203% 0.007 17.911)", "--color-base-content": "oklch(83.768% 0.001 17.911)", "--color-primary": "oklch(68.628% 0.185 148.958)", "--color-primary-content": "oklch(0% 0 0)", "--color-secondary": "oklch(69.776% 0.135 168.327)", "--color-secondary-content": "oklch(13.955% 0.027 168.327)", "--color-accent": "oklch(70.628% 0.119 185.713)", "--color-accent-content": "oklch(14.125% 0.023 185.713)", "--color-neutral": "oklch(30.698% 0.039 171.364)", "--color-neutral-content": "oklch(86.139% 0.007 171.364)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dracula: { "color-scheme": "dark", "--color-base-100": "oklch(28.822% 0.022 277.508)", "--color-base-200": "oklch(26.805% 0.02 277.508)", "--color-base-300": "oklch(24.787% 0.019 277.508)", "--color-base-content": "oklch(97.747% 0.007 106.545)", "--color-primary": "oklch(75.461% 0.183 346.812)", "--color-primary-content": "oklch(15.092% 0.036 346.812)", "--color-secondary": "oklch(74.202% 0.148 301.883)", "--color-secondary-content": "oklch(14.84% 0.029 301.883)", "--color-accent": "oklch(83.392% 0.124 66.558)", "--color-accent-content": "oklch(16.678% 0.024 66.558)", "--color-neutral": "oklch(39.445% 0.032 275.524)", "--color-neutral-content": "oklch(87.889% 0.006 275.524)", "--color-info": "oklch(88.263% 0.093 212.846)", "--color-info-content": "oklch(17.652% 0.018 212.846)", "--color-success": "oklch(87.099% 0.219 148.024)", "--color-success-content": "oklch(17.419% 0.043 148.024)", "--color-warning": "oklch(95.533% 0.134 112.757)", "--color-warning-content": "oklch(19.106% 0.026 112.757)", "--color-error": "oklch(68.22% 0.206 24.43)", "--color-error-content": "oklch(13.644% 0.041 24.43)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, autumn: { "color-scheme": "light", "--color-base-100": "oklch(95.814% 0 0)", "--color-base-200": "oklch(89.107% 0 0)", "--color-base-300": "oklch(82.4% 0 0)", "--color-base-content": "oklch(19.162% 0 0)", "--color-primary": "oklch(40.723% 0.161 17.53)", "--color-primary-content": "oklch(88.144% 0.032 17.53)", "--color-secondary": "oklch(61.676% 0.169 23.865)", "--color-secondary-content": "oklch(12.335% 0.033 23.865)", "--color-accent": "oklch(73.425% 0.094 60.729)", "--color-accent-content": "oklch(14.685% 0.018 60.729)", "--color-neutral": "oklch(54.367% 0.037 51.902)", "--color-neutral-content": "oklch(90.873% 0.007 51.902)", "--color-info": "oklch(69.224% 0.097 207.284)", "--color-info-content": "oklch(13.844% 0.019 207.284)", "--color-success": "oklch(60.995% 0.08 174.616)", "--color-success-content": "oklch(12.199% 0.016 174.616)", "--color-warning": "oklch(70.081% 0.164 56.844)", "--color-warning-content": "oklch(14.016% 0.032 56.844)", "--color-error": "oklch(53.07% 0.241 24.16)", "--color-error-content": "oklch(90.614% 0.048 24.16)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, wireframe: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(87% 0 0)", "--color-primary-content": "oklch(26% 0 0)", "--color-secondary": "oklch(87% 0 0)", "--color-secondary-content": "oklch(26% 0 0)", "--color-accent": "oklch(87% 0 0)", "--color-accent-content": "oklch(26% 0 0)", "--color-neutral": "oklch(87% 0 0)", "--color-neutral-content": "oklch(26% 0 0)", "--color-info": "oklch(44% 0.11 240.79)", "--color-info-content": "oklch(90% 0.058 230.902)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.093 164.15)", "--color-warning": "oklch(47% 0.137 46.201)", "--color-warning-content": "oklch(92% 0.12 95.746)", "--color-error": "oklch(44% 0.177 26.899)", "--color-error-content": "oklch(88% 0.062 18.334)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, luxury: { "color-scheme": "dark", "--color-base-100": "oklch(14.076% 0.004 285.822)", "--color-base-200": "oklch(20.219% 0.004 308.229)", "--color-base-300": "oklch(23.219% 0.004 308.229)", "--color-base-content": "oklch(75.687% 0.123 76.89)", "--color-primary": "oklch(100% 0 0)", "--color-primary-content": "oklch(20% 0 0)", "--color-secondary": "oklch(27.581% 0.064 261.069)", "--color-secondary-content": "oklch(85.516% 0.012 261.069)", "--color-accent": "oklch(36.674% 0.051 338.825)", "--color-accent-content": "oklch(87.334% 0.01 338.825)", "--color-neutral": "oklch(24.27% 0.057 59.825)", "--color-neutral-content": "oklch(93.203% 0.089 90.861)", "--color-info": "oklch(79.061% 0.121 237.133)", "--color-info-content": "oklch(15.812% 0.024 237.133)", "--color-success": "oklch(78.119% 0.192 132.154)", "--color-success-content": "oklch(15.623% 0.038 132.154)", "--color-warning": "oklch(86.127% 0.136 102.891)", "--color-warning-content": "oklch(17.225% 0.027 102.891)", "--color-error": "oklch(71.753% 0.176 22.568)", "--color-error-content": "oklch(14.35% 0.035 22.568)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, abyss: { "color-scheme": "dark", "--color-base-100": "oklch(20% 0.08 209)", "--color-base-200": "oklch(15% 0.08 209)", "--color-base-300": "oklch(10% 0.08 209)", "--color-base-content": "oklch(90% 0.076 70.697)", "--color-primary": "oklch(92% 0.2653 125)", "--color-primary-content": "oklch(50% 0.2653 125)", "--color-secondary": "oklch(83.27% 0.0764 298.3)", "--color-secondary-content": "oklch(43.27% 0.0764 298.3)", "--color-accent": "oklch(43% 0 0)", "--color-accent-content": "oklch(98% 0 0)", "--color-neutral": "oklch(30% 0.08 209)", "--color-neutral-content": "oklch(90% 0.076 70.697)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(79% 0.209 151.711)", "--color-success-content": "oklch(26% 0.065 152.934)", "--color-warning": "oklch(84.8% 0.1962 84.62)", "--color-warning-content": "oklch(44.8% 0.1962 84.62)", "--color-error": "oklch(65% 0.1985 24.22)", "--color-error-content": "oklch(27% 0.1985 24.22)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, valentine: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.014 343.198)", "--color-base-200": "oklch(94% 0.028 342.258)", "--color-base-300": "oklch(89% 0.061 343.231)", "--color-base-content": "oklch(52% 0.223 3.958)", "--color-primary": "oklch(65% 0.241 354.308)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(62% 0.265 303.9)", "--color-secondary-content": "oklch(97% 0.014 308.299)", "--color-accent": "oklch(82% 0.111 230.318)", "--color-accent-content": "oklch(39% 0.09 240.876)", "--color-neutral": "oklch(40% 0.153 2.432)", "--color-neutral-content": "oklch(89% 0.061 343.231)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(44% 0.11 240.79)", "--color-success": "oklch(84% 0.143 164.978)", "--color-success-content": "oklch(43% 0.095 166.913)", "--color-warning": "oklch(75% 0.183 55.934)", "--color-warning-content": "oklch(26% 0.079 36.259)", "--color-error": "oklch(63% 0.237 25.331)", "--color-error-content": "oklch(97% 0.013 17.38)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, cyberpunk: { "color-scheme": "light", "--color-base-100": "oklch(94.51% 0.179 104.32)", "--color-base-200": "oklch(91.51% 0.179 104.32)", "--color-base-300": "oklch(85.51% 0.179 104.32)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(74.22% 0.209 6.35)", "--color-primary-content": "oklch(14.844% 0.041 6.35)", "--color-secondary": "oklch(83.33% 0.184 204.72)", "--color-secondary-content": "oklch(16.666% 0.036 204.72)", "--color-accent": "oklch(71.86% 0.217 310.43)", "--color-accent-content": "oklch(14.372% 0.043 310.43)", "--color-neutral": "oklch(23.04% 0.065 269.31)", "--color-neutral-content": "oklch(94.51% 0.179 104.32)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, lemonade: { "color-scheme": "light", "--color-base-100": "oklch(98.71% 0.02 123.72)", "--color-base-200": "oklch(91.8% 0.018 123.72)", "--color-base-300": "oklch(84.89% 0.017 123.72)", "--color-base-content": "oklch(19.742% 0.004 123.72)", "--color-primary": "oklch(58.92% 0.199 134.6)", "--color-primary-content": "oklch(11.784% 0.039 134.6)", "--color-secondary": "oklch(77.75% 0.196 111.09)", "--color-secondary-content": "oklch(15.55% 0.039 111.09)", "--color-accent": "oklch(85.39% 0.201 100.73)", "--color-accent-content": "oklch(17.078% 0.04 100.73)", "--color-neutral": "oklch(30.98% 0.075 108.6)", "--color-neutral-content": "oklch(86.196% 0.015 108.6)", "--color-info": "oklch(86.19% 0.047 224.14)", "--color-info-content": "oklch(17.238% 0.009 224.14)", "--color-success": "oklch(86.19% 0.047 157.85)", "--color-success-content": "oklch(17.238% 0.009 157.85)", "--color-warning": "oklch(86.19% 0.047 102.15)", "--color-warning-content": "oklch(17.238% 0.009 102.15)", "--color-error": "oklch(86.19% 0.047 25.85)", "--color-error-content": "oklch(17.238% 0.009 25.85)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, winter: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97.466% 0.011 259.822)", "--color-base-300": "oklch(93.268% 0.016 262.751)", "--color-base-content": "oklch(41.886% 0.053 255.824)", "--color-primary": "oklch(56.86% 0.255 257.57)", "--color-primary-content": "oklch(91.372% 0.051 257.57)", "--color-secondary": "oklch(42.551% 0.161 282.339)", "--color-secondary-content": "oklch(88.51% 0.032 282.339)", "--color-accent": "oklch(59.939% 0.191 335.171)", "--color-accent-content": "oklch(11.988% 0.038 335.171)", "--color-neutral": "oklch(19.616% 0.063 257.651)", "--color-neutral-content": "oklch(83.923% 0.012 257.651)", "--color-info": "oklch(88.127% 0.085 214.515)", "--color-info-content": "oklch(17.625% 0.017 214.515)", "--color-success": "oklch(80.494% 0.077 197.823)", "--color-success-content": "oklch(16.098% 0.015 197.823)", "--color-warning": "oklch(89.172% 0.045 71.47)", "--color-warning-content": "oklch(17.834% 0.009 71.47)", "--color-error": "oklch(73.092% 0.11 20.076)", "--color-error-content": "oklch(14.618% 0.022 20.076)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, black: { "color-scheme": "dark", "--color-base-100": "oklch(0% 0 0)", "--color-base-200": "oklch(19% 0 0)", "--color-base-300": "oklch(22% 0 0)", "--color-base-content": "oklch(87.609% 0 0)", "--color-primary": "oklch(35% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(35% 0 0)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(35% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(35% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(45.201% 0.313 264.052)", "--color-info-content": "oklch(89.04% 0.062 264.052)", "--color-success": "oklch(51.975% 0.176 142.495)", "--color-success-content": "oklch(90.395% 0.035 142.495)", "--color-warning": "oklch(96.798% 0.211 109.769)", "--color-warning-content": "oklch(19.359% 0.042 109.769)", "--color-error": "oklch(62.795% 0.257 29.233)", "--color-error-content": "oklch(12.559% 0.051 29.233)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, cmyk: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(90% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(71.772% 0.133 239.443)", "--color-primary-content": "oklch(14.354% 0.026 239.443)", "--color-secondary": "oklch(64.476% 0.202 359.339)", "--color-secondary-content": "oklch(12.895% 0.04 359.339)", "--color-accent": "oklch(94.228% 0.189 105.306)", "--color-accent-content": "oklch(18.845% 0.037 105.306)", "--color-neutral": "oklch(21.778% 0 0)", "--color-neutral-content": "oklch(84.355% 0 0)", "--color-info": "oklch(68.475% 0.094 217.284)", "--color-info-content": "oklch(13.695% 0.018 217.284)", "--color-success": "oklch(46.949% 0.162 321.406)", "--color-success-content": "oklch(89.389% 0.032 321.406)", "--color-warning": "oklch(71.236% 0.159 52.023)", "--color-warning-content": "oklch(14.247% 0.031 52.023)", "--color-error": "oklch(62.013% 0.208 28.717)", "--color-error-content": "oklch(12.402% 0.041 28.717)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" } }; + +// packages/daisyui/theme/index.js +var theme_default = plugin.withOptions((options = {}) => { + return ({ addBase }) => { + const { + name = "custom-theme", + default: isDefault = false, + prefersdark = false, + "color-scheme": colorScheme = "normal", + root = ":root", + ...customThemeTokens + } = options; + let selector = `${root}:has(input.theme-controller[value=${name}]:checked),[data-theme="${name}"]`; + if (isDefault) { + selector = `:where(${root}),${selector}`; + } + let themeTokens = { ...customThemeTokens }; + if (object_default[name]) { + const builtinTheme = object_default[name]; + themeTokens = { + ...builtinTheme, + ...customThemeTokens, + "color-scheme": colorScheme || builtinTheme.colorScheme + }; + } + const baseStyles = { + [selector]: { + "color-scheme": themeTokens["color-scheme"] || colorScheme, + ...themeTokens + } + }; + if (prefersdark) { + const darkSelector = root === ":root" ? ":root:not([data-theme])" : `${root}:not([data-theme])`; + addBase({ + "@media (prefers-color-scheme: dark)": { + [darkSelector]: baseStyles[selector] + } + }); + } + addBase(baseStyles); + }; +}); +export { + theme_default as default +}; + + +/* + + MIT License + + Copyright (c) 2020 Pouya Saadeghi – https://daisyui.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +*/ diff --git a/app/assets/tailwind/daisyui.mjs b/app/assets/tailwind/daisyui.mjs new file mode 100644 index 0000000..98f179d --- /dev/null +++ b/app/assets/tailwind/daisyui.mjs @@ -0,0 +1,1167 @@ +/** 🌼 + * @license MIT + * daisyUI bundle + * https://daisyui.com/ + */ + +// packages/daisyui/functions/themeOrder.js +var themeOrder_default = [ + "light", + "dark", + "cupcake", + "bumblebee", + "emerald", + "corporate", + "synthwave", + "retro", + "cyberpunk", + "valentine", + "halloween", + "garden", + "forest", + "aqua", + "lofi", + "pastel", + "fantasy", + "wireframe", + "black", + "luxury", + "dracula", + "cmyk", + "autumn", + "business", + "acid", + "lemonade", + "night", + "coffee", + "winter", + "dim", + "nord", + "sunset", + "caramellatte", + "abyss", + "silk" +]; + +// packages/daisyui/functions/pluginOptionsHandler.js +var pluginOptionsHandler = (() => { + let firstRun = true; + return (options, addBase, themesObject, packageVersion) => { + const { + logs = true, + root = ":root", + themes = [ + "winter", + "halloween", + "light", + "dark", + "cupcake", + "bumblebee", + "emerald", + "corporate", + "synthwave", + "retro", + "cyberpunk", + "valentine", + "garden", + "forest", + "aqua", + "lofi", + "pastel", + "fantasy", + "wireframe", + "black", + "luxury", + "dracula", + "cmyk", + "autumn", + "business", + "acid", + "lemonade", + "night", + "coffee", + "dim", + "nord", + "sunset", + ], + include, + exclude, + prefix = "" + } = options || {}; + if (logs !== false && firstRun) { + console.log(`${atob("Lyoh")} ${decodeURIComponent("%F0%9F%8C%BC")} ${atob("ZGFpc3lVSQ==")} ${packageVersion} ${atob("Ki8=")}`); + firstRun = false; + } + const applyTheme = (themeName, flags) => { + const theme = themesObject[themeName]; + if (theme) { + const themeControllerClass = `${prefix}theme-controller`; + let selector = `${root}:has(input.${themeControllerClass}[value=${themeName}]:checked),[data-theme=${themeName}]`; + if (flags.includes("--default")) { + selector = `:where(${root}),${selector}`; + } + addBase({ [selector]: theme }); + if (flags.includes("--prefersdark")) { + const darkSelector = root === ":root" ? ":root:not([data-theme])" : `${root}:not([data-theme])`; + addBase({ "@media (prefers-color-scheme: dark)": { [darkSelector]: theme } }); + } + } + }; + if (themes === "all") { + if (themesObject["light"]) { + applyTheme("light", ["--default"]); + } + if (themesObject["dark"]) { + const darkSelector = root === ":root" ? ":root:not([data-theme])" : `${root}:not([data-theme])`; + addBase({ "@media (prefers-color-scheme: dark)": { [darkSelector]: themesObject["dark"] } }); + } + themeOrder_default.forEach((themeName) => { + if (themesObject[themeName]) { + applyTheme(themeName, []); + } + }); + } else if (themes) { + const themeArray = Array.isArray(themes) ? themes : [themes]; + if (themeArray.length === 1 && themeArray[0].includes("--default")) { + const [themeName, ...flags] = themeArray[0].split(" "); + applyTheme(themeName, flags); + return { include, exclude, prefix }; + } + themeArray.forEach((themeOption) => { + const [themeName, ...flags] = themeOption.split(" "); + if (flags.includes("--default")) { + applyTheme(themeName, ["--default"]); + } + }); + themeArray.forEach((themeOption) => { + const [themeName, ...flags] = themeOption.split(" "); + if (flags.includes("--prefersdark")) { + const darkSelector = root === ":root" ? ":root:not([data-theme])" : `${root}:not([data-theme])`; + addBase({ + "@media (prefers-color-scheme: dark)": { [darkSelector]: themesObject[themeName] } + }); + } + }); + themeArray.forEach((themeOption) => { + const [themeName] = themeOption.split(" "); + applyTheme(themeName, []); + }); + } + return { include, exclude, prefix }; + }; +})(); + +// packages/daisyui/functions/plugin.js +var plugin = { + withOptions: (pluginFunction, configFunction = () => ({})) => { + const optionsFunction = (options) => { + const handler = pluginFunction(options); + const config = configFunction(options); + return { handler, config }; + }; + optionsFunction.__isOptionsFunction = true; + return optionsFunction; + } +}; + +// packages/daisyui/functions/variables.js +var variables_default = { + colors: { + "base-100": "var(--color-base-100)", + "base-200": "var(--color-base-200)", + "base-300": "var(--color-base-300)", + "base-content": "var(--color-base-content)", + primary: "var(--color-primary)", + "primary-content": "var(--color-primary-content)", + secondary: "var(--color-secondary)", + "secondary-content": "var(--color-secondary-content)", + accent: "var(--color-accent)", + "accent-content": "var(--color-accent-content)", + neutral: "var(--color-neutral)", + "neutral-content": "var(--color-neutral-content)", + info: "var(--color-info)", + "info-content": "var(--color-info-content)", + success: "var(--color-success)", + "success-content": "var(--color-success-content)", + warning: "var(--color-warning)", + "warning-content": "var(--color-warning-content)", + error: "var(--color-error)", + "error-content": "var(--color-error-content)" + }, + borderRadius: { + selector: "var(--radius-selector)", + field: "var(--radius-field)", + box: "var(--radius-box)" + } +}; + +// packages/daisyui/theme/object.js +var object_default = { retro: { "color-scheme": "light", "--color-base-100": "oklch(91.637% 0.034 90.515)", "--color-base-200": "oklch(88.272% 0.049 91.774)", "--color-base-300": "oklch(84.133% 0.065 90.856)", "--color-base-content": "oklch(41% 0.112 45.904)", "--color-primary": "oklch(80% 0.114 19.571)", "--color-primary-content": "oklch(39% 0.141 25.723)", "--color-secondary": "oklch(92% 0.084 155.995)", "--color-secondary-content": "oklch(44% 0.119 151.328)", "--color-accent": "oklch(68% 0.162 75.834)", "--color-accent-content": "oklch(41% 0.112 45.904)", "--color-neutral": "oklch(44% 0.011 73.639)", "--color-neutral-content": "oklch(86% 0.005 56.366)", "--color-info": "oklch(58% 0.158 241.966)", "--color-info-content": "oklch(96% 0.059 95.617)", "--color-success": "oklch(51% 0.096 186.391)", "--color-success-content": "oklch(96% 0.059 95.617)", "--color-warning": "oklch(64% 0.222 41.116)", "--color-warning-content": "oklch(96% 0.059 95.617)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(40% 0.123 38.172)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, bumblebee: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(92% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(85% 0.199 91.936)", "--color-primary-content": "oklch(42% 0.095 57.708)", "--color-secondary": "oklch(75% 0.183 55.934)", "--color-secondary-content": "oklch(40% 0.123 38.172)", "--color-accent": "oklch(0% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(37% 0.01 67.558)", "--color-neutral-content": "oklch(92% 0.003 48.717)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(39% 0.09 240.876)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, fantasy: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(27.807% 0.029 256.847)", "--color-primary": "oklch(37.45% 0.189 325.02)", "--color-primary-content": "oklch(87.49% 0.037 325.02)", "--color-secondary": "oklch(53.92% 0.162 241.36)", "--color-secondary-content": "oklch(90.784% 0.032 241.36)", "--color-accent": "oklch(75.98% 0.204 56.72)", "--color-accent-content": "oklch(15.196% 0.04 56.72)", "--color-neutral": "oklch(27.807% 0.029 256.847)", "--color-neutral-content": "oklch(85.561% 0.005 256.847)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, aqua: { "color-scheme": "dark", "--color-base-100": "oklch(37% 0.146 265.522)", "--color-base-200": "oklch(28% 0.091 267.935)", "--color-base-300": "oklch(22% 0.091 267.935)", "--color-base-content": "oklch(90% 0.058 230.902)", "--color-primary": "oklch(85.661% 0.144 198.645)", "--color-primary-content": "oklch(40.124% 0.068 197.603)", "--color-secondary": "oklch(60.682% 0.108 309.782)", "--color-secondary-content": "oklch(96% 0.016 293.756)", "--color-accent": "oklch(93.426% 0.102 94.555)", "--color-accent-content": "oklch(18.685% 0.02 94.555)", "--color-neutral": "oklch(27% 0.146 265.522)", "--color-neutral-content": "oklch(80% 0.146 265.522)", "--color-info": "oklch(54.615% 0.215 262.88)", "--color-info-content": "oklch(90.923% 0.043 262.88)", "--color-success": "oklch(62.705% 0.169 149.213)", "--color-success-content": "oklch(12.541% 0.033 149.213)", "--color-warning": "oklch(66.584% 0.157 58.318)", "--color-warning-content": "oklch(27% 0.077 45.635)", "--color-error": "oklch(73.95% 0.19 27.33)", "--color-error-content": "oklch(14.79% 0.038 27.33)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, garden: { "color-scheme": "light", "--color-base-100": "oklch(92.951% 0.002 17.197)", "--color-base-200": "oklch(86.445% 0.002 17.197)", "--color-base-300": "oklch(79.938% 0.001 17.197)", "--color-base-content": "oklch(16.961% 0.001 17.32)", "--color-primary": "oklch(62.45% 0.278 3.836)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(48.495% 0.11 355.095)", "--color-secondary-content": "oklch(89.699% 0.022 355.095)", "--color-accent": "oklch(56.273% 0.054 154.39)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(24.155% 0.049 89.07)", "--color-neutral-content": "oklch(92.951% 0.002 17.197)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, coffee: { "color-scheme": "dark", "--color-base-100": "oklch(24% 0.023 329.708)", "--color-base-200": "oklch(21% 0.021 329.708)", "--color-base-300": "oklch(16% 0.019 329.708)", "--color-base-content": "oklch(72.354% 0.092 79.129)", "--color-primary": "oklch(71.996% 0.123 62.756)", "--color-primary-content": "oklch(14.399% 0.024 62.756)", "--color-secondary": "oklch(34.465% 0.029 199.194)", "--color-secondary-content": "oklch(86.893% 0.005 199.194)", "--color-accent": "oklch(42.621% 0.074 224.389)", "--color-accent-content": "oklch(88.524% 0.014 224.389)", "--color-neutral": "oklch(16.51% 0.015 326.261)", "--color-neutral-content": "oklch(83.302% 0.003 326.261)", "--color-info": "oklch(79.49% 0.063 184.558)", "--color-info-content": "oklch(15.898% 0.012 184.558)", "--color-success": "oklch(74.722% 0.072 131.116)", "--color-success-content": "oklch(14.944% 0.014 131.116)", "--color-warning": "oklch(88.15% 0.14 87.722)", "--color-warning-content": "oklch(17.63% 0.028 87.722)", "--color-error": "oklch(77.318% 0.128 31.871)", "--color-error-content": "oklch(15.463% 0.025 31.871)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, pastel: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98.462% 0.001 247.838)", "--color-base-300": "oklch(92.462% 0.001 247.838)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(90% 0.063 306.703)", "--color-primary-content": "oklch(49% 0.265 301.924)", "--color-secondary": "oklch(89% 0.058 10.001)", "--color-secondary-content": "oklch(51% 0.222 16.935)", "--color-accent": "oklch(90% 0.093 164.15)", "--color-accent-content": "oklch(50% 0.118 165.612)", "--color-neutral": "oklch(55% 0.046 257.417)", "--color-neutral-content": "oklch(92% 0.013 255.508)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(52% 0.105 223.128)", "--color-success": "oklch(87% 0.15 154.449)", "--color-success-content": "oklch(52% 0.154 150.069)", "--color-warning": "oklch(83% 0.128 66.29)", "--color-warning-content": "oklch(55% 0.195 38.402)", "--color-error": "oklch(80% 0.114 19.571)", "--color-error-content": "oklch(50% 0.213 27.518)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "0", "--noise": "0" }, halloween: { "color-scheme": "dark", "--color-base-100": "oklch(26% 0.04 278)", "--color-base-200": "oklch(14% 0.025 275)", "--color-base-300": "oklch(10% 0.02 272)", "--color-base-content": "oklch(95% 0.008 265)", "--color-primary": "oklch(65% 0.2 293)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(60% 0.2 277)", "--color-secondary-content": "oklch(96% 0.015 277)", "--color-accent": "oklch(68% 0.18 293)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(27% 0.035 278)", "--color-neutral-content": "oklch(88% 0.015 270)", "--color-info": "oklch(72% 0.16 237)", "--color-info-content": "oklch(100% 0 0)", "--color-success": "oklch(72% 0.18 155)", "--color-success-content": "oklch(100% 0 0)", "--color-warning": "oklch(82% 0.16 75)", "--color-warning-content": "oklch(95% 0.04 85)", "--color-error": "oklch(70% 0.2 25)", "--color-error-content": "oklch(100% 0 0)", "--radius-selector": "0.5rem", "--radius-field": "0.375rem", "--radius-box": "0.75rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, cupcake: { "color-scheme": "light", "--color-base-100": "oklch(97.788% 0.004 56.375)", "--color-base-200": "oklch(93.982% 0.007 61.449)", "--color-base-300": "oklch(91.586% 0.006 53.44)", "--color-base-content": "oklch(23.574% 0.066 313.189)", "--color-primary": "oklch(85% 0.138 181.071)", "--color-primary-content": "oklch(43% 0.078 188.216)", "--color-secondary": "oklch(89% 0.061 343.231)", "--color-secondary-content": "oklch(45% 0.187 3.815)", "--color-accent": "oklch(90% 0.076 70.697)", "--color-accent-content": "oklch(47% 0.157 37.304)", "--color-neutral": "oklch(27% 0.006 286.033)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(68% 0.169 237.323)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(69% 0.17 162.48)", "--color-success-content": "oklch(26% 0.051 172.552)", "--color-warning": "oklch(79% 0.184 86.047)", "--color-warning-content": "oklch(28% 0.066 53.813)", "--color-error": "oklch(64% 0.246 16.439)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, lofi: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(15.906% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(21.455% 0.001 17.278)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(26.861% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(79.54% 0.103 205.9)", "--color-info-content": "oklch(15.908% 0.02 205.9)", "--color-success": "oklch(90.13% 0.153 164.14)", "--color-success-content": "oklch(18.026% 0.03 164.14)", "--color-warning": "oklch(88.37% 0.135 79.94)", "--color-warning-content": "oklch(17.674% 0.027 79.94)", "--color-error": "oklch(78.66% 0.15 28.47)", "--color-error-content": "oklch(15.732% 0.03 28.47)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, emerald: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(35.519% 0.032 262.988)", "--color-primary": "oklch(76.662% 0.135 153.45)", "--color-primary-content": "oklch(33.387% 0.04 162.24)", "--color-secondary": "oklch(61.302% 0.202 261.294)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(72.772% 0.149 33.2)", "--color-accent-content": "oklch(0% 0 0)", "--color-neutral": "oklch(35.519% 0.032 262.988)", "--color-neutral-content": "oklch(98.462% 0.001 247.838)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, night: { "color-scheme": "dark", "--color-base-100": "oklch(20.768% 0.039 265.754)", "--color-base-200": "oklch(19.314% 0.037 265.754)", "--color-base-300": "oklch(17.86% 0.034 265.754)", "--color-base-content": "oklch(84.153% 0.007 265.754)", "--color-primary": "oklch(75.351% 0.138 232.661)", "--color-primary-content": "oklch(15.07% 0.027 232.661)", "--color-secondary": "oklch(68.011% 0.158 276.934)", "--color-secondary-content": "oklch(13.602% 0.031 276.934)", "--color-accent": "oklch(72.36% 0.176 350.048)", "--color-accent-content": "oklch(14.472% 0.035 350.048)", "--color-neutral": "oklch(27.949% 0.036 260.03)", "--color-neutral-content": "oklch(85.589% 0.007 260.03)", "--color-info": "oklch(68.455% 0.148 237.251)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(78.452% 0.132 181.911)", "--color-success-content": "oklch(15.69% 0.026 181.911)", "--color-warning": "oklch(83.242% 0.139 82.95)", "--color-warning-content": "oklch(16.648% 0.027 82.95)", "--color-error": "oklch(71.785% 0.17 13.118)", "--color-error-content": "oklch(14.357% 0.034 13.118)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dark: { "color-scheme": "dark", "--color-base-100": "oklch(25.33% 0.016 252.42)", "--color-base-200": "oklch(23.26% 0.014 253.1)", "--color-base-300": "oklch(21.15% 0.012 254.09)", "--color-base-content": "oklch(97.807% 0.029 256.847)", "--color-primary": "oklch(58% 0.233 277.117)", "--color-primary-content": "oklch(96% 0.018 272.314)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, synthwave: { "color-scheme": "dark", "--color-base-100": "oklch(15% 0.09 281.288)", "--color-base-200": "oklch(20% 0.09 281.288)", "--color-base-300": "oklch(25% 0.09 281.288)", "--color-base-content": "oklch(78% 0.115 274.713)", "--color-primary": "oklch(71% 0.202 349.761)", "--color-primary-content": "oklch(28% 0.109 3.907)", "--color-secondary": "oklch(82% 0.111 230.318)", "--color-secondary-content": "oklch(29% 0.066 243.157)", "--color-accent": "oklch(75% 0.183 55.934)", "--color-accent-content": "oklch(26% 0.079 36.259)", "--color-neutral": "oklch(45% 0.24 277.023)", "--color-neutral-content": "oklch(87% 0.065 274.039)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(77% 0.152 181.912)", "--color-success-content": "oklch(27% 0.046 192.524)", "--color-warning": "oklch(90% 0.182 98.111)", "--color-warning-content": "oklch(42% 0.095 57.708)", "--color-error": "oklch(73.7% 0.121 32.639)", "--color-error-content": "oklch(23.501% 0.096 290.329)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, light: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(98% 0 0)", "--color-base-300": "oklch(95% 0 0)", "--color-base-content": "oklch(21% 0.006 285.885)", "--color-primary": "oklch(45% 0.24 277.023)", "--color-primary-content": "oklch(93% 0.034 272.788)", "--color-secondary": "oklch(65% 0.241 354.308)", "--color-secondary-content": "oklch(94% 0.028 342.258)", "--color-accent": "oklch(77% 0.152 181.912)", "--color-accent-content": "oklch(38% 0.063 188.416)", "--color-neutral": "oklch(14% 0.005 285.823)", "--color-neutral-content": "oklch(92% 0.004 286.32)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(76% 0.177 163.223)", "--color-success-content": "oklch(37% 0.077 168.94)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(71% 0.194 13.428)", "--color-error-content": "oklch(27% 0.105 12.094)", "--radius-selector": "0.5rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, silk: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.0035 67.78)", "--color-base-200": "oklch(95% 0.0081 61.42)", "--color-base-300": "oklch(90% 0.0081 61.42)", "--color-base-content": "oklch(40% 0.0081 61.42)", "--color-primary": "oklch(23.27% 0.0249 284.3)", "--color-primary-content": "oklch(94.22% 0.2505 117.44)", "--color-secondary": "oklch(23.27% 0.0249 284.3)", "--color-secondary-content": "oklch(73.92% 0.2135 50.94)", "--color-accent": "oklch(23.27% 0.0249 284.3)", "--color-accent-content": "oklch(88.92% 0.2061 189.9)", "--color-neutral": "oklch(20% 0 0)", "--color-neutral-content": "oklch(80% 0.0081 61.42)", "--color-info": "oklch(80.39% 0.1148 241.68)", "--color-info-content": "oklch(30.39% 0.1148 241.68)", "--color-success": "oklch(83.92% 0.0901 136.87)", "--color-success-content": "oklch(23.92% 0.0901 136.87)", "--color-warning": "oklch(83.92% 0.1085 80)", "--color-warning-content": "oklch(43.92% 0.1085 80)", "--color-error": "oklch(75.1% 0.1814 22.37)", "--color-error-content": "oklch(35.1% 0.1814 22.37)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "0" }, nord: { "color-scheme": "light", "--color-base-100": "oklch(95.127% 0.007 260.731)", "--color-base-200": "oklch(93.299% 0.01 261.788)", "--color-base-300": "oklch(89.925% 0.016 262.749)", "--color-base-content": "oklch(32.437% 0.022 264.182)", "--color-primary": "oklch(59.435% 0.077 254.027)", "--color-primary-content": "oklch(11.887% 0.015 254.027)", "--color-secondary": "oklch(69.651% 0.059 248.687)", "--color-secondary-content": "oklch(13.93% 0.011 248.687)", "--color-accent": "oklch(77.464% 0.062 217.469)", "--color-accent-content": "oklch(15.492% 0.012 217.469)", "--color-neutral": "oklch(45.229% 0.035 264.131)", "--color-neutral-content": "oklch(89.925% 0.016 262.749)", "--color-info": "oklch(69.207% 0.062 332.664)", "--color-info-content": "oklch(13.841% 0.012 332.664)", "--color-success": "oklch(76.827% 0.074 131.063)", "--color-success-content": "oklch(15.365% 0.014 131.063)", "--color-warning": "oklch(85.486% 0.089 84.093)", "--color-warning-content": "oklch(17.097% 0.017 84.093)", "--color-error": "oklch(60.61% 0.12 15.341)", "--color-error-content": "oklch(12.122% 0.024 15.341)", "--radius-selector": "1rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dim: { "color-scheme": "dark", "--color-base-100": "oklch(30.857% 0.023 264.149)", "--color-base-200": "oklch(28.036% 0.019 264.182)", "--color-base-300": "oklch(26.346% 0.018 262.177)", "--color-base-content": "oklch(82.901% 0.031 222.959)", "--color-primary": "oklch(86.133% 0.141 139.549)", "--color-primary-content": "oklch(17.226% 0.028 139.549)", "--color-secondary": "oklch(73.375% 0.165 35.353)", "--color-secondary-content": "oklch(14.675% 0.033 35.353)", "--color-accent": "oklch(74.229% 0.133 311.379)", "--color-accent-content": "oklch(14.845% 0.026 311.379)", "--color-neutral": "oklch(24.731% 0.02 264.094)", "--color-neutral-content": "oklch(82.901% 0.031 222.959)", "--color-info": "oklch(86.078% 0.142 206.182)", "--color-info-content": "oklch(17.215% 0.028 206.182)", "--color-success": "oklch(86.171% 0.142 166.534)", "--color-success-content": "oklch(17.234% 0.028 166.534)", "--color-warning": "oklch(86.163% 0.142 94.818)", "--color-warning-content": "oklch(17.232% 0.028 94.818)", "--color-error": "oklch(82.418% 0.099 33.756)", "--color-error-content": "oklch(16.483% 0.019 33.756)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, business: { "color-scheme": "dark", "--color-base-100": "oklch(24.353% 0 0)", "--color-base-200": "oklch(22.648% 0 0)", "--color-base-300": "oklch(20.944% 0 0)", "--color-base-content": "oklch(84.87% 0 0)", "--color-primary": "oklch(41.703% 0.099 251.473)", "--color-primary-content": "oklch(88.34% 0.019 251.473)", "--color-secondary": "oklch(64.092% 0.027 229.389)", "--color-secondary-content": "oklch(12.818% 0.005 229.389)", "--color-accent": "oklch(67.271% 0.167 35.791)", "--color-accent-content": "oklch(13.454% 0.033 35.791)", "--color-neutral": "oklch(27.441% 0.013 253.041)", "--color-neutral-content": "oklch(85.488% 0.002 253.041)", "--color-info": "oklch(62.616% 0.143 240.033)", "--color-info-content": "oklch(12.523% 0.028 240.033)", "--color-success": "oklch(70.226% 0.094 156.596)", "--color-success-content": "oklch(14.045% 0.018 156.596)", "--color-warning": "oklch(77.482% 0.115 81.519)", "--color-warning-content": "oklch(15.496% 0.023 81.519)", "--color-error": "oklch(51.61% 0.146 29.674)", "--color-error-content": "oklch(90.322% 0.029 29.674)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, corporate: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(93% 0 0)", "--color-base-300": "oklch(86% 0 0)", "--color-base-content": "oklch(22.389% 0.031 278.072)", "--color-primary": "oklch(58% 0.158 241.966)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(55% 0.046 257.417)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(60% 0.118 184.704)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(0% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(60% 0.126 221.723)", "--color-info-content": "oklch(100% 0 0)", "--color-success": "oklch(62% 0.194 149.214)", "--color-success-content": "oklch(100% 0 0)", "--color-warning": "oklch(85% 0.199 91.936)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0.25rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, acid: { "color-scheme": "light", "--color-base-100": "oklch(98% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(91% 0 0)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(71.9% 0.357 330.759)", "--color-primary-content": "oklch(14.38% 0.071 330.759)", "--color-secondary": "oklch(73.37% 0.224 48.25)", "--color-secondary-content": "oklch(14.674% 0.044 48.25)", "--color-accent": "oklch(92.78% 0.264 122.962)", "--color-accent-content": "oklch(18.556% 0.052 122.962)", "--color-neutral": "oklch(21.31% 0.128 278.68)", "--color-neutral-content": "oklch(84.262% 0.025 278.68)", "--color-info": "oklch(60.72% 0.227 252.05)", "--color-info-content": "oklch(12.144% 0.045 252.05)", "--color-success": "oklch(85.72% 0.266 158.53)", "--color-success-content": "oklch(17.144% 0.053 158.53)", "--color-warning": "oklch(91.01% 0.212 100.5)", "--color-warning-content": "oklch(18.202% 0.042 100.5)", "--color-error": "oklch(64.84% 0.293 29.349)", "--color-error-content": "oklch(12.968% 0.058 29.349)", "--radius-selector": "1rem", "--radius-field": "1rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, caramellatte: { "color-scheme": "light", "--color-base-100": "oklch(98% 0.016 73.684)", "--color-base-200": "oklch(95% 0.038 75.164)", "--color-base-300": "oklch(90% 0.076 70.697)", "--color-base-content": "oklch(40% 0.123 38.172)", "--color-primary": "oklch(0% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(22.45% 0.075 37.85)", "--color-secondary-content": "oklch(90% 0.076 70.697)", "--color-accent": "oklch(46.44% 0.111 37.85)", "--color-accent-content": "oklch(90% 0.076 70.697)", "--color-neutral": "oklch(55% 0.195 38.402)", "--color-neutral-content": "oklch(98% 0.016 73.684)", "--color-info": "oklch(42% 0.199 265.638)", "--color-info-content": "oklch(90% 0.076 70.697)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.076 70.697)", "--color-warning": "oklch(82% 0.189 84.429)", "--color-warning-content": "oklch(41% 0.112 45.904)", "--color-error": "oklch(70% 0.191 22.216)", "--color-error-content": "oklch(39% 0.141 25.723)", "--radius-selector": "2rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "2px", "--depth": "1", "--noise": "1" }, sunset: { "color-scheme": "dark", "--color-base-100": "oklch(22% 0.019 237.69)", "--color-base-200": "oklch(20% 0.019 237.69)", "--color-base-300": "oklch(18% 0.019 237.69)", "--color-base-content": "oklch(77.383% 0.043 245.096)", "--color-primary": "oklch(74.703% 0.158 39.947)", "--color-primary-content": "oklch(14.94% 0.031 39.947)", "--color-secondary": "oklch(72.537% 0.177 2.72)", "--color-secondary-content": "oklch(14.507% 0.035 2.72)", "--color-accent": "oklch(71.294% 0.166 299.844)", "--color-accent-content": "oklch(14.258% 0.033 299.844)", "--color-neutral": "oklch(26% 0.019 237.69)", "--color-neutral-content": "oklch(70% 0.019 237.69)", "--color-info": "oklch(85.559% 0.085 206.015)", "--color-info-content": "oklch(17.111% 0.017 206.015)", "--color-success": "oklch(85.56% 0.085 144.778)", "--color-success-content": "oklch(17.112% 0.017 144.778)", "--color-warning": "oklch(85.569% 0.084 74.427)", "--color-warning-content": "oklch(17.113% 0.016 74.427)", "--color-error": "oklch(85.511% 0.078 16.886)", "--color-error-content": "oklch(17.102% 0.015 16.886)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, forest: { "color-scheme": "dark", "--color-base-100": "oklch(20.84% 0.008 17.911)", "--color-base-200": "oklch(18.522% 0.007 17.911)", "--color-base-300": "oklch(16.203% 0.007 17.911)", "--color-base-content": "oklch(83.768% 0.001 17.911)", "--color-primary": "oklch(68.628% 0.185 148.958)", "--color-primary-content": "oklch(0% 0 0)", "--color-secondary": "oklch(69.776% 0.135 168.327)", "--color-secondary-content": "oklch(13.955% 0.027 168.327)", "--color-accent": "oklch(70.628% 0.119 185.713)", "--color-accent-content": "oklch(14.125% 0.023 185.713)", "--color-neutral": "oklch(30.698% 0.039 171.364)", "--color-neutral-content": "oklch(86.139% 0.007 171.364)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, dracula: { "color-scheme": "dark", "--color-base-100": "oklch(28.822% 0.022 277.508)", "--color-base-200": "oklch(26.805% 0.02 277.508)", "--color-base-300": "oklch(24.787% 0.019 277.508)", "--color-base-content": "oklch(97.747% 0.007 106.545)", "--color-primary": "oklch(75.461% 0.183 346.812)", "--color-primary-content": "oklch(15.092% 0.036 346.812)", "--color-secondary": "oklch(74.202% 0.148 301.883)", "--color-secondary-content": "oklch(14.84% 0.029 301.883)", "--color-accent": "oklch(83.392% 0.124 66.558)", "--color-accent-content": "oklch(16.678% 0.024 66.558)", "--color-neutral": "oklch(39.445% 0.032 275.524)", "--color-neutral-content": "oklch(87.889% 0.006 275.524)", "--color-info": "oklch(88.263% 0.093 212.846)", "--color-info-content": "oklch(17.652% 0.018 212.846)", "--color-success": "oklch(87.099% 0.219 148.024)", "--color-success-content": "oklch(17.419% 0.043 148.024)", "--color-warning": "oklch(95.533% 0.134 112.757)", "--color-warning-content": "oklch(19.106% 0.026 112.757)", "--color-error": "oklch(68.22% 0.206 24.43)", "--color-error-content": "oklch(13.644% 0.041 24.43)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, autumn: { "color-scheme": "light", "--color-base-100": "oklch(95.814% 0 0)", "--color-base-200": "oklch(89.107% 0 0)", "--color-base-300": "oklch(82.4% 0 0)", "--color-base-content": "oklch(19.162% 0 0)", "--color-primary": "oklch(40.723% 0.161 17.53)", "--color-primary-content": "oklch(88.144% 0.032 17.53)", "--color-secondary": "oklch(61.676% 0.169 23.865)", "--color-secondary-content": "oklch(12.335% 0.033 23.865)", "--color-accent": "oklch(73.425% 0.094 60.729)", "--color-accent-content": "oklch(14.685% 0.018 60.729)", "--color-neutral": "oklch(54.367% 0.037 51.902)", "--color-neutral-content": "oklch(90.873% 0.007 51.902)", "--color-info": "oklch(69.224% 0.097 207.284)", "--color-info-content": "oklch(13.844% 0.019 207.284)", "--color-success": "oklch(60.995% 0.08 174.616)", "--color-success-content": "oklch(12.199% 0.016 174.616)", "--color-warning": "oklch(70.081% 0.164 56.844)", "--color-warning-content": "oklch(14.016% 0.032 56.844)", "--color-error": "oklch(53.07% 0.241 24.16)", "--color-error-content": "oklch(90.614% 0.048 24.16)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, wireframe: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97% 0 0)", "--color-base-300": "oklch(94% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(87% 0 0)", "--color-primary-content": "oklch(26% 0 0)", "--color-secondary": "oklch(87% 0 0)", "--color-secondary-content": "oklch(26% 0 0)", "--color-accent": "oklch(87% 0 0)", "--color-accent-content": "oklch(26% 0 0)", "--color-neutral": "oklch(87% 0 0)", "--color-neutral-content": "oklch(26% 0 0)", "--color-info": "oklch(44% 0.11 240.79)", "--color-info-content": "oklch(90% 0.058 230.902)", "--color-success": "oklch(43% 0.095 166.913)", "--color-success-content": "oklch(90% 0.093 164.15)", "--color-warning": "oklch(47% 0.137 46.201)", "--color-warning-content": "oklch(92% 0.12 95.746)", "--color-error": "oklch(44% 0.177 26.899)", "--color-error-content": "oklch(88% 0.062 18.334)", "--radius-selector": "0rem", "--radius-field": "0.25rem", "--radius-box": "0.25rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, luxury: { "color-scheme": "dark", "--color-base-100": "oklch(14.076% 0.004 285.822)", "--color-base-200": "oklch(20.219% 0.004 308.229)", "--color-base-300": "oklch(23.219% 0.004 308.229)", "--color-base-content": "oklch(75.687% 0.123 76.89)", "--color-primary": "oklch(100% 0 0)", "--color-primary-content": "oklch(20% 0 0)", "--color-secondary": "oklch(27.581% 0.064 261.069)", "--color-secondary-content": "oklch(85.516% 0.012 261.069)", "--color-accent": "oklch(36.674% 0.051 338.825)", "--color-accent-content": "oklch(87.334% 0.01 338.825)", "--color-neutral": "oklch(24.27% 0.057 59.825)", "--color-neutral-content": "oklch(93.203% 0.089 90.861)", "--color-info": "oklch(79.061% 0.121 237.133)", "--color-info-content": "oklch(15.812% 0.024 237.133)", "--color-success": "oklch(78.119% 0.192 132.154)", "--color-success-content": "oklch(15.623% 0.038 132.154)", "--color-warning": "oklch(86.127% 0.136 102.891)", "--color-warning-content": "oklch(17.225% 0.027 102.891)", "--color-error": "oklch(71.753% 0.176 22.568)", "--color-error-content": "oklch(14.35% 0.035 22.568)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, abyss: { "color-scheme": "dark", "--color-base-100": "oklch(20% 0.08 209)", "--color-base-200": "oklch(15% 0.08 209)", "--color-base-300": "oklch(10% 0.08 209)", "--color-base-content": "oklch(90% 0.076 70.697)", "--color-primary": "oklch(92% 0.2653 125)", "--color-primary-content": "oklch(50% 0.2653 125)", "--color-secondary": "oklch(83.27% 0.0764 298.3)", "--color-secondary-content": "oklch(43.27% 0.0764 298.3)", "--color-accent": "oklch(43% 0 0)", "--color-accent-content": "oklch(98% 0 0)", "--color-neutral": "oklch(30% 0.08 209)", "--color-neutral-content": "oklch(90% 0.076 70.697)", "--color-info": "oklch(74% 0.16 232.661)", "--color-info-content": "oklch(29% 0.066 243.157)", "--color-success": "oklch(79% 0.209 151.711)", "--color-success-content": "oklch(26% 0.065 152.934)", "--color-warning": "oklch(84.8% 0.1962 84.62)", "--color-warning-content": "oklch(44.8% 0.1962 84.62)", "--color-error": "oklch(65% 0.1985 24.22)", "--color-error-content": "oklch(27% 0.1985 24.22)", "--radius-selector": "2rem", "--radius-field": "0.25rem", "--radius-box": "0.5rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "1", "--noise": "0" }, valentine: { "color-scheme": "light", "--color-base-100": "oklch(97% 0.014 343.198)", "--color-base-200": "oklch(94% 0.028 342.258)", "--color-base-300": "oklch(89% 0.061 343.231)", "--color-base-content": "oklch(52% 0.223 3.958)", "--color-primary": "oklch(65% 0.241 354.308)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(62% 0.265 303.9)", "--color-secondary-content": "oklch(97% 0.014 308.299)", "--color-accent": "oklch(82% 0.111 230.318)", "--color-accent-content": "oklch(39% 0.09 240.876)", "--color-neutral": "oklch(40% 0.153 2.432)", "--color-neutral-content": "oklch(89% 0.061 343.231)", "--color-info": "oklch(86% 0.127 207.078)", "--color-info-content": "oklch(44% 0.11 240.79)", "--color-success": "oklch(84% 0.143 164.978)", "--color-success-content": "oklch(43% 0.095 166.913)", "--color-warning": "oklch(75% 0.183 55.934)", "--color-warning-content": "oklch(26% 0.079 36.259)", "--color-error": "oklch(63% 0.237 25.331)", "--color-error-content": "oklch(97% 0.013 17.38)", "--radius-selector": "1rem", "--radius-field": "2rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, cyberpunk: { "color-scheme": "light", "--color-base-100": "oklch(94.51% 0.179 104.32)", "--color-base-200": "oklch(91.51% 0.179 104.32)", "--color-base-300": "oklch(85.51% 0.179 104.32)", "--color-base-content": "oklch(0% 0 0)", "--color-primary": "oklch(74.22% 0.209 6.35)", "--color-primary-content": "oklch(14.844% 0.041 6.35)", "--color-secondary": "oklch(83.33% 0.184 204.72)", "--color-secondary-content": "oklch(16.666% 0.036 204.72)", "--color-accent": "oklch(71.86% 0.217 310.43)", "--color-accent-content": "oklch(14.372% 0.043 310.43)", "--color-neutral": "oklch(23.04% 0.065 269.31)", "--color-neutral-content": "oklch(94.51% 0.179 104.32)", "--color-info": "oklch(72.06% 0.191 231.6)", "--color-info-content": "oklch(0% 0 0)", "--color-success": "oklch(64.8% 0.15 160)", "--color-success-content": "oklch(0% 0 0)", "--color-warning": "oklch(84.71% 0.199 83.87)", "--color-warning-content": "oklch(0% 0 0)", "--color-error": "oklch(71.76% 0.221 22.18)", "--color-error-content": "oklch(0% 0 0)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, lemonade: { "color-scheme": "light", "--color-base-100": "oklch(98.71% 0.02 123.72)", "--color-base-200": "oklch(91.8% 0.018 123.72)", "--color-base-300": "oklch(84.89% 0.017 123.72)", "--color-base-content": "oklch(19.742% 0.004 123.72)", "--color-primary": "oklch(58.92% 0.199 134.6)", "--color-primary-content": "oklch(11.784% 0.039 134.6)", "--color-secondary": "oklch(77.75% 0.196 111.09)", "--color-secondary-content": "oklch(15.55% 0.039 111.09)", "--color-accent": "oklch(85.39% 0.201 100.73)", "--color-accent-content": "oklch(17.078% 0.04 100.73)", "--color-neutral": "oklch(30.98% 0.075 108.6)", "--color-neutral-content": "oklch(86.196% 0.015 108.6)", "--color-info": "oklch(86.19% 0.047 224.14)", "--color-info-content": "oklch(17.238% 0.009 224.14)", "--color-success": "oklch(86.19% 0.047 157.85)", "--color-success-content": "oklch(17.238% 0.009 157.85)", "--color-warning": "oklch(86.19% 0.047 102.15)", "--color-warning-content": "oklch(17.238% 0.009 102.15)", "--color-error": "oklch(86.19% 0.047 25.85)", "--color-error-content": "oklch(17.238% 0.009 25.85)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, winter: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(97.466% 0.011 259.822)", "--color-base-300": "oklch(93.268% 0.016 262.751)", "--color-base-content": "oklch(41.886% 0.053 255.824)", "--color-primary": "oklch(56.86% 0.255 257.57)", "--color-primary-content": "oklch(91.372% 0.051 257.57)", "--color-secondary": "oklch(42.551% 0.161 282.339)", "--color-secondary-content": "oklch(88.51% 0.032 282.339)", "--color-accent": "oklch(59.939% 0.191 335.171)", "--color-accent-content": "oklch(11.988% 0.038 335.171)", "--color-neutral": "oklch(19.616% 0.063 257.651)", "--color-neutral-content": "oklch(83.923% 0.012 257.651)", "--color-info": "oklch(88.127% 0.085 214.515)", "--color-info-content": "oklch(17.625% 0.017 214.515)", "--color-success": "oklch(80.494% 0.077 197.823)", "--color-success-content": "oklch(16.098% 0.015 197.823)", "--color-warning": "oklch(89.172% 0.045 71.47)", "--color-warning-content": "oklch(17.834% 0.009 71.47)", "--color-error": "oklch(73.092% 0.11 20.076)", "--color-error-content": "oklch(14.618% 0.022 20.076)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, black: { "color-scheme": "dark", "--color-base-100": "oklch(0% 0 0)", "--color-base-200": "oklch(19% 0 0)", "--color-base-300": "oklch(22% 0 0)", "--color-base-content": "oklch(87.609% 0 0)", "--color-primary": "oklch(35% 0 0)", "--color-primary-content": "oklch(100% 0 0)", "--color-secondary": "oklch(35% 0 0)", "--color-secondary-content": "oklch(100% 0 0)", "--color-accent": "oklch(35% 0 0)", "--color-accent-content": "oklch(100% 0 0)", "--color-neutral": "oklch(35% 0 0)", "--color-neutral-content": "oklch(100% 0 0)", "--color-info": "oklch(45.201% 0.313 264.052)", "--color-info-content": "oklch(89.04% 0.062 264.052)", "--color-success": "oklch(51.975% 0.176 142.495)", "--color-success-content": "oklch(90.395% 0.035 142.495)", "--color-warning": "oklch(96.798% 0.211 109.769)", "--color-warning-content": "oklch(19.359% 0.042 109.769)", "--color-error": "oklch(62.795% 0.257 29.233)", "--color-error-content": "oklch(12.559% 0.051 29.233)", "--radius-selector": "0rem", "--radius-field": "0rem", "--radius-box": "0rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" }, cmyk: { "color-scheme": "light", "--color-base-100": "oklch(100% 0 0)", "--color-base-200": "oklch(95% 0 0)", "--color-base-300": "oklch(90% 0 0)", "--color-base-content": "oklch(20% 0 0)", "--color-primary": "oklch(71.772% 0.133 239.443)", "--color-primary-content": "oklch(14.354% 0.026 239.443)", "--color-secondary": "oklch(64.476% 0.202 359.339)", "--color-secondary-content": "oklch(12.895% 0.04 359.339)", "--color-accent": "oklch(94.228% 0.189 105.306)", "--color-accent-content": "oklch(18.845% 0.037 105.306)", "--color-neutral": "oklch(21.778% 0 0)", "--color-neutral-content": "oklch(84.355% 0 0)", "--color-info": "oklch(68.475% 0.094 217.284)", "--color-info-content": "oklch(13.695% 0.018 217.284)", "--color-success": "oklch(46.949% 0.162 321.406)", "--color-success-content": "oklch(89.389% 0.032 321.406)", "--color-warning": "oklch(71.236% 0.159 52.023)", "--color-warning-content": "oklch(14.247% 0.031 52.023)", "--color-error": "oklch(62.013% 0.208 28.717)", "--color-error-content": "oklch(12.402% 0.041 28.717)", "--radius-selector": "1rem", "--radius-field": "0.5rem", "--radius-box": "1rem", "--size-selector": "0.25rem", "--size-field": "0.25rem", "--border": "1px", "--depth": "0", "--noise": "0" } }; + +// packages/daisyui/base/svg/object.js +var object_default2 = { ":root": { "--fx-noise": `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E")` } }; + +// packages/daisyui/functions/addPrefix.js +var defaultExcludedPrefixes = ["color-", "size-", "radius-", "border", "depth", "noise"]; +var excludedSelectors = ["prose"]; +var shouldExcludeVariable = (variableName, excludedPrefixes) => { + if (variableName.startsWith("tw")) { + return true; + } + return excludedPrefixes.some((excludedPrefix) => variableName.startsWith(excludedPrefix)); +}; +var prefixVariable = (variableName, prefix, excludedPrefixes) => { + if (shouldExcludeVariable(variableName, excludedPrefixes)) { + return variableName; + } + return `${prefix}${variableName}`; +}; +var getPrefixedSelector = (selector, prefix) => { + if (!selector.startsWith(".")) + return selector; + if (excludedSelectors.includes(selector.slice(1))) + return selector; + return `.${prefix}${selector.slice(1)}`; +}; +var getPrefixedKey = (key, prefix, excludedPrefixes) => { + const prefixAmpDot = prefix ? `&.${prefix}` : ""; + if (!prefix) + return key; + if (key.startsWith(".") && excludedSelectors.includes(key.slice(1))) + return key; + if (key.startsWith("--")) { + const variableName = key.slice(2); + return `--${prefixVariable(variableName, prefix, excludedPrefixes)}`; + } + if (key.startsWith("@") || key.startsWith("[")) { + return key; + } + if (key.startsWith("&")) { + if (key.match(/:[a-z-]+\(/)) { + return key.replace(/\.([\w-]+)/g, (m, cls) => excludedSelectors.includes(cls) ? `.${cls}` : `.${prefix}${cls}`); + } + if (key.startsWith("&.")) { + if (excludedSelectors.includes(key.slice(2))) + return key; + return `${prefixAmpDot}${key.slice(2)}`; + } + return key.replace(/\.([\w-]+)/g, (m, cls) => excludedSelectors.includes(cls) ? `.${cls}` : `.${prefix}${cls}`); + } + if (key.startsWith(":")) { + return key.replace(/\.([\w-]+)/g, (m, cls) => excludedSelectors.includes(cls) ? `.${cls}` : `.${prefix}${cls}`); + } + if (key.includes(".") && !key.includes(" ") && !key.includes(">") && !key.includes("+") && !key.includes("~")) { + return key.split(".").filter(Boolean).map((part) => excludedSelectors.includes(part) ? part : prefix + part).join(".").replace(/^/, "."); + } + if (key.includes(">") || key.includes("+") || key.includes("~")) { + if (key.includes(",")) { + return key.split(/\s*,\s*/).map((part) => { + return part.replace(/\.([\w-]+)/g, (m, cls) => excludedSelectors.includes(cls) ? `.${cls}` : `.${prefix}${cls}`); + }).join(", "); + } + let processedKey = key.replace(/\.([\w-]+)/g, (m, cls) => excludedSelectors.includes(cls) ? `.${cls}` : `.${prefix}${cls}`); + if (processedKey.startsWith(">") || processedKey.startsWith("+") || processedKey.startsWith("~")) { + processedKey = ` ${processedKey}`; + } + return processedKey; + } + if (key.includes(" ")) { + return key.split(/\s+/).map((part) => { + if (part.startsWith(".")) { + return excludedSelectors.includes(part.slice(1)) ? part : getPrefixedSelector(part, prefix); + } + return part; + }).join(" "); + } + if (key.includes(":")) { + const [selector, ...pseudo] = key.split(":"); + if (selector.startsWith(".")) { + return `${excludedSelectors.includes(selector.slice(1)) ? selector : getPrefixedSelector(selector, prefix)}:${pseudo.join(":")}`; + } + return key.replace(/\.([\w-]+)/g, (m, cls) => excludedSelectors.includes(cls) ? `.${cls}` : `.${prefix}${cls}`); + } + if (key.startsWith(".")) { + return excludedSelectors.includes(key.slice(1)) ? key : getPrefixedSelector(key, prefix); + } + return key; +}; +var processArrayValue = (value, prefix, excludedPrefixes) => { + return value.map((item) => { + if (typeof item === "string") { + if (item.startsWith(".")) { + return excludedSelectors.includes(item.slice(1)) ? item : prefix ? `.${prefix}${item.slice(1)}` : item; + } + return processStringValue(item, prefix, excludedPrefixes); + } + return item; + }); +}; +var processStringValue = (value, prefix, excludedPrefixes) => { + if (prefix === 0) + return value; + return value.replace(/var\(--([^)]+)\)/g, (match, variableName) => { + if (shouldExcludeVariable(variableName, excludedPrefixes)) { + return match; + } + return `var(--${prefix}${variableName})`; + }); +}; +var processValue = (value, prefix, excludedPrefixes) => { + if (Array.isArray(value)) { + return processArrayValue(value, prefix, excludedPrefixes); + } else if (typeof value === "object" && value !== null) { + return addPrefix(value, prefix, excludedPrefixes); + } else if (typeof value === "string") { + return processStringValue(value, prefix, excludedPrefixes); + } else { + return value; + } +}; +var addPrefix = (obj, prefix, excludedPrefixes = defaultExcludedPrefixes) => { + return Object.entries(obj).reduce((result, [key, value]) => { + const newKey = getPrefixedKey(key, prefix, excludedPrefixes); + result[newKey] = processValue(value, prefix, excludedPrefixes); + return result; + }, {}); +}; + +// packages/daisyui/base/svg/index.js +var svg_default = ({ addBase, prefix = "" }) => { + const prefixedsvg = addPrefix(object_default2, prefix); + addBase({ ...prefixedsvg }); +}; + +// packages/daisyui/base/scrollbar/object.js +var object_default3 = { ":root": { "scrollbar-color": "color-mix(in oklch, currentColor 35%, #0000) #0000" } }; + +// packages/daisyui/base/scrollbar/index.js +var scrollbar_default = ({ addBase, prefix = "" }) => { + const prefixedscrollbar = addPrefix(object_default3, prefix); + addBase({ ...prefixedscrollbar }); +}; + +// packages/daisyui/base/properties/object.js +var object_default4 = { "@property --radialprogress": { syntax: '""', inherits: "true", "initial-value": "0%" } }; + +// packages/daisyui/base/properties/index.js +var properties_default = ({ addBase, prefix = "" }) => { + const prefixedproperties = addPrefix(object_default4, prefix); + addBase({ ...prefixedproperties }); +}; + +// packages/daisyui/base/rootscrolllock/object.js +var object_default5 = { ":root:not(span)": { overflow: "var(--page-overflow)" } }; + +// packages/daisyui/base/rootscrolllock/index.js +var rootscrolllock_default = ({ addBase, prefix = "" }) => { + const prefixedrootscrolllock = addPrefix(object_default5, prefix); + addBase({ ...prefixedrootscrolllock }); +}; + +// packages/daisyui/base/rootscrollgutter/object.js +var object_default6 = { + ":root": { + background: "var(--page-scroll-bg, var(--root-bg))", "--page-scroll-bg-on": `linear-gradient(var(--root-bg, #0000), var(--root-bg, #0000)) + color-mix(in srgb, var(--root-bg, #0000), oklch(0% 0 0) calc(var(--page-has-backdrop, 0) * 40%))`, "--page-scroll-transition-on": "background-color 0.3s ease-out", transition: "var(--page-scroll-transition)", "scrollbar-gutter": ["var(--page-scroll-gutter, unset)", "if(style(--page-has-scroll: 1): var(--page-scroll-gutter, unset) ; else: unset)"] + }, "@keyframes set-page-has-scroll": { "0%, to": { "--page-has-scroll": "1" } } +}; + +// packages/daisyui/base/rootscrollgutter/index.js +var rootscrollgutter_default = ({ addBase, prefix = "" }) => { + const prefixedrootscrollgutter = addPrefix(object_default6, prefix); + addBase({ ...prefixedrootscrollgutter }); +}; + +// packages/daisyui/base/rootcolor/object.js +var object_default7 = { ":root, [data-theme]": { background: "var(--page-scroll-bg, var(--root-bg))", color: "var(--color-base-content)" }, ":where(:root, [data-theme])": { "--root-bg": "var(--color-base-100)" } }; + +// packages/daisyui/base/rootcolor/index.js +var rootcolor_default = ({ addBase, prefix = "" }) => { + const prefixedrootcolor = addPrefix(object_default7, prefix); + addBase({ ...prefixedrootcolor }); +}; + +// packages/daisyui/components/textarea/object.js +var object_default8 = { ".textarea": { "@layer daisyui.l1.l2.l3": { border: "var(--border) solid #0000", "min-height": "calc(0.25rem * 20)", "flex-shrink": 1, appearance: "none", "border-radius": "var(--radius-field)", "background-color": "var(--color-base-100)", "padding-block": "calc(0.25rem * 2)", "vertical-align": "middle", width: "clamp(3rem, 20rem, 100%)", "padding-inline-start": "0.75rem", "padding-inline-end": "0.75rem", "font-size": "max(var(--font-size, 0.875rem), 0.875rem)", "touch-action": "manipulation", "border-color": "var(--input-color)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", textarea: { appearance: "none", "background-color": "transparent", border: "none", "&:focus, &:focus-within": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } } }, "&:focus, &:focus-within": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate" }, "@media (pointer: coarse)": { "@supports (-webkit-touch-callout: none)": { "&:focus, &:focus-within": { "--font-size": "1rem" } } }, "&:has(> textarea[disabled]), &:is(:disabled, [disabled])": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" }, "box-shadow": "none" }, "&:has(> textarea[disabled]) > textarea[disabled]": { cursor: "not-allowed" } } }, ".textarea-ghost": { "@layer daisyui.l1.l2": { "background-color": "transparent", "box-shadow": "none", "border-color": "#0000", "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } } }, ".textarea-neutral": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } } }, ".textarea-primary": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } } }, ".textarea-secondary": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } } }, ".textarea-accent": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } } }, ".textarea-info": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } } }, ".textarea-success": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } } }, ".textarea-warning": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } } }, ".textarea-error": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } } }, ".textarea-xs": { "@layer daisyui.l1.l2": { "font-size": "max(var(--font-size, 0.6875rem), 0.6875rem)" } }, ".textarea-sm": { "@layer daisyui.l1.l2": { "font-size": "max(var(--font-size, 0.75rem), 0.75rem)" } }, ".textarea-md": { "@layer daisyui.l1.l2": { "font-size": "max(var(--font-size, 0.875rem), 0.875rem)" } }, ".textarea-lg": { "@layer daisyui.l1.l2": { "font-size": "max(var(--font-size, 1.125rem), 1.125rem)" } }, ".textarea-xl": { "@layer daisyui.l1.l2": { "font-size": "max(var(--font-size, 1.375rem), 1.375rem)" } } }; + +// packages/daisyui/components/textarea/index.js +var textarea_default = ({ addComponents, prefix = "" }) => { + const prefixedtextarea = addPrefix(object_default8, prefix); + addComponents({ ...prefixedtextarea }); +}; + +// packages/daisyui/components/rating/object.js +var object_default9 = { ".rating": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-flex", "vertical-align": "middle", "& input": { border: "none", appearance: "none" }, ":where(*)": { height: "calc(0.25rem * 6)", width: "calc(0.25rem * 6)", "border-radius": "0", "background-color": "var(--color-base-content)", opacity: "20%", "@media (prefers-reduced-motion: no-preference)": { animation: "rating 0.25s ease-out" }, "&:is(input)": { cursor: "pointer" } }, "& .rating-hidden": { width: "calc(0.25rem * 2)", "background-color": "transparent" }, 'input[type="radio"]:checked': { "background-image": "none" }, "*": { '&:checked, &[aria-checked="true"], &[aria-current="true"], &:has(~ *:checked, ~ *[aria-checked="true"], ~ *[aria-current="true"])': { opacity: "100%" }, "&:focus-visible": { scale: "1.1", "@media (prefers-reduced-motion: no-preference)": { transition: "scale 0.2s ease-out" } } }, "& *:active:focus": { animation: "none", scale: "1.1" } }, "@layer daisyui.l1.l2": { "&.rating-xs :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 4)", height: "calc(0.25rem * 4)" }, "&.rating-sm :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 5)", height: "calc(0.25rem * 5)" }, "&.rating-md :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 6)", height: "calc(0.25rem * 6)" }, "&.rating-lg :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 7)", height: "calc(0.25rem * 7)" }, "&.rating-xl :where(*:not(.rating-hidden))": { width: "calc(0.25rem * 8)", height: "calc(0.25rem * 8)" } } }, ".rating-half": { "@layer daisyui.l1.l2": { "&.rating-xs *:not(.rating-hidden)": { width: "calc(0.25rem * 2)" }, "&.rating-sm *:not(.rating-hidden)": { width: "calc(0.25rem * 2.5)" }, "&.rating-md *:not(.rating-hidden)": { width: "calc(0.25rem * 3)" }, "&.rating-lg *:not(.rating-hidden)": { width: ".875rem" }, "&.rating-xl *:not(.rating-hidden)": { width: "calc(0.25rem * 4)" } } }, "@keyframes rating": { "0%, 40%": { scale: "1.1", filter: "brightness(1.05) contrast(1.05)" } } }; + +// packages/daisyui/components/rating/index.js +var rating_default = ({ addComponents, prefix = "" }) => { + const prefixedrating = addPrefix(object_default9, prefix); + addComponents({ ...prefixedrating }); +}; + +// packages/daisyui/components/calendar/object.js +var object_default10 = { ".cally": { "@layer daisyui.l1.l2.l3": { "font-size": "0.7rem", "&::part(container)": { padding: "0.5rem 1rem", "user-select": "none" }, "::part(th)": { "font-weight": "normal", "block-size": "auto" }, "&::part(header)": { direction: "ltr" }, "::part(head)": { opacity: 0.5, "font-size": "0.7rem" }, "&::part(button)": { "border-radius": "var(--radius-field)", border: "none", padding: "0.5rem", background: "#0000" }, "&::part(button):hover": { background: "var(--color-base-200)" }, "::part(day)": { "border-radius": "var(--radius-field)", "font-size": "0.7rem" }, "::part(day):hover": { "&:not(selected, today)": { background: "var(--color-base-200)" } }, "::part(button day today)": { background: "var(--color-primary)", color: "var(--color-primary-content)" }, "::part(selected)": { color: "var(--color-base-100)", background: "var(--color-base-content)", "border-radius": "var(--radius-field)" }, "::part(range-inner)": { "border-radius": "0" }, "::part(range-start)": { "border-start-end-radius": "0", "border-end-end-radius": "0" }, "::part(range-end)": { "border-start-start-radius": "0", "border-end-start-radius": "0" }, "::part(range-start range-end)": { "border-radius": "var(--radius-field)" }, "calendar-month": { width: "100%" } } }, ".react-day-picker": { "@layer daisyui.l1.l2.l3": { "user-select": "none", "background-color": "var(--color-base-100)", "border-radius": "var(--radius-box)", border: "var(--border) solid var(--color-base-200)", "font-size": "0.75rem", display: "inline-block", position: "relative", overflow: "clip", '&[dir="rtl"]': { ".rdp-nav": { ".rdp-chevron": { "transform-origin": "50%", transform: "rotate(180deg)" } } }, "*": { "box-sizing": "border-box" }, ".rdp-day": { width: "2.25rem", height: "2.25rem", "text-align": "center" }, ".rdp-day_button": { cursor: "pointer", font: "inherit", color: "inherit", width: "2.25rem", height: "2.25rem", border: "2px solid #0000", "border-radius": "var(--radius-field)", background: "0 0", "justify-content": "center", "align-items": "center", margin: "0", padding: "0", display: "flex", "&:disabled": { cursor: "revert" }, "&:hover": { "background-color": "var(--color-base-200)" }, '&:disabled:hover, &[aria-disabled="true"]:hover': { "background-color": "transparent", cursor: "not-allowed" } }, ".rdp-caption_label": { "z-index": 1, "white-space": "nowrap", border: "0", "align-items": "center", display: "inline-flex", position: "relative" }, ".rdp-button_next": { "border-radius": "var(--radius-field)", "&:hover": { "background-color": "var(--color-base-200)" } }, ".rdp-button_previous": { "border-radius": "var(--radius-field)", "&:hover": { "background-color": "var(--color-base-200)" } }, ".rdp-button_next, .rdp-button_previous": { cursor: "pointer", font: "inherit", color: "inherit", appearance: "none", width: "2.25rem", height: "2.25rem", background: "0 0", border: "none", "justify-content": "center", "align-items": "center", margin: "0", padding: "0", display: "inline-flex", position: "relative", '&:disabled, &[aria-disabled="true"]': { cursor: "revert", opacity: 0.5 }, '&:disabled:hover, &[aria-disabled="true"]:hover': { "background-color": "transparent" } }, ".rdp-chevron": { fill: "var(--color-base-content)", width: "1rem", height: "1rem", display: "inline-block" }, ".rdp-dropdowns": { "align-items": "center", gap: "0.5rem", display: "inline-flex", position: "relative" }, ".rdp-dropdown": { "z-index": 2, opacity: 0, appearance: "none", cursor: "inherit", "line-height": "inherit", border: "none", width: "100%", margin: "0", padding: "0", position: "absolute", "inset-block": "0", "inset-inline-start": "0", "&:focus-visible": { "~ .rdp-caption_label": { outline: ["5px auto highlight", "5px auto -webkit-focus-ring-color"] } } }, ".rdp-dropdown_root": { "align-items": "center", display: "inline-flex", position: "relative", '&[data-disabled="true"]': { ".rdp-chevron": { opacity: 0.5 } } }, ".rdp-month_caption": { height: "2.75rem", "font-size": "0.75rem", "font-weight": "inherit", "place-content": "center", display: "flex" }, ".rdp-months": { gap: "2rem", "flex-wrap": "wrap", "max-width": "fit-content", padding: "0.5rem", display: "flex", position: "relative" }, ".rdp-month_grid": { "border-collapse": "collapse" }, ".rdp-nav": { height: "2.75rem", "inset-block-start": "0", "inset-inline-end": "0", "justify-content": "space-between", "align-items": "center", width: "100%", "padding-inline": "0.5rem", display: "flex", position: "absolute", top: "0.25rem" }, ".rdp-weekday": { opacity: 0.6, padding: "0.5rem 0rem", "text-align": "center", "font-size": "smaller", "font-weight": 500 }, ".rdp-week_number": { opacity: 0.6, height: "2.25rem", width: "2.25rem", border: "none", "border-radius": "100%", "text-align": "center", "font-size": "small", "font-weight": 400 }, ".rdp-today:not(.rdp-outside)": { ".rdp-day_button": { background: "var(--color-primary)", color: "var(--color-primary-content)" } }, ".rdp-selected": { "font-weight": "inherit", "font-size": "0.75rem", ".rdp-day_button": { color: "var(--color-base-100)", "background-color": "var(--color-base-content)", "border-radius": "var(--radius-field)", border: "none", "&:hover": { "background-color": "var(--color-base-content)" } } }, ".rdp-outside": { opacity: 0.75 }, ".rdp-disabled": { opacity: 0.5 }, ".rdp-hidden": { visibility: "hidden", color: "var(--color-base-content)" }, ".rdp-range_start": { ".rdp-day_button": { "border-radius": "var(--radius-field) 0 0 var(--radius-field)" } }, ".rdp-range_start .rdp-day_button": { "background-color": "var(--color-base-content)", color: "var(--color-base-100)" }, ".rdp-range_middle": { "background-color": "var(--color-base-200)" }, ".rdp-range_middle .rdp-day_button": { border: "unset", "border-radius": "unset", color: "inherit" }, ".rdp-range_end": { color: "var(--color-base-content)", ".rdp-day_button": { "border-radius": "0 var(--radius-field) var(--radius-field) 0" } }, ".rdp-range_end .rdp-day_button": { "background-color": "var(--color-base-content)", color: "var(--color-base-100)" }, ".rdp-range_start.rdp-range_end": { background: "revert" }, ".rdp-focusable": { cursor: "pointer" }, ".rdp-footer": { "border-top": "var(--border) solid var(--color-base-200)", padding: "0.5rem" } } }, ".pika-single": { "@layer daisyui.l1.l2.l3": { "&:is(div)": { "user-select": "none", "font-size": "0.75rem", "z-index": 999, display: "inline-block", position: "relative", color: "var(--color-base-content)", "background-color": "var(--color-base-100)", "border-radius": "var(--radius-box)", border: "var(--border) solid var(--color-base-200)", padding: "0.5rem", "&:before, &:after": { content: '""', display: "table" }, "&:after": { clear: "both" }, "&.is-hidden": { display: "none" }, "&.is-bound": { position: "absolute" }, ".pika-lendar": { "css-float": "left" }, ".pika-title": { position: "relative", "text-align": "center", select: { cursor: "pointer", position: "absolute", "z-index": 999, margin: "0", left: "0", top: "5px", opacity: 0 } }, ".pika-label": { display: "inline-block", position: "relative", "z-index": 999, overflow: "hidden", margin: "0", padding: "5px 3px", "background-color": "var(--color-base-100)" }, ".pika-prev, .pika-next": { display: "block", cursor: "pointer", position: "absolute", top: "0", outline: "none", border: "0", width: "2.25rem", height: "2.25rem", color: "#0000", "font-size": "1.2em", "border-radius": "var(--radius-field)", "&:hover": { "background-color": "var(--color-base-200)" }, "&.is-disabled": { cursor: "default", opacity: 0.2 }, "&:before": { display: "inline-block", width: "2.25rem", height: "2.25rem", "line-height": 2.25, color: "var(--color-base-content)" } }, ".pika-prev": { left: "0", "&:before": { "--tw-content": '"‹"', content: "var(--tw-content)" } }, ".pika-next": { right: "0", "&:before": { "--tw-content": '"›"', content: "var(--tw-content)" } }, ".pika-select": { display: "inline-block" }, ".pika-table": { width: "100%", "border-collapse": "collapse", "border-spacing": "0", border: "0", "th, td": { padding: "0" }, th: { opacity: 0.6, "text-align": "center", width: "2.25rem", height: "2.25rem" } }, ".pika-button": { cursor: "pointer", display: "block", outline: "none", border: "0", margin: "0", width: "2.25rem", height: "2.25rem", padding: "5px", "text-align": ["right", "center"] }, ".pika-week": { color: "var(--color-base-content)" }, ".is-today": { ".pika-button": { background: "var(--color-primary)", color: "var(--color-primary-content)" } }, ".is-selected, .has-event": { ".pika-button": { "&, &:hover": { color: "var(--color-base-100)", "background-color": "var(--color-base-content)", "border-radius": "var(--radius-field)" } } }, ".has-event": { ".pika-button": { background: "var(--color-base-primary)" } }, ".is-disabled, .is-inrange": { ".pika-button": { background: "var(--color-base-primary)" } }, ".is-startrange": { ".pika-button": { color: "var(--color-base-100)", background: "var(--color-base-content)", "border-radius": "var(--radius-field)" } }, ".is-endrange": { ".pika-button": { color: "var(--color-base-100)", background: "var(--color-base-content)", "border-radius": "var(--radius-field)" } }, ".is-disabled": { ".pika-button": { "pointer-events": "none", cursor: "default", color: "var(--color-base-content)", opacity: 0.3 } }, ".is-outside-current-month": { ".pika-button": { color: "var(--color-base-content)", opacity: 0.3 } }, ".is-selection-disabled": { "pointer-events": "none", cursor: "default" }, ".pika-button:hover, .pika-row.pick-whole-week:hover .pika-button": { color: "var(--color-base-content)", "background-color": "var(--color-base-200)", "border-radius": "var(--radius-field)" }, ".pika-table abbr": { "text-decoration": "none", "font-weight": "normal" } } } } }; + +// packages/daisyui/components/calendar/index.js +var calendar_default = ({ addComponents, prefix = "" }) => { + const prefixedcalendar = addPrefix(object_default10, prefix); + addComponents({ ...prefixedcalendar }); +}; + +// packages/daisyui/components/dropdown/object.js +var object_default11 = { ".dropdown": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-block", "position-area": "var(--anchor-v, bottom) var(--anchor-h, span-right)", '& > *:not(:has(~ [class*="dropdown-content"])):focus': { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, ".dropdown-content": { position: "absolute" }, "&.dropdown-close .dropdown-content, &:not(details, .dropdown-open, .dropdown-hover:hover, :focus-within) .dropdown-content, &.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible) ~ .dropdown-content": { display: "none", "transform-origin": "top", opacity: "0%", scale: "95%" }, "&[popover], .dropdown-content": { "z-index": 999, "@media (prefers-reduced-motion: no-preference)": { animation: "dropdown 0.2s", "transition-property": "opacity, scale, display", "transition-behavior": "allow-discrete", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)" } }, "@starting-style": { "&[popover], .dropdown-content": { scale: "95%", opacity: 0 } }, "&:not(.dropdown-close)": { "&.dropdown-open, &:not(.dropdown-hover):focus, &:focus-within": { "> [tabindex]:first-child": { "pointer-events": "none" }, ".dropdown-content": { opacity: "100%", scale: "100%" } }, "&.dropdown-hover:hover": { ".dropdown-content": { opacity: "100%", scale: "100%" } } }, "&:is(details)": { summary: { "&::-webkit-details-marker": { display: "none" } } }, "&:where([popover])": { background: "#0000" }, "&[popover]": { position: "fixed", color: "inherit", "@supports not (position-area: bottom)": { margin: "auto", "&.dropdown-close, &.dropdown-open:not(:popover-open)": { display: "none", "transform-origin": "top", opacity: "0%", scale: "95%" }, "&::backdrop": { "background-color": "color-mix(in oklab, #000 30%, #0000)" } }, "&.dropdown-close, &:not(.dropdown-open, :popover-open)": { display: "none", "transform-origin": "top", opacity: "0%", scale: "95%" } } } }, ".dropdown-start": { "@layer daisyui.l1.l2": { "--anchor-h": "span-right", ":where(.dropdown-content)": { "inset-inline-end": "auto", translate: "0 0", '[dir="rtl"] &': { translate: "0 0" } }, "&.dropdown-left": { "--anchor-h": "left", "--anchor-v": "span-bottom", ".dropdown-content": { top: "calc(0.25rem * 0)", bottom: "auto" } }, "&.dropdown-right": { "--anchor-h": "right", "--anchor-v": "span-bottom", ".dropdown-content": { top: "calc(0.25rem * 0)", bottom: "auto" } } } }, ".dropdown-center": { "@layer daisyui.l1.l2": { "--anchor-h": "center", ":where(.dropdown-content)": { "inset-inline-end": "calc(1/2 * 100%)", translate: "50% 0", '[dir="rtl"] &': { translate: "-50% 0" } }, "&.dropdown-left": { "--anchor-h": "left", "--anchor-v": "center", ".dropdown-content": { top: "auto", bottom: "calc(1/2 * 100%)", translate: "0 50%" } }, "&.dropdown-right": { "--anchor-h": "right", "--anchor-v": "center", ".dropdown-content": { top: "auto", bottom: "calc(1/2 * 100%)", translate: "0 50%" } } } }, ".dropdown-end": { "@layer daisyui.l1.l2": { "--anchor-h": "span-left", ":where(.dropdown-content)": { "inset-inline-end": "calc(0.25rem * 0)", translate: "0 0", '[dir="rtl"] &': { translate: "0 0" } }, "&.dropdown-left": { "--anchor-h": "left", "--anchor-v": "span-top", ".dropdown-content": { top: "auto", bottom: "calc(0.25rem * 0)" } }, "&.dropdown-right": { "--anchor-h": "right", "--anchor-v": "span-top", ".dropdown-content": { top: "auto", bottom: "calc(0.25rem * 0)" } } } }, ".dropdown-left": { "@layer daisyui.l1.l2": { "--anchor-h": "left", "--anchor-v": "span-bottom", ".dropdown-content": { "inset-inline-end": "100%", top: "calc(0.25rem * 0)", bottom: "auto", "transform-origin": "100%" } } }, ".dropdown-right": { "@layer daisyui.l1.l2": { "--anchor-h": "right", "--anchor-v": "span-bottom", ".dropdown-content": { "inset-inline-start": "100%", top: "calc(0.25rem * 0)", bottom: "auto", "transform-origin": "0" } } }, ".dropdown-bottom": { "@layer daisyui.l1.l2": { "--anchor-v": "bottom", ".dropdown-content": { top: "100%", bottom: "auto", "transform-origin": "top" } } }, ".dropdown-top": { "@layer daisyui.l1.l2": { "--anchor-v": "top", ".dropdown-content": { top: "auto", bottom: "100%", "transform-origin": "bottom" } } }, "@keyframes dropdown": { "0%": { opacity: 0 } } }; + +// packages/daisyui/components/dropdown/index.js +var dropdown_default = ({ addComponents, prefix = "" }) => { + const prefixeddropdown = addPrefix(object_default11, prefix); + addComponents({ ...prefixeddropdown }); +}; + +// packages/daisyui/components/tab/object.js +var object_default12 = { + ".tabs": { "@layer daisyui.l1.l2.l3": { display: "flex", "flex-wrap": "wrap", "--tabs-height": "auto", "--tabs-direction": "row", "--tab-height": "calc(var(--size-field, 0.25rem) * 10)", height: "var(--tabs-height)", "flex-direction": "var(--tabs-direction)" } }, ".tab": { + "@layer daisyui.l1.l2.l3": { + position: "relative", display: "inline-flex", cursor: "pointer", appearance: "none", "flex-wrap": "wrap", "align-items": "center", "justify-content": "center", "text-align": "center", "webkit-user-select": "none", "user-select": "none", "&:hover": { "@media (hover: hover)": { color: "var(--color-base-content)" } }, "--tab-p": "0.75rem", "--tab-bg": "var(--color-base-100)", "--tab-border-color": "var(--color-base-300)", "--tab-radius-ss": "0", "--tab-radius-se": "0", "--tab-radius-es": "0", "--tab-radius-ee": "0", "--tab-order": "0", "--tab-radius-min": "calc(0.75rem - var(--border))", "--tab-radius-limit": "min(var(--radius-field), var(--tab-radius-min))", "--tab-radius-grad": `#0000 calc(69% - var(--border)), + var(--tab-border-color) calc(69% - var(--border) + 0.25px), + var(--tab-border-color) 69%, + var(--tab-bg) calc(69% + 0.25px)`, "border-color": "#0000", order: "var(--tab-order)", height: "var(--tab-height)", "font-size": "0.875rem", "padding-inline": "var(--tab-p)", '&:is(input[type="radio"])': { "min-width": "fit-content", "&:after": { "--tw-content": "attr(aria-label)", content: "var(--tw-content)" } }, "&:is(label)": { position: "relative", input: { position: "absolute", inset: "calc(0.25rem * 0)", cursor: "pointer", appearance: "none", opacity: "0%" } }, '&:checked, &:is(label:has(:checked)), &:is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"])': { "& + .tab-content": { display: "block" } }, '&:not( :checked, label:has(:checked), :hover, .tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"] )': { color: "color-mix(in oklab, var(--color-base-content) 50%, transparent)" }, "&:not(input):empty": { "flex-grow": 1, cursor: "default" }, "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible, &:is(label:has(:checked:focus-visible))": { outline: "2px solid currentColor", "outline-offset": "-5px" }, "&[disabled]": { "pointer-events": "none", opacity: "40%" } + } + }, ".tab-content": { "@layer daisyui.l1.l2.l3": { order: [1, "var(--tabcontent-order)"], display: "none", "border-color": "transparent", "--tabcontent-radius-ss": "var(--radius-box)", "--tabcontent-radius-se": "var(--radius-box)", "--tabcontent-radius-es": "var(--radius-box)", "--tabcontent-radius-ee": "var(--radius-box)", "--tabcontent-order": "1", width: "100%", height: "calc(100% - var(--tab-height) + var(--border))", margin: "var(--tabcontent-margin)", "border-width": "var(--border)", "border-start-start-radius": "var(--tabcontent-radius-ss)", "border-start-end-radius": "var(--tabcontent-radius-se)", "border-end-start-radius": "var(--tabcontent-radius-es)", "border-end-end-radius": "var(--tabcontent-radius-ee)" } }, ".tab-disabled": { "@layer daisyui.l1.l2": { "pointer-events": "none", opacity: "40%" } }, ".tabs-border": { "@layer daisyui.l1.l2": { "> .tab": { "--tab-border-color": "#0000 #0000 var(--tab-border-color) #0000", position: "relative", "border-radius": "var(--radius-field)", "&:before": { content: '""', "background-color": "var(--tab-border-color)", transition: "background-color 0.2s ease", width: "80%", height: "3px", "border-radius": "var(--radius-field)", bottom: "0", left: "10%", position: "absolute" }, '&:is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"]):not( .tab-disabled, [disabled] ), &:is(input:checked), &:is(label:has(:checked))': { "&:before": { "--tab-border-color": "currentColor", "border-top": "3px solid" } } } } }, ".tabs-lift": { + "@layer daisyui.l1.l2": { + "--tabs-height": "auto", "--tabs-direction": "row", "> .tab": { + "--tab-border": "0 0 var(--border) 0", "--tab-radius-ss": "var(--tab-radius-limit)", "--tab-radius-se": "var(--tab-radius-limit)", "--tab-radius-es": "0", "--tab-radius-ee": "0", "--tab-paddings": "var(--border) var(--tab-p) 0 var(--tab-p)", "--tab-border-colors": "#0000 #0000 var(--tab-border-color) #0000", "--tab-corner-width": "calc(100% + var(--tab-radius-limit) * 2)", "--tab-corner-height": "var(--tab-radius-limit)", "--tab-corner-position": "top left, top right", "border-width": "var(--tab-border)", "border-start-start-radius": "var(--tab-radius-ss)", "border-start-end-radius": "var(--tab-radius-se)", "border-end-start-radius": "var(--tab-radius-es)", "border-end-end-radius": "var(--tab-radius-ee)", padding: "var(--tab-paddings)", "border-color": "var(--tab-border-colors)", '&:is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"]):not( .tab-disabled, [disabled] ), &:is(input:checked, label:has(:checked))': { + "--tab-border": "var(--border) var(--border) 0 var(--border)", "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)`, "--tab-paddings": `0 calc(var(--tab-p) - var(--border)) var(--border) + calc(var(--tab-p) - var(--border))`, "--tab-inset": "auto auto 0 auto", "--radius-start": "radial-gradient(circle at top left, var(--tab-radius-grad))", "--radius-end": "radial-gradient(circle at top right, var(--tab-radius-grad))", "background-color": "var(--tab-bg)", "&:before": { "z-index": 1, content: '""', display: "block", position: "absolute", width: "var(--tab-corner-width)", height: "var(--tab-corner-height)", "background-position": "var(--tab-corner-position)", "background-image": "var(--radius-start), var(--radius-end)", "background-size": "var(--tab-radius-limit) var(--tab-radius-limit)", "background-repeat": "no-repeat", inset: "var(--tab-inset)" }, "&:first-child:before": { "--radius-start": "none" }, '[dir="rtl"] &:first-child:before': { transform: "rotateY(180deg)" }, "&:last-child:before": { "--radius-end": "none" }, '[dir="rtl"] &:last-child:before': { transform: "rotateY(180deg)" } + } + }, "&:has(> .tab-content)": { + "> .tab:first-child": { + '&:not(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"])': { + "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)` } + } + }, "> .tab-content": { "--tabcontent-margin": "calc(-1 * var(--border)) 0 0 0", "--tabcontent-radius-ss": "0", "--tabcontent-radius-se": "var(--radius-box)", "--tabcontent-radius-es": "var(--radius-box)", "--tabcontent-radius-ee": "var(--radius-box)" }, ':checked, label:has(:checked), :is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"])': { "& + .tab-content": { "&:nth-child(1), &:nth-child(n + 3)": { "--tabcontent-radius-ss": "var(--radius-box)" } } } + } + }, ".tabs-top": { + "@layer daisyui.l1.l2": { + "--tabs-height": "auto", "--tabs-direction": "row", "> .tab": { + "--tab-order": "0", "--tab-border": "0 0 var(--border) 0", "--tab-radius-ss": "var(--tab-radius-limit)", "--tab-radius-se": "var(--tab-radius-limit)", "--tab-radius-es": "0", "--tab-radius-ee": "0", "--tab-paddings": "var(--border) var(--tab-p) 0 var(--tab-p)", "--tab-border-colors": "#0000 #0000 var(--tab-border-color) #0000", "--tab-corner-width": "calc(100% + var(--tab-radius-limit) * 2)", "--tab-corner-height": "var(--tab-radius-limit)", "--tab-corner-position": "top left, top right", '&:is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"]):not( .tab-disabled, [disabled] ), &:is(input:checked), &:is(label:has(:checked))': { + "--tab-border": "var(--border) var(--border) 0 var(--border)", "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)`, "--tab-paddings": `0 calc(var(--tab-p) - var(--border)) var(--border) + calc(var(--tab-p) - var(--border))`, "--tab-inset": "auto auto 0 auto", "--radius-start": "radial-gradient(circle at top left, var(--tab-radius-grad))", "--radius-end": "radial-gradient(circle at top right, var(--tab-radius-grad))" + } + }, "&:has(> .tab-content)": { + "> .tab:first-child": { + '&:not(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"])': { + "--tab-border-colors": `var(--tab-border-color) var(--tab-border-color) #0000 + var(--tab-border-color)` } + } + }, "> .tab-content": { "--tabcontent-order": "1", "--tabcontent-margin": "calc(-1 * var(--border)) 0 0 0", "--tabcontent-radius-ss": "0", "--tabcontent-radius-se": "var(--radius-box)", "--tabcontent-radius-es": "var(--radius-box)", "--tabcontent-radius-ee": "var(--radius-box)" }, ':checked, label:has(:checked), :is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"])': { "& + .tab-content": { "&:nth-child(1), &:nth-child(n + 3)": { "--tabcontent-radius-ss": "var(--radius-box)" } } } + } + }, ".tabs-bottom": { + "@layer daisyui.l1.l2": { + "--tabs-height": "auto", "--tabs-direction": "row", "> .tab": { + "--tab-order": "1", "--tab-border": "var(--border) 0 0 0", "--tab-radius-ss": "0", "--tab-radius-se": "0", "--tab-radius-es": "var(--tab-radius-limit)", "--tab-radius-ee": "var(--tab-radius-limit)", "--tab-border-colors": "var(--tab-border-color) #0000 #0000 #0000", "--tab-paddings": "0 var(--tab-p) var(--border) var(--tab-p)", "--tab-corner-width": "calc(100% + var(--tab-radius-limit) * 2)", "--tab-corner-height": "var(--tab-radius-limit)", "--tab-corner-position": "top left, top right", '&:is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"]):not( .tab-disabled, [disabled] ), &:is(input:checked), &:is(label:has(:checked))': { + "--tab-border": "0 var(--border) var(--border) var(--border)", "--tab-border-colors": `#0000 var(--tab-border-color) var(--tab-border-color) + var(--tab-border-color)`, "--tab-paddings": `var(--border) calc(var(--tab-p) - var(--border)) 0 + calc(var(--tab-p) - var(--border))`, "--tab-inset": "0 auto auto auto", "--radius-start": "radial-gradient(circle at bottom left, var(--tab-radius-grad))", "--radius-end": "radial-gradient(circle at bottom right, var(--tab-radius-grad))" + } + }, "&:has(> .tab-content)": { + "> .tab:first-child": { + '&:not(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"])': { + "--tab-border-colors": `#0000 var(--tab-border-color) var(--tab-border-color) + var(--tab-border-color)` } + } + }, "> .tab-content": { "--tabcontent-order": "0", "--tabcontent-margin": "0 0 calc(-1 * var(--border)) 0", "--tabcontent-radius-ss": "var(--radius-box)", "--tabcontent-radius-se": "var(--radius-box)", "--tabcontent-radius-es": "0", "--tabcontent-radius-ee": "var(--radius-box)" }, '> :checked, > :is(label:has(:checked)), > :is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"])': { "& + .tab-content:not(:nth-child(2))": { "--tabcontent-radius-es": "var(--radius-box)" } } + } + }, ".tabs-box": { "@layer daisyui.l1.l2": { "background-color": "var(--color-base-200)", padding: "calc(0.25rem * 1)", "--tabs-box-radius": "calc(3 * var(--radius-field))", "border-radius": "calc( min(var(--tab-height) / 2, var(--radius-field)) + min(0.25rem, var(--tabs-box-radius)) )", "box-shadow": "0 -0.5px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 0.5px oklch(0% 0 0 / calc(var(--depth) * 0.05)) inset", "> .tab": { "border-radius": "var(--radius-field)", "border-style": "none", "&:focus-visible, &:is(label:has(:checked:focus-visible))": { "outline-offset": "2px" } }, '> :is(.tab-active, [aria-selected="true"], [aria-current="true"], [aria-current="page"]):not( .tab-disabled, [disabled] ), > :is(input:checked), > :is(label:has(:checked))': { "background-color": "var(--tab-bg, var(--color-base-100))", "box-shadow": "0 1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px 1px -1px color-mix(in oklab, var(--color-neutral) calc(var(--depth) * 50%), #0000), 0 1px 6px -4px color-mix(in oklab, var(--color-neutral) calc(var(--depth) * 100%), #0000)", "@media (forced-colors: active)": { border: "1px solid" } }, "> .tab-content": { "margin-top": "calc(0.25rem * 1)", height: "calc(100% - var(--tab-height) + var(--border) - 0.5rem)", "border-radius": "calc( min(var(--tab-height) / 2, var(--radius-field)) + min(0.25rem, var(--tabs-box-radius)) - var(--border) )" } } }, ".tabs-xs": { "@layer daisyui.l1.l2": { "--tab-height": "calc(var(--size-field, 0.25rem) * 6)", "& > .tab": { "font-size": "0.75rem", "--tab-p": "0.375rem", "--tab-radius-min": "calc(0.5rem - var(--border))" } } }, ".tabs-sm": { "@layer daisyui.l1.l2": { "--tab-height": "calc(var(--size-field, 0.25rem) * 8)", "& > .tab": { "font-size": "0.875rem", "--tab-p": "0.5rem", "--tab-radius-min": "calc(0.5rem - var(--border))" } } }, ".tabs-md": { "@layer daisyui.l1.l2": { "--tab-height": "calc(var(--size-field, 0.25rem) * 10)", "& > .tab": { "font-size": "0.875rem", "--tab-p": "0.75rem", "--tab-radius-min": "calc(0.75rem - var(--border))" } } }, ".tabs-lg": { "@layer daisyui.l1.l2": { "--tab-height": "calc(var(--size-field, 0.25rem) * 12)", "& > .tab": { "font-size": "1.125rem", "--tab-p": "1rem", "--tab-radius-min": "calc(1.5rem - var(--border))" } } }, ".tabs-xl": { "@layer daisyui.l1.l2": { "--tab-height": "calc(var(--size-field, 0.25rem) * 14)", "& > .tab": { "font-size": "1.125rem", "--tab-p": "1.25rem", "--tab-radius-min": "calc(2rem - var(--border))" } } } +}; + +// packages/daisyui/components/tab/index.js +var tab_default = ({ addComponents, prefix = "" }) => { + const prefixedtab = addPrefix(object_default12, prefix); + addComponents({ ...prefixedtab }); +}; + +// packages/daisyui/components/fileinput/object.js +var object_default13 = { + ".file-input": { + "@layer daisyui.l1.l2.l3": { + cursor: ["pointer", "pointer"], border: "var(--border) solid #0000", display: "inline-flex", appearance: "none", "align-items": "center", "background-color": "var(--color-base-100)", "vertical-align": "middle", "webkit-user-select": "none", "user-select": "none", width: "clamp(3rem, 20rem, 100%)", height: "var(--size)", "padding-inline-end": "0.75rem", "font-size": "0.875rem", "line-height": 2, "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "border-color": "var(--input-color)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "&::file-selector-button": { + "margin-inline-end": "calc(0.25rem * 4)", cursor: "pointer", "padding-inline": "calc(0.25rem * 4)", "webkit-user-select": "none", "user-select": "none", height: "calc(100% + var(--border) * 2)", "margin-block": "calc(var(--border) * -1)", "margin-inline-start": "calc(var(--border) * -1)", "font-size": "0.875rem", color: "var(--btn-fg)", "border-width": "var(--border)", "border-style": "solid", "border-color": "var(--btn-border)", "border-start-start-radius": "calc(var(--join-ss, var(--radius-field) - var(--border)))", "border-end-start-radius": "calc(var(--join-es, var(--radius-field) - var(--border)))", "font-weight": 600, "background-color": "var(--btn-bg)", "background-size": "calc(var(--noise) * 100%)", "background-image": "var(--btn-noise)", "text-shadow": "0 0.5px oklch(1 0 0 / calc(var(--depth) * 0.15))", "box-shadow": "0 0.5px 0 0.5px color-mix( in oklab, color-mix(in oklab, white 30%, var(--btn-bg)) calc(var(--depth) * 20%), #0000 ) inset, var(--btn-shadow)", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--btn-bg": "var(--btn-color, var(--color-base-200))", "--btn-fg": "var(--color-base-content)", "--btn-border": "color-mix(in oklab, var(--btn-bg), #000 5%)", "--btn-shadow": `0 3px 2px -2px color-mix(in oklab, var(--btn-bg) 30%, #0000), + 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) 30%, #0000)`, "--btn-noise": "var(--fx-noise)" + }, "&:focus": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) 10%, #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate" }, "&:has(> input[disabled]), &:is(:disabled, [disabled])": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" }, "box-shadow": "none", color: "color-mix(in oklch, var(--color-base-content) 20%, #0000)", "&::file-selector-button": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", "--btn-border": "#0000", "--btn-noise": "none", "--btn-fg": "color-mix(in oklch, var(--color-base-content) 20%, #0000)" } } + } + }, ".file-input-ghost": { "@layer daisyui.l1.l2": { "background-color": "transparent", transition: "background-color 0.2s", "box-shadow": "none", "border-color": "#0000", "&::file-selector-button": { "margin-inline-start": "calc(0.25rem * 0)", "margin-inline-end": "calc(0.25rem * 4)", height: "100%", cursor: "pointer", "padding-inline": "calc(0.25rem * 4)", "webkit-user-select": "none", "user-select": "none", "margin-block": "0", "border-start-end-radius": "calc(var(--join-ss, var(--radius-field) - var(--border)))", "border-end-end-radius": "calc(var(--join-es, var(--radius-field) - var(--border)))" }, "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } } }, ".file-input-neutral": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-neutral)", "&::file-selector-button": { color: "var(--color-neutral-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } } }, ".file-input-primary": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-primary)", "&::file-selector-button": { color: "var(--color-primary-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } } }, ".file-input-secondary": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-secondary)", "&::file-selector-button": { color: "var(--color-secondary-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } } }, ".file-input-accent": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-accent)", "&::file-selector-button": { color: "var(--color-accent-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } } }, ".file-input-info": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-info)", "&::file-selector-button": { color: "var(--color-info-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } } }, ".file-input-success": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-success)", "&::file-selector-button": { color: "var(--color-success-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } } }, ".file-input-warning": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-warning)", "&::file-selector-button": { color: "var(--color-warning-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } } }, ".file-input-error": { "@layer daisyui.l1.l2": { "--btn-color": "var(--color-error)", "&::file-selector-button": { color: "var(--color-error-content)" }, "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } } }, ".file-input-xs": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 6)", "font-size": "0.6875rem", "line-height": "1rem", "&::file-selector-button": { "font-size": "0.6875rem" } } }, ".file-input-sm": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 8)", "font-size": "0.75rem", "line-height": "1.5rem", "&::file-selector-button": { "font-size": "0.75rem" } } }, ".file-input-md": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 10)", "font-size": "0.875rem", "line-height": 2, "&::file-selector-button": { "font-size": "0.875rem" } } }, ".file-input-lg": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 12)", "font-size": "1.125rem", "line-height": "2.5rem", "&::file-selector-button": { "font-size": "1.125rem" } } }, ".file-input-xl": { "@layer daisyui.l1.l2": { "padding-inline-end": "calc(0.25rem * 6)", "--size": "calc(var(--size-field, 0.25rem) * 14)", "font-size": "1.125rem", "line-height": "3rem", "&::file-selector-button": { "font-size": "1.375rem" } } } +}; + +// packages/daisyui/components/fileinput/index.js +var fileinput_default = ({ addComponents, prefix = "" }) => { + const prefixedfileinput = addPrefix(object_default13, prefix); + addComponents({ ...prefixedfileinput }); +}; + +// packages/daisyui/components/modal/object.js +var object_default14 = { ".modal": { "@layer daisyui.l1.l2.l3": { "pointer-events": "none", visibility: "hidden", position: "fixed", inset: "calc(0.25rem * 0)", margin: "calc(0.25rem * 0)", display: "grid", height: "100%", "max-height": "none", width: "100%", "max-width": "none", "align-items": "center", "justify-items": "center", "background-color": "transparent", padding: "calc(0.25rem * 0)", color: "inherit", transition: "visibility 0.3s allow-discrete, background-color 0.3s ease-out, opacity 0.1s ease-out", overflow: "clip", "overscroll-behavior": "contain", "z-index": 999, "scrollbar-gutter": "auto", "&::backdrop": { display: "none" } }, "@layer daisyui.l1.l2": { "&.modal-open, &[open], &:target, .modal-toggle:checked + &": { "pointer-events": "auto", visibility: "visible", opacity: "100%", transition: "visibility 0s allow-discrete, background-color 0.3s ease-out, opacity 0.1s ease-out", "background-color": "oklch(0% 0 0/ 0.4)", ".modal-box": { translate: "0 0", scale: "1", opacity: 1 }, ":root:has(&)": { "--page-has-backdrop": "1", "--page-overflow": "hidden", "--page-scroll-bg": "var(--page-scroll-bg-on)", "--page-scroll-gutter": "stable", "--page-scroll-transition": "var(--page-scroll-transition-on)", animation: "set-page-has-scroll forwards", "animation-timeline": "scroll()" } }, "@starting-style": { "&.modal-open, &[open], &:target, .modal-toggle:checked + &": { opacity: "0%" } } } }, ".modal-action": { "@layer daisyui.l1.l2.l3": { "margin-top": "calc(0.25rem * 6)", display: "flex", "justify-content": "flex-end", gap: "calc(0.25rem * 2)" } }, ".modal-toggle": { "@layer daisyui.l1.l2.l3": { position: "fixed", height: "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", appearance: "none", opacity: "0%" } }, ".modal-backdrop": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "grid-row-start": "1", display: "grid", "align-self": "stretch", "justify-self": "stretch", color: "transparent", "z-index": -1, button: { cursor: "pointer" } } }, ".modal-box": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "grid-row-start": "1", "max-height": "100vh", width: "calc(11/12 * 100%)", "max-width": "32rem", "background-color": "var(--color-base-100)", padding: "calc(0.25rem * 6)", transition: "translate 0.3s ease-out, scale 0.3s ease-out, opacity 0.2s ease-out 0.05s, box-shadow 0.3s ease-out", "border-top-left-radius": "var(--modal-tl, var(--radius-box))", "border-top-right-radius": "var(--modal-tr, var(--radius-box))", "border-bottom-left-radius": "var(--modal-bl, var(--radius-box))", "border-bottom-right-radius": "var(--modal-br, var(--radius-box))", scale: "95%", opacity: 0, "box-shadow": "oklch(0% 0 0/ 0.25) 0px 25px 50px -12px", "overflow-y": "auto", "overscroll-behavior": "contain" } }, ".modal-top": { "@layer daisyui.l1.l2": { "place-items": "start", ".modal-box": { height: "auto", width: "100%", "max-width": "none", "max-height": "calc(100vh - 5em)", translate: "0 -100%", scale: "1", "--modal-tl": "0", "--modal-tr": "0", "--modal-bl": "var(--radius-box)", "--modal-br": "var(--radius-box)" } } }, ".modal-middle": { "@layer daisyui.l1.l2": { "place-items": "center", ".modal-box": { height: "auto", width: "calc(11/12 * 100%)", "max-width": "32rem", "max-height": "calc(100vh - 5em)", translate: "0 2%", scale: "98%", "--modal-tl": "var(--radius-box)", "--modal-tr": "var(--radius-box)", "--modal-bl": "var(--radius-box)", "--modal-br": "var(--radius-box)" } } }, ".modal-bottom": { "@layer daisyui.l1.l2": { "place-items": "end", ".modal-box": { height: "auto", width: "100%", "max-width": "none", "max-height": "calc(100vh - 5em)", translate: "0 100%", scale: "1", "--modal-tl": "var(--radius-box)", "--modal-tr": "var(--radius-box)", "--modal-bl": "0", "--modal-br": "0" } } }, ".modal-start": { "@layer daisyui.l1.l2": { "place-items": "start", ".modal-box": { height: "100vh", "max-height": "none", width: "auto", "max-width": "none", translate: "-100% 0", scale: "1", "--modal-tl": "0", "--modal-tr": "var(--radius-box)", "--modal-bl": "0", "--modal-br": "var(--radius-box)" } } }, ".modal-end": { "@layer daisyui.l1.l2": { "place-items": "end", ".modal-box": { height: "100vh", "max-height": "none", width: "auto", "max-width": "none", translate: "100% 0", scale: "1", "--modal-tl": "var(--radius-box)", "--modal-tr": "0", "--modal-bl": "var(--radius-box)", "--modal-br": "0" } } } }; + +// packages/daisyui/components/modal/index.js +var modal_default = ({ addComponents, prefix = "" }) => { + const prefixedmodal = addPrefix(object_default14, prefix); + addComponents({ ...prefixedmodal }); +}; + +// packages/daisyui/components/radialprogress/object.js +var object_default15 = { ".radial-progress": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-grid", height: "var(--size)", width: "var(--size)", "place-content": "center", "border-radius": "calc(infinity * 1px)", "background-color": "transparent", "vertical-align": "middle", "box-sizing": "content-box", "--value": "0", "--size": "5rem", "--thickness": "calc(var(--size) / 10)", "--radialprogress": "calc(var(--value) * 1%)", transition: "--radialprogress 0.3s linear", "&:before": { position: "absolute", inset: "calc(0.25rem * 0)", "border-radius": "calc(infinity * 1px)", content: '""', background: "radial-gradient(farthest-side, currentColor 98%, #0000) top/var(--thickness) var(--thickness) no-repeat, conic-gradient(currentColor var(--radialprogress), #0000 0)", "webkit-mask": "radial-gradient( farthest-side, #0000 calc(100% - var(--thickness)), #000 calc(100% + 0.5px - var(--thickness)) )", mask: "radial-gradient( farthest-side, #0000 calc(100% - var(--thickness)), #000 calc(100% + 0.5px - var(--thickness)) )" }, "&:after": { position: "absolute", "border-radius": "calc(infinity * 1px)", "background-color": "currentcolor", transition: "transform 0.3s linear", content: '""', inset: "calc(50% - var(--thickness) / 2)", transform: "rotate(calc(var(--value) * 3.6deg - 90deg)) translate(calc(var(--size) / 2 - 50%))" } } } }; + +// packages/daisyui/components/radialprogress/index.js +var radialprogress_default = ({ addComponents, prefix = "" }) => { + const prefixedradialprogress = addPrefix(object_default15, prefix); + addComponents({ ...prefixedradialprogress }); +}; + +// packages/daisyui/components/checkbox/object.js +var object_default16 = { ".checkbox": { "@layer daisyui.l1.l2.l3": { border: "var(--border) solid var(--input-color, color-mix(in oklab, var(--color-base-content) 20%, #0000))", position: "relative", display: "inline-block", "flex-shrink": 0, cursor: "pointer", appearance: "none", "border-radius": "var(--radius-selector)", padding: "calc(0.25rem * 1)", "vertical-align": "middle", color: "var(--color-base-content)", "box-shadow": "0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 0 #0000 inset, 0 0 #0000", transition: "background-color 0.2s, box-shadow 0.2s", "--size": "calc(var(--size-selector, 0.25rem) * 6)", width: "var(--size)", height: "var(--size)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "&:before": { "--tw-content": '""', content: "var(--tw-content)", display: "block", width: "100%", height: "100%", rotate: "45deg", "background-color": "currentcolor", opacity: "0%", transition: "clip-path 0.3s, opacity 0.1s, rotate 0.3s, translate 0.3s", "transition-delay": "0.1s", "clip-path": "polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 70% 80%, 70% 100%)", "box-shadow": "0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "font-size": "1rem", "line-height": 0.75 }, "&:focus-visible": { outline: "2px solid var(--input-color, currentColor)", "outline-offset": "2px" }, '&:checked, &[aria-checked="true"]': { "background-color": "var(--input-color, #0000)", "box-shadow": "0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1))", "&:before": { "clip-path": "polygon(20% 100%, 20% 80%, 50% 80%, 50% 0%, 70% 0%, 70% 100%)", opacity: "100%" }, "@media (forced-colors: active)": { "&:before": { rotate: "0deg", "background-color": "transparent", "--tw-content": '"✔︎"', "clip-path": "none" } }, "@media print": { "&:before": { rotate: "0deg", "background-color": "transparent", "--tw-content": '"✔︎"', "clip-path": "none" } } }, "&:indeterminate": { "background-color": "var( --input-color, color-mix(in oklab, var(--color-base-content) 20%, #0000) )", "&:before": { rotate: "0deg", opacity: "100%", translate: "0 -35%", "clip-path": "polygon(20% 100%, 20% 80%, 50% 80%, 50% 80%, 80% 80%, 80% 100%)" } } } }, ".checkbox-primary": { "@layer daisyui.l1.l2": { color: "var(--color-primary-content)", "--input-color": "var(--color-primary)" } }, ".checkbox-secondary": { "@layer daisyui.l1.l2": { color: "var(--color-secondary-content)", "--input-color": "var(--color-secondary)" } }, ".checkbox-accent": { "@layer daisyui.l1.l2": { color: "var(--color-accent-content)", "--input-color": "var(--color-accent)" } }, ".checkbox-neutral": { "@layer daisyui.l1.l2": { color: "var(--color-neutral-content)", "--input-color": "var(--color-neutral)" } }, ".checkbox-info": { "@layer daisyui.l1.l2": { color: "var(--color-info-content)", "--input-color": "var(--color-info)" } }, ".checkbox-success": { "@layer daisyui.l1.l2": { color: "var(--color-success-content)", "--input-color": "var(--color-success)" } }, ".checkbox-warning": { "@layer daisyui.l1.l2": { color: "var(--color-warning-content)", "--input-color": "var(--color-warning)" } }, ".checkbox-error": { "@layer daisyui.l1.l2": { color: "var(--color-error-content)", "--input-color": "var(--color-error)" } }, ".checkbox:disabled": { "@layer daisyui.l1.l2": { cursor: "not-allowed", opacity: "20%" } }, ".checkbox-xs": { "@layer daisyui.l1.l2": { padding: "0.125rem", "--size": "calc(var(--size-selector, 0.25rem) * 4)" } }, ".checkbox-sm": { "@layer daisyui.l1.l2": { padding: "0.1875rem", "--size": "calc(var(--size-selector, 0.25rem) * 5)" } }, ".checkbox-md": { "@layer daisyui.l1.l2": { padding: "0.25rem", "--size": "calc(var(--size-selector, 0.25rem) * 6)" } }, ".checkbox-lg": { "@layer daisyui.l1.l2": { padding: "0.3125rem", "--size": "calc(var(--size-selector, 0.25rem) * 7)" } }, ".checkbox-xl": { "@layer daisyui.l1.l2": { padding: "0.375rem", "--size": "calc(var(--size-selector, 0.25rem) * 8)" } } }; + +// packages/daisyui/components/checkbox/index.js +var checkbox_default = ({ addComponents, prefix = "" }) => { + const prefixedcheckbox = addPrefix(object_default16, prefix); + addComponents({ ...prefixedcheckbox }); +}; + +// packages/daisyui/components/select/object.js +var object_default17 = { ".select": { "@layer daisyui.l1.l2.l3": { border: "var(--border) solid #0000", position: "relative", display: "inline-flex", "flex-shrink": 1, appearance: "none", "align-items": "center", gap: "calc(0.25rem * 1.5)", "background-color": "var(--color-base-100)", "padding-inline-start": "calc(0.25rem * 3)", "padding-inline-end": "calc(0.25rem * 7)", "vertical-align": "middle", width: "clamp(3rem, 20rem, 100%)", height: "var(--size)", "font-size": "0.875rem", "touch-action": "manipulation", "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "background-image": "linear-gradient(45deg, #0000 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, #0000 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", "white-space": "nowrap", overflow: "hidden", "text-overflow": "ellipsis", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "border-color": "var(--input-color)", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--size": "calc(var(--size-field, 0.25rem) * 10)", '[dir="rtl"] &': { "background-position": "calc(0% + 12px) calc(1px + 50%), calc(0% + 16px) calc(1px + 50%)", "&::picker(select), select::picker(select)": { translate: "0.5rem 0" } }, "&[multiple]": { height: "auto", overflow: "auto", "padding-block": "calc(0.25rem * 3)", "padding-inline-end": "calc(0.25rem * 3)", "background-image": "none" }, select: { "margin-inline-start": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * -7)", width: "calc(100% + 2.75rem)", appearance: "none", "padding-inline-start": "calc(0.25rem * 3)", "padding-inline-end": "calc(0.25rem * 7)", height: "calc(100% - calc(var(--border) * 2))", "align-items": "center", background: "inherit", "border-radius": "inherit", "border-style": "none", "&:focus, &:focus-within": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:not(:last-child)": { "margin-inline-end": "calc(0.25rem * -5.5)", "background-image": "none" } }, "&:focus, &:focus-within": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate" }, "&:has(> select[disabled]), &:is(:disabled, [disabled]), fieldset:disabled &": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" } }, "&:has(> select[disabled]) > select[disabled]": { cursor: "not-allowed" }, "&, & select": { "@supports (appearance: base-select)": [{ appearance: "base-select" }, { "&::picker(select)": { appearance: "base-select" } }], "&::picker(select)": { color: "inherit", "max-height": "min(24rem, 70dvh)", "margin-inline": "0.5rem", translate: "-0.5rem 0", border: "var(--border) solid var(--color-base-200)", "margin-block": "calc(0.25rem * 2)", "border-radius": "var(--radius-box)", padding: "calc(0.25rem * 2)", "background-color": "inherit", "box-shadow": ["0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/0.2)", "0 20px 25px -5px rgb(0 0 0 / calc(var(--depth) * 0.1)), 0 8px 10px -6px rgb(0 0 0 / calc(var(--depth) * 0.1))"] }, "&::picker-icon": { display: "none" }, optgroup: { "padding-top": "0.5em", option: { "&:nth-child(1)": { "margin-top": "0.5em" } } }, option: { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1.5)", "transition-property": "color, background-color", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)", "white-space": "normal", "&:not(:disabled)": { "&:hover, &:focus-visible": { cursor: "pointer", "background-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:active": { "background-color": "var(--color-neutral)", color: "var(--color-neutral-content)", "box-shadow": "0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)" } } } } } }, ".select-ghost": { "@layer daisyui.l1.l2": { "background-color": "transparent", transition: "background-color 0.2s", "box-shadow": "none", "border-color": "#0000", "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } } }, ".select-neutral": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } } }, ".select-primary": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } } }, ".select-secondary": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } } }, ".select-accent": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } } }, ".select-info": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } } }, ".select-success": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } } }, ".select-warning": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } } }, ".select-error": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } } }, ".select-xs": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 6)", "font-size": "0.6875rem", option: { "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)" } } }, ".select-sm": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 8)", "font-size": "0.75rem", option: { "padding-inline": "calc(0.25rem * 2.5)", "padding-block": "calc(0.25rem * 1)" } } }, ".select-md": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 10)", "font-size": "0.875rem", option: { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1.5)" } } }, ".select-lg": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 12)", "font-size": "1.125rem", option: { "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 1.5)" } } }, ".select-xl": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 14)", "font-size": "1.375rem", option: { "padding-inline": "calc(0.25rem * 5)", "padding-block": "calc(0.25rem * 1.5)" } } } }; + +// packages/daisyui/components/select/index.js +var select_default = ({ addComponents, prefix = "" }) => { + const prefixedselect = addPrefix(object_default17, prefix); + addComponents({ ...prefixedselect }); +}; + +// packages/daisyui/components/radio/object.js +var object_default18 = { ".radio": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-block", "flex-shrink": 0, cursor: "pointer", appearance: "none", "border-radius": "calc(infinity * 1px)", padding: "calc(0.25rem * 1)", "vertical-align": "middle", border: "var(--border) solid var(--input-color, color-mix(in srgb, currentColor 20%, #0000))", "box-shadow": "0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset", "--size": "calc(var(--size-selector, 0.25rem) * 6)", width: "var(--size)", height: "var(--size)", color: "var(--input-color, currentColor)", "&:before": { display: "block", width: "100%", height: "100%", "border-radius": "calc(infinity * 1px)", "--tw-content": '""', content: "var(--tw-content)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)" }, "&:focus-visible": { outline: "2px solid currentColor" }, '&:checked, &[aria-checked="true"]': { "border-color": "currentcolor", "background-color": "var(--color-base-100)", "@media (prefers-reduced-motion: no-preference)": { animation: "radio 0.2s ease-out" }, "&:before": { "background-color": "currentcolor", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1))" }, "@media (forced-colors: active)": { "&:before": { "outline-style": "var(--tw-outline-style)", "outline-width": "1px", "outline-offset": "calc(1px * -1)" } }, "@media print": { "&:before": { outline: "0.25rem solid", "outline-offset": "-1rem" } } } } }, ".radio-primary": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-primary)" } }, ".radio-secondary": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-secondary)" } }, ".radio-accent": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-accent)" } }, ".radio-neutral": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-neutral)" } }, ".radio-info": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-info)" } }, ".radio-success": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-success)" } }, ".radio-warning": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-warning)" } }, ".radio-error": { "@layer daisyui.l1.l2": { "--input-color": "var(--color-error)" } }, ".radio:disabled": { "@layer daisyui.l1.l2": { cursor: "not-allowed", opacity: "20%" } }, ".radio-xs": { "@layer daisyui.l1.l2": { padding: "0.125rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 4)" } } }, ".radio-sm": { "@layer daisyui.l1.l2": { padding: "0.1875rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 5)" } } }, ".radio-md": { "@layer daisyui.l1.l2": { padding: "0.25rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 6)" } } }, ".radio-lg": { "@layer daisyui.l1.l2": { padding: "0.3125rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 7)" } } }, ".radio-xl": { "@layer daisyui.l1.l2": { padding: "0.375rem", '&:is([type="radio"])': { "--size": "calc(var(--size-selector, 0.25rem) * 8)" } } }, "@keyframes radio": { "0%": { padding: "5px" }, "50%": { padding: "3px" } } }; + +// packages/daisyui/components/radio/index.js +var radio_default = ({ addComponents, prefix = "" }) => { + const prefixedradio = addPrefix(object_default18, prefix); + addComponents({ ...prefixedradio }); +}; + +// packages/daisyui/components/avatar/object.js +var object_default19 = { ".avatar-group": { "@layer daisyui.l1.l2.l3": { display: "flex", overflow: "hidden", ".avatar": { overflow: "hidden", "border-radius": "calc(infinity * 1px)", border: "4px solid var(--color-base-100)" } } }, ".avatar": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-flex", "vertical-align": "middle", "& > div": { display: "block", "aspect-ratio": "1 / 1", overflow: "hidden" }, img: { height: "100%", width: "100%", "object-fit": "cover" } } }, ".avatar-placeholder": { "@layer daisyui.l1.l2": { "& > div": { display: "flex", "align-items": "center", "justify-content": "center" } } }, ".avatar-online": { "@layer daisyui.l1.l2": { "&:before": { content: '""', position: "absolute", "z-index": 1, display: "block", "border-radius": "calc(infinity * 1px)", "background-color": "var(--color-success)", outline: "2px solid var(--color-base-100)", width: "15%", height: "15%", top: "7%", right: "7%" } } }, ".avatar-offline": { "@layer daisyui.l1.l2": { "&:before": { content: '""', position: "absolute", "z-index": 1, display: "block", "border-radius": "calc(infinity * 1px)", "background-color": "var(--color-base-300)", outline: "2px solid var(--color-base-100)", width: "15%", height: "15%", top: "7%", right: "7%" } } } }; + +// packages/daisyui/components/avatar/index.js +var avatar_default = ({ addComponents, prefix = "" }) => { + const prefixedavatar = addPrefix(object_default19, prefix); + addComponents({ ...prefixedavatar }); +}; + +// packages/daisyui/components/toast/object.js +var object_default20 = { ".toast": { "@layer daisyui.l1.l2.l3": { position: "fixed", "inset-inline-start": "auto", "inset-inline-end": "calc(0.25rem * 4)", top: "auto", bottom: "calc(0.25rem * 4)", display: "flex", "flex-direction": "column", gap: "calc(0.25rem * 2)", "background-color": "transparent", translate: "var(--toast-x, 0) var(--toast-y, 0)", width: "max-content", "max-width": "calc(100vw - 2rem)", "& > *": { "@media (prefers-reduced-motion: no-preference)": { animation: "toast 0.25s ease-out" } } } }, ".toast-start": { "@layer daisyui.l1.l2": { "inset-inline-start": "calc(0.25rem * 4)", "inset-inline-end": "auto", "--toast-x": "0" } }, ".toast-center": { "@layer daisyui.l1.l2": { "inset-inline-start": "calc(1/2 * 100%)", "inset-inline-end": "calc(1/2 * 100%)", "--toast-x": "-50%" } }, ".toast-end": { "@layer daisyui.l1.l2": { "inset-inline-start": "auto", "inset-inline-end": "calc(0.25rem * 4)", "--toast-x": "0" } }, ".toast-bottom": { "@layer daisyui.l1.l2": { top: "auto", bottom: "calc(0.25rem * 4)", "--toast-y": "0" } }, ".toast-middle": { "@layer daisyui.l1.l2": { top: "calc(1/2 * 100%)", bottom: "auto", "--toast-y": "-50%" } }, ".toast-top": { "@layer daisyui.l1.l2": { top: "calc(0.25rem * 4)", bottom: "auto", "--toast-y": "0" } }, "@keyframes toast": { "0%": { scale: "0.9", opacity: 0 }, "100%": { scale: "1", opacity: 1 } } }; + +// packages/daisyui/components/toast/index.js +var toast_default = ({ addComponents, prefix = "" }) => { + const prefixedtoast = addPrefix(object_default20, prefix); + addComponents({ ...prefixedtoast }); +}; + +// packages/daisyui/components/hover3d/object.js +var object_default21 = { ".hover-3d": { "@layer daisyui.l1.l2.l3": { display: "inline-grid", perspective: "75rem", "--transform": "0, 0", "--shine": "100% 100%", "--shadow": "0rem 0rem 0rem", "--ease": "linear(0, 0.931 13.8%, 1.196 21.4%, 1.343 29.8%, 1.378 36%, 1.365 43.2%, 1.059 78%, 1)", filter: "drop-shadow(var(--shadow) 0.1rem #00000003) drop-shadow(var(--shadow) 0.2rem #00000003) drop-shadow(var(--shadow) 0.3rem #00000003) drop-shadow(var(--shadow) 0.4rem #00000003)", transition: "filter ease-out 400ms", "> :nth-child(n + 2)": { isolation: "isolate", "z-index": 1, scale: "1.2" }, "> :first-child": { overflow: "hidden", "grid-area": "1/1/4/4", transform: "rotate3d(var(--transform), 0, 10deg)", transition: "transform var(--ease) 500ms, scale var(--ease) 500ms, outline-color ease-out 500ms", outline: "0.5px solid #0000", "outline-offset": "-1px", "&:before": { width: "calc(1/3 * 100%)", height: "calc(1/3 * 100%)", content: '""', "pointer-events": "none", position: "absolute", "z-index": 1, scale: "500%", opacity: 0, filter: "blur(0.75rem)", "background-image": "radial-gradient(circle at 50%, #fff3 10%, transparent 50%)", translate: "var(--shine)", transition: "translate ease-out 400ms, opacity ease-out 400ms" } }, "&:hover": { "--ease": "linear(0, 0.708 15.2%, 0.927 23.6%, 1.067 33%, 1.12 41%, 1.13 50.2%, 1.019 83.2%, 1)", "& > :first-child": { "outline-color": "#fff1", "&:before, &:after": { opacity: 1 } }, "> :first-child": { scale: "1.05" } }, "> :nth-child(2)": { "grid-area": "1/1/2/2" }, "> :nth-child(3)": { "grid-area": "1/2/2/3" }, "> :nth-child(4)": { "grid-area": "1/3/2/4" }, "> :nth-child(5)": { "grid-area": "2/1/3/2" }, "> :nth-child(6)": { "grid-area": "2/3/3/4" }, "> :nth-child(7)": { "grid-area": "3/1/4/2" }, "> :nth-child(8)": { "grid-area": "3/2/4/3" }, "> :nth-child(9)": { "grid-area": "3/3/4/4" }, "&:has(> :nth-child(2):hover)": { "--transform": "-1, 1", "--shine": "0% 0%", "--shadow": "-0.5rem -0.5rem" }, "&:has(> :nth-child(3):hover)": { "--transform": "-1, 0", "--shine": "100% 0%", "--shadow": "0rem -0.5rem" }, "&:has(> :nth-child(4):hover)": { "--transform": "-1, -1", "--shine": "200% 0%", "--shadow": "0.5rem -0.5rem" }, "&:has(> :nth-child(5):hover)": { "--transform": "0, 1", "--shine": "0% 100%", "--shadow": "-0.5rem 0rem" }, "&:has(> :nth-child(6):hover)": { "--transform": "0, -1", "--shine": "200% 100%", "--shadow": "0.5rem 0rem" }, "&:has(> :nth-child(7):hover)": { "--transform": "1, 1", "--shine": "0% 200%", "--shadow": "-0.5rem 0.5rem" }, "&:has(> :nth-child(8):hover)": { "--transform": "1, 0", "--shine": "100% 200%", "--shadow": "0rem 0.5rem" }, "&:has(> :nth-child(9):hover)": { "--transform": "1, -1", "--shine": "200% 200%", "--shadow": "0.5rem 0.5rem" } } } }; + +// packages/daisyui/components/hover3d/index.js +var hover3d_default = ({ addComponents, prefix = "" }) => { + const prefixedhover3d = addPrefix(object_default21, prefix); + addComponents({ ...prefixedhover3d }); +}; + +// packages/daisyui/components/carousel/object.js +var object_default22 = { ".carousel": { "@layer daisyui.l1.l2.l3": { display: "inline-flex", "overflow-x": "scroll", "scroll-snap-type": "x mandatory", "scrollbar-width": "none", "@media (prefers-reduced-motion: no-preference)": { "scroll-behavior": "smooth" }, "&::-webkit-scrollbar": { display: "none" } } }, ".carousel-vertical": { "@layer daisyui.l1.l2": { "flex-direction": "column", "overflow-y": "scroll", "scroll-snap-type": "y mandatory" } }, ".carousel-horizontal": { "@layer daisyui.l1.l2": { "flex-direction": "row", "overflow-x": "scroll", "scroll-snap-type": "x mandatory" } }, ".carousel-item": { "@layer daisyui.l1.l2.l3": { "box-sizing": "content-box", display: "flex", flex: "none", "scroll-snap-align": "start" } }, ".carousel-start": { "@layer daisyui.l1.l2": { ".carousel-item": { "scroll-snap-align": "start" } } }, ".carousel-center": { "@layer daisyui.l1.l2": { ".carousel-item": { "scroll-snap-align": "center" } } }, ".carousel-end": { "@layer daisyui.l1.l2": { ".carousel-item": { "scroll-snap-align": "end" } } } }; + +// packages/daisyui/components/carousel/index.js +var carousel_default = ({ addComponents, prefix = "" }) => { + const prefixedcarousel = addPrefix(object_default22, prefix); + addComponents({ ...prefixedcarousel }); +}; + +// packages/daisyui/components/textrotate/object.js +var object_default23 = { ".text-rotate": { height: "1lh", "@layer daisyui.l1.l2.l3": { display: "inline-block", overflow: "hidden", "vertical-align": "bottom", "white-space": "nowrap", "transition-property": "none", "--duration": "var(--tw-duration)", "> *": { display: "grid", "justify-items": "start", height: "calc(var(--items, 1) * 100%)", "&:has(*:nth-child(2))": { "--items": "2", animation: "rotator var(--duration, 10s) linear(0 0% 49%, 0.5 50% 99%, 1 100% 100%) infinite" }, "&:has(*:nth-child(3))": { "--items": "3", animation: "rotator var(--duration, 10s) linear(0 0% 32%, 0.333333 33% 65%, 0.666666 66% 99%, 1 100% 100%) infinite" }, "&:has(*:nth-child(4))": { "--items": "4", animation: "rotator var(--duration, 10s) linear(0 0% 24%, 0.25 25% 49%, 0.5 50% 74%, 0.75 75% 99%, 1 100% 100%) infinite" }, "&:has(*:nth-child(5))": { "--items": "5", animation: "rotator var(--duration, 10s) linear(0 0% 19%, 0.2 20% 39%, 0.4 40% 59%, 0.6 60% 79%, 0.8 80% 99%, 1 100% 100%) infinite" }, "&:has(*:nth-child(6))": { "--items": "6", animation: "rotator var(--duration, 10s) linear( 0 0% 15%, 0.16666 16% 32%, 0.333333 33% 49%, 0.5 50% 65%, 0.666666 66% 82%, 0.833333 83% 99%, 1 100% 100% ) infinite" }, "> *": { "align-content": "baseline", "clip-path": "inset(0.5px 0px 0.5px 0px)", "&:nth-child(1)": { translate: "var(--first-item-position)" } } }, "&:hover": { "> *": { "animation-play-state": "paused" } } } }, "@keyframes rotator": { "89.9999%, 100%": { "--first-item-position": "0 0%" }, "90%, 99.9999%": { "--first-item-position": "0 calc(var(--items) * 100%)" }, "100%": { translate: "0 -100%" } } }; + +// packages/daisyui/components/textrotate/index.js +var textrotate_default = ({ addComponents, prefix = "" }) => { + const prefixedtextrotate = addPrefix(object_default23, prefix); + addComponents({ ...prefixedtextrotate }); +}; + +// packages/daisyui/components/mockup/object.js +var object_default24 = { ".mockup-code": { "@layer daisyui.l1.l2.l3": { position: "relative", overflow: "hidden", "overflow-x": "auto", "border-radius": "var(--radius-box)", "background-color": "var(--color-neutral)", "padding-block": "calc(0.25rem * 5)", color: "var(--color-neutral-content)", "font-size": "0.875rem", direction: "ltr", "&:before": { content: '""', "margin-bottom": "calc(0.25rem * 4)", display: "block", height: "calc(0.25rem * 3)", width: "calc(0.25rem * 3)", "border-radius": "calc(infinity * 1px)", opacity: "30%", "box-shadow": "1.4em 0, 2.8em 0, 4.2em 0" }, pre: { "padding-right": "calc(0.25rem * 5)", "&:before": { content: '""', "margin-right": "2ch" }, "&[data-prefix]": { "&:before": { "--tw-content": "attr(data-prefix)", content: "var(--tw-content)", display: "inline-block", width: "calc(0.25rem * 8)", "text-align": "right", opacity: "50%" } } } } }, ".mockup-window": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "flex", "flex-direction": "column", overflow: "hidden", "overflow-x": "auto", "border-radius": "var(--radius-box)", "padding-top": "calc(0.25rem * 5)", "&:before": { content: '""', "margin-bottom": "calc(0.25rem * 4)", display: "block", "aspect-ratio": "1 / 1", height: "calc(0.25rem * 3)", "flex-shrink": 0, "align-self": "flex-start", "border-radius": "calc(infinity * 1px)", opacity: "30%", "box-shadow": "1.4em 0, 2.8em 0, 4.2em 0" }, '[dir="rtl"] &:before': { "align-self": "flex-end" }, "pre[data-prefix]": { "&:before": { "--tw-content": "attr(data-prefix)", content: "var(--tw-content)", display: "inline-block", "text-align": "right" } } } }, ".mockup-browser": { "@layer daisyui.l1.l2.l3": { position: "relative", overflow: "hidden", "overflow-x": "auto", "border-radius": "var(--radius-box)", "pre[data-prefix]": { "&:before": { "--tw-content": "attr(data-prefix)", content: "var(--tw-content)", display: "inline-block", "text-align": "right" } }, ".mockup-browser-toolbar": { "margin-block": "calc(0.25rem * 3)", display: "inline-flex", width: "100%", "align-items": "center", "padding-right": "1.4em", '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "flex-direction": "row-reverse" }, "&:before": { content: '""', "margin-right": "4.8rem", display: "inline-block", "aspect-ratio": "1 / 1", height: "calc(0.25rem * 3)", "border-radius": "calc(infinity * 1px)", opacity: "30%", "box-shadow": "1.4em 0, 2.8em 0, 4.2em 0" }, ".input": { "margin-inline": "auto", display: "flex", height: "100%", "align-items": "center", gap: "calc(0.25rem * 2)", overflow: "hidden", "background-color": "var(--color-base-200)", "text-overflow": "ellipsis", "white-space": "nowrap", "font-size": "0.75rem", direction: "ltr", "&:before": { content: '""', width: "calc(0.25rem * 4)", height: "calc(0.25rem * 4)", opacity: "50%", "background-color": "currentColor", mask: `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M9.965 11.026a5 5 0 1 1 1.06-1.06l2.755 2.754a.75.75 0 1 1-1.06 1.06l-2.755-2.754ZM10.5 7a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0Z' clip-rule='evenodd' /%3E%3C/svg%3E") no-repeat center`, "mask-size": "contain" } } } } }, ".mockup-phone": { "@layer daisyui.l1.l2.l3": { display: "inline-grid", "justify-items": "center", border: "5px solid #6b6b6b", "border-radius": "65px", "background-color": "#000", padding: "6px", overflow: "hidden", width: "100%", "max-width": "462px", "aspect-ratio": "462 / 978", "@supports (corner-shape: superellipse(1.45))": { "border-radius": "90px", "corner-shape": "superellipse(1.45)" } } }, ".mockup-phone-camera": { "@layer daisyui.l1.l2.l3": { "grid-column": "1/1", "grid-row": "1/1", background: "#000", height: "3.7%", width: "28%", "border-radius": "17px", "z-index": 1, "margin-top": "3%" } }, ".mockup-phone-display": { "@layer daisyui.l1.l2.l3": { "border-radius": "54px", "grid-column": "1/1", "grid-row": "1/1", overflow: "hidden", width: "100%", height: "100%", "@supports (corner-shape: superellipse(1.87))": { "border-radius": "101px", "corner-shape": "superellipse(1.87)" }, "& > img": { width: "100%", height: "100%", "object-fit": "cover" } } } }; + +// packages/daisyui/components/mockup/index.js +var mockup_default = ({ addComponents, prefix = "" }) => { + const prefixedmockup = addPrefix(object_default24, prefix); + addComponents({ ...prefixedmockup }); +}; + +// packages/daisyui/components/divider/object.js +var object_default25 = { ".divider": { "@layer daisyui.l1.l2.l3": { display: "flex", height: "calc(0.25rem * 4)", "flex-direction": "row", "align-items": "center", "align-self": "stretch", "white-space": "nowrap", margin: "var(--divider-m, 1rem 0)", "--divider-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", "&:before, &:after": { content: '""', height: "calc(0.25rem * 0.5)", width: "100%", "flex-grow": 1, "background-color": "var(--divider-color)" }, "@media print": { "&:before, &:after": { border: "0.5px solid" } }, "&:not(:empty)": { gap: "calc(0.25rem * 4)" } } }, ".divider-horizontal": { "@layer daisyui.l1.l2": { "--divider-m": "0 1rem", "&.divider": { height: "auto", width: "calc(0.25rem * 4)", "flex-direction": "column", "&:before": { height: "100%", width: "calc(0.25rem * 0.5)" }, "&:after": { height: "100%", width: "calc(0.25rem * 0.5)" } } } }, ".divider-vertical": { "@layer daisyui.l1.l2": { "--divider-m": "1rem 0", "&.divider": { height: "calc(0.25rem * 4)", width: "auto", "flex-direction": "row", "&:before": { height: "calc(0.25rem * 0.5)", width: "100%" }, "&:after": { height: "calc(0.25rem * 0.5)", width: "100%" } } } }, ".divider-neutral": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-neutral)" } } }, ".divider-primary": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-primary)" } } }, ".divider-secondary": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-secondary)" } } }, ".divider-accent": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-accent)" } } }, ".divider-success": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-success)" } } }, ".divider-warning": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-warning)" } } }, ".divider-info": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-info)" } } }, ".divider-error": { "@layer daisyui.l1.l2": { "&:before, &:after": { "background-color": "var(--color-error)" } } }, ".divider-start:before": { "@layer daisyui.l1.l2": { display: "none" } }, ".divider-end:after": { "@layer daisyui.l1.l2": { display: "none" } } }; + +// packages/daisyui/components/divider/index.js +var divider_default = ({ addComponents, prefix = "" }) => { + const prefixeddivider = addPrefix(object_default25, prefix); + addComponents({ ...prefixeddivider }); +}; + +// packages/daisyui/components/button/object.js +var object_default26 = { + ":where(.btn)": { "@layer daisyui.l1.l2.l3": { width: "unset" } }, '.prose :where(.btn-link):not(:where([class~="not-prose"], [class~="not-prose"] *))': { "text-decoration-line": "none" }, ".btn": { + "@layer daisyui.l1.l2.l3": { + display: "inline-flex", "flex-shrink": 0, cursor: "pointer", "flex-wrap": "nowrap", "align-items": "center", "justify-content": "center", gap: "calc(0.25rem * 1.5)", "text-align": "center", "vertical-align": "middle", "outline-offset": "2px", "webkit-user-select": "none", "user-select": "none", "padding-inline": "var(--btn-p)", color: "var(--btn-fg)", "--tw-prose-links": "var(--btn-fg)", height: "var(--size)", "font-size": "var(--fontsize, 0.875rem)", "font-weight": 600, "outline-color": "var(--btn-color, var(--color-base-content))", "transition-property": "color, background-color, border-color, box-shadow", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)", "transition-duration": "0.2s", "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "background-color": "var(--btn-bg)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--btn-noise)", "border-width": "var(--border)", "border-style": "solid", "border-color": "var(--btn-border)", "text-shadow": "0 0.5px oklch(100% 0 0 / calc(var(--depth) * 0.15))", "touch-action": "manipulation", "box-shadow": "0 0.5px 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 6%)) inset, var(--btn-shadow)", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--btn-bg": "var(--btn-color, var(--color-base-200))", "--btn-fg": "var(--color-base-content)", "--btn-p": "1rem", "--btn-border": "color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))", "--btn-shadow": `0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), + 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)`, "--btn-noise": "var(--fx-noise)", "@media (hover: hover)": { "&:hover": { "--btn-bg": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%)" } }, "&:focus-visible, &:has(:focus-visible)": { "outline-width": "2px", "outline-style": "solid", isolation: "isolate" }, "&:active:not(.btn-active)": { translate: "0 0.5px", "--btn-bg": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 5%)", "--btn-border": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%)", "--btn-shadow": "0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0)" }, '&:is(input[type="checkbox"], input[type="radio"])': { appearance: "none", "&[aria-label]::after": { "--tw-content": "attr(aria-label)", content: "var(--tw-content)" } }, "&:where(input:checked:not(.filter .btn))": { "--btn-color": "var(--color-primary)", "--btn-fg": "var(--color-primary-content)", isolation: "isolate" } + } + }, ".btn-disabled, .btn:disabled, .btn[disabled]": { "@layer daisyui.l1.l2": { "&:not(.btn-link, .btn-ghost)": { "background-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", "box-shadow": "none" }, "pointer-events": "none", "--btn-border": "#0000", "--btn-noise": "none", "--btn-fg": "color-mix(in oklch, var(--color-base-content) 20%, #0000)" } }, ".btn-active": { "@layer daisyui.l1.l2": { "--btn-bg": "color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%)", "--btn-shadow": "0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0)", isolation: "isolate" } }, ".btn-primary": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-primary)", "--btn-fg": "var(--color-primary-content)" } }, ".btn-secondary": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-secondary)", "--btn-fg": "var(--color-secondary-content)" } }, ".btn-accent": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-accent)", "--btn-fg": "var(--color-accent-content)" } }, ".btn-neutral": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-neutral)", "--btn-fg": "var(--color-neutral-content)" } }, ".btn-info": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-info)", "--btn-fg": "var(--color-info-content)" } }, ".btn-success": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-success)", "--btn-fg": "var(--color-success-content)" } }, ".btn-warning": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-warning)", "--btn-fg": "var(--color-warning-content)" } }, ".btn-error": { "@layer daisyui.l1.l2.l3": { "--btn-color": "var(--color-error)", "--btn-fg": "var(--color-error-content)" } }, ".btn-ghost": { "@layer daisyui.l1": { "&:not(.btn-active, :hover, :active:focus, :focus-visible, input:checked:not(.filter .btn))": { "--btn-shadow": '""', "--btn-bg": "#0000", "--btn-border": "#0000", "--btn-noise": "none", "&:not(:disabled, [disabled], .btn-disabled)": { "outline-color": "currentcolor", "--btn-fg": "var(--btn-color, currentColor)" } }, "@media (hover: none)": { "&:not(.btn-active, :active, :focus-visible, input:checked:not(.filter .btn)):hover": { "outline-color": "currentcolor", "--btn-shadow": '""', "--btn-bg": "#0000", "--btn-fg": "var(--btn-color, currentColor)", "--btn-border": "#0000", "--btn-noise": "none" } } } }, ".btn-link": { "@layer daisyui.l1": { "text-decoration-line": "underline", "outline-color": "currentcolor", "--btn-border": "#0000", "--btn-bg": "#0000", "--btn-noise": "none", "--btn-shadow": '""', "&:not(.btn-disabled, .btn:disabled, .btn[disabled])": { "--btn-fg": "var(--btn-color, var(--color-primary))" }, "&:is(.btn-active, :hover, :active:focus, :focus-visible)": { "--btn-border": "#0000", "--btn-bg": "#0000" } } }, ".btn-outline, .btn-dash": { "@layer daisyui.l1": { "&:not( .btn-active, :hover, :active:focus, :focus-visible, input:checked:not(.filter .btn), :disabled, [disabled], .btn-disabled )": { "--btn-shadow": '""', "--btn-bg": "#0000", "--btn-fg": "var(--btn-color)", "--btn-border": "var(--btn-color)", "--btn-noise": "none" }, "@media (hover: none)": { "&:not(.btn-active, :active, :focus-visible, input:checked:not(.filter .btn)):hover": { "--btn-shadow": '""', "--btn-bg": "#0000", "--btn-fg": "var(--btn-color)", "--btn-border": "var(--btn-color)", "--btn-noise": "none" } } } }, ".btn-dash": { "border-style": "dashed" }, ".btn-soft": { + "@layer daisyui.l1": { + "&:not( .btn-active, :hover, :active:focus, :focus-visible, input:checked:not(.filter .btn), :disabled, [disabled], .btn-disabled )": { + "--btn-shadow": '""', "--btn-fg": "var(--btn-color, var(--color-base-content))", "--btn-bg": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 8%, + var(--color-base-100) + )`, "--btn-border": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 10%, + var(--color-base-100) + )`, "--btn-noise": "none" + }, "@media (hover: none)": { + "&:not(.btn-active, :active, :focus-visible, input:checked:not(.filter .btn)):hover": { + "--btn-shadow": '""', "--btn-fg": "var(--btn-color, var(--color-base-content))", "--btn-bg": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 8%, + var(--color-base-100) + )`, "--btn-border": `color-mix( + in oklab, + var(--btn-color, var(--color-base-content)) 10%, + var(--color-base-100) + )`, "--btn-noise": "none" + } + } + } + }, ".btn-xs": { "@layer daisyui.l1.l2": { "--fontsize": "0.6875rem", "--btn-p": "0.5rem", "--size": "calc(var(--size-field, 0.25rem) * 6)" } }, ".btn-sm": { "@layer daisyui.l1.l2": { "--fontsize": "0.75rem", "--btn-p": "0.75rem", "--size": "calc(var(--size-field, 0.25rem) * 8)" } }, ".btn-md": { "@layer daisyui.l1.l2": { "--fontsize": "0.875rem", "--btn-p": "1rem", "--size": "calc(var(--size-field, 0.25rem) * 10)" } }, ".btn-lg": { "@layer daisyui.l1.l2": { "--fontsize": "1.125rem", "--btn-p": "1.25rem", "--size": "calc(var(--size-field, 0.25rem) * 12)" } }, ".btn-xl": { "@layer daisyui.l1.l2": { "--fontsize": "1.375rem", "--btn-p": "1.5rem", "--size": "calc(var(--size-field, 0.25rem) * 14)" } }, ".btn-square": { "@layer daisyui.l1.l2": { "padding-inline": "calc(0.25rem * 0)", width: "var(--size)", height: "var(--size)" } }, ".btn-circle": { "@layer daisyui.l1.l2": { "border-radius": "calc(infinity * 1px)", "padding-inline": "calc(0.25rem * 0)", width: "var(--size)", height: "var(--size)" } }, ".btn-wide": { "@layer daisyui.l1.l2": { width: "100%", "max-width": "calc(0.25rem * 64)" } }, ".btn-block": { "@layer daisyui.l1.l2": { width: "100%" } } +}; + +// packages/daisyui/components/button/index.js +var button_default = ({ addComponents, prefix = "" }) => { + const prefixedbutton = addPrefix(object_default26, prefix); + addComponents({ ...prefixedbutton }); +}; + +// packages/daisyui/components/fieldset/object.js +var object_default27 = { ".fieldset": { "@layer daisyui.l1.l2.l3": { display: "grid", gap: "calc(0.25rem * 1.5)", "padding-block": "calc(0.25rem * 1)", "font-size": "0.75rem", "grid-template-columns": "1fr", "grid-auto-rows": "max-content" } }, ".fieldset-legend": { "@layer daisyui.l1.l2.l3": { "margin-bottom": "calc(0.25rem * -1)", display: "flex", "align-items": "center", "justify-content": "space-between", gap: "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 2)", color: "var(--color-base-content)", "font-weight": 600 } }, ".fieldset-label": { "@layer daisyui.l1.l2.l3": { display: "flex", "align-items": "center", gap: "calc(0.25rem * 1.5)", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "&:has(input)": { cursor: "pointer" } } } }; + +// packages/daisyui/components/fieldset/index.js +var fieldset_default = ({ addComponents, prefix = "" }) => { + const prefixedfieldset = addPrefix(object_default27, prefix); + addComponents({ ...prefixedfieldset }); +}; + +// packages/daisyui/components/steps/object.js +var object_default28 = { ".steps": { "@layer daisyui.l1.l2.l3": { display: "inline-grid", "grid-auto-flow": "column", overflow: "hidden", "overflow-x": "auto", "counter-reset": "step", "grid-auto-columns": "1fr", ".step": { display: "grid", "grid-template-columns": ["repeat(1, minmax(0, 1fr))", "auto"], "grid-template-rows": ["repeat(2, minmax(0, 1fr))", "40px 1fr"], "place-items": "center", "text-align": "center", "min-width": "4rem", "--step-bg": "var(--color-base-300)", "--step-fg": "var(--color-base-content)", "&:before": { top: "calc(0.25rem * 0)", "grid-column-start": "1", "grid-row-start": "1", height: "calc(0.25rem * 2)", width: "100%", border: "1px solid", color: "var(--step-bg)", "background-color": "var(--step-bg)", content: '""', "margin-inline-start": "-100%" }, "> .step-icon, &:not(:has(.step-icon)):after": { "--tw-content": "counter(step)", content: "var(--tw-content)", "counter-increment": "step", "z-index": 1, color: "var(--step-fg)", "background-color": "var(--step-bg)", border: "1px solid var(--step-bg)", position: "relative", "grid-column-start": "1", "grid-row-start": "1", display: "grid", height: "calc(0.25rem * 8)", width: "calc(0.25rem * 8)", "place-items": "center", "place-self": "center", "border-radius": "calc(infinity * 1px)" }, "&:first-child:before": { "--tw-content": "none", content: "var(--tw-content)" }, "&[data-content]:after": { "--tw-content": "attr(data-content)", content: "var(--tw-content)" } } }, "@layer daisyui.l1.l2": { ".step-neutral": { "+ .step-neutral:before, &:after, > .step-icon": { "--step-bg": "var(--color-neutral)", "--step-fg": "var(--color-neutral-content)" } }, ".step-primary": { "+ .step-primary:before, &:after, > .step-icon": { "--step-bg": "var(--color-primary)", "--step-fg": "var(--color-primary-content)" } }, ".step-secondary": { "+ .step-secondary:before, &:after, > .step-icon": { "--step-bg": "var(--color-secondary)", "--step-fg": "var(--color-secondary-content)" } }, ".step-accent": { "+ .step-accent:before, &:after, > .step-icon": { "--step-bg": "var(--color-accent)", "--step-fg": "var(--color-accent-content)" } }, ".step-info": { "+ .step-info:before, &:after, > .step-icon": { "--step-bg": "var(--color-info)", "--step-fg": "var(--color-info-content)" } }, ".step-success": { "+ .step-success:before, &:after, > .step-icon": { "--step-bg": "var(--color-success)", "--step-fg": "var(--color-success-content)" } }, ".step-warning": { "+ .step-warning:before, &:after, > .step-icon": { "--step-bg": "var(--color-warning)", "--step-fg": "var(--color-warning-content)" } }, ".step-error": { "+ .step-error:before, &:after, > .step-icon": { "--step-bg": "var(--color-error)", "--step-fg": "var(--color-error-content)" } } } }, ".steps-horizontal": { "@layer daisyui.l1.l2": { "grid-auto-columns": "1fr", display: "inline-grid", "grid-auto-flow": "column", overflow: "hidden", "overflow-x": "auto", ".step": { display: "grid", "grid-template-columns": ["repeat(1, minmax(0, 1fr))", "auto"], "grid-template-rows": ["repeat(2, minmax(0, 1fr))", "40px 1fr"], "place-items": "center", "text-align": "center", "min-width": "4rem", "&:before": { height: "calc(0.25rem * 2)", width: "100%", translate: "0", "margin-inline-start": "-100%" }, '[dir="rtl"] &:before': { translate: "0" } } } }, ".steps-vertical": { "@layer daisyui.l1.l2": { "grid-auto-rows": "1fr", "grid-auto-flow": "row", ".step": { display: "grid", "grid-template-columns": ["repeat(2, minmax(0, 1fr))", "40px 1fr"], "grid-template-rows": ["repeat(1, minmax(0, 1fr))", "auto"], gap: "0.5rem", "min-height": "4rem", "justify-items": "start", "&:before": { height: "100%", width: "calc(0.25rem * 2)", translate: "-50% -50%", "margin-inline-start": "50%" }, '[dir="rtl"] &:before': { translate: "50% -50%" } } } } }; + +// packages/daisyui/components/steps/index.js +var steps_default = ({ addComponents, prefix = "" }) => { + const prefixedsteps = addPrefix(object_default28, prefix); + addComponents({ ...prefixedsteps }); +}; + +// packages/daisyui/components/navbar/object.js +var object_default29 = { ".navbar": { "@layer daisyui.l1.l2.l3": { display: "flex", width: "100%", "align-items": "center", padding: "0.5rem", "min-height": "4rem" } }, ":where(.navbar)": { "@layer daisyui.l1.l2": { position: "relative" } }, ".navbar-start": { "@layer daisyui.l1.l2.l3": { display: "inline-flex", "align-items": "center", width: "50%", "justify-content": "flex-start" } }, ".navbar-center": { "@layer daisyui.l1.l2.l3": { display: "inline-flex", "align-items": "center", "flex-shrink": 0 } }, ".navbar-end": { "@layer daisyui.l1.l2.l3": { display: "inline-flex", "align-items": "center", width: "50%", "justify-content": "flex-end" } } }; + +// packages/daisyui/components/navbar/index.js +var navbar_default = ({ addComponents, prefix = "" }) => { + const prefixednavbar = addPrefix(object_default29, prefix); + addComponents({ ...prefixednavbar }); +}; + +// packages/daisyui/components/stat/object.js +var object_default30 = { ".stats": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-grid", "grid-auto-flow": "column", "overflow-x": "auto", "border-radius": "var(--radius-box)" } }, ".stat": { "@layer daisyui.l1.l2.l3": { display: "inline-grid", width: "100%", "column-gap": "calc(0.25rem * 4)", "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 4)", "grid-template-columns": "repeat(1, 1fr)", "&:not(:last-child)": { "border-inline-end": "var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)", "border-block-end": "none" } } }, ".stat-figure": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "2", "grid-row": "span 3 / span 3", "grid-row-start": "1", "place-self": "center", "justify-self": "flex-end" } }, ".stat-title": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "white-space": "nowrap", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "font-size": "0.75rem" } }, ".stat-value": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "white-space": "nowrap", "font-size": "2rem", "font-weight": 800 } }, ".stat-desc": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "white-space": "nowrap", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "font-size": "0.75rem" } }, ".stat-actions": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "white-space": "nowrap" } }, ".stats-horizontal": { "@layer daisyui.l1.l2": { "grid-auto-flow": "column", "overflow-x": "auto", ".stat:not(:last-child)": { "border-inline-end": "var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)", "border-block-end": "none" } } }, ".stats-vertical": { "@layer daisyui.l1.l2": { "grid-auto-flow": "row", "overflow-y": "auto", ".stat:not(:last-child)": { "border-inline-end": "none", "border-block-end": "var(--border) dashed color-mix(in oklab, currentColor 10%, #0000)" } } } }; + +// packages/daisyui/components/stat/index.js +var stat_default = ({ addComponents, prefix = "" }) => { + const prefixedstat = addPrefix(object_default30, prefix); + addComponents({ ...prefixedstat }); +}; + +// packages/daisyui/components/countdown/object.js +var object_default31 = { + ".countdown": { + "&.countdown": { "line-height": "1em" }, "@layer daisyui.l1.l2.l3": { + display: "inline-flex", "& > *": { + visibility: "hidden", position: "relative", display: "inline-block", "overflow-y": "clip", transition: "width 0.4s ease-out 0.2s", height: "1em", "--value-v": "calc(mod(max(0, var(--value)), 1000))", "--value-hundreds": "calc(round(to-zero, var(--value-v) / 100, 1))", "--value-tens": "calc(round(to-zero, mod(var(--value-v), 100) / 10, 1))", "--value-ones": "calc(mod(var(--value-v), 100))", "--show-hundreds": "clamp(clamp(0, var(--digits, 1) - 2, 1), var(--value-hundreds), 1)", "--show-tens": `clamp( + clamp(0, var(--digits, 1) - 1, 1), + var(--value-tens) + var(--show-hundreds), + 1 + )`, "--first-digits": "calc(round(to-zero, var(--value-v) / 10, 1))", width: "calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch)", direction: "ltr", "&:before, &:after": { visibility: "visible", position: "absolute", "overflow-x": "clip", "--tw-content": '"00\\A 01\\A 02\\A 03\\A 04\\A 05\\A 06\\A 07\\A 08\\A 09\\A 10\\A 11\\A 12\\A 13\\A 14\\A 15\\A 16\\A 17\\A 18\\A 19\\A 20\\A 21\\A 22\\A 23\\A 24\\A 25\\A 26\\A 27\\A 28\\A 29\\A 30\\A 31\\A 32\\A 33\\A 34\\A 35\\A 36\\A 37\\A 38\\A 39\\A 40\\A 41\\A 42\\A 43\\A 44\\A 45\\A 46\\A 47\\A 48\\A 49\\A 50\\A 51\\A 52\\A 53\\A 54\\A 55\\A 56\\A 57\\A 58\\A 59\\A 60\\A 61\\A 62\\A 63\\A 64\\A 65\\A 66\\A 67\\A 68\\A 69\\A 70\\A 71\\A 72\\A 73\\A 74\\A 75\\A 76\\A 77\\A 78\\A 79\\A 80\\A 81\\A 82\\A 83\\A 84\\A 85\\A 86\\A 87\\A 88\\A 89\\A 90\\A 91\\A 92\\A 93\\A 94\\A 95\\A 96\\A 97\\A 98\\A 99\\A"', content: "var(--tw-content)", "font-variant-numeric": "tabular-nums", "white-space": "pre", "text-align": "end", direction: "rtl", transition: "all 1s cubic-bezier(1, 0, 0, 1), width 0.2s ease-out 0.2s, opacity 0.2s ease-out 0.2s" }, "&:before": { width: "calc(1ch + var(--show-hundreds) * 1ch)", top: "calc(var(--first-digits) * -1em)", "inset-inline-end": "0", opacity: "var(--show-tens)" }, "&:after": { width: "1ch", top: "calc(var(--value-ones) * -1em)", "inset-inline-start": "0" } + } + } + } +}; + +// packages/daisyui/components/countdown/index.js +var countdown_default = ({ addComponents, prefix = "" }) => { + const prefixedcountdown = addPrefix(object_default31, prefix); + addComponents({ ...prefixedcountdown }); +}; + +// packages/daisyui/components/skeleton/object.js +var object_default32 = { ".skeleton": { "@layer daisyui.l1.l2.l3": { "border-radius": "var(--radius-box)", "background-color": "var(--color-base-300)", "@media (prefers-reduced-motion: reduce)": { "transition-duration": "15s" }, "will-change": "background-position", "background-image": "linear-gradient( 105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100% )", "background-size": "200% auto", "background-position-x": "-50%", "@media (prefers-reduced-motion: no-preference)": { animation: "skeleton 1.8s ease-in-out infinite" } } }, ".skeleton-text": { "@layer daisyui.l1.l2": { "background-clip": "text", "webkit-background-clip": "text", color: "transparent", "background-image": "linear-gradient( 105deg, color-mix(in oklab, var(--color-base-content) 20%, transparent) 0% 40%, var(--color-base-content) 50%, color-mix(in oklab, var(--color-base-content) 20%, transparent) 60% 100% )" } }, "@keyframes skeleton": { "0%": { "background-position": "150%" }, "100%": { "background-position": "-50%" } } }; + +// packages/daisyui/components/skeleton/index.js +var skeleton_default = ({ addComponents, prefix = "" }) => { + const prefixedskeleton = addPrefix(object_default32, prefix); + addComponents({ ...prefixedskeleton }); +}; + +// packages/daisyui/components/card/object.js +var object_default33 = { ".card": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "flex", "flex-direction": "column", "border-radius": "var(--radius-box)", "outline-width": "2px", transition: "outline 0.2s ease-in-out", outline: "0 solid #0000", "outline-offset": "2px", "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible": { "outline-color": "currentColor" }, ":where(figure:first-child)": { overflow: "hidden", "border-start-start-radius": "inherit", "border-start-end-radius": "inherit", "border-end-start-radius": "unset", "border-end-end-radius": "unset" }, ":where(figure:last-child)": { overflow: "hidden", "border-start-start-radius": "unset", "border-start-end-radius": "unset", "border-end-start-radius": "inherit", "border-end-end-radius": "inherit" }, figure: { display: "flex", "align-items": "center", "justify-content": "center" }, '&:has(> input:is(input[type="checkbox"], input[type="radio"]))': { cursor: "pointer", "user-select": "none" }, "&:has(> :checked)": { outline: "2px solid currentColor" } } }, ".card-border": { "@layer daisyui.l1.l2": { border: "var(--border) solid var(--color-base-200)" } }, ".card-dash": { "@layer daisyui.l1.l2": { border: "var(--border) dashed var(--color-base-200)" } }, ".image-full": { "@layer daisyui.l1.l2": { display: "grid", "> *": { "grid-column-start": "1", "grid-row-start": "1" }, "> .card-body": { position: "relative", color: "var(--color-neutral-content)" }, ":where(figure)": { overflow: "hidden", "border-radius": "inherit" }, "> figure img": { height: "100%", "object-fit": "cover", filter: "brightness(28%)" } } }, ".card-title": { "@layer daisyui.l1.l2.l3": { display: "flex", "align-items": "center", gap: "calc(0.25rem * 2)", "font-size": "var(--cardtitle-fs, 1.125rem)", "font-weight": 600 } }, ".card-body": { "@layer daisyui.l1.l2.l3": { display: "flex", flex: "auto", "flex-direction": "column", gap: "calc(0.25rem * 2)", padding: "var(--card-p, 1.5rem)", "font-size": "var(--card-fs, 0.875rem)", ":where(p)": { "flex-grow": 1 } } }, ".card-actions": { "@layer daisyui.l1.l2.l3": { display: "flex", "flex-wrap": "wrap", "align-items": "flex-start", gap: "calc(0.25rem * 2)" } }, ".card-xs": { "@layer daisyui.l1.l2": { ".card-body": { "--card-p": "0.5rem", "--card-fs": "0.6875rem" }, ".card-title": { "--cardtitle-fs": "0.875rem" } } }, ".card-sm": { "@layer daisyui.l1.l2": { ".card-body": { "--card-p": "1rem", "--card-fs": "0.75rem" }, ".card-title": { "--cardtitle-fs": "1rem" } } }, ".card-md": { "@layer daisyui.l1.l2": { ".card-body": { "--card-p": "1.5rem", "--card-fs": "0.875rem" }, ".card-title": { "--cardtitle-fs": "1.125rem" } } }, ".card-lg": { "@layer daisyui.l1.l2": { ".card-body": { "--card-p": "2rem", "--card-fs": "1rem" }, ".card-title": { "--cardtitle-fs": "1.25rem" } } }, ".card-xl": { "@layer daisyui.l1.l2": { ".card-body": { "--card-p": "2.5rem", "--card-fs": "1.125rem" }, ".card-title": { "--cardtitle-fs": "1.375rem" } } }, ".card-side": { "@layer daisyui.l1.l2": { "align-items": "stretch", "flex-direction": "row", ":where(figure:first-child)": { overflow: "hidden", "border-start-start-radius": "inherit", "border-start-end-radius": "unset", "border-end-start-radius": "inherit", "border-end-end-radius": "unset" }, ":where(figure:last-child)": { overflow: "hidden", "border-start-start-radius": "unset", "border-start-end-radius": "inherit", "border-end-start-radius": "unset", "border-end-end-radius": "inherit" }, "figure > *": { "max-width": "unset" }, ":where(figure > *)": { width: "100%", height: "100%", "object-fit": "cover" } } } }; + +// packages/daisyui/components/card/index.js +var card_default = ({ addComponents, prefix = "" }) => { + const prefixedcard = addPrefix(object_default33, prefix); + addComponents({ ...prefixedcard }); +}; + +// packages/daisyui/components/drawer/object.js +var object_default34 = { ".drawer": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "grid", width: "100%", "grid-auto-columns": "max-content auto" } }, ".drawer-content": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "2", "grid-row-start": "1", "min-width": "calc(0.25rem * 0)" } }, ":where(.drawer-side)": { "@layer daisyui.l1.l2.l3": { "overflow-x": "hidden", "overflow-y": "hidden" } }, ".drawer-side": { "@layer daisyui.l1.l2.l3": { "pointer-events": "none", visibility: "hidden", position: "fixed", "inset-inline-start": "calc(0.25rem * 0)", top: "calc(0.25rem * 0)", "z-index": 10, "grid-column-start": "1", "grid-row-start": "1", display: "grid", width: "100%", "grid-template-columns": "repeat(1, minmax(0, 1fr))", "grid-template-rows": "repeat(1, minmax(0, 1fr))", "align-items": "flex-start", "justify-items": "start", "overscroll-behavior": "contain", "background-color": "transparent", opacity: "0%", transition: "opacity 0.2s ease-out 0.1s allow-discrete, visibility 0.3s ease-out 0.1s allow-discrete", height: ["100vh", "100dvh"], "> .drawer-overlay": { position: "sticky", top: "calc(0.25rem * 0)", cursor: "pointer", "place-self": "stretch", "background-color": "oklch(0% 0 0 / 40%)" }, "> *": { "grid-column-start": "1", "grid-row-start": "1" }, "> :not(.drawer-overlay)": { "will-change": "transform", transition: "translate 0.3s ease-out, width 0.2s ease-out", translate: "-100%", '[dir="rtl"] &': { translate: "100%" } } } }, ".drawer-toggle": { "@layer daisyui.l1.l2.l3": { position: "fixed", height: "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", appearance: "none", opacity: "0%", ":where(&:checked ~ .drawer-side)": { "scrollbar-color": "color-mix(in oklch, currentColor 35%, #0000) oklch(0 0 0 / calc(var(--page-has-backdrop, 0) * 0.4))" }, ":where(:root:has(&:checked))": { "--page-has-backdrop": "1", "--page-overflow": "hidden", "--page-scroll-bg": "var(--page-scroll-bg-on)", "--page-scroll-gutter": "stable", "--page-scroll-transition": "var(--page-scroll-transition-on)", animation: "set-page-has-scroll forwards", "animation-timeline": "scroll()" } }, "@layer daisyui.l1.l2": { ":where(&:checked ~ .drawer-side)": { "pointer-events": "auto", visibility: "visible", "overflow-y": "auto", opacity: "100%", "> :not(.drawer-overlay)": { translate: "0%" } }, "&:focus-visible ~ .drawer-content label.drawer-button": { outline: "2px solid", "outline-offset": "2px" } } }, ".drawer-end": { "@layer daisyui.l1.l2": { "grid-auto-columns": "auto max-content", "> .drawer-toggle": { "~ .drawer-content": { "grid-column-start": "1" }, "~ .drawer-side": { "grid-column-start": "2", "justify-items": "end" }, "~ .drawer-side > :not(.drawer-overlay)": { translate: "100%", '[dir="rtl"] &': { translate: "-100%" } }, "&:checked ~ .drawer-side > :not(.drawer-overlay)": { translate: "0%" } } } }, ".drawer-open": { "@layer daisyui.l1.l2.l3": { "> .drawer-toggle:checked": { "~ .drawer-side": { "scrollbar-color": "revert-layer" }, ":root:has(&)": { "--page-overflow": "revert-layer", "--page-scroll-gutter": "revert-layer", "--page-scroll-bg": "revert-layer", "--page-scroll-transition": "revert-layer", "--page-has-backdrop": "revert-layer", animation: "revert-layer", "animation-timeline": "revert-layer" } } }, "@layer daisyui.l1.l2": { "> .drawer-side": { "overflow-y": "auto" }, "> .drawer-toggle": { display: "none", "~ .drawer-side": { "pointer-events": "auto", visibility: "visible", position: "sticky", display: "block", width: "auto", "overscroll-behavior": "auto", opacity: "100%", "> .drawer-overlay": { cursor: "default", "background-color": "transparent" } }, "&:checked ~ .drawer-side": { "pointer-events": "auto", visibility: "visible" } } }, "@layer daisyui.l1": { "> .drawer-toggle ~ .drawer-side > :not(.drawer-overlay)": { translate: "0%", '[dir="rtl"] &': { translate: "0%" } } } } }; + +// packages/daisyui/components/drawer/index.js +var drawer_default = ({ addComponents, prefix = "" }) => { + const prefixeddrawer = addPrefix(object_default34, prefix); + addComponents({ ...prefixeddrawer }); +}; + +// packages/daisyui/components/indicator/object.js +var object_default35 = { ".indicator": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-flex", width: "max-content", ":where(.indicator-item)": { "z-index": 1, position: "absolute", "white-space": "nowrap", top: "var(--indicator-t, 0)", bottom: "var(--indicator-b, auto)", left: "var(--indicator-s, auto)", right: "var(--indicator-e, 0)", translate: "var(--indicator-x, 50%) var(--indicator-y, -50%)" } } }, ".indicator-start": { "@layer daisyui.l1.l2": { "--indicator-s": "0", "--indicator-e": "auto", "--indicator-x": "-50%", '[dir="rtl"] &': { "--indicator-s": "auto", "--indicator-e": "0", "--indicator-x": "50%" } } }, ".indicator-center": { "@layer daisyui.l1.l2": { "--indicator-s": "50%", "--indicator-e": "50%", "--indicator-x": "-50%", '[dir="rtl"] &': { "--indicator-x": "50%" } } }, ".indicator-end": { "@layer daisyui.l1.l2": { "--indicator-s": "auto", "--indicator-e": "0", "--indicator-x": "50%", '[dir="rtl"] &': { "--indicator-s": "0", "--indicator-e": "auto", "--indicator-x": "-50%" } } }, ".indicator-bottom": { "@layer daisyui.l1.l2": { "--indicator-t": "auto", "--indicator-b": "0", "--indicator-y": "50%" } }, ".indicator-middle": { "@layer daisyui.l1.l2": { "--indicator-t": "50%", "--indicator-b": "50%", "--indicator-y": "-50%" } }, ".indicator-top": { "@layer daisyui.l1.l2": { "--indicator-t": "0", "--indicator-b": "auto", "--indicator-y": "-50%" } } }; + +// packages/daisyui/components/indicator/index.js +var indicator_default = ({ addComponents, prefix = "" }) => { + const prefixedindicator = addPrefix(object_default35, prefix); + addComponents({ ...prefixedindicator }); +}; + +// packages/daisyui/components/footer/object.js +var object_default36 = { ".footer": { "@layer daisyui.l1.l2.l3": { display: "grid", width: "100%", "grid-auto-flow": "row", "place-items": "start", "column-gap": "calc(0.25rem * 4)", "row-gap": "calc(0.25rem * 10)", "font-size": "0.875rem", "line-height": "1.25rem", "& > *": { display: "grid", "place-items": "start", gap: "calc(0.25rem * 2)" }, "&.footer-center": { "grid-auto-flow": "column dense", "place-items": "center", "text-align": "center", "& > *": { "place-items": "center" } } } }, ".footer-title": { "@layer daisyui.l1.l2.l3": { "margin-bottom": "calc(0.25rem * 2)", "text-transform": "uppercase", opacity: "60%", "font-weight": 600 } }, ".footer-horizontal": { "@layer daisyui.l1.l2": { "grid-auto-flow": "column", "&.footer-center": { "grid-auto-flow": "row dense" } } }, ".footer-vertical": { "@layer daisyui.l1.l2": { "grid-auto-flow": "row", "&.footer-center": { "grid-auto-flow": "column dense" } } } }; + +// packages/daisyui/components/footer/index.js +var footer_default = ({ addComponents, prefix = "" }) => { + const prefixedfooter = addPrefix(object_default36, prefix); + addComponents({ ...prefixedfooter }); +}; + +// packages/daisyui/components/loading/object.js +var object_default37 = { ".loading": { "@layer daisyui.l1.l2.l3": { "pointer-events": "none", display: "inline-block", "aspect-ratio": "1 / 1", "background-color": "currentcolor", "vertical-align": "middle", width: "calc(var(--size-selector, 0.25rem) * 6)", "mask-size": "100%", "mask-repeat": "no-repeat", "mask-position": "center", "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")` } }, ".loading-spinner": { "@layer daisyui.l1.l2": { "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")` } }, ".loading-dots": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='4' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3C/circle%3E%3Ccircle cx='12' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.1s'/%3E%3C/circle%3E%3Ccircle cx='20' cy='12' r='3'%3E%3Canimate attributeName='cy' values='12;6;12;12' keyTimes='0;0.286;0.571;1' dur='1.05s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1' begin='0.2s'/%3E%3C/circle%3E%3C/svg%3E")` } }, ".loading-ring": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3Csvg width='44' height='44' viewBox='0 0 44 44' xmlns='http://www.w3.org/2000/svg' stroke='white'%3E%3Cg fill='none' fill-rule='evenodd' stroke-width='2'%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='0s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='0s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3Ccircle cx='22' cy='22' r='1'%3E%3Canimate attributeName='r' begin='-0.9s' dur='1.8s' values='1;20' calcMode='spline' keyTimes='0;1' keySplines='0.165,0.84,0.44,1' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-opacity' begin='-0.9s' dur='1.8s' values='1;0' calcMode='spline' keyTimes='0;1' keySplines='0.3,0.61,0.355,1' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")` } }, ".loading-ball": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cellipse cx='12' cy='5' rx='4' ry='4'%3E%3Canimate attributeName='cy' values='5;20;20.5;20;5' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite' keySplines='.33,0,.66,.33;.33,.66,.66,1'/%3E%3Canimate attributeName='rx' values='4;4;4.8;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='ry' values='4;4;3;4;4' keyTimes='0;0.469;0.5;0.531;1' dur='.8s' repeatCount='indefinite'/%3E%3C/ellipse%3E%3C/svg%3E")` } }, ".loading-bars": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='1' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite'/%3E%3C/rect%3E%3Crect x='9' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.65s'/%3E%3C/rect%3E%3Crect x='17' y='1' width='6' height='22'%3E%3Canimate attributeName='y' values='1;5;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='height' values='22;14;22' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3Canimate attributeName='opacity' values='1;0.2;1' keyTimes='0;0.938;1' dur='.8s' repeatCount='indefinite' begin='-0.5s'/%3E%3C/rect%3E%3C/svg%3E")` } }, ".loading-infinity": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' style='shape-rendering:auto;' width='200px' height='200px' viewBox='0 0 100 100' preserveAspectRatio='xMidYMid'%3E%3Cpath fill='none' stroke='black' stroke-width='10' stroke-dasharray='205.271 51.318' d='M24.3 30C11.4 30 5 43.3 5 50s6.4 20 19.3 20c19.3 0 32.1-40 51.4-40C88.6 30 95 43.3 95 50s-6.4 20-19.3 20C56.4 70 43.6 30 24.3 30z' stroke-linecap='round' style='transform:scale(0.8);transform-origin:50px 50px'%3E%3Canimate attributeName='stroke-dashoffset' repeatCount='indefinite' dur='2s' keyTimes='0;1' values='0;256.589'/%3E%3C/path%3E%3C/svg%3E")` } }, ".loading-xs": { "@layer daisyui.l1.l2": { width: "calc(var(--size-selector, 0.25rem) * 4)" } }, ".loading-sm": { "@layer daisyui.l1.l2": { width: "calc(var(--size-selector, 0.25rem) * 5)" } }, ".loading-md": { "@layer daisyui.l1.l2": { width: "calc(var(--size-selector, 0.25rem) * 6)" } }, ".loading-lg": { "@layer daisyui.l1.l2": { width: "calc(var(--size-selector, 0.25rem) * 7)" } }, ".loading-xl": { "@layer daisyui.l1.l2": { width: "calc(var(--size-selector, 0.25rem) * 8)" } } }; + +// packages/daisyui/components/loading/index.js +var loading_default = ({ addComponents, prefix = "" }) => { + const prefixedloading = addPrefix(object_default37, prefix); + addComponents({ ...prefixedloading }); +}; + +// packages/daisyui/components/menu/object.js +var object_default38 = { ".menu": { "@layer daisyui.l1.l2.l3": { display: "flex", width: "fit-content", "flex-direction": "column", "flex-wrap": "wrap", padding: "calc(0.25rem * 2)", "--menu-active-fg": "var(--color-neutral-content)", "--menu-active-bg": "var(--color-neutral)", "font-size": "0.875rem", ":where(li ul)": { position: "relative", "margin-inline-start": "calc(0.25rem * 4)", "padding-inline-start": "calc(0.25rem * 2)", "white-space": "nowrap", "&:before": { position: "absolute", "inset-inline-start": "calc(0.25rem * 0)", top: "calc(0.25rem * 3)", bottom: "calc(0.25rem * 3)", "background-color": "var(--color-base-content)", opacity: "10%", width: "var(--border)", content: '""' } }, ":where(li > .menu-dropdown:not(.menu-dropdown-show))": { display: "none" }, ":where(li:not(.menu-title) > *:not(ul, details, .menu-title, .btn)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { display: "grid", "grid-auto-flow": "column", "align-content": "flex-start", "align-items": "center", gap: "calc(0.25rem * 2)", "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1.5)", "text-align": "start", "transition-property": "color, background-color, box-shadow", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)", "grid-auto-columns": "minmax(auto, max-content) auto max-content", "text-wrap": "balance", "user-select": "none" }, ":where(li > details > summary)": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" }, "&::-webkit-details-marker": { display: "none" } }, ":where(li > details > summary), :where(li > .menu-dropdown-toggle)": { "&:after": { "justify-self": "flex-end", display: "block", height: "0.375rem", width: "0.375rem", rotate: "-135deg", translate: "0 -1px", "transition-property": "rotate, translate", "transition-duration": "0.2s", content: '""', "transform-origin": "50% 50%", "box-shadow": "2px 2px inset", "pointer-events": "none" } }, details: { overflow: "hidden", "interpolate-size": "allow-keywords" }, "details::details-content": { "block-size": "0", "@media (prefers-reduced-motion: no-preference)": { "transition-behavior": "allow-discrete", "transition-property": "block-size, content-visibility", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)" } }, "details[open]::details-content": { "block-size": "auto" }, ":where(li > details[open] > summary):after, :where(li > .menu-dropdown-toggle.menu-dropdown-show):after": { rotate: "45deg", translate: "0 1px" }, ":where( li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title), li:not(.menu-title, .disabled) > details > summary:not(.menu-title) ):not(.menu-active, :active, .btn)": { "&.menu-focus, &:focus-visible": { cursor: "pointer", "background-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", color: "var(--color-base-content)", "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } } }, ":where( li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title):not(.menu-active, :active, .btn):hover, li:not(.menu-title, .disabled) > details > summary:not(.menu-title):not(.menu-active, :active, .btn):hover )": { cursor: "pointer", "background-color": "color-mix(in oklab, var(--color-base-content) 10%, transparent)", "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" }, "box-shadow": "0 1px oklch(0% 0 0 / 0.01) inset, 0 -1px oklch(100% 0 0 / 0.01) inset" }, ":where(li:empty)": { "background-color": "var(--color-base-content)", opacity: "10%", margin: "0.5rem 1rem", height: "1px" }, ":where(li)": { position: "relative", display: "flex", "flex-shrink": 0, "flex-direction": "column", "flex-wrap": "wrap", "align-items": "stretch", ".badge": { "justify-self": "flex-end" }, "& > *:not(ul, .menu-title, details, .btn):active, & > *:not(ul, .menu-title, details, .btn).menu-active, & > details > summary:active": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" }, color: "var(--menu-active-fg)", "background-color": "var(--menu-active-bg)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "&:not(&:active)": { "box-shadow": "0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)" } }, "&.menu-disabled": { "pointer-events": "none", color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" } }, ".dropdown:focus-within": { ".menu-dropdown-toggle:after": { rotate: "45deg", translate: "0 1px" } }, ".dropdown-content": { "margin-top": "calc(0.25rem * 2)", padding: "calc(0.25rem * 2)", "&:before": { display: "none" } } } }, ".menu-title": { "@layer daisyui.l1.l2.l3": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "font-size": "0.875rem", "font-weight": 600 } }, ".menu-horizontal": { "@layer daisyui.l1.l2": { display: "inline-flex", "flex-direction": "row", "& > li:not(.menu-title) > details": { "& > ul": { position: "absolute", "margin-inline-start": "calc(0.25rem * 0)", "margin-top": "calc(0.25rem * 4)", "transform-origin": "top", "border-radius": "var(--radius-box)", "background-color": "var(--color-base-100)", "padding-block": "calc(0.25rem * 2)", "padding-inline-end": "calc(0.25rem * 2)", opacity: "0%", scale: "95%", "box-shadow": "0 1px 3px 0 oklch(0% 0 0/0.1), 0 1px 2px -1px oklch(0% 0 0/0.1)", "@media (prefers-reduced-motion: no-preference)": { "@starting-style": { scale: "95%", opacity: 0 }, animation: "menu 0.2s", "transition-property": "opacity, scale, display", "transition-behavior": "allow-discrete", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)" } }, "&[open] > ul": { opacity: "100%", scale: "100%" } }, "& > li > details > ul": { "&:before": { "--tw-content": "none", content: "var(--tw-content)" } } } }, ".menu-vertical": { "@layer daisyui.l1.l2": { display: "inline-flex", "flex-direction": "column", "& > li:not(.menu-title) > details > ul": { position: "relative", "margin-inline-start": "calc(0.25rem * 4)", "margin-top": "calc(0.25rem * 0)", "padding-block": "calc(0.25rem * 0)", "padding-inline-end": "calc(0.25rem * 0)", "background-color": "revert-layer", "border-radius": "revert-layer", animation: "revert-layer", transition: "revert-layer", "box-shadow": "revert-layer" } } }, ".menu-xs": { "@layer daisyui.l1.l2": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)", "font-size": "0.6875rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)" } } }, ".menu-sm": { "@layer daisyui.l1.l2": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 2.5)", "padding-block": "calc(0.25rem * 1)", "font-size": "0.75rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)" } } }, ".menu-md": { "@layer daisyui.l1.l2": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1.5)", "font-size": "0.875rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)" } } }, ".menu-lg": { "@layer daisyui.l1.l2": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 1.5)", "font-size": "1.125rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 3)" } } }, ".menu-xl": { "@layer daisyui.l1.l2": { ":where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title))": { "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 5)", "padding-block": "calc(0.25rem * 1.5)", "font-size": "1.375rem" }, ".menu-title": { "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 3)" } } }, ":where(:not(ul, details, .menu-title, .btn)).menu-active": { "@layer daisyui.l1.l2": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" }, color: "var(--menu-active-fg)", "background-color": "var(--menu-active-bg)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)" } }, "@keyframes menu": { "0%": { opacity: 0 } } }; + +// packages/daisyui/components/menu/index.js +var menu_default = ({ addComponents, prefix = "" }) => { + const prefixedmenu = addPrefix(object_default38, prefix); + addComponents({ ...prefixedmenu }); +}; + +// packages/daisyui/components/toggle/object.js +var object_default39 = { + ".toggle": { + "@layer daisyui.l1.l2.l3": { + border: "var(--border) solid currentColor", color: "var(--input-color)", position: "relative", display: "inline-grid", "flex-shrink": 0, cursor: "pointer", appearance: "none", "place-content": "center", "vertical-align": "middle", "webkit-user-select": "none", "user-select": "none", "grid-template-columns": "0fr 1fr 1fr", "--radius-selector-max": `calc( + var(--radius-selector) + var(--radius-selector) + var(--radius-selector) + )`, "border-radius": "calc( var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)) )", padding: "var(--toggle-p)", "box-shadow": "0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset", transition: "color 0.3s, grid-template-columns 0.2s", "--input-color": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--toggle-p": "calc(var(--size) * 0.125)", "--size": "calc(var(--size-selector, 0.25rem) * 6)", width: "calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2)", height: "var(--size)", "> *": { "z-index": 1, "grid-column": "span 1 / span 1", "grid-column-start": "2", "grid-row-start": "1", height: "100%", cursor: "pointer", appearance: "none", "background-color": "transparent", padding: "calc(0.25rem * 0.5)", transition: "opacity 0.2s, rotate 0.4s", border: "none", "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:nth-child(2)": { color: "var(--color-base-100)", rotate: "0deg" }, "&:nth-child(3)": { color: "var(--color-base-100)", opacity: "0%", rotate: "-15deg" } }, "&:has(:checked)": { "> :nth-child(2)": { opacity: "0%", rotate: "15deg" }, "> :nth-child(3)": { opacity: "100%", rotate: "0deg" } }, "&:before": { position: "relative", "inset-inline-start": "calc(0.25rem * 0)", "grid-column-start": "2", "grid-row-start": "1", "aspect-ratio": "1 / 1", height: "100%", "border-radius": "var(--radius-selector)", "background-color": "currentcolor", translate: "0", "--tw-content": '""', content: "var(--tw-content)", transition: "background-color 0.1s, translate 0.2s, inset-inline-start 0.2s", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)" }, "@media (forced-colors: active)": { "&:before": { "outline-style": "var(--tw-outline-style)", "outline-width": "1px", "outline-offset": "calc(1px * -1)" } }, "@media print": { "&:before": { outline: "0.25rem solid", "outline-offset": "-1rem" } }, "&:focus-visible, &:has(:focus-visible)": { outline: "2px solid currentColor", "outline-offset": "2px" }, '&:checked, &[aria-checked="true"], &:has(> input:checked)': { "grid-template-columns": "1fr 1fr 0fr", "background-color": "var(--color-base-100)", "--input-color": "var(--color-base-content)", "&:before": { "background-color": "currentcolor" }, "@starting-style": { "&:before": { opacity: 0 } } }, "&:indeterminate": { "grid-template-columns": "0.5fr 1fr 0.5fr" }, "&:disabled": { cursor: "not-allowed", opacity: "30%", "&:before": { "background-color": "transparent", border: "var(--border) solid currentColor" } } + } + }, ".toggle-primary": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-primary)" } } }, ".toggle-secondary": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-secondary)" } } }, ".toggle-accent": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-accent)" } } }, ".toggle-neutral": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-neutral)" } } }, ".toggle-success": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-success)" } } }, ".toggle-warning": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-warning)" } } }, ".toggle-info": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-info)" } } }, ".toggle-error": { "@layer daisyui.l1.l2": { '&:checked, &[aria-checked="true"]': { "--input-color": "var(--color-error)" } } }, ".toggle-xs": { "@layer daisyui.l1.l2": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 4)" } } }, ".toggle-sm": { "@layer daisyui.l1.l2": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 5)" } } }, ".toggle-md": { "@layer daisyui.l1.l2": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 6)" } } }, ".toggle-lg": { "@layer daisyui.l1.l2": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 7)" } } }, ".toggle-xl": { "@layer daisyui.l1.l2": { '&:is([type="checkbox"]), &:has([type="checkbox"])': { "--size": "calc(var(--size-selector, 0.25rem) * 8)" } } } +}; + +// packages/daisyui/components/toggle/index.js +var toggle_default = ({ addComponents, prefix = "" }) => { + const prefixedtoggle = addPrefix(object_default39, prefix); + addComponents({ ...prefixedtoggle }); +}; + +// packages/daisyui/components/badge/object.js +var object_default40 = { ".badge": { "@layer daisyui.l1.l2.l3": { display: "inline-flex", "align-items": "center", "justify-content": "center", gap: "calc(0.25rem * 2)", "border-radius": "var(--radius-selector)", "vertical-align": "middle", color: "var(--badge-fg)", border: "var(--border) solid var(--badge-color, var(--color-base-200))", "font-size": "0.875rem", width: "fit-content", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "background-color": "var(--badge-bg)", "--badge-bg": "var(--badge-color, var(--color-base-100))", "--badge-fg": "var(--color-base-content)", "--size": "calc(var(--size-selector, 0.25rem) * 6)", height: "var(--size)", "padding-inline": "calc(var(--size) / 2 - var(--border))" } }, ".badge-outline": { "@layer daisyui.l1.l2": { color: "var(--badge-color)", "--badge-bg": "#0000", "background-image": "none", "border-color": "currentColor" } }, ".badge-dash": { "@layer daisyui.l1.l2": { color: "var(--badge-color)", "--badge-bg": "#0000", "background-image": "none", "border-color": "currentColor", "border-style": "dashed" } }, ".badge-soft": { "@layer daisyui.l1.l2": { color: "var(--badge-color, var(--color-base-content))", "background-color": "color-mix( in oklab, var(--badge-color, var(--color-base-content)) 8%, var(--color-base-100) )", "border-color": "color-mix( in oklab, var(--badge-color, var(--color-base-content)) 10%, var(--color-base-100) )", "background-image": "none" } }, ".badge-primary": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-primary)", "--badge-fg": "var(--color-primary-content)" } }, ".badge-secondary": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-secondary)", "--badge-fg": "var(--color-secondary-content)" } }, ".badge-accent": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-accent)", "--badge-fg": "var(--color-accent-content)" } }, ".badge-neutral": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-neutral)", "--badge-fg": "var(--color-neutral-content)" } }, ".badge-info": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-info)", "--badge-fg": "var(--color-info-content)" } }, ".badge-success": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-success)", "--badge-fg": "var(--color-success-content)" } }, ".badge-warning": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-warning)", "--badge-fg": "var(--color-warning-content)" } }, ".badge-error": { "@layer daisyui.l1.l2": { "--badge-color": "var(--color-error)", "--badge-fg": "var(--color-error-content)" } }, ".badge-ghost": { "@layer daisyui.l1.l2": { "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "var(--color-base-content)", "background-image": "none" } }, ".badge-xs": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 4)", "font-size": "0.625rem" } }, ".badge-sm": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 5)", "font-size": "0.75rem" } }, ".badge-md": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 6)", "font-size": "0.875rem" } }, ".badge-lg": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 7)", "font-size": "1rem" } }, ".badge-xl": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 8)", "font-size": "1.125rem" } } }; + +// packages/daisyui/components/badge/index.js +var badge_default = ({ addComponents, prefix = "" }) => { + const prefixedbadge = addPrefix(object_default40, prefix); + addComponents({ ...prefixedbadge }); +}; + +// packages/daisyui/components/link/object.js +var object_default41 = { ".link": { "@layer daisyui.l1.l2.l3": { cursor: "pointer", "text-decoration-line": "underline", "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible": { outline: "2px solid currentColor", "outline-offset": "2px" } } }, ".link-hover": { "@layer daisyui.l1.l2": { "text-decoration-line": "none", "&:hover": { "@media (hover: hover)": { "text-decoration-line": "underline" } } } }, ".link-primary": { "@layer daisyui.l1.l2": { color: "var(--color-primary)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-primary) 80%, #000)" } } } }, ".link-secondary": { "@layer daisyui.l1.l2": { color: "var(--color-secondary)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-secondary) 80%, #000)" } } } }, ".link-accent": { "@layer daisyui.l1.l2": { color: "var(--color-accent)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-accent) 80%, #000)" } } } }, ".link-neutral": { "@layer daisyui.l1.l2": { color: "var(--color-neutral)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-neutral) 80%, #000)" } } } }, ".link-success": { "@layer daisyui.l1.l2": { color: "var(--color-success)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-success) 80%, #000)" } } } }, ".link-info": { "@layer daisyui.l1.l2": { color: "var(--color-info)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-info) 80%, #000)" } } } }, ".link-warning": { "@layer daisyui.l1.l2": { color: "var(--color-warning)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-warning) 80%, #000)" } } } }, ".link-error": { "@layer daisyui.l1.l2": { color: "var(--color-error)", "@media (hover: hover)": { "&:hover": { color: "color-mix(in oklab, var(--color-error) 80%, #000)" } } } } }; + +// packages/daisyui/components/link/index.js +var link_default = ({ addComponents, prefix = "" }) => { + const prefixedlink = addPrefix(object_default41, prefix); + addComponents({ ...prefixedlink }); +}; + +// packages/daisyui/components/validator/object.js +var object_default42 = { ".validator": { "@layer daisyui.l1.l2.l3": { "&:user-valid, &:has(:user-valid)": { '&, &:focus, &:checked, &[aria-checked="true"], &:focus-within': { "--input-color": "var(--color-success)" } }, '&:user-invalid, &:has(:user-invalid), &[aria-invalid]:not([aria-invalid="false"]), &:has([aria-invalid]:not([aria-invalid="false"]))': { '&, &:focus, &:checked, &[aria-checked="true"], &:focus-within': { "--input-color": "var(--color-error)" }, "& ~ .validator-hint": { visibility: "visible", color: "var(--color-error)" } } }, '&:user-invalid, &:has(:user-invalid), &[aria-invalid]:not([aria-invalid="false"]), &:has([aria-invalid]:not([aria-invalid="false"]))': { "& ~ .validator-hint": { display: "revert-layer" } } }, ".validator-hint": { "@layer daisyui.l1.l2.l3": { visibility: "hidden", "margin-top": "calc(0.25rem * 2)", "font-size": "0.75rem" } } }; + +// packages/daisyui/components/validator/index.js +var validator_default = ({ addComponents, prefix = "" }) => { + const prefixedvalidator = addPrefix(object_default42, prefix); + addComponents({ ...prefixedvalidator }); +}; + +// packages/daisyui/components/list/object.js +var object_default43 = { + ".list": { + "@layer daisyui.l1.l2.l3": { display: "flex", "flex-direction": "column", "font-size": "0.875rem", ".list-row": { "--list-grid-cols": "minmax(0, auto) 1fr", position: "relative", display: "grid", "grid-auto-flow": "column", gap: "calc(0.25rem * 4)", "border-radius": "var(--radius-box)", padding: "calc(0.25rem * 4)", "word-break": "break-word", "grid-template-columns": "var(--list-grid-cols)" }, "& > :not(:last-child)": { "&.list-row, .list-row": { "&:after": { content: '""', "border-bottom": "var(--border) solid", "inset-inline": "var(--radius-box)", position: "absolute", bottom: "calc(0.25rem * 0)", "border-color": "color-mix(in oklab, var(--color-base-content) 5%, transparent)" } } } }, "@layer daisyui.l1.l2": { + ".list-row": { + "&:has(.list-col-grow:nth-child(1))": { "--list-grid-cols": "1fr" }, "&:has(.list-col-grow:nth-child(2))": { "--list-grid-cols": "minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(3))": { "--list-grid-cols": "minmax(0, auto) minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(4))": { "--list-grid-cols": "minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(5))": { "--list-grid-cols": "minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr" }, "&:has(.list-col-grow:nth-child(6))": { + "--list-grid-cols": `minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) + minmax(0, auto) 1fr` }, "> *": { "grid-row-start": "1" } + } + } + }, ".list-col-wrap": { "@layer daisyui.l1": { "grid-row-start": "2" } } +}; + +// packages/daisyui/components/list/index.js +var list_default = ({ addComponents, prefix = "" }) => { + const prefixedlist = addPrefix(object_default43, prefix); + addComponents({ ...prefixedlist }); +}; + +// packages/daisyui/components/tooltip/object.js +var object_default44 = { ".tooltip": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-block", "--tt-bg": "var(--color-neutral)", "--tt-off": "calc(100% + 0.5rem)", "--tt-tail": "calc(100% + 1px + 0.25rem)", "& > .tooltip-content, &[data-tip]:before": { position: "absolute", "max-width": "20rem", "border-radius": "var(--radius-field)", "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)", "text-align": "center", "white-space": "normal", color: "var(--color-neutral-content)", opacity: "0%", "font-size": "0.875rem", "line-height": 1.25, "background-color": "var(--tt-bg)", width: "max-content", "pointer-events": "none", "z-index": 2, "--tw-content": "attr(data-tip)", content: "var(--tw-content)" }, "&:after": { opacity: "0%", "background-color": "var(--tt-bg)", content: '""', "pointer-events": "none", width: "0.625rem", height: "0.25rem", display: "block", position: "absolute", "mask-repeat": "no-repeat", "mask-position": "-1px 0", "--mask-tooltip": `url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A")`, "mask-image": "var(--mask-tooltip)" }, "@media (prefers-reduced-motion: no-preference)": { "& > .tooltip-content, &[data-tip]:before, &:after": { transition: "opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms" } }, '&:is([data-tip]:not([data-tip=""]), :has(.tooltip-content:not(:empty)))': { "&.tooltip-open, &:hover, &:has(:focus-visible)": { "& > .tooltip-content, &[data-tip]:before, &:after": { opacity: "100%", "--tt-pos": "0rem", "@media (prefers-reduced-motion: no-preference)": { transition: "opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s" } } } } } }, ".tooltip, .tooltip-top": { "@layer daisyui.l1.l2": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(-50%) translateY(var(--tt-pos, 0.25rem))", inset: "auto auto var(--tt-off) 50%" }, "&:after": { transform: "translateX(-50%) translateY(var(--tt-pos, 0.25rem))", inset: "auto auto var(--tt-tail) 50%" } } }, ".tooltip-bottom": { "@layer daisyui.l1.l2": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(-50%) translateY(var(--tt-pos, -0.25rem))", inset: "var(--tt-off) auto auto 50%" }, "&:after": { transform: "translateX(-50%) translateY(var(--tt-pos, -0.25rem)) rotate(180deg)", inset: "var(--tt-tail) auto auto 50%" } } }, ".tooltip-left": { "@layer daisyui.l1.l2": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(calc(var(--tt-pos, 0.25rem) - 0.25rem)) translateY(-50%)", inset: "50% var(--tt-off) auto auto" }, "&:after": { transform: "translateX(var(--tt-pos, 0.25rem)) translateY(-50%) rotate(-90deg)", inset: "50% calc(var(--tt-tail) + 1px) auto auto" } } }, ".tooltip-right": { "@layer daisyui.l1.l2": { "> .tooltip-content, &[data-tip]:before": { transform: "translateX(calc(var(--tt-pos, -0.25rem) + 0.25rem)) translateY(-50%)", inset: "50% auto auto var(--tt-off)" }, "&:after": { transform: "translateX(var(--tt-pos, -0.25rem)) translateY(-50%) rotate(90deg)", inset: "50% auto auto calc(var(--tt-tail) + 1px)" } } }, ".tooltip-primary": { "@layer daisyui.l1.l2": { "--tt-bg": "var(--color-primary)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-primary-content)" } } }, ".tooltip-secondary": { "@layer daisyui.l1.l2": { "--tt-bg": "var(--color-secondary)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-secondary-content)" } } }, ".tooltip-accent": { "@layer daisyui.l1.l2": { "--tt-bg": "var(--color-accent)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-accent-content)" } } }, ".tooltip-info": { "@layer daisyui.l1.l2": { "--tt-bg": "var(--color-info)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-info-content)" } } }, ".tooltip-success": { "@layer daisyui.l1.l2": { "--tt-bg": "var(--color-success)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-success-content)" } } }, ".tooltip-warning": { "@layer daisyui.l1.l2": { "--tt-bg": "var(--color-warning)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-warning-content)" } } }, ".tooltip-error": { "@layer daisyui.l1.l2": { "--tt-bg": "var(--color-error)", "> .tooltip-content, &[data-tip]:before": { color: "var(--color-error-content)" } } } }; + +// packages/daisyui/components/tooltip/index.js +var tooltip_default = ({ addComponents, prefix = "" }) => { + const prefixedtooltip = addPrefix(object_default44, prefix); + addComponents({ ...prefixedtooltip }); +}; + +// packages/daisyui/components/table/object.js +var object_default45 = { ".table": { "@layer daisyui.l1.l2.l3": { "font-size": "0.875rem", position: "relative", width: "100%", "border-collapse": "separate", "--tw-border-spacing-x": "calc(0.25rem * 0)", "--tw-border-spacing-y": "calc(0.25rem * 0)", "border-spacing": "var(--tw-border-spacing-x) var(--tw-border-spacing-y)", "border-radius": "var(--radius-box)", "text-align": "left", '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "text-align": "right" }, "tr.row-hover": { "&, &:nth-child(even)": { "&:hover": { "@media (hover: hover)": { "background-color": "var(--color-base-200)" } } } }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 3)", "vertical-align": "middle" }, ":where(thead, tfoot)": { "white-space": "nowrap", color: "color-mix(in oklab, var(--color-base-content) 60%, transparent)", "font-size": "0.875rem", "font-weight": 600 }, ":where(tfoot tr:first-child :is(td, th))": { "border-top": "var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)" }, ":where(.table-pin-rows thead tr)": { position: "sticky", top: "calc(0.25rem * 0)", "z-index": 1, "background-color": "var(--color-base-100)" }, ":where(.table-pin-rows tfoot tr)": { position: "sticky", bottom: "calc(0.25rem * 0)", "z-index": 1, "background-color": "var(--color-base-100)" }, ":where(.table-pin-cols tr th)": { position: "sticky", right: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", "background-color": "var(--color-base-100)" }, ":where(thead tr :is(td, th), tbody tr:not(:last-child) :is(td, th))": { "border-bottom": "var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)" } } }, ".table-zebra": { "@layer daisyui.l1.l2": { tbody: { tr: { "&:where(:nth-child(even))": { "background-color": "var(--color-base-200)", ":where(.table-pin-cols tr th)": { "background-color": "var(--color-base-200)" } }, "&.row-hover": { "&, &:where(:nth-child(even))": { "&:hover": { "@media (hover: hover)": { "background-color": "var(--color-base-300)" } } } } } } } }, ".table-xs": { "@layer daisyui.l1.l2": { ":not(thead, tfoot) tr": { "font-size": "0.6875rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 2)", "padding-block": "calc(0.25rem * 1)" } } }, ".table-sm": { "@layer daisyui.l1.l2": { ":not(thead, tfoot) tr": { "font-size": "0.75rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 2)" } } }, ".table-md": { "@layer daisyui.l1.l2": { ":not(thead, tfoot) tr": { "font-size": "0.875rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 3)" } } }, ".table-lg": { "@layer daisyui.l1.l2": { ":not(thead, tfoot) tr": { "font-size": "1.125rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 5)", "padding-block": "calc(0.25rem * 4)" } } }, ".table-xl": { "@layer daisyui.l1.l2": { ":not(thead, tfoot) tr": { "font-size": "1.375rem" }, ":where(th, td)": { "padding-inline": "calc(0.25rem * 6)", "padding-block": "calc(0.25rem * 5)" } } } }; + +// packages/daisyui/components/table/index.js +var table_default = ({ addComponents, prefix = "" }) => { + const prefixedtable = addPrefix(object_default45, prefix); + addComponents({ ...prefixedtable }); +}; + +// packages/daisyui/components/hero/object.js +var object_default46 = { ".hero": { "@layer daisyui.l1.l2.l3": { display: "grid", width: "100%", "place-items": "center", "background-size": "cover", "background-position": "center", "& > *": { "grid-column-start": "1", "grid-row-start": "1" } } }, ".hero-overlay": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "grid-row-start": "1", height: "100%", width: "100%", "background-color": "color-mix(in oklab, var(--color-neutral) 50%, transparent)" } }, ".hero-content": { "@layer daisyui.l1.l2.l3": { isolation: "isolate", display: "flex", "max-width": "80rem", "align-items": "center", "justify-content": "center", gap: "calc(0.25rem * 4)", padding: "calc(0.25rem * 4)" } } }; + +// packages/daisyui/components/hero/index.js +var hero_default = ({ addComponents, prefix = "" }) => { + const prefixedhero = addPrefix(object_default46, prefix); + addComponents({ ...prefixedhero }); +}; + +// packages/daisyui/components/breadcrumbs/object.js +var object_default47 = { ".breadcrumbs": { "@layer daisyui.l1.l2.l3": { "max-width": "100%", "overflow-x": "auto", "padding-block": "calc(0.25rem * 2)", "> menu, > ul, > ol": { display: "flex", "min-height": "min-content", "align-items": "center", "white-space": "nowrap", "> li": { display: "flex", "align-items": "center", "> *": { display: "flex", cursor: "pointer", "align-items": "center", gap: "calc(0.25rem * 2)", "&:hover": { "@media (hover: hover)": { "text-decoration-line": "underline" } }, "&:focus": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } }, "&:focus-visible": { outline: "2px solid currentColor", "outline-offset": "2px" } }, "& + *:before": { content: '""', "margin-right": "calc(0.25rem * 3)", "margin-left": "calc(0.25rem * 2)", display: "block", height: "calc(0.25rem * 1.5)", width: "calc(0.25rem * 1.5)", opacity: "40%", rotate: "45deg", "border-top": "1px solid", "border-right": "1px solid", "background-color": "#0000" }, '[dir="rtl"] & + *:before': { rotate: "-135deg" } } } } } }; + +// packages/daisyui/components/breadcrumbs/index.js +var breadcrumbs_default = ({ addComponents, prefix = "" }) => { + const prefixedbreadcrumbs = addPrefix(object_default47, prefix); + addComponents({ ...prefixedbreadcrumbs }); +}; + +// packages/daisyui/components/collapse/object.js +var object_default48 = { ".collapse:not(td, tr, colgroup)": { visibility: "revert-layer" }, ".collapse": { "@layer daisyui.l1.l2.l3": { display: "grid", position: "relative", overflow: "hidden", "border-radius": "var(--radius-box, 1rem)", width: "100%", "grid-template-rows": "max-content 0fr", "grid-template-columns": "minmax(0, 1fr)", isolation: "isolate", "@media (prefers-reduced-motion: no-preference)": { transition: "grid-template-rows 0.2s" }, '> input:is([type="checkbox"], [type="radio"])': { "grid-column-start": "1", "grid-row-start": "1", appearance: "none", opacity: 0, "z-index": 1, width: "100%", padding: "1rem", "padding-inline-end": "3rem", "min-height": "1lh", transition: "background-color 0.2s ease-out" }, '&:is( [open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ), &:not(.collapse-close):has(> input:is([type="checkbox"], [type="radio"]):checked)': { "grid-template-rows": "max-content 1fr" }, '&:is( [open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ) > .collapse-content, &:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content)': { "content-visibility": "visible", "min-height": "fit-content", "@supports not (content-visibility: visible)": { visibility: "visible" } }, '&:focus-visible, &:has(> input:is([type="checkbox"], [type="radio"]):focus-visible), &:has(summary:focus-visible)': { "outline-color": "var(--color-base-content)", "outline-style": "solid", "outline-width": "2px", "outline-offset": "2px" }, "&:not(.collapse-close)": { '> input[type="checkbox"], > input[type="radio"]:not(:checked), > .collapse-title': { cursor: "pointer" } }, "&[tabindex]:focus:not(.collapse-close, .collapse[open]), &[tabindex]:focus-within:not(.collapse-close, .collapse[open])": { "> .collapse-title": { cursor: "unset" } }, '&:is( [open], [tabindex]:focus:not(.collapse-close), [tabindex]:focus-within:not(.collapse-close) ) > :where(.collapse-content), &:not(.collapse-close) > :where(input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-content)': { "padding-bottom": "1rem" } }, "@layer daisyui.l1.l2": { "&:is([open])": { "&.collapse-arrow": { "> .collapse-title:after": { "@media (prefers-reduced-motion: no-preference)": { transform: "translateY(-50%) rotate(225deg)" } } } }, "&.collapse-open": { "&.collapse-arrow": { "> .collapse-title:after": { "@media (prefers-reduced-motion: no-preference)": { transform: "translateY(-50%) rotate(225deg)" } } }, "&.collapse-plus": { "> .collapse-title:after": { "--tw-content": '"−"', content: "var(--tw-content)" } } }, "&[tabindex].collapse-arrow:focus:not(.collapse-close), &.collapse-arrow[tabindex]:focus-within:not(.collapse-close)": { "> .collapse-title:after": { transform: "translateY(-50%) rotate(225deg)" } }, "&.collapse-arrow:not(.collapse-close)": { '> input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after': { transform: "translateY(-50%) rotate(225deg)" } }, "&[open]": { "&.collapse-plus": { "> .collapse-title:after": { "--tw-content": '"−"', content: "var(--tw-content)" } } }, "&[tabindex].collapse-plus:focus:not(.collapse-close)": { "> .collapse-title:after": { "--tw-content": '"−"', content: "var(--tw-content)" } }, "&.collapse-plus:not(.collapse-close)": { '> input:is([type="checkbox"], [type="radio"]):checked ~ .collapse-title:after': { "--tw-content": '"−"', content: "var(--tw-content)" } } } }, ".collapse-title, .collapse-content": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "grid-row-start": "1" } }, ".collapse-content": { "@layer daisyui.l1.l2.l3": { "content-visibility": "hidden", "grid-column-start": "1", "grid-row-start": "2", "min-height": "0", "padding-left": "1rem", "padding-right": "1rem", cursor: "unset", "@supports not (content-visibility: hidden)": { visibility: "hidden" }, "@media (prefers-reduced-motion: no-preference)": { transition: "content-visibility 0.2s allow-discrete, visibility 0.2s allow-discrete, min-height 0.2s ease-out allow-discrete, padding 0.1s ease-out 20ms, background-color 0.2s ease-out" } } }, ".collapse:is(details)": { "@layer daisyui.l1.l2.l3": { width: "100%", "@media (prefers-reduced-motion: no-preference)": { "&::details-content": { transition: "content-visibility 0.2s allow-discrete, visibility 0.2s allow-discrete, min-height 0.2s ease-out allow-discrete, padding 0.1s ease-out 20ms, background-color 0.2s ease-out, height 0.2s", height: "0", "interpolate-size": "allow-keywords" }, "&:where([open])::details-content": { height: "auto" } }, "& summary": { position: "relative", display: "block", "&::-webkit-details-marker": { display: "none" } }, "& > .collapse-content": { "content-visibility": "visible" } } }, ".collapse:is(details) summary": { "@layer daisyui.l1.l2.l3": { outline: "none" } }, ".collapse-arrow": { "@layer daisyui.l1.l2": { "> .collapse-title:after": { position: "absolute", display: "block", height: "0.5rem", width: "0.5rem", transform: "translateY(-100%) rotate(45deg)", "@media (prefers-reduced-motion: no-preference)": { "transition-property": "all", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)", "transition-duration": "0.2s" }, top: "50%", "inset-inline-end": "1.4rem", content: '""', "transform-origin": "75% 75%", "box-shadow": "2px 2px", "pointer-events": "none" } } }, ".collapse-plus": { "@layer daisyui.l1.l2": { "> .collapse-title:after": { position: "absolute", display: "block", height: "0.5rem", width: "0.5rem", "@media (prefers-reduced-motion: no-preference)": { "transition-property": "all", "transition-duration": "300ms", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)" }, top: "0.9rem", "inset-inline-end": "1.4rem", "--tw-content": '"+"', content: "var(--tw-content)", "pointer-events": "none" } } }, ".collapse-title": { "@layer daisyui.l1.l2.l3": { position: "relative", width: "100%", padding: "1rem", "padding-inline-end": "3rem", "min-height": "1lh", transition: "background-color 0.2s ease-out" } }, ".collapse-open": { "@layer daisyui.l1.l2": { "grid-template-rows": "max-content 1fr", "> .collapse-content": { "content-visibility": "visible", "min-height": "fit-content", "padding-bottom": "1rem", "@supports not (content-visibility: visible)": { visibility: "visible" } } } } }; + +// packages/daisyui/components/collapse/index.js +var collapse_default = ({ addComponents, prefix = "" }) => { + const prefixedcollapse = addPrefix(object_default48, prefix); + addComponents({ ...prefixedcollapse }); +}; + +// packages/daisyui/components/stack/object.js +var object_default49 = { ".stack": { "@layer daisyui.l1.l2.l3": { display: "inline-grid", "grid-template-columns": "3px 4px 1fr 4px 3px", "grid-template-rows": "3px 4px 1fr 4px 3px", "& > *": { height: "100%", width: "100%", "&:nth-child(n + 2)": { width: "100%", opacity: "70%" }, "&:nth-child(2)": { "z-index": 2, opacity: "90%" }, "&:nth-child(1)": { "z-index": 3, width: "100%" } } }, "@layer daisyui.l1.l2": { "&, &.stack-bottom": { "> *": { "grid-column": "3 / 4", "grid-row": "3 / 6", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "1 / 6", "grid-row": "1 / 4" } } }, "&.stack-top": { "> *": { "grid-column": "3 / 4", "grid-row": "1 / 4", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "1 / 6", "grid-row": "3 / 6" } } }, "&.stack-start": { "> *": { "grid-column": "1 / 4", "grid-row": "3 / 4", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "3 / 6", "grid-row": "1 / 6" } } }, "&.stack-end": { "> *": { "grid-column": "3 / 6", "grid-row": "3 / 4", "&:nth-child(2)": { "grid-column": "2 / 5", "grid-row": "2 / 5" }, "&:nth-child(1)": { "grid-column": "1 / 4", "grid-row": "1 / 6" } } } } } }; + +// packages/daisyui/components/stack/index.js +var stack_default = ({ addComponents, prefix = "" }) => { + const prefixedstack = addPrefix(object_default49, prefix); + addComponents({ ...prefixedstack }); +}; + +// packages/daisyui/components/diff/object.js +var object_default50 = { ".diff": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "grid", width: "100%", overflow: "hidden", "webkit-user-select": "none", "user-select": "none", "grid-template-rows": "1fr 1.8rem 1fr", direction: "ltr", "container-type": "inline-size", "grid-template-columns": "auto 1fr", "&:focus-visible, &:has(.diff-item-1:focus-visible)": { "outline-style": "var(--tw-outline-style)", "outline-width": "2px", "outline-offset": "1px", "outline-color": "var(--color-base-content)" }, "&:focus-visible": { "outline-style": "var(--tw-outline-style)", "outline-width": "2px", "outline-offset": "1px", "outline-color": "var(--color-base-content)", ".diff-resizer": { "min-width": "95cqi", "max-width": "95cqi" } }, "&:has(.diff-item-1:focus-visible)": { "outline-style": "var(--tw-outline-style)", "outline-width": "2px", "outline-offset": "1px", ".diff-resizer": { "min-width": "5cqi", "max-width": "5cqi" } }, "@supports (-webkit-overflow-scrolling: touch) and (overflow: -webkit-paged-x)": { "&:focus": { ".diff-resizer": { "min-width": "5cqi", "max-width": "5cqi" } }, "&:has(.diff-item-1:focus)": { ".diff-resizer": { "min-width": "95cqi", "max-width": "95cqi" } } } } }, ".diff-resizer": { "@layer daisyui.l1.l2.l3": { position: "relative", isolation: "isolate", "z-index": 2, "grid-column-start": "1", "grid-row-start": "2", height: "calc(0.25rem * 3)", width: "50cqi", "max-width": "calc(100cqi - 1rem)", "min-width": "1rem", resize: "horizontal", overflow: "hidden", opacity: "0%", transform: "scaleY(5) translate(0.32rem, 50%)", cursor: "ew-resize", "transform-origin": "100% 100%", "clip-path": "inset(calc(100% - 0.75rem) 0 0 calc(100% - 0.75rem))", transition: "min-width 0.3s ease-out, max-width 0.3s ease-out" } }, ".diff-item-2": { "@layer daisyui.l1.l2.l3": { position: "relative", "grid-column-start": "1", "grid-row": "span 3 / span 3", "grid-row-start": "1", "&:after": { "pointer-events": "none", position: "absolute", top: "calc(1/2 * 100%)", right: "1px", bottom: "calc(0.25rem * 0)", "z-index": 2, "border-radius": "calc(infinity * 1px)", "background-color": "color-mix(in oklab, var(--color-base-100) 98%, transparent)", width: "1.2rem", height: "1.8rem", border: ["2px solid var(--color-base-100)", "0.5px solid #0000001f"], content: '""', outline: "1px solid color-mix(in oklab, var(--color-base-content) 10%, #0000)", "outline-offset": "-3px", translate: "50% -50%" }, "> *": { "pointer-events": "none", position: "absolute", top: "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", height: "100%", width: "100cqi", "max-width": "none", "object-fit": "cover", "object-position": "center" }, "@supports (-webkit-overflow-scrolling: touch) and (overflow: -webkit-paged-x)": { "&:after": { "--tw-content": "none", content: "var(--tw-content)" } } } }, ".diff-item-1": { "@layer daisyui.l1.l2.l3": { position: "relative", "z-index": 1, "grid-column-start": "1", "grid-row": "span 3 / span 3", "grid-row-start": "1", overflow: "hidden", "border-right": "2px solid var(--color-base-100)", "&:focus-visible": { "--tw-outline-style": "none", "outline-style": "none" }, "> *": { "pointer-events": "none", position: "absolute", top: "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", height: "100%", width: "100cqi", "max-width": "none", "object-fit": "cover", "object-position": "center" } } } }; + +// packages/daisyui/components/diff/index.js +var diff_default = ({ addComponents, prefix = "" }) => { + const prefixeddiff = addPrefix(object_default50, prefix); + addComponents({ ...prefixeddiff }); +}; + +// packages/daisyui/components/filter/object.js +var object_default51 = { ".filter": { "@layer daisyui.l1.l2.l3": { display: "flex", "flex-wrap": "wrap", 'input[type="radio"]': { width: "auto" }, input: { overflow: "hidden", opacity: "100%", scale: "1", transition: "margin 0.1s, opacity 0.3s, padding 0.3s, border-width 0.1s", "&:not(:last-child)": { "margin-inline-end": "calc(0.25rem * 1)" }, "&.filter-reset": { "aspect-ratio": "1 / 1", "&::after": { "--tw-content": '"×"', content: "var(--tw-content)" } } }, "&:not(:has(input:checked:not(.filter-reset)))": { '.filter-reset, input[type="reset"]': { scale: "0", "border-width": "0", "margin-inline": "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", "padding-inline": "calc(0.25rem * 0)", opacity: "0%" } }, "&:has(input:checked:not(.filter-reset))": { 'input:not(:checked, .filter-reset, input[type="reset"])': { scale: "0", "border-width": "0", "margin-inline": "calc(0.25rem * 0)", width: "calc(0.25rem * 0)", "padding-inline": "calc(0.25rem * 0)", opacity: "0%" } } } } }; + +// packages/daisyui/components/filter/index.js +var filter_default = ({ addComponents, prefix = "" }) => { + const prefixedfilter = addPrefix(object_default51, prefix); + addComponents({ ...prefixedfilter }); +}; + +// packages/daisyui/components/dock/object.js +var object_default52 = { ".dock": { "@layer daisyui.l1.l2.l3": { position: "fixed", right: "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)", left: "calc(0.25rem * 0)", "z-index": 1, display: "flex", width: "100%", "flex-direction": "row", "align-items": "center", "justify-content": "space-around", "background-color": "var(--color-base-100)", padding: "calc(0.25rem * 2)", color: "currentcolor", "border-top": "0.5px solid color-mix(in oklab, var(--color-base-content) 5%, #0000)", height: ["4rem", "calc(4rem + env(safe-area-inset-bottom))"], "padding-bottom": "env(safe-area-inset-bottom)", "> *": { position: "relative", "margin-bottom": "calc(0.25rem * 2)", display: "flex", height: "100%", "max-width": "calc(0.25rem * 32)", "flex-shrink": 1, "flex-basis": "100%", cursor: "pointer", "flex-direction": "column", "align-items": "center", "justify-content": "center", gap: "1px", "border-radius": "var(--radius-box)", "background-color": "transparent", transition: "opacity 0.2s ease-out", "@media (hover: hover)": { "&:hover": { opacity: "80%" } }, '&[aria-disabled="true"], &[disabled]': { "&, &:hover": { "pointer-events": "none", color: "color-mix(in oklab, var(--color-base-content) 10%, transparent)", opacity: "100%" } }, ".dock-label": { "font-size": "0.6875rem" }, "&:after": { content: '""', position: "absolute", height: "calc(0.25rem * 1)", width: "calc(0.25rem * 6)", "border-radius": "calc(infinity * 1px)", "background-color": "transparent", bottom: "0.2rem", "border-top": "3px solid transparent", transition: "background-color 0.1s ease-out, text-color 0.1s ease-out, width 0.1s ease-out" } } } }, ".dock-active": { "@layer daisyui.l1.l2": { "&:after": { width: "calc(0.25rem * 10)", "background-color": "currentcolor", color: "currentcolor" } } }, ".dock-xs": { "@layer daisyui.l1.l2": { height: ["3rem", "calc(3rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "-0.1rem" } }, ".dock-label": { "font-size": "0.625rem" } } }, ".dock-sm": { "@layer daisyui.l1.l2": { height: ["calc(0.25rem * 14)", "3.5rem", "calc(3.5rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "-0.1rem" } }, ".dock-label": { "font-size": "0.625rem" } } }, ".dock-md": { "@layer daisyui.l1.l2": { height: ["4rem", "calc(4rem + env(safe-area-inset-bottom))"], ".dock-label": { "font-size": "0.6875rem" } } }, ".dock-lg": { "@layer daisyui.l1.l2": { height: ["4.5rem", "calc(4.5rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "0.4rem" } }, ".dock-label": { "font-size": "0.6875rem" } } }, ".dock-xl": { "@layer daisyui.l1.l2": { height: ["5rem", "calc(5rem + env(safe-area-inset-bottom))"], ".dock-active": { "&:after": { bottom: "0.4rem" } }, ".dock-label": { "font-size": "0.75rem" } } } }; + +// packages/daisyui/components/dock/index.js +var dock_default = ({ addComponents, prefix = "" }) => { + const prefixeddock = addPrefix(object_default52, prefix); + addComponents({ ...prefixeddock }); +}; + +// packages/daisyui/components/mask/object.js +var object_default53 = { ".mask": { "@layer daisyui.l1.l2.l3": { display: "inline-block", "vertical-align": "middle", "mask-size": "contain", "mask-repeat": "no-repeat", "mask-position": "center" } }, ".mask-half-1": { "@layer daisyui.l1.l2": { "mask-size": "200%", "mask-position": ["left", "left"], '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "mask-position": "right" } } }, ".mask-half-2": { "@layer daisyui.l1.l2": { "mask-size": "200%", "mask-position": ["right", "right"], '&:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *)': { "mask-position": "left" } } }, ".mask-squircle": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 0C20 0 0 20 0 100s20 100 100 100 100-20 100-100S180 0 100 0Z'/%3e%3c/svg%3e")` } }, ".mask-decagon": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 58.779 19.098 36.327 50v61.804l-36.327 50L96 200l-58.779-19.098-36.327-50V69.098l36.327-50z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-diamond": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m100 0 100 100-100 100L0 100z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-heart": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='185' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M100 184.606a15.384 15.384 0 0 1-8.653-2.678C53.565 156.28 37.205 138.695 28.182 127.7 8.952 104.264-.254 80.202.005 54.146.308 24.287 24.264 0 53.406 0c21.192 0 35.869 11.937 44.416 21.879a2.884 2.884 0 0 0 4.356 0C110.725 11.927 125.402 0 146.594 0c29.142 0 53.098 24.287 53.4 54.151.26 26.061-8.956 50.122-28.176 73.554-9.023 10.994-25.383 28.58-63.165 54.228a15.384 15.384 0 0 1-8.653 2.673Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")` } }, ".mask-hexagon": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='182' height='201' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M.3 65.486c0-9.196 6.687-20.063 14.211-25.078l61.86-35.946c8.36-5.016 20.899-5.016 29.258 0l61.86 35.946c8.36 5.015 14.211 15.882 14.211 25.078v71.055c0 9.196-6.687 20.063-14.211 25.079l-61.86 35.945c-8.36 4.18-20.899 4.18-29.258 0L14.51 161.62C6.151 157.44.3 145.737.3 136.54V65.486Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")` } }, ".mask-hexagon-2": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='182' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M64.786 181.4c-9.196 0-20.063-6.687-25.079-14.21L3.762 105.33c-5.016-8.36-5.016-20.9 0-29.259l35.945-61.86C44.723 5.851 55.59 0 64.786 0h71.055c9.196 0 20.063 6.688 25.079 14.211l35.945 61.86c4.18 8.36 4.18 20.899 0 29.258l-35.945 61.86c-4.18 8.36-15.883 14.211-25.079 14.211H64.786Z' fill='black' fill-rule='nonzero'/%3e%3c/svg%3e")` } }, ".mask-circle": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='200' height='200' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle fill='black' cx='100' cy='100' r='100' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-pentagon": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='181' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 0 95.106 69.098-36.327 111.804H37.22L.894 69.098z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-star": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 137.263-58.779 42.024 22.163-68.389L.894 68.481l72.476-.243L96 0l22.63 68.238 72.476.243-58.49 42.417 22.163 68.389z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-star-2": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-triangle": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='174' height='149' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 148.476-86.603.185L43.86 74.423 87 0l43.14 74.423 43.463 74.238z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-triangle-2": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='174' height='150' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m87 .738 86.603-.184-43.463 74.238L87 149.214 43.86 74.792.397.554z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-triangle-3": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m149.369 87.107.185 86.603-74.239-43.463L.893 87.107l74.422-43.14L149.554.505z' fill-rule='evenodd'/%3e%3c/svg%3e")` } }, ".mask-triangle-4": { "@layer daisyui.l1.l2": { "mask-image": `url("data:image/svg+xml,%3csvg width='150' height='174' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M.631 87.107.446.505l74.239 43.462 74.422 43.14-74.422 43.14L.446 173.71z' fill-rule='evenodd'/%3e%3c/svg%3e")` } } }; + +// packages/daisyui/components/mask/index.js +var mask_default = ({ addComponents, prefix = "" }) => { + const prefixedmask = addPrefix(object_default53, prefix); + addComponents({ ...prefixedmask }); +}; + +// packages/daisyui/components/label/object.js +var object_default54 = { ".label": { "@layer daisyui.l1.l2.l3": { display: "inline-flex", "align-items": "center", gap: "calc(0.25rem * 1.5)", "white-space": "nowrap", color: "color-mix(in oklab, currentcolor 60%, transparent)", "&:has(input)": { cursor: "pointer" }, "&:is(.input > *, .select > *)": { display: "flex", height: "calc(100% - 0.5rem)", "align-items": "center", "padding-inline": "calc(0.25rem * 3)", "white-space": "nowrap", "font-size": "inherit", "&:first-child": { "margin-inline-start": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * 3)", "border-inline-end": "var(--border) solid color-mix(in oklab, currentColor 10%, #0000)" }, "&:last-child": { "margin-inline-start": "calc(0.25rem * 3)", "margin-inline-end": "calc(0.25rem * -3)", "border-inline-start": "var(--border) solid color-mix(in oklab, currentColor 10%, #0000)" } } } }, ".floating-label": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "block", input: { display: "block", "&::placeholder": { transition: "top 0.1s ease-out, translate 0.1s ease-out, scale 0.1s ease-out, opacity 0.1s ease-out" } }, textarea: { "&::placeholder": { transition: "top 0.1s ease-out, translate 0.1s ease-out, scale 0.1s ease-out, opacity 0.1s ease-out" } }, "> span": { position: "absolute", "inset-inline-start": "calc(0.25rem * 3)", "z-index": 1, "background-color": "var(--color-base-100)", "padding-inline": "calc(0.25rem * 1)", opacity: "0%", "font-size": "0.875rem", top: "calc(var(--size-field, 0.25rem) * 10 / 2)", "line-height": 1, "border-radius": "2px", "pointer-events": "none", translate: "0 -50%", transition: "top 0.1s ease-out, translate 0.1s ease-out, scale 0.1s ease-out, opacity 0.1s ease-out" }, "&:focus-within, &:not(:has(input:placeholder-shown, textarea:placeholder-shown))": { "::placeholder": { opacity: "0%", top: "0", translate: "-12.5% calc(-50% - 0.125em)", scale: "0.75", "pointer-events": "auto" }, "> span": { opacity: "100%", top: "0", translate: "-12.5% calc(-50% - 0.125em)", scale: "0.75", "pointer-events": "auto", "z-index": 2 } }, "&:has(:disabled, [disabled])": { "> span": { opacity: "0%" } }, "&:has(.input-xs, .select-xs, .textarea-xs) span": { "font-size": "0.6875rem", top: "calc(var(--size-field, 0.25rem) * 6 / 2)" }, "&:has(.input-sm, .select-sm, .textarea-sm) span": { "font-size": "0.75rem", top: "calc(var(--size-field, 0.25rem) * 8 / 2)" }, "&:has(.input-md, .select-md, .textarea-md) span": { "font-size": "0.875rem", top: "calc(var(--size-field, 0.25rem) * 10 / 2)" }, "&:has(.input-lg, .select-lg, .textarea-lg) span": { "font-size": "1.125rem", top: "calc(var(--size-field, 0.25rem) * 12 / 2)" }, "&:has(.input-xl, .select-xl, .textarea-xl) span": { "font-size": "1.375rem", top: "calc(var(--size-field, 0.25rem) * 14 / 2)" } } } }; + +// packages/daisyui/components/label/index.js +var label_default = ({ addComponents, prefix = "" }) => { + const prefixedlabel = addPrefix(object_default54, prefix); + addComponents({ ...prefixedlabel }); +}; + +// packages/daisyui/components/status/object.js +var object_default55 = { ".status": { "@layer daisyui.l1.l2.l3": { display: "inline-block", "aspect-ratio": "1 / 1", width: "calc(0.25rem * 2)", height: "calc(0.25rem * 2)", "border-radius": "var(--radius-selector)", "background-color": "color-mix(in oklab, var(--color-base-content) 20%, transparent)", "background-position": "center", "background-repeat": "no-repeat", "vertical-align": "middle", color: "color-mix(in oklab, var(--color-black) 30%, transparent)", "background-image": "radial-gradient( circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * 0.5)), #0000 )", "box-shadow": "0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)" } }, ".status-primary": { "@layer daisyui.l1.l2": { "background-color": "var(--color-primary)", color: "var(--color-primary)" } }, ".status-secondary": { "@layer daisyui.l1.l2": { "background-color": "var(--color-secondary)", color: "var(--color-secondary)" } }, ".status-accent": { "@layer daisyui.l1.l2": { "background-color": "var(--color-accent)", color: "var(--color-accent)" } }, ".status-neutral": { "@layer daisyui.l1.l2": { "background-color": "var(--color-neutral)", color: "var(--color-neutral)" } }, ".status-info": { "@layer daisyui.l1.l2": { "background-color": "var(--color-info)", color: "var(--color-info)" } }, ".status-success": { "@layer daisyui.l1.l2": { "background-color": "var(--color-success)", color: "var(--color-success)" } }, ".status-warning": { "@layer daisyui.l1.l2": { "background-color": "var(--color-warning)", color: "var(--color-warning)" } }, ".status-error": { "@layer daisyui.l1.l2": { "background-color": "var(--color-error)", color: "var(--color-error)" } }, ".status-xs": { "@layer daisyui.l1.l2": { width: "calc(0.25rem * 0.5)", height: "calc(0.25rem * 0.5)" } }, ".status-sm": { "@layer daisyui.l1.l2": { width: "calc(0.25rem * 1)", height: "calc(0.25rem * 1)" } }, ".status-md": { "@layer daisyui.l1.l2": { width: "calc(0.25rem * 2)", height: "calc(0.25rem * 2)" } }, ".status-lg": { "@layer daisyui.l1.l2": { width: "calc(0.25rem * 3)", height: "calc(0.25rem * 3)" } }, ".status-xl": { "@layer daisyui.l1.l2": { width: "calc(0.25rem * 4)", height: "calc(0.25rem * 4)" } } }; + +// packages/daisyui/components/status/index.js +var status_default = ({ addComponents, prefix = "" }) => { + const prefixedstatus = addPrefix(object_default55, prefix); + addComponents({ ...prefixedstatus }); +}; + +// packages/daisyui/components/hovergallery/object.js +var object_default56 = { ".hover-gallery": { "@layer daisyui.l1.l2.l3": { "--items": "1", "grid-template-columns": "repeat(var(--items), 1fr)", width: "100%", gap: "1px", overflow: "hidden", "&, &:is(figure)": { display: "inline-grid" }, "&:has(> :nth-child(3))": { "--items": "2" }, "&:has(> :nth-child(4))": { "--items": "3" }, "&:has(> :nth-child(5))": { "--items": "4" }, "&:has(> :nth-child(6))": { "--items": "5" }, "&:has(> :nth-child(7))": { "--items": "6" }, "&:has(> :nth-child(8))": { "--items": "7" }, "&:has(> :nth-child(9))": { "--items": "8" }, "&:has(> :nth-child(10))": { "--items": "9" }, "> *": { opacity: 0, height: "100%", "grid-row": "1", "object-fit": "cover", width: "100%", "&:nth-child(1)": { "grid-column": "1 / -1", opacity: 1 }, "&:nth-child(2)": { "grid-column": "1" }, "&:nth-child(3)": { "grid-column": "2" }, "&:nth-child(4)": { "grid-column": "3" }, "&:nth-child(5)": { "grid-column": "4" }, "&:nth-child(6)": { "grid-column": "5" }, "&:nth-child(7)": { "grid-column": "6" }, "&:nth-child(8)": { "grid-column": "7" }, "&:nth-child(9)": { "grid-column": "8" }, "&:nth-child(10)": { "grid-column": "9" }, "&:nth-child(n + 11)": { display: "none" } }, "> *:hover": { "grid-column": "1 / -1", opacity: 1 }, "&:has(*:hover)": { "> :nth-child(1)": { display: "none" } } } } }; + +// packages/daisyui/components/hovergallery/index.js +var hovergallery_default = ({ addComponents, prefix = "" }) => { + const prefixedhovergallery = addPrefix(object_default56, prefix); + addComponents({ ...prefixedhovergallery }); +}; + +// packages/daisyui/components/alert/object.js +var object_default57 = { + ".alert": { "border-width": "var(--border)", "border-color": "var(--alert-border-color, var(--color-base-200))", "@layer daisyui.l1.l2.l3": { "border-style": "solid", "--alert-border-color": "var(--color-base-200)", display: "grid", "align-items": "center", gap: "calc(0.25rem * 4)", "border-radius": "var(--radius-box)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 3)", color: "var(--color-base-content)", "background-color": "var(--alert-color, var(--color-base-200))", "justify-content": "start", "justify-items": "start", "grid-auto-flow": "column", "grid-template-columns": "auto", "text-align": "start", "font-size": "0.875rem", "line-height": "1.25rem", "background-size": "auto, calc(var(--noise) * 100%)", "background-image": "none, var(--fx-noise)", "box-shadow": "0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * 0.08)) inset, 0 1px color-mix( in oklab, color-mix(in oklab, #000 20%, var(--alert-color, var(--color-base-200))) calc(var(--depth) * 20%), #0000 ), 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * 0.08))", "&:has(:nth-child(2))": { "grid-template-columns": "auto minmax(auto, 1fr)" } } }, ".alert-info": { "@layer daisyui.l1.l2": { color: "var(--color-info-content)", "--alert-border-color": "var(--color-info)", "--alert-color": "var(--color-info)" } }, ".alert-success": { "@layer daisyui.l1.l2": { color: "var(--color-success-content)", "--alert-border-color": "var(--color-success)", "--alert-color": "var(--color-success)" } }, ".alert-warning": { "@layer daisyui.l1.l2": { color: "var(--color-warning-content)", "--alert-border-color": "var(--color-warning)", "--alert-color": "var(--color-warning)" } }, ".alert-error": { "@layer daisyui.l1.l2": { color: "var(--color-error-content)", "--alert-border-color": "var(--color-error)", "--alert-color": "var(--color-error)" } }, ".alert-soft": { + "@layer daisyui.l1": { + color: "var(--alert-color, var(--color-base-content))", background: "color-mix( in oklab, var(--alert-color, var(--color-base-content)) 8%, var(--color-base-100) )", "--alert-border-color": `color-mix( + in oklab, + var(--alert-color, var(--color-base-content)) 10%, + var(--color-base-100) + )`, "box-shadow": "none", "background-image": "none" + } + }, ".alert-outline": { "@layer daisyui.l1": { "background-color": "transparent", color: "var(--alert-color)", "box-shadow": "none", "background-image": "none" } }, ".alert-dash": { "@layer daisyui.l1": { "background-color": "transparent", color: "var(--alert-color)", "border-style": "dashed", "box-shadow": "none", "background-image": "none" } }, ".alert-vertical": { "@layer daisyui.l1.l2": { "justify-content": "center", "justify-items": "center", "grid-auto-flow": "row", "grid-template-columns": "auto", "text-align": "center", "&:has(:nth-child(2))": { "grid-template-columns": "auto" } } }, ".alert-horizontal": { "@layer daisyui.l1.l2": { "justify-content": "start", "justify-items": "start", "grid-auto-flow": "column", "grid-template-columns": "auto", "text-align": "start", "&:has(:nth-child(2))": { "grid-template-columns": "auto minmax(auto, 1fr)" } } } +}; + +// packages/daisyui/components/alert/index.js +var alert_default = ({ addComponents, prefix = "" }) => { + const prefixedalert = addPrefix(object_default57, prefix); + addComponents({ ...prefixedalert }); +}; + +// packages/daisyui/components/fab/object.js +var object_default58 = { ".fab": { "@layer daisyui.l1.l2.l3": { "pointer-events": "none", position: "fixed", "inset-inline-end": "calc(0.25rem * 4)", bottom: "calc(0.25rem * 4)", "z-index": 999, display: "flex", "flex-direction": "column-reverse", "align-items": "flex-end", gap: "calc(0.25rem * 2)", "font-size": "var(--text-sm)", "line-height": "var(--tw-leading, var(--text-sm--line-height))", "white-space": "nowrap", "> *": { "pointer-events": "auto", display: "flex", "align-items": "center", gap: "calc(0.25rem * 2)", "&:hover, &:has(:focus-visible)": { "z-index": 1 } }, "> [tabindex]": { "&:first-child": { position: "relative", display: "grid", "transition-property": "opacity, visibility, rotate", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)" } }, ".fab-close": { position: "absolute", "inset-inline-end": "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)" }, ".fab-main-action": { position: "absolute", "inset-inline-end": "calc(0.25rem * 0)", bottom: "calc(0.25rem * 0)" }, "&:focus-within": { "&:has(.fab-close), &:has(.fab-main-action)": { "> [tabindex]": { rotate: "90deg", opacity: "0%" } }, "> [tabindex]:first-child": { "pointer-events": "none" }, "> :nth-child(n + 2)": { visibility: "visible", "--tw-scale-x": "100%", "--tw-scale-y": "100%", "--tw-scale-z": "100%", scale: "var(--tw-scale-x) var(--tw-scale-y)", opacity: "100%" } }, "> :nth-child(n + 2)": { visibility: "hidden", "--tw-scale-x": "80%", "--tw-scale-y": "80%", "--tw-scale-z": "80%", scale: "var(--tw-scale-x) var(--tw-scale-y)", opacity: "0%", "transition-property": "opacity, scale, visibility", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0.4, 0, 0.2, 1)", "&.fab-main-action, &.fab-close": { "--tw-scale-x": "100%", "--tw-scale-y": "100%", "--tw-scale-z": "100%", scale: "var(--tw-scale-x) var(--tw-scale-y)" } }, "> :nth-child(3)": { "transition-delay": "30ms" }, "> :nth-child(4)": { "transition-delay": "60ms" }, "> :nth-child(5)": { "transition-delay": "90ms" }, "> :nth-child(6)": { "transition-delay": "120ms" } } }, ".fab-flower": { "@layer daisyui.l1.l2.l3": { display: "grid", "--position": "0rem", "> *:nth-child(-n + 2)": { "--position": "0rem" }, "> *": { "grid-area": "1/1", "--degree": "180deg", "--flip-degree": "calc(180deg - var(--degree))", transform: "translateX(calc(cos(var(--degree)) * var(--position))) translateY(calc(sin(var(--degree)) * -1 * var(--position)))", '[dir="rtl"] &': { transform: "translateX(calc(cos(var(--flip-degree)) * var(--position))) translateY(calc(sin(var(--flip-degree)) * -1 * var(--position)))" } }, "> :nth-child(n + 7)": { display: "none" }, "&:has(:nth-child(3))": { "--position": "140%", "> :nth-child(3)": { "--degree": "135deg" } }, "&:has(:nth-child(4))": { "--position": "140%", "> :nth-child(3)": { "--degree": "165deg" }, "> :nth-child(4)": { "--degree": "105deg" } }, "&:has(:nth-child(5))": { "--position": "180%", "> :nth-child(3)": { "--degree": "180deg" }, "> :nth-child(4)": { "--degree": "135deg" }, "> :nth-child(5)": { "--degree": "90deg" } }, "&:has(:nth-child(6))": { "--position": "220%", "> :nth-child(3)": { "--degree": "180deg" }, "> :nth-child(4)": { "--degree": "150deg" }, "> :nth-child(5)": { "--degree": "120deg" }, "> :nth-child(6)": { "--degree": "90deg" } } } } }; + +// packages/daisyui/components/fab/index.js +var fab_default = ({ addComponents, prefix = "" }) => { + const prefixedfab = addPrefix(object_default58, prefix); + addComponents({ ...prefixedfab }); +}; + +// packages/daisyui/components/kbd/object.js +var object_default59 = { ".kbd": { "box-shadow": "none", "@layer daisyui.l1.l2.l3": { display: "inline-flex", "align-items": "center", "justify-content": "center", "border-radius": "var(--radius-field)", "background-color": "var(--color-base-200)", "vertical-align": "middle", "padding-inline": "0.5em", border: "var(--border) solid color-mix(in srgb, var(--color-base-content) 20%, #0000)", "border-bottom": "calc(var(--border) + 1px) solid color-mix(in srgb, var(--color-base-content) 20%, #0000)", "--size": "calc(var(--size-selector, 0.25rem) * 6)", "font-size": "0.875rem", height: "var(--size)", "min-width": "var(--size)" } }, ".kbd-xs": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 4)", "font-size": "0.625rem" } }, ".kbd-sm": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 5)", "font-size": "0.75rem" } }, ".kbd-md": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 6)", "font-size": "0.875rem" } }, ".kbd-lg": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 7)", "font-size": "1rem" } }, ".kbd-xl": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-selector, 0.25rem) * 8)", "font-size": "1.125rem" } } }; + +// packages/daisyui/components/kbd/index.js +var kbd_default = ({ addComponents, prefix = "" }) => { + const prefixedkbd = addPrefix(object_default59, prefix); + addComponents({ ...prefixedkbd }); +}; + +// packages/daisyui/components/input/object.js +var object_default60 = { ".input": { "@layer daisyui.l1.l2.l3": { cursor: "text", border: "var(--border) solid #0000", position: "relative", display: "inline-flex", "flex-shrink": 1, appearance: "none", "align-items": "center", gap: "calc(0.25rem * 2)", "background-color": "var(--color-base-100)", "padding-inline": "calc(0.25rem * 3)", "vertical-align": "middle", "white-space": "nowrap", width: "clamp(3rem, 20rem, 100%)", height: "var(--size)", "font-size": "max(var(--font-size, 0.875rem), 0.875rem)", "touch-action": "manipulation", "border-start-start-radius": "var(--join-ss, var(--radius-field))", "border-start-end-radius": "var(--join-se, var(--radius-field))", "border-end-start-radius": "var(--join-es, var(--radius-field))", "border-end-end-radius": "var(--join-ee, var(--radius-field))", "border-color": "var(--input-color)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset", "--size": "calc(var(--size-field, 0.25rem) * 10)", "--input-color": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "&:where(input)": { display: "inline-flex" }, ":where(input)": { display: "inline-flex", height: "100%", width: "100%", appearance: "none", "background-color": "transparent", border: "none", "&:focus, &:focus-within": { "--tw-outline-style": "none", "outline-style": "none", "@media (forced-colors: active)": { outline: "2px solid transparent", "outline-offset": "2px" } } }, ':where(input[type="url"]), :where(input[type="email"])': { direction: "ltr" }, ':where(input[type="date"])': { display: "inline-flex" }, "&:focus, &:focus-within": { "--input-color": "var(--color-base-content)", "box-shadow": "0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)", outline: "2px solid var(--input-color)", "outline-offset": "2px", isolation: "isolate" }, "@media (pointer: coarse)": { "@supports (-webkit-touch-callout: none)": { "&:focus, &:focus-within": { "--font-size": "1rem" } } }, "&:has(> input[disabled]), &:is(:disabled, [disabled]), fieldset:disabled &": { cursor: "not-allowed", "border-color": "var(--color-base-200)", "background-color": "var(--color-base-200)", color: "color-mix(in oklab, var(--color-base-content) 40%, transparent)", "&::placeholder": { color: "color-mix(in oklab, var(--color-base-content) 20%, transparent)" }, "box-shadow": "none" }, "&:has(> input[disabled]) > input[disabled]": { cursor: "not-allowed" }, "&::-webkit-date-and-time-value": { "text-align": "inherit" }, '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * -3)" } }, "&::-webkit-calendar-picker-indicator": { position: "absolute", "inset-inline-end": "0.75em" }, '&:has(> input[type="date"])': { ':where(input[type="date"])': { display: "inline-flex", "webkit-appearance": "none", appearance: "none" }, 'input[type="date"]::-webkit-calendar-picker-indicator': { position: "absolute", "inset-inline-end": "0.75em", width: "1em", height: "1em", cursor: "pointer" } } } }, ".input-ghost": { "@layer daisyui.l1.l2": { "background-color": "transparent", "box-shadow": "none", "border-color": "#0000", "&:focus, &:focus-within": { "background-color": "var(--color-base-100)", color: "var(--color-base-content)", "border-color": "#0000", "box-shadow": "none" } } }, ".input-neutral": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-neutral)" } } }, ".input-primary": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-primary)" } } }, ".input-secondary": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-secondary)" } } }, ".input-accent": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-accent)" } } }, ".input-info": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-info)" } } }, ".input-success": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-success)" } } }, ".input-warning": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-warning)" } } }, ".input-error": { "@layer daisyui.l1.l2": { "&, &:focus, &:focus-within": { "--input-color": "var(--color-error)" } } }, ".input-xs": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 6)", "font-size": "max(var(--font-size, 0.6875rem), 0.6875rem)", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -1)", "margin-inline-end": "calc(0.25rem * -3)" } } } }, ".input-sm": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 8)", "font-size": "max(var(--font-size, 0.75rem), 0.75rem)", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -2)", "margin-inline-end": "calc(0.25rem * -3)" } } } }, ".input-md": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 10)", "font-size": "max(var(--font-size, 0.875rem), 0.875rem)", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * -3)" } } } }, ".input-lg": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 12)", "font-size": "max(var(--font-size, 1.125rem), 1.125rem)", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -3)", "margin-inline-end": "calc(0.25rem * -3)" } } } }, ".input-xl": { "@layer daisyui.l1.l2": { "--size": "calc(var(--size-field, 0.25rem) * 14)", "font-size": "max(var(--font-size, 1.375rem), 1.375rem)", '&[type="number"]': { "&::-webkit-inner-spin-button": { "margin-block": "calc(0.25rem * -4)", "margin-inline-end": "calc(0.25rem * -3)" } } } } }; + +// packages/daisyui/components/input/index.js +var input_default = ({ addComponents, prefix = "" }) => { + const prefixedinput = addPrefix(object_default60, prefix); + addComponents({ ...prefixedinput }); +}; + +// packages/daisyui/components/timeline/object.js +var object_default61 = { ".timeline": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "flex", "> li": { position: "relative", display: "grid", "flex-shrink": 0, "align-items": "center", "grid-template-rows": "var(--timeline-row-start, minmax(0, 1fr)) auto var( --timeline-row-end, minmax(0, 1fr) )", "grid-template-columns": "var(--timeline-col-start, minmax(0, 1fr)) auto var( --timeline-col-end, minmax(0, 1fr) )", "> hr": { border: "none", width: "100%", "&:first-child": { "grid-column-start": "1", "grid-row-start": "2" }, "&:last-child": { "grid-column-start": "3", "grid-column-end": "none", "grid-row-start": "2", "grid-row-end": "auto" }, "@media print": { border: "0.1px solid var(--color-base-300)" } } }, ":where(hr)": { height: "calc(0.25rem * 1)", "background-color": "var(--color-base-300)" }, "&:has(.timeline-middle hr)": { "&:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" }, "&:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" } }, "&:not(:has(.timeline-middle))": { ":first-child hr:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" }, ":last-child hr:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" } } } }, ".timeline-box": { "@layer daisyui.l1.l2.l3": { border: "var(--border) solid", "border-radius": "var(--radius-box)", "border-color": "var(--color-base-300)", "background-color": "var(--color-base-100)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 2)", "font-size": "0.75rem", "box-shadow": "0 1px 2px 0 oklch(0% 0 0/0.05)" } }, ".timeline-start": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "2", margin: "calc(0.25rem * 1)", "align-self": "flex-end", "justify-self": "center" } }, ".timeline-middle": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "2", "grid-row-start": "2" } }, ".timeline-end": { "@layer daisyui.l1.l2.l3": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "3", "grid-row-end": "4", margin: "calc(0.25rem * 1)", "align-self": "flex-start", "justify-self": "center" } }, ".timeline-compact": { "@layer daisyui.l1.l2": { "--timeline-row-start": "0", ".timeline-start": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "3", "grid-row-end": "4", "align-self": "flex-start", "justify-self": "center" }, "li:has(.timeline-start)": { ".timeline-end": { "grid-column-start": "none", "grid-row-start": "auto" } }, "&.timeline-vertical": { "> li": { "--timeline-col-start": "0" }, ".timeline-start": { "grid-column-start": "3", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "4", "align-self": "center", "justify-self": "flex-start" }, "li:has(.timeline-start)": { ".timeline-end": { "grid-column-start": "auto", "grid-row-start": "none" } } } } }, ".timeline-snap-icon": { "@layer daisyui.l1.l2": { "> li": { "--timeline-col-start": "0.5rem", "--timeline-row-start": "minmax(0, 1fr)" } } }, ".timeline-vertical": { "@layer daisyui.l1.l2": { "flex-direction": "column", "> li": { "justify-items": "center", "--timeline-row-start": "minmax(0, 1fr)", "--timeline-row-end": "minmax(0, 1fr)", "> hr": { height: "100%", width: "calc(0.25rem * 1)", "&:first-child": { "grid-column-start": "2", "grid-row-start": "1" }, "&:last-child": { "grid-column-start": "2", "grid-column-end": "auto", "grid-row-start": "3", "grid-row-end": "none" } } }, ".timeline-start": { "grid-column-start": "1", "grid-column-end": "2", "grid-row-start": "1", "grid-row-end": "4", "align-self": "center", "justify-self": "flex-end" }, ".timeline-end": { "grid-column-start": "3", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "4", "align-self": "center", "justify-self": "flex-start" }, "&:has(.timeline-middle)": { "> li": { "> hr": { "&:first-child": { "border-top-left-radius": "0", "border-top-right-radius": "0", "border-bottom-right-radius": "var(--radius-selector)", "border-bottom-left-radius": "var(--radius-selector)" }, "&:last-child": { "border-top-left-radius": "var(--radius-selector)", "border-top-right-radius": "var(--radius-selector)", "border-bottom-right-radius": "0", "border-bottom-left-radius": "0" } } } }, "&:not(:has(.timeline-middle))": { ":first-child": { "> hr:last-child": { "border-top-left-radius": "var(--radius-selector)", "border-top-right-radius": "var(--radius-selector)", "border-bottom-right-radius": "0", "border-bottom-left-radius": "0" } }, ":last-child": { "> hr:first-child": { "border-top-left-radius": "0", "border-top-right-radius": "0", "border-bottom-right-radius": "var(--radius-selector)", "border-bottom-left-radius": "var(--radius-selector)" } } }, "&.timeline-snap-icon": { "> li": { "--timeline-col-start": "minmax(0, 1fr)", "--timeline-row-start": "0.5rem" } } } }, ".timeline-horizontal": { "@layer daisyui.l1.l2": { "flex-direction": "row", "> li": { "align-items": "center", "> hr": { height: "calc(0.25rem * 1)", width: "100%", "&:first-child": { "grid-column-start": "1", "grid-row-start": "2" }, "&:last-child": { "grid-column-start": "3", "grid-column-end": "none", "grid-row-start": "2", "grid-row-end": "auto" } } }, ".timeline-start": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "1", "grid-row-end": "2", "align-self": "flex-end", "justify-self": "center" }, ".timeline-end": { "grid-column-start": "1", "grid-column-end": "4", "grid-row-start": "3", "grid-row-end": "4", "align-self": "flex-start", "justify-self": "center" }, "&:has(.timeline-middle)": { "> li": { "> hr": { "&:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" }, "&:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" } } } }, "&:not(:has(.timeline-middle))": { ":first-child": { "> hr:last-child": { "border-start-start-radius": "var(--radius-selector)", "border-end-start-radius": "var(--radius-selector)", "border-start-end-radius": "0", "border-end-end-radius": "0" } }, ":last-child": { "> hr:first-child": { "border-start-start-radius": "0", "border-end-start-radius": "0", "border-start-end-radius": "var(--radius-selector)", "border-end-end-radius": "var(--radius-selector)" } } } } } }; + +// packages/daisyui/components/timeline/index.js +var timeline_default = ({ addComponents, prefix = "" }) => { + const prefixedtimeline = addPrefix(object_default61, prefix); + addComponents({ ...prefixedtimeline }); +}; + +// packages/daisyui/components/chat/object.js +var object_default62 = { ".chat": { "@layer daisyui.l1.l2.l3": { display: "grid", "grid-auto-rows": "min-content", "column-gap": "calc(0.25rem * 3)", "padding-block": "calc(0.25rem * 1)", "--mask-chat": `url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e")` } }, ".chat-bubble": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "block", width: "fit-content", "border-radius": "var(--radius-field)", "background-color": "var(--color-base-300)", "padding-inline": "calc(0.25rem * 4)", "padding-block": "calc(0.25rem * 2)", color: "var(--color-base-content)", "grid-row-end": "3", "min-height": "2rem", "min-width": "2.5rem", "max-width": "90%", "&:before": { position: "absolute", bottom: "calc(0.25rem * 0)", height: "calc(0.25rem * 3)", width: "calc(0.25rem * 3)", "background-color": "inherit", content: '""', "mask-repeat": "no-repeat", "mask-image": "var(--mask-chat)", "mask-position": "0px -1px", "mask-size": "0.8125rem" } } }, ".chat-bubble-primary": { "@layer daisyui.l1.l2": { "background-color": "var(--color-primary)", color: "var(--color-primary-content)" } }, ".chat-bubble-secondary": { "@layer daisyui.l1.l2": { "background-color": "var(--color-secondary)", color: "var(--color-secondary-content)" } }, ".chat-bubble-accent": { "@layer daisyui.l1.l2": { "background-color": "var(--color-accent)", color: "var(--color-accent-content)" } }, ".chat-bubble-neutral": { "@layer daisyui.l1.l2": { "background-color": "var(--color-neutral)", color: "var(--color-neutral-content)" } }, ".chat-bubble-info": { "@layer daisyui.l1.l2": { "background-color": "var(--color-info)", color: "var(--color-info-content)" } }, ".chat-bubble-success": { "@layer daisyui.l1.l2": { "background-color": "var(--color-success)", color: "var(--color-success-content)" } }, ".chat-bubble-warning": { "@layer daisyui.l1.l2": { "background-color": "var(--color-warning)", color: "var(--color-warning-content)" } }, ".chat-bubble-error": { "@layer daisyui.l1.l2": { "background-color": "var(--color-error)", color: "var(--color-error-content)" } }, ".chat-image": { "@layer daisyui.l1.l2.l3": { "grid-row": "span 2 / span 2", "align-self": "flex-end" } }, ".chat-header": { "@layer daisyui.l1.l2.l3": { "grid-row-start": "1", display: "flex", gap: "calc(0.25rem * 1)", "font-size": "0.6875rem" } }, ".chat-footer": { "@layer daisyui.l1.l2.l3": { "grid-row-start": "3", display: "flex", gap: "calc(0.25rem * 1)", "font-size": "0.6875rem" } }, ".chat-start": { "@layer daisyui.l1.l2": { "place-items": "start", "grid-template-columns": "auto 1fr", ".chat-header": { "grid-column-start": "2" }, ".chat-footer": { "grid-column-start": "2" }, ".chat-image": { "grid-column-start": "1" }, ".chat-bubble": { "grid-column-start": "2", "border-end-start-radius": "0", "&:before": { transform: "rotateY(0deg)", "inset-inline-start": "-0.75rem" }, '[dir="rtl"] &:before': { transform: "rotateY(180deg)" } } } }, ".chat-end": { "@layer daisyui.l1.l2": { "place-items": "end", "grid-template-columns": "1fr auto", ".chat-header": { "grid-column-start": "1" }, ".chat-footer": { "grid-column-start": "1" }, ".chat-image": { "grid-column-start": "2" }, ".chat-bubble": { "grid-column-start": "1", "border-end-end-radius": "0", "&:before": { transform: "rotateY(180deg)", "inset-inline-start": "100%" }, '[dir="rtl"] &:before': { transform: "rotateY(0deg)" } } } } }; + +// packages/daisyui/components/chat/index.js +var chat_default = ({ addComponents, prefix = "" }) => { + const prefixedchat = addPrefix(object_default62, prefix); + addComponents({ ...prefixedchat }); +}; + +// packages/daisyui/components/range/object.js +var object_default63 = { + ".range": { + "@layer daisyui.l1.l2.l3": { + appearance: "none", "webkit-appearance": "none", "--range-thumb": "var(--color-base-100)", "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 6)", "--range-progress": "currentColor", "--range-fill": "1", "--range-p": "0.25rem", "--range-bg": "color-mix(in oklab, currentColor 10%, #0000)", cursor: "pointer", overflow: "hidden", "background-color": "transparent", "vertical-align": "middle", width: "clamp(3rem, 20rem, 100%)", "--radius-selector-max": `calc( + var(--radius-selector) + var(--radius-selector) + var(--radius-selector) + )`, "border-radius": "calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)))", border: "none", height: "var(--range-thumb-size)", '[dir="rtl"] &': { "--range-dir": "-1" }, "&:focus": { outline: "none" }, "&:focus-visible": { outline: "2px solid", "outline-offset": "2px" }, "&::-webkit-slider-runnable-track": { width: "100%", "background-color": "var(--range-bg)", "border-radius": "var(--radius-selector)", height: "calc(var(--range-thumb-size) * 0.5)" }, "@media (forced-colors: active)": [{ "&::-webkit-slider-runnable-track": { border: "1px solid" } }, { "&::-moz-range-track": { border: "1px solid" } }], "&::-webkit-slider-thumb": { position: "relative", "box-sizing": "border-box", "border-radius": "calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)))", "background-color": "var(--range-thumb)", height: "var(--range-thumb-size)", width: "var(--range-thumb-size)", border: "var(--range-p) solid", appearance: "none", "webkit-appearance": "none", top: "50%", color: "var(--range-progress)", transform: "translateY(-50%)", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir, 1) * -100cqw) - (var(--range-dir, 1) * var(--range-thumb-size) / 2)) 0 0 calc(100cqw * var(--range-fill))" }, "&::-moz-range-track": { width: "100%", "background-color": "var(--range-bg)", "border-radius": "var(--radius-selector)", height: "calc(var(--range-thumb-size) * 0.5)" }, "&::-moz-range-thumb": { position: "relative", "box-sizing": "border-box", "border-radius": "calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)))", "background-color": "currentColor", height: "var(--range-thumb-size)", width: "var(--range-thumb-size)", border: "var(--range-p) solid", top: "50%", color: "var(--range-progress)", "box-shadow": "0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, calc((var(--range-dir, 1) * -100cqw) - (var(--range-dir, 1) * var(--range-thumb-size) / 2)) 0 0 calc(100cqw * var(--range-fill))" }, "&:disabled": { cursor: "not-allowed", opacity: "30%" } + } + }, ".range-primary": { "@layer daisyui.l1.l2": { color: "var(--color-primary)", "--range-thumb": "var(--color-primary-content)" } }, ".range-secondary": { "@layer daisyui.l1.l2": { color: "var(--color-secondary)", "--range-thumb": "var(--color-secondary-content)" } }, ".range-accent": { "@layer daisyui.l1.l2": { color: "var(--color-accent)", "--range-thumb": "var(--color-accent-content)" } }, ".range-neutral": { "@layer daisyui.l1.l2": { color: "var(--color-neutral)", "--range-thumb": "var(--color-neutral-content)" } }, ".range-success": { "@layer daisyui.l1.l2": { color: "var(--color-success)", "--range-thumb": "var(--color-success-content)" } }, ".range-warning": { "@layer daisyui.l1.l2": { color: "var(--color-warning)", "--range-thumb": "var(--color-warning-content)" } }, ".range-info": { "@layer daisyui.l1.l2": { color: "var(--color-info)", "--range-thumb": "var(--color-info-content)" } }, ".range-error": { "@layer daisyui.l1.l2": { color: "var(--color-error)", "--range-thumb": "var(--color-error-content)" } }, ".range-xs": { "@layer daisyui.l1.l2": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 4)" } }, ".range-sm": { "@layer daisyui.l1.l2": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 5)" } }, ".range-md": { "@layer daisyui.l1.l2": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 6)" } }, ".range-lg": { "@layer daisyui.l1.l2": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 7)" } }, ".range-xl": { "@layer daisyui.l1.l2": { "--range-thumb-size": "calc(var(--size-selector, 0.25rem) * 8)" } } +}; + +// packages/daisyui/components/range/index.js +var range_default = ({ addComponents, prefix = "" }) => { + const prefixedrange = addPrefix(object_default63, prefix); + addComponents({ ...prefixedrange }); +}; + +// packages/daisyui/components/progress/object.js +var object_default64 = { ".progress": { "@layer daisyui.l1.l2.l3": { position: "relative", height: "calc(0.25rem * 2)", width: "100%", appearance: "none", overflow: "hidden", "border-radius": "var(--radius-box)", "background-color": "color-mix(in oklab, currentcolor 20%, transparent)", color: "var(--color-base-content)", "&:indeterminate": { "background-image": "repeating-linear-gradient( 90deg, currentColor -1%, currentColor 10%, #0000 10%, #0000 90% )", "background-size": "200%", "background-position-x": "15%", "@media (prefers-reduced-motion: no-preference)": { animation: "progress 5s ease-in-out infinite" }, "@supports (-moz-appearance: none)": { "&::-moz-progress-bar": { "background-color": "transparent", "@media (prefers-reduced-motion: no-preference)": { animation: "progress 5s ease-in-out infinite", "background-image": "repeating-linear-gradient( 90deg, currentColor -1%, currentColor 10%, #0000 10%, #0000 90% )", "background-size": "200%", "background-position-x": "15%" } } } }, "@supports (-moz-appearance: none)": { "&::-moz-progress-bar": { "border-radius": "var(--radius-box)", "background-color": "currentcolor" } }, "@supports (-webkit-appearance: none)": { "&::-webkit-progress-bar": { "border-radius": "var(--radius-box)", "background-color": "transparent" }, "&::-webkit-progress-value": { "border-radius": "var(--radius-box)", "background-color": "currentColor" } } } }, ".progress-primary": { "@layer daisyui.l1.l2": { color: "var(--color-primary)" } }, ".progress-secondary": { "@layer daisyui.l1.l2": { color: "var(--color-secondary)" } }, ".progress-accent": { "@layer daisyui.l1.l2": { color: "var(--color-accent)" } }, ".progress-neutral": { "@layer daisyui.l1.l2": { color: "var(--color-neutral)" } }, ".progress-info": { "@layer daisyui.l1.l2": { color: "var(--color-info)" } }, ".progress-success": { "@layer daisyui.l1.l2": { color: "var(--color-success)" } }, ".progress-warning": { "@layer daisyui.l1.l2": { color: "var(--color-warning)" } }, ".progress-error": { "@layer daisyui.l1.l2": { color: "var(--color-error)" } }, "@keyframes progress": { "50%": { "background-position-x": "-115%" } } }; + +// packages/daisyui/components/progress/index.js +var progress_default = ({ addComponents, prefix = "" }) => { + const prefixedprogress = addPrefix(object_default64, prefix); + addComponents({ ...prefixedprogress }); +}; + +// packages/daisyui/components/swap/object.js +var object_default65 = { ".swap": { "@layer daisyui.l1.l2.l3": { position: "relative", display: "inline-grid", cursor: "pointer", "place-content": "center", "vertical-align": "middle", "webkit-user-select": "none", "user-select": "none", input: { appearance: "none", border: "none" }, "> *": { "grid-column-start": "1", "grid-row-start": "1", "@media (prefers-reduced-motion: no-preference)": { "transition-property": "transform, rotate, opacity", "transition-duration": "0.2s", "transition-timing-function": "cubic-bezier(0, 0, 0.2, 1)" } }, ".swap-on, .swap-indeterminate, input:indeterminate ~ .swap-on": { opacity: "0%" }, "input:is(:checked, :indeterminate)": { "& ~ .swap-off": { opacity: "0%" } }, "input:checked ~ .swap-on, input:indeterminate ~ .swap-indeterminate": { opacity: "100%", "backface-visibility": "visible" } } }, ".swap-active": { "@layer daisyui.l1.l2": { ".swap-off": { opacity: "0%" }, ".swap-on": { opacity: "100%" } } }, ".swap-rotate": { "@layer daisyui.l1.l2": { ".swap-on, input:indeterminate ~ .swap-on": { rotate: "45deg" }, "input:is(:checked, :indeterminate) ~ .swap-on, &.swap-active .swap-on": { rotate: "0deg" }, "input:is(:checked, :indeterminate) ~ .swap-off, &.swap-active .swap-off": { rotate: "calc(45deg * -1)" } } }, ".swap-flip": { "@layer daisyui.l1.l2": { "transform-style": "preserve-3d", perspective: "20rem", ".swap-on, .swap-indeterminate, input:indeterminate ~ .swap-on": { transform: "rotateY(180deg)", "backface-visibility": "hidden" }, "input:is(:checked, :indeterminate) ~ .swap-on, &.swap-active .swap-on": { transform: "rotateY(0deg)" }, "input:is(:checked, :indeterminate) ~ .swap-off, &.swap-active .swap-off": { transform: "rotateY(-180deg)", "backface-visibility": "hidden", opacity: "100%" } } } }; + +// packages/daisyui/components/swap/index.js +var swap_default = ({ addComponents, prefix = "" }) => { + const prefixedswap = addPrefix(object_default65, prefix); + addComponents({ ...prefixedswap }); +}; + +// packages/daisyui/utilities/glass/object.js +var object_default66 = { ".glass": { border: "none", "backdrop-filter": "blur(var(--glass-blur, 40px))", "background-color": "#0000", "background-image": "linear-gradient( 135deg, oklch(100% 0 0 / var(--glass-opacity, 30%)) 0%, oklch(0% 0 0 / 0%) 100% ), linear-gradient( var(--glass-reflect-degree, 100deg), oklch(100% 0 0 / var(--glass-reflect-opacity, 5%)) 25%, oklch(0% 0 0 / 0%) 25% )", "box-shadow": "0 0 0 1px oklch(100% 0 0 / var(--glass-border-opacity, 20%)) inset, 0 0 0 2px oklch(0% 0 0 / 5%)", "text-shadow": "0 1px oklch(0% 0 0 / var(--glass-text-shadow-opacity, 5%))" } }; + +// packages/daisyui/utilities/glass/index.js +var glass_default = ({ addUtilities, prefix = "" }) => { + const prefixedglass = addPrefix(object_default66, prefix); + addUtilities({ ...prefixedglass }); +}; + +// packages/daisyui/utilities/join/object.js +var object_default67 = { ".join": { display: "inline-flex", "align-items": "stretch", "--join-ss": "0", "--join-se": "0", "--join-es": "0", "--join-ee": "0", ":where(.join-item)": { "border-start-start-radius": "var(--join-ss, 0)", "border-start-end-radius": "var(--join-se, 0)", "border-end-start-radius": "var(--join-es, 0)", "border-end-end-radius": "var(--join-ee, 0)", "*": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, "> .join-item:where(:first-child)": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" }, ":first-child:not(:last-child)": { ":where(.join-item)": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" } }, "> .join-item:where(:last-child)": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" }, ":last-child:not(:first-child)": { ":where(.join-item)": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" } }, "> .join-item:where(:only-child)": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":only-child": { ":where(.join-item)": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, "> :where(:focus, :has(:focus))": { "z-index": 1 }, "@media (hover: hover)": { "> :where(.btn:hover, :has(.btn:hover))": { isolation: "isolate" } } }, ".join-item": { "&:where(*:not(:first-child, :disabled, [disabled], .btn-disabled))": { "margin-inline-start": "calc(var(--border, 1px) * -1)", "margin-block-start": "0" }, "&:where(*:is(:disabled, [disabled], .btn-disabled))": { "border-width": "var(--border, 1px) 0 var(--border, 1px) var(--border, 1px)" } }, ".join-vertical": { "flex-direction": "column", "> .join-item:first-child": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "0" }, ":first-child:not(:last-child)": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "0" } }, "> .join-item:last-child": { "--join-ss": "0", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":last-child:not(:first-child)": { ".join-item": { "--join-ss": "0", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, "> .join-item:only-child": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":only-child": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, ".join-item": { "&:where(*:not(:first-child))": { "margin-inline-start": "0", "margin-block-start": "calc(var(--border, 1px) * -1)" } } }, ".join-horizontal": { "flex-direction": "row", "> .join-item:first-child": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" }, ":first-child:not(:last-child)": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "0", "--join-es": "var(--radius-field)", "--join-ee": "0" } }, "> .join-item:last-child": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" }, ":last-child:not(:first-child)": { ".join-item": { "--join-ss": "0", "--join-se": "var(--radius-field)", "--join-es": "0", "--join-ee": "var(--radius-field)" } }, "> .join-item:only-child": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" }, ":only-child": { ".join-item": { "--join-ss": "var(--radius-field)", "--join-se": "var(--radius-field)", "--join-es": "var(--radius-field)", "--join-ee": "var(--radius-field)" } }, ".join-item": { "&:where(*:not(:first-child))": { "margin-inline-start": "calc(var(--border, 1px) * -1)", "margin-block-start": "0" } } } }; + +// packages/daisyui/utilities/join/index.js +var join_default = ({ addUtilities, prefix = "" }) => { + const prefixedjoin = addPrefix(object_default67, prefix); + addUtilities({ ...prefixedjoin }); +}; + +// packages/daisyui/utilities/typography/object.js +var object_default68 = { ":root .prose": { "--tw-prose-body": "color-mix(in oklab, var(--color-base-content) 80%, #0000)", "--tw-prose-headings": "var(--color-base-content)", "--tw-prose-lead": "var(--color-base-content)", "--tw-prose-links": "var(--color-base-content)", "--tw-prose-bold": "var(--color-base-content)", "--tw-prose-counters": "var(--color-base-content)", "--tw-prose-bullets": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--tw-prose-hr": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--tw-prose-quotes": "var(--color-base-content)", "--tw-prose-quote-borders": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--tw-prose-captions": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--tw-prose-code": "var(--color-base-content)", "--tw-prose-pre-code": "var(--color-neutral-content)", "--tw-prose-pre-bg": "var(--color-neutral)", "--tw-prose-th-borders": "color-mix(in oklab, var(--color-base-content) 50%, #0000)", "--tw-prose-td-borders": "color-mix(in oklab, var(--color-base-content) 20%, #0000)", "--tw-prose-kbd": "color-mix(in oklab, var(--color-base-content) 80%, #0000)", ":where(code):not(pre > code)": { "background-color": "var(--color-base-200)", "border-radius": "var(--radius-selector)", border: "var(--border) solid var(--color-base-300)", "padding-inline": "0.5em", "padding-block": "0.2em", "font-weight": "inherit", "&:before, &:after": { display: "none" } } } }; + +// packages/daisyui/utilities/typography/index.js +var typography_default = ({ addUtilities, prefix = "" }) => { + const prefixedtypography = addPrefix(object_default68, prefix); + addUtilities({ ...prefixedtypography }); +}; + +// packages/daisyui/utilities/radius/object.js +var object_default69 = { ".rounded-box": { "border-radius": "var(--radius-box)" }, ".rounded-field": { "border-radius": "var(--radius-field)" }, ".rounded-selector": { "border-radius": "var(--radius-selector)" }, ".rounded-t-box": { "border-top-left-radius": "var(--radius-box)", "border-top-right-radius": "var(--radius-box)" }, ".rounded-b-box": { "border-bottom-left-radius": "var(--radius-box)", "border-bottom-right-radius": "var(--radius-box)" }, ".rounded-l-box": { "border-top-left-radius": "var(--radius-box)", "border-bottom-left-radius": "var(--radius-box)" }, ".rounded-r-box": { "border-top-right-radius": "var(--radius-box)", "border-bottom-right-radius": "var(--radius-box)" }, ".rounded-tl-box": { "border-top-left-radius": "var(--radius-box)" }, ".rounded-tr-box": { "border-top-right-radius": "var(--radius-box)" }, ".rounded-br-box": { "border-bottom-right-radius": "var(--radius-box)" }, ".rounded-bl-box": { "border-bottom-left-radius": "var(--radius-box)" }, ".rounded-t-field": { "border-top-left-radius": "var(--radius-field)", "border-top-right-radius": "var(--radius-field)" }, ".rounded-b-field": { "border-bottom-left-radius": "var(--radius-field)", "border-bottom-right-radius": "var(--radius-field)" }, ".rounded-l-field": { "border-top-left-radius": "var(--radius-field)", "border-bottom-left-radius": "var(--radius-field)" }, ".rounded-r-field": { "border-top-right-radius": "var(--radius-field)", "border-bottom-right-radius": "var(--radius-field)" }, ".rounded-tl-field": { "border-top-left-radius": "var(--radius-field)" }, ".rounded-tr-field": { "border-top-right-radius": "var(--radius-field)" }, ".rounded-br-field": { "border-bottom-right-radius": "var(--radius-field)" }, ".rounded-bl-field": { "border-bottom-left-radius": "var(--radius-field)" }, ".rounded-t-selector": { "border-top-left-radius": "var(--radius-selector)", "border-top-right-radius": "var(--radius-selector)" }, ".rounded-b-selector": { "border-bottom-left-radius": "var(--radius-selector)", "border-bottom-right-radius": "var(--radius-selector)" }, ".rounded-l-selector": { "border-top-left-radius": "var(--radius-selector)", "border-bottom-left-radius": "var(--radius-selector)" }, ".rounded-r-selector": { "border-top-right-radius": "var(--radius-selector)", "border-bottom-right-radius": "var(--radius-selector)" }, ".rounded-tl-selector": { "border-top-left-radius": "var(--radius-selector)" }, ".rounded-tr-selector": { "border-top-right-radius": "var(--radius-selector)" }, ".rounded-br-selector": { "border-bottom-right-radius": "var(--radius-selector)" }, ".rounded-bl-selector": { "border-bottom-left-radius": "var(--radius-selector)" } }; + +// packages/daisyui/utilities/radius/index.js +var radius_default = ({ addUtilities, prefix = "" }) => { + const prefixedradius = addPrefix(object_default69, prefix); + addUtilities({ ...prefixedradius }); +}; + +// packages/daisyui/imports.js +var base = { svg: svg_default, scrollbar: scrollbar_default, properties: properties_default, rootscrolllock: rootscrolllock_default, rootscrollgutter: rootscrollgutter_default, rootcolor: rootcolor_default }; +var components = { textarea: textarea_default, rating: rating_default, calendar: calendar_default, dropdown: dropdown_default, tab: tab_default, fileinput: fileinput_default, modal: modal_default, radialprogress: radialprogress_default, checkbox: checkbox_default, select: select_default, radio: radio_default, avatar: avatar_default, toast: toast_default, hover3d: hover3d_default, carousel: carousel_default, textrotate: textrotate_default, mockup: mockup_default, divider: divider_default, button: button_default, fieldset: fieldset_default, steps: steps_default, navbar: navbar_default, stat: stat_default, countdown: countdown_default, skeleton: skeleton_default, card: card_default, drawer: drawer_default, indicator: indicator_default, footer: footer_default, loading: loading_default, menu: menu_default, toggle: toggle_default, badge: badge_default, link: link_default, validator: validator_default, list: list_default, tooltip: tooltip_default, table: table_default, hero: hero_default, breadcrumbs: breadcrumbs_default, collapse: collapse_default, stack: stack_default, diff: diff_default, filter: filter_default, dock: dock_default, mask: mask_default, label: label_default, status: status_default, hovergallery: hovergallery_default, alert: alert_default, fab: fab_default, kbd: kbd_default, input: input_default, timeline: timeline_default, chat: chat_default, range: range_default, progress: progress_default, swap: swap_default }; +var utilities = { glass: glass_default, join: join_default, typography: typography_default, radius: radius_default }; + +// packages/daisyui/index.js +var version = "5.5.14"; +var daisyui_default = plugin.withOptions((options) => { + return ({ addBase, addComponents, addUtilities, addVariant }) => { + const { + include, + exclude, + prefix = "" + } = pluginOptionsHandler(options, addBase, object_default, version); + const shouldIncludeItem = (name) => { + if (include && exclude) { + return include.includes(name) && !exclude.includes(name); + } + if (include) { + return include.includes(name); + } + if (exclude) { + return !exclude.includes(name); + } + return true; + }; + Object.entries(base).forEach(([name, item]) => { + if (!shouldIncludeItem(name)) + return; + item({ addBase, prefix }); + }); + Object.entries(components).forEach(([name, item]) => { + if (!shouldIncludeItem(name)) + return; + item({ addComponents, prefix }); + }); + Object.entries(utilities).forEach(([name, item]) => { + if (!shouldIncludeItem(name)) + return; + item({ addUtilities, prefix }); + }); + addVariant(`${prefix}is-drawer-close`, `&:where(.${prefix}drawer-toggle:not(:checked) ~ .${prefix}drawer-side, .${prefix}drawer-toggle:not(:checked) ~ .${prefix}drawer-side *)`); + addVariant(`${prefix}is-drawer-open`, `&:where(.${prefix}drawer-toggle:checked ~ .${prefix}drawer-side, .${prefix}drawer-toggle:checked ~ .${prefix}drawer-side *)`); + }; +}, () => ({ + theme: { + extend: variables_default + } +})); +export { + daisyui_default as default +}; + + +/* + + MIT License + + Copyright (c) 2020 Pouya Saadeghi – https://daisyui.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +*/ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000..eac51b5 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class ApplicationController < ActionController::Base + # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has. + allow_browser versions: :modern + + # Changes to the importmap will invalidate the etag for HTML responses + stale_when_importmap_changes +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb new file mode 100644 index 0000000..5463418 --- /dev/null +++ b/app/controllers/home_controller.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class HomeController < ApplicationController + def index + end +end diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb new file mode 100644 index 0000000..a670078 --- /dev/null +++ b/app/controllers/todos_controller.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +class TodosController < ApplicationController + before_action :set_todo, only: [:edit, :update, :destroy, :toggle] + + def index + @todos = Todo.by_created + @todo = Todo.new + end + + def create + @todo = Todo.new(todo_params) + if @todo.save + respond_to do |format| + format.turbo_stream + format.html { redirect_to(todos_path) } + end + else + @todos = Todo.by_created + respond_to do |format| + format.turbo_stream { render(turbo_stream: turbo_stream.replace("todo_form", partial: "todos/form", locals: { todo: @todo })) } + format.html { render(:index, status: :unprocessable_entity) } + end + end + end + + def edit + end + + def update + if @todo.update(todo_params) + respond_to do |format| + format.turbo_stream + format.html { redirect_to(todos_path) } + end + else + respond_to do |format| + format.turbo_stream { render(turbo_stream: turbo_stream.replace(dom_id(@todo), partial: "todos/todo", locals: { todo: @todo })) } + format.html { render(:edit, status: :unprocessable_entity) } + end + end + end + + def destroy + @todo.destroy + respond_to do |format| + format.turbo_stream + format.html { redirect_to(todos_path) } + end + end + + def toggle + @todo.update(completed: !@todo.completed) + respond_to do |format| + format.turbo_stream { render(turbo_stream: turbo_stream.replace(dom_id(@todo), partial: "todos/todo", locals: { todo: @todo })) } + format.html { redirect_to(todos_path) } + end + end + + private + + def set_todo + @todo = Todo.find(params[:id]) + end + + def todo_params + params.require(:todo).permit(:title) + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000..15b06f0 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +module ApplicationHelper +end diff --git a/app/javascript/application.js b/app/javascript/application.js new file mode 100644 index 0000000..c275ea8 --- /dev/null +++ b/app/javascript/application.js @@ -0,0 +1,2 @@ +// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails +import "controllers" diff --git a/app/javascript/controllers/application.js b/app/javascript/controllers/application.js new file mode 100644 index 0000000..1213e85 --- /dev/null +++ b/app/javascript/controllers/application.js @@ -0,0 +1,9 @@ +import { Application } from "@hotwired/stimulus" + +const application = Application.start() + +// Configure Stimulus development experience +application.debug = false +window.Stimulus = application + +export { application } diff --git a/app/javascript/controllers/hello_controller.js b/app/javascript/controllers/hello_controller.js new file mode 100644 index 0000000..5975c07 --- /dev/null +++ b/app/javascript/controllers/hello_controller.js @@ -0,0 +1,7 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + connect() { + this.element.textContent = "Hello World!" + } +} diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js new file mode 100644 index 0000000..1156bf8 --- /dev/null +++ b/app/javascript/controllers/index.js @@ -0,0 +1,4 @@ +// Import and register all your controllers from the importmap via controllers/**/*_controller +import { application } from "controllers/application" +import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading" +eagerLoadControllersFrom("controllers", application) diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000..bef3959 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class ApplicationJob < ActiveJob::Base + # Automatically retry jobs that encountered a deadlock + # retry_on ActiveRecord::Deadlocked + + # Most jobs are safe to ignore if the underlying records are no longer available + # discard_on ActiveJob::DeserializationError +end diff --git a/app/jobs/example_recurring_job.rb b/app/jobs/example_recurring_job.rb new file mode 100644 index 0000000..31a0857 --- /dev/null +++ b/app/jobs/example_recurring_job.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class ExampleRecurringJob < ApplicationJob + queue_as :default + + def perform + Rails.logger.info("[ExampleRecurringJob] ran at #{Time.current}") + end +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000..08dc537 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class ApplicationRecord < ActiveRecord::Base + primary_abstract_class +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/todo.rb b/app/models/todo.rb new file mode 100644 index 0000000..36dc14b --- /dev/null +++ b/app/models/todo.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class Todo < ApplicationRecord + validates :title, presence: true, length: { maximum: 255 } + + after_create_commit { broadcast_prepend_to "todos", target: "todos" } + + scope :pending, -> { where(completed: false) } + scope :completed, -> { where(completed: true) } + scope :by_created, -> { order(created_at: :asc) } +end diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb new file mode 100644 index 0000000..431fcc2 --- /dev/null +++ b/app/views/home/index.html.erb @@ -0,0 +1,24 @@ +
+

Rails 8 Starter Kit

+

Rails <%= Rails.version %> · Ruby <%= RUBY_VERSION %>

+ + + +

Stack

+
    +
  • PostgreSQL via pg
  • +
  • Solid Queue — background jobs
  • +
  • Solid Cache — database-backed cache
  • +
  • Solid Cable — Action Cable adapter
  • +
  • Mission Control Jobs — jobs dashboard
  • +
+ +

Processes (bin/dev)

+
    +
  • web — Puma web server
  • +
  • worker — Solid Queue worker + recurring jobs dispatcher
  • +
+
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000..9329df5 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,47 @@ + + + + <%= content_for(:title) || "Starter" %> + + + + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= yield :head %> + + <%# Enable PWA manifest for installable apps %> + <%= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %> + + + + + + + + + <%# Includes all stylesheet files in app/assets/stylesheets %> + <%= stylesheet_link_tag :app, "data-turbo-track": "reload" %> + <%= javascript_importmap_tags %> + <% if Rails.env.test? %> + + <% end %> + + + + <%= yield %> + + diff --git a/app/views/pwa/manifest.json.erb b/app/views/pwa/manifest.json.erb new file mode 100644 index 0000000..bff10f2 --- /dev/null +++ b/app/views/pwa/manifest.json.erb @@ -0,0 +1,22 @@ +{ + "name": "Rails 8 Starter Kit", + "short_name": "Starter", + "description": "A production-grade, AI-native fullstack starter kit.", + "start_url": "/", + "display": "standalone", + "background_color": "#0f0f14", + "theme_color": "#0f0f14", + "icons": [ + { + "src": "/icon.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "/icon.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "maskable" + } + ] +} diff --git a/app/views/pwa/service-worker.js b/app/views/pwa/service-worker.js new file mode 100644 index 0000000..5c15433 --- /dev/null +++ b/app/views/pwa/service-worker.js @@ -0,0 +1,39 @@ +// Network-first strategy with offline fallback for PWA standalone mode + +const CACHE_NAME = "rails-8-starter-offline"; +const OFFLINE_URL = "/offline.html"; + +// Pre-cache the offline fallback page on install +self.addEventListener("install", (event) => { + event.waitUntil( + caches.open(CACHE_NAME).then((cache) => cache.add(OFFLINE_URL)) + ); + self.skipWaiting(); +}); + +// Clean up old caches on activate +self.addEventListener("activate", (event) => { + event.waitUntil( + caches.keys().then((keys) => + Promise.all( + keys + .filter((key) => key !== CACHE_NAME) + .map((key) => caches.delete(key)) + ) + ) + ); + self.clients.claim(); +}); + +// Network-first for navigation requests; fallback to offline page on failure +self.addEventListener("fetch", (event) => { + if (event.request.mode !== "navigate") return; + + const url = new URL(event.request.url); + + event.respondWith( + fetch(event.request).catch(() => + caches.match(OFFLINE_URL).then((cached) => cached || new Response("Offline", { status: 503 })) + ) + ); +}); diff --git a/app/views/todos/_form.html.erb b/app/views/todos/_form.html.erb new file mode 100644 index 0000000..3c79b27 --- /dev/null +++ b/app/views/todos/_form.html.erb @@ -0,0 +1,16 @@ +<%= form_with model: todo, id: "todo_form", class: "todo-form" do |f| %> + <% if todo.errors.any? %> +
+ <% todo.errors.full_messages.each do |msg| %> +

<%= msg %>

+ <% end %> +
+ <% end %> +
+ <%= f.text_field :title, placeholder: "What needs to be done?", autofocus: true, class: "todo-input", autocomplete: "off" %> + <%= f.submit todo.new_record? ? "Add" : "Save", class: "btn btn-primary" %> + <% unless todo.new_record? %> + <%= link_to "Cancel", todos_path, class: "btn btn-secondary" %> + <% end %> +
+<% end %> diff --git a/app/views/todos/_todo.html.erb b/app/views/todos/_todo.html.erb new file mode 100644 index 0000000..9cf6f49 --- /dev/null +++ b/app/views/todos/_todo.html.erb @@ -0,0 +1,10 @@ +
  • + <%= button_to toggle_todo_path(todo), method: :patch, class: "toggle-btn", "data-turbo-stream": true do %> + <%= todo.completed? ? "✓" : "" %> + <% end %> + <%= todo.title %> +
    + <%= link_to "Edit", edit_todo_path(todo), class: "btn btn-sm" %> + <%= button_to "Delete", todo_path(todo), method: :delete, class: "btn btn-sm btn-danger", "data-turbo-confirm": "Delete this todo?", "data-turbo-stream": true %> +
    +
  • diff --git a/app/views/todos/create.turbo_stream.erb b/app/views/todos/create.turbo_stream.erb new file mode 100644 index 0000000..254b62c --- /dev/null +++ b/app/views/todos/create.turbo_stream.erb @@ -0,0 +1,2 @@ +<%= turbo_stream.append "todos", partial: "todos/todo", locals: { todo: @todo } %> +<%= turbo_stream.replace "todo_form", partial: "todos/form", locals: { todo: Todo.new } %> diff --git a/app/views/todos/destroy.turbo_stream.erb b/app/views/todos/destroy.turbo_stream.erb new file mode 100644 index 0000000..57a8ee2 --- /dev/null +++ b/app/views/todos/destroy.turbo_stream.erb @@ -0,0 +1 @@ +<%= turbo_stream.remove dom_id(@todo) %> diff --git a/app/views/todos/edit.html.erb b/app/views/todos/edit.html.erb new file mode 100644 index 0000000..ba8b9f2 --- /dev/null +++ b/app/views/todos/edit.html.erb @@ -0,0 +1,6 @@ +<% content_for :title, "Edit Todo" %> + +
    +

    Edit Todo

    + <%= render "form", todo: @todo %> +
    diff --git a/app/views/todos/index.html.erb b/app/views/todos/index.html.erb new file mode 100644 index 0000000..cccb95a --- /dev/null +++ b/app/views/todos/index.html.erb @@ -0,0 +1,14 @@ +<% content_for :title, "Todo App" %> + +
    + <%= turbo_stream_from "todos" %> +

    Todos

    + +
    + <%= render "form", todo: @todo %> +
    + +
      + <%= render @todos %> +
    +
    diff --git a/app/views/todos/update.turbo_stream.erb b/app/views/todos/update.turbo_stream.erb new file mode 100644 index 0000000..bf317f3 --- /dev/null +++ b/app/views/todos/update.turbo_stream.erb @@ -0,0 +1 @@ +<%= turbo_stream.replace dom_id(@todo), partial: "todos/todo", locals: { todo: @todo } %> diff --git a/bin/brakeman b/bin/brakeman new file mode 100755 index 0000000..ace1c9b --- /dev/null +++ b/bin/brakeman @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby +require "rubygems" +require "bundler/setup" + +ARGV.unshift("--ensure-latest") + +load Gem.bin_path("brakeman", "brakeman") diff --git a/bin/bundler-audit b/bin/bundler-audit new file mode 100755 index 0000000..e2ef226 --- /dev/null +++ b/bin/bundler-audit @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "bundler/audit/cli" + +ARGV.concat %w[ --config config/bundler-audit.yml ] if ARGV.empty? || ARGV.include?("check") +Bundler::Audit::CLI.start diff --git a/bin/check b/bin/check new file mode 100755 index 0000000..1f02915 --- /dev/null +++ b/bin/check @@ -0,0 +1,84 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'optparse' + +options = { + parallel: [], + then: [] +} + +OptionParser.new do |opts| + opts.on("--parallel=LIST", Array) { |list| options[:parallel] = list } + opts.on("--then=LIST", Array) { |list| options[:then] = list } +end.parse! + +if options[:parallel].empty? && options[:then].empty? + puts "Usage: #{$PROGRAM_NAME} [--parallel=task1,task2] [--then=task3,task4]" + exit 1 +end + +ENV["SILENT_TESTS"] = "1" + +def resolve_cmd(name) + paths = [ + "./bin/linters/#{name}", + "./bin/linters/helpers/#{name}" + ] + # Find an executable path, or default to executing the name directly + paths.find { |p| File.executable?(p) } || name +end + +def run_task(name) + cmd = resolve_cmd(name) + start_time = Time.now + + output = `DISABLE_SPRING=1 #{cmd} 2>&1` + ext_code = $?.exitstatus + elapsed = (Time.now - start_time).round + success = (ext_code == 0) + + # Check if the script wraps its own output + if output.include?("✅ SUCCESS") || output.include?("❌ FAILED") + puts output + else + if success + puts "✅ SUCCESS: #{cmd} (#{elapsed}s)" + else + puts "========================================" + puts "❌ FAILED: #{cmd} (#{elapsed}s)" + puts output + puts "" + end + end + success +end + +threads = [] +results = {} +mutex = Mutex.new + +options[:parallel].each do |task_name| + threads << Thread.new do + success = run_task(task_name) + mutex.synchronize { results[task_name] = success } + end +end + +unless options[:then].empty? + threads << Thread.new do + options[:then].each do |task_name| + success = run_task(task_name) + mutex.synchronize { results[task_name] = success } + break unless success # Stop the sequential chain on failure! + end + end +end + +threads.each(&:join) + +if results.values.any? { |r| !r } + exit 1 +else + exit 0 +end diff --git a/bin/check-fast b/bin/check-fast new file mode 100755 index 0000000..534cf11 --- /dev/null +++ b/bin/check-fast @@ -0,0 +1,4 @@ +#!/bin/bash + +# Fast linting mode (replaces bin/lint) +exec ./bin/check --parallel=rspec,flog,flay,rubocop,brakeman,bundler-audit,reek,haml-syntax diff --git a/bin/ci b/bin/ci new file mode 100755 index 0000000..4137ad5 --- /dev/null +++ b/bin/ci @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "active_support/continuous_integration" + +CI = ActiveSupport::ContinuousIntegration +require_relative "../config/ci.rb" diff --git a/bin/dev b/bin/dev new file mode 100755 index 0000000..9e586e1 --- /dev/null +++ b/bin/dev @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +exec foreman start -f Procfile.dev "$@" diff --git a/bin/docker-entrypoint b/bin/docker-entrypoint new file mode 100755 index 0000000..2be5a4b --- /dev/null +++ b/bin/docker-entrypoint @@ -0,0 +1,9 @@ +#!/bin/bash -e + +# If running the rails server or bundle install, run standard setup +if [ "$1" == "./bin/rails" ] && [ "$2" == "server" ] || [ "$1" == "bin/dev" ]; then + bundle check || bundle install + ./bin/rails db:prepare 2>/dev/null || true +fi + +exec "${@}" diff --git a/bin/importmap b/bin/importmap new file mode 100755 index 0000000..36502ab --- /dev/null +++ b/bin/importmap @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby + +require_relative "../config/application" +require "importmap/commands" diff --git a/bin/jobs b/bin/jobs new file mode 100755 index 0000000..dcf59f3 --- /dev/null +++ b/bin/jobs @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby + +require_relative "../config/environment" +require "solid_queue/cli" + +SolidQueue::Cli.start(ARGV) diff --git a/bin/linters/brakeman b/bin/linters/brakeman new file mode 100755 index 0000000..99e0390 --- /dev/null +++ b/bin/linters/brakeman @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "rubygems" +require "bundler/setup" + +config_dir = File.expand_path("../../config", __dir__) +ARGV.unshift( + "--no-pager", + "--ensure-latest", + "--config-file", + File.join(config_dir, "brakeman.yml"), + "--ignore-config", + File.join(config_dir, "brakeman.ignore"), +) + +load Gem.bin_path("brakeman", "brakeman") diff --git a/bin/linters/bundler-audit b/bin/linters/bundler-audit new file mode 100755 index 0000000..81be9d7 --- /dev/null +++ b/bin/linters/bundler-audit @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative "../../config/boot" +require "bundler/audit/cli" + +ARGV.push("--config", "../config/bundler-audit.yml") if ARGV.empty? || ARGV.include?("check") +Bundler::Audit::CLI.start diff --git a/bin/linters/coverage b/bin/linters/coverage new file mode 100755 index 0000000..5002cb3 --- /dev/null +++ b/bin/linters/coverage @@ -0,0 +1,76 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "json" + +MARKER_FILE = "coverage/coverage.json" + +unless File.exist?(MARKER_FILE) + puts "Coverage check failed: no coverage.json found." + puts "Please run `bin/linters/nplus1` or `bin/coverage` first to generate the report." + exit 1 +end + +begin + data = JSON.parse(File.read(MARKER_FILE)) + + unless data.key?("groups") + puts "Coverage check failed: 'groups' key not found in coverage.json format." + exit(1) + end + + failed_groups = [] + + data["groups"].each do |group_name, group_data| + # Depending on SimpleCov format, it might be nested under `lines` + # Check both structured formats. + percent = group_data.dig("lines", "covered_percent") || group_data["covered_percent"] + + if percent.nil? + puts "Coverage check failed: Could not determine covered_percent for group '#{group_name}'." + exit(1) + end + + if percent < 100.0 + failed_groups << { name: group_name, percent: percent } + end + end + + if failed_groups.any? + puts "Coverage check failed: Not all groups have 100% coverage." + puts "The following groups need more tests:" + failed_groups.sort_by { |fg| fg[:name] }.each do |fg| + # Format percentage to 2 decimal places max + percent_str = fg[:percent] == fg[:percent].to_i ? fg[:percent].to_i : format("%.2f", fg[:percent]) + puts " - #{fg[:name]}: #{percent_str}%" + end + + if data["coverage"] + puts "\nUncovered lines:" + data["coverage"].each do |file, file_data| + next unless file_data["lines"] + next if file_data["lines"].compact.all? { |l| l.to_i > 0 } + + lines = file_data["lines"] + missing_lines = [] + + lines.each_with_index do |visits, idx| + missing_lines << (idx + 1) if visits && visits.to_i == 0 + end + + if missing_lines.any? + relative_file = file.sub(%r{^#{Regexp.escape(Dir.pwd)}/}, "") + puts " - #{relative_file}: #{missing_lines.count} missing lines (#{missing_lines.join(", ")})" + end + end + end + + exit(1) + end + + puts "Coverage check passed: All groups have 100% coverage." + exit(0) +rescue JSON::ParserError + puts "Coverage check failed: coverage.json is not valid JSON." + exit(1) +end diff --git a/bin/linters/flay b/bin/linters/flay new file mode 100755 index 0000000..c8c3c83 --- /dev/null +++ b/bin/linters/flay @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +flay_args=() +paths=() + +for arg in "$@"; do + if [[ "$arg" == -* ]]; then + flay_args+=("$arg") + else + paths+=("$arg") + fi +done + +if [ ${#paths[@]} -eq 0 ]; then + paths=(app lib) +fi + +# Run flay and filter out similar-code blocks that reference only excluded MCP tool DSL files. +# get_play*.rb and list_play*.rb files have structurally required DSL duplication. +EXCLUDED_PATTERN="app/mcp/tools/get_play\|app/mcp/tools/list_play" + +RAW=$(bundle exec flay --mass 35 "${flay_args[@]}" "${paths[@]}" 2>&1 || true) + +# Filter: remove any "Similar code found" block where ALL file references are excluded files. +# We use Ruby to parse blocks and drop those that only contain excluded paths. +RESULT=$(echo "$RAW" | ruby -e ' +excluded = /app\/mcp\/tools\/(get_play|list_play|list_templates|create_mutation|search_templates)/ + blocks = STDIN.read.split(/\n(?=\d+\))/) + header = blocks.shift || "" + kept = blocks.reject { |b| b.scan(%r{app/mcp/tools/\S+\.rb}).all? { |f| f.match?(excluded) } } + kept_mass = kept.sum { |b| b.match(/mass = (\d+)/i) ? $1.to_i : 0 } + puts "Total score (lower is better) = #{kept_mass}" + puts kept.join("\n") +') + +SCORE=$(echo "$RESULT" | grep 'Total score' | awk -F= '{print $2}' | tr -d ' ') + +if [ "$SCORE" != "0" ] && echo "$RESULT" | grep -q 'Similar code found'; then + echo "$RESULT" + exit 1 +else + exit 0 +fi diff --git a/bin/linters/flog b/bin/linters/flog new file mode 100755 index 0000000..707887f --- /dev/null +++ b/bin/linters/flog @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +export FLOG_SCORE=${FLOG_SCORE:-50} + +flog_args=() +paths=() + +for arg in "$@"; do + if [[ "$arg" == -* ]]; then + flog_args+=("$arg") + else + paths+=("$arg") + fi +done + +if [ ${#paths[@]} -eq 0 ]; then + paths=(app lib) +fi + +# 1. Use $() to actually capture the pipeline's output into the RESULT variable +RESULT=$(bundle exec flog "${flog_args[@]}" "${paths[@]}" | awk -v threshold="$FLOG_SCORE" '{ if ($1+0 > threshold) print $0 }' | grep -v ': flog total' | grep -v '#none' || true) + + +# 2. Check if the string is non-empty +if [ -n "$RESULT" ]; then + # RESULT has content, exit with code 1 + echo "$RESULT" + exit 1 +else + # RESULT is empty, exit with code 0 + exit 0 +fi \ No newline at end of file diff --git a/bin/linters/haml-hardcoded-strings b/bin/linters/haml-hardcoded-strings new file mode 100755 index 0000000..154f706 --- /dev/null +++ b/bin/linters/haml-hardcoded-strings @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "rubygems" +require "bundler/setup" +require "haml_lint" +require "haml_lint/cli" + +require_relative "../../lib/haml_lint/linter/find_hardcoded_strings" + +require "tempfile" + +# Write a temporary config to enable only this linter +config_content = <<~YAML + require: + - '#{File.expand_path("../../lib/haml_lint/linter/find_hardcoded_strings.rb", __dir__)}' + linters: + FindHardcodedStrings: + enabled: true +YAML + +Tempfile.open([".haml-lint-hardcoded", ".yml"]) do |f| + f.write(config_content) + f.flush + + args = ARGV.empty? ? ["app/views"] : ARGV + args += ["-c", f.path, "--include-linter", "FindHardcodedStrings"] + + success = system("bundle", "exec", "haml-lint", *args) + exit success ? 0 : 1 +end diff --git a/bin/linters/haml-syntax b/bin/linters/haml-syntax new file mode 100755 index 0000000..f3c3ab8 --- /dev/null +++ b/bin/linters/haml-syntax @@ -0,0 +1,79 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "rubygems" +require "bundler/setup" +require "find" +require "haml" + +error_count = 0 +warning_count = 0 + +# Patterns that compile but produce wrong HTML in Haml 7. +# e.g. `.text-base-content\\/60` creates class "text-base-content" with text "\/60" +# instead of class "text-base-content/60". Use {class: "..."} attribute hashes. +SUSPECT_CLASS_PATTERNS = [ + %r{^\s*[%.]\S*\\/}, # escaped slash in dot-notation: .foo\/bar + /^\s*[%.]\S*\\:/, # escaped colon in dot-notation: .hover\:bg-red +].freeze + +Find.find(File.expand_path("../../app/views", __dir__)) do |path| + next unless path.end_with?(".haml") + + source = File.read(path) + + # --- Errors --- + begin + compiled = Haml::Engine.new.call(source) + # Check for Ruby syntax errors in the compiled code + # Wrapping in a `def` so `yield` and `return` in templates don't trigger syntax errors. + RubyVM::InstructionSequence.compile("def _haml_compilation_test\n#{compiled}\nend\n") + rescue Haml::SyntaxError => e + $stderr.puts "\nFile: #{path}" + $stderr.puts e.message + error_count += 1 + next + rescue SyntaxError => e + $stderr.puts "\nFile: #{path}" + $stderr.puts "Ruby syntax error in compiled Haml:" + $stderr.puts e.message + error_count += 1 + next + end + + # Haml 7 defers certain errors (e.g. illegal nesting) into the compiled + # Ruby source as `raise Haml::SyntaxError.new(...)` instead of failing at + # parse time. Detect those deferred errors by scanning the output. + if compiled.include?("Haml::SyntaxError") + if (match = compiled.match(/Haml::SyntaxError\.new\(%q\[(.+?)\]/)) + message = match[1] + end + if (line_match = compiled.match(/Haml::SyntaxError\.new\(%q\[.+?\],\s*(\d+)\)/)) + line = line_match[1] + end + + $stderr.puts "\nFile: #{path}#{line ? ":#{line}" : ""}" + $stderr.puts message || "Deferred Haml::SyntaxError detected in compiled output" + error_count += 1 + end + + # --- Recommendations --- + # Detect escaped class patterns that compile but produce incorrect HTML. + source.each_line.with_index(1) do |line, lineno| + SUSPECT_CLASS_PATTERNS.each do |pattern| + next unless line.match?(pattern) + + $stderr.puts "\n[warning] File: #{path}:#{lineno}" + $stderr.puts " Escaped class in dot-notation produces incorrect HTML in Haml 7." + $stderr.puts " Use {class: \"...\"} attribute hash instead." + $stderr.puts " > #{line.strip}" + warning_count += 1 + end + end +end + +if warning_count > 0 + $stderr.puts "\n#{warning_count} warning(s) found (do not cause build failure)" +end + +exit(error_count.zero? ? 0 : 1) diff --git a/bin/linters/helpers/merge_coverage b/bin/linters/helpers/merge_coverage new file mode 100755 index 0000000..729f314 --- /dev/null +++ b/bin/linters/helpers/merge_coverage @@ -0,0 +1,55 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# Merges multiple SimpleCov result sets in .resultset.json into a single +# combined entry. This is necessary because Skunk (via RubyCritic) reads +# only the FIRST entry from the resultset, missing coverage data from +# other parallel test groups. +# It also synchronously formats the final coverage to avoid parallel test +# race conditions corrupting coverage/coverage.json + +require "simplecov" +require "json" + +RESULTSET_PATH = File.expand_path("../../..", __dir__) + "/coverage/.resultset.json" + +unless File.exist?(RESULTSET_PATH) + warn "[merge_coverage] No .resultset.json found" + exit 0 +end + +data = JSON.parse(File.read(RESULTSET_PATH)) +suite_count = data.keys.reject { |k| k == "merged" || k.include?(",") }.size + +# Run standard collation which generates coverage/coverage.json perfectly +SimpleCov.collate(Dir[RESULTSET_PATH], "rails") do + add_filter "/spec/" + add_filter "/config/" + add_filter "/vendor/" + + add_group "Channels", "app/channels" + add_group "Controllers", "app/controllers" + add_group "Models", "app/models" + add_group "MCP Tools", "app/mcp" + add_group "Helpers", "app/helpers" + add_group "Jobs", "app/jobs" + add_group "Services", "app/services" + + if ENV["COVERAGE_FORMAT"] == "json" + require "simplecov_json_formatter" + formatter SimpleCov::Formatter::JSONFormatter + else + formatter SimpleCov::Formatter::HTMLFormatter + end +end + +# Now clean up .resultset.json so that Skunk parses it correctly. +# SimpleCov.collate joined all command names into a single massive key. +# We extract that largest merged value, and rewrite .resultset.json with ONLY "merged" +new_data = JSON.parse(File.read(RESULTSET_PATH)) +# Find the collated key (it will contain commas since it joined multiple suite names, or it will be the most recently touched) +merged_payload = new_data.values.max_by { |v| v["timestamp"].to_i } + +File.write(RESULTSET_PATH, JSON.generate({ "merged" => merged_payload })) + +puts "[merge_coverage] Merged #{suite_count > 0 ? suite_count : 1} suites into single entry" diff --git a/bin/linters/helpers/nplus1_analysis b/bin/linters/helpers/nplus1_analysis new file mode 100755 index 0000000..61113c1 --- /dev/null +++ b/bin/linters/helpers/nplus1_analysis @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +NPLUS1_MARKER="/tmp/nplus1_detected" +NPLUS1_REPORT="/tmp/nplus1_report.txt" + +if [ -f "$NPLUS1_MARKER" ]; then + n1_details="" + [ -f "$NPLUS1_REPORT" ] && n1_details=$(cat "$NPLUS1_REPORT") + printf "========================================\n❌ FAILED: N+1 queries detected\n%s\n\n" "$n1_details" + exit 1 +else + printf "✅ SUCCESS: No N+1 queries detected\n" + exit 0 +fi diff --git a/bin/linters/i18n-tasks b/bin/linters/i18n-tasks new file mode 100755 index 0000000..9ae0145 --- /dev/null +++ b/bin/linters/i18n-tasks @@ -0,0 +1,5 @@ +#!/bin/bash + +# Run i18n-tasks health which checks missing, unused, interpolations, and normalization +bundle exec i18n-tasks health +exit $? diff --git a/bin/linters/nplus1 b/bin/linters/nplus1 new file mode 100755 index 0000000..0c38c3c --- /dev/null +++ b/bin/linters/nplus1 @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +# N+1 query linter — runs ALL specs via parallel_rspec for speed. +# Uses SIMPLECOV_PREFIX so SimpleCov generates unique command names per worker +# (spec_helper.rb builds "nplus1-{TEST_ENV_NUMBER}"). +# +# Exit code reflects ONLY N+1 failures (via marker file), not other test failures. + +export NPLUS1_CHECK=1 +export SILENT_TESTS=${SILENT_TESTS:-1} +export RSPEC_RETRY_NUMBER=${RSPEC_RETRY_NUMBER:-3} +export COVERAGE_FORMAT=${COVERAGE_FORMAT:-json} +export SIMPLECOV_PREFIX="nplus1" + +NPLUS1_MARKER="/tmp/nplus1_detected" +NPLUS1_REPORT="/tmp/nplus1_report.txt" +rm -f "$NPLUS1_MARKER" "$NPLUS1_REPORT" +export NPLUS1_MARKER_FILE="$NPLUS1_MARKER" +export NPLUS1_REPORT_FILE="$NPLUS1_REPORT" + +NPLUS1_FORMATTER="--require ./spec/support/nplus1_formatter.rb --format progress --format Nplus1Formatter" + +printf "▶ nplus1: scanning all specs in parallel\n" +bundle exec parallel_rspec --serialize-stdout \ + --test-options "-f progress -f failures $NPLUS1_FORMATTER" \ + spec || true + +# Exit based on N+1 detection only, not other test failures +if [ -f "$NPLUS1_MARKER" ]; then + echo "❌ FAILED: N+1 queries detected" + [ -f "$NPLUS1_REPORT" ] && cat "$NPLUS1_REPORT" + exit 1 +fi + +echo "✅ SUCCESS: No N+1 queries detected" + +exit 0 diff --git a/bin/linters/prspec_fast b/bin/linters/prspec_fast new file mode 100755 index 0000000..0cafd10 --- /dev/null +++ b/bin/linters/prspec_fast @@ -0,0 +1,18 @@ +#!/bin/bash +start_time=$SECONDS +output=$(DISABLE_SPRING=1 ./bin/prspec --format=failures --tag=~integration --tag=~slow 2>&1) +exit_code=$? +elapsed=$(( SECONDS - start_time )) + +specs_count=$(echo "$output" | grep -oE '^[0-9]+ examples,' | tail -n 1 | grep -oE '[0-9]+') +specs_str="" +[ -n "$specs_count" ] && specs_str=" ($specs_count specs)" + +if [ "$exit_code" -ne 0 ]; then + filtered_output=$(echo "$output" | grep -vE '^(Coverage report|Randomized with seed|\[\{\"id\":)' | sed '/^$/N;/^\n$/D') + printf "========================================\n❌ FAILED: ./bin/prspec --format=failures --tag=~integration --tag=~slow 2>&1 (%ss)%s\n%s\n\n" "$elapsed" "$specs_str" "$filtered_output" + exit $exit_code +else + printf "✅ SUCCESS: ./bin/prspec --format=failures --tag=~integration --tag=~slow 2>&1 (%ss)%s\n" "$elapsed" "$specs_str" + exit 0 +fi diff --git a/bin/linters/prspec_long b/bin/linters/prspec_long new file mode 100755 index 0000000..25bae96 --- /dev/null +++ b/bin/linters/prspec_long @@ -0,0 +1,28 @@ +#!/bin/bash +export NPLUS1_MARKER_FILE="/tmp/nplus1_detected" +export NPLUS1_REPORT_FILE="/tmp/nplus1_report.txt" +export NPLUS1_CHECK=1 +export SPEC_OPTS="--require ./spec/support/nplus1_formatter.rb --format Nplus1Formatter" +export COVERAGE_FORMAT=json +export RSPEC_RETRY_NUMBER=${RSPEC_RETRY_NUMBER:-3} +export SIMPLECOV_PREFIX=nplus1 + +rm -f "$NPLUS1_MARKER_FILE" "$NPLUS1_REPORT_FILE" + +start_time=$SECONDS +output=$(DISABLE_SPRING=1 ./bin/prspec --format=failures --tag=~integration 2>&1) +exit_code=$? +elapsed=$(( SECONDS - start_time )) + +specs_count=$(echo "$output" | grep -oE '^[0-9]+ examples,' | tail -n 1 | grep -oE '[0-9]+') +specs_str="" +[ -n "$specs_count" ] && specs_str=" ($specs_count specs)" + +if [ "$exit_code" -ne 0 ]; then + filtered_output=$(echo "$output" | grep -vE '^(JSON Coverage report|Randomized with seed|\{"id":|Run options: exclude|[0-9]+ / [0-9]+ LOC|\s*$)' || true) + printf "========================================\n❌ FAILED: ./bin/prspec --format=failures --tag=~integration 2>&1 (%ss)%s\n%s\n\n" "$elapsed" "$specs_str" "$filtered_output" + exit $exit_code +else + printf "✅ SUCCESS: ./bin/prspec --format=failures --tag=~integration 2>&1 (%ss)%s\n" "$elapsed" "$specs_str" + exit 0 +fi diff --git a/bin/linters/reek b/bin/linters/reek new file mode 100755 index 0000000..952b0d5 --- /dev/null +++ b/bin/linters/reek @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "rubygems" +require "bundler/setup" + +ARGV.unshift("--config", File.expand_path("../../.reek.yml", __dir__)) +ARGV.push("app", "lib") unless ARGV.any? { |a| !a.start_with?("-") } + +load Gem.bin_path("reek", "reek") diff --git a/bin/linters/rspec b/bin/linters/rspec new file mode 100755 index 0000000..64c66fc --- /dev/null +++ b/bin/linters/rspec @@ -0,0 +1,2 @@ +#!/bin/bash +exec ./bin/prspec "$@" diff --git a/bin/linters/rubocop b/bin/linters/rubocop new file mode 100755 index 0000000..cb75390 --- /dev/null +++ b/bin/linters/rubocop @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "rubygems" +require "bundler/setup" + +# Explicit RuboCop config increases performance slightly while avoiding config confusion. +ARGV.unshift("--config", File.expand_path("../../.rubocop.yml", __dir__)) + +load Gem.bin_path("rubocop", "rubocop") diff --git a/bin/linters/skunk b/bin/linters/skunk new file mode 100755 index 0000000..cc97762 --- /dev/null +++ b/bin/linters/skunk @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +MAX_AVERAGE_SCORE=${MAX_SKUNK_AVG_SCORE:-600} +MAX_FILE_SCORE=${MAX_SKUNK_FILE_SCORE:-1500} + +OUTPUT=$(if [ $# -eq 0 ]; then bundle exec skunk app lib 2>&1; else bundle exec skunk "$@" 2>&1; fi) +EXIT_CODE=$? +echo "$OUTPUT" + +if [ $EXIT_CODE -ne 0 ]; then + exit $EXIT_CODE +fi + +AVERAGE=$(echo "$OUTPUT" | grep "SkunkScore Average:" | sed 's/.*Average: *//' | awk '{print $1}') +WORST_LINE=$(echo "$OUTPUT" | grep "Worst SkunkScore:") +WORST=$(echo "$WORST_LINE" | sed 's/.*SkunkScore: *//' | awk '{print $1}') + +if [ -z "$AVERAGE" ] || [ -z "$WORST" ]; then + echo "⚠️ Could not parse SkunkScore values" + exit 1 +fi + +FAILED=0 + +if awk "BEGIN {exit !($AVERAGE > $MAX_AVERAGE_SCORE)}"; then + echo "❌ SkunkScore Average ($AVERAGE) exceeds threshold ($MAX_AVERAGE_SCORE)" + FAILED=1 +fi + +if awk "BEGIN {exit !($WORST > $MAX_FILE_SCORE)}"; then + echo "❌ Worst SkunkScore ($WORST) exceeds threshold ($MAX_FILE_SCORE)" + FAILED=1 +fi + +if [ $FAILED -eq 0 ]; then + echo "✅ SkunkScore within thresholds (avg: $AVERAGE <= $MAX_AVERAGE_SCORE, worst: $WORST <= $MAX_FILE_SCORE)" +fi + +exit $FAILED diff --git a/bin/prspec b/bin/prspec new file mode 100755 index 0000000..bd5c796 --- /dev/null +++ b/bin/prspec @@ -0,0 +1,23 @@ +#!/bin/bash + +export SILENT_TESTS=${SILENT_TESTS:-} + +OPTS="" +FILES="" +for arg in "$@"; do + if [[ "$arg" == -* ]]; then + OPTS="$OPTS $arg" + else + FILES="$FILES $arg" + fi +done + +# Default to spec directory if no files specified +if [ -z "$FILES" ]; then + FILES="spec" +fi + +echo "Running Parallel RSpec with options: $OPTS" + +# FORMATTER="${FORMATTER:--f progress -f failures}" +bundle exec parallel_rspec --serialize-stdout --test-options "$FORMATTER$OPTS" $FILES diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000..efc0377 --- /dev/null +++ b/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path("../config/application", __dir__) +require_relative "../config/boot" +require "rails/commands" diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000..4fbf10b --- /dev/null +++ b/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "rake" +Rake.application.run diff --git a/bin/rubocop b/bin/rubocop new file mode 100755 index 0000000..5a20504 --- /dev/null +++ b/bin/rubocop @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby +require "rubygems" +require "bundler/setup" + +# Explicit RuboCop config increases performance slightly while avoiding config confusion. +ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__)) + +load Gem.bin_path("rubocop", "rubocop") diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000..362b408 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require "fileutils" + +APP_ROOT = File.expand_path("..", __dir__) + +def system!(*args) + system(*args, exception: true) +end + +FileUtils.chdir APP_ROOT do + # This script is a way to set up or update your development environment automatically. + # This script is idempotent, so that you can run it at any time and get an expectable outcome. + # Add necessary setup steps to this file. + + puts "== Installing dependencies ==" + system("bundle check") || system!("bundle install") + + # puts "\n== Copying sample files ==" + # unless File.exist?("config/database.yml") + # FileUtils.cp "config/database.yml.sample", "config/database.yml" + # end + + puts "\n== Preparing database ==" + system! "bin/rails db:prepare" + system! "bin/rails db:reset" if ARGV.include?("--reset") + system! "bin/rails parallel:prepare" if ENV["RAILS_ENV"] == "test" || ARGV.include?("--prepare-test") + + puts "\n== Removing old logs and tempfiles ==" + system! "bin/rails log:clear tmp:clear" + + unless ARGV.include?("--skip-server") + puts "\n== Starting development server ==" + STDOUT.flush # flush the output before exec(2) so that it displays + exec "bin/dev" + end +end diff --git a/bin/thrust b/bin/thrust new file mode 100755 index 0000000..36bde2d --- /dev/null +++ b/bin/thrust @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("thruster", "thrust") diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..2e03084 --- /dev/null +++ b/config.ru @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +# This file is used by Rack-based servers to start the application. + +require_relative "config/environment" + +run Rails.application +Rails.application.load_server diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000..415939e --- /dev/null +++ b/config/application.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require_relative "boot" + +require "rails" +# Pick the frameworks you want: +require "active_model/railtie" +require "active_job/railtie" +require "active_record/railtie" +require "active_storage/engine" +require "action_controller/railtie" +# require "action_mailer/railtie" +# require "action_mailbox/engine" +# require "action_text/engine" +require "action_view/railtie" +require "action_cable/engine" +# require "rails/test_unit/railtie" + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Starter + class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults(8.1) + + config.i18n.available_locales = [:en, :uk] + config.i18n.default_locale = :en + + # Please, add to the `ignore` list any other `lib` subdirectories that do + # not contain `.rb` files, or that should not be reloaded or eager loaded. + # Common ones are `templates`, `generators`, or `middleware`, for example. + config.autoload_lib(ignore: ["assets", "tasks"]) + + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + # config.time_zone = "Central Time (US & Canada)" + # config.eager_load_paths << Rails.root.join("extras") + + # Don't generate system test files. + config.generators.system_tests = nil + config.active_job.queue_adapter = :sidekiq + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000..aef6d03 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "bundler/setup" # Set up gems listed in the Gemfile. +require "bootsnap/setup" # Speed up boot time by caching expensive operations. diff --git a/config/bundler-audit.yml b/config/bundler-audit.yml new file mode 100644 index 0000000..e74b3af --- /dev/null +++ b/config/bundler-audit.yml @@ -0,0 +1,5 @@ +# Audit all gems listed in the Gemfile for known security problems by running bin/bundler-audit. +# CVEs that are not relevant to the application can be enumerated on the ignore list below. + +ignore: + - CVE-THAT-DOES-NOT-APPLY diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000..aa7da64 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,8 @@ +development: + adapter: anycable + +test: + adapter: test + +production: + adapter: anycable diff --git a/config/cache.yml b/config/cache.yml new file mode 100644 index 0000000..11be5b4 --- /dev/null +++ b/config/cache.yml @@ -0,0 +1,11 @@ +development: + redis: + url: <%= ENV.fetch("REDIS_URL", "redis://localhost:6379/1") %> + +test: + redis: + url: <%= ENV.fetch("REDIS_URL", "redis://localhost:6379/1") %> + +production: + redis: + url: <%= ENV.fetch("REDIS_URL", "redis://localhost:6379/1") %> diff --git a/config/ci.rb b/config/ci.rb new file mode 100644 index 0000000..6aca6b5 --- /dev/null +++ b/config/ci.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +# Run using bin/ci + +CI.run do + step "Setup", "bin/setup --skip-server" + + step "Style: Ruby", "bin/rubocop" + + step "Security: Gem audit", "bin/bundler-audit" + step "Security: Importmap vulnerability audit", "bin/importmap audit" + step "Security: Brakeman code analysis", "bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error" + + # Optional: set a green GitHub commit status to unblock PR merge. + # Requires the `gh` CLI and `gh extension install basecamp/gh-signoff`. + # if success? + # step "Signoff: All systems go. Ready for merge and deploy.", "gh signoff" + # else + # failure "Signoff: CI failed. Do not merge or deploy.", "Fix the issues and try again." + # end +end diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000..35edea0 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,31 @@ +default: &default + adapter: postgresql + encoding: unicode + prepared_statements: false + advisory_locks: false + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + host: "<%= ENV.fetch('DB_HOST', 'localhost') %>" + port: "<%= ENV.fetch('DB_PORT', '5432') %>" + username: "<%= ENV.fetch('DB_USER', 'postgres') %>" + password: "<%= ENV.fetch('DB_PASS', 'password') %>" + gssencmode: disable + connect_timeout: 5 + checkout_timeout: 5 + reaping_frequency: 10 + +development: + primary: + <<: *default + database: "<%= ENV.fetch('DB_NAME', 'starter') %>_development" + +test: + primary: + <<: *default + database: "<%= ENV.fetch('DB_NAME', 'starter') %>_test<%= ENV['TEST_ENV_NUMBER'] %>" + +production: + primary: + <<: *default + host: <%= ENV.fetch("DB_PRIMARY_HOST") { ENV.fetch("DB_HOST", "localhost") } %> + port: <%= ENV.fetch("DB_PRIMARY_PORT") { ENV.fetch("DB_PORT", "5432") } %> + database: <%= ENV.fetch("DB_NAME", "starter") %>_production diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000..7df99e8 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +# Load the Rails application. +require_relative "application" + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000..5436d45 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require "active_support/core_ext/integer/time" + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Make code changes take effect immediately without server restart. + config.enable_reloading = true + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable server timing. + config.server_timing = true + + # Enable/disable Action Controller caching. By default Action Controller caching is disabled. + # Run rails dev:cache to toggle Action Controller caching. + if Rails.root.join("tmp/caching-dev.txt").exist? + config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true + config.public_file_server.headers = { "cache-control" => "public, max-age=#{2.days.to_i}" } + else + config.action_controller.perform_caching = false + end + + # Change to :null_store to avoid any caching. + config.cache_store = :memory_store + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Append comments with runtime information tags to SQL queries in logs. + config.active_record.query_log_tags_enabled = true + + # Highlight code that enqueued background job in logs. + config.active_job.verbose_enqueue_logs = true + + # Highlight code that triggered redirect in logs. + config.action_dispatch.verbose_redirect_logs = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + config.action_view.annotate_rendered_view_with_filenames = true + + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true + + # Raise error when a before_action's only/except options reference missing actions. + config.action_controller.raise_on_missing_callback_actions = true + + config.hosts.clear + + # Apply autocorrection by RuboCop to files generated by `bin/rails generate`. + # config.generators.apply_rubocop_autocorrect_after_generate! +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000..ae2cfa8 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +require "active_support/core_ext/integer/time" + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.enable_reloading = false + + # Eager load code on boot for better performance and memory savings (ignored by Rake tasks). + config.eager_load = true + + # Full error reports are disabled. + config.consider_all_requests_local = false + + # Turn on fragment caching in view templates. + config.action_controller.perform_caching = true + + # Cache assets for far-future expiry since they are all digest stamped. + config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" } + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.asset_host = "http://assets.example.com" + + # Assume all access to the app is happening through a SSL-terminating reverse proxy. + # config.assume_ssl = true + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Skip http-to-https redirect for the default health check endpoint. + # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } } + + # Log to STDOUT with the current request id as a default log tag. + config.log_tags = [:request_id] + config.logger = ActiveSupport::TaggedLogging.logger($stdout) + + # Change to "debug" to log everything (including potentially personally-identifiable information!). + config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") + + # Prevent health checks from clogging up the logs. + config.silence_healthcheck_path = "/up" + + # Don't log any deprecations. + config.active_support.report_deprecations = false + + # Replace the default in-process memory cache store with a durable alternative. + config.cache_store = :solid_cache_store + + # Replace the default in-process and non-durable queuing backend for Active Job. + config.active_job.queue_adapter = :solid_queue + config.solid_queue.connects_to = { database: { writing: :queue } } + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false + + # Only use :id for inspections in production. + config.active_record.attributes_for_inspect = [:id] + + # Enable DNS rebinding protection and other `Host` header attacks. + # config.hosts = [ + # "example.com", # Allow requests from example.com + # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` + # ] + # + # Skip DNS rebinding protection for the default health check endpoint. + # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000..cecb83d --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # While tests run files are not watched, reloading is not necessary. + config.enable_reloading = false + + # Eager loading loads your entire application. When running a single test locally, + # this is usually not necessary, and can slow down your test suite. However, it's + # recommended that you enable it in continuous integration systems to ensure eager + # loading is working properly before deploying your code. + config.eager_load = ENV["CI"].present? + + # Configure public file server for tests with cache-control for performance. + config.public_file_server.headers = { "cache-control" => "public, max-age=3600" } + + # Show full error reports. + config.consider_all_requests_local = true + config.cache_store = :null_store + + # Render exception templates for rescuable exceptions and raise for other exceptions. + config.action_dispatch.show_exceptions = :rescuable + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true + + # Raise error when a before_action's only/except options reference missing actions. + config.action_controller.raise_on_missing_callback_actions = true +end diff --git a/config/importmap.rb b/config/importmap.rb new file mode 100644 index 0000000..29c073c --- /dev/null +++ b/config/importmap.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +# Pin npm packages by running ./bin/importmap + +pin "application" +pin "three", to: "https://ga.jspm.io/npm:three@0.183.2/build/three.module.js" +pin "@hotwired/stimulus", to: "stimulus.min.js" +pin "@hotwired/stimulus-loading", to: "stimulus-loading.js" +pin_all_from "app/javascript/controllers", under: "controllers" diff --git a/config/initializers/app_creds.rb b/config/initializers/app_creds.rb new file mode 100644 index 0000000..1cc32fe --- /dev/null +++ b/config/initializers/app_creds.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +# Polyfill for Rails 8.2 CombinedCredentials and Rails.app alias +unless Rails.respond_to?(:app) + Rails.singleton_class.alias_method(:app, :application) +end + +module CombinedCredentialsPolyfill + class CombinedCreds + def require(*keys) + env_key = keys.join("__").upcase + return ENV.fetch(env_key) if ENV.key?(env_key) + + val = Rails.application.credentials.dig(*keys) + raise KeyError, "Key not found: #{keys.join(".")}" if val.nil? + + val + end + + def option(*keys, default: nil) + env_key = keys.join("__").upcase + return ENV.fetch(env_key) if ENV.key?(env_key) + + val = Rails.application.credentials.dig(*keys) + return val unless val.nil? + + default.respond_to?(:call) ? default.call : default + end + end + + def creds + @creds ||= CombinedCreds.new + end +end + +Rails::Application.include(CombinedCredentialsPolyfill) unless Rails::Application.method_defined?(:creds) diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000..8544c07 --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = "1.0" + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000..74b18c5 --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy. +# See the Securing Rails Applications Guide for more information: +# https://guides.rubyonrails.org/security.html#content-security-policy-header + +# Rails.application.configure do +# config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end +# +# # Generate session nonces for permitted importmap, inline scripts, and inline styles. +# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } +# config.content_security_policy_nonce_directives = %w(script-src style-src) +# +# # Automatically add `nonce` to `javascript_tag`, `javascript_include_tag`, and `stylesheet_link_tag` +# # if the corresponding directives are specified in `content_security_policy_nonce_directives`. +# # config.content_security_policy_nonce_auto = true +# +# # Report violations without enforcing the policy. +# # config.content_security_policy_report_only = true +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000..7806a40 --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +# Be sure to restart your server when you modify this file. + +# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. +# Use this to limit dissemination of sensitive information. +# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. +Rails.application.config.filter_parameters += [ + :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc, +] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000..9e049dc --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, "\\1en" +# inflect.singular /^(ox)en/i, "\\1" +# inflect.irregular "person", "people" +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym "RESTful" +# end diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb new file mode 100644 index 0000000..ab1860a --- /dev/null +++ b/config/initializers/rack_attack.rb @@ -0,0 +1,54 @@ +# typed: false +# frozen_string_literal: true + +# Rack::Attack configuration for rate limiting. +# Uses Redis as shared store (important since web containers scale to 3 replicas). + +# ── Store ──────────────────────────────────────────────────────── +redis_url = ENV.fetch("REDIS_URL", "redis://localhost:6379/1") +Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(url: redis_url) + +# Disable in test/e2e unless explicitly enabled +unless ENV["ENABLE_RACK_ATTACK"] == "1" + Rack::Attack.enabled = false if Rails.env.test? || Rails.env.e2e? +end + +# ── Defaults ───────────────────────────────────────────────────── +DEFAULT_UI_RPH = ENV.fetch("RACK_ATTACK_UI_RPH", 5000).to_i +DEFAULT_API_RPH = ENV.fetch("RACK_ATTACK_API_RPH", 5000).to_i + +# ── Safelist ───────────────────────────────────────────────────── + +Rack::Attack.safelist("health-check") do |req| + req.path == "/up" +end + +# ── Throttle: UI (by IP) ───────────────────────────────────────── + +Rack::Attack.throttle("ui/ip", limit: DEFAULT_UI_RPH, period: 3600) do |req| + next if req.path.start_with?("/api/", "/api") + + req.ip +end + +# ── Throttle: API (by IP) ──────────────────────────────────────── + +Rack::Attack.throttle("api/ip", limit: DEFAULT_API_RPH, period: 3600) do |req| + next unless req.path.start_with?("/api/") + + req.ip +end + +# ── Throttled Response ─────────────────────────────────────────── + +Rack::Attack.throttled_responder = lambda { |req| + matched = req.env["rack.attack.match_data"] || {} + retry_after = (matched[:period] || 60) - (matched[:epoch_time] % (matched[:period] || 60)) + + headers = { + "Content-Type" => "application/json", + "Retry-After" => retry_after.to_s, + } + body = { error: { code: "RATE_LIMITED", message: "Rate limit exceeded. Retry after #{retry_after} seconds." } }.to_json + [429, headers, [body]] +} diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb new file mode 100644 index 0000000..fb9a29f --- /dev/null +++ b/config/initializers/sidekiq.rb @@ -0,0 +1,37 @@ +# typed: false +# frozen_string_literal: true + +require "sidekiq" +require "sidekiq-cron" + +redis_url = ENV.fetch("REDIS_URL", "redis://localhost:6379/1") +redis_config = { url: redis_url } +redis_config[:ssl_params] = { verify_mode: OpenSSL::SSL::VERIFY_NONE } if redis_url.start_with?("rediss://") + +Sidekiq.configure_server do |config| + config.redis = redis_config + config.logger.level = Logger::WARN if Rails.env.e2e? + + schedule_file = "config/recurring.yml" + + if File.exist?(schedule_file) + schedule = YAML.load_file(schedule_file, aliases: true)[Rails.env] + if schedule + # Map Solid Queue's "schedule" key to "cron" for sidekiq-cron (which uses Fugit internally) + cron_hash = schedule.transform_values do |job| + { + "cron" => job["schedule"], + "class" => job["class"], + "queue" => job["queue"] || "default", + "active_job" => true, + } + end + Sidekiq::Cron::Job.load_from_hash(cron_hash) + end + end +end + +Sidekiq.configure_client do |config| + config.redis = redis_config + config.logger.level = Logger::WARN if Rails.env.e2e? +end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000..6c349ae --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,31 @@ +# Files in the config/locales directory are used for internationalization and +# are automatically loaded by Rails. If you want to use locales other than +# English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t "hello" +# +# In views, this is aliased to just `t`: +# +# <%= t("hello") %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more about the API, please read the Rails Internationalization guide +# at https://guides.rubyonrails.org/i18n.html. +# +# Be aware that YAML interprets the following case-insensitive strings as +# booleans: `true`, `false`, `on`, `off`, `yes`, `no`. Therefore, these strings +# must be quoted to be interpreted as strings. For example: +# +# en: +# "yes": yup +# enabled: "ON" + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000..284ca2f --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +# This configuration file will be evaluated by Puma. The top-level methods that +# are invoked here are part of Puma's configuration DSL. For more information +# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html. +# +# Puma starts a configurable number of processes (workers) and each process +# serves each request in a thread from an internal thread pool. +# +# You can control the number of workers using ENV["WEB_CONCURRENCY"]. You +# should only set this value when you want to run 2 or more workers. The +# default is already 1. You can set it to `auto` to automatically start a worker +# for each available processor. +# +# The ideal number of threads per worker depends both on how much time the +# application spends waiting for IO operations and on how much you wish to +# prioritize throughput over latency. +# +# As a rule of thumb, increasing the number of threads will increase how much +# traffic a given process can handle (throughput), but due to CRuby's +# Global VM Lock (GVL) it has diminishing returns and will degrade the +# response time (latency) of the application. +# +# The default is set to 3 threads as it's deemed a decent compromise between +# throughput and latency for the average Rails application. +# +# Any libraries that use a connection pool or another resource pool should +# be configured to provide at least as many connections as the number of +# threads. This includes Active Record's `pool` parameter in `database.yml`. +threads_count = ENV.fetch("RAILS_MAX_THREADS", 3) +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +port ENV.fetch("PORT", 3000) + +# Allow puma to be restarted by `bin/rails restart` command. +plugin :tmp_restart + +# Run the Solid Queue supervisor inside of Puma for single-server deployments. +plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] + +# Specify the PID file. Defaults to tmp/pids/server.pid in development. +# In other environments, only set the PID file if requested. +pidfile ENV["PIDFILE"] if ENV["PIDFILE"] diff --git a/config/recurring.yml b/config/recurring.yml new file mode 100644 index 0000000..bad66b5 --- /dev/null +++ b/config/recurring.yml @@ -0,0 +1,17 @@ +development: + example_recurring_job: + class: ExampleRecurringJob + schedule: every 5 minutes + queue: default + clear_solid_queue_finished_jobs: + command: "SolidQueue::Job.clear_finished_in_batches(sleep_between_batches: 0.1)" + schedule: every 10 minutes + +production: + example_recurring_job: + class: ExampleRecurringJob + schedule: every hour + queue: default + clear_solid_queue_finished_jobs: + command: "SolidQueue::Job.clear_finished_in_batches(sleep_between_batches: 0.3)" + schedule: every hour at minute 12 diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..d011670 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +Rails.application.routes.draw do + get "up" => "rails/health#show", as: :rails_health_check + + # Render dynamic PWA files from app/views/pwa/* + get "manifest" => "rails/pwa#manifest", as: :pwa_manifest + get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker + + resources :todos, only: [:index, :create, :edit, :update, :destroy] do + member do + patch :toggle + end + end + + root "todos#index" +end diff --git a/db/cable_schema.rb b/db/cable_schema.rb new file mode 100644 index 0000000..2366660 --- /dev/null +++ b/db/cable_schema.rb @@ -0,0 +1,11 @@ +ActiveRecord::Schema[7.1].define(version: 1) do + create_table "solid_cable_messages", force: :cascade do |t| + t.binary "channel", limit: 1024, null: false + t.binary "payload", limit: 536870912, null: false + t.datetime "created_at", null: false + t.integer "channel_hash", limit: 8, null: false + t.index ["channel"], name: "index_solid_cable_messages_on_channel" + t.index ["channel_hash"], name: "index_solid_cable_messages_on_channel_hash" + t.index ["created_at"], name: "index_solid_cable_messages_on_created_at" + end +end diff --git a/db/cache_schema.rb b/db/cache_schema.rb new file mode 100644 index 0000000..81a410d --- /dev/null +++ b/db/cache_schema.rb @@ -0,0 +1,12 @@ +ActiveRecord::Schema[7.2].define(version: 1) do + create_table "solid_cache_entries", force: :cascade do |t| + t.binary "key", limit: 1024, null: false + t.binary "value", limit: 536870912, null: false + t.datetime "created_at", null: false + t.integer "key_hash", limit: 8, null: false + t.integer "byte_size", limit: 4, null: false + t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size" + t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size" + t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true + end +end diff --git a/db/migrate/20260316000001_create_todos.rb b/db/migrate/20260316000001_create_todos.rb new file mode 100644 index 0000000..a1222dc --- /dev/null +++ b/db/migrate/20260316000001_create_todos.rb @@ -0,0 +1,10 @@ +class CreateTodos < ActiveRecord::Migration[8.1] + def change + create_table :todos do |t| + t.string :title, null: false + t.boolean :completed, null: false, default: false + + t.timestamps + end + end +end diff --git a/db/queue_schema.rb b/db/queue_schema.rb new file mode 100644 index 0000000..85194b6 --- /dev/null +++ b/db/queue_schema.rb @@ -0,0 +1,129 @@ +ActiveRecord::Schema[7.1].define(version: 1) do + create_table "solid_queue_blocked_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.string "concurrency_key", null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.index [ "concurrency_key", "priority", "job_id" ], name: "index_solid_queue_blocked_executions_for_release" + t.index [ "expires_at", "concurrency_key" ], name: "index_solid_queue_blocked_executions_for_maintenance" + t.index [ "job_id" ], name: "index_solid_queue_blocked_executions_on_job_id", unique: true + end + + create_table "solid_queue_claimed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.bigint "process_id" + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_claimed_executions_on_job_id", unique: true + t.index [ "process_id", "job_id" ], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" + end + + create_table "solid_queue_failed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.text "error" + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_failed_executions_on_job_id", unique: true + end + + create_table "solid_queue_jobs", force: :cascade do |t| + t.string "queue_name", null: false + t.string "class_name", null: false + t.text "arguments" + t.integer "priority", default: 0, null: false + t.string "active_job_id" + t.datetime "scheduled_at" + t.datetime "finished_at" + t.string "concurrency_key" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "active_job_id" ], name: "index_solid_queue_jobs_on_active_job_id" + t.index [ "class_name" ], name: "index_solid_queue_jobs_on_class_name" + t.index [ "finished_at" ], name: "index_solid_queue_jobs_on_finished_at" + t.index [ "queue_name", "finished_at" ], name: "index_solid_queue_jobs_for_filtering" + t.index [ "scheduled_at", "finished_at" ], name: "index_solid_queue_jobs_for_alerting" + end + + create_table "solid_queue_pauses", force: :cascade do |t| + t.string "queue_name", null: false + t.datetime "created_at", null: false + t.index [ "queue_name" ], name: "index_solid_queue_pauses_on_queue_name", unique: true + end + + create_table "solid_queue_processes", force: :cascade do |t| + t.string "kind", null: false + t.datetime "last_heartbeat_at", null: false + t.bigint "supervisor_id" + t.integer "pid", null: false + t.string "hostname" + t.text "metadata" + t.datetime "created_at", null: false + t.string "name", null: false + t.index [ "last_heartbeat_at" ], name: "index_solid_queue_processes_on_last_heartbeat_at" + t.index [ "name", "supervisor_id" ], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true + t.index [ "supervisor_id" ], name: "index_solid_queue_processes_on_supervisor_id" + end + + create_table "solid_queue_ready_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_ready_executions_on_job_id", unique: true + t.index [ "priority", "job_id" ], name: "index_solid_queue_poll_all" + t.index [ "queue_name", "priority", "job_id" ], name: "index_solid_queue_poll_by_queue" + end + + create_table "solid_queue_recurring_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "task_key", null: false + t.datetime "run_at", null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_recurring_executions_on_job_id", unique: true + t.index [ "task_key", "run_at" ], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true + end + + create_table "solid_queue_recurring_tasks", force: :cascade do |t| + t.string "key", null: false + t.string "schedule", null: false + t.string "command", limit: 2048 + t.string "class_name" + t.text "arguments" + t.string "queue_name" + t.integer "priority", default: 0 + t.boolean "static", default: true, null: false + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "key" ], name: "index_solid_queue_recurring_tasks_on_key", unique: true + t.index [ "static" ], name: "index_solid_queue_recurring_tasks_on_static" + end + + create_table "solid_queue_scheduled_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "scheduled_at", null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true + t.index [ "scheduled_at", "priority", "job_id" ], name: "index_solid_queue_dispatch_all" + end + + create_table "solid_queue_semaphores", force: :cascade do |t| + t.string "key", null: false + t.integer "value", default: 1, null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "expires_at" ], name: "index_solid_queue_semaphores_on_expires_at" + t.index [ "key", "value" ], name: "index_solid_queue_semaphores_on_key_and_value" + t.index [ "key" ], name: "index_solid_queue_semaphores_on_key", unique: true + end + + add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000..7a8109b --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,172 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema[8.2].define(version: 2026_03_16_000001) do + # These are extensions that must be enabled in order to support this database + enable_extension "pg_catalog.plpgsql" + + create_table "solid_cable_messages", force: :cascade do |t| + t.binary "channel", null: false + t.bigint "channel_hash", null: false + t.datetime "created_at", null: false + t.binary "payload", null: false + t.index ["channel"], name: "index_solid_cable_messages_on_channel" + t.index ["channel_hash"], name: "index_solid_cable_messages_on_channel_hash" + t.index ["created_at"], name: "index_solid_cable_messages_on_created_at" + end + + create_table "solid_cache_entries", force: :cascade do |t| + t.integer "byte_size", null: false + t.datetime "created_at", null: false + t.binary "key", null: false + t.bigint "key_hash", null: false + t.binary "value", null: false + t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size" + t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size" + t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true + end + + create_table "solid_queue_blocked_executions", force: :cascade do |t| + t.string "concurrency_key", null: false + t.datetime "created_at", null: false + t.datetime "expires_at", null: false + t.bigint "job_id", null: false + t.integer "priority", default: 0, null: false + t.string "queue_name", null: false + t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release" + t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance" + t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true + end + + create_table "solid_queue_claimed_executions", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "job_id", null: false + t.bigint "process_id" + t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true + t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" + end + + create_table "solid_queue_failed_executions", force: :cascade do |t| + t.datetime "created_at", null: false + t.text "error" + t.bigint "job_id", null: false + t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true + end + + create_table "solid_queue_jobs", force: :cascade do |t| + t.string "active_job_id" + t.text "arguments" + t.string "class_name", null: false + t.string "concurrency_key" + t.datetime "created_at", null: false + t.datetime "finished_at" + t.integer "priority", default: 0, null: false + t.string "queue_name", null: false + t.datetime "scheduled_at" + t.datetime "updated_at", null: false + t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id" + t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name" + t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at" + t.index ["queue_name", "finished_at"], name: "index_solid_queue_jobs_for_filtering" + t.index ["scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting" + end + + create_table "solid_queue_pauses", force: :cascade do |t| + t.datetime "created_at", null: false + t.string "queue_name", null: false + t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true + end + + create_table "solid_queue_processes", force: :cascade do |t| + t.datetime "created_at", null: false + t.string "hostname" + t.string "kind", null: false + t.datetime "last_heartbeat_at", null: false + t.text "metadata" + t.string "name", null: false + t.integer "pid", null: false + t.bigint "supervisor_id" + t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at" + t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true + t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id" + end + + create_table "solid_queue_ready_executions", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "job_id", null: false + t.integer "priority", default: 0, null: false + t.string "queue_name", null: false + t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true + t.index ["priority", "job_id"], name: "index_solid_queue_poll_all" + t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue" + end + + create_table "solid_queue_recurring_executions", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "job_id", null: false + t.datetime "run_at", null: false + t.string "task_key", null: false + t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true + t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true + end + + create_table "solid_queue_recurring_tasks", force: :cascade do |t| + t.text "arguments" + t.string "class_name" + t.string "command", limit: 2048 + t.datetime "created_at", null: false + t.text "description" + t.string "key", null: false + t.integer "priority", default: 0 + t.string "queue_name" + t.string "schedule", null: false + t.boolean "static", default: true, null: false + t.datetime "updated_at", null: false + t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true + t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static" + end + + create_table "solid_queue_scheduled_executions", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "job_id", null: false + t.integer "priority", default: 0, null: false + t.string "queue_name", null: false + t.datetime "scheduled_at", null: false + t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true + t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all" + end + + create_table "solid_queue_semaphores", force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "expires_at", null: false + t.string "key", null: false + t.datetime "updated_at", null: false + t.integer "value", default: 1, null: false + t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at" + t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value" + t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true + end + + create_table "todos", force: :cascade do |t| + t.boolean "completed", default: false, null: false + t.datetime "created_at", null: false + t.string "title", null: false + t.datetime "updated_at", null: false + end + + add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade +end diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000..20cd5c7 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,17 @@ +# This file should ensure the existence of records required to run the application in every environment (production, +# development, test). The code here should be idempotent so that it can be executed at any point in every environment. +# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup). +# +# Example: +# +# ["Action", "Comedy", "Drama", "Horror"].each do |genre_name| +# MovieGenre.find_or_create_by!(name: genre_name) +# end + +if Todo.count.zero? + Todo.create!( + title: "Play around with Rails 8, Hotwire, and Docker!", + completed: false + ) + puts "Seeded a sample Todo for your fresh database." +end diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4a3485e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,227 @@ +x-fibe.gg: + variables: + rails_master_key: + name: "Rails master key" + required: false + pgpassword: + name: "Postgres password" + required: true + subdomain: + name: "Subdomain" + required: true + default: "starter" + branch: + name: "Branch" + required: true + default: "main" + +services: + postgres: + image: postgres:17.5 + shm_size: 1gb + deploy: + resources: + limits: + cpus: '2' + memory: 4G + command: postgres -c config_file=/etc/postgresql/postgresql.conf + configs: + - source: postgres_config + target: /etc/postgresql/postgresql.conf + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: $$random__pgpassword + POSTGRES_DB: starter_development + POSTGRES_HOST_AUTH_METHOD: trust + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U postgres -d starter_development" ] + interval: 5s + timeout: 5s + retries: 5 + restart: unless-stopped + + pgbouncer: + image: edoburu/pgbouncer:latest + environment: + DB_HOST: postgres + DB_PORT: 5432 + DB_USER: postgres + DB_PASSWORD: $$random__pgpassword + POOL_MODE: transaction + ADMIN_USERS: postgres + AUTH_TYPE: scram-sha-256 + IGNORE_STARTUP_PARAMETERS: extra_float_digits + depends_on: + postgres: + condition: service_healthy + + localstack: + image: localstack/localstack:4.13.1 + environment: + - SERVICES=s3 + - DEBUG=0 + volumes: + - "localstack_data:/var/lib/localstack" + ports: + - "4566:4566" + + redis: + image: redis:8.4-alpine + restart: unless-stopped + volumes: + - redis_data:/data + ports: + - "6379:6379" + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 5s + timeout: 5s + retries: 5 + + ws: + image: anycable/anycable-go:1.6 + environment: + ANYCABLE_HOST: 0.0.0.0 + ANYCABLE_PORT: 8081 + ANYCABLE_DEBUG: 0 + ANYCABLE_RPC_HOST: http://app:3000/_anycable + ANYCABLE_BROADCAST_ADAPTER: redis + REDIS_URL: redis://redis:6379/1 + ANYCABLE_DISABLE_TELEMETRY: true + depends_on: + redis: + condition: service_healthy + ports: + - "8081:8081" + + setup: + image: rails-8-starter-kit-dev + build: + context: . + dockerfile: Dockerfile.dev + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + localstack: + condition: service_started + pgbouncer: + condition: service_started + volumes: + - .:/rails + - storage:/rails/storage + - /rails/tmp/cache + command: bin/setup --skip-server + environment: + RAILS_ENV: development + RAILS_MASTER_KEY: $$var__rails_master_key + DB_PASS: $$random__pgpassword + DB_HOST: postgres + DB_DIRECT_HOST: postgres + DB_DIRECT_PORT: "5432" + REDIS_URL: redis://redis:6379/1 + + tests: + image: rails-8-starter-kit-dev + build: + context: . + dockerfile: Dockerfile.dev + depends_on: + setup: + condition: service_completed_successfully + postgres: + condition: service_healthy + redis: + condition: service_healthy + localstack: + condition: service_started + pgbouncer: + condition: service_started + volumes: + - .:/rails + - storage:/rails/storage + - /rails/tmp/cache + command: bash -c "bin/setup --skip-server && bin/check-fast" + environment: + RAILS_ENV: test + RAILS_MASTER_KEY: $$var__rails_master_key + DB_PASS: $$random__pgpassword + DB_HOST: postgres + DB_DIRECT_HOST: postgres + DB_DIRECT_PORT: "5432" + REDIS_URL: redis://redis:6379/1 + + app: + image: rails-8-starter-kit-dev + build: + context: . + dockerfile: Dockerfile.dev + depends_on: + tests: + condition: service_completed_successfully + postgres: + condition: service_healthy + redis: + condition: service_healthy + localstack: + condition: service_started + pgbouncer: + condition: service_started + volumes: + - .:/rails + - storage:/rails/storage + - /rails/tmp/cache + ports: + - "3000:3000" + tty: true + stdin_open: true + restart: unless-stopped + command: bin/dev + environment: + RAILS_ENV: development + RAILS_MASTER_KEY: $$var__rails_master_key + DB_PASS: $$random__pgpassword + DB_HOST: pgbouncer + DB_DIRECT_HOST: postgres + DB_DIRECT_PORT: "5432" + REDIS_URL: redis://redis:6379/1 + labels: + fibe.gg/github_url: "https://github.com/viktorvsk/rails-8-starter-kit" + fibe.gg/expose: "external:3000" + fibe.gg/dockerfile: "Dockerfile.dev" + fibe.gg/branch: $$var__branch + fibe.gg/source_mount: /rails + fibe.gg/env_file: env.example + fibe.gg/subdomain: "$$var__subdomain" + fibe.gg/zerodowntime: "false" + +volumes: + postgres_data: + localstack_data: + redis_data: + storage: + +configs: + postgres_config: + content: | + listen_addresses = '*' + shared_buffers = 1GB + effective_cache_size = 3GB + maintenance_work_mem = 256MB + checkpoint_completion_target = 0.9 + wal_buffers = 16MB + default_statistics_target = 100 + random_page_cost = 1.1 + effective_io_concurrency = 200 + work_mem = 10MB + min_wal_size = 1GB + max_wal_size = 4GB + max_worker_processes = 2 + max_parallel_workers_per_gather = 1 + max_parallel_workers = 2 + max_parallel_maintenance_workers = 1 diff --git a/docs/status.html b/docs/status.html new file mode 100644 index 0000000..356435d --- /dev/null +++ b/docs/status.html @@ -0,0 +1,587 @@ + + + + + + Rails 8 Starter Kit — Build Status + + + + + + + + + + + + + + +
    +
    + + +
    +
    +
    + + + + + + + +

    Select a Section

    +

    Choose a topic from the sidebar to explore the starter kit.

    +
    +
    +
    +
    +
    + + + + + + + diff --git a/env.example b/env.example new file mode 100644 index 0000000..04b5550 --- /dev/null +++ b/env.example @@ -0,0 +1,50 @@ +# ============================================================================ +# ENV variables are still supported for backwards compatibility. +# The preferred approach is to use encrypted credentials (credentials.yml.enc). +# Rails.app.creds checks ENV first, then falls back to encrypted credentials. +# ============================================================================ + +# Default Postgres connection +DB_PASS=password +DB_NAME=starter_development +DB_USER=postgres +DB_HOST=localhost +DB_PORT=5432 +DB_DIRECT_HOST=localhost +DB_DIRECT_PORT=5433 +REDIS_URL=redis://localhost:6379/1 + +### Rails ### + +RAILS_ENV=development +RAILS_MAX_THREADS=5 +ASSUME_SSL=false +FORCE_SSL=false +RAILS_LOG_LEVEL=info +CI= +WEB_CONCURRENCY=0 +PORT=3000 +PIDFILE=true +SESSION_DURATION_HOURS=720 + +# Active Record Encryption (generate with: bin/rails db:encryption:init) +ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY= +ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY= +ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT= + +STORAGE_SERVICE=amazon + +### /Rails ### + +### AWS / Localstack ### +AWS_ACCESS_KEY_ID=test +AWS_SECRET_ACCESS_KEY=test +AWS_REGION=us-east-1 +AWS_BUCKET=starter +AWS_ENDPOINT=http://localhost:4566 +### /AWS / Localstack ### + +### Testing ### +SILENT_TESTS= +EXAMPLE_TIMEOUT=60 +### / Testing ### diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000..e69de29 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000..e69de29 diff --git a/public/400.html b/public/400.html new file mode 100644 index 0000000..640de03 --- /dev/null +++ b/public/400.html @@ -0,0 +1,135 @@ + + + + + + + The server cannot process the request due to a client error (400 Bad Request) + + + + + + + + + + + + + +
    +
    + +
    +
    +

    The server cannot process the request due to a client error. Please check the request and try again. If you're the application owner check the logs for more information.

    +
    +
    + + + + diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..d7f0f14 --- /dev/null +++ b/public/404.html @@ -0,0 +1,135 @@ + + + + + + + The page you were looking for doesn't exist (404 Not found) + + + + + + + + + + + + + +
    +
    + +
    +
    +

    The page you were looking for doesn't exist. You may have mistyped the address or the page may have moved. If you're the application owner check the logs for more information.

    +
    +
    + + + + diff --git a/public/406-unsupported-browser.html b/public/406-unsupported-browser.html new file mode 100644 index 0000000..43d2811 --- /dev/null +++ b/public/406-unsupported-browser.html @@ -0,0 +1,135 @@ + + + + + + + Your browser is not supported (406 Not Acceptable) + + + + + + + + + + + + + +
    +
    + +
    +
    +

    Your browser is not supported.
    Please upgrade your browser to continue.

    +
    +
    + + + + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000..f12fb4a --- /dev/null +++ b/public/422.html @@ -0,0 +1,135 @@ + + + + + + + The change you wanted was rejected (422 Unprocessable Entity) + + + + + + + + + + + + + +
    +
    + +
    +
    +

    The change you wanted was rejected. Maybe you tried to change something you didn't have access to. If you're the application owner check the logs for more information.

    +
    +
    + + + + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000..e4eb18a --- /dev/null +++ b/public/500.html @@ -0,0 +1,135 @@ + + + + + + + We're sorry, but something went wrong (500 Internal Server Error) + + + + + + + + + + + + + +
    +
    + +
    +
    +

    We're sorry, but something went wrong.
    If you're the application owner check the logs for more information.

    +
    +
    + + + + diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000..c4c9dbf Binary files /dev/null and b/public/icon.png differ diff --git a/public/icon.svg b/public/icon.svg new file mode 100644 index 0000000..04b34bf --- /dev/null +++ b/public/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/offline.html b/public/offline.html new file mode 100644 index 0000000..faa04a3 --- /dev/null +++ b/public/offline.html @@ -0,0 +1,271 @@ + + + + + + + + Connection Lost + + + + +
    +
    📡
    +
    + + Disconnected +
    +
    +

    Connection Lost

    +

    The server is temporarily unreachable. This could be a brief deployment or a network hiccup — we'll keep trying.

    +
    + + ← Go back +
    +
    Auto-retry in 10s
    +
    + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..c19f78a --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/script/.keep b/script/.keep new file mode 100644 index 0000000..e69de29 diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb new file mode 100644 index 0000000..6649a89 --- /dev/null +++ b/spec/rails_helper.rb @@ -0,0 +1,115 @@ +# typed: false +# frozen_string_literal: true + +# This file is copied to spec/ when you run 'rails generate rspec:install' +require "spec_helper" +ENV["RAILS_ENV"] ||= "test" + +require_relative "../config/environment" +# Prevent database truncation if the environment is production +abort("The Rails environment is running in production mode!") if Rails.env.production? || Rails.env.beta? +# Uncomment the line below in case you have `--require rails_helper` in the `.rspec` file +# that will avoid rails generators crashing because migrations haven't been run yet +# return unless Rails.env.test? +require "rspec/rails" + +# Add additional requires below this line. Rails is not loaded until this point! + +Rails.root.glob("spec/support/**/*.rb").sort_by(&:to_s).each { |f| require f } + +# Minimize BCrypt cost to speed up token/password hashing in tests (saves ~150-300ms per token/password creation) +begin + require "bcrypt" + BCrypt::Engine.cost = BCrypt::Engine::MIN_COST +rescue LoadError + # ignore +end + +# Checks for pending migrations and applies them before tests are run. +# If you are not using ActiveRecord, you can remove these lines. +begin + ActiveRecord::Migration.maintain_test_schema! +rescue ActiveRecord::PendingMigrationError => e + abort(e.to_s.strip) +end +RSpec.configure do |config| + config.include(ActiveSupport::Testing::TimeHelpers) + + # PG statement_timeout runs inside the transactional fixture's transaction (before(:each) runs after BEGIN). + # It catches SQL hangs cleanly — PG aborts the statement without corrupting the AR connection. + config.before do |example| + timeout_seconds = example.metadata[:timeout] || ENV.fetch("EXAMPLE_TIMEOUT", 60).to_i + pg_timeout_ms = [(timeout_seconds - 2) * 1000, 1000].max + ActiveRecord::Base.connection.execute("SET LOCAL statement_timeout = '#{pg_timeout_ms}'") + end + + # Timeout.timeout is a safety net for non-SQL hangs (e.g. infinite Ruby loops). + # Since PG kills queries first, Thread.raise from Timeout rarely fires, keeping AR connections clean. + config.around do |example| + timeout_seconds = example.metadata[:timeout] || ENV.fetch("EXAMPLE_TIMEOUT", 60).to_i + Timeout.timeout(timeout_seconds) do + example.run + end + rescue Timeout::Error, Timeout::ExitException + raise Timeout::Error, "Test timed out after #{timeout_seconds} seconds: #{example.full_description}" + end + + # Ensure no bleeding data + config.before(:suite) do + if defined?(DatabaseCleaner) + DatabaseCleaner.clean_with(:truncation) + end + end + + config.define_derived_metadata(file_path: %r{/spec/integration/}) do |metadata| + metadata[:integration] = true + end + + # System specs (Selenium/headless Chrome) are inherently slow — skip in bin/lint, run in bin/long-lint + config.define_derived_metadata(file_path: %r{/spec/system/}) do |metadata| + metadata[:slow] = true + end + + config.filter_run_excluding(integration: true) unless ENV["INTEGRATION"] + + # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures + config.fixture_paths = [ + Rails.root.join("spec/fixtures"), + ] + + # If you're not using ActiveRecord, or you'd prefer not to run each of your + # examples within a transaction, remove the following line or assign false + # instead of true. + config.use_transactional_fixtures = true + + # You can uncomment this line to turn off ActiveRecord support entirely. + # config.use_active_record = false + + # RSpec Rails uses metadata to mix in different behaviours to your tests, + # for example enabling you to call `get` and `post` in request specs. e.g.: + # + # RSpec.describe UsersController, type: :request do + # # ... + # end + # + # The different available types are documented in the features, such as in + # https://rspec.info/features/7-1/rspec-rails + # + # You can also this infer these behaviours automatically by location, e.g. + # /spec/models would pull in the same behaviour as `type: :model` but this + # behaviour is considered legacy and will be removed in a future version. + # + # To enable this behaviour uncomment the line below. + config.infer_spec_type_from_file_location! + + # Filter lines from Rails gems in backtraces. + config.filter_rails_from_backtrace! + # arbitrary gems may also be filtered via: + # config.filter_gems_from_backtrace("gem name") + config.after(:suite) do + if defined?(Capybara) && Capybara.current_session.respond_to?(:driver) + driver = Capybara.current_session.driver + driver.quit if driver.respond_to?(:quit) + end + end +end diff --git a/spec/requests/health_spec.rb b/spec/requests/health_spec.rb new file mode 100644 index 0000000..535a34f --- /dev/null +++ b/spec/requests/health_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe("Health endpoint", type: :request) do + describe "GET /up" do + it "returns a successful response when database is healthy" do + get "/up" + expect(response).to(have_http_status(:ok)) + expect(response.body).to(include("background-color: green")) + end + end +end diff --git a/spec/requests/todos_spec.rb b/spec/requests/todos_spec.rb new file mode 100644 index 0000000..b4130ef --- /dev/null +++ b/spec/requests/todos_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe("Todos", type: :request) do + let!(:todo) { Todo.create!(title: "Write business value tests") } + + describe "GET /todos" do + it "renders a successful response" do + get todos_path + puts "STATUS: #{response.status}" + puts "BODY: #{response.body}" + expect(response).to(be_successful) + expect(response.body).to(include("Write business value tests")) + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..af88700 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,140 @@ +# typed: false +# frozen_string_literal: true + +# This file was generated by the `rails generate rspec:install` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +require "simplecov" + +if ENV["COVERAGE_FORMAT"] + SimpleCov.start("rails") do + command_name ENV.fetch("SIMPLECOV_COMMAND_NAME") { "#{ENV.fetch("SIMPLECOV_PREFIX", "RSpec")}-#{ENV["TEST_ENV_NUMBER"]}" } + + add_filter "/spec/" + add_filter "/config/" + add_filter "/vendor/" + + add_group "Channels", "app/channels" + add_group "Controllers", "app/controllers" + add_group "Models", "app/models" + add_group "MCP Tools", "app/mcp" + add_group "Helpers", "app/helpers" + add_group "Jobs", "app/jobs" + add_group "Middleware", "app/middleware" + add_group "Serializers", "app/serializers" + add_group "Services", "app/services" + add_group "Libraries", "lib/" + + if ENV["COVERAGE_FORMAT"] == "json" + require "simplecov_json_formatter" + formatter SimpleCov::Formatter::JSONFormatter + else + formatter SimpleCov::Formatter::HTMLFormatter + end + end + + SimpleCov.at_exit do + Rails.application.eager_load! if defined?(Rails) && Rails.application + SimpleCov.result.format! + end +end + +if ENV["SILENT_TESTS"] == "1" + $VERBOSE = nil +end + +RSpec.configure do |config| + config.order = :random + Kernel.srand(config.seed) + + if ENV["SILENT_TESTS"] == "1" + config.deprecation_stream = File.open(File::NULL, "w") + end + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with(:rspec) do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with(:rspec) do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + + # The settings below are suggested to provide a good initial experience + # with RSpec, but feel free to customize to your heart's content. + # # This allows you to limit a spec run to individual examples or groups + # # you care about by tagging them with `:focus` metadata. When nothing + # # is tagged with `:focus`, all examples get run. RSpec also provides + # # aliases for `it`, `describe`, and `context` that include `:focus` + # # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + # config.filter_run_when_matching :focus + # + # # Allows RSpec to persist some state between runs in order to support + # # the `--only-failures` and `--next-failure` CLI options. We recommend + # # you configure your source control system to ignore this file. + # config.example_status_persistence_file_path = "spec/examples.txt" + # + # # Limits the available syntax to the non-monkey patched syntax that is + # # recommended. For more details, see: + # # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/ + # config.disable_monkey_patching! + # + # # Many RSpec users commonly either run the entire suite or an individual + # # file, and it's useful to allow more verbose output when running an + # # individual spec file. + # if config.files_to_run.one? + # # Use the documentation formatter for detailed output, + # # unless a formatter has already been configured + # # (e.g. via a command-line flag). + # config.default_formatter = "doc" + # end + # + # # Print the 10 slowest examples and example groups at the + # # end of the spec run, to help surface which specs are running + # # particularly slow. + # config.profile_examples = 10 + # + # # Run specs in random order to surface order dependencies. If you find an + # # order dependency and want to debug it, you can fix the order by providing + # # the seed, which is printed after each run. + # # --seed 1234 + # config.order = :random + # + # # Seed global randomization in this process using the `--seed` CLI option. + # # Setting this allows you to use `--seed` to deterministically reproduce + # # test failures related to randomization by passing the same `--seed` value + # # as the one that triggered the failure. + # Kernel.srand config.seed +end diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb new file mode 100644 index 0000000..f38a13f --- /dev/null +++ b/spec/support/capybara.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require "capybara/rspec" +require "selenium-webdriver" + +Capybara.register_driver(:headless_chromium) do |app| + options = Selenium::WebDriver::Chrome::Options.new + options.add_argument("--headless=new") + options.add_argument("--no-sandbox") + options.add_argument("--disable-dev-shm-usage") + options.add_argument("--disable-gpu") + options.add_argument("--window-size=1400,1400") + + # Point to the Chromium binary installed in Dockerfile.dev if it exists (for docker runs) + # Otherwise, let selenium-manager find Chrome natively on the host machine (e.g., macOS) + if File.exist?("/usr/bin/chromium") + options.binary = "/usr/bin/chromium" + end + + Capybara::Selenium::Driver.new( + app, + browser: :chrome, + options: options, + ) +end + +Capybara.javascript_driver = :headless_chromium + +RSpec.configure do |config| + config.before(:each, type: :system) do + driven_by :rack_test + end + + config.before(:each, :js, type: :system) do + driven_by :headless_chromium + end +end diff --git a/spec/system/todos_spec.rb b/spec/system/todos_spec.rb new file mode 100644 index 0000000..414be78 --- /dev/null +++ b/spec/system/todos_spec.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +require "rails_helper" + +RSpec.describe("Todos", type: :system) do + it "creates a new todo and prepends it to the list via Turbo Streams", :js do + visit root_path + + # Wait for AnyCable / ActionCable subscription to initialize if needed + # Usually filling the form takes a moment anyway, but let's be safe + expect(page).to(have_css("h1", text: "Todos")) + + # Assuming the form has a text input for title + fill_in "What needs to be done?", with: "Learn Rails 8 with Hotwire" + + # Assuming there's a submit button + click_on "Add" + + # The new todo should appear in the list dynamically via Turbo Stream + expect(page).to(have_css("#todos li", text: "Learn Rails 8 with Hotwire")) + + # Form should be reset if configured properly, but verifying creation is the primary goal + expect(page).to(have_content("Learn Rails 8 with Hotwire")) + end +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000..e69de29 diff --git a/tmp/pids/.keep b/tmp/pids/.keep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/javascript/.keep b/vendor/javascript/.keep new file mode 100644 index 0000000..e69de29 diff --git a/vendor/javascript/three.js b/vendor/javascript/three.js new file mode 100644 index 0000000..ee3772e --- /dev/null +++ b/vendor/javascript/three.js @@ -0,0 +1,699 @@ +// three@0.183.2 downloaded from https://ga.jspm.io/npm:three@0.183.2/build/three.module.js + +import{c as e,V as t,C as n,f$ as a,a as r,u as l,d as c,at as d,a8 as u,a7 as p,fe as m,B as h,g0 as _,h as v,S as E,b0 as S,b1 as T,g1 as x,n as R,as as b,al as C,aG as L,Y as U,w,aM as N,an as y,x as O,y as B,ar as G,aa as V,ap as W,ao as k,N as z,ah as X,e as Y,aq as K,fU as q,a3 as $,v as J,_ as te,ab as ne,ac as ae,ad as ie,m as re,aB as oe,aC as se,b as le,X as ce,dQ as fe,cX as ue,cW as pe,cV as me,cU as he,cT as _e,cS as ge,aP as ve,f9 as Ee,T as Se,$ as Me,dS as Te,q as xe,p as Re,cq as Ae,aR as be,aS as Ce,ae as Pe,af as Le,ag as Ue,e8 as De,eu as we,t as Ie,aH as Ne,z as ye,O as Fe,g2 as Oe,R as Be,b8 as Ge,eK as He,eL as Ve,aT as We,aE as ke,r as ze,aV as Xe,U as Ye,bB as Ke,bC as qe,bD as je,bE as Ze,bF as $e,bG as Qe,bH as Je,bI as tt,bJ as nt,bw as at,bl as it,bm as rt,aK as ot,cK as st,cJ as lt,eR as ut,dG as pt,eS as mt,dH as ht,bn as _t,bo as gt,aJ as vt,bp as Et,bq as St,br as Mt,bs as Tt,aI as xt,bt as Rt,bu as At,b3 as bt,b2 as Ct,by as Pt,bz as Lt,bA as Ut,bv as Dt,bx as wt,g3 as It,aF as Nt,bi as yt,cj as Ft,am as Ot,ck as Bt,aX as Gt,aY as Ht,cl as Vt,cm as Wt,G as kt,cn as zt,L as Xt,co as Yt,cp as Kt,k as qt,aD as jt,cr as Zt,bK as $t,bL as Qt,bM as Jt,bN as tn,bh as nn,bg as an,bO as rn,be as on,bb as sn,ba as ln,bc as cn,bf as un,bP as pn,bQ as mn,bR as hn,bS as _n,bT as gn,bU as vn,bV as En,bW as Sn,bX as Mn,bY as Tn,bZ as xn,b_ as Rn,b$ as An,K as bn,c0 as Cn,c1 as Pn,c2 as Ln,c3 as Un,c4 as Dn,c5 as wn,c6 as In,c7 as Nn,c8 as yn,c9 as Fn,ca as On,cb as Bn,cc as Gn,cd as Hn,ce as Vn,cf as Wn,f6 as kn,f7 as zn,cg as Xn,ch as Yn,J as Kn,ci as qn,e2 as jn,E as Zn,a$ as $n,b6 as Qn,b7 as Jn,ak as ta,bk as na,a5 as aa,a_ as ia,l as ra,W as oa,g4 as sa}from"../_/nWl398M7.js";export{d1 as AdditiveAnimationBlendMode,cz as AlwaysStencilFunc,cP as AmbientLight,d2 as AnimationAction,d3 as AnimationClip,d4 as AnimationLoader,d5 as AnimationMixer,d6 as AnimationObjectGroup,d7 as AnimationUtils,d8 as ArcCurve,d9 as ArrowHelper,da as AttachedBindMode,db as Audio,dc as AudioAnalyser,dd as AudioContext,de as AudioListener,df as AudioLoader,dg as AxesHelper,dh as BasicDepthPacking,aU as BasicShadowMap,di as BatchedMesh,dj as BezierInterpolant,dk as Bone,dl as BooleanKeyframeTrack,dm as Box2,dn as Box3,dp as Box3Helper,dq as BoxHelper,dr as BufferGeometryLoader,ds as Cache,dt as Camera,du as CameraHelper,dv as CanvasTexture,dw as CapsuleGeometry,dx as CatmullRomCurve3,dy as CircleGeometry,dz as Clock,dA as ColorKeyframeTrack,o as Compatibility,dB as CompressedArrayTexture,dC as CompressedCubeTexture,dD as CompressedTexture,dE as CompressedTextureLoader,dF as ConeGeometry,dI as Controls,dJ as CubeTextureLoader,dK as CubicBezierCurve,dL as CubicBezierCurve3,dM as CubicInterpolant,dN as CullFaceFrontBack,dO as Curve,dP as CurvePath,b4 as CylinderGeometry,dR as Cylindrical,dT as DataTextureLoader,dU as DataUtils,cD as DecrementStencilOp,cB as DecrementWrapStencilOp,dV as DefaultLoadingManager,dW as DetachedBindMode,cN as DirectionalLight,dX as DirectionalLightHelper,dY as DiscreteInterpolant,dZ as DodecahedronGeometry,d_ as DynamicCopyUsage,D as DynamicDrawUsage,d$ as DynamicReadUsage,e0 as EdgesGeometry,e1 as EllipseCurve,cw as EqualStencilFunc,e3 as ExtrudeGeometry,c_ as FileLoader,aZ as Float16BufferAttribute,e4 as Fog,e5 as FogExp2,Z as FramebufferTexture,b9 as FrustumArray,e6 as GLBufferAttribute,e7 as GLSL1,cv as GreaterEqualStencilFunc,cu as GreaterStencilFunc,e9 as GridHelper,cY as Group,cQ as HemisphereLight,ea as HemisphereLightHelper,eb as IcosahedronGeometry,ec as ImageBitmapLoader,ed as ImageLoader,ee as ImageUtils,cE as IncrementStencilOp,cC as IncrementWrapStencilOp,P as InstancedBufferAttribute,ef as InstancedBufferGeometry,Q as InstancedInterleavedBuffer,eg as InstancedMesh,eh as Int16BufferAttribute,ei as Int32BufferAttribute,ej as Int8BufferAttribute,I as InterleavedBuffer,j as InterleavedBufferAttribute,ek as Interpolant,el as InterpolateBezier,em as InterpolateDiscrete,en as InterpolateLinear,eo as InterpolateSmooth,ep as InterpolationSamplingMode,eq as InterpolationSamplingType,cF as InvertStencilOp,cI as KeepStencilOp,er as KeyframeTrack,es as LOD,et as LatheGeometry,cx as LessEqualStencilFunc,cy as LessStencilFunc,ev as Light,cR as LightProbe,ew as Line,ex as Line3,a1 as LineBasicMaterial,ey as LineCurve,ez as LineCurve3,a2 as LineDashedMaterial,eA as LineLoop,eB as LineSegments,eC as LinearInterpolant,aO as LinearMipMapLinearFilter,eD as LinearMipMapNearestFilter,cZ as Loader,eE as LoaderUtils,eF as LoadingManager,eG as LoopOnce,eH as LoopPingPong,eI as LoopRepeat,eJ as MOUSE,a0 as Material,aL as MaterialBlending,c$ as MaterialLoader,f as MathUtils,M as Matrix2,ai as MeshLambertMaterial,ax as MeshMatcapMaterial,a4 as MeshNormalMaterial,aj as MeshPhongMaterial,av as MeshPhysicalMaterial,au as MeshStandardMaterial,aw as MeshToonMaterial,eM as NearestMipMapLinearFilter,eN as NearestMipMapNearestFilter,cA as NeverStencilFunc,A as NoNormalPacking,eO as NormalAnimationBlendMode,H as NormalGAPacking,F as NormalRGPacking,ct as NotEqualStencilFunc,eP as NumberKeyframeTrack,aN as Object3D,d0 as ObjectLoader,eQ as OctahedronGeometry,eT as Path,eU as PlaneHelper,cM as PointLight,eV as PointLightHelper,eW as Points,az as PointsMaterial,eX as PolarGridHelper,eY as PolyhedronGeometry,eZ as PositionalAudio,e_ as PropertyBinding,e$ as PropertyMixer,f0 as QuadraticBezierCurve,f1 as QuadraticBezierCurve3,b5 as Quaternion,f2 as QuaternionKeyframeTrack,f3 as QuaternionLinearInterpolant,f4 as RGBADepthPacking,f5 as RGBDepthPacking,bd as RGBIntegerFormat,f8 as RGDepthPacking,fa as Ray,fb as Raycaster,cO as RectAreaLight,a6 as RenderTarget,fc as RenderTarget3D,cG as ReplaceStencilOp,fd as RingGeometry,a9 as Scene,aA as ShadowMaterial,ff as Shape,fg as ShapeGeometry,fh as ShapePath,fi as ShapeUtils,fj as Skeleton,fk as SkeletonHelper,fl as SkinnedMesh,fm as Source,s as Sphere,aW as SphereGeometry,fn as Spherical,fo as SphericalHarmonics3,fp as SplineCurve,cL as SpotLight,fq as SpotLightHelper,fr as Sprite,ay as SpriteMaterial,fs as StaticCopyUsage,i as StaticDrawUsage,ft as StaticReadUsage,fu as StereoCamera,fv as StreamCopyUsage,fw as StreamDrawUsage,fx as StreamReadUsage,fy as StringKeyframeTrack,fz as TOUCH,fA as TetrahedronGeometry,fB as TextureLoader,fC as TextureUtils,fD as Timer,bj as TimestampQuery,fE as TorusGeometry,fF as TorusKnotGeometry,fG as Triangle,fH as TriangleFanDrawMode,fI as TriangleStripDrawMode,fJ as TrianglesDrawMode,fK as TubeGeometry,aQ as UVMapping,fL as Uint8BufferAttribute,fM as Uint8ClampedBufferAttribute,fN as Uniform,fO as UniformsGroup,fP as VectorKeyframeTrack,fQ as VideoFrameTexture,fR as VideoTexture,fS as WebGL3DRenderTarget,fT as WebGLArrayRenderTarget,g as WebGPUCoordinateSystem,fV as WireframeGeometry,fW as WrapAroundEnding,fX as ZeroCurvatureEnding,fY as ZeroSlopeEnding,cH as ZeroStencilOp,fZ as getConsoleFunction,f_ as setConsoleFunction}from"../_/nWl398M7.js"; +/** + * @license + * Copyright 2010-2026 Three.js Authors + * SPDX-License-Identifier: MIT + */function la(){let e=null;let t=false;let n=null;let a=null;function i(t,r){n(t,r);a=e.requestAnimationFrame(i)}return{start:function(){if(t!==true&&n!==null){a=e.requestAnimationFrame(i);t=true}},stop:function(){e.cancelAnimationFrame(a);t=false},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function ca(e){const t=new WeakMap;function n(t,n){const a=t.array;const i=t.usage;const r=a.byteLength;const o=e.createBuffer();e.bindBuffer(n,o);e.bufferData(n,a,i);t.onUploadCallback();let s;if(a instanceof Float32Array)s=e.FLOAT;else if(typeof Float16Array!=="undefined"&&a instanceof Float16Array)s=e.HALF_FLOAT;else if(a instanceof Uint16Array)s=t.isFloat16BufferAttribute?e.HALF_FLOAT:e.UNSIGNED_SHORT;else if(a instanceof Int16Array)s=e.SHORT;else if(a instanceof Uint32Array)s=e.UNSIGNED_INT;else if(a instanceof Int32Array)s=e.INT;else if(a instanceof Int8Array)s=e.BYTE;else if(a instanceof Uint8Array)s=e.UNSIGNED_BYTE;else{if(!(a instanceof Uint8ClampedArray))throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+a);s=e.UNSIGNED_BYTE}return{buffer:o,type:s,bytesPerElement:a.BYTES_PER_ELEMENT,version:t.version,size:r}}function a(t,n,a){const i=n.array;const r=n.updateRanges;e.bindBuffer(a,t);if(r.length===0)e.bufferSubData(a,0,i);else{r.sort(((e,t)=>e.start-t.start));let t=0;for(let e=1;e0;n=t.get(n,a)}return n}function b(t){let n=false;const i=A(t);if(i===null)P(s,l);else if(i&&i.isColor){P(i,1);n=true}const r=e.xr.getEnvironmentBlendMode();r==="additive"?a.buffers.color.setClear(0,0,0,1,o):r==="alpha-blend"&&a.buffers.color.setClear(0,0,0,0,o);if(e.autoClear||n){a.buffers.depth.setTest(true);a.buffers.depth.setMask(true);a.buffers.color.setMask(true);e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil)}}function C(t,n){const a=A(n);if(a&&(a.isCubeTexture||a.mapping===d)){if(f===void 0){f=new u(new p(1,1,1),new m({name:"BackgroundCubeMaterial",uniforms:_(to.backgroundCube.uniforms),vertexShader:to.backgroundCube.vertexShader,fragmentShader:to.backgroundCube.fragmentShader,side:h,depthTest:false,depthWrite:false,fog:false,allowOverride:false}));f.geometry.deleteAttribute("normal");f.geometry.deleteAttribute("uv");f.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)};Object.defineProperty(f.material,"envMap",{get:function(){return this.uniforms.envMap.value}});i.update(f)}ao.copy(n.backgroundRotation);ao.x*=-1;ao.y*=-1;ao.z*=-1;if(a.isCubeTexture&&a.isRenderTargetTexture===false){ao.y*=-1;ao.z*=-1}f.material.uniforms.envMap.value=a;f.material.uniforms.flipEnvMap.value=a.isCubeTexture&&a.isRenderTargetTexture===false?-1:1;f.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness;f.material.uniforms.backgroundIntensity.value=n.backgroundIntensity;f.material.uniforms.backgroundRotation.value.setFromMatrix4(io.makeRotationFromEuler(ao));f.material.toneMapped=v.getTransfer(a.colorSpace)!==E;if(g!==a||M!==a.version||R!==e.toneMapping){f.material.needsUpdate=true;g=a;M=a.version;R=e.toneMapping}f.layers.enableAll();t.unshift(f,f.geometry,f.material,0,0,null)}else if(a&&a.isTexture){if(c===void 0){c=new u(new S(2,2),new m({name:"BackgroundMaterial",uniforms:_(to.background.uniforms),vertexShader:to.background.vertexShader,fragmentShader:to.background.fragmentShader,side:T,depthTest:false,depthWrite:false,fog:false,allowOverride:false}));c.geometry.deleteAttribute("normal");Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}});i.update(c)}c.material.uniforms.t2D.value=a;c.material.uniforms.backgroundIntensity.value=n.backgroundIntensity;c.material.toneMapped=v.getTransfer(a.colorSpace)!==E;a.matrixAutoUpdate===true&&a.updateMatrix();c.material.uniforms.uvTransform.value.copy(a.matrix);if(g!==a||M!==a.version||R!==e.toneMapping){c.material.needsUpdate=true;g=a;M=a.version;R=e.toneMapping}c.layers.enableAll();t.unshift(c,c.geometry,c.material,0,0,null)}}function P(t,n){t.getRGB(no,x(e));a.buffers.color.setClear(no.r,no.g,no.b,n,o)}function L(){if(f!==void 0){f.geometry.dispose();f.material.dispose();f=void 0}if(c!==void 0){c.geometry.dispose();c.material.dispose();c=void 0}}return{getClearColor:function(){return s},setClearColor:function(e,t=1){s.set(e);l=t;P(s,l)},getClearAlpha:function(){return l},setClearAlpha:function(e){l=e;P(s,l)},render:b,addToRenderList:C,dispose:L}}function oo(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS);const a={};const i=u(null);let r=i;let o=false;function s(n,a,i,s,l){let d=false;const u=f(n,s,i,a);if(r!==u){r=u;c(r.object)}d=p(n,s,i,l);d&&m(n,s,i,l);l!==null&&t.update(l,e.ELEMENT_ARRAY_BUFFER);if(d||o){o=false;S(n,a,i,s);l!==null&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t.get(l).buffer)}}function l(){return e.createVertexArray()}function c(t){return e.bindVertexArray(t)}function d(t){return e.deleteVertexArray(t)}function f(e,t,n,i){const r=i.wireframe===true;let o=a[t.id];if(o===void 0){o={};a[t.id]=o}const s=e.isInstancedMesh===true?e.id:0;let c=o[s];if(c===void 0){c={};o[s]=c}let d=c[n.id];if(d===void 0){d={};c[n.id]=d}let f=d[r];if(f===void 0){f=u(l());d[r]=f}return f}function u(e){const t=[];const a=[];const i=[];for(let e=0;e=0){const n=i[t];let a=o[t];if(a===void 0){t==="instanceMatrix"&&e.instanceMatrix&&(a=e.instanceMatrix);t==="instanceColor"&&e.instanceColor&&(a=e.instanceColor)}if(n===void 0)return true;if(n.attribute!==a)return true;if(a&&n.data!==a.data)return true;s++}}return r.attributesNum!==s||r.index!==a}function m(e,t,n,a){const i={};const o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){const n=l[t];if(n.location>=0){let n=o[t];if(n===void 0){t==="instanceMatrix"&&e.instanceMatrix&&(n=e.instanceMatrix);t==="instanceColor"&&e.instanceColor&&(n=e.instanceColor)}const a={};a.attribute=n;n&&n.data&&(a.data=n.data);i[t]=a;s++}}r.attributes=i;r.attributesNum=s;r.index=a}function h(){const e=r.newAttributes;for(let t=0,n=e.length;t=0){let s=o[a];if(s===void 0){a==="instanceMatrix"&&n.instanceMatrix&&(s=n.instanceMatrix);a==="instanceColor"&&n.instanceColor&&(s=n.instanceColor)}if(s!==void 0){const a=s.normalized;const o=s.itemSize;const l=t.get(s);if(l===void 0)continue;const c=l.buffer;const d=l.type;const f=l.bytesPerElement;const u=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===R;if(s.isInterleavedBufferAttribute){const t=s.data;const l=t.stride;const p=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return t==="mediump"&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=n.precision!==void 0?n.precision:"highp";const d=l(c);if(d!==c){w("WebGLRenderer:",c,"not supported, using",d,"instead.");c=d}const f=n.logarithmicDepthBuffer===true;const u=n.reversedDepthBuffer===true&&t.has("EXT_clip_control");const p=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS);const m=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);const h=e.getParameter(e.MAX_TEXTURE_SIZE);const _=e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE);const g=e.getParameter(e.MAX_VERTEX_ATTRIBS);const v=e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS);const E=e.getParameter(e.MAX_VARYING_VECTORS);const S=e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS);const M=e.getParameter(e.MAX_SAMPLES);const T=e.getParameter(e.SAMPLES);return{isWebGL2:true,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:o,textureTypeReadable:s,precision:c,logarithmicDepthBuffer:f,reversedDepthBuffer:u,maxTextures:p,maxVertexTextures:m,maxTextureSize:h,maxCubemapSize:_,maxAttributes:g,maxVertexUniforms:v,maxVaryings:E,maxFragmentUniforms:S,maxSamples:M,samples:T}}function co(t){const n=this;let a=null,i=0,r=false,o=false;const s=new N,l=new e,c={value:null,needsUpdate:false};this.uniform=c;this.numPlanes=0;this.numIntersection=0;this.init=function(e,t){const n=e.length!==0||t||i!==0||r;r=t;i=e.length;return n};this.beginShadows=function(){o=true;f(null)};this.endShadows=function(){o=false};this.setGlobalState=function(e,t){a=f(e,t,0)};this.setState=function(e,n,s){const l=e.clippingPlanes,u=e.clipIntersection,p=e.clipShadows;const m=t.get(e);if(!r||l===null||l.length===0||o&&!p)o?f(null):d();else{const e=o?0:i,t=e*4;let r=m.clippingState||null;c.value=r;r=f(l,n,t,s);for(let e=0;e!==t;++e)r[e]=a[e];m.clippingState=r;this.numIntersection=u?this.numPlanes:0;this.numPlanes+=e}};function d(){if(c.value!==a){c.value=a;c.needsUpdate=i>0}n.numPlanes=i;n.numIntersection=0}function f(e,t,a,i){const r=e!==null?e.length:0;let o=null;if(r!==0){o=c.value;if(i!==true||o===null){const n=a+r*4,i=t.matrixWorldInverse;l.getNormalMatrix(i);(o===null||o.length0&&this._blur(s,0,0,t);this._applyPMREM(s);this._cleanup(s);return s} +/** + * Generates a PMREM from an equirectangular texture, which can be either LDR + * or HDR. The ideal input image size is 1k (1024 x 512), + * as this matches best with the 256 x 256 cubemap output. + * + * @param {Texture} equirectangular - The equirectangular texture to be converted. + * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use. + * @return {WebGLRenderTarget} The resulting PMREM. + */fromEquirectangular(e,t=null){return this._fromTexture(e,t)} +/** + * Generates a PMREM from an cubemap texture, which can be either LDR + * or HDR. The ideal input cube size is 256 x 256, + * as this matches best with the 256 x 256 cubemap output. + * + * @param {Texture} cubemap - The cubemap texture to be converted. + * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use. + * @return {WebGLRenderTarget} The resulting PMREM. + */fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){if(this._cubemapMaterial===null){this._cubemapMaterial=Lo();this._compileMaterial(this._cubemapMaterial)}}compileEquirectangularShader(){if(this._equirectMaterial===null){this._equirectMaterial=Po();this._compileMaterial(this._equirectMaterial)}}dispose(){this._dispose();this._cubemapMaterial!==null&&this._cubemapMaterial.dispose();this._equirectMaterial!==null&&this._equirectMaterial.dispose();if(this._backgroundBox!==null){this._backgroundBox.geometry.dispose();this._backgroundBox.material.dispose()}}_setSize(e){this._lodMax=Math.floor(Math.log2(e));this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose();this._ggxMaterial!==null&&this._ggxMaterial.dispose();this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?r:0,r,r);d.setRenderTarget(a);E&&d.render(g,s);d.render(e,s)}d.toneMapping=m;d.autoClear=f;e.background=S}_textureToCubeUV(e,t){const n=this._renderer;const a=e.mapping===O||e.mapping===B;if(a){this._cubemapMaterial===null&&(this._cubemapMaterial=Lo());this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===false?-1:1}else this._equirectMaterial===null&&(this._equirectMaterial=Po());const i=a?this._cubemapMaterial:this._equirectMaterial;const r=this._lodMeshes[0];r.material=i;const o=i.uniforms;o.envMap.value=e;const s=this._cubeSize;Ao(t,0,0,3*s,2*s);n.setRenderTarget(t);n.render(r,_o)}_applyPMREM(e){const t=this._renderer;const n=t.autoClear;t.autoClear=false;const a=this._lodMeshes.length;for(let t=1;tp-uo?n-p+uo:0);const _=4*(this._cubeSize-m);s.envMap.value=e.texture;s.roughness.value=u;s.mipInt.value=p-t;Ao(i,h,_,3*m,2*m);a.setRenderTarget(i);a.render(o,_o);s.envMap.value=i.texture;s.roughness.value=0;s.mipInt.value=p-n;Ao(e,h,_,3*m,2*m);a.setRenderTarget(e);a.render(o,_o)} +/** + * This is a two-pass Gaussian blur for a cubemap. Normally this is done + * vertically and horizontally, but this breaks down on a cube. Here we apply + * the blur latitudinally (around the poles), and then longitudinally (towards + * the poles) to approximate the orthogonally-separable blur. It is least + * accurate at the poles, but still does a decent job. + * + * Used for initial scene blur in fromScene() method when sigma > 0. + * + * @private + * @param {WebGLRenderTarget} cubeUVRenderTarget + * @param {number} lodIn + * @param {number} lodOut + * @param {number} sigma + * @param {Vector3} [poleAxis] + */_blur(e,t,n,a,i){const r=this._pingPongRenderTarget;this._halfBlur(e,r,t,n,a,"latitudinal",i);this._halfBlur(r,e,n,n,a,"longitudinal",i)}_halfBlur(e,t,n,a,i,r,o){const s=this._renderer;const l=this._blurMaterial;r!=="latitudinal"&&r!=="longitudinal"&&Y("blur direction must be either latitudinal or longitudinal!");const c=3;const d=this._lodMeshes[a];d.material=l;const f=l.uniforms;const u=this._sizeLods[n]-1;const p=isFinite(i)?Math.PI/(2*u):2*Math.PI/(2*mo-1);const m=i/p;const h=isFinite(i)?1+Math.floor(c*m):mo;h>mo&&w(`sigmaRadians, ${i}, is too large and will clip, as it requested ${h} samples when the maximum is set to ${mo}`);const _=[];let g=0;for(let e=0;ev-uo?a-v+uo:0);const M=4*(this._cubeSize-E);Ao(t,S,M,3*E,2*E);s.setRenderTarget(t);s.render(d,_o)}}function xo(e){const t=[];const n=[];const a=[];let i=e;const r=e-uo+1+po.length;for(let o=0;oe-uo?s=po[o-e+uo-1]:o===0&&(s=0);n.push(s);const l=1/(r-2);const c=-l;const d=1+l;const f=[c,c,d,c,d,d,c,c,d,d,c,d];const p=6;const m=6;const h=3;const _=2;const g=1;const v=new Float32Array(h*m*p);const E=new Float32Array(_*m*p);const S=new Float32Array(g*m*p);for(let e=0;e2?0:-1;const a=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];v.set(a,h*m*e);E.set(f,_*m*e);const i=[e,e,e,e,e,e];S.set(i,g*m*e)}const M=new W;M.setAttribute("position",new K(v,h));M.setAttribute("uv",new K(E,_));M.setAttribute("faceIndex",new K(S,g));a.push(new u(M,null));i>uo&&i--}return{lodMeshes:a,sizeLods:t,sigmas:n}}function Ro(e,t,n){const a=new q(e,t,n);a.texture.mapping=d;a.texture.name="PMREM.cubeUv";a.scissorTest=true;return a}function Ao(e,t,n,a,i){e.viewport.set(t,n,a,i);e.scissor.set(t,n,a,i)}function bo(e,t,n){const a=new m({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:ho,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Uo(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tvec3 T1 = vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(V, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + V.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:$,depthTest:false,depthWrite:false});return a}function Co(e,t,n){const a=new Float32Array(mo);const i=new r(0,1,0);const o=new m({name:"SphericalGaussianBlur",defines:{n:mo,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:a},latitudinal:{value:false},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:Uo(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:$,depthTest:false,depthWrite:false});return o}function Po(){return new m({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:Uo(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:$,depthTest:false,depthWrite:false})}function Lo(){return new m({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Uo(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:$,depthTest:false,depthWrite:false})}function Uo(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}class WebGLCubeRenderTarget extends q{ +/** + * Constructs a new cube render target. + * + * @param {number} [size=1] - The size of the render target. + * @param {RenderTarget~Options} [options] - The configuration object. + */ +constructor(e=1,t={}){super(e,e,t); +/** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */this.isWebGLCubeRenderTarget=true;const n={width:e,height:e,depth:1};const a=[n,n,n,n,n,n]; +/** + * Overwritten with a different texture type. + * + * @type {DataArrayTexture} + */this.texture=new J(a);this._setTextureOptions(t);this.texture.isRenderTargetTexture=true} +/** + * Converts the given equirectangular texture to a cube map. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {Texture} texture - The equirectangular texture. + * @return {WebGLCubeRenderTarget} A reference to this cube render target. + */fromEquirectangularTexture(e,t){this.texture.type=t.type;this.texture.colorSpace=t.colorSpace;this.texture.generateMipmaps=t.generateMipmaps;this.texture.minFilter=t.minFilter;this.texture.magFilter=t.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"};const a=new p(5,5,5);const i=new m({name:"CubemapFromEquirect",uniforms:_(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:h,blending:$});i.uniforms.tEquirect.value=t;const r=new u(a,i);const o=t.minFilter;t.minFilter===te&&(t.minFilter=V);const s=new ne(1,10,this);s.update(e,r);t.minFilter=o;r.geometry.dispose();r.material.dispose();return this} +/** + * Clears this cube render target. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {boolean} [color=true] - Whether the color buffer should be cleared or not. + * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not. + * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not. + */clear(e,t=true,n=true,a=true){const i=e.getRenderTarget();for(let i=0;i<6;i++){e.setRenderTarget(this,i);e.clear(t,n,a)}e.setRenderTarget(i)}}function Do(e){let t=new WeakMap;let n=new WeakMap;let a=null;function i(e,t=false){return e===null||e===void 0?null:t?o(e):r(e)}function r(n){if(n&&n.isTexture){const a=n.mapping;if(a===ae||a===ie){if(t.has(n)){const e=t.get(n).texture;return s(e,n.mapping)}{const a=n.image;if(a&&a.height>0){const i=new WebGLCubeRenderTarget(a.height);i.fromEquirectangularTexture(e,n);t.set(n,i);n.addEventListener("dispose",c);return s(i.texture,n.mapping)}return null}}}return n}function o(t){if(t&&t.isTexture){const i=t.mapping;const r=i===ae||i===ie;const o=i===O||i===B;if(r||o){let i=n.get(t);const s=i!==void 0?i.texture.pmremVersion:0;if(t.isRenderTargetTexture&&t.pmremVersion!==s){a===null&&(a=new PMREMGenerator(e));i=r?a.fromEquirectangular(t,i):a.fromCubemap(t,i);i.texture.pmremVersion=t.pmremVersion;n.set(t,i);return i.texture}if(i!==void 0)return i.texture;{const s=t.image;if(r&&s&&s.height>0||o&&s&&l(s)){a===null&&(a=new PMREMGenerator(e));i=r?a.fromEquirectangular(t):a.fromCubemap(t);i.texture.pmremVersion=t.pmremVersion;n.set(t,i);t.addEventListener("dispose",d);return i.texture}return null}}}return t}function s(e,t){t===ae?e.mapping=O:t===ie&&(e.mapping=B);return e}function l(e){let t=0;const n=6;for(let a=0;a=65535?oe:se)(n,1);s.version=o;const l=r.get(e);l&&t.remove(l);r.set(e,s)}function d(e){const t=r.get(e);if(t){const n=e.index;n!==null&&t.versionn.maxTextureSize){M=Math.ceil(S/n.maxTextureSize);S=n.maxTextureSize}const T=new Float32Array(S*M*4*f);const x=new ce(T,S,M,f);x.type=U;x.needsUpdate=true;const R=E*4;for(let b=0;b\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:false,depthWrite:false});const c=new u(s,l);const d=new y(-1,1,1,-1,0,1);let f=null;let p=null;let m=false;let h;let _=null;let g=[];let S=false;this.setSize=function(e,t){r.setSize(e,t);o.setSize(e,t);for(let n=0;n0&&g[0].isRenderPass===true;const t=r.width;const n=r.height;for(let e=0;e0)return e;const i=t*n;let r=Xo[i];if(r===void 0){r=new Float32Array(i);Xo[i]=r}if(t!==0){a.toArray(r,0);for(let a=1,i=0;a!==t;++a){i+=n;e[a].toArray(r,i)}}return r}function $o(e,t){if(e.length!==t.length)return false;for(let n=0,a=e.length;n0&&(this.seq=a.concat(i))}setValue(e,t,n,a){const i=this.map[t];i!==void 0&&i.setValue(e,n,a)}setOptional(e,t,n){const a=t[n];a!==void 0&&this.setValue(e,n,a)}static upload(e,t,n,a){for(let i=0,r=t.length;i!==r;++i){const r=t[i],o=n[r.id];o.needsUpdate!==false&&r.setValue(e,o.value,a)}}static seqWithValue(e,t){const n=[];for(let a=0,i=e.length;a!==i;++a){const i=e[a];i.id in t&&n.push(i)}return n}}function Ys(e,t,n){const a=e.createShader(t);e.shaderSource(a,n);e.compileShader(a);return a}const Ks=37297;let qs=0;function js(e,t){const n=e.split("\n");const a=[];const i=Math.max(t-6,0);const r=Math.min(t+6,n.length);for(let e=i;e":" "} ${i}: ${n[e]}`)}return a.join("\n")}const Zs=new e;function $s(e){v._getMatrix(Zs,v.workingColorSpace,e);const t=`mat3( ${Zs.elements.map((e=>e.toFixed(4)))} )`;switch(v.getTransfer(e)){case Ae:return[t,"LinearTransferOETF"];case E:return[t,"sRGBTransferOETF"];default:w("WebGLProgram: Unsupported color space: ",e);return[t,"LinearTransferOETF"]}}function Qs(e,t,n){const a=e.getShaderParameter(t,e.COMPILE_STATUS);const i=e.getShaderInfoLog(t)||"";const r=i.trim();if(a&&r==="")return"";const o=/ERROR: 0:(\d+)/.exec(r);if(o){const a=parseInt(o[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+js(e.getShaderSource(t),a)}return r}function Js(e,t){const n=$s(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}const tl={[ge]:"Linear",[_e]:"Reinhard",[he]:"Cineon",[me]:"ACESFilmic",[pe]:"AgX",[ue]:"Neutral",[fe]:"Custom"};function nl(e,t){const n=tl[t];if(n===void 0){w("WebGLProgram: Unsupported toneMapping:",t);return"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const al=new r;function il(){v.getLuminanceCoefficients(al);const e=al.x.toFixed(4);const t=al.y.toFixed(4);const n=al.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${e}, ${t}, ${n} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function rl(e){const t=[e.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",e.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""];return t.filter(ll).join("\n")}function ol(e){const t=[];for(const n in e){const a=e[n];a!==false&&t.push("#define "+n+" "+a)}return t.join("\n")}function sl(e,t){const n={};const a=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let i=0;i/gm;function ml(e){return e.replace(pl,_l)}const hl=new Map;function _l(e,t){let n=Qr[t];if(n===void 0){const e=hl.get(t);if(e===void 0)throw new Error("Can not resolve #include <"+t+">");n=Qr[e];w('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return ml(n)}const gl=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function vl(e){return e.replace(gl,El)}function El(e,t,n,a){let i="";for(let e=parseInt(t);e0&&(_+="\n");g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(ll).join("\n");g.length>0&&(g+="\n")}else{_=[Sl(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&n.flatShading===false?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&n.flatShading===false?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(ll).join("\n");g=[Sl(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+f:"",u?"#define CUBEUV_TEXEL_WIDTH "+u.texelWidth:"",u?"#define CUBEUV_TEXEL_HEIGHT "+u.texelHeight:"",u?"#define CUBEUV_MAX_MIP "+u.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&n.flatShading===false?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor?"#define USE_COLOR":"",n.vertexAlphas||n.batchingColor?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==z?"#define TONE_MAPPING":"",n.toneMapping!==z?Qr.tonemapping_pars_fragment:"",n.toneMapping!==z?nl("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Qr.colorspace_pars_fragment,Js("linearToOutputTexel",n.outputColorSpace),il(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(ll).join("\n")}o=ml(o);o=cl(o,n);o=ul(o,n);s=ml(s);s=cl(s,n);s=ul(s,n);o=vl(o);s=vl(s);if(n.isRawShaderMaterial!==true){v="#version 300 es\n";_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_;g=["#define varying in",n.glslVersion===De?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===De?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g}const E=v+_+o;const S=v+g+s;const M=Ys(i,i.VERTEX_SHADER,E);const T=Ys(i,i.FRAGMENT_SHADER,S);i.attachShader(h,M);i.attachShader(h,T);n.index0AttributeName!==void 0?i.bindAttribLocation(h,0,n.index0AttributeName):n.morphTargets===true&&i.bindAttribLocation(h,0,"position");i.linkProgram(h);function x(t){if(e.debug.checkShaderErrors){const n=i.getProgramInfoLog(h)||"";const a=i.getShaderInfoLog(M)||"";const r=i.getShaderInfoLog(T)||"";const o=n.trim();const s=a.trim();const l=r.trim();let c=true;let d=true;if(i.getProgramParameter(h,i.LINK_STATUS)===false){c=false;if(typeof e.debug.onShaderError==="function")e.debug.onShaderError(i,h,M,T);else{const e=Qs(i,M,"vertex");const n=Qs(i,T,"fragment");Y("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(h,i.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}}else o!==""?w("WebGLProgram: Program Info Log:",o):s!==""&&l!==""||(d=false);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}i.deleteShader(M);i.deleteShader(T);R=new WebGLUniforms(i,h);A=sl(i,h)}let R;this.getUniforms=function(){R===void 0&&x(this);return R};let A;this.getAttributes=function(){A===void 0&&x(this);return A};let b=n.rendererExtensionParallelShaderCompile===false;this.isReady=function(){b===false&&(b=i.getProgramParameter(h,Ks));return b};this.destroy=function(){a.releaseStatesOfProgram(this);i.deleteProgram(h);this.program=void 0};this.type=n.shaderType;this.name=n.shaderName;this.id=qs++;this.cacheKey=t;this.usedTimes=1;this.program=h;this.vertexShader=M;this.fragmentShader=T;return this}let Dl=0;class WebGLShaderCache{constructor(){this.shaderCache=new Map;this.materialCache=new Map}update(e){const t=e.vertexShader;const n=e.fragmentShader;const a=this._getShaderStage(t);const i=this._getShaderStage(n);const r=this._getShaderCacheForMaterial(e);if(r.has(a)===false){r.add(a);a.usedTimes++}if(r.has(i)===false){r.add(i);i.usedTimes++}return this}remove(e){const t=this.materialCache.get(e);for(const e of t){e.usedTimes--;e.usedTimes===0&&this.shaderCache.delete(e.code)}this.materialCache.delete(e);return this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear();this.materialCache.clear()}_getShaderCacheForMaterial(e){const t=this.materialCache;let n=t.get(e);if(n===void 0){n=new Set;t.set(e,n)}return n}_getShaderStage(e){const t=this.shaderCache;let n=t.get(e);if(n===void 0){n=new WebGLShaderStage(e);t.set(e,n)}return n}}class WebGLShaderStage{constructor(e){this.id=Dl++;this.code=e;this.usedTimes=0}}function wl(e,t,n,a,i,r){const o=new we;const s=new WebGLShaderCache;const l=new Set;const c=[];const f=new Map;const u=a.logarithmicDepthBuffer;let p=a.precision;const m={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distance",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function _(e){l.add(e);return e===0?"uv":`uv${e}`}function g(i,o,c,f,g){const S=f.fog;const M=g.geometry;const T=i.isMeshStandardMaterial||i.isMeshLambertMaterial||i.isMeshPhongMaterial?f.environment:null;const x=i.isMeshStandardMaterial||i.isMeshLambertMaterial&&!i.envMap||i.isMeshPhongMaterial&&!i.envMap;const R=t.get(i.envMap||T,x);const A=!R||R.mapping!==d?null:R.image.height;const b=m[i.type];if(i.precision!==null){p=a.getMaxPrecision(i.precision);p!==i.precision&&w("WebGLProgram.getParameters:",i.precision,"not supported, using",p,"instead.")}const C=M.morphAttributes.position||M.morphAttributes.normal||M.morphAttributes.color;const P=C!==void 0?C.length:0;let L=0;M.morphAttributes.position!==void 0&&(L=1);M.morphAttributes.normal!==void 0&&(L=2);M.morphAttributes.color!==void 0&&(L=3);let U,D;let I,N;if(b){const e=to[b];U=e.vertexShader;D=e.fragmentShader}else{U=i.vertexShader;D=i.fragmentShader;s.update(i);I=s.getVertexShaderID(i);N=s.getFragmentShaderID(i)}const y=e.getRenderTarget();const F=e.state.buffers.depth.getReversed();const O=g.isInstancedMesh===true;const B=g.isBatchedMesh===true;const H=!!i.map;const V=!!i.matcap;const W=!!R;const k=!!i.aoMap;const X=!!i.lightMap;const Y=!!i.bumpMap;const K=!!i.normalMap;const q=!!i.displacementMap;const j=!!i.emissiveMap;const Z=!!i.metalnessMap;const $=!!i.roughnessMap;const Q=i.anisotropy>0;const J=i.clearcoat>0;const ee=i.dispersion>0;const te=i.iridescence>0;const ne=i.sheen>0;const ae=i.transmission>0;const ie=Q&&!!i.anisotropyMap;const re=J&&!!i.clearcoatMap;const oe=J&&!!i.clearcoatNormalMap;const se=J&&!!i.clearcoatRoughnessMap;const le=te&&!!i.iridescenceMap;const ce=te&&!!i.iridescenceThicknessMap;const de=ne&&!!i.sheenColorMap;const fe=ne&&!!i.sheenRoughnessMap;const ue=!!i.specularMap;const pe=!!i.specularColorMap;const me=!!i.specularIntensityMap;const he=ae&&!!i.transmissionMap;const _e=ae&&!!i.thicknessMap;const ge=!!i.gradientMap;const ve=!!i.alphaMap;const Ee=i.alphaTest>0;const Se=!!i.alphaHash;const Me=!!i.extensions;let Te=z;i.toneMapped&&(y!==null&&y.isXRRenderTarget!==true||(Te=e.toneMapping));const xe={shaderID:b,shaderType:i.type,shaderName:i.name,vertexShader:U,fragmentShader:D,defines:i.defines,customVertexShaderID:I,customFragmentShaderID:N,isRawShaderMaterial:i.isRawShaderMaterial===true,glslVersion:i.glslVersion,precision:p,batching:B,batchingColor:B&&g._colorsTexture!==null,instancing:O,instancingColor:O&&g.instanceColor!==null,instancingMorph:O&&g.morphTexture!==null,outputColorSpace:y===null?e.outputColorSpace:y.isXRRenderTarget===true?y.texture.colorSpace:G,alphaToCoverage:!!i.alphaToCoverage,map:H,matcap:V,envMap:W,envMapMode:W&&R.mapping,envMapCubeUVHeight:A,aoMap:k,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:q,emissiveMap:j,normalMapObjectSpace:K&&i.normalMapType===Fe,normalMapTangentSpace:K&&i.normalMapType===ye,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:ie,clearcoat:J,clearcoatMap:re,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:fe,specularMap:ue,specularColorMap:pe,specularIntensityMap:me,transmission:ae,transmissionMap:he,thicknessMap:_e,gradientMap:ge,opaque:i.transparent===false&&i.blending===Ne&&i.alphaToCoverage===false,alphaMap:ve,alphaTest:Ee,alphaHash:Se,combine:i.combine,mapUv:H&&_(i.map.channel),aoMapUv:k&&_(i.aoMap.channel),lightMapUv:X&&_(i.lightMap.channel),bumpMapUv:Y&&_(i.bumpMap.channel),normalMapUv:K&&_(i.normalMap.channel),displacementMapUv:q&&_(i.displacementMap.channel),emissiveMapUv:j&&_(i.emissiveMap.channel),metalnessMapUv:Z&&_(i.metalnessMap.channel),roughnessMapUv:$&&_(i.roughnessMap.channel),anisotropyMapUv:ie&&_(i.anisotropyMap.channel),clearcoatMapUv:re&&_(i.clearcoatMap.channel),clearcoatNormalMapUv:oe&&_(i.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&_(i.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&_(i.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&_(i.iridescenceThicknessMap.channel),sheenColorMapUv:de&&_(i.sheenColorMap.channel),sheenRoughnessMapUv:fe&&_(i.sheenRoughnessMap.channel),specularMapUv:ue&&_(i.specularMap.channel),specularColorMapUv:pe&&_(i.specularColorMap.channel),specularIntensityMapUv:me&&_(i.specularIntensityMap.channel),transmissionMapUv:he&&_(i.transmissionMap.channel),thicknessMapUv:_e&&_(i.thicknessMap.channel),alphaMapUv:ve&&_(i.alphaMap.channel),vertexTangents:!!M.attributes.tangent&&(K||Q),vertexColors:i.vertexColors,vertexAlphas:i.vertexColors===true&&!!M.attributes.color&&M.attributes.color.itemSize===4,pointsUvs:g.isPoints===true&&!!M.attributes.uv&&(H||ve),fog:!!S,useFog:i.fog===true,fogExp2:!!S&&S.isFogExp2,flatShading:i.wireframe===false&&(i.flatShading===true||M.attributes.normal===void 0&&K===false&&(i.isMeshLambertMaterial||i.isMeshPhongMaterial||i.isMeshStandardMaterial||i.isMeshPhysicalMaterial)),sizeAttenuation:i.sizeAttenuation===true,logarithmicDepthBuffer:u,reversedDepthBuffer:F,skinning:g.isSkinnedMesh===true,morphTargets:M.morphAttributes.position!==void 0,morphNormals:M.morphAttributes.normal!==void 0,morphColors:M.morphAttributes.color!==void 0,morphTargetsCount:P,morphTextureStride:L,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numSpotLightMaps:o.spotLightMap.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numSpotLightShadowsWithMaps:o.numSpotLightShadowsWithMaps,numLightProbes:o.numLightProbes,numClippingPlanes:r.numPlanes,numClipIntersection:r.numIntersection,dithering:i.dithering,shadowMapEnabled:e.shadowMap.enabled&&c.length>0,shadowMapType:e.shadowMap.type,toneMapping:Te,decodeVideoTexture:H&&i.map.isVideoTexture===true&&v.getTransfer(i.map.colorSpace)===E,decodeVideoTextureEmissive:j&&i.emissiveMap.isVideoTexture===true&&v.getTransfer(i.emissiveMap.colorSpace)===E,premultipliedAlpha:i.premultipliedAlpha,doubleSided:i.side===Ie,flipSided:i.side===h,useDepthPacking:i.depthPacking>=0,depthPacking:i.depthPacking||0,index0AttributeName:i.index0AttributeName,extensionClipCullDistance:Me&&i.extensions.clipCullDistance===true&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Me&&i.extensions.multiDraw===true||B)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:i.customProgramCacheKey()};xe.vertexUv1s=l.has(1);xe.vertexUv2s=l.has(2);xe.vertexUv3s=l.has(3);l.clear();return xe}function S(t){const n=[];if(t.shaderID)n.push(t.shaderID);else{n.push(t.customVertexShaderID);n.push(t.customFragmentShaderID)}if(t.defines!==void 0)for(const e in t.defines){n.push(e);n.push(t.defines[e])}if(t.isRawShaderMaterial===false){M(n,t);T(n,t);n.push(e.outputColorSpace)}n.push(t.customProgramCacheKey);return n.join()}function M(e,t){e.push(t.precision);e.push(t.outputColorSpace);e.push(t.envMapMode);e.push(t.envMapCubeUVHeight);e.push(t.mapUv);e.push(t.alphaMapUv);e.push(t.lightMapUv);e.push(t.aoMapUv);e.push(t.bumpMapUv);e.push(t.normalMapUv);e.push(t.displacementMapUv);e.push(t.emissiveMapUv);e.push(t.metalnessMapUv);e.push(t.roughnessMapUv);e.push(t.anisotropyMapUv);e.push(t.clearcoatMapUv);e.push(t.clearcoatNormalMapUv);e.push(t.clearcoatRoughnessMapUv);e.push(t.iridescenceMapUv);e.push(t.iridescenceThicknessMapUv);e.push(t.sheenColorMapUv);e.push(t.sheenRoughnessMapUv);e.push(t.specularMapUv);e.push(t.specularColorMapUv);e.push(t.specularIntensityMapUv);e.push(t.transmissionMapUv);e.push(t.thicknessMapUv);e.push(t.combine);e.push(t.fogExp2);e.push(t.sizeAttenuation);e.push(t.morphTargetsCount);e.push(t.morphAttributeCount);e.push(t.numDirLights);e.push(t.numPointLights);e.push(t.numSpotLights);e.push(t.numSpotLightMaps);e.push(t.numHemiLights);e.push(t.numRectAreaLights);e.push(t.numDirLightShadows);e.push(t.numPointLightShadows);e.push(t.numSpotLightShadows);e.push(t.numSpotLightShadowsWithMaps);e.push(t.numLightProbes);e.push(t.shadowMapType);e.push(t.toneMapping);e.push(t.numClippingPlanes);e.push(t.numClipIntersection);e.push(t.depthPacking)}function T(e,t){o.disableAll();t.instancing&&o.enable(0);t.instancingColor&&o.enable(1);t.instancingMorph&&o.enable(2);t.matcap&&o.enable(3);t.envMap&&o.enable(4);t.normalMapObjectSpace&&o.enable(5);t.normalMapTangentSpace&&o.enable(6);t.clearcoat&&o.enable(7);t.iridescence&&o.enable(8);t.alphaTest&&o.enable(9);t.vertexColors&&o.enable(10);t.vertexAlphas&&o.enable(11);t.vertexUv1s&&o.enable(12);t.vertexUv2s&&o.enable(13);t.vertexUv3s&&o.enable(14);t.vertexTangents&&o.enable(15);t.anisotropy&&o.enable(16);t.alphaHash&&o.enable(17);t.batching&&o.enable(18);t.dispersion&&o.enable(19);t.batchingColor&&o.enable(20);t.gradientMap&&o.enable(21);e.push(o.mask);o.disableAll();t.fog&&o.enable(0);t.useFog&&o.enable(1);t.flatShading&&o.enable(2);t.logarithmicDepthBuffer&&o.enable(3);t.reversedDepthBuffer&&o.enable(4);t.skinning&&o.enable(5);t.morphTargets&&o.enable(6);t.morphNormals&&o.enable(7);t.morphColors&&o.enable(8);t.premultipliedAlpha&&o.enable(9);t.shadowMapEnabled&&o.enable(10);t.doubleSided&&o.enable(11);t.flipSided&&o.enable(12);t.useDepthPacking&&o.enable(13);t.dithering&&o.enable(14);t.transmission&&o.enable(15);t.sheen&&o.enable(16);t.opaque&&o.enable(17);t.pointsUvs&&o.enable(18);t.decodeVideoTexture&&o.enable(19);t.decodeVideoTextureEmissive&&o.enable(20);t.alphaToCoverage&&o.enable(21);e.push(o.mask)}function x(e){const t=m[e.type];let n;if(t){const e=to[t];n=Oe.clone(e.uniforms)}else n=e.uniforms;return n}function R(t,n){let a=f.get(n);if(a!==void 0)++a.usedTimes;else{a=new Ul(e,n,t,i);c.push(a);f.set(n,a)}return a}function A(e){if(--e.usedTimes===0){const t=c.indexOf(e);c[t]=c[c.length-1];c.pop();f.delete(e.cacheKey);e.destroy()}}function b(e){s.remove(e)}function C(){s.dispose()}return{getParameters:g,getProgramCacheKey:S,getUniforms:x,acquireProgram:R,releaseProgram:A,releaseShaderCache:b,programs:c,dispose:C}}function Il(){let e=new WeakMap;function t(t){return e.has(t)}function n(t){let n=e.get(t);if(n===void 0){n={};e.set(t,n)}return n}function a(t){e.delete(t)}function i(t,n,a){e.get(t)[n]=a}function r(){e=new WeakMap}return{has:t,get:n,remove:a,update:i,dispose:r}}function Nl(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function yl(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Fl(){const e=[];let t=0;const n=[];const a=[];const i=[];function r(){t=0;n.length=0;a.length=0;i.length=0}function o(e){let t=0;e.isInstancedMesh&&(t+=2);e.isSkinnedMesh&&(t+=1);return t}function s(n,a,i,r,s,l){let c=e[t];if(c===void 0){c={id:n.id,object:n,geometry:a,material:i,materialVariant:o(n),groupOrder:r,renderOrder:n.renderOrder,z:s,group:l};e[t]=c}else{c.id=n.id;c.object=n;c.geometry=a;c.material=i;c.materialVariant=o(n);c.groupOrder=r;c.renderOrder=n.renderOrder;c.z=s;c.group=l}t++;return c}function l(e,t,r,o,l,c){const d=s(e,t,r,o,l,c);r.transmission>0?a.push(d):r.transparent===true?i.push(d):n.push(d)}function c(e,t,r,o,l,c){const d=s(e,t,r,o,l,c);r.transmission>0?a.unshift(d):r.transparent===true?i.unshift(d):n.unshift(d)}function d(e,t){n.length>1&&n.sort(e||Nl);a.length>1&&a.sort(t||yl);i.length>1&&i.sort(t||yl)}function f(){for(let n=t,a=e.length;n=a.length){i=new Fl;a.push(i)}else i=a[n];return i}function n(){e=new WeakMap}return{get:t,dispose:n}}function Bl(){const e={};return{get:function(t){if(e[t.id]!==void 0)return e[t.id];let a;switch(t.type){case"DirectionalLight":a={direction:new r,color:new n};break;case"SpotLight":a={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":a={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":a={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":a={color:new n,position:new r,halfWidth:new r,halfHeight:new r};break}e[t.id]=a;return a}}}function Gl(){const e={};return{get:function(n){if(e[n.id]!==void 0)return e[n.id];let a;switch(n.type){case"DirectionalLight":a={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"SpotLight":a={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":a={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3};break}e[n.id]=a;return a}}}let Hl=0;function Vl(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function Wl(e){const t=new Bl;const n=Gl();const a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new r);const i=new r;const o=new c;const s=new c;function l(i){let r=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0;let c=0;let d=0;let f=0;let u=0;let p=0;let m=0;let h=0;let _=0;let g=0;let v=0;i.sort(Vl);for(let e=0,E=i.length;e0)if(e.has("OES_texture_float_linear")===true){a.rectAreaLTC1=Jr.LTC_FLOAT_1;a.rectAreaLTC2=Jr.LTC_FLOAT_2}else{a.rectAreaLTC1=Jr.LTC_HALF_1;a.rectAreaLTC2=Jr.LTC_HALF_2}a.ambient[0]=r;a.ambient[1]=o;a.ambient[2]=s;const E=a.hash;if(E.directionalLength!==l||E.pointLength!==c||E.spotLength!==d||E.rectAreaLength!==f||E.hemiLength!==u||E.numDirectionalShadows!==p||E.numPointShadows!==m||E.numSpotShadows!==h||E.numSpotMaps!==_||E.numLightProbes!==v){a.directional.length=l;a.spot.length=d;a.rectArea.length=f;a.point.length=c;a.hemi.length=u;a.directionalShadow.length=p;a.directionalShadowMap.length=p;a.pointShadow.length=m;a.pointShadowMap.length=m;a.spotShadow.length=h;a.spotShadowMap.length=h;a.directionalShadowMatrix.length=p;a.pointShadowMatrix.length=m;a.spotLightMatrix.length=h+_-g;a.spotLightMap.length=_;a.numSpotLightShadowsWithMaps=g;a.numLightProbes=v;E.directionalLength=l;E.pointLength=c;E.spotLength=d;E.rectAreaLength=f;E.hemiLength=u;E.numDirectionalShadows=p;E.numPointShadows=m;E.numSpotShadows=h;E.numSpotMaps=_;E.numLightProbes=v;a.version=Hl++}}function d(e,t){let n=0;let r=0;let l=0;let c=0;let d=0;const f=t.matrixWorldInverse;for(let t=0,u=e.length;t=i.length){r=new kl(e);i.push(r)}else r=i[a];return r}function a(){t=new WeakMap}return{get:n,dispose:a}}const Xl="void main() {\n\tgl_Position = vec4( position, 1.0 );\n}";const Yl="uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}";const Kl=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)];const ql=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)];const jl=new c;const Zl=new r;const $l=new r;function Ql(e,n,a){let i=new Ge;const r=new t,o=new t,s=new le,l=new He,c=new Ve,d={},f=a.maxTextureSize;const p={[T]:h,[h]:T,[Ie]:Ie};const _=new m({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:Xl,fragmentShader:Yl});const g=_.clone();g.defines.HORIZONTAL_PASS=1;const v=new W;v.setAttribute("position",new K(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const E=new u(v,_);const S=this;this.enabled=false;this.autoUpdate=true;this.needsUpdate=false;this.type=Ce;let M=this.type;this.render=function(t,n,a){if(S.enabled===false)return;if(S.autoUpdate===false&&S.needsUpdate===false)return;if(t.length===0)return;if(this.type===We){w("WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead.");this.type=Ce}const l=e.getRenderTarget();const c=e.getActiveCubeFace();const d=e.getActiveMipmapLevel();const u=e.state;u.setBlending($);u.buffers.depth.getReversed()===true?u.buffers.color.setClear(0,0,0,0):u.buffers.color.setClear(1,1,1,1);u.buffers.depth.setTest(true);u.setScissorTest(false);const p=M!==this.type;p&&n.traverse((function(e){e.material&&(Array.isArray(e.material)?e.material.forEach((e=>e.needsUpdate=true)):e.material.needsUpdate=true)}));for(let l=0,c=t.length;lf||r.y>f){if(r.x>f){o.x=Math.floor(f/m.x);r.x=o.x*m.x;d.mapSize.x=o.x}if(r.y>f){o.y=Math.floor(f/m.y);r.y=o.y*m.y;d.mapSize.y=o.y}}const h=e.state.buffers.depth.getReversed();d.camera._reversedDepth=h;if(d.map===null||p===true){if(d.map!==null){if(d.map.depthTexture!==null){d.map.depthTexture.dispose();d.map.depthTexture=null}d.map.dispose()}if(this.type===be){if(c.isPointLight){w("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}d.map=new q(r.x,r.y,{format:Be,type:C,minFilter:V,magFilter:V,generateMipmaps:false});d.map.texture.name=c.name+".shadowMap";d.map.depthTexture=new Me(r.x,r.y,U);d.map.depthTexture.name=c.name+".shadowMapDepth";d.map.depthTexture.format=ke;d.map.depthTexture.compareFunction=null;d.map.depthTexture.minFilter=ze;d.map.depthTexture.magFilter=ze}else{if(c.isPointLight){d.map=new WebGLCubeRenderTarget(r.x);d.map.depthTexture=new Xe(r.x,Ye)}else{d.map=new q(r.x,r.y);d.map.depthTexture=new Me(r.x,r.y,Ye)}d.map.depthTexture.name=c.name+".shadowMap";d.map.depthTexture.format=ke;if(this.type===Ce){d.map.depthTexture.compareFunction=h?xe:Re;d.map.depthTexture.minFilter=V;d.map.depthTexture.magFilter=V}else{d.map.depthTexture.compareFunction=null;d.map.depthTexture.minFilter=ze;d.map.depthTexture.magFilter=ze}}d.camera.updateProjectionMatrix()}const _=d.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t<_;t++){if(d.map.isWebGLCubeRenderTarget){e.setRenderTarget(d.map,t);e.clear()}else{if(t===0){e.setRenderTarget(d.map);e.clear()}const n=d.getViewport(t);s.set(o.x*n.x,o.y*n.y,o.x*n.z,o.y*n.w);u.viewport(s)}if(c.isPointLight){const e=d.camera;const n=d.matrix;const a=c.distance||e.far;if(a!==e.far){e.far=a;e.updateProjectionMatrix()}Zl.setFromMatrixPosition(c.matrixWorld);e.position.copy(Zl);$l.copy(e.position);$l.add(Kl[t]);e.up.copy(ql[t]);e.lookAt($l);e.updateMatrixWorld();n.makeTranslation(-Zl.x,-Zl.y,-Zl.z);jl.multiplyMatrices(e.projectionMatrix,e.matrixWorldInverse);d._frustum.setFromProjectionMatrix(jl,e.coordinateSystem,e.reversedDepth)}else d.updateMatrices(c);i=d.getFrustum();A(n,a,d.camera,c,this.type)}d.isPointLightShadow!==true&&this.type===be&&x(d,a);d.needsUpdate=false}M=this.type;S.needsUpdate=false;e.setRenderTarget(l,c,d)};function x(t,a){const i=n.update(E);if(_.defines.VSM_SAMPLES!==t.blurSamples){_.defines.VSM_SAMPLES=t.blurSamples;g.defines.VSM_SAMPLES=t.blurSamples;_.needsUpdate=true;g.needsUpdate=true}t.mapPass===null&&(t.mapPass=new q(r.x,r.y,{format:Be,type:C}));_.uniforms.shadow_pass.value=t.map.depthTexture;_.uniforms.resolution.value=t.mapSize;_.uniforms.radius.value=t.radius;e.setRenderTarget(t.mapPass);e.clear();e.renderBufferDirect(a,null,i,_,E,null);g.uniforms.shadow_pass.value=t.mapPass.texture;g.uniforms.resolution.value=t.mapSize;g.uniforms.radius.value=t.radius;e.setRenderTarget(t.map);e.clear();e.renderBufferDirect(a,null,i,g,E,null)}function R(t,n,a,i){let r=null;const o=a.isPointLight===true?t.customDistanceMaterial:t.customDepthMaterial;if(o!==void 0)r=o;else{r=a.isPointLight===true?c:l;if(e.localClippingEnabled&&n.clipShadows===true&&Array.isArray(n.clippingPlanes)&&n.clippingPlanes.length!==0||n.displacementMap&&n.displacementScale!==0||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||n.alphaToCoverage===true){const e=r.uuid,t=n.uuid;let a=d[e];if(a===void 0){a={};d[e]=a}let i=a[t];if(i===void 0){i=r.clone();a[t]=i;n.addEventListener("dispose",b)}r=i}}r.visible=n.visible;r.wireframe=n.wireframe;r.side=i===be?n.shadowSide!==null?n.shadowSide:n.side:n.shadowSide!==null?n.shadowSide:p[n.side];r.alphaMap=n.alphaMap;r.alphaTest=n.alphaToCoverage===true?.5:n.alphaTest;r.map=n.map;r.clipShadows=n.clipShadows;r.clippingPlanes=n.clippingPlanes;r.clipIntersection=n.clipIntersection;r.displacementMap=n.displacementMap;r.displacementScale=n.displacementScale;r.displacementBias=n.displacementBias;r.wireframeLinewidth=n.wireframeLinewidth;r.linewidth=n.linewidth;if(a.isPointLight===true&&r.isMeshDistanceMaterial===true){const t=e.properties.get(r);t.light=a}return r}function A(t,a,r,o,s){if(t.visible===false)return;const l=t.layers.test(a.layers);if(l&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===be)&&(!t.frustumCulled||i.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,t.matrixWorld);const i=n.update(t);const l=t.material;if(Array.isArray(l)){const n=i.groups;for(let c=0,d=n.length;c=1}else if(F.indexOf("OpenGL ES")!==-1){y=parseFloat(/^OpenGL ES (\d)/.exec(F)[1]);N=y>=2}let O=null;let B={};const G=e.getParameter(e.SCISSOR_BOX);const H=e.getParameter(e.VIEWPORT);const V=(new le).fromArray(G);const W=(new le).fromArray(H);function k(t,n,a,i){const r=new Uint8Array(4);const o=e.createTexture();e.bindTexture(t,o);e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST);e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||i.height>n)&&(a=n/Math.max(i.width,i.height));if(a<1){if(typeof HTMLImageElement!=="undefined"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement!=="undefined"&&e instanceof HTMLCanvasElement||typeof ImageBitmap!=="undefined"&&e instanceof ImageBitmap||typeof VideoFrame!=="undefined"&&e instanceof VideoFrame){const n=Math.floor(a*i.width);const r=Math.floor(a*i.height);u===void 0&&(u=h(n,r));const o=t?h(n,r):u;o.width=n;o.height=r;const s=o.getContext("2d");s.drawImage(e,0,0,n,r);w("WebGLRenderer: Texture has been resized from ("+i.width+"x"+i.height+") to ("+n+"x"+r+").");return o}"data"in e&&w("WebGLRenderer: Image in DataTexture is too big ("+i.width+"x"+i.height+").");return e}return e}function g(e){return e.generateMipmaps}function S(t){e.generateMipmap(t)}function M(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function T(t,a,i,r,o=false){if(t!==null){if(e[t]!==void 0)return e[t];w("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=a;if(a===e.RED){i===e.FLOAT&&(s=e.R32F);i===e.HALF_FLOAT&&(s=e.R16F);i===e.UNSIGNED_BYTE&&(s=e.R8)}if(a===e.RED_INTEGER){i===e.UNSIGNED_BYTE&&(s=e.R8UI);i===e.UNSIGNED_SHORT&&(s=e.R16UI);i===e.UNSIGNED_INT&&(s=e.R32UI);i===e.BYTE&&(s=e.R8I);i===e.SHORT&&(s=e.R16I);i===e.INT&&(s=e.R32I)}if(a===e.RG){i===e.FLOAT&&(s=e.RG32F);i===e.HALF_FLOAT&&(s=e.RG16F);i===e.UNSIGNED_BYTE&&(s=e.RG8)}if(a===e.RG_INTEGER){i===e.UNSIGNED_BYTE&&(s=e.RG8UI);i===e.UNSIGNED_SHORT&&(s=e.RG16UI);i===e.UNSIGNED_INT&&(s=e.RG32UI);i===e.BYTE&&(s=e.RG8I);i===e.SHORT&&(s=e.RG16I);i===e.INT&&(s=e.RG32I)}if(a===e.RGB_INTEGER){i===e.UNSIGNED_BYTE&&(s=e.RGB8UI);i===e.UNSIGNED_SHORT&&(s=e.RGB16UI);i===e.UNSIGNED_INT&&(s=e.RGB32UI);i===e.BYTE&&(s=e.RGB8I);i===e.SHORT&&(s=e.RGB16I);i===e.INT&&(s=e.RGB32I)}if(a===e.RGBA_INTEGER){i===e.UNSIGNED_BYTE&&(s=e.RGBA8UI);i===e.UNSIGNED_SHORT&&(s=e.RGBA16UI);i===e.UNSIGNED_INT&&(s=e.RGBA32UI);i===e.BYTE&&(s=e.RGBA8I);i===e.SHORT&&(s=e.RGBA16I);i===e.INT&&(s=e.RGBA32I)}if(a===e.RGB){i===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5);i===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)}if(a===e.RGBA){const t=o?Ae:v.getTransfer(r);i===e.FLOAT&&(s=e.RGBA32F);i===e.HALF_FLOAT&&(s=e.RGBA16F);i===e.UNSIGNED_BYTE&&(s=t===E?e.SRGB8_ALPHA8:e.RGBA8);i===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4);i===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float");return s}function x(t,n){let a;if(t){if(n===null||n===Ye||n===Nt)a=e.DEPTH24_STENCIL8;else if(n===U)a=e.DEPTH32F_STENCIL8;else if(n===yt){a=e.DEPTH24_STENCIL8;w("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")}}else n===null||n===Ye||n===Nt?a=e.DEPTH_COMPONENT24:n===U?a=e.DEPTH_COMPONENT32F:n===yt&&(a=e.DEPTH_COMPONENT16);return a}function R(e,t){return g(e)===true||e.isFramebufferTexture&&e.minFilter!==ze&&e.minFilter!==V?Math.log2(Math.max(t.width,t.height))+1:e.mipmaps!==void 0&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function A(e){const t=e.target;t.removeEventListener("dispose",A);P(t);t.isVideoTexture&&f.delete(t)}function C(e){const t=e.target;t.removeEventListener("dispose",C);I(t)}function P(e){const t=i.get(e);if(t.__webglInit===void 0)return;const n=e.source;const a=p.get(n);if(a){const i=a[t.__cacheKey];i.usedTimes--;i.usedTimes===0&&D(e);Object.keys(a).length===0&&p.delete(n)}i.remove(e)}function D(t){const n=i.get(t);e.deleteTexture(n.__webglTexture);const a=t.source;const r=p.get(a);delete r[n.__cacheKey];s.memory.textures--}function I(t){const n=i.get(t);if(t.depthTexture){t.depthTexture.dispose();i.remove(t.depthTexture)}if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let a=0;a=r.maxTextures&&w("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+r.maxTextures);N+=1;return e}function O(e){const t=[];t.push(e.wrapS);t.push(e.wrapT);t.push(e.wrapR||0);t.push(e.magFilter);t.push(e.minFilter);t.push(e.anisotropy);t.push(e.internalFormat);t.push(e.format);t.push(e.type);t.push(e.generateMipmaps);t.push(e.premultiplyAlpha);t.push(e.flipY);t.push(e.unpackAlignment);t.push(e.colorSpace);return t.join()}function B(t,n){const r=i.get(t);t.isVideoTexture&&pe(t);if(t.isRenderTargetTexture===false&&t.isExternalTexture!==true&&t.version>0&&r.__version!==t.version){const e=t.image;if(e===null)w("WebGLRenderer: Texture marked for update but no image data found.");else{if(e.complete!==false){Q(r,t,n);return}w("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(r.__webglTexture=t.sourceTexture?t.sourceTexture:null);a.bindTexture(e.TEXTURE_2D,r.__webglTexture,e.TEXTURE0+n)}function H(t,n){const r=i.get(t);if(t.isRenderTargetTexture===false&&t.version>0&&r.__version!==t.version)Q(r,t,n);else{t.isExternalTexture&&(r.__webglTexture=t.sourceTexture?t.sourceTexture:null);a.bindTexture(e.TEXTURE_2D_ARRAY,r.__webglTexture,e.TEXTURE0+n)}}function W(t,n){const r=i.get(t);t.isRenderTargetTexture===false&&t.version>0&&r.__version!==t.version?Q(r,t,n):a.bindTexture(e.TEXTURE_3D,r.__webglTexture,e.TEXTURE0+n)}function k(t,n){const r=i.get(t);t.isCubeDepthTexture!==true&&t.version>0&&r.__version!==t.version?J(r,t,n):a.bindTexture(e.TEXTURE_CUBE_MAP,r.__webglTexture,e.TEXTURE0+n)}const z={[Bt]:e.REPEAT,[Ot]:e.CLAMP_TO_EDGE,[Ft]:e.MIRRORED_REPEAT};const X={[ze]:e.NEAREST,[Vt]:e.NEAREST_MIPMAP_NEAREST,[Ht]:e.NEAREST_MIPMAP_LINEAR,[V]:e.LINEAR,[Gt]:e.LINEAR_MIPMAP_NEAREST,[te]:e.LINEAR_MIPMAP_LINEAR};const K={[Kt]:e.NEVER,[Yt]:e.ALWAYS,[Xt]:e.LESS,[Re]:e.LEQUAL,[zt]:e.EQUAL,[xe]:e.GEQUAL,[kt]:e.GREATER,[Wt]:e.NOTEQUAL};function q(t,a){a.type!==U||n.has("OES_texture_float_linear")!==false||a.magFilter!==V&&a.magFilter!==Gt&&a.magFilter!==Ht&&a.magFilter!==te&&a.minFilter!==V&&a.minFilter!==Gt&&a.minFilter!==Ht&&a.minFilter!==te||w("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.");e.texParameteri(t,e.TEXTURE_WRAP_S,z[a.wrapS]);e.texParameteri(t,e.TEXTURE_WRAP_T,z[a.wrapT]);t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,z[a.wrapR]);e.texParameteri(t,e.TEXTURE_MAG_FILTER,X[a.magFilter]);e.texParameteri(t,e.TEXTURE_MIN_FILTER,X[a.minFilter]);if(a.compareFunction){e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE);e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,K[a.compareFunction])}if(n.has("EXT_texture_filter_anisotropic")===true){if(a.magFilter===ze)return;if(a.minFilter!==Ht&&a.minFilter!==te)return;if(a.type===U&&n.has("OES_texture_float_linear")===false)return;if(a.anisotropy>1||i.get(a).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(a.anisotropy,r.getMaxAnisotropy()));i.get(a).__currentAnisotropy=a.anisotropy}}}function j(t,n){let a=false;if(t.__webglInit===void 0){t.__webglInit=true;n.addEventListener("dispose",A)}const i=n.source;let r=p.get(i);if(r===void 0){r={};p.set(i,r)}const o=O(n);if(o!==t.__cacheKey){if(r[o]===void 0){r[o]={texture:e.createTexture(),usedTimes:0};s.memory.textures++;a=true}r[o].usedTimes++;const i=r[t.__cacheKey];if(i!==void 0){r[t.__cacheKey].usedTimes--;i.usedTimes===0&&D(n)}t.__cacheKey=o;t.__webglTexture=r[o].texture}return a}function Z(e,t,n){return Math.floor(Math.floor(e/n)/t)}function $(t,n,i,r){const o=4;const s=t.updateRanges;if(s.length===0)a.texSubImage2D(e.TEXTURE_2D,0,0,0,n.width,n.height,i,r,n.data);else{s.sort(((e,t)=>e.start-t.start));let l=0;for(let e=1;e0){C&&P&&a.texStorage2D(e.TEXTURE_2D,U,E,A[0].width,A[0].height);for(let t=0,n=A.length;t0){const i=Zt(M.width,M.height,n.format,n.type);for(const r of n.layerUpdates){const n=M.data.subarray(r*i/M.data.BYTES_PER_ELEMENT,(r+1)*i/M.data.BYTES_PER_ELEMENT);a.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,r,M.width,M.height,1,m,n)}n.clearLayerUpdates()}else a.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,M.width,M.height,p.depth,m,M.data)}else a.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,E,M.width,M.height,p.depth,0,M.data,0,0);else w("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else C?L&&a.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,M.width,M.height,p.depth,m,h,M.data):a.texImage3D(e.TEXTURE_2D_ARRAY,t,E,M.width,M.height,p.depth,0,m,h,M.data)}}else{C&&P&&a.texStorage2D(e.TEXTURE_2D,U,E,A[0].width,A[0].height);for(let t=0,i=A.length;t0){const t=Zt(p.width,p.height,n.format,n.type);for(const i of n.layerUpdates){const n=p.data.subarray(i*t/p.data.BYTES_PER_ELEMENT,(i+1)*t/p.data.BYTES_PER_ELEMENT);a.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,i,p.width,p.height,1,m,h,n)}n.clearLayerUpdates()}else a.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,p.width,p.height,p.depth,m,h,p.data)}else a.texImage3D(e.TEXTURE_2D_ARRAY,0,E,p.width,p.height,p.depth,0,m,h,p.data);else if(n.isData3DTexture)if(C){P&&a.texStorage3D(e.TEXTURE_3D,U,E,p.width,p.height,p.depth);L&&a.texSubImage3D(e.TEXTURE_3D,0,0,0,0,p.width,p.height,p.depth,m,h,p.data)}else a.texImage3D(e.TEXTURE_3D,0,E,p.width,p.height,p.depth,0,m,h,p.data);else if(n.isFramebufferTexture){if(P)if(C)a.texStorage2D(e.TEXTURE_2D,U,E,p.width,p.height);else{let t=p.width,n=p.height;for(let i=0;i>=1;n>>=1}}}else if(A.length>0){if(C&&P){const t=he(A[0]);a.texStorage2D(e.TEXTURE_2D,U,E,t.width,t.height)}for(let t=0,n=A.length;t0&&L++;const t=he(m[0]);a.texStorage2D(e.TEXTURE_CUBE_MAP,L,x,t.width,t.height)}for(let t=0;t<6;t++)if(p){A?P&&a.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,m[t].width,m[t].height,E,M,m[t].data):a.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,x,m[t].width,m[t].height,0,E,M,m[t].data);for(let n=0;n>d);const i=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?a.texImage3D(c,d,p,t,i,n.depth,0,f,u,null):a.texImage2D(c,d,p,t,i,0,f,u,null)}a.bindFramebuffer(e.FRAMEBUFFER,t);ue(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,fe(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d);a.bindFramebuffer(e.FRAMEBUFFER,null)}function ne(t,n,a){e.bindRenderbuffer(e.RENDERBUFFER,t);if(n.depthBuffer){const i=n.depthTexture;const r=i&&i.isDepthTexture?i.type:null;const o=x(n.stencilBuffer,r);const s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;ue(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,fe(n),o,n.width,n.height):a?e.renderbufferStorageMultisample(e.RENDERBUFFER,fe(n),o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height);e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let i=0;i{delete n.__boundDepthTexture;delete n.__depthDisposeCallback;e.removeEventListener("dispose",t)};e.addEventListener("dispose",t);n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer)if(r)for(let e=0;e<6;e++)ae(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?ae(n.__webglFramebuffer[0],t,0):ae(n.__webglFramebuffer,t,0)}else if(r){n.__webglDepthbuffer=[];for(let i=0;i<6;i++){a.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[i]);if(n.__webglDepthbuffer[i]===void 0){n.__webglDepthbuffer[i]=e.createRenderbuffer();ne(n.__webglDepthbuffer[i],t,false)}else{const a=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;const r=n.__webglDepthbuffer[i];e.bindRenderbuffer(e.RENDERBUFFER,r);e.framebufferRenderbuffer(e.FRAMEBUFFER,a,e.RENDERBUFFER,r)}}}else{const i=t.texture.mipmaps;i&&i.length>0?a.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):a.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer);if(n.__webglDepthbuffer===void 0){n.__webglDepthbuffer=e.createRenderbuffer();ne(n.__webglDepthbuffer,t,false)}else{const a=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;const i=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,i);e.framebufferRenderbuffer(e.FRAMEBUFFER,a,e.RENDERBUFFER,i)}}a.bindFramebuffer(e.FRAMEBUFFER,null)}function re(t,n,a){const r=i.get(t);n!==void 0&&ee(r.__webglFramebuffer,t,t.texture,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,0);a!==void 0&&ie(t)}function oe(t){const n=t.texture;const r=i.get(t);const l=i.get(n);t.addEventListener("dispose",C);const c=t.textures;const d=t.isWebGLCubeRenderTarget===true;const f=c.length>1;if(!f){l.__webglTexture===void 0&&(l.__webglTexture=e.createTexture());l.__version=n.version;s.memory.textures++}if(d){r.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){r.__webglFramebuffer[t]=[];for(let a=0;a0){r.__webglFramebuffer=[];for(let t=0;t0&&ue(t)===false){r.__webglMultisampledFramebuffer=e.createFramebuffer();r.__webglColorRenderbuffer=[];a.bindFramebuffer(e.FRAMEBUFFER,r.__webglMultisampledFramebuffer);for(let n=0;n0)for(let i=0;i0)for(let a=0;a0)if(ue(t)===false){const n=t.textures;const r=t.width;const o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;const d=i.get(t);const f=n.length>1;if(f)for(let t=0;t0?a.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):a.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let a=0;a0&&n.has("WEBGL_multisampled_render_to_texture")===true&&t.__useRenderToTexture!==false}function pe(e){const t=s.render.frame;if(f.get(e)!==t){f.set(e,t);e.update()}}function me(e,t){const n=e.colorSpace;const a=e.format;const i=e.type;if(e.isCompressedTexture===true||e.isVideoTexture===true)return t;n!==G&&n!==qt&&(v.getTransfer(n)===E?a===b&&i===L||w("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):Y("WebGLTextures: Unsupported texture color space:",n));return t}function he(e){if(typeof HTMLImageElement!=="undefined"&&e instanceof HTMLImageElement){d.width=e.naturalWidth||e.width;d.height=e.naturalHeight||e.height}else if(typeof VideoFrame!=="undefined"&&e instanceof VideoFrame){d.width=e.displayWidth;d.height=e.displayHeight}else{d.width=e.width;d.height=e.height}return d}this.allocateTextureUnit=F;this.resetTextureUnits=y;this.setTexture2D=B;this.setTexture2DArray=H;this.setTexture3D=W;this.setTextureCube=k;this.rebindTextures=re;this.setupRenderTarget=oe;this.updateRenderTargetMipmap=se;this.updateMultisampleRenderTarget=de;this.setupDepthRenderbuffer=ie;this.setupFrameBufferTexture=ee;this.useMultisampledRTT=ue;this.isReversedDepthBuffer=function(){return a.buffers.depth.getReversed()}}function nc(e,t){function n(n,a=qt){let i;const r=v.getTransfer(a);if(n===L)return e.UNSIGNED_BYTE;if(n===$t)return e.UNSIGNED_SHORT_4_4_4_4;if(n===Qt)return e.UNSIGNED_SHORT_5_5_5_1;if(n===Jt)return e.UNSIGNED_INT_5_9_9_9_REV;if(n===tn)return e.UNSIGNED_INT_10F_11F_11F_REV;if(n===nn)return e.BYTE;if(n===an)return e.SHORT;if(n===yt)return e.UNSIGNED_SHORT;if(n===R)return e.INT;if(n===Ye)return e.UNSIGNED_INT;if(n===U)return e.FLOAT;if(n===C)return e.HALF_FLOAT;if(n===rn)return e.ALPHA;if(n===on)return e.RGB;if(n===b)return e.RGBA;if(n===ke)return e.DEPTH_COMPONENT;if(n===jt)return e.DEPTH_STENCIL;if(n===sn)return e.RED;if(n===ln)return e.RED_INTEGER;if(n===Be)return e.RG;if(n===cn)return e.RG_INTEGER;if(n===un)return e.RGBA_INTEGER;if(n===pn||n===mn||n===hn||n===_n)if(r===E){i=t.get("WEBGL_compressed_texture_s3tc_srgb");if(i===null)return null;if(n===pn)return i.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===mn)return i.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===hn)return i.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===_n)return i.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else{i=t.get("WEBGL_compressed_texture_s3tc");if(i===null)return null;if(n===pn)return i.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===mn)return i.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===hn)return i.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===_n)return i.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(n===gn||n===vn||n===En||n===Sn){i=t.get("WEBGL_compressed_texture_pvrtc");if(i===null)return null;if(n===gn)return i.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===vn)return i.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===En)return i.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===Sn)return i.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(n===Mn||n===Tn||n===xn||n===Rn||n===An||n===bn||n===Cn){i=t.get("WEBGL_compressed_texture_etc");if(i===null)return null;if(n===Mn||n===Tn)return r===E?i.COMPRESSED_SRGB8_ETC2:i.COMPRESSED_RGB8_ETC2;if(n===xn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:i.COMPRESSED_RGBA8_ETC2_EAC;if(n===Rn)return i.COMPRESSED_R11_EAC;if(n===An)return i.COMPRESSED_SIGNED_R11_EAC;if(n===bn)return i.COMPRESSED_RG11_EAC;if(n===Cn)return i.COMPRESSED_SIGNED_RG11_EAC}if(n===Pn||n===Ln||n===Un||n===Dn||n===wn||n===In||n===Nn||n===yn||n===Fn||n===On||n===Bn||n===Gn||n===Hn||n===Vn){i=t.get("WEBGL_compressed_texture_astc");if(i===null)return null;if(n===Pn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:i.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===Ln)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:i.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Un)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:i.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===Dn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:i.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===wn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:i.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===In)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:i.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Nn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:i.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===yn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:i.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Fn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:i.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===On)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:i.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Bn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:i.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Gn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:i.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Hn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:i.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Vn)return r===E?i.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:i.COMPRESSED_RGBA_ASTC_12x12_KHR}if(n===Wn||n===kn||n===zn){i=t.get("EXT_texture_compression_bptc");if(i===null)return null;if(n===Wn)return r===E?i.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:i.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===kn)return i.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===zn)return i.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}if(n===Xn||n===Yn||n===Kn||n===qn){i=t.get("EXT_texture_compression_rgtc");if(i===null)return null;if(n===Xn)return i.COMPRESSED_RED_RGTC1_EXT;if(n===Yn)return i.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Kn)return i.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===qn)return i.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}return n===Nt?e.UNSIGNED_INT_24_8:e[n]!==void 0?e[n]:null}return{convert:n}}const ac="\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}";const ic="\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}";class WebXRDepthSensing{constructor(){ +/** + * An opaque texture representing the depth of the user's environment. + * + * @type {?ExternalTexture} + */ +this.texture=null; +/** + * A plane mesh for visualizing the depth texture. + * + * @type {?Mesh} + */this.mesh=null; +/** + * The depth near value. + * + * @type {number} + */this.depthNear=0; +/** + * The depth near far. + * + * @type {number} + */this.depthFar=0} +/** + * Inits the depth sensing module + * + * @param {XRWebGLDepthInformation} depthData - The XR depth data. + * @param {XRRenderState} renderState - The XR render state. + */init(e,t){if(this.texture===null){const n=new jn(e.texture);if(e.depthNear!==t.depthNear||e.depthFar!==t.depthFar){this.depthNear=e.depthNear;this.depthFar=e.depthFar}this.texture=n}} +/** + * Returns a plane mesh that visualizes the depth texture. + * + * @param {ArrayCamera} cameraXR - The XR camera. + * @return {?Mesh} The plane mesh. + */getMesh(e){if(this.texture!==null&&this.mesh===null){const t=e.cameras[0].viewport;const n=new m({vertexShader:ac,fragmentShader:ic,uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new u(new S(20,20),n)}return this.mesh}reset(){this.texture=null;this.mesh=null}getDepthTexture(){return this.texture}}class WebXRManager extends Zn{ +/** + * Constructs a new WebGL renderer. + * + * @param {WebGLRenderer} renderer - The renderer. + * @param {WebGL2RenderingContext} gl - The rendering context. + */ +constructor(e,n){super();const a=this;let i=null;let o=1;let s=null;let l="local-floor";let c=1;let d=null;let f=null;let u=null;let p=null;let m=null;let h=null;const _=typeof XRWebGLBinding!=="undefined";const g=new WebXRDepthSensing;const v={};const E=n.getContextAttributes();let S=null;let M=null;const T=[];const x=[];const R=new t;let A=null;const C=new k;C.viewport=new le;const P=new k;P.viewport=new le;const U=[C,P];const D=new $n;let I=null;let N=null; +/** + * Whether the manager's XR camera should be automatically updated or not. + * + * @type {boolean} + * @default true + */this.cameraAutoUpdate=true; +/** + * This flag notifies the renderer to be ready for XR rendering. Set it to `true` + * if you are going to use XR in your app. + * + * @type {boolean} + * @default false + */this.enabled=false; +/** + * Whether XR presentation is active or not. + * + * @type {boolean} + * @readonly + * @default false + */this.isPresenting=false; +/** + * Returns a group representing the `target ray` space of the XR controller. + * Use this space for visualizing 3D objects that support the user in pointing + * tasks like UI interaction. + * + * @param {number} index - The index of the controller. + * @return {Group} A group representing the `target ray` space. + */this.getController=function(e){let t=T[e];if(t===void 0){t=new Qn;T[e]=t}return t.getTargetRaySpace()}; +/** + * Returns a group representing the `grip` space of the XR controller. + * Use this space for visualizing 3D objects that support the user in pointing + * tasks like UI interaction. + * + * Note: If you want to show something in the user's hand AND offer a + * pointing ray at the same time, you'll want to attached the handheld object + * to the group returned by `getControllerGrip()` and the ray to the + * group returned by `getController()`. The idea is to have two + * different groups in two different coordinate spaces for the same WebXR + * controller. + * + * @param {number} index - The index of the controller. + * @return {Group} A group representing the `grip` space. + */this.getControllerGrip=function(e){let t=T[e];if(t===void 0){t=new Qn;T[e]=t}return t.getGripSpace()}; +/** + * Returns a group representing the `hand` space of the XR controller. + * Use this space for visualizing 3D objects that support the user in pointing + * tasks like UI interaction. + * + * @param {number} index - The index of the controller. + * @return {Group} A group representing the `hand` space. + */this.getHand=function(e){let t=T[e];if(t===void 0){t=new Qn;T[e]=t}return t.getHandSpace()};function y(e){const t=x.indexOf(e.inputSource);if(t===-1)return;const n=T[t];if(n!==void 0){n.update(e.inputSource,e.frame,d||s);n.dispatchEvent({type:e.type,data:e.inputSource})}}function F(){i.removeEventListener("select",y);i.removeEventListener("selectstart",y);i.removeEventListener("selectend",y);i.removeEventListener("squeeze",y);i.removeEventListener("squeezestart",y);i.removeEventListener("squeezeend",y);i.removeEventListener("end",F);i.removeEventListener("inputsourceschange",O);for(let e=0;e=0){x[a]=null;T[a].disconnect(n)}}for(let t=0;t=x.length){x.push(n);a=e;break}if(x[e]===null){x[e]=n;a=e;break}}if(a===-1)break}const i=T[a];i&&i.connect(n)}}const B=new r;const G=new r; +/** + * Assumes 2 cameras that are parallel and share an X-axis, and that + * the cameras' projection and world matrices have already been set. + * And that near and far planes are identical for both cameras. + * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765 + * + * @param {ArrayCamera} camera - The camera to update. + * @param {PerspectiveCamera} cameraL - The left camera. + * @param {PerspectiveCamera} cameraR - The right camera. + */function H(e,t,n){B.setFromMatrixPosition(t.matrixWorld);G.setFromMatrixPosition(n.matrixWorld);const a=B.distanceTo(G);const i=t.projectionMatrix.elements;const r=n.projectionMatrix.elements;const o=i[14]/(i[10]-1);const s=i[14]/(i[10]+1);const l=(i[9]+1)/i[5];const c=(i[9]-1)/i[5];const d=(i[8]-1)/i[0];const f=(r[8]+1)/r[0];const u=o*d;const p=o*f;const m=a/(-d+f);const h=m*-d;t.matrixWorld.decompose(e.position,e.quaternion,e.scale);e.translateX(h);e.translateZ(m);e.matrixWorld.compose(e.position,e.quaternion,e.scale);e.matrixWorldInverse.copy(e.matrixWorld).invert();if(i[10]===-1){e.projectionMatrix.copy(t.projectionMatrix);e.projectionMatrixInverse.copy(t.projectionMatrixInverse)}else{const t=o+m;const n=s+m;const i=u-h;const r=p+(a-h);const d=l*s/n*t;const f=c*s/n*t;e.projectionMatrix.makePerspective(i,r,d,f,t,n);e.projectionMatrixInverse.copy(e.projectionMatrix).invert()}}function V(e,t){t===null?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix);e.matrixWorldInverse.copy(e.matrixWorld).invert()} +/** + * Updates the state of the XR camera. Use this method on app level if you + * set `cameraAutoUpdate` to `false`. The method requires the non-XR + * camera of the scene as a parameter. The passed in camera's transformation + * is automatically adjusted to the position of the XR camera when calling + * this method. + * + * @param {Camera} camera - The camera. + */this.updateCamera=function(e){if(i===null)return;let t=e.near;let n=e.far;if(g.texture!==null){g.depthNear>0&&(t=g.depthNear);g.depthFar>0&&(n=g.depthFar)}D.near=P.near=C.near=t;D.far=P.far=C.far=n;if(I!==D.near||N!==D.far){i.updateRenderState({depthNear:D.near,depthFar:D.far});I=D.near;N=D.far}D.layers.mask=e.layers.mask|6;C.layers.mask=D.layers.mask&-5;P.layers.mask=D.layers.mask&-3;const a=e.parent;const r=D.cameras;V(D,a);for(let e=0;e0&&(e.alphaTest.value=a.alphaTest);const i=t.get(a);const r=i.envMap;const o=i.envMapRotation;if(r){e.envMap.value=r;rc.copy(o);rc.x*=-1;rc.y*=-1;rc.z*=-1;if(r.isCubeTexture&&r.isRenderTargetTexture===false){rc.y*=-1;rc.z*=-1}e.envMapRotation.value.setFromMatrix4(oc.makeRotationFromEuler(rc));e.flipEnvMap.value=r.isCubeTexture&&r.isRenderTargetTexture===false?-1:1;e.reflectivity.value=a.reflectivity;e.ior.value=a.ior;e.refractionRatio.value=a.refractionRatio}if(a.lightMap){e.lightMap.value=a.lightMap;e.lightMapIntensity.value=a.lightMapIntensity;n(a.lightMap,e.lightMapTransform)}if(a.aoMap){e.aoMap.value=a.aoMap;e.aoMapIntensity.value=a.aoMapIntensity;n(a.aoMap,e.aoMapTransform)}}function o(e,t){e.diffuse.value.copy(t.color);e.opacity.value=t.opacity;if(t.map){e.map.value=t.map;n(t.map,e.mapTransform)}}function s(e,t){e.dashSize.value=t.dashSize;e.totalSize.value=t.dashSize+t.gapSize;e.scale.value=t.scale}function l(e,t,a,i){e.diffuse.value.copy(t.color);e.opacity.value=t.opacity;e.size.value=t.size*a;e.scale.value=i*.5;if(t.map){e.map.value=t.map;n(t.map,e.uvTransform)}if(t.alphaMap){e.alphaMap.value=t.alphaMap;n(t.alphaMap,e.alphaMapTransform)}t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}function c(e,t){e.diffuse.value.copy(t.color);e.opacity.value=t.opacity;e.rotation.value=t.rotation;if(t.map){e.map.value=t.map;n(t.map,e.mapTransform)}if(t.alphaMap){e.alphaMap.value=t.alphaMap;n(t.alphaMap,e.alphaMapTransform)}t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}function d(e,t){e.specular.value.copy(t.specular);e.shininess.value=Math.max(t.shininess,1e-4)}function f(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}function u(e,t){e.metalness.value=t.metalness;if(t.metalnessMap){e.metalnessMap.value=t.metalnessMap;n(t.metalnessMap,e.metalnessMapTransform)}e.roughness.value=t.roughness;if(t.roughnessMap){e.roughnessMap.value=t.roughnessMap;n(t.roughnessMap,e.roughnessMapTransform)}t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}function p(e,t,a){e.ior.value=t.ior;if(t.sheen>0){e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen);e.sheenRoughness.value=t.sheenRoughness;if(t.sheenColorMap){e.sheenColorMap.value=t.sheenColorMap;n(t.sheenColorMap,e.sheenColorMapTransform)}if(t.sheenRoughnessMap){e.sheenRoughnessMap.value=t.sheenRoughnessMap;n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)}}if(t.clearcoat>0){e.clearcoat.value=t.clearcoat;e.clearcoatRoughness.value=t.clearcoatRoughness;if(t.clearcoatMap){e.clearcoatMap.value=t.clearcoatMap;n(t.clearcoatMap,e.clearcoatMapTransform)}if(t.clearcoatRoughnessMap){e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap;n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)}if(t.clearcoatNormalMap){e.clearcoatNormalMap.value=t.clearcoatNormalMap;n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform);e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale);t.side===h&&e.clearcoatNormalScale.value.negate()}}t.dispersion>0&&(e.dispersion.value=t.dispersion);if(t.iridescence>0){e.iridescence.value=t.iridescence;e.iridescenceIOR.value=t.iridescenceIOR;e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0];e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1];if(t.iridescenceMap){e.iridescenceMap.value=t.iridescenceMap;n(t.iridescenceMap,e.iridescenceMapTransform)}if(t.iridescenceThicknessMap){e.iridescenceThicknessMap.value=t.iridescenceThicknessMap;n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)}}if(t.transmission>0){e.transmission.value=t.transmission;e.transmissionSamplerMap.value=a.texture;e.transmissionSamplerSize.value.set(a.width,a.height);if(t.transmissionMap){e.transmissionMap.value=t.transmissionMap;n(t.transmissionMap,e.transmissionMapTransform)}e.thickness.value=t.thickness;if(t.thicknessMap){e.thicknessMap.value=t.thicknessMap;n(t.thicknessMap,e.thicknessMapTransform)}e.attenuationDistance.value=t.attenuationDistance;e.attenuationColor.value.copy(t.attenuationColor)}if(t.anisotropy>0){e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation));if(t.anisotropyMap){e.anisotropyMap.value=t.anisotropyMap;n(t.anisotropyMap,e.anisotropyMapTransform)}}e.specularIntensity.value=t.specularIntensity;e.specularColor.value.copy(t.specularColor);if(t.specularColorMap){e.specularColorMap.value=t.specularColorMap;n(t.specularColorMap,e.specularColorMapTransform)}if(t.specularIntensityMap){e.specularIntensityMap.value=t.specularIntensityMap;n(t.specularIntensityMap,e.specularIntensityMapTransform)}}function m(e,t){t.matcap&&(e.matcap.value=t.matcap)}function _(e,n){const a=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(a.matrixWorld);e.nearDistance.value=a.shadow.camera.near;e.farDistance.value=a.shadow.camera.far}return{refreshFogUniforms:a,refreshMaterialUniforms:i}}function lc(e,t,n,a){let i={};let r={};let o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t){const n=t.program;a.uniformBlockBinding(e,n)}function c(e,n){let o=i[e.id];if(o===void 0){m(e);o=d(e);i[e.id]=o;e.addEventListener("dispose",_)}const s=n.program;a.updateUBOMapping(e,s);const l=t.render.frame;if(r[e.id]!==l){u(e);r[e.id]=l}}function d(t){const n=f();t.__bindingPointIndex=n;const a=e.createBuffer();const i=t.__size;const r=t.usage;e.bindBuffer(e.UNIFORM_BUFFER,a);e.bufferData(e.UNIFORM_BUFFER,i,r);e.bindBuffer(e.UNIFORM_BUFFER,null);e.bindBufferBase(e.UNIFORM_BUFFER,n,a);return a}function f(){for(let e=0;e0&&(n+=a-i);e.__size=n;e.__cache={};return this}function h(e){const t={boundary:0,storage:0};if(typeof e==="number"||typeof e==="boolean"){t.boundary=4;t.storage=4}else if(e.isVector2){t.boundary=8;t.storage=8}else if(e.isVector3||e.isColor){t.boundary=16;t.storage=12}else if(e.isVector4){t.boundary=16;t.storage=16}else if(e.isMatrix3){t.boundary=48;t.storage=48}else if(e.isMatrix4){t.boundary=64;t.storage=64}else e.isTexture?w("WebGLRenderer: Texture samplers can not be part of an uniforms group."):w("WebGLRenderer: Unsupported uniform value type.",e);return t}function _(t){const n=t.target;n.removeEventListener("dispose",_);const a=o.indexOf(n.__bindingPointIndex);o.splice(a,1);e.deleteBuffer(i[n.id]);delete i[n.id];delete r[n.id]}function g(){for(const t in i)e.deleteBuffer(i[t]);o=[];i={};r={}}return{bind:l,update:c,dispose:g}}const cc=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let uc=null;function pc(){if(uc===null){uc=new ta(cc,16,16,Be,C);uc.name="DFG_LUT";uc.minFilter=V;uc.magFilter=V;uc.wrapS=Ot;uc.wrapT=Ot;uc.generateMipmaps=false;uc.needsUpdate=true}return uc}class WebGLRenderer{ +/** + * Constructs a new WebGL renderer. + * + * @param {WebGLRenderer~Options} [parameters] - The configuration parameter. + */ +constructor(e={}){const{canvas:t=na(),context:a=null,depth:i=true,stencil:o=false,alpha:s=false,antialias:l=false,premultipliedAlpha:d=true,preserveDrawingBuffer:f=false,powerPreference:u="default",failIfMajorPerformanceCaveat:p=false,reversedDepthBuffer:m=false,outputBufferType:_=L}=e; +/** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */this.isWebGLRenderer=true;let g;if(a!==null){if(typeof WebGLRenderingContext!=="undefined"&&a instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");g=a.getContextAttributes().alpha}else g=s;const E=_;const S=new Set([un,cn,ln]);const M=new Set([L,Ye,yt,Nt,$t,Qt]);const x=new Uint32Array(4);const R=new Int32Array(4);let A=null;let b=null;const P=[];const U=[];let D=null; +/** + * A canvas where the renderer draws its output. This is automatically created by the renderer + * in the constructor (if not provided already); you just need to add it to your page like so: + * ```js + * document.body.appendChild( renderer.domElement ); + * ``` + * + * @type {HTMLCanvasElement|OffscreenCanvas} + */this.domElement=t; +/** + * A object with debug configuration settings. + * + * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are + * checked for errors during compilation and linkage process. It may be useful to disable + * this check in production for performance gain. It is strongly recommended to keep these + * checks enabled during development. If the shader does not compile and link, it will not + * work and associated material will not render. + * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that + * can be used for custom error reporting. The callback receives the WebGL context, an instance + * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader. + * Assigning a custom function disables the default error reporting. + * + * @type {Object} + */this.debug={ +/** + * Enables error checking and reporting when shader programs are being compiled. + * @type {boolean} + */ +checkShaderErrors:true, +/** + * Callback for custom error reporting. + * @type {?Function} + */ +onShaderError:null}; +/** + * Whether the renderer should automatically clear its output before rendering a frame or not. + * + * @type {boolean} + * @default true + */this.autoClear=true; +/** + * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear + * the color buffer or not. + * + * @type {boolean} + * @default true + */this.autoClearColor=true; +/** + * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear + * the depth buffer or not. + * + * @type {boolean} + * @default true + */this.autoClearDepth=true; +/** + * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear + * the stencil buffer or not. + * + * @type {boolean} + * @default true + */this.autoClearStencil=true; +/** + * Whether the renderer should sort objects or not. + * + * Note: Sorting is used to attempt to properly render objects that have some + * degree of transparency. By definition, sorting objects may not work in all + * cases. Depending on the needs of application, it may be necessary to turn + * off sorting and use other methods to deal with transparency rendering e.g. + * manually determining each object's rendering order. + * + * @type {boolean} + * @default true + */this.sortObjects=true; +/** + * User-defined clipping planes specified in world space. These planes apply globally. + * Points in space whose dot product with the plane is negative are cut away. + * + * @type {Array} + */this.clippingPlanes=[]; +/** + * Whether the renderer respects object-level clipping planes or not. + * + * @type {boolean} + * @default false + */this.localClippingEnabled=false; +/** + * The tone mapping technique of the renderer. + * + * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)} + * @default NoToneMapping + */this.toneMapping=z; +/** + * Exposure level of tone mapping. + * + * @type {number} + * @default 1 + */this.toneMappingExposure=1; +/** + * The normalized resolution scale for the transmission render target, measured in percentage + * of viewport dimensions. Lowering this value can result in significant performance improvements + * when using {@link MeshPhysicalMaterial#transmission}. + * + * @type {number} + * @default 1 + */this.transmissionResolutionScale=1;const I=this;let N=false;this._outputColorSpace=aa;let y=0;let F=0;let O=null;let B=-1;let H=null;const V=new le;const W=new le;let k=null;const X=new n(0);let K=0;let j=t.width;let Z=t.height;let $=1;let Q=null;let J=null;const ee=new le(0,0,j,Z);const ne=new le(0,0,j,Z);let ae=false;const ie=new Ge;let oe=false;let se=false;const ce=new c;const de=new r;const fe=new le;const ue={background:null,fog:null,environment:null,overrideMaterial:null,isScene:true};let pe=false;function me(){return O===null?$:1}let he=a;function _e(e,n){return t.getContext(e,n)}try{const e={alpha:true,depth:i,stencil:o,antialias:l,premultipliedAlpha:d,preserveDrawingBuffer:f,powerPreference:u,failIfMajorPerformanceCaveat:p};"setAttribute"in t&&t.setAttribute("data-engine",`three.js r${ia}`);t.addEventListener("webglcontextlost",ze,false);t.addEventListener("webglcontextrestored",Xe,false);t.addEventListener("webglcontextcreationerror",Ke,false);if(he===null){const t="webgl2";he=_e(t,e);if(he===null)throw _e(t)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(e){Y("WebGLRenderer: "+e.message);throw e}let ge,ve,Ee,Se;let Me,Te,xe,Re,Ae,be;let Ce,Pe,Le,Ue,De,we;let Ne,ye,Fe,Oe;let Be,He,Ve;function We(){ge=new wo(he);ge.init();Be=new nc(he,ge);ve=new lo(he,ge,e,Be);Ee=new Jl(he,ge);ve.reversedDepthBuffer&&m&&Ee.buffers.depth.setReversed(true);Se=new yo(he);Me=new Il;Te=new tc(he,ge,Ee,Me,ve,Be,Se);xe=new Do(I);Re=new ca(he);He=new oo(he,Re);Ae=new Io(he,Re,Se,He);be=new Oo(he,Ae,Re,He,Se);ye=new Fo(he,ve,Te);De=new co(Me);Ce=new wl(I,xe,ge,ve,He,De);Pe=new sc(I,Me);Le=new Ol;Ue=new zl(ge);Ne=new ro(I,xe,Ee,be,g,d);we=new Ql(I,be,ve);Ve=new lc(he,Se,ve,Ee);Fe=new so(he,ge,Se);Oe=new No(he,ge,Se);Se.programs=Ce.programs; +/** + * Holds details about the capabilities of the current rendering context. + * + * @name WebGLRenderer#capabilities + * @type {WebGLRenderer~Capabilities} + */I.capabilities=ve; +/** + * Provides methods for retrieving and testing WebGL extensions. + * + * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported + * and return the extension object if available. + * - `has(extensionName:string)`: returns `true` if the extension is supported. + * + * @name WebGLRenderer#extensions + * @type {Object} + */I.extensions=ge; +/** + * Used to track properties of other objects like native WebGL objects. + * + * @name WebGLRenderer#properties + * @type {Object} + */I.properties=Me; +/** + * Manages the render lists of the renderer. + * + * @name WebGLRenderer#renderLists + * @type {Object} + */I.renderLists=Le; +/** + * Interface for managing shadows. + * + * @name WebGLRenderer#shadowMap + * @type {WebGLRenderer~ShadowMap} + */I.shadowMap=we; +/** + * Interface for managing the WebGL state. + * + * @name WebGLRenderer#state + * @type {Object} + */I.state=Ee; +/** + * Holds a series of statistical information about the GPU memory + * and the rendering process. Useful for debugging and monitoring. + * + * By default these data are reset at each render call but when having + * multiple render passes per frame (e.g. when using post processing) it can + * be preferred to reset with a custom pattern. First, set `autoReset` to + * `false`. + * ```js + * renderer.info.autoReset = false; + * ``` + * Call `reset()` whenever you have finished to render a single frame. + * ```js + * renderer.info.reset(); + * ``` + * + * @name WebGLRenderer#info + * @type {WebGLRenderer~Info} + */I.info=Se}We();E!==L&&(D=new Go(E,t.width,t.height,i,o));const ke=new WebXRManager(I,he); +/** + * A reference to the XR manager. + * + * @type {WebXRManager} + */this.xr=ke;this.getContext=function(){return he};this.getContextAttributes=function(){return he.getContextAttributes()};this.forceContextLoss=function(){const e=ge.get("WEBGL_lose_context");e&&e.loseContext()};this.forceContextRestore=function(){const e=ge.get("WEBGL_lose_context");e&&e.restoreContext()};this.getPixelRatio=function(){return $}; +/** + * Sets the given pixel ratio and resizes the canvas if necessary. + * + * @param {number} value - The pixel ratio. + */this.setPixelRatio=function(e){if(e!==void 0){$=e;this.setSize(j,Z,false)}}; +/** + * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio. + * + * @param {Vector2} target - The method writes the result in this target object. + * @return {Vector2} The renderer's size in logical pixels. + */this.getSize=function(e){return e.set(j,Z)}; +/** + * Resizes the output canvas to (width, height) with device pixel ratio taken + * into account, and also sets the viewport to fit that size, starting in (0, + * 0). Setting `updateStyle` to false prevents any style changes to the output canvas. + * + * @param {number} width - The width in logical pixels. + * @param {number} height - The height in logical pixels. + * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not. + */this.setSize=function(e,n,a=true){if(ke.isPresenting)w("WebGLRenderer: Can't change size while VR device is presenting.");else{j=e;Z=n;t.width=Math.floor(e*$);t.height=Math.floor(n*$);if(a===true){t.style.width=e+"px";t.style.height=n+"px"}D!==null&&D.setSize(t.width,t.height);this.setViewport(0,0,e,n)}}; +/** + * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio. + * + * @param {Vector2} target - The method writes the result in this target object. + * @return {Vector2} The drawing buffer size. + */this.getDrawingBufferSize=function(e){return e.set(j*$,Z*$).floor()}; +/** + * This method allows to define the drawing buffer size by specifying + * width, height and pixel ratio all at once. The size of the drawing + * buffer is computed with this formula: + * ```js + * size.x = width * pixelRatio; + * size.y = height * pixelRatio; + * ``` + * + * @param {number} width - The width in logical pixels. + * @param {number} height - The height in logical pixels. + * @param {number} pixelRatio - The pixel ratio. + */this.setDrawingBufferSize=function(e,n,a){j=e;Z=n;$=a;t.width=Math.floor(e*a);t.height=Math.floor(n*a);this.setViewport(0,0,e,n)}; +/** + * Sets the post-processing effects to be applied after rendering. + * + * @param {Array} effects - An array of post-processing effects. + */this.setEffects=function(e){if(E!==L){if(e)for(let t=0;t} The precompiled materials. + */this.compile=function(e,t,n=null){n===null&&(n=e);b=Ue.get(n);b.init(t);U.push(b);n.traverseVisible((function(e){if(e.isLight&&e.layers.test(t.layers)){b.pushLight(e);e.castShadow&&b.pushShadow(e)}}));e!==n&&e.traverseVisible((function(e){if(e.isLight&&e.layers.test(t.layers)){b.pushLight(e);e.castShadow&&b.pushShadow(e)}}));b.setupLights();const a=new Set;e.traverse((function(e){if(!(e.isMesh||e.isPoints||e.isLine||e.isSprite))return;const t=e.material;if(t)if(Array.isArray(t))for(let i=0;i{function n(){a.forEach((function(e){const t=Me.get(e);const n=t.currentProgram;n.isReady()&&a.delete(e)}));a.size!==0?setTimeout(n,10):t(e)}ge.get("KHR_parallel_shader_compile")!==null?n():setTimeout(n,10)}))};let Qe=null;function Je(e){Qe&&Qe(e)}function et(){nt.stop()}function tt(){nt.start()}const nt=new la;nt.setAnimationLoop(Je);typeof self!=="undefined"&&nt.setContext(self) +/** + * Applications are advised to always define the animation loop + * with this method and not manually with `requestAnimationFrame()` + * for best compatibility. + * + * @param {?onAnimationCallback} callback - The application's animation loop. + */;this.setAnimationLoop=function(e){Qe=e;ke.setAnimationLoop(e);e===null?nt.stop():nt.start()};ke.addEventListener("sessionstart",et);ke.addEventListener("sessionend",tt); +/** + * Renders the given scene (or other type of 3D object) using the given camera. + * + * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget} + * or to the canvas as usual. + * + * By default render buffers are cleared before rendering but you can prevent + * this by setting the property `autoClear` to `false`. If you want to prevent + * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth` + * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}. + * + * @param {Object3D} scene - The scene to render. + * @param {Camera} camera - The camera. + */this.render=function(e,t){if(t!==void 0&&t.isCamera!==true){Y("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(N===true)return;const n=ke.enabled===true&&ke.isPresenting===true;const a=D!==null&&(O===null||n)&&D.begin(I,O);e.matrixWorldAutoUpdate===true&&e.updateMatrixWorld();t.parent===null&&t.matrixWorldAutoUpdate===true&&t.updateMatrixWorld();if(ke.enabled===true&&ke.isPresenting===true&&(D===null||D.isCompositing()===false)){ke.cameraAutoUpdate===true&&ke.updateCamera(t);t=ke.getCamera()}e.isScene===true&&e.onBeforeRender(I,e,t,O);b=Ue.get(e,U.length);b.init(t);U.push(b);ce.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse);ie.setFromProjectionMatrix(ce,oa,t.reversedDepth);se=this.localClippingEnabled;oe=De.init(this.clippingPlanes,se);A=Le.get(e,P.length);A.init();P.push(A);if(ke.enabled===true&&ke.isPresenting===true){const e=I.xr.getDepthSensingMesh();e!==null&&at(e,t,-Infinity,I.sortObjects)}at(e,t,0,I.sortObjects);A.finish();I.sortObjects===true&&A.sort(Q,J);pe=ke.enabled===false||ke.isPresenting===false||ke.hasDepthSensing()===false;pe&&Ne.addToRenderList(A,e);this.info.render.frame++;oe===true&&De.beginShadows();const i=b.state.shadowsArray;we.render(i,e,t);oe===true&&De.endShadows();this.info.autoReset===true&&this.info.reset();const r=a&&D.hasRenderPass();if(r===false){const n=A.opaque;const a=A.transmissive;b.setupLights();if(t.isArrayCamera){const i=t.cameras;if(a.length>0)for(let t=0,r=i.length;t0&&rt(n,a,e,t);pe&&Ne.render(e);it(A,e,t)}}if(O!==null&&F===0){Te.updateMultisampleRenderTarget(O);Te.updateRenderTargetMipmap(O)}a&&D.end(I);e.isScene===true&&e.onAfterRender(I,e,t);He.resetDefaultState();B=-1;H=null;U.pop();if(U.length>0){b=U[U.length-1];oe===true&&De.setGlobalState(I.clippingPlanes,b.state.camera)}else b=null;P.pop();A=P.length>0?P[P.length-1]:null};function at(e,t,n,a){if(e.visible===false)return;const i=e.layers.test(t.layers);if(i)if(e.isGroup)n=e.renderOrder;else if(e.isLOD)e.autoUpdate===true&&e.update(t);else if(e.isLight){b.pushLight(e);e.castShadow&&b.pushShadow(e)}else if(e.isSprite){if(!e.frustumCulled||ie.intersectsSprite(e)){a&&fe.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=be.update(e);const i=e.material;i.visible&&A.push(e,t,i,n,fe.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||ie.intersectsObject(e))){const t=be.update(e);const i=e.material;if(a){if(e.boundingSphere!==void 0){e.boundingSphere===null&&e.computeBoundingSphere();fe.copy(e.boundingSphere.center)}else{t.boundingSphere===null&&t.computeBoundingSphere();fe.copy(t.boundingSphere.center)}fe.applyMatrix4(e.matrixWorld).applyMatrix4(ce)}if(Array.isArray(i)){const a=t.groups;for(let r=0,o=a.length;r0&&ot(i,t,n);r.length>0&&ot(r,t,n);o.length>0&&ot(o,t,n);Ee.buffers.depth.setTest(true);Ee.buffers.depth.setMask(true);Ee.buffers.color.setMask(true);Ee.setPolygonOffset(false)}function rt(e,t,n,a){const i=n.isScene===true?n.overrideMaterial:null;if(i!==null)return;if(b.state.transmissionRenderTarget[a.id]===void 0){const e=ge.has("EXT_color_buffer_half_float")||ge.has("EXT_color_buffer_float");b.state.transmissionRenderTarget[a.id]=new q(1,1,{generateMipmaps:true,type:e?C:L,minFilter:te,samples:Math.max(4,ve.samples),stencilBuffer:o,resolveDepthBuffer:false,resolveStencilBuffer:false,colorSpace:v.workingColorSpace})}const r=b.state.transmissionRenderTarget[a.id];const s=a.viewport||V;r.setSize(s.z*I.transmissionResolutionScale,s.w*I.transmissionResolutionScale);const l=I.getRenderTarget();const c=I.getActiveCubeFace();const d=I.getActiveMipmapLevel();I.setRenderTarget(r);I.getClearColor(X);K=I.getClearAlpha();K<1&&I.setClearColor(16777215,.5);I.clear();pe&&Ne.render(n);const f=I.toneMapping;I.toneMapping=z;const u=a.viewport;a.viewport!==void 0&&(a.viewport=void 0);b.setupLightsView(a);oe===true&&De.setGlobalState(I.clippingPlanes,a);ot(e,n,a);Te.updateMultisampleRenderTarget(r);Te.updateRenderTargetMipmap(r);if(ge.has("WEBGL_multisampled_render_to_texture")===false){let e=false;for(let i=0,r=t.length;i0);const u=!!n.morphAttributes.position;const p=!!n.morphAttributes.normal;const m=!!n.morphAttributes.color;let h=z;a.toneMapped&&(O!==null&&O.isXRRenderTarget!==true||(h=I.toneMapping));const _=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color;const g=_!==void 0?_.length:0;const v=Me.get(a);const E=b.state.lights;if(oe===true&&(se===true||e!==H)){const t=e===H&&a.id===B;De.setState(a,e,t)}let S=false;if(a.version===v.__version)v.needsLights&&v.lightsStateVersion!==E.state.version||v.outputColorSpace!==s||i.isBatchedMesh&&v.batching===false?S=true:i.isBatchedMesh||v.batching!==true?i.isBatchedMesh&&v.batchingColor===true&&i.colorTexture===null||i.isBatchedMesh&&v.batchingColor===false&&i.colorTexture!==null||i.isInstancedMesh&&v.instancing===false?S=true:i.isInstancedMesh||v.instancing!==true?i.isSkinnedMesh&&v.skinning===false?S=true:i.isSkinnedMesh||v.skinning!==true?i.isInstancedMesh&&v.instancingColor===true&&i.instanceColor===null||i.isInstancedMesh&&v.instancingColor===false&&i.instanceColor!==null||i.isInstancedMesh&&v.instancingMorph===true&&i.morphTexture===null||i.isInstancedMesh&&v.instancingMorph===false&&i.morphTexture!==null||v.envMap!==c||a.fog===true&&v.fog!==r?S=true:v.numClippingPlanes===void 0||v.numClippingPlanes===De.numPlanes&&v.numIntersection===De.numIntersection?(v.vertexAlphas!==d||v.vertexTangents!==f||v.morphTargets!==u||v.morphNormals!==p||v.morphColors!==m||v.toneMapping!==h||v.morphTargetsCount!==g)&&(S=true):S=true:S=true:S=true:S=true;else{S=true;v.__version=a.version}let M=v.currentProgram;S===true&&(M=lt(a,t,i));let T=false;let x=false;let R=false;const A=M.getUniforms(),C=v.uniforms;if(Ee.useProgram(M.program)){T=true;x=true;R=true}if(a.id!==B){B=a.id;x=true}if(T||H!==e){const t=Ee.buffers.depth.getReversed();if(t&&e.reversedDepth!==true){e._reversedDepth=true;e.updateProjectionMatrix()}A.setValue(he,"projectionMatrix",e.projectionMatrix);A.setValue(he,"viewMatrix",e.matrixWorldInverse);const n=A.map.cameraPosition;n!==void 0&&n.setValue(he,de.setFromMatrixPosition(e.matrixWorld));ve.logarithmicDepthBuffer&&A.setValue(he,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2));(a.isMeshPhongMaterial||a.isMeshToonMaterial||a.isMeshLambertMaterial||a.isMeshBasicMaterial||a.isMeshStandardMaterial||a.isShaderMaterial)&&A.setValue(he,"isOrthographic",e.isOrthographicCamera===true);if(H!==e){H=e;x=true;R=true}}if(v.needsLights){E.state.directionalShadowMap.length>0&&A.setValue(he,"directionalShadowMap",E.state.directionalShadowMap,Te);E.state.spotShadowMap.length>0&&A.setValue(he,"spotShadowMap",E.state.spotShadowMap,Te);E.state.pointShadowMap.length>0&&A.setValue(he,"pointShadowMap",E.state.pointShadowMap,Te)}if(i.isSkinnedMesh){A.setOptional(he,i,"bindMatrix");A.setOptional(he,i,"bindMatrixInverse");const e=i.skeleton;if(e){e.boneTexture===null&&e.computeBoneTexture();A.setValue(he,"boneTexture",e.boneTexture,Te)}}if(i.isBatchedMesh){A.setOptional(he,i,"batchingTexture");A.setValue(he,"batchingTexture",i._matricesTexture,Te);A.setOptional(he,i,"batchingIdTexture");A.setValue(he,"batchingIdTexture",i._indirectTexture,Te);A.setOptional(he,i,"batchingColorTexture");i._colorsTexture!==null&&A.setValue(he,"batchingColorTexture",i._colorsTexture,Te)}const P=n.morphAttributes;P.position===void 0&&P.normal===void 0&&P.color===void 0||ye.update(i,n,M);if(x||v.receiveShadow!==i.receiveShadow){v.receiveShadow=i.receiveShadow;A.setValue(he,"receiveShadow",i.receiveShadow)}(a.isMeshStandardMaterial||a.isMeshLambertMaterial||a.isMeshPhongMaterial)&&a.envMap===null&&t.environment!==null&&(C.envMapIntensity.value=t.environmentIntensity);C.dfgLUT!==void 0&&(C.dfgLUT.value=pc());if(x){A.setValue(he,"toneMappingExposure",I.toneMappingExposure);v.needsLights&&ut(C,R);r&&a.fog===true&&Pe.refreshFogUniforms(C,r);Pe.refreshMaterialUniforms(C,a,$,Z,b.state.transmissionRenderTarget[e.id]);WebGLUniforms.upload(he,ct(v),C,Te)}if(a.isShaderMaterial&&a.uniformsNeedUpdate===true){WebGLUniforms.upload(he,ct(v),C,Te);a.uniformsNeedUpdate=false}a.isSpriteMaterial&&A.setValue(he,"center",i.center);A.setValue(he,"modelViewMatrix",i.modelViewMatrix);A.setValue(he,"normalMatrix",i.normalMatrix);A.setValue(he,"modelMatrix",i.matrixWorld);if(a.isShaderMaterial||a.isRawShaderMaterial){const e=a.uniformsGroups;for(let t=0,n=e.length;t0&&Te.useMultisampledRTT(e)===false?Me.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l;V.copy(e.viewport);W.copy(e.scissor);k=e.scissorTest}else{V.copy(ee).multiplyScalar($).floor();W.copy(ne).multiplyScalar($).floor();k=ae}n!==0&&(a=mt);const o=Ee.bindFramebuffer(he.FRAMEBUFFER,a);o&&Ee.drawBuffers(e,a);Ee.viewport(V);Ee.scissor(W);Ee.setScissorTest(k);if(i){const a=Me.get(e.texture);he.framebufferTexture2D(he.FRAMEBUFFER,he.COLOR_ATTACHMENT0,he.TEXTURE_CUBE_MAP_POSITIVE_X+t,a.__webglTexture,n)}else if(r){const a=t;for(let t=0;t1&&he.readBuffer(he.COLOR_ATTACHMENT0+s);if(!ve.textureFormatReadable(l)){Y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!ve.textureTypeReadable(c)){Y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}t>=0&&t<=e.width-a&&n>=0&&n<=e.height-i&&he.readPixels(t,n,a,i,Be.convert(l),Be.convert(c),r)}finally{const e=O!==null?Me.get(O).__webglFramebuffer:null;Ee.bindFramebuffer(he.FRAMEBUFFER,e)}}}; +/** + * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}. + * + * It is recommended to use this version of `readRenderTargetPixels()` whenever possible. + * + * @async + * @param {WebGLRenderTarget} renderTarget - The render target to read from. + * @param {number} x - The `x` coordinate of the copy region's origin. + * @param {number} y - The `y` coordinate of the copy region's origin. + * @param {number} width - The width of the copy region. + * @param {number} height - The height of the copy region. + * @param {TypedArray} buffer - The result buffer. + * @param {number} [activeCubeFaceIndex] - The active cube face index. + * @param {number} [textureIndex=0] - The texture index of an MRT render target. + * @return {Promise} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array. + */this.readRenderTargetPixelsAsync=async function(e,t,n,a,i,r,o,s=0){if(!(e&&e.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Me.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget&&o!==void 0&&(l=l[o]);if(l){if(t>=0&&t<=e.width-a&&n>=0&&n<=e.height-i){Ee.bindFramebuffer(he.FRAMEBUFFER,l);const o=e.textures[s];const c=o.format;const d=o.type;e.textures.length>1&&he.readBuffer(he.COLOR_ATTACHMENT0+s);if(!ve.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ve.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const f=he.createBuffer();he.bindBuffer(he.PIXEL_PACK_BUFFER,f);he.bufferData(he.PIXEL_PACK_BUFFER,r.byteLength,he.STREAM_READ);he.readPixels(t,n,a,i,Be.convert(c),Be.convert(d),0);const u=O!==null?Me.get(O).__webglFramebuffer:null;Ee.bindFramebuffer(he.FRAMEBUFFER,u);const p=he.fenceSync(he.SYNC_GPU_COMMANDS_COMPLETE,0);he.flush();await sa(he,p,4);he.bindBuffer(he.PIXEL_PACK_BUFFER,f);he.getBufferSubData(he.PIXEL_PACK_BUFFER,0,r);he.deleteBuffer(f);he.deleteSync(p);return r}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}}; +/** + * Copies pixels from the current bound framebuffer into the given texture. + * + * @param {FramebufferTexture} texture - The texture. + * @param {?Vector2} [position=null] - The start position of the copy operation. + * @param {number} [level=0] - The mip level. The default represents the base mip. + */this.copyFramebufferToTexture=function(e,t=null,n=0){const a=Math.pow(2,-n);const i=Math.floor(e.image.width*a);const r=Math.floor(e.image.height*a);const o=t!==null?t.x:0;const s=t!==null?t.y:0;Te.setTexture2D(e,0);he.copyTexSubImage2D(he.TEXTURE_2D,n,0,0,o,s,i,r);Ee.unbindTexture()};const ht=he.createFramebuffer();const _t=he.createFramebuffer(); +/** + * Copies data of the given source texture into a destination texture. + * + * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized + * {@link WebGLRenderer#initRenderTarget}. + * + * @param {Texture} srcTexture - The source texture. + * @param {Texture} dstTexture - The destination texture. + * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional. + * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional. + * @param {number} [srcLevel=0] - The source mipmap level to copy. + * @param {?number} [dstLevel=0] - The destination mipmap level. + */this.copyTextureToTexture=function(e,t,n=null,a=null,i=0,r=0){let o,s,l,c,d,f;let u,p,m;const h=e.isCompressedTexture?e.mipmaps[r]:e.image;if(n!==null){o=n.max.x-n.min.x;s=n.max.y-n.min.y;l=n.isBox3?n.max.z-n.min.z:1;c=n.min.x;d=n.min.y;f=n.isBox3?n.min.z:0}else{const t=Math.pow(2,-i);o=Math.floor(h.width*t);s=Math.floor(h.height*t);l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1;c=0;d=0;f=0}if(a!==null){u=a.x;p=a.y;m=a.z}else{u=0;p=0;m=0}const _=Be.convert(t.format);const g=Be.convert(t.type);let v;if(t.isData3DTexture){Te.setTexture3D(t,0);v=he.TEXTURE_3D}else if(t.isDataArrayTexture||t.isCompressedArrayTexture){Te.setTexture2DArray(t,0);v=he.TEXTURE_2D_ARRAY}else{Te.setTexture2D(t,0);v=he.TEXTURE_2D}he.pixelStorei(he.UNPACK_FLIP_Y_WEBGL,t.flipY);he.pixelStorei(he.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha);he.pixelStorei(he.UNPACK_ALIGNMENT,t.unpackAlignment);const E=he.getParameter(he.UNPACK_ROW_LENGTH);const S=he.getParameter(he.UNPACK_IMAGE_HEIGHT);const M=he.getParameter(he.UNPACK_SKIP_PIXELS);const T=he.getParameter(he.UNPACK_SKIP_ROWS);const x=he.getParameter(he.UNPACK_SKIP_IMAGES);he.pixelStorei(he.UNPACK_ROW_LENGTH,h.width);he.pixelStorei(he.UNPACK_IMAGE_HEIGHT,h.height);he.pixelStorei(he.UNPACK_SKIP_PIXELS,c);he.pixelStorei(he.UNPACK_SKIP_ROWS,d);he.pixelStorei(he.UNPACK_SKIP_IMAGES,f);const R=e.isDataArrayTexture||e.isData3DTexture;const A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Me.get(e);const a=Me.get(t);const h=Me.get(n.__renderTarget);const _=Me.get(a.__renderTarget);Ee.bindFramebuffer(he.READ_FRAMEBUFFER,h.__webglFramebuffer);Ee.bindFramebuffer(he.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n