From 2cad4069d0ec81a98ff8341d758cec7847c6aee9 Mon Sep 17 00:00:00 2001 From: Mattias Bodlund Date: Fri, 3 Jul 2026 17:19:01 +0200 Subject: [PATCH] na --- Gemfile | 3 + Gemfile.lock | 61 ++++++----- .../api/v1/leaderboard_controller.rb | 17 ++- app/controllers/game_controller.rb | 11 +- app/jobs/resolve_player_country_job.rb | 15 +++ app/models/player.rb | 8 ++ app/services/demo_activity.rb | 22 ++++ app/services/leaderboard_badges.rb | 102 ++++++++++++++++++ app/services/leaderboard_score.rb | 74 +++++++++++++ .../api/v1/leaderboard/index.json.jbuilder | 8 ++ config/country_headcounts.yml | 73 +++++++++++++ config/importmap.rb | 2 +- config/initializers/geocoder.rb | 18 ++++ .../20260703000000_add_country_to_players.rb | 6 ++ db/schema.rb | 4 +- docs/leaderboard_api.md | 57 ++++++++++ docs/leaderboard_api.pdf | Bin 0 -> 154850 bytes vendor/javascript/stimulus-use.js | 4 +- 18 files changed, 449 insertions(+), 36 deletions(-) create mode 100644 app/jobs/resolve_player_country_job.rb create mode 100644 app/services/demo_activity.rb create mode 100644 app/services/leaderboard_badges.rb create mode 100644 app/services/leaderboard_score.rb create mode 100644 config/country_headcounts.yml create mode 100644 config/initializers/geocoder.rb create mode 100644 db/migrate/20260703000000_add_country_to_players.rb create mode 100644 docs/leaderboard_api.md create mode 100644 docs/leaderboard_api.pdf diff --git a/Gemfile b/Gemfile index f7c9510..e2426ec 100644 --- a/Gemfile +++ b/Gemfile @@ -36,6 +36,9 @@ gem "acts_as_list" gem "date_validator" +# Resolve a visitor's country from their request IP [https://github.com/alexreisner/geocoder] +gem "geocoder" + gem "premailer-rails" gem "dkim" diff --git a/Gemfile.lock b/Gemfile.lock index 5e6a414..54af762 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -93,10 +93,11 @@ GEM builder (3.3.0) concurrent-ruby (1.3.7) connection_pool (3.0.2) - crass (1.0.6) + crass (1.0.7) css_parser (3.0.0) addressable ssrf_filter (~> 1.5) + csv (3.3.5) date (3.5.1) date_validator (0.12.0) activemodel (>= 3) @@ -117,6 +118,9 @@ GEM ffi (1.17.4-x86_64-darwin) ffi (1.17.4-x86_64-linux-gnu) ffi (1.17.4-x86_64-linux-musl) + geocoder (1.8.6) + base64 (>= 0.1.0) + csv (>= 3.0.0) globalid (1.4.0) activesupport (>= 6.1) htmlentities (4.4.2) @@ -152,14 +156,14 @@ GEM kaminari-core (= 1.2.2) kaminari-core (1.2.2) language_server-protocol (3.17.0.5) - lexxy (0.9.20) + lexxy (0.9.22) rails (>= 8.0.2) 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) + mail (2.9.1) logger mini_mime (>= 0.1.1) net-imap @@ -233,9 +237,6 @@ GEM actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack - psych (5.4.0) - date - stringio public_suffix (7.0.5) puma (8.0.2) nio4r (~> 2.0) @@ -280,9 +281,14 @@ GEM zeitwerk (~> 2.6) rainbow (3.1.1) rake (13.4.2) - rdoc (7.2.0) + rbs (4.0.3) + logger + prism (>= 1.6.0) + tsort + rdoc (8.0.0) erb - psych (>= 4.0.0) + prism (>= 1.6.0) + rbs (>= 4.0.0) tsort redis (5.4.1) redis-client (>= 0.22.0) @@ -293,7 +299,7 @@ GEM io-console (~> 0.5) request_store (1.7.0) rack (>= 1.4) - rubocop (1.88.0) + rubocop (1.88.1) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -335,13 +341,12 @@ GEM ssrf_filter (1.5.0) stimulus-rails (1.3.4) railties (>= 6.0.0) - stringio (3.2.0) thor (1.5.0) - thruster (0.1.21) - thruster (0.1.21-aarch64-linux) - thruster (0.1.21-arm64-darwin) - thruster (0.1.21-x86_64-darwin) - thruster (0.1.21-x86_64-linux) + thruster (0.1.22) + thruster (0.1.22-aarch64-linux) + thruster (0.1.22-arm64-darwin) + thruster (0.1.22-x86_64-darwin) + thruster (0.1.22-x86_64-linux) timeout (0.6.1) tsort (0.2.0) turbo-rails (2.0.23) @@ -384,6 +389,7 @@ DEPENDENCIES date_validator dkim dotenv-rails + geocoder image_processing (~> 1.2) importmap-rails jbuilder @@ -431,8 +437,9 @@ CHECKSUMS bundler (4.0.14) sha256=d09a0a965cf772266a7e49e83610be7c2f4e49e61134c42a56804bb383cc24b8 concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a - crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d + crass (1.0.7) sha256=94868719948664c89ddcaf0a37c65048413dfcb1c869470a5f7a7ceb5390b295 css_parser (3.0.0) sha256=eaf0e9283fd581d06e815235ceef4f0910c0b394c606355dbc69f93e84443885 + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 date_validator (0.12.0) sha256=68c9834da240347b9c17441c553a183572508617ebfbe8c020020f3192ce3058 dkim (1.1.0) sha256=74f2e3075c89cd2967995f3ee293da9dccccffee21ee593715a068ab39a717f8 @@ -449,6 +456,7 @@ CHECKSUMS ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496 ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e + geocoder (1.8.6) sha256=e0ca1554b499f466de9b003f7dff70f89a5888761c2ca68ed9f86b6e5e24e74c globalid (1.4.0) sha256=037f12fbf1d9d7a014d501c2d5c77356fd4ddd96d7a7991d6700bba96706f427 htmlentities (4.4.2) sha256=bbafbdf69f2eca9262be4efef7e43e6a1de54c95eb600f26984f71d2fe96c5c3 i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 @@ -463,11 +471,11 @@ CHECKSUMS kaminari-activerecord (1.2.2) sha256=0dd3a67bab356a356f36b3b7236bcb81cef313095365befe8e98057dd2472430 kaminari-core (1.2.2) sha256=3bd26fec7370645af40ca73b9426a448d09b8a8ba7afa9ba3c3e0d39cdbb83ff language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc - lexxy (0.9.20) sha256=31b4e50b68302e9a4d00b5a3e104f3b27a0682d43510a1e9e6673da695038e6e + lexxy (0.9.22) sha256=976c9c96e73078937b97942962ec80f32adfb59315921acaaeb30a4cb8a7306e 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 + mail (2.9.1) sha256=06574eca475253d6c18145dd70af80d0eb970182d55053497c5f4d797ea160e8 marcel (1.2.1) sha256=1678e9360e32f9eafa917c80029e2f6d10b2715c66a4b87b6d0da9b9cd1f859f mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef @@ -504,7 +512,6 @@ CHECKSUMS prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 propshaft (1.3.2) sha256=1d56a3e56a92c21bfc29caf07406b5386b00d4c47ddf357cf989a5a234b1389e - psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 puma (8.0.2) sha256=c8ed871dfbbe66448ea9ffd46692342d9804d4071522b52b5331b7b6e7b686fb racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f @@ -518,13 +525,14 @@ CHECKSUMS railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22 rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192 + rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 + rdoc (8.0.0) sha256=03bf8c08a9639658855a0cfd77c0abca8325c227693f7f33f82957811348c469 redis (5.4.1) sha256=b5e675b57ad22b15c9bcc765d5ac26f60b675408af916d31527af9bd5a81faae redis-client (0.30.0) sha256=743f11ed42f0a41a0341554087b077479fec7e2d47a7c123fd90a12c0db5e477 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 request_store (1.7.0) sha256=e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb - rubocop (1.88.0) sha256=e420ddf1662d0ef34bc8a2910ac4b396a7ddda0b51a708264405241734b08e0b + rubocop (1.88.1) sha256=726af773d6bc169ed3ff852f3ca020b7c58d39c34e7a8d879a8e0147cc994f26 rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rails (2.35.5) sha256=f00b3c936002ba8e9ac62e8607c54bb24cda44b36e41b9c7e4f3872e1b0f3fe3 @@ -535,13 +543,12 @@ CHECKSUMS sidekiq (8.1.6) sha256=be20cd051124b1a16cf97ea9157137abbd30a515c16a5ae9312d2eadd045e40f ssrf_filter (1.5.0) sha256=e03dcdb9d1730d7f6710532a606b3543df2a448a0293ce04a2d995523c5a97f6 stimulus-rails (1.3.4) sha256=765676ffa1f33af64ce026d26b48e8ffb2e0b94e0f50e9119e11d6107d67cb06 - stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 - thruster (0.1.21) sha256=dc67928f36e5894844579a95e45637a5091db7a7ea05468ee8c2c6eb0a3f77cf - thruster (0.1.21-aarch64-linux) sha256=f5aff78fb7a6431ed3d6ab4bde03a89c461e9a73981dbc97d6990d85c3db235c - thruster (0.1.21-arm64-darwin) sha256=bd8db9f57fae2cbb3fe08ebab49cb47fe49608122dac23daf0ce709adfb9bfc8 - thruster (0.1.21-x86_64-darwin) sha256=ccd6acd144fad27856800edfa0573944018333fac8e10a2e5d09726b70c8b0db - thruster (0.1.21-x86_64-linux) sha256=6e2fbcf826540a72d3710ae4db072c2333287ac2ee57e7e52f35bc10900d74a7 + thruster (0.1.22) sha256=f34fb82bd3e31570ae8f8b930e484f9e1db7b080cbc993d49090b161879c3e05 + thruster (0.1.22-aarch64-linux) sha256=6c306241e8ff8912fb26705a15cbb7b44a4dfcedd59fa890b2c72811f15cfa0e + thruster (0.1.22-arm64-darwin) sha256=d0506142832b1b020ab687dbfb938ec7cb07eeaabebc7f8682a73e8f0636917b + thruster (0.1.22-x86_64-darwin) sha256=2598d4122176bebd9d2debfcc5d330886168ca95e1e4705a5f38e80734c4e959 + thruster (0.1.22-x86_64-linux) sha256=b96436be7f0854db632f421b4a53b795429a0bc95c15c2e1c1a7a6fdd1ed090f timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo-rails (2.0.23) sha256=ee0d90733aafff056cf51ff11e803d65e43cae258cc55f6492020ec1f9f9315f diff --git a/app/controllers/api/v1/leaderboard_controller.rb b/app/controllers/api/v1/leaderboard_controller.rb index 70f3d1f..d43a176 100644 --- a/app/controllers/api/v1/leaderboard_controller.rb +++ b/app/controllers/api/v1/leaderboard_controller.rb @@ -9,10 +9,19 @@ class Api::V1::LeaderboardController < ApplicationController def index request.format = :json - @leaderboard = I18n.t("countries").keys.map do |code| - { country_code: code.upcase, score: rand(1000..9999) } - end.sort_by { |e| -e[:score] } - @updated_at = Time.current + data = Rails.cache.fetch("api/v1/leaderboard", expires_in: 1.minute) do + DemoActivity.simulate! # TEMP: fake gameplay so the banner has moving numbers + leaderboard = LeaderboardScore.call + { + leaderboard: leaderboard, + badges: LeaderboardBadges.call(leaderboard), + updated_at: Time.current + } + end + + @leaderboard = data[:leaderboard] + @badges = data[:badges] + @updated_at = data[:updated_at] end private diff --git a/app/controllers/game_controller.rb b/app/controllers/game_controller.rb index e373c11..090c422 100644 --- a/app/controllers/game_controller.rb +++ b/app/controllers/game_controller.rb @@ -18,7 +18,8 @@ class GameController < ApplicationController # POST def start - player = Player.create(locale: I18n.locale.to_s) + player = Player.create(locale: I18n.locale.to_s, country: country_from_param) + ResolvePlayerCountryJob.perform_later(player.id, request.remote_ip) if player.country.blank? session[:player_id] = player.id redirect_to action: "facts" end @@ -134,6 +135,14 @@ private + # An explicit ?country= override (handy for testing or a fixed-country kiosk). + # When absent, IP-based detection runs asynchronously in + # ResolvePlayerCountryJob so it never blocks the start of the game. + def country_from_param + Player.valid_country_code(params[:country]) + end + + def url_from_param return "" unless params[:url] diff --git a/app/jobs/resolve_player_country_job.rb b/app/jobs/resolve_player_country_job.rb new file mode 100644 index 0000000..37d39c6 --- /dev/null +++ b/app/jobs/resolve_player_country_job.rb @@ -0,0 +1,15 @@ +# Resolves a player's country from their request IP in the background, so the +# external geolocation call never delays the start of the game. Enqueued by +# GameController#start only when no explicit ?country= override was given. +class ResolvePlayerCountryJob < ApplicationJob + queue_as :default + + def perform(player_id, ip) + player = Player.find_by(id: player_id) + return if player.nil? || player.country.present? + + code = Geocoder.search(ip).first&.country_code + country = Player.valid_country_code(code) + player.update(country: country) if country + end +end diff --git a/app/models/player.rb b/app/models/player.rb index 4c6ca75..b82db5f 100644 --- a/app/models/player.rb +++ b/app/models/player.rb @@ -8,6 +8,14 @@ class Player < ApplicationRecord SCORE_KEYS = %w[food_waste emissions income].freeze + # Normalises an arbitrary country code to one of the leaderboard's known + # countries, or nil if it isn't one we track. Shared by the game controller + # (?country= override) and ResolvePlayerCountryJob (IP geolocation). + def self.valid_country_code(code) + code.to_s.downcase.presence_in(I18n.t("countries").keys.map(&:to_s)) + end + + def record_answer(stage, answer_id) stage_data(stage)["answer_id"] = answer_id save diff --git a/app/services/demo_activity.rb b/app/services/demo_activity.rb new file mode 100644 index 0000000..ba96e30 --- /dev/null +++ b/app/services/demo_activity.rb @@ -0,0 +1,22 @@ +# Fakes live gameplay so the banner developer has moving numbers to build +# against. Called on each leaderboard cache refresh (~once a minute); each call +# adds a handful of random players across random countries, most of them done. +# +# TEMPORARY: set ENABLED = false (or delete this) and wipe the players table +# before the game goes live. +class DemoActivity + ENABLED = true + + def self.simulate! + return unless ENABLED + + countries = I18n.t("countries").keys.map(&:to_s) + rand(5..20).times do + Player.create!( + locale: "en", + country: countries.sample, + is_done: rand < 0.7 + ) + end + end +end diff --git a/app/services/leaderboard_badges.rb b/app/services/leaderboard_badges.rb new file mode 100644 index 0000000..488d922 --- /dev/null +++ b/app/services/leaderboard_badges.rb @@ -0,0 +1,102 @@ +# Builds the rotating banner "badges" that sit alongside the ranked leaderboard. +# The banner picks one at a time or cycles through the whole list. +# +# Three kinds, matching the client's brief: +# #1 encouragement "Ketch-up !" bottom 10 featured countries +# #2 new_players "Yay! New players in " countries with recent sign-ups +# " new players in !" (benchmark variant) +# #3 participation ", every tomato counts!" everyone not covered above +# +# Tunables — the client's example numbers, adjust freely: +class LeaderboardBadges + NEW_PLAYER_WINDOW = 24.hours # #2: "new players in the last X hours" + BENCHMARKS = [100, 50, 10] # #2: highest crossed threshold wins + ENCOURAGEMENT_COUNT = 10 # #1: rotate across the bottom N + + # leaderboard: the array returned by LeaderboardScore.call (already ranked). + def self.call(leaderboard) + new(leaderboard).call + end + + def initialize(leaderboard) + @leaderboard = leaderboard + end + + # At most three badges — one random pick of each type. The pick changes on + # each cache refresh, so the banner naturally rotates through countries. + def call + [ + new_player_badges.sample, + encouragement_badges.sample, + participation_badges.sample + ].compact + end + + private + + # #2 — countries that gained new players (started sessions) within the window. + def new_player_badges + new_player_counts.map do |code, count| + benchmark = BENCHMARKS.find { |b| count >= b } + message = if benchmark + "#{benchmark} new players in #{country_name(code)}!" + else + "Yay! New players in #{country_name(code)}" + end + badge(:new_players, code, message) + end + end + + # #1 — encouragement for the bottom N countries that are actually playing. + def encouragement_badges + bottom_featured.map do |code| + badge(:encouragement, code, "Ketch-up #{country_name(code)}!") + end + end + + # #3 — everyone not featured on the leaderboard and not covered by #1 or #2. + def participation_badges + covered = (new_player_counts.keys + bottom_featured).to_set + unfeatured_codes.reject { |code| covered.include?(code) }.map do |code| + badge(:participation, code, "#{country_name(code)}, every tomato counts!") + end + end + + # Countries with at least one tomato — the ones "on" the leaderboard. + def featured + @featured ||= @leaderboard.select { |row| row[:tomatoes].to_i.positive? } + end + + # @leaderboard is ranked high→low, so the last N featured are the bottom N. + def bottom_featured + @bottom_featured ||= featured.last(ENCOURAGEMENT_COUNT).map { |row| code_of(row) } + end + + def unfeatured_codes + featured_set = featured.map { |row| code_of(row) }.to_set + @leaderboard.map { |row| code_of(row) }.reject { |code| featured_set.include?(code) } + end + + def new_player_counts + @new_player_counts ||= Player + .where(country: known_codes) + .where(created_at: NEW_PLAYER_WINDOW.ago..) + .group(:country).count + end + + def known_codes + @known_codes ||= I18n.t("countries").keys.map(&:to_s) + end + + def code_of(row) + row[:country_code].to_s.downcase + end + + def country_name(code) + I18n.t("countries.#{code}", default: code.to_s.upcase) + end + + def badge(type, code, message) + { type: type.to_s, country_code: code.to_s.upcase, message: message } + end +end diff --git a/app/services/leaderboard_score.rb b/app/services/leaderboard_score.rb new file mode 100644 index 0000000..5fa7ac3 --- /dev/null +++ b/app/services/leaderboard_score.rb @@ -0,0 +1,74 @@ +# Computes the country leaderboard using a blended score that balances overall +# impact with per-employee efficiency, so bigger teams don't win on size alone. +# +# For each country: +# tomatoes = number of finished play sessions (players where is_done) +# per_employee = tomatoes / employee headcount (nil if headcount unknown) +# impact_index = tomatoes / max(tomatoes) * 100 +# efficiency = per_employee / max(per_employee) * 100 +# score = impact_index * IMPACT_WEIGHT + efficiency * EFFICIENCY_WEIGHT +# +# Tune the balance here. The proposal's default is an even 50/50 split; raise +# EFFICIENCY_WEIGHT to lean more toward fairness across team sizes. +class LeaderboardScore + IMPACT_WEIGHT = 0.5 + EFFICIENCY_WEIGHT = 1.0 - IMPACT_WEIGHT + + def self.call + new.call + end + + def call + rows = build_rows + max_tomatoes = rows.map { |r| r[:tomatoes] }.max.to_f + max_per_emp = rows.filter_map { |r| r[:per_employee] }.max.to_f + + rows.map { |r| score_row(r, max_tomatoes, max_per_emp) } + .sort_by { |r| [ -r[:score], r[:country_code] ] } + end + + private + + # One row per known country, so the API always lists every country. Only + # players that are done AND tagged with a known country contribute tomatoes; + # countries with no finished players still appear, with 0 tomatoes / 0 score. + def build_rows + known = I18n.t("countries").keys.map(&:to_s) + counts = Player.where(is_done: true, country: known).group(:country).count + headcounts = self.class.headcounts + + known.map do |country| + tomatoes = counts[country].to_i + employees = headcounts[country].to_i + per_employee = employees.positive? ? tomatoes.to_f / employees : nil + { country: country, tomatoes: tomatoes, per_employee: per_employee } + end + end + + def score_row(row, max_tomatoes, max_per_emp) + impact = max_tomatoes.positive? ? row[:tomatoes] / max_tomatoes * 100 : 0.0 + efficiency = if row[:per_employee] && max_per_emp.positive? + row[:per_employee] / max_per_emp * 100 + else + # No headcount for this country: fall back to impact only rather than + # penalising it with a zero efficiency score. + impact + end + + blended = impact * IMPACT_WEIGHT + efficiency * EFFICIENCY_WEIGHT + + { + country_code: row[:country].to_s.upcase, + score: blended.round, + tomatoes: row[:tomatoes], + per_employee: row[:per_employee]&.round(2) + } + end + + def self.headcounts + @headcounts ||= YAML.safe_load_file( + Rails.root.join("config", "country_headcounts.yml"), + permitted_classes: [], aliases: false + ) || {} + end +end diff --git a/app/views/api/v1/leaderboard/index.json.jbuilder b/app/views/api/v1/leaderboard/index.json.jbuilder index 175d16a..ab3d16e 100644 --- a/app/views/api/v1/leaderboard/index.json.jbuilder +++ b/app/views/api/v1/leaderboard/index.json.jbuilder @@ -1,6 +1,14 @@ json.leaderboard @leaderboard do |entry| json.country_code entry[:country_code] json.score entry[:score] + json.tomatoes entry[:tomatoes] + json.per_employee entry[:per_employee] +end + +json.badges @badges do |badge| + json.type badge[:type] + json.country_code badge[:country_code] + json.message badge[:message] end json.updated_at @updated_at.iso8601 diff --git a/config/country_headcounts.yml b/config/country_headcounts.yml new file mode 100644 index 0000000..ea6891d --- /dev/null +++ b/config/country_headcounts.yml @@ -0,0 +1,73 @@ +# Employee headcount per country, used to compute the leaderboard's +# per-employee (efficiency) score. Keys are ISO country codes and MUST match +# the keys under `countries:` in config/locales/en.yml. +# +# The numbers below are PLACEHOLDER TEST VALUES — update as HR confirms them. +# Any country left blank (nil) or with a non-positive value is excluded from the +# efficiency axis so we never divide by zero — it still counts toward total +# tomatoes / impact. +# +# NOTE: Balearic Islands and Canary Islands are folded into Spain (es) in +# en.yml, so they have no separate key here. +--- +au: 1200 # Australia +at: 950 # Austria +bh: 180 # Bahrain +es: 3100 # Spain (incl. Balearic & Canary Islands) +be: 1400 # Belgium +bg: 600 # Bulgaria +ca: 2600 # Canada +cl: 700 # Chile +cn: 5200 # China +co: 850 # Colombia +hr: 400 # Croatia +cy: 150 # Cyprus +cz: 1100 # Czech Republic +dk: 1300 # Denmark +do: 220 # Dominican Republic +eg: 900 # Egypt +ee: 300 # Estonia +fi: 1050 # Finland +fr: 3800 # France +de: 4600 # Germany +gr: 750 # Greece +hk: 500 # Hong Kong +hu: 950 # Hungary +is: 160 # Iceland +in: 6100 # India +id: 2400 # Indonesia +ie: 1150 # Ireland +il: 680 # Israel +it: 3300 # Italy +jp: 3900 # Japan +jo: 260 # Jordan +kw: 210 # Kuwait +lv: 320 # Latvia +lt: 360 # Lithuania +my: 1600 # Malaysia +mx: 2200 # Mexico +ma: 540 # Morocco +nl: 2100 # Netherlands +nz: 480 # New Zealand +"no": 1250 # Norway +om: 190 # Oman +ph: 1900 # Philippines +pl: 800 # Poland +pt: 1000 # Portugal +pr: 240 # Puerto Rico +qa: 230 # Qatar +ro: 1150 # Romania +sa: 1050 # Saudi Arabia +rs: 560 # Serbia +sg: 900 # Singapore +sk: 620 # Slovakia +si: 340 # Slovenia +kr: 1800 # South Korea +se: 2900 # Sweden +ch: 1500 # Switzerland +tw: 1350 # Taiwan +th: 1700 # Thailand +tr: 2000 # Turkey +ae: 700 # United Arab Emirates +gb: 4100 # United Kingdom +us: 4280 # United States of America diff --git a/config/importmap.rb b/config/importmap.rb index 7c90c37..5a4a3fa 100644 --- a/config/importmap.rb +++ b/config/importmap.rb @@ -6,7 +6,7 @@ pin "@hotwired/stimulus-loading", to: "stimulus-loading.js" pin_all_from "app/javascript/controllers", under: "controllers" pin "sortablejs" # @1.15.7 -pin "stimulus-use" # @0.52.3 +pin "stimulus-use" # @0.53.0 pin "@rails/request.js", to: "@rails--request.js.js" # @0.0.13 pin "@rails/activestorage", to: "@rails--activestorage.js" # @8.1.300 pin "lexxy", to: "lexxy.js" diff --git a/config/initializers/geocoder.rb b/config/initializers/geocoder.rb new file mode 100644 index 0000000..6dd5d7e --- /dev/null +++ b/config/initializers/geocoder.rb @@ -0,0 +1,18 @@ +Geocoder.configure( + # IP-address geolocation service used by `request.location`. + # ipinfo.io works without an API key at low volume; add an ipinfo_token to the + # Rails credentials to raise the rate limit. For a no-rate-limit / + # privacy-friendly setup, swap this for an offline MaxMind GeoLite2 lookup + # (ip_lookup: :geoip2 + the .mmdb file). + ip_lookup: :ipinfo_io, + ipinfo_io: { api_key: Rails.application.credentials.ipinfo_token.presence }, + + # A slow or unreachable geo service must never hold up the start of the game. + timeout: 2, + always_raise: [], # swallow lookup errors -> request.location returns nil + + # Employees behind the same office gateway share an egress IP, so cache each + # lookup and reuse it instead of hammering the API once per player. + cache: Rails.cache, + cache_options: { expiration: 1.day } +) diff --git a/db/migrate/20260703000000_add_country_to_players.rb b/db/migrate/20260703000000_add_country_to_players.rb new file mode 100644 index 0000000..abc5a9f --- /dev/null +++ b/db/migrate/20260703000000_add_country_to_players.rb @@ -0,0 +1,6 @@ +class AddCountryToPlayers < ActiveRecord::Migration[8.1] + def change + add_column :players, :country, :string + add_index :players, :country + end +end diff --git a/db/schema.rb b/db/schema.rb index a781d03..f2d8830 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2026_06_05_000001) do +ActiveRecord::Schema[8.1].define(version: 2026_07_03_000000) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -115,6 +115,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_06_05_000001) do end create_table "players", force: :cascade do |t| + t.string "country" t.datetime "created_at", null: false t.boolean "is_done", default: false, null: false t.string "locale", null: false @@ -122,6 +123,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_06_05_000001) do t.integer "score", default: 0, null: false t.jsonb "scores", default: {}, null: false t.datetime "updated_at", null: false + t.index ["country"], name: "index_players_on_country" t.index ["is_done"], name: "index_players_on_is_done" t.index ["locale"], name: "index_players_on_locale" end diff --git a/docs/leaderboard_api.md b/docs/leaderboard_api.md new file mode 100644 index 0000000..3b2cd49 --- /dev/null +++ b/docs/leaderboard_api.md @@ -0,0 +1,57 @@ +# Tomato Challenge — Leaderboard API + +Provides the data for the intranet score banner: a ranked list of countries plus +up to three rotating "badge" messages. + +## Endpoint +``` +GET https://savethetomato.ikeafoundation.org/api/v1/leaderboard +``` + +## Authentication +Send a Bearer token in the header: +``` +Authorization: Bearer ikea-tomato-2026 +``` +Missing/wrong token returns `401 { "error": "Unauthorized" }`. + +## Response +```json +{ + "leaderboard": [ + { "country_code": "DK", "score": 100, "tomatoes": 5, "per_employee": 1.2 }, + { "country_code": "PL", "score": 63, "tomatoes": 3, "per_employee": 0.9 } + ], + "badges": [ + { "type": "new_players", "country_code": "FR", "message": "10 new players in France!" }, + { "type": "encouragement", "country_code": "SE", "message": "Ketch-up Sweden!" }, + { "type": "participation", "country_code": "CN", "message": "China, every tomato counts!" } + ], + "updated_at": "2026-07-03T12:00:00Z" +} +``` + +### `leaderboard` +Always contains **all countries**, sorted best-to-worst by `score`. +- `country_code` — ISO 2-letter code, uppercase. +- `score` — blended 0–100 ranking score. +- `tomatoes` — total saved (whole number). +- `per_employee` — tomatoes per employee (decimal, may be `null`). + +### `badges` +Zero to three messages, **at most one of each `type`**. Render `message` as-is. +- `new_players` — a country just gained players. +- `encouragement` — nudge for a trailing country. +- `participation` — a country not yet on the board. + +`country_code` is included if you want to show a flag alongside the message. + +### `updated_at` +ISO-8601 timestamp of the data. + +## Notes +- Response is **cached for ~1 minute**, so numbers/badges change about once a + minute — safe to poll on that cadence. +- The **field/structure is stable**; exact scoring and badge wording may still be + tuned. Don't hard-code specific messages. +- Data is currently **simulated** for development and will be reset before go-live. diff --git a/docs/leaderboard_api.pdf b/docs/leaderboard_api.pdf new file mode 100644 index 0000000000000000000000000000000000000000..03e85d0e39df1e4f1c7987525d9595206f4fce23 GIT binary patch literal 154850 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⁣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 s=e[t];return typeof s=="function"?s:(...e)=>{}};const composeEventName=(e,t,s)=>{let n=e;s===true?n=`${t.identifier}:${e}`:typeof s==="string"&&(n=`${s}:${e}`);return n};const extendedEvent=(e,t,s)=>{const{bubbles:n,cancelable:o,composed:i}=t||{bubbles:true,cancelable:true,composed:true};t&&Object.assign(s,{originalEvent:t});const r=new CustomEvent(e,{bubbles:n,cancelable:o,composed:i,detail:s});return r};function isElementInViewport(e){const t=e.getBoundingClientRect();const s=window.innerHeight||document.documentElement.clientHeight;const n=window.innerWidth||document.documentElement.clientWidth;const o=t.top<=s&&t.top+t.height>0;const i=t.left<=n&&t.left+t.width>0;return o&&i}function camelize(e){return e.replace(/(?:[_-])([a-z0-9])/g,((e,t)=>t.toUpperCase()))}function __rest(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(e!=null&&typeof Object.getOwnPropertySymbols==="function"){var o=0;for(n=Object.getOwnPropertySymbols(e);o{if(this.debug){this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,"color: #3B82F6","color: unset");this.logger.log(Object.assign({controllerId:this.controllerId},t));this.logger.groupEnd()}};this.warn=e=>{this.logger.warn(`%c${this.controller.identifier} %c${e}`,"color: #3B82F6; font-weight: bold","color: unset")};this.dispatch=(e,t={})=>{if(this.dispatchEvent){const{event:s}=t,n=__rest(t,["event"]);const o=this.extendedEvent(e,s||null,n);this.targetElement.dispatchEvent(o);this.log("dispatchEvent",Object.assign({eventName:o.type},n))}};this.call=(e,t={})=>{const s=this.controller[e];if(typeof s=="function")return s.call(this.controller,t)};this.extendedEvent=(e,t,s)=>{const{bubbles:n,cancelable:o,composed:i}=t||{bubbles:true,cancelable:true,composed:true};t&&Object.assign(s,{originalEvent:t});const r=new CustomEvent(this.composeEventName(e),{bubbles:n,cancelable:o,composed:i,detail:s});return r};this.composeEventName=e=>{let t=e;this.eventPrefix===true?t=`${this.controller.identifier}:${e}`:typeof this.eventPrefix==="string"&&(t=`${this.eventPrefix}:${e}`);return t};this.debug=(o=(n=s===null||s===void 0?void 0:s.debug)!==null&&n!==void 0?n:e.application.stimulusUseDebug)!==null&&o!==void 0?o:t.debug;this.logger=(i=s===null||s===void 0?void 0:s.logger)!==null&&i!==void 0?i:t.logger;this.controller=e;this.controllerId=e.element.id||e.element.dataset.id;this.targetElement=(s===null||s===void 0?void 0:s.element)||e.element;const{dispatchEvent:r,eventPrefix:l}=Object.assign({},t,s);Object.assign(this,{dispatchEvent:r,eventPrefix:l});this.controllerInitialize=e.initialize.bind(e);this.controllerConnect=e.connect.bind(e);this.controllerDisconnect=e.disconnect.bind(e)}}const s={eventPrefix:true,bubbles:true,cancelable:true};class UseDispatch extends StimulusUse{constructor(e,t={}){var n,o,i,r;super(e,t);this.dispatch=(e,t={})=>{const{controller:s,targetElement:n,eventPrefix:o,bubbles:i,cancelable:r,log:l,warn:c}=this;Object.assign(t,{controller:s});const a=composeEventName(e,this.controller,o);const u=new CustomEvent(a,{detail:t,bubbles:i,cancelable:r});n.dispatchEvent(u);c("`useDispatch()` is deprecated. Please use the built-in `this.dispatch()` function from Stimulus. You can find more information on how to upgrade at: https://stimulus-use.github.io/stimulus-use/#/use-dispatch");l("dispatch",{eventName:a,detail:t,bubbles:i,cancelable:r});return u};this.targetElement=(n=t.element)!==null&&n!==void 0?n:e.element;this.eventPrefix=(o=t.eventPrefix)!==null&&o!==void 0?o:s.eventPrefix;this.bubbles=(i=t.bubbles)!==null&&i!==void 0?i:s.bubbles;this.cancelable=(r=t.cancelable)!==null&&r!==void 0?r:s.cancelable;this.enhanceController()}enhanceController(){Object.assign(this.controller,{dispatch:this.dispatch})}}const useDispatch=(e,t={})=>new UseDispatch(e,t);const n={overwriteDispatch:true};const useApplication=(e,t={})=>{const{overwriteDispatch:s}=Object.assign({},n,t);Object.defineProperty(e,"isPreview",{get(){return document.documentElement.hasAttribute("data-turbolinks-preview")||document.documentElement.hasAttribute("data-turbo-preview")}});Object.defineProperty(e,"isConnected",{get(){return!!Array.from(this.context.module.connectedContexts).find((e=>e===this.context))}});Object.defineProperty(e,"csrfToken",{get(){return this.metaValue("csrf-token")}});s&&useDispatch(e,t);Object.assign(e,{metaValue(e){const t=document.head.querySelector(`meta[name="${e}"]`);return t&&t.getAttribute("content")}})};class ApplicationController extends e{constructor(e){super(e);this.isPreview=false;this.isConnected=false;this.csrfToken="";useApplication(this,this.options)}}const o={events:["click","touchend"],onlyVisible:true,dispatchEvent:true,eventPrefix:true};const useClickOutside=(e,t={})=>{const s=e;const{onlyVisible:n,dispatchEvent:i,events:r,eventPrefix:l}=Object.assign({},o,t);const onEvent=e=>{const o=(t===null||t===void 0?void 0:t.element)||s.element;if(!(o.contains(e.target)||!isElementInViewport(o)&&n)){s.clickOutside&&s.clickOutside(e);if(i){const t=composeEventName("click:outside",s,l);const n=extendedEvent(t,e,{controller:s});o.dispatchEvent(n)}}};const observe=()=>{r===null||r===void 0?void 0:r.forEach((e=>{window.addEventListener(e,onEvent,true)}))};const unobserve=()=>{r===null||r===void 0?void 0:r.forEach((e=>{window.removeEventListener(e,onEvent,true)}))};const c=s.disconnect.bind(s);Object.assign(s,{disconnect(){unobserve();c()}});observe();return[observe,unobserve]};class ClickOutsideComposableController extends e{}class ClickOutsideController extends ClickOutsideComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useClickOutside(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class DebounceController extends e{}DebounceController.debounces=[];const i=200;const debounce=(e,t=i)=>{let s=null;return function(){const n=Array.from(arguments);const o=this;const i=n.map((e=>e.params));const callback=()=>{n.forEach(((e,t)=>e.params=i[t]));return e.apply(o,n)};s&&clearTimeout(s);s=setTimeout(callback,t)}};const useDebounce=(e,t)=>{const s=e;const n=s.constructor;n.debounces.forEach((e=>{typeof e==="string"&&(s[e]=debounce(s[e],t===null||t===void 0?void 0:t.wait));if(typeof e==="object"){const{name:n,wait:o}=e;if(!n)return;s[n]=debounce(s[n],o||(t===null||t===void 0?void 0:t.wait))}}))};class UseHover extends StimulusUse{constructor(e,t={}){super(e,t);this.observe=()=>{this.targetElement.addEventListener("mouseenter",this.onEnter);this.targetElement.addEventListener("mouseleave",this.onLeave)};this.unobserve=()=>{this.targetElement.removeEventListener("mouseenter",this.onEnter);this.targetElement.removeEventListener("mouseleave",this.onLeave)};this.onEnter=e=>{this.call("mouseEnter",e);this.log("mouseEnter",{hover:true});this.dispatch("mouseEnter",{hover:false})};this.onLeave=e=>{this.call("mouseLeave",e);this.log("mouseLeave",{hover:false});this.dispatch("mouseLeave",{hover:false})};this.controller=e;this.enhanceController();this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);const disconnect=()=>{this.unobserve();e()};Object.assign(this.controller,{disconnect:disconnect})}}const useHover=(e,t={})=>{const s=e;const n=new UseHover(s,t);return[n.observe,n.unobserve]};class HoverComposableController extends e{}class HoverController extends HoverComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useHover(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const r=["mousemove","mousedown","resize","keydown","touchstart","wheel"];const l=6e4;const c={ms:l,initialState:false,events:r,dispatchEvent:true,eventPrefix:true};const useIdle=(e,t={})=>{const s=e;const{ms:n,initialState:o,events:i,dispatchEvent:r,eventPrefix:l}=Object.assign({},c,t);let a=o;let u=setTimeout((()=>{a=true;dispatchAway()}),n);const dispatchAway=e=>{const t=composeEventName("away",s,l);s.isIdle=true;method(s,"away").call(s,e);if(r){const n=extendedEvent(t,e||null,{controller:s});s.element.dispatchEvent(n)}};const dispatchBack=e=>{const t=composeEventName("back",s,l);s.isIdle=false;method(s,"back").call(s,e);if(r){const n=extendedEvent(t,e||null,{controller:s});s.element.dispatchEvent(n)}};const onEvent=e=>{a&&dispatchBack(e);a=false;clearTimeout(u);u=setTimeout((()=>{a=true;dispatchAway(e)}),n)};const onVisibility=e=>{document.hidden||onEvent(e)};a?dispatchAway():dispatchBack();const h=s.disconnect.bind(s);const observe=()=>{i.forEach((e=>{window.addEventListener(e,onEvent)}));document.addEventListener("visibilitychange",onVisibility)};const unobserve=()=>{clearTimeout(u);i.forEach((e=>{window.removeEventListener(e,onEvent)}));document.removeEventListener("visibilitychange",onVisibility)};Object.assign(s,{disconnect(){unobserve();h()}});observe();return[observe,unobserve]};class IdleComposableController extends e{constructor(){super(...arguments);this.isIdle=false}}class IdleController extends IdleComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useIdle(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const a={dispatchEvent:true,eventPrefix:true,visibleAttribute:"isVisible"};const useIntersection=(e,t={})=>{const s=e;const{dispatchEvent:n,eventPrefix:o,visibleAttribute:i}=Object.assign({},a,t);const r=(t===null||t===void 0?void 0:t.element)||s.element;s.intersectionElements||(s.intersectionElements=[]);s.intersectionElements.push(r);const callback=e=>{const[t]=e;t.isIntersecting?dispatchAppear(t):r.hasAttribute(i)&&dispatchDisappear(t)};const l=new IntersectionObserver(callback,t);const dispatchAppear=e=>{r.setAttribute(i,"true");method(s,"appear").call(s,e,l);if(n){const t=composeEventName("appear",s,o);const n=extendedEvent(t,null,{controller:s,entry:e,observer:l});r.dispatchEvent(n)}};const dispatchDisappear=e=>{r.removeAttribute(i);method(s,"disappear").call(s,e,l);if(n){const t=composeEventName("disappear",s,o);const n=extendedEvent(t,null,{controller:s,entry:e,observer:l});r.dispatchEvent(n)}};const c=s.disconnect.bind(s);const disconnect=()=>{unobserve();c()};const observe=()=>{l.observe(r)};const unobserve=()=>{l.unobserve(r)};const noneVisible=()=>s.intersectionElements.filter((e=>e.hasAttribute(i))).length===0;const oneVisible=()=>s.intersectionElements.filter((e=>e.hasAttribute(i))).length===1;const atLeastOneVisible=()=>s.intersectionElements.some((e=>e.hasAttribute(i)));const allVisible=()=>s.intersectionElements.every((e=>e.hasAttribute(i)));const u=allVisible;Object.assign(s,{isVisible:u,noneVisible:noneVisible,oneVisible:oneVisible,atLeastOneVisible:atLeastOneVisible,allVisible:allVisible,disconnect:disconnect});observe();return[observe,unobserve]};class IntersectionComposableController extends e{}class IntersectionController extends IntersectionComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useIntersection(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const useLazyLoad=(e,t)=>{const callback=t=>{const[s]=t;s.isIntersecting&&!e.isLoaded&&handleAppear()};const handleAppear=t=>{const s=e.data.get("src");if(!s)return;const n=e.element;e.isLoading=true;method(e,"loading").call(e,s);n.onload=()=>{handleLoaded(s)};n.src=s};const handleLoaded=t=>{e.isLoading=false;e.isLoaded=true;method(e,"loaded").call(e,t)};const s=e.disconnect.bind(e);const n=new IntersectionObserver(callback,t);const observe=()=>{n.observe(e.element)};const unobserve=()=>{n.unobserve(e.element)};Object.assign(e,{isVisible:false,disconnect(){unobserve();s()}});observe();return[observe,unobserve]};class LazyLoadComposableController extends e{constructor(){super(...arguments);this.isLoading=false;this.isLoaded=false}}class LazyLoadController extends LazyLoadComposableController{constructor(e){super(e);this.options={rootMargin:"10%"};requestAnimationFrame((()=>{const[e,t]=useLazyLoad(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const u={mediaQueries:{},dispatchEvent:true,eventPrefix:true,debug:false};class UseMatchMedia extends StimulusUse{constructor(e,t={}){var s,n,o,i;super(e,t);this.matches=[];this.callback=e=>{const t=Object.keys(this.mediaQueries).find((t=>this.mediaQueries[t]===e.media));if(!t)return;const{media:s,matches:n}=e;this.changed({name:t,media:s,matches:n,event:e})};this.changed=e=>{const{name:t}=e;if(e.event){this.call(camelize(`${t}_changed`),e);this.dispatch(`${t}:changed`,e);this.log(`media query "${t}" changed`,e)}if(e.matches){this.call(camelize(`is_${t}`),e);this.dispatch(`is:${t}`,e)}else{this.call(camelize(`not_${t}`),e);this.dispatch(`not:${t}`,e)}};this.observe=()=>{Object.keys(this.mediaQueries).forEach((e=>{const t=this.mediaQueries[e];const s=window.matchMedia(t);s.addListener(this.callback);this.matches.push(s);this.changed({name:e,media:t,matches:s.matches})}))};this.unobserve=()=>{this.matches.forEach((e=>e.removeListener(this.callback)))};this.controller=e;this.mediaQueries=(s=t.mediaQueries)!==null&&s!==void 0?s:u.mediaQueries;this.dispatchEvent=(n=t.dispatchEvent)!==null&&n!==void 0?n:u.dispatchEvent;this.eventPrefix=(o=t.eventPrefix)!==null&&o!==void 0?o:u.eventPrefix;this.debug=(i=t.debug)!==null&&i!==void 0?i:u.debug;if(window.matchMedia){this.enhanceController();this.observe()}else console.error("window.matchMedia() is not available")}enhanceController(){const e=this.controller.disconnect.bind(this.controller);const disconnect=()=>{this.unobserve();e()};Object.assign(this.controller,{disconnect:disconnect})}}const useMatchMedia=(e,t={})=>{const s=new UseMatchMedia(e,t);return[s.observe,s.unobserve]};const memoize=(e,t,s)=>{Object.defineProperty(e,t,{value:s});return s};const useMemo=e=>{var t;(t=e.constructor.memos)===null||t===void 0?void 0:t.forEach((t=>{memoize(e,t,e[t])}))};const defineMetaGetter=(e,t,s)=>{const n=s?`${camelize(t)}Meta`:camelize(t);Object.defineProperty(e,n,{get(){return typeCast(metaValue(t))}})};function metaValue(e){const t=document.head.querySelector(`meta[name="${e}"]`);return t&&t.getAttribute("content")}function typeCast(e){try{return JSON.parse(e)}catch(t){return e}}const useMeta=(e,t={suffix:true})=>{const s=e.constructor.metaNames;const n=t.suffix;s===null||s===void 0?void 0:s.forEach((t=>{defineMetaGetter(e,t,n)}));Object.defineProperty(e,"metas",{get(){const e={};s===null||s===void 0?void 0:s.forEach((t=>{const s=typeCast(metaValue(t));s!==void 0&&s!==null&&(e[camelize(t)]=s)}));return e}})};class UseMutation extends StimulusUse{constructor(e,t={}){super(e,t);this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,"At a minimum, one of childList, attributes, and/or characterData must be true",{})}};this.unobserve=()=>{this.observer.disconnect()};this.mutation=e=>{this.call("mutate",e);this.log("mutate",{entries:e});this.dispatch("mutate",{entries:e})};this.targetElement=(t===null||t===void 0?void 0:t.element)||e.element;this.controller=e;this.options=t;this.observer=new MutationObserver(this.mutation);this.enhanceController();this.observe()}enhanceController(){const e=this.controller.disconnect.bind(this.controller);const disconnect=()=>{this.unobserve();e()};Object.assign(this.controller,{disconnect:disconnect})}}const useMutation=(e,t={})=>{const s=new UseMutation(e,t);return[s.observe,s.unobserve]};class MutationComposableController extends e{}class MutationController extends MutationComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useMutation(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const h={dispatchEvent:true,eventPrefix:true};const useResize=(e,t={})=>{const s=e;const{dispatchEvent:n,eventPrefix:o}=Object.assign({},h,t);const i=(t===null||t===void 0?void 0:t.element)||s.element;const callback=e=>{const[t]=e;method(s,"resize").call(s,t.contentRect);if(n){const e=composeEventName("resize",s,o);const n=extendedEvent(e,null,{controller:s,entry:t});i.dispatchEvent(n)}};const r=s.disconnect.bind(s);const l=new ResizeObserver(callback);const observe=()=>{l.observe(i)};const unobserve=()=>{l.unobserve(i)};Object.assign(s,{disconnect(){unobserve();r()}});observe();return[observe,unobserve]};class ResizeComposableController extends e{}class ResizeController extends ResizeComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useResize(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class UseTargetMutation extends StimulusUse{constructor(e,t={}){super(e,t);this.observe=()=>{this.observer.observe(this.targetElement,{subtree:true,characterData:true,childList:true,attributes:true,attributeOldValue:true,attributeFilter:[this.targetSelector,this.scopedTargetSelector]})};this.unobserve=()=>{this.observer.disconnect()};this.mutation=e=>{for(const t of e)switch(t.type){case"attributes":let e=t.target.getAttribute(t.attributeName);let s=t.oldValue;if(t.attributeName===this.targetSelector||t.attributeName===this.scopedTargetSelector){let n=this.targetsUsedByThisController(s);let o=this.targetsUsedByThisController(e);let i=n.filter((e=>!o.includes(e)));let r=o.filter((e=>!n.includes(e)));i.forEach((e=>this.targetRemoved(this.stripIdentifierPrefix(e),t.target,"attributeChange")));r.forEach((e=>this.targetAdded(this.stripIdentifierPrefix(e),t.target,"attributeChange")))}break;case"characterData":let n=this.findTargetInAncestry(t.target);if(n==null)return;{let e=this.targetsUsedByThisControllerFromNode(n);e.forEach((e=>{this.targetChanged(this.stripIdentifierPrefix(e),n,"domMutation")}))}break;case"childList":let{addedNodes:o,removedNodes:i}=t;o.forEach((e=>this.processNodeDOMMutation(e,this.targetAdded)));i.forEach((e=>this.processNodeDOMMutation(e,this.targetRemoved)));break}};this.controller=e;this.options=t;this.targetElement=e.element;this.identifier=e.scope.identifier;this.identifierPrefix=`${this.identifier}.`;this.targetSelector=e.scope.schema.targetAttribute;this.scopedTargetSelector=`data-${this.identifier}-target`;this.targets=t.targets||e.constructor.targets;this.prefixedTargets=this.targets.map((e=>`${this.identifierPrefix}${e}`));this.observer=new MutationObserver(this.mutation);this.enhanceController();this.observe()}processNodeDOMMutation(e,t){let s=e;let n=t;let o=[];if(s.nodeName=="#text"||this.targetsUsedByThisControllerFromNode(s).length==0){n=this.targetChanged;s=this.findTargetInAncestry(e)}else o=this.targetsUsedByThisControllerFromNode(s);if(s!=null){o.length==0&&(o=this.targetsUsedByThisControllerFromNode(s));o.forEach((e=>{n.call(this,this.stripIdentifierPrefix(e),s,"domMutation")}))}}findTargetInAncestry(e){let t=e;let s=[];t.nodeName!="#text"&&(s=this.targetsUsedByThisControllerFromNode(t));while(t.parentNode!==null&&t.parentNode!=this.targetElement&&s.length==0){t=t.parentNode;if(t.nodeName!=="#text"){let e=this.targetsUsedByThisControllerFromNode(t);if(e.length>0)return t}}return t.nodeName=="#text"||t.parentNode==null?null:t.parentNode==this.targetElement&&this.targetsUsedByThisControllerFromNode(t).length>0?t:null}targetAdded(e,t,s){let n=`${e}TargetAdded`;this.controller[n]&&method(this.controller,n).call(this.controller,t);this.warn("`[target]TargetAdded` is deprecated. Please use the built-in `[target]TargetConnected()` function from Stimulus.");this.log("targetAdded",{target:e,node:t,trigger:s})}targetRemoved(e,t,s){let n=`${e}TargetRemoved`;this.controller[n]&&method(this.controller,n).call(this.controller,t);this.warn("`[target]TargetRemoved` is deprecated. Please use the built-in `[target]TargetDisconnected()` function from Stimulus.");this.log("targetRemoved",{target:e,node:t,trigger:s})}targetChanged(e,t,s){let n=`${e}TargetChanged`;this.controller[n]&&method(this.controller,n).call(this.controller,t);this.log("targetChanged",{target:e,node:t,trigger:s})}targetsUsedByThisControllerFromNode(e){if(e.nodeName=="#text"||e.nodeName=="#comment")return[];let t=e;return this.targetsUsedByThisController(t.getAttribute(this.scopedTargetSelector)||t.getAttribute(this.targetSelector))}targetsUsedByThisController(e){e=e||"";let t=this.stripIdentifierPrefix(e).split(" ");return this.targets.filter((e=>t.indexOf(e)!==-1))}stripIdentifierPrefix(e){return e.replace(new RegExp(this.identifierPrefix,"g"),"")}enhanceController(){const e=this.controller.disconnect.bind(this.controller);const disconnect=()=>{this.unobserve();e()};Object.assign(this.controller,{disconnect:disconnect})}}const useTargetMutation=(e,t={})=>{const s=e;const n=new UseTargetMutation(s,t);n.warn("`[target]TargetAdded` and `[target]TargetRemoved` are deprecated. Please use the built-in `[target]TargetConnected()` and `[target]TargetDisconnected()` functions from Stimulus.");return[n.observe,n.unobserve]};class TargetMutationComposableController extends e{}class TargetMutationController extends TargetMutationComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useTargetMutation(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class ThrottleController extends e{}ThrottleController.throttles=[];const d=200;function throttle(e,t=d){let s;return function(){const n=arguments;const o=this;if(!s){s=true;e.apply(o,n);setTimeout((()=>s=false),t)}}}const useThrottle=(e,t={})=>{var s;const n=e;const o=n.constructor;(s=o.throttles)===null||s===void 0?void 0:s.forEach((e=>{typeof e==="string"&&(n[e]=throttle(n[e],t===null||t===void 0?void 0:t.wait));if(typeof e==="object"){const{name:s,wait:o}=e;if(!s)return;n[s]=throttle(n[s],o||(t===null||t===void 0?void 0:t.wait))}}))};const b={enterFromClass:"enter",enterActiveClass:"enterStart",enterToClass:"enterEnd",leaveFromClass:"leave",leaveActiveClass:"leaveStart",leaveToClass:"leaveEnd"};const m={transitioned:false,hiddenClass:"hidden",preserveOriginalClass:true,removeToClasses:true};const useTransition=(e,t={})=>{var s,n,o;const i=e;const r=i.element.dataset.transitionTarget;let l;r&&(l=i[`${r}Target`]);const c=(t===null||t===void 0?void 0:t.element)||l||i.element;if(!(c instanceof HTMLElement||c instanceof SVGElement))return;const a=c.dataset;const u=parseInt(a.leaveAfter||"")||t.leaveAfter||0;const{transitioned:h,hiddenClass:d,preserveOriginalClass:b,removeToClasses:v}=Object.assign({},m,t);const g=(s=i.enter)===null||s===void 0?void 0:s.bind(i);const p=(n=i.leave)===null||n===void 0?void 0:n.bind(i);const f=(o=i.toggleTransition)===null||o===void 0?void 0:o.bind(i);async function enter(e){if(i.transitioned)return;i.transitioned=true;g&&g(e);const s=getAttribute("enterFrom",t,a);const n=getAttribute("enterActive",t,a);const o=getAttribute("enterTo",t,a);const r=getAttribute("leaveTo",t,a);!d||c.classList.remove(d);v||removeClasses(c,r);await transition(c,s,n,o,d,b,v);u>0&&setTimeout((()=>{leave(e)}),u)}async function leave(e){if(!i.transitioned)return;i.transitioned=false;p&&p(e);const s=getAttribute("leaveFrom",t,a);const n=getAttribute("leaveActive",t,a);const o=getAttribute("leaveTo",t,a);const r=getAttribute("enterTo",t,a);v||removeClasses(c,r);await transition(c,s,n,o,d,b,v);!d||c.classList.add(d)}function toggleTransition(e){f&&f(e);i.transitioned?leave():enter()}async function transition(e,t,s,n,o,i,r){const l=[];if(i){t.forEach((t=>e.classList.contains(t)&&t!==o&&l.push(t)));s.forEach((t=>e.classList.contains(t)&&t!==o&&l.push(t)));n.forEach((t=>e.classList.contains(t)&&t!==o&&l.push(t)))}addClasses(e,t);removeClasses(e,l);addClasses(e,s);await nextAnimationFrame();removeClasses(e,t);addClasses(e,n);await afterTransition(e);removeClasses(e,s);r&&removeClasses(e,n);addClasses(e,l)}function initialState(){i.transitioned=h;if(h){!d||c.classList.remove(d);enter()}else{!d||c.classList.add(d);leave()}}function addClasses(e,t){t.length>0&&e.classList.add(...t)}function removeClasses(e,t){t.length>0&&e.classList.remove(...t)}initialState();Object.assign(i,{enter:enter,leave:leave,toggleTransition:toggleTransition});return[enter,leave,toggleTransition]};function getAttribute(e,t,s){const n=`transition${e[0].toUpperCase()}${e.substr(1)}`;const o=b[e];const i=t[e]||s[n]||s[o]||" ";return isEmpty(i)?[]:i.split(" ")}async function afterTransition(e){return new Promise((t=>{const s=Number(getComputedStyle(e).transitionDuration.split(",")[0].replace("s",""))*1e3;setTimeout((()=>{t(s)}),s)}))}async function nextAnimationFrame(){return new Promise((e=>{requestAnimationFrame((()=>{requestAnimationFrame(e)}))}))}function isEmpty(e){return e.length===0||!e.trim()}class TransitionComposableController extends e{constructor(){super(...arguments);this.transitioned=false}}class TransitionController extends TransitionComposableController{constructor(e){super(e);requestAnimationFrame((()=>{useTransition(this,this.options)}))}}class UseVisibility extends StimulusUse{constructor(e,t={}){super(e,t);this.observe=()=>{this.controller.isVisible=!document.hidden;document.addEventListener("visibilitychange",this.handleVisibilityChange);this.handleVisibilityChange()};this.unobserve=()=>{document.removeEventListener("visibilitychange",this.handleVisibilityChange)};this.becomesInvisible=e=>{this.controller.isVisible=false;this.call("invisible",e);this.log("invisible",{isVisible:false});this.dispatch("invisible",{event:e,isVisible:false})};this.becomesVisible=e=>{this.controller.isVisible=true;this.call("visible",e);this.log("visible",{isVisible:true});this.dispatch("visible",{event:e,isVisible:true})};this.handleVisibilityChange=e=>{document.hidden?this.becomesInvisible(e):this.becomesVisible(e)};this.controller=e;this.enhanceController();this.observe()}enhanceController(){const e=this.controllerDisconnect;const disconnect=()=>{this.unobserve();e()};Object.assign(this.controller,{disconnect:disconnect})}}const useVisibility=(e,t={})=>{const s=e;const n=new UseVisibility(s,t);return[n.observe,n.unobserve]};class VisibilityComposableController extends e{constructor(){super(...arguments);this.isVisible=false}}class VisibilityController extends VisibilityComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useVisibility(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class UseWindowFocus extends StimulusUse{constructor(e,t={}){super(e,t);this.observe=()=>{document.hasFocus()?this.becomesFocused():this.becomesUnfocused();this.interval=setInterval((()=>{this.handleWindowFocusChange()}),this.intervalDuration)};this.unobserve=()=>{clearInterval(this.interval)};this.becomesUnfocused=e=>{this.controller.hasFocus=false;this.call("unfocus",e);this.log("unfocus",{hasFocus:false});this.dispatch("unfocus",{event:e,hasFocus:false})};this.becomesFocused=e=>{this.controller.hasFocus=true;this.call("focus",e);this.log("focus",{hasFocus:true});this.dispatch("focus",{event:e,hasFocus:true})};this.handleWindowFocusChange=e=>{document.hasFocus()&&!this.controller.hasFocus?this.becomesFocused(e):!document.hasFocus()&&this.controller.hasFocus&&this.becomesUnfocused(e)};this.controller=e;this.intervalDuration=t.interval||200;this.enhanceController();this.observe()}enhanceController(){const e=this.controllerDisconnect;const disconnect=()=>{this.unobserve();e()};Object.assign(this.controller,{disconnect:disconnect})}}const useWindowFocus=(e,t={})=>{const s=e;const n=new UseWindowFocus(s,t);return[n.observe,n.unobserve]};class WindowFocusComposableController extends e{constructor(){super(...arguments);this.hasFocus=false}}class WindowFocusController extends WindowFocusComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useWindowFocus(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const useWindowResize=e=>{const t=e;const callback=e=>{const{innerWidth:s,innerHeight:n}=window;const o={height:n||Infinity,width:s||Infinity,event:e};method(t,"windowResize").call(t,o)};const s=t.disconnect.bind(t);const observe=()=>{window.addEventListener("resize",callback);callback()};const unobserve=()=>{window.removeEventListener("resize",callback)};Object.assign(t,{disconnect(){unobserve();s()}});observe();return[observe,unobserve]};class WindowResizeComposableController extends e{}class WindowResizeController extends WindowResizeComposableController{constructor(e){super(e);requestAnimationFrame((()=>{const[e,t]=useWindowResize(this);Object.assign(this,{observe:e,unobserve:t})}))}}function useHotkeys(){throw"[stimulus-use] Notice: The import for `useHotkeys()` has been moved from `stimulus-use` to `stimulus-use/hotkeys`. \nPlease change the import accordingly and add `hotkey-js` as a dependency to your project. \n\nFor more information see: https://stimulus-use.github.io/stimulus-use/#/use-hotkeys?id=importing-the-behavior"}export{ApplicationController,ClickOutsideController,HoverController,IdleController,IntersectionController,LazyLoadController,MutationController,ResizeController,TargetMutationController,TransitionController,UseHover,UseMutation,UseTargetMutation,UseVisibility,UseWindowFocus,VisibilityController,WindowFocusController,WindowResizeController,debounce,useApplication,useClickOutside,useDebounce,useDispatch,useHotkeys,useHover,useIdle,useIntersection,useLazyLoad,useMatchMedia,useMemo,useMeta,useMutation,useResize,useTargetMutation,useThrottle,useTransition,useVisibility,useWindowFocus,useWindowResize}; +import{Controller as e}from"@hotwired/stimulus";const t=(e,t)=>{let n=e[t];return typeof n==`function`?n:(...e)=>{}},n=(e,t,n)=>{let r=e;return n===!0?r=`${t.identifier}:${e}`:typeof n==`string`&&(r=`${n}:${e}`),r},r=(e,t,n)=>{let{bubbles:r,cancelable:i,composed:a}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(n,{originalEvent:t}),new CustomEvent(e,{bubbles:r,cancelable:i,composed:a,detail:n})};function i(e){let t=e.getBoundingClientRect(),n=window.innerHeight||document.documentElement.clientHeight,r=window.innerWidth||document.documentElement.clientWidth,i=t.top<=n&&t.top+t.height>0,a=t.left<=r&&t.left+t.width>0;return i&&a}function a(e){return e.replace(/(?:[_-])([a-z0-9])/g,((e,t)=>t.toUpperCase()))}const o={debug:!1,logger:console,dispatchEvent:!0,eventPrefix:!0};class StimulusUse{constructor(e,t={}){this.log=(e,t)=>{this.debug&&(this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${e}`,`color: #3B82F6`,`color: unset`),this.logger.log({controllerId:this.controllerId,...t}),this.logger.groupEnd())},this.warn=e=>{this.logger.warn(`%c${this.controller.identifier} %c${e}`,`color: #3B82F6; font-weight: bold`,`color: unset`)},this.dispatch=(e,t={})=>{if(this.dispatchEvent){let{event:n,...r}=t,i=this.extendedEvent(e,n||null,r);this.targetElement.dispatchEvent(i),this.log(`dispatchEvent`,{eventName:i.type,...r})}},this.call=(e,t={})=>{let n=this.controller[e];if(typeof n==`function`)return n.call(this.controller,t)},this.extendedEvent=(e,t,n)=>{let{bubbles:r,cancelable:i,composed:a}=t||{bubbles:!0,cancelable:!0,composed:!0};return t&&Object.assign(n,{originalEvent:t}),new CustomEvent(this.composeEventName(e),{bubbles:r,cancelable:i,composed:a,detail:n})},this.composeEventName=e=>{let t=e;return this.eventPrefix===!0?t=`${this.controller.identifier}:${e}`:typeof this.eventPrefix==`string`&&(t=`${this.eventPrefix}:${e}`),t};let n=e.application;n.stimulusUseDebug!==void 0&&!n.stimulusUseDebugWarned&&(n.stimulusUseDebugWarned=!0,console.warn("[stimulus-use] `application.stimulusUseDebug` is deprecated and will be removed in a future release. Use Stimulus’ built-in debug mode instead: `application.debug = true`. https://stimulus.hotwired.dev/handbook/installing#debugging"));let r=n.debug||n.stimulusUseDebug||o.debug;this.debug=t?.debug??r,this.logger=t?.logger??o.logger,this.controller=e,this.controllerId=e.element.id||e.element.dataset.id,this.targetElement=t?.element||e.element;let{dispatchEvent:i,eventPrefix:a}=Object.assign({},o,t);Object.assign(this,{dispatchEvent:i,eventPrefix:a}),this.controllerInitialize=e.initialize.bind(e),this.controllerConnect=e.connect.bind(e),this.controllerDisconnect=e.disconnect.bind(e)}}const s={eventPrefix:!0,bubbles:!0,cancelable:!0};class UseDispatch extends StimulusUse{constructor(e,t={}){super(e,t),this.dispatch=(e,t={})=>{let{controller:r,targetElement:i,eventPrefix:a,bubbles:o,cancelable:s,log:c,warn:l}=this;Object.assign(t,{controller:r});let u=n(e,this.controller,a),d=new CustomEvent(u,{detail:t,bubbles:o,cancelable:s});return i.dispatchEvent(d),l("`useDispatch()` is deprecated. Please use the built-in `this.dispatch()` function from Stimulus. You can find more information on how to upgrade at: https://stimulus-use.dev/use-dispatch"),c(`dispatch`,{eventName:u,detail:t,bubbles:o,cancelable:s}),d},this.targetElement=t.element??e.element,this.eventPrefix=t.eventPrefix??s.eventPrefix,this.bubbles=t.bubbles??s.bubbles,this.cancelable=t.cancelable??s.cancelable,this.enhanceController()}enhanceController(){Object.assign(this.controller,{dispatch:this.dispatch})}}const c=(e,t={})=>new UseDispatch(e,t),l={overwriteDispatch:!0},u=(e,t={})=>{let{overwriteDispatch:n}=Object.assign({},l,t);Object.defineProperty(e,"isPreview",{get(){return document.documentElement.hasAttribute(`data-turbolinks-preview`)||document.documentElement.hasAttribute(`data-turbo-preview`)}}),Object.defineProperty(e,"isConnected",{get(){return!!Array.from(this.context.module.connectedContexts).find((e=>e===this.context))}}),Object.defineProperty(e,"csrfToken",{get(){return this.metaValue(`csrf-token`)}}),n&&c(e,t),Object.assign(e,{metaValue(e){let t=document.head.querySelector(`meta[name="${e}"]`);return t&&t.getAttribute(`content`)}})};class ApplicationController extends e{constructor(e){super(e),this.isPreview=!1,this.isConnected=!1,this.csrfToken=``,u(this,this.options)}}const d={events:[`click`,`touchend`],onlyVisible:!0,dispatchEvent:!0,eventPrefix:!0},f=(e,t={})=>{let a=e,{onlyVisible:o,dispatchEvent:s,events:c,eventPrefix:l}=Object.assign({},d,t),u=e=>{let c=t?.element||a.element;if(!(e.target instanceof Node&&c.contains(e.target)||!i(c)&&o)&&(a.clickOutside&&a.clickOutside(e),s)){let t=r(n(`click:outside`,a,l),e,{controller:a});c.dispatchEvent(t)}},f=()=>{c?.forEach((e=>{window.addEventListener(e,u,!0)}))},p=()=>{c?.forEach((e=>{window.removeEventListener(e,u,!0)}))},m=a.disconnect.bind(a);return Object.assign(a,{disconnect(){p(),m()}}),f(),[f,p]};class ClickOutsideComposableController extends e{}class ClickOutsideController extends ClickOutsideComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=f(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class DebounceController extends e{}DebounceController.debounces=[];const p=200,m=(e,t=200,{leading:n=!1,trailing:r=!0}={})=>{let i=null,a=!1;return function(){let o=Array.from(arguments),s=this,c=o.map((e=>e instanceof Event?e.params:void 0)),l=o.map((e=>e instanceof Event?e.currentTarget:void 0)),u=()=>(o.forEach(((e,t)=>{e instanceof Event&&(e.params=c[t],Object.defineProperty(e,"currentTarget",{configurable:!0,value:l[t]}))})),e.apply(s,o)),d=i===null;i&&clearTimeout(i),n&&d?(u(),a=!1):a=!0,i=setTimeout((()=>{i=null,r&&a&&(a=!1,u())}),t)}},h=(e,t)=>{let n=e;n.constructor.debounces.forEach((e=>{if(typeof e==`string`&&(n[e]=m(n[e],t?.wait,{leading:t?.leading,trailing:t?.trailing})),typeof e==`object`){let{name:r,wait:i,leading:a,trailing:o}=e;if(!r)return;n[r]=m(n[r],i??t?.wait,{leading:a??t?.leading,trailing:o??t?.trailing})}}))};class UseHover extends StimulusUse{constructor(e,t={}){super(e,t),this.observe=()=>{this.targetElement.addEventListener(`mouseenter`,this.onEnter),this.targetElement.addEventListener(`mouseleave`,this.onLeave)},this.unobserve=()=>{this.targetElement.removeEventListener(`mouseenter`,this.onEnter),this.targetElement.removeEventListener(`mouseleave`,this.onLeave)},this.onEnter=e=>{this.call(`mouseEnter`,e),this.log(`mouseEnter`,{hover:!0}),this.dispatch(`mouseEnter`,{hover:!1})},this.onLeave=e=>{this.call(`mouseLeave`,e),this.log(`mouseLeave`,{hover:!1}),this.dispatch(`mouseLeave`,{hover:!1})},this.controller=e,this.enhanceController(),this.observe()}enhanceController(){let e=this.controller.disconnect.bind(this.controller),t=()=>{this.unobserve(),e()};Object.assign(this.controller,{disconnect:t})}}const g=(e,t={})=>{let n=new UseHover(e,t);return[n.observe,n.unobserve]};class HoverComposableController extends e{}class HoverController extends HoverComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=g(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const _=[`mousemove`,`mousedown`,`resize`,`keydown`,`touchstart`,`wheel`],v=6e4,y={ms:6e4,initialState:!1,events:_,dispatchEvent:!0,eventPrefix:!0},b=(e,i={})=>{let a=e,{ms:o,initialState:s,events:c,dispatchEvent:l,eventPrefix:u}=Object.assign({},y,i),d=s,f=setTimeout((()=>{d=!0,p()}),o),p=e=>{let i=n(`away`,a,u);if(a.isIdle=!0,t(a,`away`).call(a,e),l){let t=r(i,e||null,{controller:a});a.element.dispatchEvent(t)}},m=e=>{let i=n(`back`,a,u);if(a.isIdle=!1,t(a,`back`).call(a,e),l){let t=r(i,e||null,{controller:a});a.element.dispatchEvent(t)}},h=e=>{d&&m(e),d=!1,clearTimeout(f),f=setTimeout((()=>{d=!0,p(e)}),o)},g=e=>{document.hidden||h(e)};d?p():m();let _=a.disconnect.bind(a),v=()=>{c.forEach((e=>{window.addEventListener(e,h)})),document.addEventListener(`visibilitychange`,g)},b=()=>{clearTimeout(f),c.forEach((e=>{window.removeEventListener(e,h)})),document.removeEventListener(`visibilitychange`,g)};return Object.assign(a,{disconnect(){b(),_()}}),v(),[v,b]};class IdleComposableController extends e{constructor(){super(...arguments),this.isIdle=!1}}class IdleController extends IdleComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=b(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const x={dispatchEvent:!0,eventPrefix:!0,visibleAttribute:`isVisible`},S=(e,i={})=>{let a=e,{dispatchEvent:o,eventPrefix:s,visibleAttribute:c}=Object.assign({},x,i),l=i?.element||a.element;a.intersectionElements||(a.intersectionElements=[]),a.intersectionElements.push(l);let u=e=>{let[t]=e;t.isIntersecting?f(t):l.hasAttribute(c)&&p(t)},d=new IntersectionObserver(u,i),f=e=>{if(l.setAttribute(c,`true`),t(a,`appear`).call(a,e,d),o){let t=r(n(`appear`,a,s),null,{controller:a,entry:e,observer:d});l.dispatchEvent(t)}},p=e=>{if(l.removeAttribute(c),t(a,`disappear`).call(a,e,d),o){let t=r(n(`disappear`,a,s),null,{controller:a,entry:e,observer:d});l.dispatchEvent(t)}},m=a.disconnect.bind(a),h=()=>{_(),m()},g=()=>{d.observe(l)},_=()=>{d.unobserve(l)},v=()=>a.intersectionElements.filter((e=>e.hasAttribute(c))).length===0,y=()=>a.intersectionElements.filter((e=>e.hasAttribute(c))).length===1,b=()=>a.intersectionElements.some((e=>e.hasAttribute(c))),S=()=>a.intersectionElements.every((e=>e.hasAttribute(c)));return Object.assign(a,{isVisible:S,noneVisible:v,oneVisible:y,atLeastOneVisible:b,allVisible:S,disconnect:h}),g(),[g,_]};class IntersectionComposableController extends e{}class IntersectionController extends IntersectionComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=S(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const C=(e,n)=>{let r=t=>{let[n]=t;n.isIntersecting&&!e.isLoaded&&i()},i=n=>{let r=e.data.get(`src`);if(!r)return;let i=e.element;e.isLoading=!0,t(e,`loading`).call(e,r),i.onload=()=>{a(r)},i.src=r},a=n=>{e.isLoading=!1,e.isLoaded=!0,t(e,`loaded`).call(e,n)},o=e.disconnect.bind(e),s=new IntersectionObserver(r,n),c=()=>{s.observe(e.element)},l=()=>{s.unobserve(e.element)};return Object.assign(e,{isVisible:!1,disconnect(){l(),o()}}),c(),[c,l]};class LazyLoadComposableController extends e{constructor(){super(...arguments),this.isLoading=!1,this.isLoaded=!1}}class LazyLoadController extends LazyLoadComposableController{constructor(e){super(e),this.options={rootMargin:`10%`},requestAnimationFrame((()=>{let[e,t]=C(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const w={mediaQueries:{},dispatchEvent:!0,eventPrefix:!0,debug:!1};class UseMatchMedia extends StimulusUse{constructor(e,t={}){if(super(e,t),this.matches=[],this.callback=e=>{let t=Object.keys(this.mediaQueries).find((t=>this.mediaQueries[t]===e.media));if(!t)return;let{media:n,matches:r}=e;this.changed({name:t,media:n,matches:r,event:e})},this.changed=e=>{let{name:t}=e;e.event&&(this.call(a(`${t}_changed`),e),this.dispatch(`${t}:changed`,e),this.log(`media query "${t}" changed`,e)),e.matches?(this.call(a(`is_${t}`),e),this.dispatch(`is:${t}`,e)):(this.call(a(`not_${t}`),e),this.dispatch(`not:${t}`,e))},this.observe=()=>{Object.keys(this.mediaQueries).forEach((e=>{let t=this.mediaQueries[e],n=window.matchMedia(t);n.addListener(this.callback),this.matches.push(n),this.changed({name:e,media:t,matches:n.matches})}))},this.unobserve=()=>{this.matches.forEach((e=>e.removeListener(this.callback)))},this.controller=e,this.mediaQueries=t.mediaQueries??w.mediaQueries,this.dispatchEvent=t.dispatchEvent??w.dispatchEvent,this.eventPrefix=t.eventPrefix??w.eventPrefix,this.debug=t.debug??w.debug,!window.matchMedia){console.error(`window.matchMedia() is not available`);return}this.enhanceController(),this.observe()}enhanceController(){let e=this.controller.disconnect.bind(this.controller),t=()=>{this.unobserve(),e()};Object.assign(this.controller,{disconnect:t})}}const T=(e,t={})=>{let n=new UseMatchMedia(e,t);return[n.observe,n.unobserve]},E=(e,t)=>{let n=Object.getPrototypeOf(e);for(;n&&n!==Object.prototype;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=Object.getPrototypeOf(n)}},D=e=>{e.constructor.memos?.forEach((t=>{let n=E(e,t);if(!n||typeof n.get!=`function`)return;let r=n.get;Object.defineProperty(e,t,{configurable:!0,get(){let e=r.call(this);return Object.defineProperty(this,t,{value:e,configurable:!0}),e}})}))},O=(e,t,n)=>{let r=n?`${a(t)}Meta`:a(t);Object.defineProperty(e,r,{get(){return A(k(t))}})};function k(e){let t=document.head.querySelector(`meta[name="${e}"]`);return t&&t.getAttribute(`content`)}function A(e){try{return JSON.parse(e)}catch(t){return e}}const j=(e,t={suffix:!0})=>{let n=e.constructor.metaNames,r=t.suffix;n?.forEach((t=>{O(e,t,r)})),Object.defineProperty(e,"metas",{get(){let e={};return n?.forEach((t=>{let n=A(k(t));n!=null&&(e[a(t)]=n)})),e}})};class UseMutation extends StimulusUse{constructor(e,t={}){super(e,t),this.observe=()=>{try{this.observer.observe(this.targetElement,this.options)}catch(e){this.controller.application.handleError(e,`At a minimum, one of childList, attributes, and/or characterData must be true`,{})}},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{this.call(`mutate`,e),this.log(`mutate`,{entries:e}),this.dispatch(`mutate`,{entries:e})},this.targetElement=t?.element||e.element,this.controller=e,this.options=t,this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}enhanceController(){let e=this.controller.disconnect.bind(this.controller),t=()=>{this.unobserve(),e()};Object.assign(this.controller,{disconnect:t})}}const M=(e,t={})=>{let n=new UseMutation(e,t);return[n.observe,n.unobserve]};class MutationComposableController extends e{}class MutationController extends MutationComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=M(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const N={dispatchEvent:!0,eventPrefix:!0},P=(e,i={})=>{let a=e,{dispatchEvent:o,eventPrefix:s}=Object.assign({},N,i),c=i?.element||a.element,l=i?.box,u=null,d=e=>{u!==null&&cancelAnimationFrame(u),u=requestAnimationFrame((()=>{u=null;let[i]=e;if(t(a,`resize`).call(a,i.contentRect),o){let e=r(n(`resize`,a,s),null,{controller:a,entry:i});c.dispatchEvent(e)}}))},f=a.disconnect.bind(a),p=new ResizeObserver(d),m=()=>{p.observe(c,l?{box:l}:void 0)},h=()=>{u!==null&&(cancelAnimationFrame(u),u=null),p.unobserve(c)};return Object.assign(a,{disconnect(){h(),f()}}),m(),[m,h]};class ResizeComposableController extends e{}class ResizeController extends ResizeComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=P(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class UseTargetMutation extends StimulusUse{constructor(e,t={}){super(e,t),this.observe=()=>{this.observer.observe(this.targetElement,{subtree:!0,characterData:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:[this.targetSelector,this.scopedTargetSelector]})},this.unobserve=()=>{this.observer.disconnect()},this.mutation=e=>{for(let t of e)switch(t.type){case`attributes`:let e=t.target.getAttribute(t.attributeName),n=t.oldValue;if(t.attributeName===this.targetSelector||t.attributeName===this.scopedTargetSelector){let r=this.targetsUsedByThisController(n),i=this.targetsUsedByThisController(e),a=r.filter((e=>!i.includes(e))),o=i.filter((e=>!r.includes(e)));a.forEach((e=>this.targetRemoved(this.stripIdentifierPrefix(e),t.target,`attributeChange`))),o.forEach((e=>this.targetAdded(this.stripIdentifierPrefix(e),t.target,`attributeChange`)))}break;case`characterData`:let r=this.findTargetInAncestry(t.target);if(r==null)return;this.targetsUsedByThisControllerFromNode(r).forEach((e=>{this.targetChanged(this.stripIdentifierPrefix(e),r,`domMutation`)}));break;case`childList`:let{addedNodes:i,removedNodes:a}=t;i.forEach((e=>this.processNodeDOMMutation(e,this.targetAdded))),a.forEach((e=>this.processNodeDOMMutation(e,this.targetRemoved)));break}},this.controller=e,this.options=t,this.targetElement=e.element,this.identifier=e.scope.identifier,this.identifierPrefix=`${this.identifier}.`,this.targetSelector=e.scope.schema.targetAttribute,this.scopedTargetSelector=`data-${this.identifier}-target`,this.targets=t.targets||e.constructor.targets,this.prefixedTargets=this.targets.map((e=>`${this.identifierPrefix}${e}`)),this.observer=new MutationObserver(this.mutation),this.enhanceController(),this.observe()}processNodeDOMMutation(e,t){let n=e,r=t,i=[];n.nodeName==`#text`||this.targetsUsedByThisControllerFromNode(n).length==0?(r=this.targetChanged,n=this.findTargetInAncestry(e)):i=this.targetsUsedByThisControllerFromNode(n),n!=null&&(i.length==0&&(i=this.targetsUsedByThisControllerFromNode(n)),i.forEach((e=>{r.call(this,this.stripIdentifierPrefix(e),n,`domMutation`)})))}findTargetInAncestry(e){let t=e,n=[];for(t.nodeName!=`#text`&&(n=this.targetsUsedByThisControllerFromNode(t));t.parentNode!==null&&t.parentNode!=this.targetElement&&n.length==0;)if(t=t.parentNode,t.nodeName!==`#text`&&this.targetsUsedByThisControllerFromNode(t).length>0)return t;return t.nodeName==`#text`||t.parentNode==null?null:t.parentNode==this.targetElement&&this.targetsUsedByThisControllerFromNode(t).length>0?t:null}targetAdded(e,n,r){let i=`${e}TargetAdded`;this.controller[i]&&t(this.controller,i).call(this.controller,n),this.warn("`[target]TargetAdded` is deprecated. Please use the built-in `[target]TargetConnected()` function from Stimulus."),this.log(`targetAdded`,{target:e,node:n,trigger:r})}targetRemoved(e,n,r){let i=`${e}TargetRemoved`;this.controller[i]&&t(this.controller,i).call(this.controller,n),this.warn("`[target]TargetRemoved` is deprecated. Please use the built-in `[target]TargetDisconnected()` function from Stimulus."),this.log(`targetRemoved`,{target:e,node:n,trigger:r})}targetChanged(e,n,r){let i=`${e}TargetChanged`;this.controller[i]&&t(this.controller,i).call(this.controller,n),this.log(`targetChanged`,{target:e,node:n,trigger:r})}targetsUsedByThisControllerFromNode(e){if(e.nodeName==`#text`||e.nodeName==`#comment`)return[];let t=e;return this.targetsUsedByThisController(t.getAttribute(this.scopedTargetSelector)||t.getAttribute(this.targetSelector))}targetsUsedByThisController(e){e=e||``;let t=this.stripIdentifierPrefix(e).split(` `);return this.targets.filter((e=>t.indexOf(e)!==-1))}stripIdentifierPrefix(e){return e.replace(new RegExp(this.identifierPrefix,`g`),``)}enhanceController(){let e=this.controller.disconnect.bind(this.controller),t=()=>{this.unobserve(),e()};Object.assign(this.controller,{disconnect:t})}}const F=(e,t={})=>{let n=new UseTargetMutation(e,t);return n.warn("`[target]TargetAdded` and `[target]TargetRemoved` are deprecated. Please use the built-in `[target]TargetConnected()` and `[target]TargetDisconnected()` functions from Stimulus."),[n.observe,n.unobserve]};class TargetMutationComposableController extends e{}class TargetMutationController extends TargetMutationComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=F(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class ThrottleController extends e{}ThrottleController.throttles=[];const I=200;function L(e,t=200){let n;return function(){let r=arguments,i=this;n||(n=!0,e.apply(i,r),setTimeout((()=>n=!1),t))}}const R=(e,t={})=>{let n=e;n.constructor.throttles?.forEach((e=>{if(typeof e==`string`&&(n[e]=L(n[e],t?.wait)),typeof e==`object`){let{name:r,wait:i}=e;if(!r)return;n[r]=L(n[r],i||t?.wait)}}))},z={enterFromClass:`enter`,enterActiveClass:`enterStart`,enterToClass:`enterEnd`,leaveFromClass:`leave`,leaveActiveClass:`leaveStart`,leaveToClass:`leaveEnd`},B={transitioned:!1,hiddenClass:`hidden`,preserveOriginalClass:!0,removeToClasses:!0},V=(e,t={})=>{let n=e,r=n.element.dataset.transitionTarget,i;r&&(i=n[`${r}Target`]);let a=t?.element||i||n.element;if(!(a instanceof HTMLElement||a instanceof SVGElement))return;let o=a.dataset,s=parseInt(o.leaveAfter||``)||t.leaveAfter||0,{transitioned:c,hiddenClass:l,preserveOriginalClass:u,removeToClasses:d}=Object.assign({},B,t),f=n.enter?.bind(n),p=n.leave?.bind(n),m=n.toggleTransition?.bind(n);async function h(e){if(n.transitioned)return;n.transitioned=!0,f&&f(e);let r=H(`enterFrom`,t,o),i=H(`enterActive`,t,o),c=H(`enterTo`,t,o),p=H(`leaveTo`,t,o);l&&a.classList.remove(l),d||x(a,p),await v(a,r,i,c,l,u,d),s>0&&setTimeout((()=>{g(e)}),s)}async function g(e){if(!n.transitioned)return;n.transitioned=!1,p&&p(e);let r=H(`leaveFrom`,t,o),i=H(`leaveActive`,t,o),s=H(`leaveTo`,t,o),c=H(`enterTo`,t,o);d||x(a,c),await v(a,r,i,s,l,u,d),l&&a.classList.add(l)}function _(e){m&&m(e),n.transitioned?g():h()}async function v(e,t,n,r,i,a,o){let s=[];a&&(t.forEach((t=>e.classList.contains(t)&&t!==i&&s.push(t))),n.forEach((t=>e.classList.contains(t)&&t!==i&&s.push(t))),r.forEach((t=>e.classList.contains(t)&&t!==i&&s.push(t)))),b(e,t),x(e,s),b(e,n),await W(),x(e,t),b(e,r),await U(e),x(e,n),o&&x(e,r),b(e,s)}function y(){n.transitioned=c,c?(l&&a.classList.remove(l),h()):(l&&a.classList.add(l),g())}function b(e,t){t.length>0&&e.classList.add(...t)}function x(e,t){t.length>0&&e.classList.remove(...t)}return y(),Object.assign(n,{enter:h,leave:g,toggleTransition:_}),[h,g,_]};function H(e,t,n){let r=`transition${e[0].toUpperCase()}${e.substr(1)}`,i=z[e],a=t[e]||n[r]||n[i]||` `;return G(a)?[]:a.split(` `)}async function U(e){return new Promise((t=>{let n=Number(getComputedStyle(e).transitionDuration.split(`,`)[0].replace(`s`,``))*1e3;setTimeout((()=>{t(n)}),n)}))}async function W(){return new Promise((e=>{requestAnimationFrame((()=>{requestAnimationFrame(e)}))}))}function G(e){return e.length===0||!e.trim()}class TransitionComposableController extends e{constructor(){super(...arguments),this.transitioned=!1}}class TransitionController extends TransitionComposableController{constructor(e){super(e),requestAnimationFrame((()=>{V(this,this.options)}))}}class UseVisibility extends StimulusUse{constructor(e,t={}){super(e,t),this.observe=()=>{this.controller.isVisible=!document.hidden,document.addEventListener(`visibilitychange`,this.handleVisibilityChange),this.handleVisibilityChange()},this.unobserve=()=>{document.removeEventListener(`visibilitychange`,this.handleVisibilityChange)},this.becomesInvisible=e=>{this.controller.isVisible=!1,this.call(`invisible`,e),this.log(`invisible`,{isVisible:!1}),this.dispatch(`invisible`,{event:e,isVisible:!1})},this.becomesVisible=e=>{this.controller.isVisible=!0,this.call(`visible`,e),this.log(`visible`,{isVisible:!0}),this.dispatch(`visible`,{event:e,isVisible:!0})},this.handleVisibilityChange=e=>{document.hidden?this.becomesInvisible(e):this.becomesVisible(e)},this.controller=e,this.enhanceController(),this.observe()}enhanceController(){let e=this.controllerDisconnect,t=()=>{this.unobserve(),e()};Object.assign(this.controller,{disconnect:t})}}const K=(e,t={})=>{let n=new UseVisibility(e,t);return[n.observe,n.unobserve]};class VisibilityComposableController extends e{constructor(){super(...arguments),this.isVisible=!1}}class VisibilityController extends VisibilityComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=K(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}class UseWindowFocus extends StimulusUse{constructor(e,t={}){super(e,t),this.observe=()=>{document.hasFocus()?this.becomesFocused():this.becomesUnfocused(),this.interval=setInterval((()=>{this.handleWindowFocusChange()}),this.intervalDuration)},this.unobserve=()=>{clearInterval(this.interval)},this.becomesUnfocused=e=>{this.controller.hasFocus=!1,this.call(`unfocus`,e),this.log(`unfocus`,{hasFocus:!1}),this.dispatch(`unfocus`,{event:e,hasFocus:!1})},this.becomesFocused=e=>{this.controller.hasFocus=!0,this.call(`focus`,e),this.log(`focus`,{hasFocus:!0}),this.dispatch(`focus`,{event:e,hasFocus:!0})},this.handleWindowFocusChange=e=>{document.hasFocus()&&!this.controller.hasFocus?this.becomesFocused(e):!document.hasFocus()&&this.controller.hasFocus&&this.becomesUnfocused(e)},this.controller=e,this.intervalDuration=t.interval||200,this.enhanceController(),this.observe()}enhanceController(){let e=this.controllerDisconnect,t=()=>{this.unobserve(),e()};Object.assign(this.controller,{disconnect:t})}}const q=(e,t={})=>{let n=new UseWindowFocus(e,t);return[n.observe,n.unobserve]};class WindowFocusComposableController extends e{constructor(){super(...arguments),this.hasFocus=!1}}class WindowFocusController extends WindowFocusComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=q(this,this.options);Object.assign(this,{observe:e,unobserve:t})}))}}const J=e=>{let n=e,r=e=>{let{innerWidth:r,innerHeight:i}=window,a={height:i||1/0,width:r||1/0,event:e};t(n,`windowResize`).call(n,a)},i=n.disconnect.bind(n),a=()=>{window.addEventListener(`resize`,r),r()},o=()=>{window.removeEventListener(`resize`,r)};return Object.assign(n,{disconnect(){o(),i()}}),a(),[a,o]};class WindowResizeComposableController extends e{}class WindowResizeController extends WindowResizeComposableController{constructor(e){super(e),requestAnimationFrame((()=>{let[e,t]=J(this);Object.assign(this,{observe:e,unobserve:t})}))}}function Y(){throw"[stimulus-use] Notice: The import for `useHotkeys()` has been moved from `stimulus-use` to `stimulus-use/hotkeys`. \nPlease change the import accordingly and add `hotkey-js` as a dependency to your project. \n\nFor more information see: https://stimulus-use.dev/use-hotkeys#importing-the-behavior"}export{ApplicationController,ClickOutsideController,HoverController,IdleController,IntersectionController,LazyLoadController,MutationController,ResizeController,TargetMutationController,TransitionController,UseHover,UseMutation,UseTargetMutation,UseVisibility,UseWindowFocus,VisibilityController,WindowFocusController,WindowResizeController,m as debounce,u as useApplication,f as useClickOutside,h as useDebounce,c as useDispatch,Y as useHotkeys,g as useHover,b as useIdle,S as useIntersection,C as useLazyLoad,T as useMatchMedia,D as useMemo,j as useMeta,M as useMutation,P as useResize,F as useTargetMutation,R as useThrottle,V as useTransition,K as useVisibility,q as useWindowFocus,J as useWindowResize};