From 47f31578fd6ac0837137e74886bb2898c5e83e1a Mon Sep 17 00:00:00 2001 From: Ed Chao Date: Fri, 22 May 2026 18:06:16 +0900 Subject: [PATCH 01/18] refactor: migrate sass to vanilla css --- .stylelintrc | 13 +- Gemfile | 3 - Gemfile.lock | 11 - Procfile.dev | 3 +- app/assets/stylesheets/application.css | 52 +++ app/assets/stylesheets/application.scss | 48 --- .../stylesheets/components/_action_bar.scss | 7 - .../stylesheets/components/_avatar.scss | 5 - app/assets/stylesheets/components/_badge.scss | 11 - .../stylesheets/components/_button.scss | 81 ---- app/assets/stylesheets/components/_card.scss | 72 ---- .../stylesheets/components/_dialog.scss | 31 -- .../stylesheets/components/_dropdown.scss | 96 ----- app/assets/stylesheets/components/_flash.scss | 32 -- app/assets/stylesheets/components/_form.scss | 47 --- app/assets/stylesheets/components/_icon.scss | 28 -- app/assets/stylesheets/components/_input.scss | 38 -- app/assets/stylesheets/components/_list.scss | 63 ---- .../stylesheets/components/_loader.scss | 19 - app/assets/stylesheets/components/_logo.scss | 7 - app/assets/stylesheets/components/_nav.scss | 22 -- .../stylesheets/components/_overlay.scss | 19 - .../stylesheets/components/_player.scss | 106 ------ .../stylesheets/components/_search.scss | 15 - app/assets/stylesheets/components/_tab.scss | 29 -- app/assets/stylesheets/components/_table.scss | 58 --- .../stylesheets/components/action_bar.css | 7 + app/assets/stylesheets/components/avatar.css | 7 + app/assets/stylesheets/components/badge.css | 11 + app/assets/stylesheets/components/button.css | 81 ++++ app/assets/stylesheets/components/card.css | 69 ++++ app/assets/stylesheets/components/dialog.css | 31 ++ .../stylesheets/components/dropdown.css | 95 +++++ app/assets/stylesheets/components/flash.css | 31 ++ app/assets/stylesheets/components/form.css | 47 +++ app/assets/stylesheets/components/icon.css | 29 ++ app/assets/stylesheets/components/input.css | 38 ++ app/assets/stylesheets/components/list.css | 63 ++++ app/assets/stylesheets/components/loader.css | 21 ++ app/assets/stylesheets/components/logo.css | 9 + app/assets/stylesheets/components/nav.css | 21 ++ app/assets/stylesheets/components/overlay.css | 19 + app/assets/stylesheets/components/player.css | 106 ++++++ app/assets/stylesheets/components/search.css | 15 + .../components/{_sidebar.scss => sidebar.css} | 31 +- app/assets/stylesheets/components/tab.css | 29 ++ app/assets/stylesheets/components/table.css | 55 +++ app/assets/stylesheets/elements/_content.scss | 51 --- app/assets/stylesheets/elements/_page.scss | 9 - app/assets/stylesheets/elements/content.css | 51 +++ app/assets/stylesheets/elements/page.css | 8 + .../stylesheets/generic/_box_sizing.scss | 9 - .../stylesheets/generic/_normalize.scss | 349 ----------------- app/assets/stylesheets/generic/_reset.scss | 52 --- app/assets/stylesheets/generic/box_sizing.css | 11 + app/assets/stylesheets/generic/normalize.css | 351 ++++++++++++++++++ app/assets/stylesheets/generic/reset.css | 54 +++ .../stylesheets/objects/_animations.scss | 41 -- .../stylesheets/objects/_container.scss | 36 -- app/assets/stylesheets/objects/_flex.scss | 107 ------ app/assets/stylesheets/objects/_grid.scss | 43 --- app/assets/stylesheets/objects/animations.css | 43 +++ app/assets/stylesheets/objects/container.css | 38 ++ app/assets/stylesheets/objects/flex.css | 109 ++++++ app/assets/stylesheets/objects/grid.css | 39 ++ app/assets/stylesheets/settings/_bridge.scss | 4 - app/assets/stylesheets/settings/_colors.scss | 18 - .../stylesheets/settings/_dark_theme.scss | 127 ------- .../stylesheets/settings/_light_theme.scss | 127 ------- app/assets/stylesheets/settings/_theme.scss | 22 -- .../stylesheets/settings/_variables.scss | 45 --- app/assets/stylesheets/settings/colors.css | 27 ++ app/assets/stylesheets/settings/theme.css | 148 ++++++++ app/assets/stylesheets/settings/variables.css | 36 ++ app/assets/stylesheets/tools/_functions.scss | 23 -- app/assets/stylesheets/tools/_responsive.scss | 16 - .../stylesheets/utilities/_background.scss | 7 - app/assets/stylesheets/utilities/_border.scss | 15 - app/assets/stylesheets/utilities/_cursor.scss | 3 - .../stylesheets/utilities/_display.scss | 20 - app/assets/stylesheets/utilities/_image.scss | 19 - .../stylesheets/utilities/_overflow.scss | 7 - .../stylesheets/utilities/_position.scss | 15 - app/assets/stylesheets/utilities/_sizing.scss | 25 -- .../stylesheets/utilities/_spacing.scss | 90 ----- app/assets/stylesheets/utilities/_text.scss | 52 --- .../stylesheets/utilities/_visibility.scss | 3 - .../stylesheets/utilities/background.css | 9 + app/assets/stylesheets/utilities/border.css | 21 ++ app/assets/stylesheets/utilities/bridge.css | 6 + app/assets/stylesheets/utilities/cursor.css | 5 + app/assets/stylesheets/utilities/display.css | 58 +++ app/assets/stylesheets/utilities/image.css | 21 ++ app/assets/stylesheets/utilities/overflow.css | 9 + app/assets/stylesheets/utilities/position.css | 17 + app/assets/stylesheets/utilities/sizing.css | 25 ++ app/assets/stylesheets/utilities/spacing.css | 149 ++++++++ app/assets/stylesheets/utilities/text.css | 62 ++++ .../stylesheets/utilities/visibility.css | 5 + esbuild.config.mjs | 38 ++ lib/tasks/lint.rake | 2 +- package-lock.json | 9 +- package.json | 13 +- 103 files changed, 2207 insertions(+), 2223 deletions(-) create mode 100644 app/assets/stylesheets/application.css delete mode 100644 app/assets/stylesheets/application.scss delete mode 100644 app/assets/stylesheets/components/_action_bar.scss delete mode 100644 app/assets/stylesheets/components/_avatar.scss delete mode 100644 app/assets/stylesheets/components/_badge.scss delete mode 100644 app/assets/stylesheets/components/_button.scss delete mode 100644 app/assets/stylesheets/components/_card.scss delete mode 100644 app/assets/stylesheets/components/_dialog.scss delete mode 100644 app/assets/stylesheets/components/_dropdown.scss delete mode 100644 app/assets/stylesheets/components/_flash.scss delete mode 100644 app/assets/stylesheets/components/_form.scss delete mode 100644 app/assets/stylesheets/components/_icon.scss delete mode 100644 app/assets/stylesheets/components/_input.scss delete mode 100644 app/assets/stylesheets/components/_list.scss delete mode 100644 app/assets/stylesheets/components/_loader.scss delete mode 100644 app/assets/stylesheets/components/_logo.scss delete mode 100644 app/assets/stylesheets/components/_nav.scss delete mode 100644 app/assets/stylesheets/components/_overlay.scss delete mode 100644 app/assets/stylesheets/components/_player.scss delete mode 100644 app/assets/stylesheets/components/_search.scss delete mode 100644 app/assets/stylesheets/components/_tab.scss delete mode 100644 app/assets/stylesheets/components/_table.scss create mode 100644 app/assets/stylesheets/components/action_bar.css create mode 100644 app/assets/stylesheets/components/avatar.css create mode 100644 app/assets/stylesheets/components/badge.css create mode 100644 app/assets/stylesheets/components/button.css create mode 100644 app/assets/stylesheets/components/card.css create mode 100644 app/assets/stylesheets/components/dialog.css create mode 100644 app/assets/stylesheets/components/dropdown.css create mode 100644 app/assets/stylesheets/components/flash.css create mode 100644 app/assets/stylesheets/components/form.css create mode 100644 app/assets/stylesheets/components/icon.css create mode 100644 app/assets/stylesheets/components/input.css create mode 100644 app/assets/stylesheets/components/list.css create mode 100644 app/assets/stylesheets/components/loader.css create mode 100644 app/assets/stylesheets/components/logo.css create mode 100644 app/assets/stylesheets/components/nav.css create mode 100644 app/assets/stylesheets/components/overlay.css create mode 100644 app/assets/stylesheets/components/player.css create mode 100644 app/assets/stylesheets/components/search.css rename app/assets/stylesheets/components/{_sidebar.scss => sidebar.css} (50%) create mode 100644 app/assets/stylesheets/components/tab.css create mode 100644 app/assets/stylesheets/components/table.css delete mode 100644 app/assets/stylesheets/elements/_content.scss delete mode 100644 app/assets/stylesheets/elements/_page.scss create mode 100644 app/assets/stylesheets/elements/content.css create mode 100644 app/assets/stylesheets/elements/page.css delete mode 100644 app/assets/stylesheets/generic/_box_sizing.scss delete mode 100644 app/assets/stylesheets/generic/_normalize.scss delete mode 100644 app/assets/stylesheets/generic/_reset.scss create mode 100644 app/assets/stylesheets/generic/box_sizing.css create mode 100644 app/assets/stylesheets/generic/normalize.css create mode 100644 app/assets/stylesheets/generic/reset.css delete mode 100644 app/assets/stylesheets/objects/_animations.scss delete mode 100644 app/assets/stylesheets/objects/_container.scss delete mode 100644 app/assets/stylesheets/objects/_flex.scss delete mode 100644 app/assets/stylesheets/objects/_grid.scss create mode 100644 app/assets/stylesheets/objects/animations.css create mode 100644 app/assets/stylesheets/objects/container.css create mode 100644 app/assets/stylesheets/objects/flex.css create mode 100644 app/assets/stylesheets/objects/grid.css delete mode 100644 app/assets/stylesheets/settings/_bridge.scss delete mode 100644 app/assets/stylesheets/settings/_colors.scss delete mode 100644 app/assets/stylesheets/settings/_dark_theme.scss delete mode 100644 app/assets/stylesheets/settings/_light_theme.scss delete mode 100644 app/assets/stylesheets/settings/_theme.scss delete mode 100644 app/assets/stylesheets/settings/_variables.scss create mode 100644 app/assets/stylesheets/settings/colors.css create mode 100644 app/assets/stylesheets/settings/theme.css create mode 100644 app/assets/stylesheets/settings/variables.css delete mode 100644 app/assets/stylesheets/tools/_functions.scss delete mode 100644 app/assets/stylesheets/tools/_responsive.scss delete mode 100644 app/assets/stylesheets/utilities/_background.scss delete mode 100644 app/assets/stylesheets/utilities/_border.scss delete mode 100644 app/assets/stylesheets/utilities/_cursor.scss delete mode 100644 app/assets/stylesheets/utilities/_display.scss delete mode 100644 app/assets/stylesheets/utilities/_image.scss delete mode 100644 app/assets/stylesheets/utilities/_overflow.scss delete mode 100644 app/assets/stylesheets/utilities/_position.scss delete mode 100644 app/assets/stylesheets/utilities/_sizing.scss delete mode 100644 app/assets/stylesheets/utilities/_spacing.scss delete mode 100644 app/assets/stylesheets/utilities/_text.scss delete mode 100644 app/assets/stylesheets/utilities/_visibility.scss create mode 100644 app/assets/stylesheets/utilities/background.css create mode 100644 app/assets/stylesheets/utilities/border.css create mode 100644 app/assets/stylesheets/utilities/bridge.css create mode 100644 app/assets/stylesheets/utilities/cursor.css create mode 100644 app/assets/stylesheets/utilities/display.css create mode 100644 app/assets/stylesheets/utilities/image.css create mode 100644 app/assets/stylesheets/utilities/overflow.css create mode 100644 app/assets/stylesheets/utilities/position.css create mode 100644 app/assets/stylesheets/utilities/sizing.css create mode 100644 app/assets/stylesheets/utilities/spacing.css create mode 100644 app/assets/stylesheets/utilities/text.css create mode 100644 app/assets/stylesheets/utilities/visibility.css create mode 100644 esbuild.config.mjs diff --git a/.stylelintrc b/.stylelintrc index 5b7353c64..10ed24652 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -1,5 +1,6 @@ { - "extends": "stylelint-config-standard-scss", + "extends": "stylelint-config-standard", + "plugins": ["@stylistic/stylelint-plugin"], "rules": { "selector-class-pattern": null, "custom-property-empty-line-before": null, @@ -7,10 +8,14 @@ "value-keyword-case": ["lower", { "ignoreKeywords": ["BlinkMacSystemFont"] }], "keyframes-name-pattern": null, "property-no-vendor-prefix": null, - "color-function-notation": "legacy", + "color-function-notation": "modern", "alpha-value-notation": "number", - "max-line-length": null, "value-no-vendor-prefix": null, - "scss/dollar-variable-empty-line-before": null + "declaration-block-single-line-max-declarations": null, + "media-feature-range-notation": null, + "selector-not-notation": null, + "no-descending-specificity": null, + "import-notation": null, + "@stylistic/indentation": 2 } } diff --git a/Gemfile b/Gemfile index 158da1523..1b079fba5 100644 --- a/Gemfile +++ b/Gemfile @@ -13,9 +13,6 @@ gem "turbo-rails", "~> 2.0.0" # Install Stimulus on Rails gem "stimulus-rails", "~> 1.3.4" -# Bundle and process CSS in Rails -gem "cssbundling-rails", "~> 1.4.0" - # Bundle and transpile JavaScript in Rails gem "jsbundling-rails", "~> 1.3.0" diff --git a/Gemfile.lock b/Gemfile.lock index c4e27f6cc..eb8612f7e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -117,8 +117,6 @@ GEM bigdecimal rexml crass (1.0.6) - cssbundling-rails (1.4.3) - railties (>= 6.0.0) csv (3.3.5) cuprite (0.14.3) capybara (~> 3.0) @@ -149,7 +147,6 @@ GEM webrick (~> 1.7) websocket-driver (>= 0.6, < 0.8) ffi (1.17.4) - ffi (1.17.4-arm64-darwin) fugit (1.11.2) et-orbi (~> 1, >= 1.2.11) raabro (~> 1.4) @@ -235,8 +232,6 @@ GEM nokogiri (1.19.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.19.2-arm64-darwin) - racc (~> 1.4) ostruct (0.6.3) pagy (9.3.5) parallel (1.25.1) @@ -387,7 +382,6 @@ GEM stringio (3.2.0) thor (1.3.2) thruster (0.1.20) - thruster (0.1.20-arm64-darwin) timeout (0.6.1) tsort (0.2.0) turbo-rails (2.0.23) @@ -430,7 +424,6 @@ DEPENDENCIES browser (~> 6.2.0) bullet (~> 8.1.0) capybara (~> 3.40.0) - cssbundling-rails (~> 1.4.0) cuprite (~> 0.14.3) daemons (~> 1.4.0) debug @@ -497,7 +490,6 @@ CHECKSUMS connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a crack (1.0.1) sha256=ff4a10390cd31d66440b7524eb1841874db86201d5b70032028553130b6d4c7e crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d - cssbundling-rails (1.4.3) sha256=53aecd5a7d24ac9c8fcd92975acd0e830fead4ee4583d3d3d49bb64651946e41 csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f cuprite (0.14.3) sha256=5d3b8f85f680f0979bc122bcae69e1f13499956eacdf6307a80498ce9131afbd daemons (1.4.1) sha256=8fc76d76faec669feb5e455d72f35bd4c46dc6735e28c420afb822fac1fa9a1d @@ -513,7 +505,6 @@ CHECKSUMS et-orbi (1.4.0) sha256=6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc ferrum (0.13) sha256=3823a74a5cd772204d46ea67f0c5703cabe00e7716fcb18ec8955099944c1fd2 ffi (1.17.4) sha256=bcd1642e06f0d16fc9e09ac6d49c3a7298b9789bcb58127302f934e437d60acf - ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b fugit (1.11.2) sha256=4c2e234f750c78d4514d0ca343a0b923847eac3846976fdb23ed4245d8fde6fe globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 hashdiff (1.2.1) sha256=9c079dbc513dfc8833ab59c0c2d8f230fa28499cc5efb4b8dd276cf931457cd1 @@ -551,7 +542,6 @@ CHECKSUMS net-ssh (7.3.2) sha256=65029e213c380e20e5fd92ece663934ab0a0fe888e0cd7cc6a5b664074362dd4 nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1 nokogiri (1.19.2) sha256=38fdd8b59db3d5ea9e7dfb14702e882b9bf819198d5bf976f17ebce12c481756 - nokogiri (1.19.2-arm64-darwin) sha256=58d8ea2e31a967b843b70487a44c14c8ba1866daa1b9da9be9dbdf1b43dee205 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 pagy (9.3.5) sha256=78a9513150b96f872c092ab1cd95bb818ea29b2c417a4302290bc9293f8f0fd7 parallel (1.25.1) sha256=12e089b9aa36ea2343f6e93f18cfcebd031798253db8260590d26a7f70b1ab90 @@ -605,7 +595,6 @@ CHECKSUMS stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 thor (1.3.2) sha256=eef0293b9e24158ccad7ab383ae83534b7ad4ed99c09f96f1a6b036550abbeda thruster (0.1.20) sha256=c05f2fbcae527bbe093a6e6d84fb12d9d680617e7c162325d9b97e8e9d4b5201 - thruster (0.1.20-arm64-darwin) sha256=630cf8c273f562063b92ea5ccd7a721d7ba6130cc422c823727f4744f6d0770e timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo-rails (2.0.23) sha256=ee0d90733aafff056cf51ff11e803d65e43cae258cc55f6492020ec1f9f9315f diff --git a/Procfile.dev b/Procfile.dev index 68dce660c..750257949 100644 --- a/Procfile.dev +++ b/Procfile.dev @@ -1,3 +1,2 @@ web: bin/rails server -js: npm run build-dev -- --watch -css: npm run build-dev:css -- --watch \ No newline at end of file +assets: node esbuild.config.mjs --dev --watch \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 000000000..58bab3d89 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,52 @@ +@layer settings, generic, elements, objects, components, utilities; + +@import "./settings/colors.css"; +@import "./settings/variables.css"; +@import "./settings/theme.css"; + +@import "./generic/normalize.css"; +@import "./generic/reset.css"; +@import "./generic/box_sizing.css"; + +@import "./elements/page.css"; +@import "./elements/content.css"; + +@import "./objects/animations.css"; +@import "./objects/grid.css"; +@import "./objects/flex.css"; +@import "./objects/container.css"; + +@import "./components/form.css"; +@import "./components/logo.css"; +@import "./components/button.css"; +@import "./components/icon.css"; +@import "./components/tab.css"; +@import "./components/card.css"; +@import "./components/loader.css"; +@import "./components/input.css"; +@import "./components/dropdown.css"; +@import "./components/dialog.css"; +@import "./components/overlay.css"; +@import "./components/list.css"; +@import "./components/avatar.css"; +@import "./components/flash.css"; +@import "./components/player.css"; +@import "./components/sidebar.css"; +@import "./components/nav.css"; +@import "./components/action_bar.css"; +@import "./components/table.css"; +@import "./components/search.css"; +@import "./components/badge.css"; + +@import "./utilities/display.css"; +@import "./utilities/spacing.css"; +@import "./utilities/sizing.css"; +@import "./utilities/overflow.css"; +@import "./utilities/position.css"; +@import "./utilities/text.css"; +@import "./utilities/border.css"; +@import "./utilities/background.css"; +@import "./utilities/image.css"; +@import "./utilities/cursor.css"; +@import "./utilities/visibility.css"; +@import "./utilities/bridge.css"; diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss deleted file mode 100644 index f71b9b8bd..000000000 --- a/app/assets/stylesheets/application.scss +++ /dev/null @@ -1,48 +0,0 @@ -@use "settings/theme"; -@use "settings/bridge"; - -@use "generic/normalize"; -@use "generic/reset"; -@use "generic/box_sizing"; - -@use "elements/page"; -@use "elements/content"; - -@use "objects/animations"; -@use "objects/grid"; -@use "objects/flex"; -@use "objects/container"; - -@use "components/form"; -@use "components/logo"; -@use "components/button"; -@use "components/icon"; -@use "components/tab"; -@use "components/card"; -@use "components/loader"; -@use "components/input"; -@use "components/dropdown"; -@use "components/dialog"; -@use "components/overlay"; -@use "components/list"; -@use "components/avatar"; -@use "components/flash"; -@use "components/player"; -@use "components/sidebar"; -@use "components/nav"; -@use "components/action_bar"; -@use "components/table"; -@use "components/search"; -@use "components/badge"; - -@use "utilities/display"; -@use "utilities/spacing"; -@use "utilities/sizing"; -@use "utilities/overflow"; -@use "utilities/position"; -@use "utilities/text"; -@use "utilities/border"; -@use "utilities/background"; -@use "utilities/image"; -@use "utilities/cursor"; -@use "utilities/visibility"; diff --git a/app/assets/stylesheets/components/_action_bar.scss b/app/assets/stylesheets/components/_action_bar.scss deleted file mode 100644 index bb2950c5c..000000000 --- a/app/assets/stylesheets/components/_action_bar.scss +++ /dev/null @@ -1,7 +0,0 @@ -@use "../tools/functions" as *; - -.c-action-bar { - padding: spacing("tiny") spacing("narrow"); - border-radius: border-radius("medium"); - background: var(--action-bar-bg-color); -} diff --git a/app/assets/stylesheets/components/_avatar.scss b/app/assets/stylesheets/components/_avatar.scss deleted file mode 100644 index ebc56832c..000000000 --- a/app/assets/stylesheets/components/_avatar.scss +++ /dev/null @@ -1,5 +0,0 @@ -.c-avatar { - width: 25px; - height: 25px; - border-radius: 50%; -} diff --git a/app/assets/stylesheets/components/_badge.scss b/app/assets/stylesheets/components/_badge.scss deleted file mode 100644 index 9761762a8..000000000 --- a/app/assets/stylesheets/components/_badge.scss +++ /dev/null @@ -1,11 +0,0 @@ -@use "../tools/functions" as *; - -.c-badge { - display: inline-block; - border-radius: border-radius("large"); - background-color: var(--badge-bg-color); - color: var(--badge-color); - font-size: font-size("small"); - padding: 2px 13px; - font-weight: 500; -} diff --git a/app/assets/stylesheets/components/_button.scss b/app/assets/stylesheets/components/_button.scss deleted file mode 100644 index 01a441a43..000000000 --- a/app/assets/stylesheets/components/_button.scss +++ /dev/null @@ -1,81 +0,0 @@ -@use "../tools/functions" as *; - -.c-button { - text-align: center; - display: inline-block; - border-radius: border-radius("medium"); - border: none; - padding: spacing("tiny") spacing("narrow"); - cursor: pointer; - font-size: font-size("medium"); - - &:hover { - text-decoration: none; - } -} - -.c-button--primary { - color: var(--btn-color); - background: var(--btn-primary-bg-color); - - &:hover { - background: var(--btn-primary-hover-bg-color); - color: var(--btn-color); - } -} - -.c-button--secondary { - background: var(--btn-secondary-bg-color); - color: var(--btn-secondary-color); - - &:hover { - background: var(--btn-secondary-hover-bg-color); - color: var(--btn-secondary-color); - } -} - -.c-button--link { - text-align: left; - background: none; - color: var(--text-primary-color); - padding: 0; - - &:hover { - color: var(--link-active-color) !important; - } -} - -.c-button--small { - padding: 2px spacing("tiny"); - font-size: font-size("small"); -} - -.c-button--outline { - border-radius: border-radius("large"); - color: var(--btn-outline-color); - border: 1px solid var(--btn-outline-border-color); - background: var(--btn-outline-bg-color); - - &:hover { - background: var(--btn-outline-hover-bg-color); - } -} - -.c-button--icon { - display: inline-flex; - padding: spacing("tiny"); - border-radius: border-radius("medium"); - color: currentcolor; - - &:hover { - background: var(--btn-icon-hover-bg-color); - } -} - -.c-button--full-width { - width: 100%; -} - -.c-button[disabled] { - opacity: 0.6; -} \ No newline at end of file diff --git a/app/assets/stylesheets/components/_card.scss b/app/assets/stylesheets/components/_card.scss deleted file mode 100644 index ce3aec2fd..000000000 --- a/app/assets/stylesheets/components/_card.scss +++ /dev/null @@ -1,72 +0,0 @@ -@use "../tools/functions" as *; -@use "../tools/responsive"; - -.c-card { - width: 100%; -} - -.c-card--border { - border: 1px solid var(--card-border-color); - border-radius: border-radius("medium"); - background-color: var(--card-bg-color); -} - -.c-card--border .c-card__body { - padding: spacing("narrow"); -} - -.c-card__image { - display: block; - margin-bottom: spacing("narrow"); -} - -.c-card__image, -.c-card__image img { - border-radius: border-radius("medium"); -} - -.c-card__body__title { - margin-bottom: spacing("narrow"); - font-size: font-size("large"); -} - -.c-card__body__text { - display: block; - margin-bottom: spacing("tiny"); -} - -.c-card__body__text:last-child { - margin-bottom: 0; -} - -.c-card--horizontal { - display: flex; - - .c-card__image { - margin-right: spacing("medium"); - } - - .c-card__body { - flex-grow: 1; - width: 0; - } -} - -@include responsive.media-query using ($breakpoint) { - @if $breakpoint == "narrow" { - .c-card--center\@narrow { - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - - .c-card__image { - margin: 0 0 spacing("small"); - } - - .c-card__body { - width: auto; - } - } - } -} diff --git a/app/assets/stylesheets/components/_dialog.scss b/app/assets/stylesheets/components/_dialog.scss deleted file mode 100644 index a2df18c02..000000000 --- a/app/assets/stylesheets/components/_dialog.scss +++ /dev/null @@ -1,31 +0,0 @@ -@use "../tools/functions" as *; - -.c-dialog { - padding: 0; - margin-top: 100px; - background: var(--dialog-bg-color); - border: none; - border-radius: border-radius("medium"); - width: 100%; - max-width: 360px; - color: inherit; -} - -.c-dialog::backdrop { - background-color: var(--dialog-backdrop-color); -} - -.c-dialog__header { - padding: spacing("narrow") spacing("small"); - background: var(--dialog-header-bg-color); - color: var(--dialog-header-color); - border-top-left-radius: border-radius("medium"); - border-top-right-radius: border-radius("medium"); -} - -.c-dialog__content { - padding: spacing("narrow") spacing("small"); - overflow-y: auto; - min-height: 50px; - max-height: calc(100vh - 300px); -} diff --git a/app/assets/stylesheets/components/_dropdown.scss b/app/assets/stylesheets/components/_dropdown.scss deleted file mode 100644 index cfbd85c0a..000000000 --- a/app/assets/stylesheets/components/_dropdown.scss +++ /dev/null @@ -1,96 +0,0 @@ -@use "../tools/functions" as *; -@use "../settings/variables"; - -.c-dropdown { - display: inline-block; - position: relative; -} - -.c-dropdown > summary { - cursor: pointer; - list-style: none; - - &::-webkit-details-marker { - display: none; - } -} - -.c-dropdown[open] > summary { - &::before { - position: fixed; - inset: 0; - z-index: variables.$dropdown-overlay-zindex; - display: block; - cursor: default; - content: ""; - background: transparent; - } -} - -.c-dropdown:not([open]) > *:not(summary) { - display: none; -} - -.c-dropdown__menu { - position: absolute; - right: 0; - top: 0; - z-index: variables.$dropdown-zindex; - min-width: 100px; - background: var(--dropdown-bg-color); - border-radius: border-radius("medium"); - color: var(--dropdown-color); - box-shadow: 0 1px 6px var(--dropdown-shadow-color); - max-height: 300px; - overflow-y: auto; -} - -.c-dropdown__menu > hr { - margin: 0; -} - -.c-dropdown__menu--right { - left: 0; - right: auto; -} - -.c-dropdown__item { - display: block; - padding: spacing("narrow"); - white-space: nowrap; -} - -a.c-dropdown__item { - text-decoration: none; - color: var(--dropdown-color); -} - -form.c-dropdown__item input[type="submit"], -form.c-dropdown__item button[type="submit"] { - width: 100%; - background: var(--dropdown-bg-color); - border: none; - cursor: pointer; -} - -.c-dropdown__item:first-child, -form.c-dropdown__item:first-child input[type="submit"], -form.c-dropdown__item:first-child button[type="submit"] { - border-top-left-radius: border-radius("medium"); - border-top-right-radius: border-radius("medium"); -} - -.c-dropdown__item:last-child, -form.c-dropdown__item:last-child input[type="submit"], -form.c-dropdown__item:last-child button[type="submit"] { - border-bottom-left-radius: border-radius("medium"); - border-bottom-right-radius: border-radius("medium"); -} - -a.c-dropdown__item:hover, -form.c-dropdown__item:hover input[type="submit"], -form.c-dropdown__item:hover button[type="submit"], -.c-dropdown__item:hover { - background: var(--dropdown-active-color); - color: var(--dropdown-color); -} diff --git a/app/assets/stylesheets/components/_flash.scss b/app/assets/stylesheets/components/_flash.scss deleted file mode 100644 index b06748772..000000000 --- a/app/assets/stylesheets/components/_flash.scss +++ /dev/null @@ -1,32 +0,0 @@ -@use "../tools/functions" as *; -@use "../settings/variables"; - -.c-flash { - position: absolute; - margin: 0; - padding: 0; - z-index: variables.$flash-zindex; - backface-visibility: hidden; - filter: blur(0); - max-width: 90%; - top: 10%; - left: 50%; - width: 325px; - transform: translate(calc(-50% - 0.5px)) translateZ(0) scale(1, 1); -} - -.c-flash__body { - padding: spacing("tiny"); - text-align: center; - border-radius: border-radius("medium"); -} - -.c-flash__body--alert { - background-color: var(--flash-alert-bg-color); - color: var(--flash-color); -} - -.c-flash__body--notice { - background-color: var(--flash-notice-bg-color); - color: var(--flash-color); -} diff --git a/app/assets/stylesheets/components/_form.scss b/app/assets/stylesheets/components/_form.scss deleted file mode 100644 index 74ab29005..000000000 --- a/app/assets/stylesheets/components/_form.scss +++ /dev/null @@ -1,47 +0,0 @@ -@use "../tools/functions" as *; - -.c-form { - padding-bottom: spacing("medium"); -} - -.c-form__field { - margin-top: spacing("small"); -} - -.c-form__field--inline { - display: flex; - align-items: center; -} - -.c-form__field--submit { - margin-top: spacing("medium"); -} - -.c-form__field label { - display: block; - margin-bottom: spacing("narrow"); -} - -.c-form__field label[disabled] { - opacity: 0.5; -} - -.c-form__field--inline label { - margin-bottom: 0; - margin-right: spacing("tiny"); -} - -.c-form__field > label { - font-weight: bold; -} - -.c-form__radio { - display: inline-flex; - align-items: center; - margin-right: spacing("narrow"); -} - -.c-form__radio label { - margin-bottom: 0; - margin-left: spacing("tiny"); -} diff --git a/app/assets/stylesheets/components/_icon.scss b/app/assets/stylesheets/components/_icon.scss deleted file mode 100644 index b513ff8d3..000000000 --- a/app/assets/stylesheets/components/_icon.scss +++ /dev/null @@ -1,28 +0,0 @@ -.c-icon { - width: 18px; - height: 18px; -} - -.c-icon--small { - width: 16px; - height: 16px; -} - -.c-icon--narrow { - width: 14px; - height: 14px; -} - -.c-icon--large { - width: 22px; - height: 22px; -} - -.c-icon--active { - color: var(--icon-active-color); -} - -.c-icon--emphasis { - color: var(--icon-emphasis-color); -} - diff --git a/app/assets/stylesheets/components/_input.scss b/app/assets/stylesheets/components/_input.scss deleted file mode 100644 index 31eeddf90..000000000 --- a/app/assets/stylesheets/components/_input.scss +++ /dev/null @@ -1,38 +0,0 @@ -@use "../tools/functions" as *; - -input.c-input { - width: 100%; - background: var(--input-bg-color); - border: none; - color: var(--input-color); - padding: spacing("tiny"); - border-radius: border-radius("medium"); - filter: none; -} - -.c-input-group { - display: flex !important; - align-items: center; - background: var(--input-bg-color); - border-radius: border-radius("medium"); - padding: 0 spacing("tiny"); -} - -.c-input-group input { - width: 0 !important; - flex-grow: 1; -} - -.c-input-group input:focus { - outline: none; -} - -.c-input-group__icon { - display: flex; - align-items: center; - color: var(--input-icon-color); -} - -.c-input-group__icon a { - color: var(--input-icon-color); -} diff --git a/app/assets/stylesheets/components/_list.scss b/app/assets/stylesheets/components/_list.scss deleted file mode 100644 index 19f3227fe..000000000 --- a/app/assets/stylesheets/components/_list.scss +++ /dev/null @@ -1,63 +0,0 @@ -@use "../tools/functions" as *; - -.c-list { - list-style: none; - padding: 0; - margin: 0; -} - -.c-list--grouped { - background-color: var(--list-grouped-bg-color); - padding: 0 spacing("narrow"); - border-radius: border-radius("large"); -} - -.c-list__item { - width: 100%; - padding: spacing("narrow") 0; - text-decoration: none; - border-bottom: 1px solid var(--list-border-color); -} - -.c-list__item--divider { - margin-top: spacing("small"); - font-weight: bold; - text-transform: uppercase; -} - -.c-list__item__subtext { - display: inline-block; - margin-top: spacing("tiny"); - color: var(--list-subtext-color); -} - -.c-list--border-none .c-list__item { - border-bottom: none; -} - -.c-list--grouped .c-list__item { - padding: spacing("small") 0; -} - -.c-list__item:last-child { - border-bottom: none; -} - -.c-list__item.is-active * { - color: var(--list-active-color); -} - -.c-list.is-dragging .c-list__item { - border: none; -} - -.c-list.is-dragging .c-list__item:not(.is-dragging-source) * { - // Prevent dragleave from firing when dragging into a child element - pointer-events: none; - opacity: 0.85; -} - -.c-list__item.is-dragging-over { - border: 2px dashed var(--list-active-color) !important; - border-radius: border-radius("medium"); -} \ No newline at end of file diff --git a/app/assets/stylesheets/components/_loader.scss b/app/assets/stylesheets/components/_loader.scss deleted file mode 100644 index 2b6fba74f..000000000 --- a/app/assets/stylesheets/components/_loader.scss +++ /dev/null @@ -1,19 +0,0 @@ -.c-loader { - border: 5px solid var(--loader-secondary-bg-color); - border-top: 5px solid var(--loader-bg-color); - border-radius: 50%; - width: 40px; - height: 40px; -} - -.c-loader--small { - height: 22px; - width: 22px; - border-width: 3px; -} - -.c-loader--large { - height: 55px; - width: 55px; - border-width: 7px; -} diff --git a/app/assets/stylesheets/components/_logo.scss b/app/assets/stylesheets/components/_logo.scss deleted file mode 100644 index e66bd9dcf..000000000 --- a/app/assets/stylesheets/components/_logo.scss +++ /dev/null @@ -1,7 +0,0 @@ -.c-logo { - display: inline-block; - background: url("logo.svg") no-repeat top left; - background-size: contain; - width: 70px; - height: 70px; -} diff --git a/app/assets/stylesheets/components/_nav.scss b/app/assets/stylesheets/components/_nav.scss deleted file mode 100644 index 06b5af3f0..000000000 --- a/app/assets/stylesheets/components/_nav.scss +++ /dev/null @@ -1,22 +0,0 @@ -@use "../tools/functions" as *; -@use "../settings/variables"; - -.c-nav { - padding: spacing("small") spacing("small") 0; - box-shadow: var(--nav-shadow); - z-index: variables.$nav-zindex; -} - -.c-nav--primary { - position: relative; - - &::before { - content: ""; - position: absolute; - inset: 0; - backdrop-filter: blur(15px); - -webkit-backdrop-filter: blur(15px); - z-index: variables.$base-zindex - 1; - background: var(--nav-primary-bg-color); - } -} diff --git a/app/assets/stylesheets/components/_overlay.scss b/app/assets/stylesheets/components/_overlay.scss deleted file mode 100644 index 543534201..000000000 --- a/app/assets/stylesheets/components/_overlay.scss +++ /dev/null @@ -1,19 +0,0 @@ -@use "../settings/variables"; - -.c-overlay { - position: absolute; - inset: 0; - display: flex; - align-items: center; - justify-content: center; - background: inherit; -} - -.c-overlay--fixed { - z-index: variables.$fixed-overlay-zindex; - position: fixed; -} - -.c-overlay--blur { - background: var(--overlay-blur-bg-color); -} diff --git a/app/assets/stylesheets/components/_player.scss b/app/assets/stylesheets/components/_player.scss deleted file mode 100644 index 388f77ecc..000000000 --- a/app/assets/stylesheets/components/_player.scss +++ /dev/null @@ -1,106 +0,0 @@ -@use "../tools/functions" as *; - -.c-player { - background: var(--player-bg-color); -} - -.c-player__control { - background: var(--player-bg-color); - position: relative; - padding: 0 spacing("wide"); - color: var(--player-control-color); -} - -.c-player__control__main { - color: var(--player-control-main-color); - padding: spacing("small") 0; - border-bottom: 1px solid var(--player-control-border-color); -} - -.c-player__control__secondary { - padding: spacing("tiny") 0; -} - -.c-player__header { - transition: max-height 0.2s ease-out; - max-height: 0; - visibility: hidden; - background: inherit; -} - -.c-player__header__content { - background: var(--player-header-bg-color); -} - -.c-player__header__background { - position: absolute; - inset: 0; - filter: blur(15px); - background-position: center; - background-repeat: no-repeat; - background-size: cover; -} - -.c-player__header.is-expanded { - max-height: 200px; - visibility: visible; -} - -.c-player__progress { - display: flex; - align-items: flex-start; - height: 4px; -} - -.c-player__progress progress { - appearance: none; - height: 2px; - border: 0 none; - background: var(--player-progress-bg-color); -} - -.c-player__progress progress::-moz-progress-bar { - background: var(--player-progress-color); -} - -.c-player__progress progress::-webkit-progress-bar { - background: transparent; -} - -.c-player__progress progress::-webkit-progress-value { - background: var(--player-progress-color); -} - -.c-player__progress:hover progress { - height: 4px; - background: var(--player-progress-hover-bg-color); -} - -.c-player__volume { - -webkit-appearance: none; - appearance: none; - width: 100%; - cursor: pointer; - outline: none; - border-radius: border-radius("large"); - height: 5px; - background: linear-gradient(to right, var(--player-volume-color) var(--progress), var(--player-volume-bg-color) var(--progress)); -} - -.c-player__volume::-webkit-slider-thumb { - -webkit-appearance: none; - appearance: none; - height: 12px; - width: 12px; - background-color: var(--player-volume-color); - border-radius: 50%; - border: none; -} - -.c-player__volume::-moz-range-thumb { - height: 12px; - width: 12px; - background-color: var(--player-volume-color); - border-radius: 50%; - border: none; -} diff --git a/app/assets/stylesheets/components/_search.scss b/app/assets/stylesheets/components/_search.scss deleted file mode 100644 index bb361927f..000000000 --- a/app/assets/stylesheets/components/_search.scss +++ /dev/null @@ -1,15 +0,0 @@ -@use "../tools/functions" as *; - -.c-search { - max-width: 380px; - width: 100%; - margin: 0 spacing("small"); -} - -.c-search .c-loader { - display: none; -} - -.c-search.is-loading .c-loader { - display: revert; -} diff --git a/app/assets/stylesheets/components/_tab.scss b/app/assets/stylesheets/components/_tab.scss deleted file mode 100644 index 9f0b86b07..000000000 --- a/app/assets/stylesheets/components/_tab.scss +++ /dev/null @@ -1,29 +0,0 @@ -@use "../tools/functions" as *; - -.c-tab { - display: flex; - justify-content: center; - list-style: none; - margin: 0; - padding: 0; -} - -.c-tab__item { - padding-bottom: spacing("narrow"); - border-bottom: 2px solid transparent; - margin: 0 spacing("large"); -} - -.c-tab__item a { - color: var(--tab-color); - text-decoration: none; -} - -.c-tab__item.is-active a, -.c-tab__item a:hover { - color: var(--tab-active-color); -} - -.c-tab__item.is-active { - border-color: var(--tab-active-color); -} diff --git a/app/assets/stylesheets/components/_table.scss b/app/assets/stylesheets/components/_table.scss deleted file mode 100644 index 25a6b6e27..000000000 --- a/app/assets/stylesheets/components/_table.scss +++ /dev/null @@ -1,58 +0,0 @@ -@use "../tools/responsive"; -@use "../tools/functions" as *; - -.c-table { - display: table; - width: 100%; - table-layout: auto; - text-align: left; -} - -.c-table[role="table"] { - display: grid; - grid-template-columns: var(--grid-tc); - --grid-tc: repeat(5, auto); -} - -.c-table [role="rowgroup"] { - display: contents; -} - -.c-table [role="row"] { - display: contents; -} - -.c-table tr, -.c-table [role="columnheader"], -.c-table [role="cell"] { - border-bottom: 1px solid var(--table-border-color); -} - -.c-table [role="columnheader"] { - font-weight: bold; -} - -.c-table th, -.c-table td, -.c-table [role="columnheader"], -.c-table [role="cell"] { - display: inline-flex; - align-items: center; - padding: spacing(narrow); - text-align: left; - color: var(--table-color); -} - -.c-table [role="cell"][span="row"] { - grid-column: 1 / -1; -} - -@include responsive.media-query using ($breakpoint) { - @if $breakpoint == "medium" { - .c-table[role="table"][cols-at-medium="3"] { --grid-tc: repeat(3, auto); } - } - - @if $breakpoint == "small" { - .c-table[role="table"][cols-at-small="2"] { --grid-tc: repeat(2, auto); } - } -} diff --git a/app/assets/stylesheets/components/action_bar.css b/app/assets/stylesheets/components/action_bar.css new file mode 100644 index 000000000..2b6debdb0 --- /dev/null +++ b/app/assets/stylesheets/components/action_bar.css @@ -0,0 +1,7 @@ +@layer components { + .c-action-bar { + padding: var(--spacing-tiny) var(--spacing-narrow); + border-radius: var(--border-radius-medium); + background: var(--action-bar-bg-color); + } +} diff --git a/app/assets/stylesheets/components/avatar.css b/app/assets/stylesheets/components/avatar.css new file mode 100644 index 000000000..b81a59757 --- /dev/null +++ b/app/assets/stylesheets/components/avatar.css @@ -0,0 +1,7 @@ +@layer components { + .c-avatar { + width: 25px; + height: 25px; + border-radius: 50%; + } +} diff --git a/app/assets/stylesheets/components/badge.css b/app/assets/stylesheets/components/badge.css new file mode 100644 index 000000000..e54881b58 --- /dev/null +++ b/app/assets/stylesheets/components/badge.css @@ -0,0 +1,11 @@ +@layer components { + .c-badge { + display: inline-block; + border-radius: var(--border-radius-large); + background-color: var(--badge-bg-color); + color: var(--badge-color); + font-size: var(--font-size-small); + padding: 2px 13px; + font-weight: 500; + } +} diff --git a/app/assets/stylesheets/components/button.css b/app/assets/stylesheets/components/button.css new file mode 100644 index 000000000..e5174cd57 --- /dev/null +++ b/app/assets/stylesheets/components/button.css @@ -0,0 +1,81 @@ +@layer components { + .c-button { + text-align: center; + display: inline-block; + border-radius: var(--border-radius-medium); + border: none; + padding: var(--spacing-tiny) var(--spacing-narrow); + cursor: pointer; + font-size: var(--font-size-medium); + + &:hover { + text-decoration: none; + } + } + + .c-button--primary { + color: var(--btn-color); + background: var(--btn-primary-bg-color); + + &:hover { + background: var(--btn-primary-hover-bg-color); + color: var(--btn-color); + } + } + + .c-button--secondary { + background: var(--btn-secondary-bg-color); + color: var(--btn-secondary-color); + + &:hover { + background: var(--btn-secondary-hover-bg-color); + color: var(--btn-secondary-color); + } + } + + .c-button--link { + text-align: left; + background: none; + color: var(--text-primary-color); + padding: 0; + + &:hover { + color: var(--link-active-color); + } + } + + .c-button--small { + padding: 2px var(--spacing-tiny); + font-size: var(--font-size-small); + } + + .c-button--outline { + border-radius: var(--border-radius-large); + color: var(--btn-outline-color); + border: 1px solid var(--btn-outline-border-color); + background: var(--btn-outline-bg-color); + + &:hover { + background: var(--btn-outline-hover-bg-color); + } + } + + .c-button--icon { + display: inline-flex; + padding: var(--spacing-tiny); + border-radius: var(--border-radius-medium); + color: currentcolor; + + &:hover { + background: var(--btn-icon-hover-bg-color); + } + } + + .c-button--full-width { + width: 100%; + } + + .c-button[disabled] { + opacity: 0.6; + } +} diff --git a/app/assets/stylesheets/components/card.css b/app/assets/stylesheets/components/card.css new file mode 100644 index 000000000..7a6dbf273 --- /dev/null +++ b/app/assets/stylesheets/components/card.css @@ -0,0 +1,69 @@ +@layer components { + .c-card { + width: 100%; + } + + .c-card--border { + border: 1px solid var(--card-border-color); + border-radius: var(--border-radius-medium); + background-color: var(--card-bg-color); + } + + .c-card--border .c-card__body { + padding: var(--spacing-narrow); + } + + .c-card__image { + display: block; + margin-bottom: var(--spacing-narrow); + } + + .c-card__image, + .c-card__image img { + border-radius: var(--border-radius-medium); + } + + .c-card__body__title { + margin-bottom: var(--spacing-narrow); + font-size: var(--font-size-large); + } + + .c-card__body__text { + display: block; + margin-bottom: var(--spacing-tiny); + } + + .c-card__body__text:last-child { + margin-bottom: 0; + } + + .c-card--horizontal { + display: flex; + + .c-card__image { + margin-right: var(--spacing-medium); + } + + .c-card__body { + flex-grow: 1; + width: 0; + } + } + + @media (max-width: 560px) { + .c-card--center\@narrow { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + + .c-card__image { + margin: 0 0 var(--spacing-small); + } + + .c-card__body { + width: auto; + } + } + } +} diff --git a/app/assets/stylesheets/components/dialog.css b/app/assets/stylesheets/components/dialog.css new file mode 100644 index 000000000..4c863e188 --- /dev/null +++ b/app/assets/stylesheets/components/dialog.css @@ -0,0 +1,31 @@ +@layer components { + .c-dialog { + padding: 0; + margin-top: 100px; + background: var(--dialog-bg-color); + border: none; + border-radius: var(--border-radius-medium); + width: 100%; + max-width: 360px; + color: inherit; + } + + .c-dialog::backdrop { + background-color: var(--dialog-backdrop-color); + } + + .c-dialog__header { + padding: var(--spacing-narrow) var(--spacing-small); + background: var(--dialog-header-bg-color); + color: var(--dialog-header-color); + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + } + + .c-dialog__content { + padding: var(--spacing-narrow) var(--spacing-small); + overflow-y: auto; + min-height: 50px; + max-height: calc(100vh - 300px); + } +} diff --git a/app/assets/stylesheets/components/dropdown.css b/app/assets/stylesheets/components/dropdown.css new file mode 100644 index 000000000..c73b96e63 --- /dev/null +++ b/app/assets/stylesheets/components/dropdown.css @@ -0,0 +1,95 @@ +@layer components { + .c-dropdown { + display: inline-block; + position: relative; + } + + .c-dropdown > summary { + cursor: pointer; + list-style: none; + + &::-webkit-details-marker { + display: none; + } + } + + .c-dropdown[open] > summary { + &::before { + position: fixed; + inset: 0; + z-index: var(--z-dropdown-overlay); + display: block; + cursor: default; + content: ""; + background: transparent; + } + } + + .c-dropdown:not([open]) > *:not(summary) { + display: none; + } + + .c-dropdown__menu { + position: absolute; + right: 0; + top: 0; + z-index: var(--z-dropdown); + min-width: 100px; + background: var(--dropdown-bg-color); + border-radius: var(--border-radius-medium); + color: var(--dropdown-color); + box-shadow: 0 1px 6px var(--dropdown-shadow-color); + max-height: 300px; + overflow-y: auto; + } + + .c-dropdown__menu > hr { + margin: 0; + } + + .c-dropdown__menu--right { + left: 0; + right: auto; + } + + .c-dropdown__item { + display: block; + padding: var(--spacing-narrow); + white-space: nowrap; + } + + a.c-dropdown__item { + text-decoration: none; + color: var(--dropdown-color); + } + + form.c-dropdown__item input[type="submit"], + form.c-dropdown__item button[type="submit"] { + width: 100%; + background: var(--dropdown-bg-color); + border: none; + cursor: pointer; + } + + .c-dropdown__item:first-child, + form.c-dropdown__item:first-child input[type="submit"], + form.c-dropdown__item:first-child button[type="submit"] { + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + } + + .c-dropdown__item:last-child, + form.c-dropdown__item:last-child input[type="submit"], + form.c-dropdown__item:last-child button[type="submit"] { + border-bottom-left-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + } + + a.c-dropdown__item:hover, + form.c-dropdown__item:hover input[type="submit"], + form.c-dropdown__item:hover button[type="submit"], + .c-dropdown__item:hover { + background: var(--dropdown-active-color); + color: var(--dropdown-color); + } +} diff --git a/app/assets/stylesheets/components/flash.css b/app/assets/stylesheets/components/flash.css new file mode 100644 index 000000000..f4f097a85 --- /dev/null +++ b/app/assets/stylesheets/components/flash.css @@ -0,0 +1,31 @@ +@layer components { + .c-flash { + position: absolute; + margin: 0; + padding: 0; + z-index: var(--z-flash); + backface-visibility: hidden; + filter: blur(0); + max-width: 90%; + top: 10%; + left: 50%; + width: 325px; + transform: translate(calc(-50% - 0.5px)) translateZ(0) scale(1, 1); + } + + .c-flash__body { + padding: var(--spacing-tiny); + text-align: center; + border-radius: var(--border-radius-medium); + } + + .c-flash__body--alert { + background-color: var(--flash-alert-bg-color); + color: var(--flash-color); + } + + .c-flash__body--notice { + background-color: var(--flash-notice-bg-color); + color: var(--flash-color); + } +} diff --git a/app/assets/stylesheets/components/form.css b/app/assets/stylesheets/components/form.css new file mode 100644 index 000000000..9defeb1c4 --- /dev/null +++ b/app/assets/stylesheets/components/form.css @@ -0,0 +1,47 @@ +@layer components { + .c-form { + padding-bottom: var(--spacing-medium); + } + + .c-form__field { + margin-top: var(--spacing-small); + } + + .c-form__field--inline { + display: flex; + align-items: center; + } + + .c-form__field--submit { + margin-top: var(--spacing-medium); + } + + .c-form__field label { + display: block; + margin-bottom: var(--spacing-narrow); + } + + .c-form__field label[disabled] { + opacity: 0.5; + } + + .c-form__field--inline label { + margin-bottom: 0; + margin-right: var(--spacing-tiny); + } + + .c-form__field > label { + font-weight: bold; + } + + .c-form__radio { + display: inline-flex; + align-items: center; + margin-right: var(--spacing-narrow); + } + + .c-form__radio label { + margin-bottom: 0; + margin-left: var(--spacing-tiny); + } +} diff --git a/app/assets/stylesheets/components/icon.css b/app/assets/stylesheets/components/icon.css new file mode 100644 index 000000000..297ec5f9a --- /dev/null +++ b/app/assets/stylesheets/components/icon.css @@ -0,0 +1,29 @@ +@layer components { + .c-icon { + width: 18px; + height: 18px; + } + + .c-icon--small { + width: 16px; + height: 16px; + } + + .c-icon--narrow { + width: 14px; + height: 14px; + } + + .c-icon--large { + width: 22px; + height: 22px; + } + + .c-icon--active { + color: var(--icon-active-color); + } + + .c-icon--emphasis { + color: var(--icon-emphasis-color); + } +} diff --git a/app/assets/stylesheets/components/input.css b/app/assets/stylesheets/components/input.css new file mode 100644 index 000000000..e8868069d --- /dev/null +++ b/app/assets/stylesheets/components/input.css @@ -0,0 +1,38 @@ +@layer components { + input.c-input { + width: 100%; + background: var(--input-bg-color); + border: none; + color: var(--input-color); + padding: var(--spacing-tiny); + border-radius: var(--border-radius-medium); + filter: none; + } + + .c-input-group { + display: flex; + align-items: center; + background: var(--input-bg-color); + border-radius: var(--border-radius-medium); + padding: 0 var(--spacing-tiny); + } + + .c-input-group input { + width: 0; + flex-grow: 1; + } + + .c-input-group input:focus { + outline: none; + } + + .c-input-group__icon { + display: flex; + align-items: center; + color: var(--input-icon-color); + } + + .c-input-group__icon a { + color: var(--input-icon-color); + } +} diff --git a/app/assets/stylesheets/components/list.css b/app/assets/stylesheets/components/list.css new file mode 100644 index 000000000..044344d5a --- /dev/null +++ b/app/assets/stylesheets/components/list.css @@ -0,0 +1,63 @@ +@layer components { + .c-list { + list-style: none; + padding: 0; + margin: 0; + } + + .c-list--grouped { + background-color: var(--list-grouped-bg-color); + padding: 0 var(--spacing-narrow); + border-radius: var(--border-radius-large); + } + + .c-list__item { + width: 100%; + padding: var(--spacing-narrow) 0; + text-decoration: none; + border-bottom: 1px solid var(--list-border-color); + } + + .c-list__item--divider { + margin-top: var(--spacing-small); + font-weight: bold; + text-transform: uppercase; + } + + .c-list__item__subtext { + display: inline-block; + margin-top: var(--spacing-tiny); + color: var(--list-subtext-color); + } + + .c-list--border-none .c-list__item { + border-bottom: none; + } + + .c-list--grouped .c-list__item { + padding: var(--spacing-small) 0; + } + + .c-list__item:last-child { + border-bottom: none; + } + + .c-list__item.is-active * { + color: var(--list-active-color); + } + + .c-list.is-dragging .c-list__item { + border: none; + } + + .c-list.is-dragging .c-list__item:not(.is-dragging-source) * { + /* Prevent dragleave from firing when dragging into a child element */ + pointer-events: none; + opacity: 0.85; + } + + .c-list .c-list__item.is-dragging-over { + border: 2px dashed var(--list-active-color); + border-radius: var(--border-radius-medium); + } +} diff --git a/app/assets/stylesheets/components/loader.css b/app/assets/stylesheets/components/loader.css new file mode 100644 index 000000000..f38a08b92 --- /dev/null +++ b/app/assets/stylesheets/components/loader.css @@ -0,0 +1,21 @@ +@layer components { + .c-loader { + border: 5px solid var(--loader-secondary-bg-color); + border-top: 5px solid var(--loader-bg-color); + border-radius: 50%; + width: 40px; + height: 40px; + } + + .c-loader--small { + height: 22px; + width: 22px; + border-width: 3px; + } + + .c-loader--large { + height: 55px; + width: 55px; + border-width: 7px; + } +} diff --git a/app/assets/stylesheets/components/logo.css b/app/assets/stylesheets/components/logo.css new file mode 100644 index 000000000..eacf44519 --- /dev/null +++ b/app/assets/stylesheets/components/logo.css @@ -0,0 +1,9 @@ +@layer components { + .c-logo { + display: inline-block; + background: url("logo.svg") no-repeat top left; + background-size: contain; + width: 70px; + height: 70px; + } +} diff --git a/app/assets/stylesheets/components/nav.css b/app/assets/stylesheets/components/nav.css new file mode 100644 index 000000000..2336f2ad5 --- /dev/null +++ b/app/assets/stylesheets/components/nav.css @@ -0,0 +1,21 @@ +@layer components { + .c-nav { + padding: var(--spacing-small) var(--spacing-small) 0; + box-shadow: var(--nav-shadow); + z-index: var(--z-nav); + } + + .c-nav--primary { + position: relative; + + &::before { + content: ""; + position: absolute; + inset: 0; + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + z-index: -1; + background: var(--nav-primary-bg-color); + } + } +} diff --git a/app/assets/stylesheets/components/overlay.css b/app/assets/stylesheets/components/overlay.css new file mode 100644 index 000000000..da05a41b8 --- /dev/null +++ b/app/assets/stylesheets/components/overlay.css @@ -0,0 +1,19 @@ +@layer components { + .c-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + background: inherit; + } + + .c-overlay--fixed { + z-index: var(--z-fixed-overlay); + position: fixed; + } + + .c-overlay--blur { + background: var(--overlay-blur-bg-color); + } +} diff --git a/app/assets/stylesheets/components/player.css b/app/assets/stylesheets/components/player.css new file mode 100644 index 000000000..0d5885ded --- /dev/null +++ b/app/assets/stylesheets/components/player.css @@ -0,0 +1,106 @@ +@layer components { + .c-player { + background: var(--player-bg-color); + } + + .c-player__control { + background: var(--player-bg-color); + position: relative; + padding: 0 var(--spacing-wide); + color: var(--player-control-color); + } + + .c-player__control__main { + color: var(--player-control-main-color); + padding: var(--spacing-small) 0; + border-bottom: 1px solid var(--player-control-border-color); + } + + .c-player__control__secondary { + padding: var(--spacing-tiny) 0; + } + + .c-player__header { + transition: max-height 0.2s ease-out; + max-height: 0; + visibility: hidden; + background: inherit; + } + + .c-player__header__content { + background: var(--player-header-bg-color); + } + + .c-player__header__background { + position: absolute; + inset: 0; + filter: blur(15px); + background-position: center; + background-repeat: no-repeat; + background-size: cover; + } + + .c-player__header.is-expanded { + max-height: 200px; + visibility: visible; + } + + .c-player__progress { + display: flex; + align-items: flex-start; + height: 4px; + } + + .c-player__progress progress { + appearance: none; + height: 2px; + border: 0 none; + background: var(--player-progress-bg-color); + } + + .c-player__progress progress::-moz-progress-bar { + background: var(--player-progress-color); + } + + .c-player__progress progress::-webkit-progress-bar { + background: transparent; + } + + .c-player__progress progress::-webkit-progress-value { + background: var(--player-progress-color); + } + + .c-player__progress:hover progress { + height: 4px; + background: var(--player-progress-hover-bg-color); + } + + .c-player__volume { + -webkit-appearance: none; + appearance: none; + width: 100%; + cursor: pointer; + outline: none; + border-radius: var(--border-radius-large); + height: 5px; + background: linear-gradient(to right, var(--player-volume-color) var(--progress), var(--player-volume-bg-color) var(--progress)); + } + + .c-player__volume::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + height: 12px; + width: 12px; + background-color: var(--player-volume-color); + border-radius: 50%; + border: none; + } + + .c-player__volume::-moz-range-thumb { + height: 12px; + width: 12px; + background-color: var(--player-volume-color); + border-radius: 50%; + border: none; + } +} diff --git a/app/assets/stylesheets/components/search.css b/app/assets/stylesheets/components/search.css new file mode 100644 index 000000000..7abc484a9 --- /dev/null +++ b/app/assets/stylesheets/components/search.css @@ -0,0 +1,15 @@ +@layer components { + .c-search { + max-width: 380px; + width: 100%; + margin: 0 var(--spacing-small); + } + + .c-search .c-loader { + display: none; + } + + .c-search.is-loading .c-loader { + display: revert; + } +} diff --git a/app/assets/stylesheets/components/_sidebar.scss b/app/assets/stylesheets/components/sidebar.css similarity index 50% rename from app/assets/stylesheets/components/_sidebar.scss rename to app/assets/stylesheets/components/sidebar.css index 408d229d5..c06183153 100644 --- a/app/assets/stylesheets/components/_sidebar.scss +++ b/app/assets/stylesheets/components/sidebar.css @@ -1,53 +1,50 @@ -@use "../tools/responsive"; -@use "../settings/variables"; - -.c-sidebar { - background: var(--sidebar-bg-color); - z-index: variables.$sidebar-zindex; -} +@layer components { + .c-sidebar { + background: var(--sidebar-bg-color); + z-index: var(--z-sidebar); + } -@include responsive.media-query using ($breakpoint) { - @if $breakpoint == "extra-wide" { + @media (min-width: 1880px) { .c-sidebar { width: 440px; } } - @if $breakpoint == "wide" { + @media (max-width: 1880px) { .c-sidebar { width: 420px; } } - @if $breakpoint == "extra-large" { + @media (max-width: 1630px) { .c-sidebar { width: 400px; } } - @if $breakpoint == "large" { + @media (max-width: 1380px) { .c-sidebar { width: 380px; } } - @if $breakpoint == "medium" { + @media (max-width: 1130px) { .c-sidebar { width: 360px; } } - @if $breakpoint == "small" { + @media (max-width: 930px) { .c-sidebar { width: 340px; } } - @if $breakpoint == "extra-small" { + @media (max-width: 730px) { .c-sidebar { position: fixed; bottom: 0; - z-index: variables.$base-zindex - 1; + z-index: -1; height: 100%; width: 100%; visibility: hidden; @@ -55,7 +52,7 @@ } .c-sidebar.is-expanded { - z-index: variables.$expanded-sidebar-zindex; + z-index: var(--z-expanded-sidebar); visibility: visible; height: 100%; opacity: 1; diff --git a/app/assets/stylesheets/components/tab.css b/app/assets/stylesheets/components/tab.css new file mode 100644 index 000000000..220bd0603 --- /dev/null +++ b/app/assets/stylesheets/components/tab.css @@ -0,0 +1,29 @@ +@layer components { + .c-tab { + display: flex; + justify-content: center; + list-style: none; + margin: 0; + padding: 0; + } + + .c-tab__item { + padding-bottom: var(--spacing-narrow); + border-bottom: 2px solid transparent; + margin: 0 var(--spacing-large); + } + + .c-tab__item a { + color: var(--tab-color); + text-decoration: none; + } + + .c-tab__item.is-active a, + .c-tab__item a:hover { + color: var(--tab-active-color); + } + + .c-tab__item.is-active { + border-color: var(--tab-active-color); + } +} diff --git a/app/assets/stylesheets/components/table.css b/app/assets/stylesheets/components/table.css new file mode 100644 index 000000000..884d5a202 --- /dev/null +++ b/app/assets/stylesheets/components/table.css @@ -0,0 +1,55 @@ +@layer components { + .c-table { + display: table; + width: 100%; + table-layout: auto; + text-align: left; + } + + .c-table[role="table"] { + display: grid; + grid-template-columns: var(--grid-tc); + --grid-tc: repeat(5, auto); + } + + .c-table [role="rowgroup"] { + display: contents; + } + + .c-table [role="row"] { + display: contents; + } + + .c-table tr, + .c-table [role="columnheader"], + .c-table [role="cell"] { + border-bottom: 1px solid var(--table-border-color); + } + + .c-table [role="columnheader"] { + font-weight: bold; + } + + .c-table th, + .c-table td, + .c-table [role="columnheader"], + .c-table [role="cell"] { + display: inline-flex; + align-items: center; + padding: var(--spacing-narrow); + text-align: left; + color: var(--table-color); + } + + .c-table [role="cell"][span="row"] { + grid-column: 1 / -1; + } + + @media (max-width: 1130px) { + .c-table[role="table"][cols-at-medium="3"] { --grid-tc: repeat(3, auto); } + } + + @media (max-width: 930px) { + .c-table[role="table"][cols-at-small="2"] { --grid-tc: repeat(2, auto); } + } +} diff --git a/app/assets/stylesheets/elements/_content.scss b/app/assets/stylesheets/elements/_content.scss deleted file mode 100644 index 72d63ea9c..000000000 --- a/app/assets/stylesheets/elements/_content.scss +++ /dev/null @@ -1,51 +0,0 @@ -@use "../tools/functions" as *; - -h1 { - font-size: font-size("wide"); - margin-bottom: spacing("wide"); -} - -h2, -h3 { - font-size: font-size("large"); - margin-bottom: spacing("medium"); -} - -h4, -h5, -h6 { - font-size: font-size("medium"); -} - -h1, -h2, -h3, -h4, -h5, -h6 { - color: var(--text-primary-color); -} - -p { - font-size: font-size("medium"); - color: var(--text-secondary-color); -} - -a { - text-decoration: none; - color: var(--text-primary-color); -} - -a:hover { - text-decoration: underline; -} - -a.is-active { - color: var(--link-active-color); -} - -hr { - border: 0; - margin: spacing("large") 0; - border-top: 1px solid var(--hr-color); -} diff --git a/app/assets/stylesheets/elements/_page.scss b/app/assets/stylesheets/elements/_page.scss deleted file mode 100644 index dcdd50019..000000000 --- a/app/assets/stylesheets/elements/_page.scss +++ /dev/null @@ -1,9 +0,0 @@ -@use "sass:map"; -@use "../settings/variables"; - -body { - font-family: variables.$sans-serif-fonts; - background-color: var(--body-bg-color); - color: var(--text-secondary-color); - font-size: map.get(variables.$font-size, "medium"); -} diff --git a/app/assets/stylesheets/elements/content.css b/app/assets/stylesheets/elements/content.css new file mode 100644 index 000000000..c9b9c2ae4 --- /dev/null +++ b/app/assets/stylesheets/elements/content.css @@ -0,0 +1,51 @@ +@layer elements { + h1 { + font-size: var(--font-size-wide); + margin-bottom: var(--spacing-wide); + } + + h2, + h3 { + font-size: var(--font-size-large); + margin-bottom: var(--spacing-medium); + } + + h4, + h5, + h6 { + font-size: var(--font-size-medium); + } + + h1, + h2, + h3, + h4, + h5, + h6 { + color: var(--text-primary-color); + } + + p { + font-size: var(--font-size-medium); + color: var(--text-secondary-color); + } + + a { + text-decoration: none; + color: var(--text-primary-color); + } + + a:hover { + text-decoration: underline; + } + + a.is-active { + color: var(--link-active-color); + } + + hr { + border: 0; + margin: var(--spacing-large) 0; + border-top: 1px solid var(--hr-color); + } +} diff --git a/app/assets/stylesheets/elements/page.css b/app/assets/stylesheets/elements/page.css new file mode 100644 index 000000000..b7379e75f --- /dev/null +++ b/app/assets/stylesheets/elements/page.css @@ -0,0 +1,8 @@ +@layer elements { + body { + font-family: var(--font-sans-serif); + background-color: var(--body-bg-color); + color: var(--text-secondary-color); + font-size: var(--font-size-medium); + } +} diff --git a/app/assets/stylesheets/generic/_box_sizing.scss b/app/assets/stylesheets/generic/_box_sizing.scss deleted file mode 100644 index d729512f5..000000000 --- a/app/assets/stylesheets/generic/_box_sizing.scss +++ /dev/null @@ -1,9 +0,0 @@ -html { - box-sizing: border-box; -} - -*, -*::before, -*::after { - box-sizing: inherit; -} diff --git a/app/assets/stylesheets/generic/_normalize.scss b/app/assets/stylesheets/generic/_normalize.scss deleted file mode 100644 index ffb2bc5cc..000000000 --- a/app/assets/stylesheets/generic/_normalize.scss +++ /dev/null @@ -1,349 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ - -/* Document - ========================================================================== */ - -/** - * 1. Correct the line height in all browsers. - * 2. Prevent adjustments of font size after orientation changes in iOS. - */ - -html { - line-height: 1.15; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/* Sections - ========================================================================== */ - -/** - * Remove the margin in all browsers. - */ - -body { - margin: 0; -} - -/** - * Render the `main` element consistently in IE. - */ - -main { - display: block; -} - -/** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/* Grouping content - ========================================================================== */ - -/** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - -hr { - box-sizing: content-box; /* 1 */ - height: 0; /* 1 */ - overflow: visible; /* 2 */ -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -pre { - font-family: monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Remove the gray background on active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - -abbr[title] { - border-bottom: none; /* 1 */ - text-decoration: underline; /* 2 */ - text-decoration: underline dotted; /* 2 */ -} - -/** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - -b, -strong { - font-weight: bolder; -} - -/** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - -code, -kbd, -samp { - font-family: monospace; /* 1 */ - font-size: 1em; /* 2 */ -} - -/** - * Add the correct font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove the border on images inside links in IE 10. - */ - -img { - border-style: none; -} - -/* Forms - ========================================================================== */ - -/** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 1 */ - line-height: 1.15; /* 1 */ - margin: 0; /* 2 */ -} - -/** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - -button, -input { /* 1 */ - overflow: visible; -} - -/** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - -button, -select { /* 1 */ - text-transform: none; -} - -/** - * Correct the inability to style clickable types in iOS and Safari. - */ - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -/** - * Remove the inner border and padding in Firefox. - */ - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -/** - * Restore the focus styles unset by the previous rule. - */ - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -/** - * Correct the padding in Firefox. - */ - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -/** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - -legend { - box-sizing: border-box; /* 1 */ - color: inherit; /* 2 */ - display: table; /* 1 */ - max-width: 100%; /* 1 */ - padding: 0; /* 3 */ - white-space: normal; /* 1 */ -} - -/** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - -progress { - vertical-align: baseline; -} - -/** - * Remove the default vertical scrollbar in IE 10+. - */ - -textarea { - overflow: auto; -} - -/** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - -[type="search"] { - -webkit-appearance: textfield; /* 1 */ - outline-offset: -2px; /* 2 */ -} - -/** - * Remove the inner padding in Chrome and Safari on macOS. - */ - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - -::-webkit-file-upload-button { - -webkit-appearance: button; /* 1 */ - font: inherit; /* 2 */ -} - -/* Interactive - ========================================================================== */ - -/* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - -details { - display: block; -} - -/* - * Add the correct display in all browsers. - */ - -summary { - display: list-item; -} - -/* Misc - ========================================================================== */ - -/** - * Add the correct display in IE 10+. - */ - -template { - display: none; -} - -/** - * Add the correct display in IE 10. - */ - -[hidden] { - display: none; -} diff --git a/app/assets/stylesheets/generic/_reset.scss b/app/assets/stylesheets/generic/_reset.scss deleted file mode 100644 index 15d0d2016..000000000 --- a/app/assets/stylesheets/generic/_reset.scss +++ /dev/null @@ -1,52 +0,0 @@ -blockquote, -dd, -dl, -figure, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -p, -pre { - margin: 0; -} - -button { - background: transparent; - border: 0; - padding: 0; -} - -ol, -ul { - margin: 0; - padding-left: 0; -} - -li > ol, -li > ul { - margin-bottom: 0; -} - -table { - border-collapse: collapse; -} - -textarea { - resize: vertical; -} - -/* Reset element style generate from button_to */ -[type="submit"] { - text-align: left; - color: currentcolor; - font-weight: normal; -} - -/* Reset style for turbo progress bar */ -.turbo-progress-bar { - background-color: var(--progress-bar-bg-color); -} diff --git a/app/assets/stylesheets/generic/box_sizing.css b/app/assets/stylesheets/generic/box_sizing.css new file mode 100644 index 000000000..9dc10d98a --- /dev/null +++ b/app/assets/stylesheets/generic/box_sizing.css @@ -0,0 +1,11 @@ +@layer generic { + html { + box-sizing: border-box; + } + + *, + *::before, + *::after { + box-sizing: inherit; + } +} diff --git a/app/assets/stylesheets/generic/normalize.css b/app/assets/stylesheets/generic/normalize.css new file mode 100644 index 000000000..39ee93ed8 --- /dev/null +++ b/app/assets/stylesheets/generic/normalize.css @@ -0,0 +1,351 @@ +@layer generic { + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + + /* Document + ========================================================================== */ + + /** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers. + */ + + body { + margin: 0; + } + + /** + * Render the `main` element consistently in IE. + */ + + main { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + ========================================================================== */ + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove the border on images inside links in IE 10. + */ + + img { + border-style: none; + } + + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + + button, + input { /* 1 */ + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * Correct the inability to style clickable types in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Remove the inner border and padding in Firefox. + */ + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ + } + + /** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + vertical-align: baseline; + } + + /** + * Remove the default vertical scrollbar in IE 10+. + */ + + textarea { + overflow: auto; + } + + /** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Remove the inner padding in Chrome and Safari on macOS. + */ + + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Misc + ========================================================================== */ + + /** + * Add the correct display in IE 10+. + */ + + template { + display: none; + } + + /** + * Add the correct display in IE 10. + */ + + [hidden] { + display: none; + } +} diff --git a/app/assets/stylesheets/generic/reset.css b/app/assets/stylesheets/generic/reset.css new file mode 100644 index 000000000..d3ae40704 --- /dev/null +++ b/app/assets/stylesheets/generic/reset.css @@ -0,0 +1,54 @@ +@layer generic { + blockquote, + dd, + dl, + figure, + h1, + h2, + h3, + h4, + h5, + h6, + hr, + p, + pre { + margin: 0; + } + + button { + background: transparent; + border: 0; + padding: 0; + } + + ol, + ul { + margin: 0; + padding-left: 0; + } + + li > ol, + li > ul { + margin-bottom: 0; + } + + table { + border-collapse: collapse; + } + + textarea { + resize: vertical; + } + + /* Reset element style generate from button_to */ + [type="submit"] { + text-align: left; + color: currentcolor; + font-weight: normal; + } + + /* Reset style for turbo progress bar */ + .turbo-progress-bar { + background-color: var(--progress-bar-bg-color); + } +} diff --git a/app/assets/stylesheets/objects/_animations.scss b/app/assets/stylesheets/objects/_animations.scss deleted file mode 100644 index 0f51213de..000000000 --- a/app/assets/stylesheets/objects/_animations.scss +++ /dev/null @@ -1,41 +0,0 @@ -@keyframes fadeInDown { - from { - opacity: 0; - transform: translate3d(0, -100%, 0); - } - - to { - opacity: 1; - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeOutUp { - from { - opacity: 1; - } - - to { - opacity: 0; - transform: translate3d(0, -100%, 0); - } -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.o-animation-fadeInDown { - animation-name: fadeInDown; - animation-duration: 0.25s; -} - -.o-animation-fadeOutUp { - animation-name: fadeOutUp; - animation-duration: 0.25s; -} - -.o-animation-spin { - animation: spin 0.9s linear infinite; -} diff --git a/app/assets/stylesheets/objects/_container.scss b/app/assets/stylesheets/objects/_container.scss deleted file mode 100644 index c71b76fe8..000000000 --- a/app/assets/stylesheets/objects/_container.scss +++ /dev/null @@ -1,36 +0,0 @@ -.o-container { - max-width: 1130px; - margin: auto; -} - -.o-container--extra-wide { - max-width: 2130px; -} - -.o-container--wide { - max-width: 1880px; -} - -.o-container--extra-large { - max-width: 1630px; -} - -.o-container--large { - max-width: 1380px; -} - -.o-container--small { - max-width: 930px; -} - -.o-container--extra-small { - max-width: 730px; -} - -.o-container--narrow { - max-width: 560px; -} - -.o-container--extra-narrow { - max-width: 360px; -} diff --git a/app/assets/stylesheets/objects/_flex.scss b/app/assets/stylesheets/objects/_flex.scss deleted file mode 100644 index 941513970..000000000 --- a/app/assets/stylesheets/objects/_flex.scss +++ /dev/null @@ -1,107 +0,0 @@ -.o-flex { - display: flex; -} - -.o-flex > .o-flex__item { - appearance: none; -} - -.o-flex-inline { - display: inline-flex; -} - -.o-flex--column { - flex-direction: column; -} - -.o-flex--row-reverse { - flex-direction: row-reverse; -} - -.o-flex--column-reverse { - flex-direction: column-reverse; -} - -.o-flex--wrap { - flex-wrap: wrap; -} - -.o-flex--justify-start { - justify-content: flex-start; -} - -.o-flex--justify-end { - justify-content: flex-end; -} - -.o-flex--justify-center { - justify-content: center; -} - -.o-flex--justify-between { - justify-content: space-between; -} - -.o-flex--justify-around { - justify-content: space-around; -} - -.o-flex--align-start { - align-items: flex-start; -} - -.o-flex--align-end { - align-items: flex-end; -} - -.o-flex--align-center { - align-items: center; -} - -.o-flex--align-baseline { - align-items: baseline; -} - -.o-flex--align-stretch { - align-items: stretch; -} - -.o-flex__item--align-start { - align-self: flex-start; -} - -.o-flex__item--align-end { - align-self: flex-end; -} - -.o-flex__item--align-center { - align-self: center; -} - -.o-flex__item--align-baseline { - align-self: baseline; -} - -.o-flex__item--align-stretch { - align-self: stretch; -} - -.o-flex__item--shrink-0 { - flex-shrink: 0; -} - -.o-flex__item--shrink-1 { - flex-shrink: 1; -} - -.o-flex__item--grow-0 { - flex-grow: 0; -} - -.o-flex__item--grow-1 { - flex-grow: 1; -} - -.o-flex__item--basic-0 { - flex-basis: 0; -} diff --git a/app/assets/stylesheets/objects/_grid.scss b/app/assets/stylesheets/objects/_grid.scss deleted file mode 100644 index 8bcc8caff..000000000 --- a/app/assets/stylesheets/objects/_grid.scss +++ /dev/null @@ -1,43 +0,0 @@ -/* Base on Raster grid subsystem (rsms.me/raster) */ - -@use "../settings/variables"; -@use "../tools/responsive"; -@use "../tools/functions" as *; - -.o-grid { - display: grid !important; -} - -.o-grid > .o-grid__item { - display: block; - appearance: none; -} - -.o-grid--shelf { - grid-gap: spacing("medium"); - grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); -} - -.o-grid--list { - grid-gap: spacing("small"); - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); -} - -.o-grid > .o-grid__item--row { - grid-column: 1 / -1; -} - -@include responsive.media-query using ($breakpoint) { - @if $breakpoint == "narrow" { - .o-grid--shelf { - grid-gap: spacing("small"); - } - } - - @if $breakpoint == "extra-narrow" { - .o-grid--shelf { - grid-gap: spacing("narrow"); - grid-template-columns: repeat(2, 1fr); - } - } -} diff --git a/app/assets/stylesheets/objects/animations.css b/app/assets/stylesheets/objects/animations.css new file mode 100644 index 000000000..917fa01d8 --- /dev/null +++ b/app/assets/stylesheets/objects/animations.css @@ -0,0 +1,43 @@ +@layer objects { + @keyframes fadeInDown { + from { + opacity: 0; + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + transform: translate3d(0, 0, 0); + } + } + + @keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + transform: translate3d(0, -100%, 0); + } + } + + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } + + .o-animation-fadeInDown { + animation-name: fadeInDown; + animation-duration: 0.25s; + } + + .o-animation-fadeOutUp { + animation-name: fadeOutUp; + animation-duration: 0.25s; + } + + .o-animation-spin { + animation: spin 0.9s linear infinite; + } +} diff --git a/app/assets/stylesheets/objects/container.css b/app/assets/stylesheets/objects/container.css new file mode 100644 index 000000000..9ffa765d2 --- /dev/null +++ b/app/assets/stylesheets/objects/container.css @@ -0,0 +1,38 @@ +@layer objects { + .o-container { + max-width: 1130px; + margin: auto; + } + + .o-container--extra-wide { + max-width: 2130px; + } + + .o-container--wide { + max-width: 1880px; + } + + .o-container--extra-large { + max-width: 1630px; + } + + .o-container--large { + max-width: 1380px; + } + + .o-container--small { + max-width: 930px; + } + + .o-container--extra-small { + max-width: 730px; + } + + .o-container--narrow { + max-width: 560px; + } + + .o-container--extra-narrow { + max-width: 360px; + } +} diff --git a/app/assets/stylesheets/objects/flex.css b/app/assets/stylesheets/objects/flex.css new file mode 100644 index 000000000..c528ec9ba --- /dev/null +++ b/app/assets/stylesheets/objects/flex.css @@ -0,0 +1,109 @@ +@layer objects { + .o-flex { + display: flex; + } + + .o-flex > .o-flex__item { + appearance: none; + } + + .o-flex-inline { + display: inline-flex; + } + + .o-flex--column { + flex-direction: column; + } + + .o-flex--row-reverse { + flex-direction: row-reverse; + } + + .o-flex--column-reverse { + flex-direction: column-reverse; + } + + .o-flex--wrap { + flex-wrap: wrap; + } + + .o-flex--justify-start { + justify-content: flex-start; + } + + .o-flex--justify-end { + justify-content: flex-end; + } + + .o-flex--justify-center { + justify-content: center; + } + + .o-flex--justify-between { + justify-content: space-between; + } + + .o-flex--justify-around { + justify-content: space-around; + } + + .o-flex--align-start { + align-items: flex-start; + } + + .o-flex--align-end { + align-items: flex-end; + } + + .o-flex--align-center { + align-items: center; + } + + .o-flex--align-baseline { + align-items: baseline; + } + + .o-flex--align-stretch { + align-items: stretch; + } + + .o-flex__item--align-start { + align-self: flex-start; + } + + .o-flex__item--align-end { + align-self: flex-end; + } + + .o-flex__item--align-center { + align-self: center; + } + + .o-flex__item--align-baseline { + align-self: baseline; + } + + .o-flex__item--align-stretch { + align-self: stretch; + } + + .o-flex__item--shrink-0 { + flex-shrink: 0; + } + + .o-flex__item--shrink-1 { + flex-shrink: 1; + } + + .o-flex__item--grow-0 { + flex-grow: 0; + } + + .o-flex__item--grow-1 { + flex-grow: 1; + } + + .o-flex__item--basic-0 { + flex-basis: 0; + } +} diff --git a/app/assets/stylesheets/objects/grid.css b/app/assets/stylesheets/objects/grid.css new file mode 100644 index 000000000..8bffa3b35 --- /dev/null +++ b/app/assets/stylesheets/objects/grid.css @@ -0,0 +1,39 @@ +@layer objects { + /* Base on Raster grid subsystem (rsms.me/raster) */ + + .o-grid { + display: grid; + } + + .o-grid > .o-grid__item { + display: block; + appearance: none; + } + + .o-grid--shelf { + gap: var(--spacing-medium); + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + } + + .o-grid--list { + gap: var(--spacing-small); + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + } + + .o-grid > .o-grid__item--row { + grid-column: 1 / -1; + } + + @media (max-width: 560px) { + .o-grid--shelf { + gap: var(--spacing-small); + } + } + + @media (max-width: 375px) { + .o-grid--shelf { + gap: var(--spacing-narrow); + grid-template-columns: repeat(2, 1fr); + } + } +} diff --git a/app/assets/stylesheets/settings/_bridge.scss b/app/assets/stylesheets/settings/_bridge.scss deleted file mode 100644 index 2e28b2146..000000000 --- a/app/assets/stylesheets/settings/_bridge.scss +++ /dev/null @@ -1,4 +0,0 @@ -[data-bridge-components~="account"] [data-controller~="bridge--account"], -[data-bridge-components~="search"] [data-controller~="bridge--search"] { - display: none !important; -} \ No newline at end of file diff --git a/app/assets/stylesheets/settings/_colors.scss b/app/assets/stylesheets/settings/_colors.scss deleted file mode 100644 index ad62ae91a..000000000 --- a/app/assets/stylesheets/settings/_colors.scss +++ /dev/null @@ -1,18 +0,0 @@ -$purple-dark: rgb(54, 30, 64); -$purple: rgb(119, 66, 141); -$purple-light: rgb(161, 90, 191); - -$white: rgb(255, 255, 251); -$grey-100: rgb(237, 237, 237); -$grey-200: rgb(217, 217, 217); -$grey-300: rgb(191, 191, 191); -$grey-400: rgb(166, 166, 166); -$grey-500: rgb(140, 140, 140); -$grey-600: rgb(89, 89, 89); -$grey-700: rgb(59, 59, 59); -$grey-800: rgb(33, 33, 33); -$grey-900: rgb(18, 18, 18); -$black: rgb(0, 0, 0); - -$red: rgb(166, 22, 55); -$green: rgb(35, 166, 80); diff --git a/app/assets/stylesheets/settings/_dark_theme.scss b/app/assets/stylesheets/settings/_dark_theme.scss deleted file mode 100644 index faec12bb9..000000000 --- a/app/assets/stylesheets/settings/_dark_theme.scss +++ /dev/null @@ -1,127 +0,0 @@ -@use "sass:color"; -@use "colors" as *; - -@mixin dark-theme { - $primary-color: $purple-light; - $btn-primary-bg-color: $purple; - $btn-secondary-bg-color: color.change($btn-primary-bg-color, $alpha: 0.25); - $btn-outline-bg-color: $grey-700; - $loader-bg-color: $primary-color; - $player-bg-color: $black; - $badge-color: $primary-color; - - color-scheme: dark; - - --link-active-color: #{$primary-color}; - --gradient-bg-color: linear-gradient(#{$black}, #{color.change($black, $alpha: 0.75)}), linear-gradient(#{$primary-color}, #{$primary-color}); - --primary-bg-color: #{$grey-800}; - - /* Body */ - --body-bg-color: #{$grey-800}; - - /* Text */ - --text-primary-color: #{$white}; - --text-secondary-color: #{$grey-300}; - --text-success-color: #{$green}; - - /* Sidebar */ - --sidebar-bg-color: #{$grey-900}; - - /* Progress bar */ - --progress-bar-bg-color: #{$primary-color}; - - /* Button */ - --btn-color: #{$white}; - --btn-primary-bg-color: #{$btn-primary-bg-color}; - --btn-primary-hover-bg-color: #{color.adjust($btn-primary-bg-color, $lightness: 8%)}; - --btn-secondary-bg-color: #{$btn-secondary-bg-color}; - --btn-secondary-hover-bg-color: #{color.adjust($btn-secondary-bg-color, $lightness: 8%)}; - --btn-secondary-color: #{$primary-color}; - --btn-outline-color: #{$white}; - --btn-outline-border-color: #{$grey-800}; - --btn-outline-bg-color: #{$btn-outline-bg-color}; - --btn-outline-hover-bg-color: #{color.adjust($btn-outline-bg-color, $lightness: 8%)}; - --btn-icon-hover-bg-color: #{color.change($grey-600, $alpha: 0.5)}; - - /* Flash message */ - --flash-color: #{$white}; - --flash-notice-bg-color: #{$green}; - --flash-alert-bg-color: #{$red}; - - /* Tab */ - --tab-color: #{$white}; - --tab-active-color: #{$primary-color}; - - /* List */ - --list-border-color: #{$grey-800}; - --list-active-color: #{$primary-color}; - --list-grouped-bg-color: #{$grey-900}; - --list-subtext-color: #{$grey-400}; - - /* Table */ - --table-border-color: #{$grey-900}; - --table-active-color: #{$primary-color}; - --table-color: #{$grey-300}; - - /* Input */ - --input-bg-color: #{$grey-700}; - --input-color: #{$white}; - --input-icon-color: #{$grey-900}; - - /* Loader */ - --loader-bg-color: #{$loader-bg-color}; - --loader-secondary-bg-color: #{color.change($loader-bg-color, $alpha: 0.3)}; - - /* Dropdown */ - --dropdown-bg-color: #{$grey-700}; - --dropdown-active-color: #{$grey-500}; - --dropdown-color: #{$white}; - --dropdown-shadow-color: #{$black}; - - /* Dialog */ - --dialog-bg-color: #{$grey-900}; - --dialog-header-bg-color: #{$grey-500}; - --dialog-header-color: #{$grey-900}; - - ::backdrop { - --dialog-backdrop-color: #{color.change($grey-800, $alpha: 0.9)}; - } - - /* Overlay */ - --overlay-blur-bg-color: #{color.change($grey-800, $alpha: 0.9)}; - - /* Hr */ - --hr-color: #{$grey-900}; - - /* Action bar */ - --action-bar-bg-color: #{$grey-800}; - - /* Nav */ - --nav-shadow: 0 1px 0 #{color.change($black, $alpha: 0.12)}, 0 1px 3px #{color.change($black, $alpha: 0.15)}; - --nav-primary-bg-color: #{color.change($grey-800, $alpha: 0.9)}; - --nav-backdrop-bg-color: #{color.change($grey-800, $alpha: 0.88)}; - - /* Player */ - --player-bg-color: #{$player-bg-color}; - --player-header-bg-color: #{color.change($player-bg-color, $alpha: 0.65)}; - --player-progress-bg-color: #{$player-bg-color}; - --player-progress-hover-bg-color: #{$grey-800}; - --player-progress-color: #{$primary-color}; - --player-volume-bg-color: #{$grey-600}; - --player-volume-color: #{$primary-color}; - --player-control-color: #{$grey-400}; - --player-control-border-color: #{$grey-800}; - --player-control-main-color: #{$white}; - - /* Badge */ - --badge-bg-color: #{color.change($badge-color, $alpha: 0.2)}; - --badge-color: #{$badge-color}; - - /* Card */ - --card-border-color: #{$grey-700}; - --card-bg-color: #{$grey-900}; - - /* Icon */ - --icon-active-color: #{$primary-color}; - --icon-emphasis-color: #{$red}; -} diff --git a/app/assets/stylesheets/settings/_light_theme.scss b/app/assets/stylesheets/settings/_light_theme.scss deleted file mode 100644 index 1e9d371b6..000000000 --- a/app/assets/stylesheets/settings/_light_theme.scss +++ /dev/null @@ -1,127 +0,0 @@ -@use "sass:color"; -@use "colors" as *; - -@mixin light-theme { - $primary-color: $purple; - $btn-primary-bg-color: $primary-color; - $btn-secondary-bg-color: color.change($btn-primary-bg-color, $alpha: 0.25); - $btn-outline-bg-color: $grey-100; - $loader-bg-color: $primary-color; - $player-bg-color: $grey-200; - $badge-color: $primary-color; - - color-scheme: light; - - --link-active-color: #{$primary-color}; - --gradient-bg-color: linear-gradient(#{color.change($white, $alpha: 0.85)}, #{color.change($white, $alpha: 0.65)}), linear-gradient(#{$primary-color}, #{$primary-color}); - --primary-bg-color: #{$white}; - - /* Body */ - --body-bg-color: #{$white}; - - /* Text */ - --text-primary-color: #{$grey-900}; - --text-secondary-color: #{$grey-600}; - --text-success-color: #{$green}; - - /* Sidebar */ - --sidebar-bg-color: #{$grey-100}; - - /* Progress bar */ - --progress-bar-bg-color: #{$primary-color}; - - /* Button */ - --btn-color: #{$white}; - --btn-primary-bg-color: #{$btn-primary-bg-color}; - --btn-primary-hover-bg-color: #{color.adjust($btn-primary-bg-color, $lightness: -8%)}; - --btn-secondary-bg-color: #{$btn-secondary-bg-color}; - --btn-secondary-hover-bg-color: #{color.adjust($btn-secondary-bg-color, $lightness: -8%)}; - --btn-secondary-color: #{$purple-light}; - --btn-outline-color: #{$grey-900}; - --btn-outline-border-color: #{$grey-300}; - --btn-outline-bg-color: #{$btn-outline-bg-color}; - --btn-outline-hover-bg-color: #{color.adjust($btn-outline-bg-color, $lightness: -8%)}; - --btn-icon-hover-bg-color: #{color.change($grey-300, $alpha: 0.3)}; - - /* Flash message */ - --flash-color: #{$white}; - --flash-notice-bg-color: #{$green}; - --flash-alert-bg-color: #{$red}; - - /* Tab */ - --tab-color: #{$grey-900}; - --tab-active-color: #{$primary-color}; - - /* List */ - --list-border-color: #{$grey-200}; - --list-active-color: #{$primary-color}; - --list-grouped-bg-color: #{$grey-100}; - --list-subtext-color: #{$grey-500}; - - /* Table */ - --table-border-color: #{$grey-200}; - --table-active-color: #{$primary-color}; - --table-color: #{$grey-600}; - - /* Input */ - --input-bg-color: #{$grey-200}; - --input-color: #{$grey-900}; - --input-icon-color: #{$grey-500}; - - /* Loader */ - --loader-bg-color: #{$loader-bg-color}; - --loader-secondary-bg-color: #{color.change($loader-bg-color, $alpha: 0.3)}; - - /* Dropdown */ - --dropdown-bg-color: #{$white}; - --dropdown-active-color: #{$grey-300}; - --dropdown-color: #{$grey-900}; - --dropdown-shadow-color: #{$grey-300}; - - /* Dialog */ - --dialog-bg-color: #{$white}; - --dialog-header-bg-color: #{$grey-200}; - --dialog-header-color: #{$grey-900}; - - ::backdrop { - --dialog-backdrop-color: #{color.change($grey-100, $alpha: 0.9)}; - } - - /* Overlay */ - --overlay-blur-bg-color: #{color.change($grey-100, $alpha: 0.9)}; - - /* Hr */ - --hr-color: #{$grey-200}; - - /* Action bar */ - --action-bar-bg-color: #{$grey-200}; - - /* Nav */ - --nav-shadow: 0 1px 0 #{color.change($grey-300, $alpha: 0.12)}, 0 1px 3px #{color.change($grey-300, $alpha: 0.15)}; - --nav-primary-bg-color: #{color.change($white, $alpha: 0.9)}; - --nav-backdrop-bg-color: #{color.change($white, $alpha: 0.88)}; - - /* Player */ - --player-bg-color: #{$player-bg-color}; - --player-header-bg-color: #{color.change($player-bg-color, $alpha: 0.65)}; - --player-progress-bg-color: #{$player-bg-color}; - --player-progress-hover-bg-color: #{$grey-100}; - --player-progress-color: #{$primary-color}; - --player-volume-bg-color: #{$grey-300}; - --player-volume-color: #{$primary-color}; - --player-control-color: #{$grey-500}; - --player-control-border-color: #{$grey-300}; - --player-control-main-color: #{$grey-900}; - - /* Badge */ - --badge-bg-color: #{color.change($badge-color, $alpha: 0.2)}; - --badge-color: #{$badge-color}; - - /* Card */ - --card-border-color: #{$grey-200}; - --card-bg-color: #{$grey-100}; - - /* Icon */ - --icon-active-color: #{$primary-color}; - --icon-emphasis-color: #{$red}; -} diff --git a/app/assets/stylesheets/settings/_theme.scss b/app/assets/stylesheets/settings/_theme.scss deleted file mode 100644 index 572ffa78b..000000000 --- a/app/assets/stylesheets/settings/_theme.scss +++ /dev/null @@ -1,22 +0,0 @@ -@use "dark_theme" as *; -@use "light_theme" as *; - -[data-color-scheme="light"] { - @include light-theme; -} - -[data-color-scheme="dark"] { - @include dark-theme; -} - -@media (prefers-color-scheme: light) { - [data-color-scheme="auto"] { - @include light-theme; - } -} - -@media (prefers-color-scheme: dark) { - [data-color-scheme="auto"] { - @include dark-theme; - } -} diff --git a/app/assets/stylesheets/settings/_variables.scss b/app/assets/stylesheets/settings/_variables.scss deleted file mode 100644 index 6013af5f8..000000000 --- a/app/assets/stylesheets/settings/_variables.scss +++ /dev/null @@ -1,45 +0,0 @@ -$sans-serif-fonts: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Fira Sans", "Droid Sans", "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", "Wenquanyi Micro Hei", sans-serif; - -$monospace-fonts: "Menlo", "Monaco", "Consolas", "Courier New", monospace; - -$font-size: ( - "small": 12px, - "medium": 14px, - "large": 16px, - "wide": 20px, -); - -$spacing: ( - "tiny": 6px, - "narrow": 12px, - "small": 18px, - "medium": 24px, - "large": 36px, - "wide": 48px, -); - -$border-radius: ( - "small": 2px, - "medium": 4px, - "large": 8px, -); - -$breakpoint: ( - "wide": 1880px, - "extra-large": 1630px, - "large": 1380px, - "medium": 1130px, - "small": 930px, - "extra-small": 730px, - "narrow": 560px, - "extra-narrow": 375px, -); - -$base-zindex: 0; -$nav-zindex: $base-zindex + 1; -$sidebar-zindex: $nav-zindex + 1; -$dropdown-overlay-zindex: $sidebar-zindex + 1; -$dropdown-zindex: $dropdown-overlay-zindex + 1; -$flash-zindex: $dropdown-zindex + 1; -$fixed-overlay-zindex: $flash-zindex + 1; -$expanded-sidebar-zindex: $fixed-overlay-zindex + 1; diff --git a/app/assets/stylesheets/settings/colors.css b/app/assets/stylesheets/settings/colors.css new file mode 100644 index 000000000..4501cd432 --- /dev/null +++ b/app/assets/stylesheets/settings/colors.css @@ -0,0 +1,27 @@ +@layer settings { + :root { + --color-purple-dark: rgb(54 30 64); + --color-purple-shade: rgb(96 43 117); + --color-purple: rgb(119 66 141); + --color-purple-tint: rgb(143 89 166); + --color-purple-light: rgb(161 90 191); + + --color-white: rgb(255 255 251); + --color-grey-100: rgb(237 237 237); + --color-grey-200: rgb(217 217 217); + --color-grey-250: rgb(211 211 211); + --color-grey-300: rgb(191 191 191); + --color-grey-400: rgb(166 166 166); + --color-grey-500: rgb(140 140 140); + --color-grey-600: rgb(89 89 89); + --color-grey-650: rgb(80 80 80); + --color-grey-700: rgb(59 59 59); + --color-grey-800: rgb(33 33 33); + --color-grey-900: rgb(18 18 18); + --color-black: rgb(0 0 0); + + --color-red: rgb(166 22 55); + --color-green: rgb(35 166 80); + --color-navy: rgb(9 30 66); + } +} diff --git a/app/assets/stylesheets/settings/theme.css b/app/assets/stylesheets/settings/theme.css new file mode 100644 index 000000000..50b8cfe20 --- /dev/null +++ b/app/assets/stylesheets/settings/theme.css @@ -0,0 +1,148 @@ +@layer settings { + :root { + color-scheme: light dark; + + --primary-color: light-dark(var(--color-purple), var(--color-purple-light)); + --primary-bg-color: light-dark(var(--color-white), var(--color-grey-800)); + + --link-active-color: var(--primary-color); + + /* Body */ + --body-bg-color: light-dark(var(--color-white), var(--color-grey-800)); + + /* Text */ + --text-primary-color: light-dark(var(--color-grey-900), var(--color-white)); + --text-secondary-color: light-dark(var(--color-grey-600), var(--color-grey-300)); + --text-success-color: var(--color-green); + + /* Sidebar */ + --sidebar-bg-color: light-dark(var(--color-grey-100), var(--color-grey-900)); + + /* Progress bar */ + --progress-bar-bg-color: var(--primary-color); + + /* Button */ + --btn-color: var(--color-white); + --btn-primary-bg-color: var(--color-purple); + --btn-primary-hover-bg-color: light-dark(var(--color-purple-shade), var(--color-purple-tint)); + --btn-secondary-bg-color: rgb(from var(--color-purple) r g b / 0.25); + --btn-secondary-hover-bg-color: light-dark(rgb(from var(--color-purple-shade) r g b / 0.25), rgb(from var(--color-purple-tint) r g b / 0.25)); + --btn-secondary-color: light-dark(var(--color-purple-light), var(--primary-color)); + --btn-outline-color: light-dark(var(--color-grey-900), var(--color-white)); + --btn-outline-border-color: light-dark(var(--color-grey-300), var(--color-grey-800)); + --btn-outline-bg-color: light-dark(var(--color-grey-100), var(--color-grey-700)); + --btn-outline-hover-bg-color: light-dark(var(--color-grey-250), var(--color-grey-650)); + --btn-icon-hover-bg-color: light-dark(rgb(from var(--color-grey-300) r g b / 0.3), rgb(from var(--color-grey-600) r g b / 0.5)); + + /* Flash message */ + --flash-color: var(--color-white); + --flash-notice-bg-color: var(--color-green); + --flash-alert-bg-color: var(--color-red); + + /* Tab */ + --tab-color: light-dark(var(--color-grey-900), var(--color-white)); + --tab-active-color: var(--primary-color); + + /* List */ + --list-border-color: light-dark(var(--color-grey-200), var(--color-grey-800)); + --list-active-color: var(--primary-color); + --list-grouped-bg-color: light-dark(var(--color-grey-100), var(--color-grey-900)); + --list-subtext-color: light-dark(var(--color-grey-500), var(--color-grey-400)); + + /* Table */ + --table-border-color: light-dark(var(--color-grey-200), var(--color-grey-900)); + --table-active-color: var(--primary-color); + --table-color: light-dark(var(--color-grey-600), var(--color-grey-300)); + + /* Input */ + --input-bg-color: light-dark(var(--color-grey-200), var(--color-grey-700)); + --input-color: light-dark(var(--color-grey-900), var(--color-white)); + --input-icon-color: light-dark(var(--color-grey-500), var(--color-grey-900)); + + /* Loader */ + --loader-bg-color: var(--primary-color); + --loader-secondary-bg-color: rgb(from var(--primary-color) r g b / 0.3); + + /* Dropdown */ + --dropdown-bg-color: light-dark(var(--color-white), var(--color-grey-700)); + --dropdown-active-color: light-dark(var(--color-grey-300), var(--color-grey-500)); + --dropdown-color: light-dark(var(--color-grey-900), var(--color-white)); + --dropdown-shadow-color: light-dark(var(--color-grey-300), var(--color-black)); + + /* Dialog */ + --dialog-bg-color: light-dark(var(--color-white), var(--color-grey-900)); + --dialog-header-bg-color: light-dark(var(--color-grey-200), var(--color-grey-500)); + --dialog-header-color: var(--color-grey-900); + + ::backdrop { + --dialog-backdrop-color: rgb(from light-dark(var(--color-grey-100), var(--color-grey-800)) r g b / 0.9); + } + + /* Overlay */ + --overlay-blur-bg-color: rgb(from light-dark(var(--color-grey-100), var(--color-grey-800)) r g b / 0.9); + + /* Hr */ + --hr-color: light-dark(var(--color-grey-200), var(--color-grey-900)); + + /* Action bar */ + --action-bar-bg-color: light-dark(var(--color-grey-200), var(--color-grey-800)); + + /* Nav */ + --nav-shadow: + 0 1px 0 rgb(from light-dark(var(--color-grey-300), var(--color-black)) r g b / 0.12), + 0 1px 3px rgb(from light-dark(var(--color-grey-300), var(--color-black)) r g b / 0.15); + --nav-primary-bg-color: rgb(from light-dark(var(--color-white), var(--color-grey-800)) r g b / 0.9); + --nav-backdrop-bg-color: rgb(from light-dark(var(--color-white), var(--color-grey-800)) r g b / 0.88); + + /* Player */ + --player-bg-color: light-dark(var(--color-grey-200), var(--color-black)); + --player-header-bg-color: rgb(from light-dark(var(--color-grey-200), var(--color-black)) r g b / 0.65); + --player-progress-bg-color: light-dark(var(--color-grey-200), var(--color-black)); + --player-progress-hover-bg-color: light-dark(var(--color-grey-100), var(--color-grey-800)); + --player-progress-color: var(--primary-color); + --player-volume-bg-color: light-dark(var(--color-grey-300), var(--color-grey-600)); + --player-volume-color: var(--primary-color); + --player-control-color: light-dark(var(--color-grey-500), var(--color-grey-400)); + --player-control-border-color: light-dark(var(--color-grey-300), var(--color-grey-800)); + --player-control-main-color: light-dark(var(--color-grey-900), var(--color-white)); + + /* Badge */ + --badge-bg-color: rgb(from var(--primary-color) r g b / 0.2); + --badge-color: var(--primary-color); + + /* Card */ + --card-border-color: light-dark(var(--color-grey-200), var(--color-grey-700)); + --card-bg-color: light-dark(var(--color-grey-100), var(--color-grey-900)); + + /* Icon */ + --icon-active-color: var(--primary-color); + --icon-emphasis-color: var(--color-red); + + --gradient-bg-color: + linear-gradient( + rgb(from var(--color-white) r g b / 0.85), + rgb(from var(--color-white) r g b / 0.65) + ), + linear-gradient(var(--primary-color), var(--primary-color)); + + } + + [data-color-scheme="light"] { + color-scheme: light; + } + + [data-color-scheme="dark"] { + color-scheme: dark; + --gradient-bg-color: + linear-gradient(var(--color-black), rgb(from var(--color-black) r g b / 0.75)), + linear-gradient(var(--primary-color), var(--primary-color)); + } + + @media (prefers-color-scheme: dark) { + [data-color-scheme="auto"] { + --gradient-bg-color: + linear-gradient(var(--color-black), rgb(from var(--color-black) r g b / 0.75)), + linear-gradient(var(--primary-color), var(--primary-color)); + } + } +} diff --git a/app/assets/stylesheets/settings/variables.css b/app/assets/stylesheets/settings/variables.css new file mode 100644 index 000000000..950d62445 --- /dev/null +++ b/app/assets/stylesheets/settings/variables.css @@ -0,0 +1,36 @@ +@layer settings { + :root { + /* Fonts */ + --font-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Fira Sans", "Droid Sans", "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Hiragino Sans GB W3", "Microsoft YaHei", "Wenquanyi Micro Hei", sans-serif; + --font-monospace: "Menlo", "Monaco", "Consolas", "Courier New", monospace; + + /* Font sizes */ + --font-size-small: 12px; + --font-size-medium: 14px; + --font-size-large: 16px; + --font-size-wide: 20px; + + /* Spacing */ + --spacing-tiny: 6px; + --spacing-narrow: 12px; + --spacing-small: 18px; + --spacing-medium: 24px; + --spacing-large: 36px; + --spacing-wide: 48px; + + /* Border radius */ + --border-radius-small: 2px; + --border-radius-medium: 4px; + --border-radius-large: 8px; + + /* Z-indexes */ + --z-base: 0; + --z-nav: 1; + --z-sidebar: 2; + --z-dropdown-overlay: 3; + --z-dropdown: 4; + --z-flash: 5; + --z-fixed-overlay: 6; + --z-expanded-sidebar: 7; + } +} diff --git a/app/assets/stylesheets/tools/_functions.scss b/app/assets/stylesheets/tools/_functions.scss deleted file mode 100644 index 83fc3a9ac..000000000 --- a/app/assets/stylesheets/tools/_functions.scss +++ /dev/null @@ -1,23 +0,0 @@ -@use "sass:map"; -@use "sass:string"; -@use "../settings/variables"; - -@function font-size($type) { - @return map.get(variables.$font-size, $type); -} - -@function spacing($type) { - @return map.get(variables.$spacing, $type); -} - -@function border-radius($type) { - @return map.get(variables.$border-radius, $type); -} - -@function breakpoint-postfix($breakpoint) { - @if string.length($breakpoint) != 0 { - @return "\\@#{$breakpoint}"; - } - - @return $breakpoint; -} diff --git a/app/assets/stylesheets/tools/_responsive.scss b/app/assets/stylesheets/tools/_responsive.scss deleted file mode 100644 index 246e561b0..000000000 --- a/app/assets/stylesheets/tools/_responsive.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use "sass:map"; -@use "../settings/variables"; - -@mixin media-query { - @content(""); - - @media (min-width: #{map.get(variables.$breakpoint, "wide")}) { - @content("extra-wide"); - } - - @each $name, $value in variables.$breakpoint { - @media (max-width: #{$value}) { - @content($name); - } - } -} diff --git a/app/assets/stylesheets/utilities/_background.scss b/app/assets/stylesheets/utilities/_background.scss deleted file mode 100644 index 19ea211c6..000000000 --- a/app/assets/stylesheets/utilities/_background.scss +++ /dev/null @@ -1,7 +0,0 @@ -.u-bg-primary { - background: var(--primary-bg-color) !important; -} - -.u-bg-gradient { - background: var(--gradient-bg-color) !important; -} diff --git a/app/assets/stylesheets/utilities/_border.scss b/app/assets/stylesheets/utilities/_border.scss deleted file mode 100644 index 387ca6b30..000000000 --- a/app/assets/stylesheets/utilities/_border.scss +++ /dev/null @@ -1,15 +0,0 @@ -@use "../settings/variables"; - -.u-border-shadow { - box-shadow: 0 8px 16px -4px rgba(9, 30, 66, 0.25), 0 0 1px rgba(9, 30, 66, 0.31) !important; -} - -.u-border-none { - border: none !important; -} - -@each $name, $value in variables.$border-radius { - .u-border-radius-#{$name} { - border-radius: $value !important; - } -} diff --git a/app/assets/stylesheets/utilities/_cursor.scss b/app/assets/stylesheets/utilities/_cursor.scss deleted file mode 100644 index aa1997c61..000000000 --- a/app/assets/stylesheets/utilities/_cursor.scss +++ /dev/null @@ -1,3 +0,0 @@ -.u-cursor-pointer { - cursor: pointer !important; -} diff --git a/app/assets/stylesheets/utilities/_display.scss b/app/assets/stylesheets/utilities/_display.scss deleted file mode 100644 index c824e0772..000000000 --- a/app/assets/stylesheets/utilities/_display.scss +++ /dev/null @@ -1,20 +0,0 @@ -@use "../tools/responsive"; -@use "../tools/functions"; - -@mixin display($breakpoint-postfix) { - .u-display-none#{$breakpoint-postfix} { - display: none !important; - } - - .u-display-block#{$breakpoint-postfix} { - display: block !important; - } -} - -.u-display-inline-block { - display: inline-block !important; -} - -@include responsive.media-query using ($breakpoint) { - @include display(functions.breakpoint-postfix($breakpoint)); -} diff --git a/app/assets/stylesheets/utilities/_image.scss b/app/assets/stylesheets/utilities/_image.scss deleted file mode 100644 index 97212982b..000000000 --- a/app/assets/stylesheets/utilities/_image.scss +++ /dev/null @@ -1,19 +0,0 @@ -.u-image-large { - width: 300px; - height: 300px; -} - -.u-image-medium { - width: 200px; - height: 200px; -} - -.u-image-small { - width: 100px; - height: 100px; -} - -.u-image-fluid { - max-width: 100%; - height: auto; -} diff --git a/app/assets/stylesheets/utilities/_overflow.scss b/app/assets/stylesheets/utilities/_overflow.scss deleted file mode 100644 index 2ceb263db..000000000 --- a/app/assets/stylesheets/utilities/_overflow.scss +++ /dev/null @@ -1,7 +0,0 @@ -.u-overflow-hidden { - overflow: hidden !important; -} - -.u-overflow-auto { - overflow: auto !important; -} diff --git a/app/assets/stylesheets/utilities/_position.scss b/app/assets/stylesheets/utilities/_position.scss deleted file mode 100644 index 94c08f7cc..000000000 --- a/app/assets/stylesheets/utilities/_position.scss +++ /dev/null @@ -1,15 +0,0 @@ -.u-position-relative { - position: relative !important; -} - -.u-position-sticky-top { - position: sticky !important; - top: 0; -} - -.u-position-fixed-bottom { - position: fixed !important; - left: 0; - right: 0; - bottom: 0; -} diff --git a/app/assets/stylesheets/utilities/_sizing.scss b/app/assets/stylesheets/utilities/_sizing.scss deleted file mode 100644 index 493e0162c..000000000 --- a/app/assets/stylesheets/utilities/_sizing.scss +++ /dev/null @@ -1,25 +0,0 @@ -@use "../tools/functions"; - -.u-vw-100 { - width: 100vw !important; -} - -.u-vh-100 { - height: 100vh !important; -} - -.u-w-100 { - width: 100% !important; -} - -.u-h-100 { - height: 100% !important; -} - -.u-h-0 { - height: 0 !important; -} - -.u-w-0 { - width: 0 !important; -} diff --git a/app/assets/stylesheets/utilities/_spacing.scss b/app/assets/stylesheets/utilities/_spacing.scss deleted file mode 100644 index 49a292efb..000000000 --- a/app/assets/stylesheets/utilities/_spacing.scss +++ /dev/null @@ -1,90 +0,0 @@ -@use "../settings/variables"; -@use "../tools/responsive"; -@use "../tools/functions" as *; - -@mixin margin($name, $size) { - .u-m-#{$name} { - margin: $size !important; - } - - .u-mt-#{$name} { - margin-top: $size !important; - } - - .u-mb-#{$name} { - margin-bottom: $size !important; - } - - .u-ml-#{$name} { - margin-left: $size !important; - } - - .u-mr-#{$name} { - margin-right: $size !important; - } - - .u-mx-#{$name} { - margin-left: $size !important; - margin-right: $size !important; - } - - .u-my-#{$name} { - margin-top: $size !important; - margin-bottom: $size !important; - } -} - -@mixin padding($name, $size) { - .u-p-#{$name} { - padding: $size !important; - } - - .u-pt-#{$name} { - padding-top: $size !important; - } - - .u-pb-#{$name} { - padding-bottom: $size !important; - } - - .u-pl-#{$name} { - padding-left: $size !important; - } - - .u-pr-#{$name} { - padding-right: $size !important; - } - - .u-px-#{$name} { - padding-left: $size !important; - padding-right: $size !important; - } - - .u-py-#{$name} { - padding-top: $size !important; - padding-bottom: $size !important; - } -} - -@each $name, $value in variables.$spacing { - @include margin($name, $value); - @include padding($name, $value); -} - -@include margin(0, 0); -@include margin(auto, auto); -@include padding(0, 0); - -@include responsive.media-query using ($breakpoint) { - @if $breakpoint == "small" { - .u-p-small\@small { - padding: spacing("small") !important; - } - } - - @if $breakpoint == "extra-narrow" { - .u-p-narrow\@extra-narrow { - padding: spacing("narrow") !important; - } - } -} diff --git a/app/assets/stylesheets/utilities/_text.scss b/app/assets/stylesheets/utilities/_text.scss deleted file mode 100644 index 0ed367500..000000000 --- a/app/assets/stylesheets/utilities/_text.scss +++ /dev/null @@ -1,52 +0,0 @@ -@use "../settings/variables"; - -.u-text-truncate { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.u-text-weight-bold { - font-weight: bold !important; -} - -.u-text-weight-normal { - font-weight: normal !important; -} - -.u-text-color-primary { - color: var(--text-primary-color) !important; -} - -.u-text-color-secondary { - color: var(--text-secondary-color) !important; -} - -.u-text-color-success { - color: var(--text-success-color) !important; -} - -.u-text-monospace { - font-family: variables.$monospace-fonts; -} - -.u-text-align-center { - text-align: center !important; -} - -.u-text-align-left { - text-align: left !important; -} - -.u-text-line-clamp-2 { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2 !important; - overflow: hidden; -} - -@each $name, $value in variables.$font-size { - .u-text-size-#{$name} { - font-size: $value; - } -} diff --git a/app/assets/stylesheets/utilities/_visibility.scss b/app/assets/stylesheets/utilities/_visibility.scss deleted file mode 100644 index fe742e414..000000000 --- a/app/assets/stylesheets/utilities/_visibility.scss +++ /dev/null @@ -1,3 +0,0 @@ -.u-visibility-hidden { - visibility: hidden !important; -} diff --git a/app/assets/stylesheets/utilities/background.css b/app/assets/stylesheets/utilities/background.css new file mode 100644 index 000000000..ac84699c8 --- /dev/null +++ b/app/assets/stylesheets/utilities/background.css @@ -0,0 +1,9 @@ +@layer utilities { + .u-bg-primary { + background: var(--primary-bg-color); + } + + .u-bg-gradient { + background: var(--gradient-bg-color); + } +} diff --git a/app/assets/stylesheets/utilities/border.css b/app/assets/stylesheets/utilities/border.css new file mode 100644 index 000000000..161510062 --- /dev/null +++ b/app/assets/stylesheets/utilities/border.css @@ -0,0 +1,21 @@ +@layer utilities { + .u-border-shadow { + box-shadow: 0 8px 16px -4px rgb(from var(--color-navy) r g b / 0.25), 0 0 1px rgb(from var(--color-navy) r g b / 0.31); + } + + .u-border-none { + border: none; + } + + .u-border-radius-small { + border-radius: var(--border-radius-small); + } + + .u-border-radius-medium { + border-radius: var(--border-radius-medium); + } + + .u-border-radius-large { + border-radius: var(--border-radius-large); + } +} diff --git a/app/assets/stylesheets/utilities/bridge.css b/app/assets/stylesheets/utilities/bridge.css new file mode 100644 index 000000000..22f194a35 --- /dev/null +++ b/app/assets/stylesheets/utilities/bridge.css @@ -0,0 +1,6 @@ +@layer utilities { + [data-bridge-components~="account"] [data-controller~="bridge--account"], + [data-bridge-components~="search"] [data-controller~="bridge--search"] { + display: none; + } +} diff --git a/app/assets/stylesheets/utilities/cursor.css b/app/assets/stylesheets/utilities/cursor.css new file mode 100644 index 000000000..479c718e4 --- /dev/null +++ b/app/assets/stylesheets/utilities/cursor.css @@ -0,0 +1,5 @@ +@layer utilities { + .u-cursor-pointer { + cursor: pointer; + } +} diff --git a/app/assets/stylesheets/utilities/display.css b/app/assets/stylesheets/utilities/display.css new file mode 100644 index 000000000..747f935ab --- /dev/null +++ b/app/assets/stylesheets/utilities/display.css @@ -0,0 +1,58 @@ +@layer utilities { + .u-display-none { + display: none; + } + + .u-display-block { + display: block; + } + + .u-display-inline-block { + display: inline-block; + } + + @media (min-width: 1880px) { + .u-display-none\@extra-wide { display: none; } + .u-display-block\@extra-wide { display: block; } + } + + @media (max-width: 1880px) { + .u-display-none\@wide { display: none; } + .u-display-block\@wide { display: block; } + } + + @media (max-width: 1630px) { + .u-display-none\@extra-large { display: none; } + .u-display-block\@extra-large { display: block; } + } + + @media (max-width: 1380px) { + .u-display-none\@large { display: none; } + .u-display-block\@large { display: block; } + } + + @media (max-width: 1130px) { + .u-display-none\@medium { display: none; } + .u-display-block\@medium { display: block; } + } + + @media (max-width: 930px) { + .u-display-none\@small { display: none; } + .u-display-block\@small { display: block; } + } + + @media (max-width: 730px) { + .u-display-none\@extra-small { display: none; } + .u-display-block\@extra-small { display: block; } + } + + @media (max-width: 560px) { + .u-display-none\@narrow { display: none; } + .u-display-block\@narrow { display: block; } + } + + @media (max-width: 375px) { + .u-display-none\@extra-narrow { display: none; } + .u-display-block\@extra-narrow { display: block; } + } +} diff --git a/app/assets/stylesheets/utilities/image.css b/app/assets/stylesheets/utilities/image.css new file mode 100644 index 000000000..d3ecc8c76 --- /dev/null +++ b/app/assets/stylesheets/utilities/image.css @@ -0,0 +1,21 @@ +@layer utilities { + .u-image-large { + width: 300px; + height: 300px; + } + + .u-image-medium { + width: 200px; + height: 200px; + } + + .u-image-small { + width: 100px; + height: 100px; + } + + .u-image-fluid { + max-width: 100%; + height: auto; + } +} diff --git a/app/assets/stylesheets/utilities/overflow.css b/app/assets/stylesheets/utilities/overflow.css new file mode 100644 index 000000000..211628dd0 --- /dev/null +++ b/app/assets/stylesheets/utilities/overflow.css @@ -0,0 +1,9 @@ +@layer utilities { + .u-overflow-hidden { + overflow: hidden; + } + + .u-overflow-auto { + overflow: auto; + } +} diff --git a/app/assets/stylesheets/utilities/position.css b/app/assets/stylesheets/utilities/position.css new file mode 100644 index 000000000..9c434f303 --- /dev/null +++ b/app/assets/stylesheets/utilities/position.css @@ -0,0 +1,17 @@ +@layer utilities { + .u-position-relative { + position: relative; + } + + .u-position-sticky-top { + position: sticky; + top: 0; + } + + .u-position-fixed-bottom { + position: fixed; + left: 0; + right: 0; + bottom: 0; + } +} diff --git a/app/assets/stylesheets/utilities/sizing.css b/app/assets/stylesheets/utilities/sizing.css new file mode 100644 index 000000000..35efb6851 --- /dev/null +++ b/app/assets/stylesheets/utilities/sizing.css @@ -0,0 +1,25 @@ +@layer utilities { + .u-vw-100 { + width: 100vw; + } + + .u-vh-100 { + height: 100vh; + } + + .u-w-100 { + width: 100%; + } + + .u-h-100 { + height: 100%; + } + + .u-h-0 { + height: 0; + } + + .u-w-0 { + width: 0; + } +} diff --git a/app/assets/stylesheets/utilities/spacing.css b/app/assets/stylesheets/utilities/spacing.css new file mode 100644 index 000000000..1bcf89bed --- /dev/null +++ b/app/assets/stylesheets/utilities/spacing.css @@ -0,0 +1,149 @@ +@layer utilities { + /* Margin — tiny (6px) */ + .u-m-tiny { margin: var(--spacing-tiny); } + .u-mt-tiny { margin-top: var(--spacing-tiny); } + .u-mb-tiny { margin-bottom: var(--spacing-tiny); } + .u-ml-tiny { margin-left: var(--spacing-tiny); } + .u-mr-tiny { margin-right: var(--spacing-tiny); } + .u-mx-tiny { margin-left: var(--spacing-tiny); margin-right: var(--spacing-tiny); } + .u-my-tiny { margin-top: var(--spacing-tiny); margin-bottom: var(--spacing-tiny); } + + /* Margin — narrow (12px) */ + .u-m-narrow { margin: var(--spacing-narrow); } + .u-mt-narrow { margin-top: var(--spacing-narrow); } + .u-mb-narrow { margin-bottom: var(--spacing-narrow); } + .u-ml-narrow { margin-left: var(--spacing-narrow); } + .u-mr-narrow { margin-right: var(--spacing-narrow); } + .u-mx-narrow { margin-left: var(--spacing-narrow); margin-right: var(--spacing-narrow); } + .u-my-narrow { margin-top: var(--spacing-narrow); margin-bottom: var(--spacing-narrow); } + + /* Margin — small (18px) */ + .u-m-small { margin: var(--spacing-small); } + .u-mt-small { margin-top: var(--spacing-small); } + .u-mb-small { margin-bottom: var(--spacing-small); } + .u-ml-small { margin-left: var(--spacing-small); } + .u-mr-small { margin-right: var(--spacing-small); } + .u-mx-small { margin-left: var(--spacing-small); margin-right: var(--spacing-small); } + .u-my-small { margin-top: var(--spacing-small); margin-bottom: var(--spacing-small); } + + /* Margin — medium (24px) */ + .u-m-medium { margin: var(--spacing-medium); } + .u-mt-medium { margin-top: var(--spacing-medium); } + .u-mb-medium { margin-bottom: var(--spacing-medium); } + .u-ml-medium { margin-left: var(--spacing-medium); } + .u-mr-medium { margin-right: var(--spacing-medium); } + .u-mx-medium { margin-left: var(--spacing-medium); margin-right: var(--spacing-medium); } + .u-my-medium { margin-top: var(--spacing-medium); margin-bottom: var(--spacing-medium); } + + /* Margin — large (36px) */ + .u-m-large { margin: var(--spacing-large); } + .u-mt-large { margin-top: var(--spacing-large); } + .u-mb-large { margin-bottom: var(--spacing-large); } + .u-ml-large { margin-left: var(--spacing-large); } + .u-mr-large { margin-right: var(--spacing-large); } + .u-mx-large { margin-left: var(--spacing-large); margin-right: var(--spacing-large); } + .u-my-large { margin-top: var(--spacing-large); margin-bottom: var(--spacing-large); } + + /* Margin — wide (48px) */ + .u-m-wide { margin: var(--spacing-wide); } + .u-mt-wide { margin-top: var(--spacing-wide); } + .u-mb-wide { margin-bottom: var(--spacing-wide); } + .u-ml-wide { margin-left: var(--spacing-wide); } + .u-mr-wide { margin-right: var(--spacing-wide); } + .u-mx-wide { margin-left: var(--spacing-wide); margin-right: var(--spacing-wide); } + .u-my-wide { margin-top: var(--spacing-wide); margin-bottom: var(--spacing-wide); } + + /* Padding — tiny */ + .u-p-tiny { padding: var(--spacing-tiny); } + .u-pt-tiny { padding-top: var(--spacing-tiny); } + .u-pb-tiny { padding-bottom: var(--spacing-tiny); } + .u-pl-tiny { padding-left: var(--spacing-tiny); } + .u-pr-tiny { padding-right: var(--spacing-tiny); } + .u-px-tiny { padding-left: var(--spacing-tiny); padding-right: var(--spacing-tiny); } + .u-py-tiny { padding-top: var(--spacing-tiny); padding-bottom: var(--spacing-tiny); } + + /* Padding — narrow */ + .u-p-narrow { padding: var(--spacing-narrow); } + .u-pt-narrow { padding-top: var(--spacing-narrow); } + .u-pb-narrow { padding-bottom: var(--spacing-narrow); } + .u-pl-narrow { padding-left: var(--spacing-narrow); } + .u-pr-narrow { padding-right: var(--spacing-narrow); } + .u-px-narrow { padding-left: var(--spacing-narrow); padding-right: var(--spacing-narrow); } + .u-py-narrow { padding-top: var(--spacing-narrow); padding-bottom: var(--spacing-narrow); } + + /* Padding — small */ + .u-p-small { padding: var(--spacing-small); } + .u-pt-small { padding-top: var(--spacing-small); } + .u-pb-small { padding-bottom: var(--spacing-small); } + .u-pl-small { padding-left: var(--spacing-small); } + .u-pr-small { padding-right: var(--spacing-small); } + .u-px-small { padding-left: var(--spacing-small); padding-right: var(--spacing-small); } + .u-py-small { padding-top: var(--spacing-small); padding-bottom: var(--spacing-small); } + + /* Padding — medium */ + .u-p-medium { padding: var(--spacing-medium); } + .u-pt-medium { padding-top: var(--spacing-medium); } + .u-pb-medium { padding-bottom: var(--spacing-medium); } + .u-pl-medium { padding-left: var(--spacing-medium); } + .u-pr-medium { padding-right: var(--spacing-medium); } + .u-px-medium { padding-left: var(--spacing-medium); padding-right: var(--spacing-medium); } + .u-py-medium { padding-top: var(--spacing-medium); padding-bottom: var(--spacing-medium); } + + /* Padding — large */ + .u-p-large { padding: var(--spacing-large); } + .u-pt-large { padding-top: var(--spacing-large); } + .u-pb-large { padding-bottom: var(--spacing-large); } + .u-pl-large { padding-left: var(--spacing-large); } + .u-pr-large { padding-right: var(--spacing-large); } + .u-px-large { padding-left: var(--spacing-large); padding-right: var(--spacing-large); } + .u-py-large { padding-top: var(--spacing-large); padding-bottom: var(--spacing-large); } + + /* Padding — wide */ + .u-p-wide { padding: var(--spacing-wide); } + .u-pt-wide { padding-top: var(--spacing-wide); } + .u-pb-wide { padding-bottom: var(--spacing-wide); } + .u-pl-wide { padding-left: var(--spacing-wide); } + .u-pr-wide { padding-right: var(--spacing-wide); } + .u-px-wide { padding-left: var(--spacing-wide); padding-right: var(--spacing-wide); } + .u-py-wide { padding-top: var(--spacing-wide); padding-bottom: var(--spacing-wide); } + + /* Margin — 0 */ + .u-m-0 { margin: 0; } + .u-mt-0 { margin-top: 0; } + .u-mb-0 { margin-bottom: 0; } + .u-ml-0 { margin-left: 0; } + .u-mr-0 { margin-right: 0; } + .u-mx-0 { margin-left: 0; margin-right: 0; } + .u-my-0 { margin-top: 0; margin-bottom: 0; } + + /* Margin — auto */ + .u-m-auto { margin: auto; } + .u-mt-auto { margin-top: auto; } + .u-mb-auto { margin-bottom: auto; } + .u-ml-auto { margin-left: auto; } + .u-mr-auto { margin-right: auto; } + .u-mx-auto { margin-left: auto; margin-right: auto; } + .u-my-auto { margin-top: auto; margin-bottom: auto; } + + /* Padding — 0 */ + .u-p-0 { padding: 0; } + .u-pt-0 { padding-top: 0; } + .u-pb-0 { padding-bottom: 0; } + .u-pl-0 { padding-left: 0; } + .u-pr-0 { padding-right: 0; } + .u-px-0 { padding-left: 0; padding-right: 0; } + .u-py-0 { padding-top: 0; padding-bottom: 0; } + + /* Responsive utilities */ + @media (max-width: 930px) { + .u-p-small\@small { + padding: var(--spacing-small); + } + } + + @media (max-width: 375px) { + .u-p-narrow\@extra-narrow { + padding: var(--spacing-narrow); + } + } +} diff --git a/app/assets/stylesheets/utilities/text.css b/app/assets/stylesheets/utilities/text.css new file mode 100644 index 000000000..e88023c99 --- /dev/null +++ b/app/assets/stylesheets/utilities/text.css @@ -0,0 +1,62 @@ +@layer utilities { + .u-text-truncate { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .u-text-weight-bold { + font-weight: bold; + } + + .u-text-weight-normal { + font-weight: normal; + } + + .u-text-color-primary { + color: var(--text-primary-color); + } + + .u-text-color-secondary { + color: var(--text-secondary-color); + } + + .u-text-color-success { + color: var(--text-success-color); + } + + .u-text-monospace { + font-family: var(--font-monospace); + } + + .u-text-align-center { + text-align: center; + } + + .u-text-align-left { + text-align: left; + } + + .u-text-line-clamp-2 { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } + + .u-text-size-small { + font-size: var(--font-size-small); + } + + .u-text-size-medium { + font-size: var(--font-size-medium); + } + + .u-text-size-large { + font-size: var(--font-size-large); + } + + .u-text-size-wide { + font-size: var(--font-size-wide); + } +} diff --git a/app/assets/stylesheets/utilities/visibility.css b/app/assets/stylesheets/utilities/visibility.css new file mode 100644 index 000000000..480351d98 --- /dev/null +++ b/app/assets/stylesheets/utilities/visibility.css @@ -0,0 +1,5 @@ +@layer utilities { + .u-visibility-hidden { + visibility: hidden; + } +} diff --git a/esbuild.config.mjs b/esbuild.config.mjs new file mode 100644 index 000000000..ed4f86268 --- /dev/null +++ b/esbuild.config.mjs @@ -0,0 +1,38 @@ +import * as esbuild from "esbuild" +import { readdirSync } from "node:fs" + +const watch = process.argv.includes("--watch") +const minify = !process.argv.includes("--dev") + +const externalAssets = ["*.svg", "*.png", "*.jpg", "*.gif", "*.woff", "*.woff2"] + +const jsEntryPoints = readdirSync("app/javascript") + .filter(file => /\.[a-z]+$/i.test(file)) + .map(file => `app/javascript/${file}`) + +const configs = [ + { + entryPoints: jsEntryPoints, + bundle: true, + sourcemap: true, + format: "esm", + outdir: "app/assets/builds", + publicPath: "/assets", + minify, + external: externalAssets + }, + { + entryPoints: ["app/assets/stylesheets/application.css"], + bundle: true, + outdir: "app/assets/builds", + minify, + external: externalAssets + } +] + +if (watch) { + const contexts = await Promise.all(configs.map(esbuild.context)) + await Promise.all(contexts.map(ctx => ctx.watch())) +} else { + await Promise.all(configs.map(esbuild.build)) +} diff --git a/lib/tasks/lint.rake b/lib/tasks/lint.rake index 57772e22e..5831a7f25 100644 --- a/lib/tasks/lint.rake +++ b/lib/tasks/lint.rake @@ -7,7 +7,7 @@ unless Rails.env.production? end task :css do - abort("rails lint:css failed") unless system("npx stylelint 'app/assets/stylesheets/**/*.scss'") + abort("rails lint:css failed") unless system("npx stylelint 'app/assets/stylesheets/**/*.css'") end task :erb do diff --git a/package-lock.json b/package-lock.json index 238ea9f1f..c76cef3a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,7 @@ "@hotwired/turbo-rails": "^8.0.0", "esbuild": "^0.18.17", "howler": "^2.2.3", - "idiomorph": "^0.7.4", - "sass": "^1.64.2" + "idiomorph": "^0.7.4" }, "devDependencies": { "standard": "^17.1.0", @@ -2599,12 +2598,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/idiomorph": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.7.4.tgz", - "integrity": "sha512-uCdSpLo3uMfqOmrwXTpR1k/sq4sSmKC7l4o/LdJOEU+MMMq+wkevRqOQYn3lP7vfz9Mv+USBEqPvi0XhdL9ENw==", - "license": "0BSD" - }, "node_modules/ignore": { "version": "5.2.0", "dev": true, diff --git a/package.json b/package.json index 53e15919b..3c5eb4c82 100644 --- a/package.json +++ b/package.json @@ -7,19 +7,16 @@ "@hotwired/turbo-rails": "^8.0.0", "esbuild": "^0.18.17", "howler": "^2.2.3", - "idiomorph": "^0.7.4", - "sass": "^1.64.2" + "idiomorph": "^0.7.4" }, "devDependencies": { + "@stylistic/stylelint-plugin": "^5.2.0", "standard": "^17.1.0", - "stylelint": "^15.10.2", - "stylelint-config-standard-scss": "^9.0.0" + "stylelint": "^17.12.0", + "stylelint-config-standard": "^40.0.0" }, "scripts": { - "build": "esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets --minify", - "build-dev": "esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets", - "build:css": "sass app/assets/stylesheets/application.scss:app/assets/builds/application.css --no-source-map --style=compressed", - "build-dev:css": "sass app/assets/stylesheets/application.scss:app/assets/builds/application.css --no-source-map" + "build": "node esbuild.config.mjs" }, "standard": { "globals": [ From d0dcc3967cc26d1d4145b1ee8f22dc097d4bff7e Mon Sep 17 00:00:00 2001 From: Ed Chao Date: Mon, 25 May 2026 20:01:14 +0900 Subject: [PATCH 02/18] feat: update spacing and margin variables across styles for consistency --- .../stylesheets/components/action_bar.css | 4 +- app/assets/stylesheets/components/badge.css | 4 +- app/assets/stylesheets/components/button.css | 16 +- app/assets/stylesheets/components/card.css | 18 +- app/assets/stylesheets/components/dialog.css | 10 +- .../stylesheets/components/dropdown.css | 12 +- app/assets/stylesheets/components/flash.css | 4 +- app/assets/stylesheets/components/form.css | 14 +- app/assets/stylesheets/components/input.css | 8 +- app/assets/stylesheets/components/list.css | 14 +- app/assets/stylesheets/components/nav.css | 2 +- app/assets/stylesheets/components/player.css | 8 +- app/assets/stylesheets/components/search.css | 2 +- app/assets/stylesheets/components/tab.css | 22 ++- app/assets/stylesheets/components/table.css | 2 +- app/assets/stylesheets/elements/content.css | 14 +- app/assets/stylesheets/elements/page.css | 2 +- app/assets/stylesheets/objects/grid.css | 8 +- app/assets/stylesheets/settings/theme.css | 4 +- app/assets/stylesheets/settings/variables.css | 27 +-- app/assets/stylesheets/utilities/border.css | 12 +- app/assets/stylesheets/utilities/spacing.css | 176 +++++++++--------- app/assets/stylesheets/utilities/text.css | 16 +- app/views/albums/_album.html.erb | 2 +- app/views/albums/_filters.html.erb | 10 +- app/views/albums/index.html.erb | 8 +- app/views/albums/show.html.erb | 8 +- app/views/artists/_album.html.erb | 2 +- app/views/artists/_albums.html.erb | 2 +- app/views/artists/_artist.html.erb | 2 +- app/views/artists/index.html.erb | 8 +- app/views/artists/show.html.erb | 6 +- .../current_playlist/songs/_song.html.erb | 8 +- .../current_playlist/songs/index.html.erb | 2 +- app/views/dialog/playlists/index.html.erb | 2 +- app/views/errors/forbidden.html.erb | 2 +- .../errors/internal_server_error.html.erb | 2 +- app/views/errors/not_found.html.erb | 2 +- .../errors/unprocessable_entity.html.erb | 2 +- app/views/errors/unsupported_browser.html.erb | 2 +- .../favorite_playlist/songs/index.html.erb | 4 +- app/views/home/index.html.erb | 6 +- app/views/layouts/application.html.erb | 7 +- app/views/layouts/plain.html.erb | 4 +- app/views/layouts/playlist.html.erb | 2 +- app/views/libraries/show.html.erb | 16 +- app/views/playlists/_playlist.html.erb | 2 +- app/views/playlists/index.html.erb | 8 +- app/views/playlists/songs/_list.html.erb | 2 +- app/views/playlists/songs/_song.html.erb | 10 +- app/views/playlists/songs/index.html.erb | 4 +- app/views/search/albums/index.html.erb | 4 +- app/views/search/artists/index.html.erb | 4 +- app/views/search/index.html.erb | 14 +- app/views/search/playlists/index.html.erb | 2 +- app/views/settings/_form.html.erb | 2 +- app/views/settings/show.html.erb | 2 +- app/views/shared/_empty_alert.html.erb | 2 +- app/views/shared/_filter_options.html.erb | 2 +- app/views/shared/_mini_player.html.erb | 8 +- app/views/shared/_nav_bar.html.erb | 2 +- app/views/shared/_player.html.erb | 16 +- app/views/shared/_search_bar.html.erb | 10 - app/views/shared/_sort_select.html.erb | 4 +- app/views/shared/_top_bar.html.erb | 11 ++ app/views/songs/_filters.html.erb | 10 +- app/views/songs/_table.html.erb | 2 +- app/views/songs/index.html.erb | 6 +- app/views/users/index.html.erb | 2 +- 69 files changed, 324 insertions(+), 313 deletions(-) delete mode 100644 app/views/shared/_search_bar.html.erb create mode 100644 app/views/shared/_top_bar.html.erb diff --git a/app/assets/stylesheets/components/action_bar.css b/app/assets/stylesheets/components/action_bar.css index 2b6debdb0..c5a9fcdfa 100644 --- a/app/assets/stylesheets/components/action_bar.css +++ b/app/assets/stylesheets/components/action_bar.css @@ -1,7 +1,7 @@ @layer components { .c-action-bar { - padding: var(--spacing-tiny) var(--spacing-narrow); - border-radius: var(--border-radius-medium); + padding: var(--spacing-1) var(--spacing-2); + border-radius: var(--border-radius-2); background: var(--action-bar-bg-color); } } diff --git a/app/assets/stylesheets/components/badge.css b/app/assets/stylesheets/components/badge.css index e54881b58..3ea5af91e 100644 --- a/app/assets/stylesheets/components/badge.css +++ b/app/assets/stylesheets/components/badge.css @@ -1,10 +1,10 @@ @layer components { .c-badge { display: inline-block; - border-radius: var(--border-radius-large); + border-radius: var(--border-radius-3); background-color: var(--badge-bg-color); color: var(--badge-color); - font-size: var(--font-size-small); + font-size: var(--font-size-1); padding: 2px 13px; font-weight: 500; } diff --git a/app/assets/stylesheets/components/button.css b/app/assets/stylesheets/components/button.css index e5174cd57..fc37257a8 100644 --- a/app/assets/stylesheets/components/button.css +++ b/app/assets/stylesheets/components/button.css @@ -2,11 +2,11 @@ .c-button { text-align: center; display: inline-block; - border-radius: var(--border-radius-medium); + border-radius: var(--border-radius-2); border: none; - padding: var(--spacing-tiny) var(--spacing-narrow); + padding: var(--spacing-1) var(--spacing-2); cursor: pointer; - font-size: var(--font-size-medium); + font-size: var(--font-size-2); &:hover { text-decoration: none; @@ -45,12 +45,12 @@ } .c-button--small { - padding: 2px var(--spacing-tiny); - font-size: var(--font-size-small); + padding: 2px var(--spacing-1); + font-size: var(--font-size-1); } .c-button--outline { - border-radius: var(--border-radius-large); + border-radius: var(--border-radius-3); color: var(--btn-outline-color); border: 1px solid var(--btn-outline-border-color); background: var(--btn-outline-bg-color); @@ -62,8 +62,8 @@ .c-button--icon { display: inline-flex; - padding: var(--spacing-tiny); - border-radius: var(--border-radius-medium); + padding: var(--spacing-1); + border-radius: var(--border-radius-2); color: currentcolor; &:hover { diff --git a/app/assets/stylesheets/components/card.css b/app/assets/stylesheets/components/card.css index 7a6dbf273..798fb8433 100644 --- a/app/assets/stylesheets/components/card.css +++ b/app/assets/stylesheets/components/card.css @@ -5,32 +5,32 @@ .c-card--border { border: 1px solid var(--card-border-color); - border-radius: var(--border-radius-medium); + border-radius: var(--border-radius-2); background-color: var(--card-bg-color); } .c-card--border .c-card__body { - padding: var(--spacing-narrow); + padding: var(--spacing-2); } .c-card__image { display: block; - margin-bottom: var(--spacing-narrow); + margin-bottom: var(--spacing-2); } .c-card__image, .c-card__image img { - border-radius: var(--border-radius-medium); + border-radius: var(--border-radius-2); } .c-card__body__title { - margin-bottom: var(--spacing-narrow); - font-size: var(--font-size-large); + margin-bottom: var(--spacing-2); + font-size: var(--font-size-3); } .c-card__body__text { display: block; - margin-bottom: var(--spacing-tiny); + margin-bottom: var(--spacing-1); } .c-card__body__text:last-child { @@ -41,7 +41,7 @@ display: flex; .c-card__image { - margin-right: var(--spacing-medium); + margin-right: var(--spacing-4); } .c-card__body { @@ -58,7 +58,7 @@ text-align: center; .c-card__image { - margin: 0 0 var(--spacing-small); + margin: 0 0 var(--spacing-3); } .c-card__body { diff --git a/app/assets/stylesheets/components/dialog.css b/app/assets/stylesheets/components/dialog.css index 4c863e188..ad6123cd9 100644 --- a/app/assets/stylesheets/components/dialog.css +++ b/app/assets/stylesheets/components/dialog.css @@ -4,7 +4,7 @@ margin-top: 100px; background: var(--dialog-bg-color); border: none; - border-radius: var(--border-radius-medium); + border-radius: var(--border-radius-2); width: 100%; max-width: 360px; color: inherit; @@ -15,15 +15,15 @@ } .c-dialog__header { - padding: var(--spacing-narrow) var(--spacing-small); + padding: var(--spacing-2) var(--spacing-3); background: var(--dialog-header-bg-color); color: var(--dialog-header-color); - border-top-left-radius: var(--border-radius-medium); - border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-2); + border-top-right-radius: var(--border-radius-2); } .c-dialog__content { - padding: var(--spacing-narrow) var(--spacing-small); + padding: var(--spacing-2) var(--spacing-3); overflow-y: auto; min-height: 50px; max-height: calc(100vh - 300px); diff --git a/app/assets/stylesheets/components/dropdown.css b/app/assets/stylesheets/components/dropdown.css index c73b96e63..c9779b450 100644 --- a/app/assets/stylesheets/components/dropdown.css +++ b/app/assets/stylesheets/components/dropdown.css @@ -36,7 +36,7 @@ z-index: var(--z-dropdown); min-width: 100px; background: var(--dropdown-bg-color); - border-radius: var(--border-radius-medium); + border-radius: var(--border-radius-2); color: var(--dropdown-color); box-shadow: 0 1px 6px var(--dropdown-shadow-color); max-height: 300px; @@ -54,7 +54,7 @@ .c-dropdown__item { display: block; - padding: var(--spacing-narrow); + padding: var(--spacing-2); white-space: nowrap; } @@ -74,15 +74,15 @@ .c-dropdown__item:first-child, form.c-dropdown__item:first-child input[type="submit"], form.c-dropdown__item:first-child button[type="submit"] { - border-top-left-radius: var(--border-radius-medium); - border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-2); + border-top-right-radius: var(--border-radius-2); } .c-dropdown__item:last-child, form.c-dropdown__item:last-child input[type="submit"], form.c-dropdown__item:last-child button[type="submit"] { - border-bottom-left-radius: var(--border-radius-medium); - border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-2); + border-bottom-right-radius: var(--border-radius-2); } a.c-dropdown__item:hover, diff --git a/app/assets/stylesheets/components/flash.css b/app/assets/stylesheets/components/flash.css index f4f097a85..460030488 100644 --- a/app/assets/stylesheets/components/flash.css +++ b/app/assets/stylesheets/components/flash.css @@ -14,9 +14,9 @@ } .c-flash__body { - padding: var(--spacing-tiny); + padding: var(--spacing-1); text-align: center; - border-radius: var(--border-radius-medium); + border-radius: var(--border-radius-2); } .c-flash__body--alert { diff --git a/app/assets/stylesheets/components/form.css b/app/assets/stylesheets/components/form.css index 9defeb1c4..2199d0444 100644 --- a/app/assets/stylesheets/components/form.css +++ b/app/assets/stylesheets/components/form.css @@ -1,10 +1,10 @@ @layer components { .c-form { - padding-bottom: var(--spacing-medium); + padding-bottom: var(--spacing-4); } .c-form__field { - margin-top: var(--spacing-small); + margin-top: var(--spacing-3); } .c-form__field--inline { @@ -13,12 +13,12 @@ } .c-form__field--submit { - margin-top: var(--spacing-medium); + margin-top: var(--spacing-4); } .c-form__field label { display: block; - margin-bottom: var(--spacing-narrow); + margin-bottom: var(--spacing-2); } .c-form__field label[disabled] { @@ -27,7 +27,7 @@ .c-form__field--inline label { margin-bottom: 0; - margin-right: var(--spacing-tiny); + margin-right: var(--spacing-1); } .c-form__field > label { @@ -37,11 +37,11 @@ .c-form__radio { display: inline-flex; align-items: center; - margin-right: var(--spacing-narrow); + margin-right: var(--spacing-2); } .c-form__radio label { margin-bottom: 0; - margin-left: var(--spacing-tiny); + margin-left: var(--spacing-1); } } diff --git a/app/assets/stylesheets/components/input.css b/app/assets/stylesheets/components/input.css index e8868069d..cbf52121c 100644 --- a/app/assets/stylesheets/components/input.css +++ b/app/assets/stylesheets/components/input.css @@ -4,8 +4,8 @@ background: var(--input-bg-color); border: none; color: var(--input-color); - padding: var(--spacing-tiny); - border-radius: var(--border-radius-medium); + padding: var(--spacing-1); + border-radius: var(--border-radius-2); filter: none; } @@ -13,8 +13,8 @@ display: flex; align-items: center; background: var(--input-bg-color); - border-radius: var(--border-radius-medium); - padding: 0 var(--spacing-tiny); + border-radius: var(--border-radius-2); + padding: 0 var(--spacing-1); } .c-input-group input { diff --git a/app/assets/stylesheets/components/list.css b/app/assets/stylesheets/components/list.css index 044344d5a..21c6185fb 100644 --- a/app/assets/stylesheets/components/list.css +++ b/app/assets/stylesheets/components/list.css @@ -7,26 +7,26 @@ .c-list--grouped { background-color: var(--list-grouped-bg-color); - padding: 0 var(--spacing-narrow); - border-radius: var(--border-radius-large); + padding: 0 var(--spacing-2); + border-radius: var(--border-radius-3); } .c-list__item { width: 100%; - padding: var(--spacing-narrow) 0; + padding: var(--spacing-2) 0; text-decoration: none; border-bottom: 1px solid var(--list-border-color); } .c-list__item--divider { - margin-top: var(--spacing-small); + margin-top: var(--spacing-3); font-weight: bold; text-transform: uppercase; } .c-list__item__subtext { display: inline-block; - margin-top: var(--spacing-tiny); + margin-top: var(--spacing-1); color: var(--list-subtext-color); } @@ -35,7 +35,7 @@ } .c-list--grouped .c-list__item { - padding: var(--spacing-small) 0; + padding: var(--spacing-3) 0; } .c-list__item:last-child { @@ -58,6 +58,6 @@ .c-list .c-list__item.is-dragging-over { border: 2px dashed var(--list-active-color); - border-radius: var(--border-radius-medium); + border-radius: var(--border-radius-2); } } diff --git a/app/assets/stylesheets/components/nav.css b/app/assets/stylesheets/components/nav.css index 2336f2ad5..33ab64612 100644 --- a/app/assets/stylesheets/components/nav.css +++ b/app/assets/stylesheets/components/nav.css @@ -1,6 +1,6 @@ @layer components { .c-nav { - padding: var(--spacing-small) var(--spacing-small) 0; + padding: var(--spacing-3) var(--spacing-5); box-shadow: var(--nav-shadow); z-index: var(--z-nav); } diff --git a/app/assets/stylesheets/components/player.css b/app/assets/stylesheets/components/player.css index 0d5885ded..5ccb0226b 100644 --- a/app/assets/stylesheets/components/player.css +++ b/app/assets/stylesheets/components/player.css @@ -6,18 +6,18 @@ .c-player__control { background: var(--player-bg-color); position: relative; - padding: 0 var(--spacing-wide); + padding: 0 var(--spacing-6); color: var(--player-control-color); } .c-player__control__main { color: var(--player-control-main-color); - padding: var(--spacing-small) 0; + padding: var(--spacing-3) 0; border-bottom: 1px solid var(--player-control-border-color); } .c-player__control__secondary { - padding: var(--spacing-tiny) 0; + padding: var(--spacing-1) 0; } .c-player__header { @@ -81,7 +81,7 @@ width: 100%; cursor: pointer; outline: none; - border-radius: var(--border-radius-large); + border-radius: var(--border-radius-3); height: 5px; background: linear-gradient(to right, var(--player-volume-color) var(--progress), var(--player-volume-bg-color) var(--progress)); } diff --git a/app/assets/stylesheets/components/search.css b/app/assets/stylesheets/components/search.css index 7abc484a9..cbf0d749d 100644 --- a/app/assets/stylesheets/components/search.css +++ b/app/assets/stylesheets/components/search.css @@ -2,7 +2,7 @@ .c-search { max-width: 380px; width: 100%; - margin: 0 var(--spacing-small); + margin: 0 var(--spacing-3); } .c-search .c-loader { diff --git a/app/assets/stylesheets/components/tab.css b/app/assets/stylesheets/components/tab.css index 220bd0603..a1138570c 100644 --- a/app/assets/stylesheets/components/tab.css +++ b/app/assets/stylesheets/components/tab.css @@ -1,29 +1,37 @@ @layer components { .c-tab { display: flex; - justify-content: center; list-style: none; margin: 0; padding: 0; } .c-tab__item { - padding-bottom: var(--spacing-narrow); - border-bottom: 2px solid transparent; - margin: 0 var(--spacing-large); + margin-right: var(--spacing-4); + border-radius: var(--border-radius-4); + + &:last-child { + margin-right: 0; + } + + &:hover { + background-color: var(--tab-hover-bg-color); + } } + .c-tab__item a { + display: inline-block; + padding: var(--spacing-1) var(--spacing-2); color: var(--tab-color); text-decoration: none; } - .c-tab__item.is-active a, - .c-tab__item a:hover { + .c-tab__item.is-active a { color: var(--tab-active-color); } .c-tab__item.is-active { - border-color: var(--tab-active-color); + background-color: var(--tab-active-bg-color); } } diff --git a/app/assets/stylesheets/components/table.css b/app/assets/stylesheets/components/table.css index 884d5a202..5e0ef54be 100644 --- a/app/assets/stylesheets/components/table.css +++ b/app/assets/stylesheets/components/table.css @@ -36,7 +36,7 @@ .c-table [role="cell"] { display: inline-flex; align-items: center; - padding: var(--spacing-narrow); + padding: var(--spacing-2); text-align: left; color: var(--table-color); } diff --git a/app/assets/stylesheets/elements/content.css b/app/assets/stylesheets/elements/content.css index c9b9c2ae4..14fb20cac 100644 --- a/app/assets/stylesheets/elements/content.css +++ b/app/assets/stylesheets/elements/content.css @@ -1,19 +1,19 @@ @layer elements { h1 { - font-size: var(--font-size-wide); - margin-bottom: var(--spacing-wide); + font-size: var(--font-size-4); + margin-bottom: var(--spacing-6); } h2, h3 { - font-size: var(--font-size-large); - margin-bottom: var(--spacing-medium); + font-size: var(--font-size-3); + margin-bottom: var(--spacing-4); } h4, h5, h6 { - font-size: var(--font-size-medium); + font-size: var(--font-size-2); } h1, @@ -26,7 +26,7 @@ } p { - font-size: var(--font-size-medium); + font-size: var(--font-size-2); color: var(--text-secondary-color); } @@ -45,7 +45,7 @@ hr { border: 0; - margin: var(--spacing-large) 0; + margin: var(--spacing-5) 0; border-top: 1px solid var(--hr-color); } } diff --git a/app/assets/stylesheets/elements/page.css b/app/assets/stylesheets/elements/page.css index b7379e75f..0d790c1ad 100644 --- a/app/assets/stylesheets/elements/page.css +++ b/app/assets/stylesheets/elements/page.css @@ -3,6 +3,6 @@ font-family: var(--font-sans-serif); background-color: var(--body-bg-color); color: var(--text-secondary-color); - font-size: var(--font-size-medium); + font-size: var(--font-size-2); } } diff --git a/app/assets/stylesheets/objects/grid.css b/app/assets/stylesheets/objects/grid.css index 8bffa3b35..64e38582b 100644 --- a/app/assets/stylesheets/objects/grid.css +++ b/app/assets/stylesheets/objects/grid.css @@ -11,12 +11,12 @@ } .o-grid--shelf { - gap: var(--spacing-medium); + gap: var(--spacing-4); grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); } .o-grid--list { - gap: var(--spacing-small); + gap: var(--spacing-3); grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); } @@ -26,13 +26,13 @@ @media (max-width: 560px) { .o-grid--shelf { - gap: var(--spacing-small); + gap: var(--spacing-3); } } @media (max-width: 375px) { .o-grid--shelf { - gap: var(--spacing-narrow); + gap: var(--spacing-2); grid-template-columns: repeat(2, 1fr); } } diff --git a/app/assets/stylesheets/settings/theme.css b/app/assets/stylesheets/settings/theme.css index 50b8cfe20..cb8df0875 100644 --- a/app/assets/stylesheets/settings/theme.css +++ b/app/assets/stylesheets/settings/theme.css @@ -41,7 +41,9 @@ /* Tab */ --tab-color: light-dark(var(--color-grey-900), var(--color-white)); - --tab-active-color: var(--primary-color); + --tab-active-bg-color: var(--primary-color); + --tab-active-color: var(--color-white); + --tab-hover-bg-color: light-dark(var(--color-grey-200), var(--color-grey-700)); /* List */ --list-border-color: light-dark(var(--color-grey-200), var(--color-grey-800)); diff --git a/app/assets/stylesheets/settings/variables.css b/app/assets/stylesheets/settings/variables.css index 950d62445..15cdec2a1 100644 --- a/app/assets/stylesheets/settings/variables.css +++ b/app/assets/stylesheets/settings/variables.css @@ -5,23 +5,24 @@ --font-monospace: "Menlo", "Monaco", "Consolas", "Courier New", monospace; /* Font sizes */ - --font-size-small: 12px; - --font-size-medium: 14px; - --font-size-large: 16px; - --font-size-wide: 20px; + --font-size-1: 12px; + --font-size-2: 14px; + --font-size-3: 16px; + --font-size-4: 20px; /* Spacing */ - --spacing-tiny: 6px; - --spacing-narrow: 12px; - --spacing-small: 18px; - --spacing-medium: 24px; - --spacing-large: 36px; - --spacing-wide: 48px; + --spacing-1: 6px; + --spacing-2: 12px; + --spacing-3: 18px; + --spacing-4: 24px; + --spacing-5: 36px; + --spacing-6: 48px; /* Border radius */ - --border-radius-small: 2px; - --border-radius-medium: 4px; - --border-radius-large: 8px; + --border-radius-1: 2px; + --border-radius-2: 4px; + --border-radius-3: 8px; + --border-radius-4: 16px; /* Z-indexes */ --z-base: 0; diff --git a/app/assets/stylesheets/utilities/border.css b/app/assets/stylesheets/utilities/border.css index 161510062..7d2a7e6f8 100644 --- a/app/assets/stylesheets/utilities/border.css +++ b/app/assets/stylesheets/utilities/border.css @@ -7,15 +7,15 @@ border: none; } - .u-border-radius-small { - border-radius: var(--border-radius-small); + .u-border-radius-1 { + border-radius: var(--border-radius-1); } - .u-border-radius-medium { - border-radius: var(--border-radius-medium); + .u-border-radius-2 { + border-radius: var(--border-radius-2); } - .u-border-radius-large { - border-radius: var(--border-radius-large); + .u-border-radius-3 { + border-radius: var(--border-radius-3); } } diff --git a/app/assets/stylesheets/utilities/spacing.css b/app/assets/stylesheets/utilities/spacing.css index 1bcf89bed..ed6c3b7de 100644 --- a/app/assets/stylesheets/utilities/spacing.css +++ b/app/assets/stylesheets/utilities/spacing.css @@ -1,111 +1,111 @@ @layer utilities { /* Margin — tiny (6px) */ - .u-m-tiny { margin: var(--spacing-tiny); } - .u-mt-tiny { margin-top: var(--spacing-tiny); } - .u-mb-tiny { margin-bottom: var(--spacing-tiny); } - .u-ml-tiny { margin-left: var(--spacing-tiny); } - .u-mr-tiny { margin-right: var(--spacing-tiny); } - .u-mx-tiny { margin-left: var(--spacing-tiny); margin-right: var(--spacing-tiny); } - .u-my-tiny { margin-top: var(--spacing-tiny); margin-bottom: var(--spacing-tiny); } + .u-m-1 { margin: var(--spacing-1); } + .u-mt-1 { margin-top: var(--spacing-1); } + .u-mb-1 { margin-bottom: var(--spacing-1); } + .u-ml-1 { margin-left: var(--spacing-1); } + .u-mr-1 { margin-right: var(--spacing-1); } + .u-mx-1 { margin-left: var(--spacing-1); margin-right: var(--spacing-1); } + .u-my-1 { margin-top: var(--spacing-1); margin-bottom: var(--spacing-1); } /* Margin — narrow (12px) */ - .u-m-narrow { margin: var(--spacing-narrow); } - .u-mt-narrow { margin-top: var(--spacing-narrow); } - .u-mb-narrow { margin-bottom: var(--spacing-narrow); } - .u-ml-narrow { margin-left: var(--spacing-narrow); } - .u-mr-narrow { margin-right: var(--spacing-narrow); } - .u-mx-narrow { margin-left: var(--spacing-narrow); margin-right: var(--spacing-narrow); } - .u-my-narrow { margin-top: var(--spacing-narrow); margin-bottom: var(--spacing-narrow); } + .u-m-2 { margin: var(--spacing-2); } + .u-mt-2 { margin-top: var(--spacing-2); } + .u-mb-2 { margin-bottom: var(--spacing-2); } + .u-ml-2 { margin-left: var(--spacing-2); } + .u-mr-2 { margin-right: var(--spacing-2); } + .u-mx-2 { margin-left: var(--spacing-2); margin-right: var(--spacing-2); } + .u-my-2 { margin-top: var(--spacing-2); margin-bottom: var(--spacing-2); } /* Margin — small (18px) */ - .u-m-small { margin: var(--spacing-small); } - .u-mt-small { margin-top: var(--spacing-small); } - .u-mb-small { margin-bottom: var(--spacing-small); } - .u-ml-small { margin-left: var(--spacing-small); } - .u-mr-small { margin-right: var(--spacing-small); } - .u-mx-small { margin-left: var(--spacing-small); margin-right: var(--spacing-small); } - .u-my-small { margin-top: var(--spacing-small); margin-bottom: var(--spacing-small); } + .u-m-3 { margin: var(--spacing-3); } + .u-mt-3 { margin-top: var(--spacing-3); } + .u-mb-3 { margin-bottom: var(--spacing-3); } + .u-ml-3 { margin-left: var(--spacing-3); } + .u-mr-3 { margin-right: var(--spacing-3); } + .u-mx-3 { margin-left: var(--spacing-3); margin-right: var(--spacing-3); } + .u-my-3 { margin-top: var(--spacing-3); margin-bottom: var(--spacing-3); } /* Margin — medium (24px) */ - .u-m-medium { margin: var(--spacing-medium); } - .u-mt-medium { margin-top: var(--spacing-medium); } - .u-mb-medium { margin-bottom: var(--spacing-medium); } - .u-ml-medium { margin-left: var(--spacing-medium); } - .u-mr-medium { margin-right: var(--spacing-medium); } - .u-mx-medium { margin-left: var(--spacing-medium); margin-right: var(--spacing-medium); } - .u-my-medium { margin-top: var(--spacing-medium); margin-bottom: var(--spacing-medium); } + .u-m-4 { margin: var(--spacing-4); } + .u-mt-4 { margin-top: var(--spacing-4); } + .u-mb-4 { margin-bottom: var(--spacing-4); } + .u-ml-4 { margin-left: var(--spacing-4); } + .u-mr-4 { margin-right: var(--spacing-4); } + .u-mx-4 { margin-left: var(--spacing-4); margin-right: var(--spacing-4); } + .u-my-4 { margin-top: var(--spacing-4); margin-bottom: var(--spacing-4); } /* Margin — large (36px) */ - .u-m-large { margin: var(--spacing-large); } - .u-mt-large { margin-top: var(--spacing-large); } - .u-mb-large { margin-bottom: var(--spacing-large); } - .u-ml-large { margin-left: var(--spacing-large); } - .u-mr-large { margin-right: var(--spacing-large); } - .u-mx-large { margin-left: var(--spacing-large); margin-right: var(--spacing-large); } - .u-my-large { margin-top: var(--spacing-large); margin-bottom: var(--spacing-large); } + .u-m-5 { margin: var(--spacing-5); } + .u-mt-5 { margin-top: var(--spacing-5); } + .u-mb-5 { margin-bottom: var(--spacing-5); } + .u-ml-5 { margin-left: var(--spacing-5); } + .u-mr-5 { margin-right: var(--spacing-5); } + .u-mx-5 { margin-left: var(--spacing-5); margin-right: var(--spacing-5); } + .u-my-5 { margin-top: var(--spacing-5); margin-bottom: var(--spacing-5); } /* Margin — wide (48px) */ - .u-m-wide { margin: var(--spacing-wide); } - .u-mt-wide { margin-top: var(--spacing-wide); } - .u-mb-wide { margin-bottom: var(--spacing-wide); } - .u-ml-wide { margin-left: var(--spacing-wide); } - .u-mr-wide { margin-right: var(--spacing-wide); } - .u-mx-wide { margin-left: var(--spacing-wide); margin-right: var(--spacing-wide); } - .u-my-wide { margin-top: var(--spacing-wide); margin-bottom: var(--spacing-wide); } + .u-m-6 { margin: var(--spacing-6); } + .u-mt-6 { margin-top: var(--spacing-6); } + .u-mb-6 { margin-bottom: var(--spacing-6); } + .u-ml-6 { margin-left: var(--spacing-6); } + .u-mr-6 { margin-right: var(--spacing-6); } + .u-mx-6 { margin-left: var(--spacing-6); margin-right: var(--spacing-6); } + .u-my-6 { margin-top: var(--spacing-6); margin-bottom: var(--spacing-6); } /* Padding — tiny */ - .u-p-tiny { padding: var(--spacing-tiny); } - .u-pt-tiny { padding-top: var(--spacing-tiny); } - .u-pb-tiny { padding-bottom: var(--spacing-tiny); } - .u-pl-tiny { padding-left: var(--spacing-tiny); } - .u-pr-tiny { padding-right: var(--spacing-tiny); } - .u-px-tiny { padding-left: var(--spacing-tiny); padding-right: var(--spacing-tiny); } - .u-py-tiny { padding-top: var(--spacing-tiny); padding-bottom: var(--spacing-tiny); } + .u-p-1 { padding: var(--spacing-1); } + .u-pt-1 { padding-top: var(--spacing-1); } + .u-pb-1 { padding-bottom: var(--spacing-1); } + .u-pl-1 { padding-left: var(--spacing-1); } + .u-pr-1 { padding-right: var(--spacing-1); } + .u-px-1 { padding-left: var(--spacing-1); padding-right: var(--spacing-1); } + .u-py-1 { padding-top: var(--spacing-1); padding-bottom: var(--spacing-1); } /* Padding — narrow */ - .u-p-narrow { padding: var(--spacing-narrow); } - .u-pt-narrow { padding-top: var(--spacing-narrow); } - .u-pb-narrow { padding-bottom: var(--spacing-narrow); } - .u-pl-narrow { padding-left: var(--spacing-narrow); } - .u-pr-narrow { padding-right: var(--spacing-narrow); } - .u-px-narrow { padding-left: var(--spacing-narrow); padding-right: var(--spacing-narrow); } - .u-py-narrow { padding-top: var(--spacing-narrow); padding-bottom: var(--spacing-narrow); } + .u-p-2 { padding: var(--spacing-2); } + .u-pt-2 { padding-top: var(--spacing-2); } + .u-pb-2 { padding-bottom: var(--spacing-2); } + .u-pl-2 { padding-left: var(--spacing-2); } + .u-pr-2 { padding-right: var(--spacing-2); } + .u-px-2 { padding-left: var(--spacing-2); padding-right: var(--spacing-2); } + .u-py-2 { padding-top: var(--spacing-2); padding-bottom: var(--spacing-2); } /* Padding — small */ - .u-p-small { padding: var(--spacing-small); } - .u-pt-small { padding-top: var(--spacing-small); } - .u-pb-small { padding-bottom: var(--spacing-small); } - .u-pl-small { padding-left: var(--spacing-small); } - .u-pr-small { padding-right: var(--spacing-small); } - .u-px-small { padding-left: var(--spacing-small); padding-right: var(--spacing-small); } - .u-py-small { padding-top: var(--spacing-small); padding-bottom: var(--spacing-small); } + .u-p-3 { padding: var(--spacing-3); } + .u-pt-3 { padding-top: var(--spacing-3); } + .u-pb-3 { padding-bottom: var(--spacing-3); } + .u-pl-3 { padding-left: var(--spacing-3); } + .u-pr-3 { padding-right: var(--spacing-3); } + .u-px-3 { padding-left: var(--spacing-3); padding-right: var(--spacing-3); } + .u-py-3 { padding-top: var(--spacing-3); padding-bottom: var(--spacing-3); } /* Padding — medium */ - .u-p-medium { padding: var(--spacing-medium); } - .u-pt-medium { padding-top: var(--spacing-medium); } - .u-pb-medium { padding-bottom: var(--spacing-medium); } - .u-pl-medium { padding-left: var(--spacing-medium); } - .u-pr-medium { padding-right: var(--spacing-medium); } - .u-px-medium { padding-left: var(--spacing-medium); padding-right: var(--spacing-medium); } - .u-py-medium { padding-top: var(--spacing-medium); padding-bottom: var(--spacing-medium); } + .u-p-4 { padding: var(--spacing-4); } + .u-pt-4 { padding-top: var(--spacing-4); } + .u-pb-4 { padding-bottom: var(--spacing-4); } + .u-pl-4 { padding-left: var(--spacing-4); } + .u-pr-4 { padding-right: var(--spacing-4); } + .u-px-4 { padding-left: var(--spacing-4); padding-right: var(--spacing-4); } + .u-py-4 { padding-top: var(--spacing-4); padding-bottom: var(--spacing-4); } /* Padding — large */ - .u-p-large { padding: var(--spacing-large); } - .u-pt-large { padding-top: var(--spacing-large); } - .u-pb-large { padding-bottom: var(--spacing-large); } - .u-pl-large { padding-left: var(--spacing-large); } - .u-pr-large { padding-right: var(--spacing-large); } - .u-px-large { padding-left: var(--spacing-large); padding-right: var(--spacing-large); } - .u-py-large { padding-top: var(--spacing-large); padding-bottom: var(--spacing-large); } + .u-p-5 { padding: var(--spacing-5); } + .u-pt-5 { padding-top: var(--spacing-5); } + .u-pb-5 { padding-bottom: var(--spacing-5); } + .u-pl-5 { padding-left: var(--spacing-5); } + .u-pr-5 { padding-right: var(--spacing-5); } + .u-px-5 { padding-left: var(--spacing-5); padding-right: var(--spacing-5); } + .u-py-5 { padding-top: var(--spacing-5); padding-bottom: var(--spacing-5); } /* Padding — wide */ - .u-p-wide { padding: var(--spacing-wide); } - .u-pt-wide { padding-top: var(--spacing-wide); } - .u-pb-wide { padding-bottom: var(--spacing-wide); } - .u-pl-wide { padding-left: var(--spacing-wide); } - .u-pr-wide { padding-right: var(--spacing-wide); } - .u-px-wide { padding-left: var(--spacing-wide); padding-right: var(--spacing-wide); } - .u-py-wide { padding-top: var(--spacing-wide); padding-bottom: var(--spacing-wide); } + .u-p-6 { padding: var(--spacing-6); } + .u-pt-6 { padding-top: var(--spacing-6); } + .u-pb-6 { padding-bottom: var(--spacing-6); } + .u-pl-6 { padding-left: var(--spacing-6); } + .u-pr-6 { padding-right: var(--spacing-6); } + .u-px-6 { padding-left: var(--spacing-6); padding-right: var(--spacing-6); } + .u-py-6 { padding-top: var(--spacing-6); padding-bottom: var(--spacing-6); } /* Margin — 0 */ .u-m-0 { margin: 0; } @@ -136,14 +136,14 @@ /* Responsive utilities */ @media (max-width: 930px) { - .u-p-small\@small { - padding: var(--spacing-small); + .u-p-3\@small { + padding: var(--spacing-3); } } @media (max-width: 375px) { - .u-p-narrow\@extra-narrow { - padding: var(--spacing-narrow); + .u-p-2\@extra-narrow { + padding: var(--spacing-2); } } } diff --git a/app/assets/stylesheets/utilities/text.css b/app/assets/stylesheets/utilities/text.css index e88023c99..2ec0b05e2 100644 --- a/app/assets/stylesheets/utilities/text.css +++ b/app/assets/stylesheets/utilities/text.css @@ -44,19 +44,19 @@ overflow: hidden; } - .u-text-size-small { - font-size: var(--font-size-small); + .u-text-size-1 { + font-size: var(--font-size-1); } - .u-text-size-medium { - font-size: var(--font-size-medium); + .u-text-size-2 { + font-size: var(--font-size-2); } - .u-text-size-large { - font-size: var(--font-size-large); + .u-text-size-3 { + font-size: var(--font-size-3); } - .u-text-size-wide { - font-size: var(--font-size-wide); + .u-text-size-4 { + font-size: var(--font-size-4); } } diff --git a/app/views/albums/_album.html.erb b/app/views/albums/_album.html.erb index da5fab522..549a709ec 100644 --- a/app/views/albums/_album.html.erb +++ b/app/views/albums/_album.html.erb @@ -1,4 +1,4 @@ -
+
<%= link_to album_path(album), class: "c-card__image" do %> <%= cover_image_tag album, class: "u-image-fluid" %> <% end %> diff --git a/app/views/albums/_filters.html.erb b/app/views/albums/_filters.html.erb index 66a5a5731..e33a70b3c 100644 --- a/app/views/albums/_filters.html.erb +++ b/app/views/albums/_filters.html.erb @@ -1,5 +1,5 @@ <% if filter_sort_presenter.has_filter? %> - <%= link_to albums_path, class: "c-button c-button--outline c-button--small u-mr-small", data: { "turbo-action" => ("replace" if native_app?) } do %> + <%= link_to albums_path, class: "c-button c-button--outline c-button--small u-mr-3", data: { "turbo-action" => ("replace" if native_app?) } do %> <%= icon_tag "close" %> <%= t("label.clear_filters") %> @@ -7,7 +7,7 @@ <% end %> <% end %> -
+
<%= t("field.genre") %> @@ -16,14 +16,14 @@
<%= turbo_frame_tag "turbo-genre-filter", src: albums_filter_genres_path(**filter_sort_presenter.params), loading: "lazy" do %> -
+
<%= loader_tag size: "small" %>
<% end %>
-
+
<%= t("field.year") %> @@ -32,7 +32,7 @@
<%= turbo_frame_tag "turbo-year-filter", src: albums_filter_years_path(**filter_sort_presenter.params), loading: "lazy" do %> -
+
<%= loader_tag size: "small" %>
<% end %> diff --git a/app/views/albums/index.html.erb b/app/views/albums/index.html.erb index 9803be871..19a8a3ec2 100644 --- a/app/views/albums/index.html.erb +++ b/app/views/albums/index.html.erb @@ -3,9 +3,9 @@ <% filter_sort_presenter = FilterSortPresenter.new(params) %>
-
+
<% unless native_app? %> -

<%= t("label.albums") %>

+

<%= t("label.albums") %>

<% end %>
<%= render partial: "albums/filters", locals: { filter_sort_presenter: filter_sort_presenter } %> @@ -13,7 +13,7 @@
<% if @albums.empty? %> -
+
<%= empty_alert_tag has_icon: true, has_overlay: false %>
<% else %> @@ -21,7 +21,7 @@ <%= render partial: "albums/album", collection: @albums %> <% if @pagy.next %> - <%= turbo_frame_tag "turbo-albums-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "turbo-albums-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
<%= loader_tag %>
diff --git a/app/views/albums/show.html.erb b/app/views/albums/show.html.erb index 5864d6da3..26fd5e4f1 100644 --- a/app/views/albums/show.html.erb +++ b/app/views/albums/show.html.erb @@ -1,7 +1,7 @@ <% page_title_tag @album.name %>
-
+
<%= cover_image_tag @album, class: "c-card__image u-image-medium" %>

<%= @album.name %>

@@ -11,7 +11,7 @@ , <%= format_duration(@album.songs.sum(:duration)) %>
-
+
<%= button_to( t("button.play"), current_playlist_album_path(@album, should_play: true), @@ -27,7 +27,7 @@ } ) %> <% if is_admin? %> - <%= link_to t("label.edit"), edit_dialog_album_path(@album), data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--secondary u-ml-tiny" %> + <%= link_to t("label.edit"), edit_dialog_album_path(@album), data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--secondary u-ml-1" %> <% end %>
@@ -65,7 +65,7 @@ <% end %> <% end %>
-
<%= format_duration(song.duration) %>
+
<%= format_duration(song.duration) %>
<% end %> diff --git a/app/views/artists/_album.html.erb b/app/views/artists/_album.html.erb index f95a33881..f5040f064 100644 --- a/app/views/artists/_album.html.erb +++ b/app/views/artists/_album.html.erb @@ -1,4 +1,4 @@ -
+
<%= link_to album_path(album), class: "c-card__image" do %> <%= cover_image_tag album, class: "u-image-fluid" %> <% end %> diff --git a/app/views/artists/_albums.html.erb b/app/views/artists/_albums.html.erb index a08926d57..cd8d9ff28 100644 --- a/app/views/artists/_albums.html.erb +++ b/app/views/artists/_albums.html.erb @@ -1,6 +1,6 @@ <% if albums.present? %>

<%= title %>

-
+
<%= render partial: "artists/album", collection: albums %>
<% end %> diff --git a/app/views/artists/_artist.html.erb b/app/views/artists/_artist.html.erb index f00142524..db3f71744 100644 --- a/app/views/artists/_artist.html.erb +++ b/app/views/artists/_artist.html.erb @@ -1,4 +1,4 @@ -
+
<%= link_to artist_path(artist), class: "c-card__image" do %> <%= cover_image_tag artist, class: "u-image-fluid" %> <% end %> diff --git a/app/views/artists/index.html.erb b/app/views/artists/index.html.erb index 1542a5bba..82de99eac 100644 --- a/app/views/artists/index.html.erb +++ b/app/views/artists/index.html.erb @@ -1,16 +1,16 @@ <% page_title_tag t("label.artists") %>
-
+
<% unless native_app? %> -

<%= t("label.artists") %>

+

<%= t("label.artists") %>

<% end %>
<%= render partial: "shared/sort_select", locals: { option: @sort_option, sort_controller: controller_name, filter_sort_presenter: FilterSortPresenter.new(params) } %>
<% if @artists.empty? %> -
+
<%= empty_alert_tag has_icon: true, has_overlay: false %>
<% else %> @@ -18,7 +18,7 @@ <%= render partial: "artists/artist", collection: @artists %> <% if @pagy.next %> - <%= turbo_frame_tag "turbo-artists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "turbo-artists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
<%= loader_tag %>
diff --git a/app/views/artists/show.html.erb b/app/views/artists/show.html.erb index 77158f060..600262f5d 100644 --- a/app/views/artists/show.html.erb +++ b/app/views/artists/show.html.erb @@ -1,7 +1,7 @@ <% page_title_tag @artist.name %>
-
+
<%= cover_image_tag @artist, class: "c-card__image u-image-medium" %>

<%= @artist.name %>

@@ -11,8 +11,8 @@ <%= @artist.songs.size %> <%= t("label.songs") %>
<% if is_admin? %> -
- <%= link_to t("label.edit"), edit_dialog_artist_path(@artist), data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--secondary u-mt-large" %> +
+ <%= link_to t("label.edit"), edit_dialog_artist_path(@artist), data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--secondary u-mt-5" %>
<% end %>
diff --git a/app/views/current_playlist/songs/_song.html.erb b/app/views/current_playlist/songs/_song.html.erb index b62898333..39c6eed5d 100644 --- a/app/views/current_playlist/songs/_song.html.erb +++ b/app/views/current_playlist/songs/_song.html.erb @@ -6,18 +6,18 @@ data-should-play='<%= local_assigns[:should_play] ? should_play : false %>' draggable='true'> -
+
<% unless mobile? %> - + <% end %> diff --git a/app/views/current_playlist/songs/index.html.erb b/app/views/current_playlist/songs/index.html.erb index 848244c83..410f50b62 100644 --- a/app/views/current_playlist/songs/index.html.erb +++ b/app/views/current_playlist/songs/index.html.erb @@ -16,7 +16,7 @@
-
    +
      <% @songs.each do |song| %> <%= render partial: "current_playlist/songs/song", locals: { song: song, playlist: @playlist, should_play: @should_play_song_id == song.id } %> <% end %> diff --git a/app/views/dialog/playlists/index.html.erb b/app/views/dialog/playlists/index.html.erb index ed777d230..1d4397a5a 100644 --- a/app/views/dialog/playlists/index.html.erb +++ b/app/views/dialog/playlists/index.html.erb @@ -8,7 +8,7 @@ <%= render partial: "dialog/playlists/playlist", collection: @playlists %> <% if @pagy.next %> - <%= turbo_frame_tag "turbo-dialog-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "turbo-dialog-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
      <%= loader_tag %>
      diff --git a/app/views/errors/forbidden.html.erb b/app/views/errors/forbidden.html.erb index 526edf89a..2b8e8b674 100644 --- a/app/views/errors/forbidden.html.erb +++ b/app/views/errors/forbidden.html.erb @@ -1,4 +1,4 @@

      403

      -

      <%= t("error.forbidden") %>

      +

      <%= t("error.forbidden") %>

      diff --git a/app/views/errors/internal_server_error.html.erb b/app/views/errors/internal_server_error.html.erb index 6fe2e0c0c..b0b402537 100644 --- a/app/views/errors/internal_server_error.html.erb +++ b/app/views/errors/internal_server_error.html.erb @@ -1,4 +1,4 @@

      500

      -

      <%= t("error.internal_server_error") %>

      +

      <%= t("error.internal_server_error") %>

      diff --git a/app/views/errors/not_found.html.erb b/app/views/errors/not_found.html.erb index 33398b27a..d5f533955 100644 --- a/app/views/errors/not_found.html.erb +++ b/app/views/errors/not_found.html.erb @@ -1,4 +1,4 @@

      404

      -

      <%= t("error.not_found") %>

      +

      <%= t("error.not_found") %>

      diff --git a/app/views/errors/unprocessable_entity.html.erb b/app/views/errors/unprocessable_entity.html.erb index 335e451f0..9ea2b79dd 100644 --- a/app/views/errors/unprocessable_entity.html.erb +++ b/app/views/errors/unprocessable_entity.html.erb @@ -1,4 +1,4 @@

      422

      -

      <%= t("error.unprocessable_entity") %>

      +

      <%= t("error.unprocessable_entity") %>

      diff --git a/app/views/errors/unsupported_browser.html.erb b/app/views/errors/unsupported_browser.html.erb index 6ca383699..3456b5c76 100644 --- a/app/views/errors/unsupported_browser.html.erb +++ b/app/views/errors/unsupported_browser.html.erb @@ -1,3 +1,3 @@
      -

      <%= t("error.unsupported_browser") %>

      +

      <%= t("error.unsupported_browser") %>

      diff --git a/app/views/favorite_playlist/songs/index.html.erb b/app/views/favorite_playlist/songs/index.html.erb index b2c9c1b52..82af6738d 100644 --- a/app/views/favorite_playlist/songs/index.html.erb +++ b/app/views/favorite_playlist/songs/index.html.erb @@ -1,6 +1,6 @@
      -
      +

      <%= @playlist.name %>

      @@ -9,7 +9,7 @@ , <%= format_duration(@playlist.songs.sum(:duration)) %>
      -
      +
      <% unless @songs.blank? %> <%= button_to( t("button.play"), diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index 61a9ea811..be49daa47 100644 --- a/app/views/home/index.html.erb +++ b/app/views/home/index.html.erb @@ -7,19 +7,19 @@ <% if [@recently_added_albums, @recently_played_albums].any?(&:present?) %> <% if @recently_played_albums.present? %>

      <%= t("label.recently_played") %>

      -
      +
      <%= render partial: "albums/album", collection: @recently_played_albums %>
      <% end %> <% if @recently_added_albums.present? %>

      <%= t("label.recently_added") %>

      -
      +
      <%= render partial: "albums/album", collection: @recently_added_albums %>
      <% end %> <% else %> -
      +
      <%= empty_alert_tag has_icon: true, has_overlay: false %>
      <% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0487d94d7..ca156e4bf 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -8,7 +8,7 @@ <% if native_app? %> <%= render "shared/flash" %> -
      +
      <%= yield %>
      <% else %> @@ -27,10 +27,9 @@
      <%= render "shared/flash" %> - <%= render partial: "shared/search_bar", locals: { current_user: Current.user, query: params[:query] } %> - <%= render partial: "shared/nav_bar", locals: { current_controller: controller_name } %> + <%= render partial: "shared/top_bar", locals: { current_user: Current.user, current_controller: controller_name, query: params[:query] } %>
      -
      +
      <%= yield %>
      diff --git a/app/views/layouts/plain.html.erb b/app/views/layouts/plain.html.erb index 06c1a6b64..68d119f9e 100644 --- a/app/views/layouts/plain.html.erb +++ b/app/views/layouts/plain.html.erb @@ -1,8 +1,8 @@ <% content_for :body do %> <%= render "shared/flash" %>
      -
      -
      +
      +
      <%= yield %> diff --git a/app/views/layouts/playlist.html.erb b/app/views/layouts/playlist.html.erb index 81956a26f..0b29da1b6 100644 --- a/app/views/layouts/playlist.html.erb +++ b/app/views/layouts/playlist.html.erb @@ -1,5 +1,5 @@ <%= turbo_frame_tag "turbo-playlist" do %> -
      +
      <%= yield %>
      <% end %> diff --git a/app/views/libraries/show.html.erb b/app/views/libraries/show.html.erb index eb2bdc2b5..cbe58f946 100644 --- a/app/views/libraries/show.html.erb +++ b/app/views/libraries/show.html.erb @@ -8,8 +8,8 @@
      • <%= link_to albums_path, class: "o-flex o-flex--justify-between" do %> - - <%= icon_tag "album", class: "u-mr-tiny" %> + + <%= icon_tag "album", class: "u-mr-1" %> <%= t("label.albums") %> <%= format_number(@albums_count) %> @@ -17,8 +17,8 @@
      • <%= link_to artists_path, class: "o-flex o-flex--justify-between" do %> - - <%= icon_tag "mic", class: "u-mr-tiny" %> + + <%= icon_tag "mic", class: "u-mr-1" %> <%= t("label.artists") %> <%= format_number(@artists_count) %> @@ -26,8 +26,8 @@
      • <%= link_to playlists_path, class: "o-flex o-flex--justify-between" do %> - - <%= icon_tag "queue-music", class: "u-mr-tiny" %> + + <%= icon_tag "queue-music", class: "u-mr-1" %> <%= t("label.playlists") %> <%= format_number(@playlists_count) %> @@ -35,8 +35,8 @@
      • <%= link_to songs_path, class: "o-flex o-flex--justify-between" do %> - - <%= icon_tag "music-note", class: "u-mr-tiny" %> + + <%= icon_tag "music-note", class: "u-mr-1" %> <%= t("label.songs") %> <%= format_number(@songs_count) %> diff --git a/app/views/playlists/_playlist.html.erb b/app/views/playlists/_playlist.html.erb index cc1da2be1..a6d28bdc3 100644 --- a/app/views/playlists/_playlist.html.erb +++ b/app/views/playlists/_playlist.html.erb @@ -6,7 +6,7 @@ <% else %> <%= icon_tag("queue-music") %> <% end %> - <%= playlist.name %> + <%= playlist.name %> <% end %>
      diff --git a/app/views/playlists/index.html.erb b/app/views/playlists/index.html.erb index 147292100..f170f358d 100644 --- a/app/views/playlists/index.html.erb +++ b/app/views/playlists/index.html.erb @@ -1,10 +1,10 @@ <% page_title_tag t("label.playlists") %>
      -
      -
      +
      +
      <% unless native_app? %> -

      <%= t("label.playlists") %>

      +

      <%= t("label.playlists") %>

      <% end %> <%= link_to t("label.add"), new_dialog_playlist_path, data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--primary" %>
      @@ -20,7 +20,7 @@ <% end %> <% if @pagy.next %> - <%= turbo_frame_tag "turbo-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "turbo-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
      <%= loader_tag %>
      diff --git a/app/views/playlists/songs/_list.html.erb b/app/views/playlists/songs/_list.html.erb index 09573e92d..2fe9e0708 100644 --- a/app/views/playlists/songs/_list.html.erb +++ b/app/views/playlists/songs/_list.html.erb @@ -10,7 +10,7 @@ <%= render partial: "playlists/songs/song", collection: songs, locals: { playlist: playlist } %> <% if pagy.next %> - <%= turbo_frame_tag "#{dom_id(playlist)}-page-#{pagy.next}", src: pagy_url_for(pagy, pagy.next), loading: "lazy", class: "u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "#{dom_id(playlist)}-page-#{pagy.next}", src: pagy_url_for(pagy, pagy.next), loading: "lazy", class: "u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
      <%= loader_tag %>
      diff --git a/app/views/playlists/songs/_song.html.erb b/app/views/playlists/songs/_song.html.erb index e3093754b..11841b755 100644 --- a/app/views/playlists/songs/_song.html.erb +++ b/app/views/playlists/songs/_song.html.erb @@ -1,7 +1,7 @@
    • -
      +
      <% unless mobile? %> - + <% end %> <%= button_to( @@ -18,15 +18,15 @@ } ) do %>
      -
      - <%= song.name %> +
      + <%= song.name %> <% if native_app? %> <%= song.artist.name %> <% else %> <%= link_to song.artist.name, artist_path(song.artist), class: "c-list__item__subtext" %> <% end %>
      -
      <%= format_duration(song.duration) %>
      +
      <%= format_duration(song.duration) %>
      <% end %>
      diff --git a/app/views/playlists/songs/index.html.erb b/app/views/playlists/songs/index.html.erb index 965cf7c94..074019de0 100644 --- a/app/views/playlists/songs/index.html.erb +++ b/app/views/playlists/songs/index.html.erb @@ -2,7 +2,7 @@
      -
      +

      <%= @playlist.name %>

      @@ -11,7 +11,7 @@ , <%= format_duration(@playlist.songs.sum(:duration)) %>
      -
      +
      <% unless @songs.blank? %> <%= button_to( t("button.play"), diff --git a/app/views/search/albums/index.html.erb b/app/views/search/albums/index.html.erb index de9c53b90..4b13a5639 100644 --- a/app/views/search/albums/index.html.erb +++ b/app/views/search/albums/index.html.erb @@ -1,10 +1,10 @@

      <%= t("label.search_results_for", query: params[:query]) %>

      <%= t("label.albums") %>

      -<%= turbo_frame_tag "turbo-search-albums-page-#{@pagy.page}", class: "o-grid o-grid--shelf u-mb-large", target: "_top" do %> +<%= turbo_frame_tag "turbo-search-albums-page-#{@pagy.page}", class: "o-grid o-grid--shelf u-mb-5", target: "_top" do %> <%= render partial: "albums/album", collection: @albums %> <% if @pagy.next %> - <%= turbo_frame_tag "turbo-search-albums-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "turbo-search-albums-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
      <%= loader_tag %>
      diff --git a/app/views/search/artists/index.html.erb b/app/views/search/artists/index.html.erb index 00c54a3a6..fe234ecdc 100644 --- a/app/views/search/artists/index.html.erb +++ b/app/views/search/artists/index.html.erb @@ -1,10 +1,10 @@

      <%= t("label.search_results_for", query: params[:query]) %>

      <%= t("label.artists") %>

      -<%= turbo_frame_tag "turbo-search-artists-page-#{@pagy.page}", class: "o-grid o-grid--shelf u-mb-large", target: "_top" do %> +<%= turbo_frame_tag "turbo-search-artists-page-#{@pagy.page}", class: "o-grid o-grid--shelf u-mb-5", target: "_top" do %> <%= render partial: "artists/artist", collection: @artists %> <% if @pagy.next %> - <%= turbo_frame_tag "turbo-search-artists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "turbo-search-artists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
      <%= loader_tag %>
      diff --git a/app/views/search/index.html.erb b/app/views/search/index.html.erb index b67189888..d118d08a5 100644 --- a/app/views/search/index.html.erb +++ b/app/views/search/index.html.erb @@ -4,46 +4,46 @@

      <%= t("label.search_results_for", query: params[:query]) %>

      <% if @albums.present? %> -
      +

      <%= t("label.albums") %>

      <% unless @is_all_albums %> <%= link_to t("label.see_all"), search_albums_path(query: params[:query]), class: "is-active" %> <% end %>
      -
      +
      <%= render partial: "albums/album", collection: @albums %>
      <% end %> <% if @artists.present? %> -
      +

      <%= t("label.artists") %>

      <% unless @is_all_artists %> <%= link_to t("label.see_all"), search_artists_path(query: params[:query]), class: "is-active" %> <% end %>
      -
      +
      <%= render partial: "artists/artist", collection: @artists %>
      <% end %> <% if @playlists.present? %> -
      +

      <%= t("label.playlists") %>

      <% unless @is_all_playlists %> <%= link_to t("label.see_all"), search_playlists_path(query: params[:query]), class: "is-active" %> <% end %>
      -
      +
      <%= render partial: "playlists/playlist", collection: @playlists %>
      <% end %> <% if @songs.present? %> -
      +

      <%= t("label.songs") %>

      <% unless @is_all_songs %> diff --git a/app/views/search/playlists/index.html.erb b/app/views/search/playlists/index.html.erb index 481d8ae15..92df50b27 100644 --- a/app/views/search/playlists/index.html.erb +++ b/app/views/search/playlists/index.html.erb @@ -5,7 +5,7 @@ <%= render partial: "playlists/playlist", collection: @playlists %> <% if @pagy.next %> - <%= turbo_frame_tag "turbo-search-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-small", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> + <%= turbo_frame_tag "turbo-search-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %>
      <%= loader_tag %>
      diff --git a/app/views/settings/_form.html.erb b/app/views/settings/_form.html.erb index 1e3f5bd71..84fd68b42 100644 --- a/app/views/settings/_form.html.erb +++ b/app/views/settings/_form.html.erb @@ -18,7 +18,7 @@ <% if MediaListener.running? %>
      <%= icon_tag("check", size: "small") %> - <%= t("text.media_listener_running") %> + <%= t("text.media_listener_running") %>
      <% end %>
      diff --git a/app/views/settings/show.html.erb b/app/views/settings/show.html.erb index ca200c3d9..f61d2223c 100644 --- a/app/views/settings/show.html.erb +++ b/app/views/settings/show.html.erb @@ -6,7 +6,7 @@
      <%= render "settings/form" %> <% end %> -

      +

      <%= link_to BlackCandy::Version, BlackCandy::Version.link, target: "_blank" %>

      diff --git a/app/views/shared/_empty_alert.html.erb b/app/views/shared/_empty_alert.html.erb index 22d97d82d..01cd5b06e 100644 --- a/app/views/shared/_empty_alert.html.erb +++ b/app/views/shared/_empty_alert.html.erb @@ -1,7 +1,7 @@ <% if has_overlay %>
      <% end %>
      <% if has_icon %> -
      +
      <%= icon_tag "music-off", large: "large" %>
      <% end %> diff --git a/app/views/shared/_filter_options.html.erb b/app/views/shared/_filter_options.html.erb index d4db21296..e5960b7c7 100644 --- a/app/views/shared/_filter_options.html.erb +++ b/app/views/shared/_filter_options.html.erb @@ -11,7 +11,7 @@ <%= option %> <% if filter_sort_presenter.filter_value(filter_name) == option.to_s %> - <%= icon_tag("check", size: "small", class: "u-ml-narrow") %> + <%= icon_tag("check", size: "small", class: "u-ml-2") %> <% end %> <% end %> diff --git a/app/views/shared/_mini_player.html.erb b/app/views/shared/_mini_player.html.erb index eb51a18d2..92150abec 100644 --- a/app/views/shared/_mini_player.html.erb +++ b/app/views/shared/_mini_player.html.erb @@ -1,12 +1,12 @@ -
      +
      - <%= icon_tag "expand-less", size: "large", title: t("label.expand_player") %> + <%= icon_tag "expand-less", size: "large", title: t("label.expand_player") %> <%= loader_tag(size: "small") %>
      - - + +
      diff --git a/app/views/shared/_nav_bar.html.erb b/app/views/shared/_nav_bar.html.erb index 4a0596fdb..cc27e8f5b 100644 --- a/app/views/shared/_nav_bar.html.erb +++ b/app/views/shared/_nav_bar.html.erb @@ -1,4 +1,4 @@ -
    +
diff --git a/app/views/artists/show.html.erb b/app/views/artists/show.html.erb index 600262f5d..8cf8ffe32 100644 --- a/app/views/artists/show.html.erb +++ b/app/views/artists/show.html.erb @@ -1,22 +1,31 @@ <% page_title_tag @artist.name %> +<% content_for :fluid_layout, true %> -
-
- <%= cover_image_tag @artist, class: "c-card__image u-image-medium" %> -
-

<%= @artist.name %>

-
- <%= @artist.all_albums.size %> <%= t("label.albums") %> - , - <%= @artist.songs.size %> <%= t("label.songs") %> -
- <% if is_admin? %> -
- <%= link_to t("label.edit"), edit_dialog_artist_path(@artist), data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--secondary u-mt-5" %> +
+
+
+ <%= cover_image_tag @artist, class: "c-card__image u-image-medium c-cover" %> +
+
+

<%= @artist.name %>

+
+ <%= @artist.all_albums.size %> <%= t("label.albums") %> + , + <%= @artist.songs.size %> <%= t("label.songs") %> +
- <% end %> + <% if is_admin? %> +
+ <%= link_to t("label.edit"), edit_dialog_artist_path(@artist), data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--secondary c-button--large" %> +
+ <% end %> +
- <%= render partial: "artists/albums", locals: { title: t("label.albums"), albums: @albums } %> - <%= render partial: "artists/albums", locals: { title: t("label.appears_on"), albums: @appears_on_albums } %> +
+
+
+ <%= render partial: "artists/albums", locals: { title: t("label.albums"), albums: @albums } %> + <%= render partial: "artists/albums", locals: { title: t("label.appears_on"), albums: @appears_on_albums } %> +
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 511f4e003..af1e367c6 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -29,7 +29,7 @@ <%= render "shared/flash" %> <%= render partial: "shared/top_bar", locals: { current_user: Current.user, current_controller: controller_name, query: params[:query] } %> -
+
<%= yield %>
- <%= turbo_frame_tag "turbo-dialog" %> + <%= render "shared/dialog_frame" %>
<% end %> diff --git a/app/views/layouts/dialog.html.erb b/app/views/layouts/dialog.html.erb index 6857a8bb8..c0d01d142 100644 --- a/app/views/layouts/dialog.html.erb +++ b/app/views/layouts/dialog.html.erb @@ -1,4 +1,4 @@ -<%= turbo_frame_tag "turbo-dialog" do %> +<%= turbo_frame_tag "turbo-dialog-content" do %>

<%= yield(:title) %>

diff --git a/app/views/playlists/index.html.erb b/app/views/playlists/index.html.erb index a9b9c29d6..f260c3a50 100644 --- a/app/views/playlists/index.html.erb +++ b/app/views/playlists/index.html.erb @@ -5,7 +5,7 @@ <%= render "shared/library_nav" %>
- <%= link_to t("label.add"), new_dialog_playlist_path, data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--primary u-mr-2" %> + <%= dialog_link_to t("label.add"), new_dialog_playlist_path, class: "c-button c-button--primary u-mr-2" %> <%= render partial: "shared/sort_select", locals: { option: @sort_option, sort_controller: controller_name, filter_sort_presenter: FilterSortPresenter.new(params) } %>
diff --git a/app/views/playlists/songs/_song.html.erb b/app/views/playlists/songs/_song.html.erb index 11841b755..acf4672bb 100644 --- a/app/views/playlists/songs/_song.html.erb +++ b/app/views/playlists/songs/_song.html.erb @@ -74,12 +74,7 @@ method: :delete, form_class: "c-dropdown__item" ) %> - <%= link_to( - t("label.add_to_playlist"), - dialog_playlists_path(song_id: song.id), - data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, - class: "c-dropdown__item" - ) %> + <%= dialog_link_to t("label.add_to_playlist"), dialog_playlists_path(song_id: song.id), class: "c-dropdown__item" %> <%= link_to( t("label.go_to_artist"), artist_path(song.artist), diff --git a/app/views/playlists/songs/index.html.erb b/app/views/playlists/songs/index.html.erb index b322c92df..db3d5e3d1 100644 --- a/app/views/playlists/songs/index.html.erb +++ b/app/views/playlists/songs/index.html.erb @@ -35,7 +35,7 @@ <%= t("button.play") %> <% end %> <% end %> - <%= link_to t("label.edit"), edit_dialog_playlist_path(@playlist), data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, class: "c-button c-button--secondary c-button--large u-ml-1" %> + <%= dialog_link_to t("label.edit"), edit_dialog_playlist_path(@playlist), class: "c-button c-button--secondary c-button--large u-ml-1" %>
diff --git a/app/views/shared/_account_menu.html.erb b/app/views/shared/_account_menu.html.erb index 84a0928af..23d9845ae 100644 --- a/app/views/shared/_account_menu.html.erb +++ b/app/views/shared/_account_menu.html.erb @@ -3,6 +3,6 @@
<%= link_to t("label.settings"), settings_path, class: "c-dropdown__item", data: { "bridge--account-target": "menuItem", bridge_id: :settings } %> <%= button_to t("button.logout"), my_session_path, method: :delete, form_class: "c-dropdown__item", data: { "bridge--account-target": "menuItem", bridge_id: :logout } %> - <%= link_to t("label.about"), about_path, class: "c-dropdown__item", data: { "turbo-frame" => ("turbo-dialog" unless native_app?) } %> + <%= dialog_link_to t("label.about"), about_path, class: "c-dropdown__item" %>
diff --git a/app/views/shared/_dialog_frame.html.erb b/app/views/shared/_dialog_frame.html.erb new file mode 100644 index 000000000..c03af3a77 --- /dev/null +++ b/app/views/shared/_dialog_frame.html.erb @@ -0,0 +1,5 @@ +<%= turbo_frame_tag "turbo-dialog" do %> + <% if (src = dialog_frame_src) %> + <%= turbo_frame_tag "turbo-dialog-content", src: src %> + <% end %> +<% end %> diff --git a/app/views/songs/_song.html.erb b/app/views/songs/_song.html.erb index 1b3340fdc..0d3133bdf 100644 --- a/app/views/songs/_song.html.erb +++ b/app/views/songs/_song.html.erb @@ -33,12 +33,7 @@ <%= icon_tag "more-vertical", size: "small", title: t("label.more") %>
- <%= link_to( - t("label.add_to_playlist"), - dialog_playlists_path(song_id: song.id), - data: { "turbo-frame" => ("turbo-dialog" unless native_app?) }, - class: "c-dropdown__item" - ) %> + <%= dialog_link_to t("label.add_to_playlist"), dialog_playlists_path(song_id: song.id), class: "c-dropdown__item" %> <%= button_to( t("button.play_next"), current_playlist_songs_path(song_id: song.id), diff --git a/test/controllers/dialog_rendering_test.rb b/test/controllers/dialog_rendering_test.rb new file mode 100644 index 000000000..37c907676 --- /dev/null +++ b/test/controllers/dialog_rendering_test.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require "test_helper" + +class DialogRenderingTest < ActionDispatch::IntegrationTest + test "renders dialog frame when carrying a dialog param" do + login + get album_url(albums(:album1), dialog: "/about"), headers: { "Turbo-Frame" => "turbo-dialog" } + + assert_response :success + assert_select "turbo-frame#turbo-dialog turbo-frame#turbo-dialog-content[src=?]", "/about" + end + + test "renders an empty dialog frame for a param that is not a dialog path" do + login + get album_url(albums(:album1), dialog: "/songs"), headers: { "Turbo-Frame" => "turbo-dialog" } + + assert_response :success + assert_select "turbo-frame#turbo-dialog-content", false + end + + test "renders an empty dialog frame for an external param" do + login + get album_url(albums(:album1), dialog: "https://evil.com/about"), headers: { "Turbo-Frame" => "turbo-dialog" } + + assert_response :success + assert_select "turbo-frame#turbo-dialog-content", false + end + + test "renders an empty dialog frame for an unroutable param" do + login + get album_url(albums(:album1), dialog: "/not-a-real-route"), headers: { "Turbo-Frame" => "turbo-dialog" } + + assert_response :success + assert_select "turbo-frame#turbo-dialog-content", false + end + + test "renders the full page with an eager dialog frame on a non-frame request" do + login + get album_url(albums(:album1), dialog: "/about") + + assert_response :success + assert_select "turbo-frame#turbo-dialog turbo-frame#turbo-dialog-content[src=?]", "/about" + end +end From a3d802a96b25b884ead3d1651d7192d2af522a3c Mon Sep 17 00:00:00 2001 From: Ed Chao Date: Wed, 24 Jun 2026 19:17:09 +0900 Subject: [PATCH 14/18] feat: moved all dialog routes out of dialog namespace --- app/controllers/abouts_controller.rb | 4 ++- app/controllers/albums_controller.rb | 7 +++- app/controllers/artists_controller.rb | 7 +++- app/controllers/concerns/dialog_rendering.rb | 17 ++++++++++ app/controllers/concerns/request_detection.rb | 5 --- app/controllers/dialog/albums_controller.rb | 11 ------ .../dialog/application_controller.rb | 7 ---- app/controllers/dialog/artists_controller.rb | 11 ------ .../dialog/playlists_controller.rb | 17 ---------- .../playlists/selections_controller.rb | 11 ++++++ app/controllers/playlists_controller.rb | 11 +++++- app/helpers/dialog_helper.rb | 5 +-- app/views/{dialog => }/albums/edit.html.erb | 0 app/views/albums/show.html.erb | 4 +-- app/views/{dialog => }/artists/edit.html.erb | 0 app/views/artists/show.html.erb | 2 +- .../current_playlist/songs/_song.html.erb | 2 +- .../{dialog => }/playlists/edit.html.erb | 0 app/views/playlists/index.html.erb | 2 +- app/views/{dialog => }/playlists/new.html.erb | 0 .../selections}/_playlist.html.erb | 0 .../selections}/index.html.erb | 2 +- app/views/playlists/songs/_song.html.erb | 2 +- app/views/playlists/songs/index.html.erb | 2 +- app/views/songs/_song.html.erb | 2 +- config/routes.rb | 20 +++++------ test/controllers/albums_controller_test.rb | 29 ++++++++++++++++ test/controllers/artists_controller_test.rb | 29 ++++++++++++++++ .../dialog/albums_controller_test.rb | 34 ------------------- .../dialog/artists_controller_test.rb | 34 ------------------- .../dialog/playlists_controller_test.rb | 29 ---------------- .../playlists/selections_controller_test.rb | 12 +++++++ test/controllers/playlists_controller_test.rb | 16 +++++++++ 33 files changed, 160 insertions(+), 174 deletions(-) delete mode 100644 app/controllers/dialog/albums_controller.rb delete mode 100644 app/controllers/dialog/application_controller.rb delete mode 100644 app/controllers/dialog/artists_controller.rb delete mode 100644 app/controllers/dialog/playlists_controller.rb create mode 100644 app/controllers/playlists/selections_controller.rb rename app/views/{dialog => }/albums/edit.html.erb (100%) rename app/views/{dialog => }/artists/edit.html.erb (100%) rename app/views/{dialog => }/playlists/edit.html.erb (100%) rename app/views/{dialog => }/playlists/new.html.erb (100%) rename app/views/{dialog/playlists => playlists/selections}/_playlist.html.erb (100%) rename app/views/{dialog/playlists => playlists/selections}/index.html.erb (90%) delete mode 100644 test/controllers/dialog/albums_controller_test.rb delete mode 100644 test/controllers/dialog/artists_controller_test.rb delete mode 100644 test/controllers/dialog/playlists_controller_test.rb create mode 100644 test/controllers/playlists/selections_controller_test.rb diff --git a/app/controllers/abouts_controller.rb b/app/controllers/abouts_controller.rb index 2901d7d63..cc0515845 100644 --- a/app/controllers/abouts_controller.rb +++ b/app/controllers/abouts_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true -class AboutsController < Dialog::ApplicationController +class AboutsController < ApplicationController + render_in_dialog + def show end end diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb index a5cfe73c8..28d020ef9 100644 --- a/app/controllers/albums_controller.rb +++ b/app/controllers/albums_controller.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true class AlbumsController < ApplicationController - before_action :require_admin, only: [ :update ] + render_in_dialog :edit + + before_action :require_admin, only: [ :edit, :update ] before_action :find_album, except: [ :index ] before_action :get_sort_option, only: [ :index ] @@ -19,6 +21,9 @@ def show @groped_songs = @songs.group_by(&:discnum) end + def edit + end + def update @album.update!(album_params) diff --git a/app/controllers/artists_controller.rb b/app/controllers/artists_controller.rb index 90a01981f..42ee93e96 100644 --- a/app/controllers/artists_controller.rb +++ b/app/controllers/artists_controller.rb @@ -1,7 +1,9 @@ # frozen_string_literal: true class ArtistsController < ApplicationController - before_action :require_admin, only: [ :update ] + render_in_dialog :edit + + before_action :require_admin, only: [ :edit, :update ] before_action :find_artist, except: [ :index ] before_action :get_sort_option, only: [ :index ] @@ -15,6 +17,9 @@ def show @appears_on_albums = @artist.appears_on_albums.with_attached_cover_image.load_async end + def edit + end + def update @artist.update!(artist_params) diff --git a/app/controllers/concerns/dialog_rendering.rb b/app/controllers/concerns/dialog_rendering.rb index f7a79d496..ca4d7a6d7 100644 --- a/app/controllers/concerns/dialog_rendering.rb +++ b/app/controllers/concerns/dialog_rendering.rb @@ -2,11 +2,28 @@ module DialogRendering extend ActiveSupport::Concern included do + layout -> { "dialog" if dialog? && !native_app? } + class_attribute :dialog_actions, default: [], instance_writer: false + helper_method :dialog? before_action :render_dialog_frame end + class_methods do + def render_in_dialog(*actions) + self.dialog_actions = actions.empty? ? :all : actions.map(&:to_s) + end + + def dialog?(action) + dialog_actions == :all || dialog_actions.include?(action.to_s) + end + end + private + def dialog? + self.class.dialog?(action_name) + end + def render_dialog_frame return unless turbo_frame_request_id == "turbo-dialog" && params[DialogHelper::DIALOG_PARAM].present? diff --git a/app/controllers/concerns/request_detection.rb b/app/controllers/concerns/request_detection.rb index 59328b809..78d333710 100644 --- a/app/controllers/concerns/request_detection.rb +++ b/app/controllers/concerns/request_detection.rb @@ -2,16 +2,11 @@ module RequestDetection extend ActiveSupport::Concern included do - helper_method :dialog? before_action :find_current_request_details end private - def dialog? - is_a? Dialog::ApplicationController - end - def api_request? request.format.json? end diff --git a/app/controllers/dialog/albums_controller.rb b/app/controllers/dialog/albums_controller.rb deleted file mode 100644 index c33fa4273..000000000 --- a/app/controllers/dialog/albums_controller.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module Dialog - class AlbumsController < ApplicationController - before_action :require_admin - - def edit - @album = Album.find(params[:id]) - end - end -end diff --git a/app/controllers/dialog/application_controller.rb b/app/controllers/dialog/application_controller.rb deleted file mode 100644 index cfb56afaf..000000000 --- a/app/controllers/dialog/application_controller.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module Dialog - class ApplicationController < ::ApplicationController - layout proc { "dialog" unless native_app? } - end -end diff --git a/app/controllers/dialog/artists_controller.rb b/app/controllers/dialog/artists_controller.rb deleted file mode 100644 index 30d0285b7..000000000 --- a/app/controllers/dialog/artists_controller.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -module Dialog - class ArtistsController < ApplicationController - before_action :require_admin - - def edit - @artist = Artist.find(params[:id]) - end - end -end diff --git a/app/controllers/dialog/playlists_controller.rb b/app/controllers/dialog/playlists_controller.rb deleted file mode 100644 index fd15c148e..000000000 --- a/app/controllers/dialog/playlists_controller.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module Dialog - class PlaylistsController < ApplicationController - def index - @pagy, @playlists = pagy(Current.user.playlists_with_favorite.order(created_at: :desc)) - end - - def new - @playlist = Playlist.new - end - - def edit - @playlist = Current.user.playlists.find(params[:id]) - end - end -end diff --git a/app/controllers/playlists/selections_controller.rb b/app/controllers/playlists/selections_controller.rb new file mode 100644 index 000000000..d3891328f --- /dev/null +++ b/app/controllers/playlists/selections_controller.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Playlists + class SelectionsController < ApplicationController + render_in_dialog + + def index + @pagy, @playlists = pagy(Current.user.playlists_with_favorite.order(created_at: :desc)) + end + end +end diff --git a/app/controllers/playlists_controller.rb b/app/controllers/playlists_controller.rb index 4dc204b13..88ed8a278 100644 --- a/app/controllers/playlists_controller.rb +++ b/app/controllers/playlists_controller.rb @@ -1,13 +1,22 @@ # frozen_string_literal: true class PlaylistsController < ApplicationController - before_action :find_playlist, only: [ :destroy, :update ] + render_in_dialog :new, :edit + + before_action :find_playlist, only: [ :edit, :destroy, :update ] before_action :get_sort_option, only: [ :index ] def index @pagy, @playlists = pagy(Current.user.playlists_with_favorite.includes(:playlists_songs).sort_records(*sort_params)) end + def new + @playlist = Playlist.new + end + + def edit + end + def create @playlist = Current.user.playlists.create!(playlist_params) diff --git a/app/helpers/dialog_helper.rb b/app/helpers/dialog_helper.rb index 9467a5703..878b829ea 100644 --- a/app/helpers/dialog_helper.rb +++ b/app/helpers/dialog_helper.rb @@ -18,8 +18,9 @@ def dialog_frame_src def dialog_path?(path) return false unless path.match?(%r{\A/[^/]}) - controller = "#{Rails.application.routes.recognize_path(path)[:controller]}_controller".classify.constantize - controller <= Dialog::ApplicationController + recognized = Rails.application.routes.recognize_path(path) + controller = "#{recognized[:controller]}_controller".classify.constantize + controller.dialog?(recognized[:action]) rescue false end diff --git a/app/views/dialog/albums/edit.html.erb b/app/views/albums/edit.html.erb similarity index 100% rename from app/views/dialog/albums/edit.html.erb rename to app/views/albums/edit.html.erb diff --git a/app/views/albums/show.html.erb b/app/views/albums/show.html.erb index af3d544bf..7ca0d5911 100644 --- a/app/views/albums/show.html.erb +++ b/app/views/albums/show.html.erb @@ -33,7 +33,7 @@ <%= t("button.play") %> <% end %> <% if is_admin? %> - <%= dialog_link_to t("label.edit"), edit_dialog_album_path(@album), class: "c-button c-button--secondary c-button--large u-ml-1" %> + <%= dialog_link_to t("label.edit"), edit_album_path(@album), class: "c-button c-button--secondary c-button--large u-ml-1" %> <% end %>
@@ -125,7 +125,7 @@ } } ) %> - <%= dialog_link_to t("label.add_to_playlist"), dialog_playlists_path(song_id: song.id), class: "c-dropdown__item" %> + <%= dialog_link_to t("label.add_to_playlist"), playlists_selections_path(song_id: song.id), class: "c-dropdown__item" %> <%= link_to( t("label.go_to_artist"), artist_path(song.artist), diff --git a/app/views/dialog/artists/edit.html.erb b/app/views/artists/edit.html.erb similarity index 100% rename from app/views/dialog/artists/edit.html.erb rename to app/views/artists/edit.html.erb diff --git a/app/views/artists/show.html.erb b/app/views/artists/show.html.erb index 49abc9456..58aa0b731 100644 --- a/app/views/artists/show.html.erb +++ b/app/views/artists/show.html.erb @@ -16,7 +16,7 @@ <% if is_admin? %>
- <%= dialog_link_to t("label.edit"), edit_dialog_artist_path(@artist), class: "c-button c-button--secondary c-button--large" %> + <%= dialog_link_to t("label.edit"), edit_artist_path(@artist), class: "c-button c-button--secondary c-button--large" %>
<% end %> diff --git a/app/views/current_playlist/songs/_song.html.erb b/app/views/current_playlist/songs/_song.html.erb index ac09b9032..3fe793924 100644 --- a/app/views/current_playlist/songs/_song.html.erb +++ b/app/views/current_playlist/songs/_song.html.erb @@ -28,7 +28,7 @@
<%= icon_tag "more-vertical", size: "small", title: t("label.more") %>
- <%= dialog_link_to t("label.add_to_playlist"), dialog_playlists_path(song_id: song.id), class: "c-dropdown__item" %> + <%= dialog_link_to t("label.add_to_playlist"), playlists_selections_path(song_id: song.id), class: "c-dropdown__item" %> <%= button_to t("button.delete"), current_playlist_song_path(song), method: :delete, form_class: "c-dropdown__item", form: { data: { "turbo-frame" => "turbo-playlist" } } %>
diff --git a/app/views/dialog/playlists/edit.html.erb b/app/views/playlists/edit.html.erb similarity index 100% rename from app/views/dialog/playlists/edit.html.erb rename to app/views/playlists/edit.html.erb diff --git a/app/views/playlists/index.html.erb b/app/views/playlists/index.html.erb index f260c3a50..e1069b3cf 100644 --- a/app/views/playlists/index.html.erb +++ b/app/views/playlists/index.html.erb @@ -5,7 +5,7 @@ <%= render "shared/library_nav" %>
- <%= dialog_link_to t("label.add"), new_dialog_playlist_path, class: "c-button c-button--primary u-mr-2" %> + <%= dialog_link_to t("label.add"), new_playlist_path, class: "c-button c-button--primary u-mr-2" %> <%= render partial: "shared/sort_select", locals: { option: @sort_option, sort_controller: controller_name, filter_sort_presenter: FilterSortPresenter.new(params) } %>
diff --git a/app/views/dialog/playlists/new.html.erb b/app/views/playlists/new.html.erb similarity index 100% rename from app/views/dialog/playlists/new.html.erb rename to app/views/playlists/new.html.erb diff --git a/app/views/dialog/playlists/_playlist.html.erb b/app/views/playlists/selections/_playlist.html.erb similarity index 100% rename from app/views/dialog/playlists/_playlist.html.erb rename to app/views/playlists/selections/_playlist.html.erb diff --git a/app/views/dialog/playlists/index.html.erb b/app/views/playlists/selections/index.html.erb similarity index 90% rename from app/views/dialog/playlists/index.html.erb rename to app/views/playlists/selections/index.html.erb index 1d4397a5a..5b64c90cc 100644 --- a/app/views/dialog/playlists/index.html.erb +++ b/app/views/playlists/selections/index.html.erb @@ -5,7 +5,7 @@ <%= hidden_field_tag :song_id, params[:song_id] %> <%= turbo_frame_tag "turbo-dialog-playlists-page-#{@pagy.page}", class: "c-list", target: "_top" do %> - <%= render partial: "dialog/playlists/playlist", collection: @playlists %> + <%= render partial: "playlists/selections/playlist", collection: @playlists %> <% if @pagy.next %> <%= turbo_frame_tag "turbo-dialog-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> diff --git a/app/views/playlists/songs/_song.html.erb b/app/views/playlists/songs/_song.html.erb index acf4672bb..54828fbfb 100644 --- a/app/views/playlists/songs/_song.html.erb +++ b/app/views/playlists/songs/_song.html.erb @@ -74,7 +74,7 @@ method: :delete, form_class: "c-dropdown__item" ) %> - <%= dialog_link_to t("label.add_to_playlist"), dialog_playlists_path(song_id: song.id), class: "c-dropdown__item" %> + <%= dialog_link_to t("label.add_to_playlist"), playlists_selections_path(song_id: song.id), class: "c-dropdown__item" %> <%= link_to( t("label.go_to_artist"), artist_path(song.artist), diff --git a/app/views/playlists/songs/index.html.erb b/app/views/playlists/songs/index.html.erb index db3d5e3d1..3c73b7620 100644 --- a/app/views/playlists/songs/index.html.erb +++ b/app/views/playlists/songs/index.html.erb @@ -35,7 +35,7 @@ <%= t("button.play") %> <% end %> <% end %> - <%= dialog_link_to t("label.edit"), edit_dialog_playlist_path(@playlist), class: "c-button c-button--secondary c-button--large u-ml-1" %> + <%= dialog_link_to t("label.edit"), edit_playlist_path(@playlist), class: "c-button c-button--secondary c-button--large u-ml-1" %>
diff --git a/app/views/songs/_song.html.erb b/app/views/songs/_song.html.erb index 0d3133bdf..cd87ac44d 100644 --- a/app/views/songs/_song.html.erb +++ b/app/views/songs/_song.html.erb @@ -33,7 +33,7 @@ <%= icon_tag "more-vertical", size: "small", title: t("label.more") %>
- <%= dialog_link_to t("label.add_to_playlist"), dialog_playlists_path(song_id: song.id), class: "c-dropdown__item" %> + <%= dialog_link_to t("label.add_to_playlist"), playlists_selections_path(song_id: song.id), class: "c-dropdown__item" %> <%= button_to( t("button.play_next"), current_playlist_songs_path(song_id: song.id), diff --git a/config/routes.rb b/config/routes.rb index 819c2d1b2..8bb8c447a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,21 +12,25 @@ end resource :system, only: [ :show ] - resources :artists, only: [ :index, :show, :update ] + resources :artists, only: [ :index, :show, :edit, :update ] resources :songs, only: [ :index, :show ] - resources :albums, only: [ :index, :show, :update ] + resources :albums, only: [ :index, :show, :edit, :update ] resources :users, except: [ :show ] do resource :setting, only: [ :update ], module: "users" end - resources :playlists, only: [ :index, :create, :update, :destroy ] do + resources :playlists, only: [ :index, :new, :create, :edit, :update, :destroy ] do resources :songs, only: [ :index, :create, :destroy ], module: "playlists" do delete "/", action: :destroy_all, on: :collection put "move", on: :member end end + namespace :playlists do + resources :selections, only: :index + end + namespace :current_playlist do resources :songs, only: [ :index, :create, :destroy ] do put "move", on: :member @@ -46,14 +50,6 @@ end end - namespace :dialog do - resources :playlists, only: [ :index, :new, :edit ] - resources :artists, only: [ :edit ] - resources :albums, only: [ :edit ] - end - - resource :about, only: [ :show ] - get "/search", to: "search#index", as: "search" namespace :search do @@ -87,6 +83,8 @@ resource :media_syncing, only: [ :create ] + resource :about, only: [ :show ] + get "/403", to: "errors#forbidden", as: :forbidden get "/404", to: "errors#not_found", as: :not_found get "/422", to: "errors#unprocessable_entity", as: :unprocessable_entity diff --git a/test/controllers/albums_controller_test.rb b/test/controllers/albums_controller_test.rb index 18d1de14e..85a346642 100644 --- a/test/controllers/albums_controller_test.rb +++ b/test/controllers/albums_controller_test.rb @@ -35,6 +35,35 @@ class AlbumsControllerTest < ActionDispatch::IntegrationTest assert_response :success end + test "should edit album" do + login users(:admin) + get edit_album_url(albums(:album1)) + + assert_response :success + end + + test "should only admin can edit album" do + login + + get edit_album_url(albums(:album1)) + assert_response :forbidden + + patch album_url(albums(:album1)), params: { album: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } + assert_response :forbidden + end + + test "should not edit album when is on demo mode" do + with_env("DEMO_MODE" => "true") do + login users(:admin) + + get edit_album_url(albums(:album1)) + assert_response :forbidden + + patch album_url(albums(:album1)), params: { album: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } + assert_response :forbidden + end + end + test "should get index via api" do get albums_url, as: :json, headers: api_token_header(users(:visitor1)) response = @response.parsed_body diff --git a/test/controllers/artists_controller_test.rb b/test/controllers/artists_controller_test.rb index 35d54ddd3..23f1c4eba 100644 --- a/test/controllers/artists_controller_test.rb +++ b/test/controllers/artists_controller_test.rb @@ -19,6 +19,35 @@ class ArtistsControllerTest < ActionDispatch::IntegrationTest assert_response :success end + test "should edit artist" do + login users(:admin) + get edit_artist_url(artists(:artist1)) + + assert_response :success + end + + test "should only admin can edit artist" do + login + + get edit_artist_url(artists(:artist1)) + assert_response :forbidden + + patch artist_url(artists(:artist1)), params: { artist: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } + assert_response :forbidden + end + + test "should not edit artist when is on demo mode" do + with_env("DEMO_MODE" => "true") do + login users(:admin) + + get edit_artist_url(artists(:artist1)) + assert_response :forbidden + + patch artist_url(artists(:artist1)), params: { artist: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } + assert_response :forbidden + end + end + test "should update image for artist" do artist = artists(:artist1) login users(:admin) diff --git a/test/controllers/dialog/albums_controller_test.rb b/test/controllers/dialog/albums_controller_test.rb deleted file mode 100644 index 62201e82f..000000000 --- a/test/controllers/dialog/albums_controller_test.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class Dialog::AlbumsControllerTest < ActionDispatch::IntegrationTest - test "should edit album" do - login users(:admin) - get edit_dialog_album_url(albums(:album1)) - - assert_response :success - end - - test "should only admin can edit album" do - login - - get edit_dialog_album_url(albums(:album1)) - assert_response :forbidden - - patch album_url(albums(:album1)), params: { album: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } - assert_response :forbidden - end - - test "should not edit album when is on demo mode" do - with_env("DEMO_MODE" => "true") do - login users(:admin) - - get edit_dialog_album_url(albums(:album1)) - assert_response :forbidden - - patch album_url(albums(:album1)), params: { album: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } - assert_response :forbidden - end - end -end diff --git a/test/controllers/dialog/artists_controller_test.rb b/test/controllers/dialog/artists_controller_test.rb deleted file mode 100644 index ff742dd52..000000000 --- a/test/controllers/dialog/artists_controller_test.rb +++ /dev/null @@ -1,34 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class Dialog::ArtistsControllerTest < ActionDispatch::IntegrationTest - test "should edit album" do - login users(:admin) - get edit_dialog_artist_url(artists(:artist1)) - - assert_response :success - end - - test "should only admin can edit artist" do - login - - get edit_dialog_artist_url(artists(:artist1)) - assert_response :forbidden - - patch artist_url(artists(:artist1)), params: { artist: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } - assert_response :forbidden - end - - test "should not edit artist when is on demo mode" do - with_env("DEMO_MODE" => "true") do - login users(:admin) - - get edit_dialog_artist_url(artists(:artist1)) - assert_response :forbidden - - patch artist_url(artists(:artist1)), params: { artist: { image: fixture_file_upload("cover_image.jpg", "image/jpeg") } } - assert_response :forbidden - end - end -end diff --git a/test/controllers/dialog/playlists_controller_test.rb b/test/controllers/dialog/playlists_controller_test.rb deleted file mode 100644 index 3dbeda4ed..000000000 --- a/test/controllers/dialog/playlists_controller_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class Dialog::PlaylistsControllerTest < ActionDispatch::IntegrationTest - test "should get index" do - login - get dialog_playlists_url - - assert_response :success - end - - test "should get new playlist" do - login - get new_dialog_playlist_path - - assert_response :success - end - - test "should edit playlist" do - playlist = playlists(:playlist1) - user = playlist.user - - login user - get edit_dialog_playlist_path(playlist) - - assert_response :success - end -end diff --git a/test/controllers/playlists/selections_controller_test.rb b/test/controllers/playlists/selections_controller_test.rb new file mode 100644 index 000000000..f6d38d194 --- /dev/null +++ b/test/controllers/playlists/selections_controller_test.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require "test_helper" + +class Playlists::SelectionsControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + login + get playlists_selections_url + + assert_response :success + end +end diff --git a/test/controllers/playlists_controller_test.rb b/test/controllers/playlists_controller_test.rb index 4c810d77e..7e7efa779 100644 --- a/test/controllers/playlists_controller_test.rb +++ b/test/controllers/playlists_controller_test.rb @@ -10,6 +10,22 @@ class PlaylistsControllerTest < ActionDispatch::IntegrationTest assert_response :success end + test "should get new playlist" do + login + get new_playlist_url + + assert_response :success + end + + test "should edit playlist" do + playlist = playlists(:playlist1) + + login playlist.user + get edit_playlist_url(playlist) + + assert_response :success + end + test "should create playlist" do playlists_count = Playlist.count From a812cae451f5c2eebfcab1180f510af80686fec6 Mon Sep 17 00:00:00 2001 From: Ed Chao Date: Thu, 25 Jun 2026 21:57:59 +0900 Subject: [PATCH 15/18] feat: update flash message animations and styles --- Gemfile.lock | 48 +++++++++---------- app/assets/stylesheets/components/flash.css | 15 +++--- app/assets/stylesheets/objects/animations.css | 16 +++---- app/assets/stylesheets/settings/colors.css | 4 +- app/assets/stylesheets/settings/theme.css | 13 ++--- app/controllers/concerns/flashy.rb | 2 +- .../controllers/flash_controller.js | 2 +- app/views/layouts/application.html.erb | 4 +- app/views/shared/_flash.html.erb | 2 +- package-lock.json | 18 +++---- 10 files changed, 64 insertions(+), 60 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index eb8612f7e..f899dcf43 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -91,7 +91,7 @@ GEM erubi (~> 1.4) parser (>= 2.4) smart_properties - bigdecimal (4.1.1) + bigdecimal (4.1.2) bindex (0.8.1) bootsnap (1.18.6) msgpack (~> 1.2) @@ -111,7 +111,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - concurrent-ruby (1.3.6) + concurrent-ruby (1.3.7) connection_pool (3.0.2) crack (1.0.1) bigdecimal @@ -130,7 +130,7 @@ GEM dotenv (3.2.0) drb (2.2.3) ed25519 (1.4.0) - erb (6.0.2) + erb (6.0.4) erb_lint (0.9.0) activesupport better_html (>= 2.0.1) @@ -157,13 +157,13 @@ GEM csv mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) - i18n (1.14.8) + i18n (1.15.2) concurrent-ruby (~> 1.0) image_processing (1.14.0) mini_magick (>= 4.9.5, < 6) ruby-vips (>= 2.0.17, < 3) io-console (0.8.2) - irb (1.17.0) + irb (1.18.0) pp (>= 0.6.0) prism (>= 1.3.0) rdoc (>= 4.0.0) @@ -173,7 +173,7 @@ GEM activesupport (>= 5.0.0) jsbundling-rails (1.3.1) railties (>= 6.0.0) - json (2.19.3) + json (2.20.0) kamal (2.7.0) activesupport (>= 7.0) base64 (~> 0.2) @@ -207,7 +207,7 @@ GEM logger mini_mime (1.1.5) mini_portile2 (2.8.9) - minitest (6.0.3) + minitest (6.0.6) drb (~> 2.0) prism (~> 1.5) minitest-mock (5.27.0) @@ -229,7 +229,7 @@ GEM net-protocol net-ssh (7.3.2) nio4r (2.7.5) - nokogiri (1.19.2) + nokogiri (1.19.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) ostruct (0.6.3) @@ -239,7 +239,7 @@ GEM ast (~> 2.4.1) racc pg (1.5.9) - pp (0.6.3) + pp (0.6.4) prettyprint prettyprint (0.2.0) prism (1.9.0) @@ -248,7 +248,7 @@ GEM activesupport (>= 7.0.0) rack railties (>= 7.0.0) - psych (5.3.1) + psych (5.4.0) date stringio public_suffix (7.0.5) @@ -295,7 +295,7 @@ GEM tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.4.1) + rake (13.4.2) ransack (4.3.0) activerecord (>= 6.1.5) activesupport (>= 6.1.5) @@ -411,7 +411,7 @@ GEM websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.7.5) + zeitwerk (2.8.2) PLATFORMS ruby @@ -478,7 +478,7 @@ CHECKSUMS bcrypt (3.1.22) sha256=1f0072e88c2d705d94aff7f2c5cb02eb3f1ec4b8368671e19112527489f29032 bcrypt_pbkdf (1.1.2) sha256=c2414c23ce66869b3eb9f643d6a3374d8322dfb5078125c82792304c10b94cf6 better_html (2.2.0) sha256=e68ab66ab09696b708333bbf35e8aa3c107500ba7892f528e2111624bdd8cf76 - bigdecimal (4.1.1) sha256=1c09efab961da45203c8316b0cdaec0ff391dfadb952dd459584b63ebf8054ca + bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd bindex (0.8.1) sha256=7b1ecc9dc539ed8bccfc8cb4d2732046227b09d6f37582ff12e50a5047ceb17e bootsnap (1.18.6) sha256=0ae2393c1e911e38be0f24e9173e7be570c3650128251bf06240046f84a07d00 brakeman (8.0.5) sha256=03735f9690d3fd4b32d66aacbf0a6d15a84266bdd06b32c05c8ecc8f6021d2be @@ -486,7 +486,7 @@ CHECKSUMS builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f bullet (8.1.0) sha256=604b7e2636ec2137dcab3ba61a56248c39a0004a0c9405d58bad0686d23b98ff capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef - concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab + concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a crack (1.0.1) sha256=ff4a10390cd31d66440b7524eb1841874db86201d5b70032028553130b6d4c7e crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d @@ -499,7 +499,7 @@ CHECKSUMS dotenv (3.2.0) sha256=e375b83121ea7ca4ce20f214740076129ab8514cd81378161f11c03853fe619d drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 ed25519 (1.4.0) sha256=16e97f5198689a154247169f3453ef4cfd3f7a47481fde0ae33206cdfdcac506 - erb (6.0.2) sha256=9fe6264d44f79422c87490a1558479bd0e7dad4dd0e317656e67ea3077b5242b + erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9 erb_lint (0.9.0) sha256=dfb5e40ad839e8d1f0d56ca85ec9a7ac4c9cd966ec281138282f35b323ca7c31 erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9 et-orbi (1.4.0) sha256=6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc @@ -509,13 +509,13 @@ CHECKSUMS globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 hashdiff (1.2.1) sha256=9c079dbc513dfc8833ab59c0c2d8f230fa28499cc5efb4b8dd276cf931457cd1 httparty (0.23.2) sha256=72d52830ab5862115a3c9a4b16738dd67d9a691ffd796cf86bad8abaa8f1febb - i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 + i18n (1.15.2) sha256=00f9eb62412fe593b2a65a97daa75300d37abb8f7202ec748e94b6d46a9dd1b5 image_processing (1.14.0) sha256=754cc169c9c262980889bec6bfd325ed1dafad34f85242b5a07b60af004742fb io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc - irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae + irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 jbuilder (2.13.0) sha256=7200a38a1c0081aa81b7a9757e7a299db75bc58cf1fd45ca7919a91627d227d6 jsbundling-rails (1.3.1) sha256=0fa03f6d051c694cbf55a022d8be53399879f2c4cf38b2968f86379c62b1c2ca - json (2.19.3) sha256=289b0bb53052a1fa8c34ab33cc750b659ba14a5c45f3fcf4b18762dc67c78646 + json (2.20.0) sha256=9362bc6e55a952b056abf9167cf053358181c904cb70cd6eee0808ea830fc32b kamal (2.7.0) sha256=66b863d967a740886a1817f7e181849c100dfcd4bdf1d8695d9c20828313b4f8 language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 @@ -529,7 +529,7 @@ CHECKSUMS mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289 - minitest (6.0.3) sha256=88ac8a1de36c00692420e7cb3cc11a0773bbcb126aee1c249f320160a7d11411 + minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1 minitest-mock (5.27.0) sha256=7040ed7185417a966920987eaa6eaf1be4ea1fc5b25bb03ff4703f98564a55b0 msgpack (1.8.0) sha256=e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732 multi_xml (0.8.1) sha256=addba0290bac34e9088bfe73dc4878530297a82a7bbd66cb44dcd0a4b86edf5a @@ -541,17 +541,17 @@ CHECKSUMS net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736 net-ssh (7.3.2) sha256=65029e213c380e20e5fd92ece663934ab0a0fe888e0cd7cc6a5b664074362dd4 nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1 - nokogiri (1.19.2) sha256=38fdd8b59db3d5ea9e7dfb14702e882b9bf819198d5bf976f17ebce12c481756 + nokogiri (1.19.4) sha256=50c951611c92bca05c51411aef45f1cbc50f2821c4802758c5c6d34696533ab5 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 pagy (9.3.5) sha256=78a9513150b96f872c092ab1cd95bb818ea29b2c417a4302290bc9293f8f0fd7 parallel (1.25.1) sha256=12e089b9aa36ea2343f6e93f18cfcebd031798253db8260590d26a7f70b1ab90 parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54 pg (1.5.9) sha256=761efbdf73b66516f0c26fcbe6515dc7500c3f0aa1a1b853feae245433c64fdc - pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6 + pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 propshaft (1.1.0) sha256=d389361faf66aeb17e8d204828962c1e506edd14a1a17adb3fa475435c070f6b - psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 + psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 puma (6.6.1) sha256=b9b56e4a4ea75d1bfa6d9e1972ee2c9f43d0883f011826d914e8e37b3694ea1e raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882 @@ -565,7 +565,7 @@ CHECKSUMS rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89 railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22 rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a - rake (13.4.1) sha256=b4e81bd6a748308a6799619d824ec6a23cd1acd07d9ec41e5f2ebfb2294447c8 + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 ransack (4.3.0) sha256=48e141814eb4af8a5cc4e9890b7a088fe818c9996c6b8c846f11104b4c12e8b1 rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e @@ -611,7 +611,7 @@ CHECKSUMS websocket-driver (0.7.7) sha256=056d99f2cd545712cfb1291650fde7478e4f2661dc1db6a0fa3b966231a146b4 websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241 xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e - zeitwerk (2.7.5) sha256=d8da92128c09ea6ec62c949011b00ed4a20242b255293dd66bf41545398f73dd + zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 BUNDLED WITH 4.0.6 diff --git a/app/assets/stylesheets/components/flash.css b/app/assets/stylesheets/components/flash.css index 460030488..290d8b0ff 100644 --- a/app/assets/stylesheets/components/flash.css +++ b/app/assets/stylesheets/components/flash.css @@ -1,31 +1,30 @@ @layer components { .c-flash { - position: absolute; + position: fixed; margin: 0; padding: 0; z-index: var(--z-flash); backface-visibility: hidden; filter: blur(0); max-width: 90%; - top: 10%; - left: 50%; - width: 325px; - transform: translate(calc(-50% - 0.5px)) translateZ(0) scale(1, 1); + bottom: 35px; + right: 35px; + width: 300px; } .c-flash__body { - padding: var(--spacing-1); + padding: var(--spacing-2); text-align: center; border-radius: var(--border-radius-2); } .c-flash__body--alert { background-color: var(--flash-alert-bg-color); - color: var(--flash-color); + color: var(--flash-alert-color); } .c-flash__body--notice { background-color: var(--flash-notice-bg-color); - color: var(--flash-color); + color: var(--flash-notice-color); } } diff --git a/app/assets/stylesheets/objects/animations.css b/app/assets/stylesheets/objects/animations.css index 917fa01d8..441001ca7 100644 --- a/app/assets/stylesheets/objects/animations.css +++ b/app/assets/stylesheets/objects/animations.css @@ -1,8 +1,8 @@ @layer objects { - @keyframes fadeInDown { + @keyframes fadeInUp { from { opacity: 0; - transform: translate3d(0, -100%, 0); + transform: translate3d(0, 100%, 0); } to { @@ -11,14 +11,14 @@ } } - @keyframes fadeOutUp { + @keyframes fadeOutDown { from { opacity: 1; } to { opacity: 0; - transform: translate3d(0, -100%, 0); + transform: translate3d(0, 100%, 0); } } @@ -27,13 +27,13 @@ 100% { transform: rotate(360deg); } } - .o-animation-fadeInDown { - animation-name: fadeInDown; + .o-animation-fadeInUp { + animation-name: fadeInUp; animation-duration: 0.25s; } - .o-animation-fadeOutUp { - animation-name: fadeOutUp; + .o-animation-fadeOutDown { + animation-name: fadeOutDown; animation-duration: 0.25s; } diff --git a/app/assets/stylesheets/settings/colors.css b/app/assets/stylesheets/settings/colors.css index 3934b8066..cbb47d386 100644 --- a/app/assets/stylesheets/settings/colors.css +++ b/app/assets/stylesheets/settings/colors.css @@ -11,7 +11,7 @@ --color-grey-100: rgb(237 237 237); --color-grey-200: rgb(217 217 217); --color-grey-250: rgb(211 211 211); - --color-grey-300: rgb(189 192 186); + --color-grey-300: rgb(189 189 189); --color-grey-400: rgb(145 152 159); --color-grey-500: rgb(130 130 130); --color-grey-600: rgb(101 103 101); @@ -22,7 +22,9 @@ --color-black: rgb(0 0 0); --color-red: rgb(166 22 55); + --color-red-light: rgb(232 118 140); --color-green: rgb(35 166 80); + --color-green-light: rgb(96 206 138); --color-navy: rgb(9 30 66); } } diff --git a/app/assets/stylesheets/settings/theme.css b/app/assets/stylesheets/settings/theme.css index c16535cce..0e58b8ac5 100644 --- a/app/assets/stylesheets/settings/theme.css +++ b/app/assets/stylesheets/settings/theme.css @@ -36,9 +36,10 @@ --btn-icon-hover-bg-color: light-dark(rgb(from var(--color-grey-300) r g b / 0.3), rgb(from var(--color-grey-600) r g b / 0.5)); /* Flash message */ - --flash-color: var(--color-white); - --flash-notice-bg-color: var(--color-green); - --flash-alert-bg-color: var(--color-red); + --flash-notice-color: light-dark(var(--color-green), var(--color-green-light)); + --flash-alert-color: light-dark(var(--color-red), var(--color-red-light)); + --flash-notice-bg-color: color-mix(in srgb, var(--flash-notice-color) 15%, var(--primary-bg-color)); + --flash-alert-bg-color: color-mix(in srgb, var(--flash-alert-color) 15%, var(--primary-bg-color)); /* Tab */ --tab-color: light-dark(var(--color-grey-900), var(--color-white)); @@ -80,17 +81,17 @@ /* Dropdown */ --dropdown-bg-color: light-dark(var(--color-white), var(--color-grey-700)); - --dropdown-active-color: light-dark(var(--color-grey-300), var(--color-grey-500)); + --dropdown-active-color: light-dark(var(--color-grey-200), var(--color-grey-600)); --dropdown-color: light-dark(var(--color-grey-900), var(--color-white)); --dropdown-shadow-color: light-dark(var(--color-grey-300), var(--color-black)); /* Dialog */ --dialog-bg-color: light-dark(var(--color-white), var(--color-grey-900)); - --dialog-header-bg-color: light-dark(var(--color-grey-200), var(--color-grey-500)); + --dialog-header-bg-color: light-dark(var(--color-grey-100), var(--color-grey-700)); --dialog-header-color: var(--color-grey-900); ::backdrop { - --dialog-backdrop-color: rgb(from light-dark(var(--color-grey-100), var(--color-grey-800)) r g b / 0.5); + --dialog-backdrop-color: rgb(from light-dark(var(--color-grey-300), var(--color-grey-500)) r g b / 0.5); } /* Overlay */ diff --git a/app/controllers/concerns/flashy.rb b/app/controllers/concerns/flashy.rb index 49b0bd6d2..5073a4192 100644 --- a/app/controllers/concerns/flashy.rb +++ b/app/controllers/concerns/flashy.rb @@ -9,6 +9,6 @@ module Flashy def stream_flash(type: :notice, message: "") flash.now[type] = message unless message.blank? - turbo_stream.update "turbo-flash", partial: "shared/flash" + turbo_stream.replace "turbo-flash", partial: "shared/flash" end end diff --git a/app/javascript/controllers/flash_controller.js b/app/javascript/controllers/flash_controller.js index 45be36760..2d69b0db1 100644 --- a/app/javascript/controllers/flash_controller.js +++ b/app/javascript/controllers/flash_controller.js @@ -19,6 +19,6 @@ export default class extends Controller { this.remove() }, { once: true }) - this.element.classList.add('o-animation-fadeOutUp') + this.element.classList.add('o-animation-fadeOutDown') } } diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 73a2a6f4b..7d3b7d4a2 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -6,8 +6,9 @@ <%= turbo_stream_from "media_sync" if is_admin? %> <%= turbo_stream_from Current.user, :theme %> + <%= render "shared/flash" %> + <% if native_app? %> - <%= render "shared/flash" %>
<%= content_for?(:content) ? yield(:content) : yield %>
@@ -26,7 +27,6 @@
- <%= render "shared/flash" %> <%= render partial: "shared/top_bar", locals: { current_user: Current.user, current_controller: controller_name, query: params[:query] } %>
diff --git a/app/views/shared/_flash.html.erb b/app/views/shared/_flash.html.erb index 712c866d5..ed8f1aa58 100644 --- a/app/views/shared/_flash.html.erb +++ b/app/views/shared/_flash.html.erb @@ -1,6 +1,6 @@
<% flash.each do |key, value| %> -
+
<%= h value %>
<% end %> diff --git a/package-lock.json b/package-lock.json index 8fd0aa4b2..5e2355888 100644 --- a/package-lock.json +++ b/package-lock.json @@ -697,19 +697,21 @@ "integrity": "sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==" }, "node_modules/@hotwired/turbo": { - "version": "8.0.13", - "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.13.tgz", - "integrity": "sha512-M7qXUqcGab6G5PKOiwhgbByTtrPgKPFCTMNQ52QhzUEXEqmp0/ApEguUesh/FPiUjrmFec+3lq98KsWnYY2C7g==", + "version": "8.0.23", + "resolved": "https://registry.npmjs.org/@hotwired/turbo/-/turbo-8.0.23.tgz", + "integrity": "sha512-GZ7cijxEZ6Ig71u7rD6LHaRv/wcE/hNsc+nEfiWOkLNqUgLOwo5MNGWOy5ZV9ZUDSiQx1no7YxjTNnT4O6//cQ==", + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@hotwired/turbo-rails": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.16.tgz", - "integrity": "sha512-Yxiy2x+N3eOIEDokvLzSrd08aI5RDKnFYDQFl2J/LuMEWTtPdY7oNP0F/gv/sSe5AV23Lwz4FitG/uNFXNM5tA==", + "version": "8.0.23", + "resolved": "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.23.tgz", + "integrity": "sha512-iBILwda3qmQC7FYM70+4s6kEQ7Fx9dJ6+yGxjPyrz9a5JDx1+y7OAA5TA7GGVOZJoicMLrKGdFDNorl40X35lw==", + "license": "MIT", "dependencies": { - "@hotwired/turbo": "^8.0.13", + "@hotwired/turbo": "^8.0.23", "@rails/actioncable": ">=7.0" } }, From cd39eb27c9c8696fc1aeaef238847eb287a10d0d Mon Sep 17 00:00:00 2001 From: Ed Chao Date: Tue, 30 Jun 2026 20:47:58 +0900 Subject: [PATCH 16/18] chore: sync package-lock.json with package.json The committed lock still referenced the removed sass/cssbundling packages; regenerate it to match the current package.json (stylelint migration). --- package-lock.json | 4283 ++++++++++++++++++++++++++------------------- 1 file changed, 2508 insertions(+), 1775 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e2355888..a1cd62911 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,103 +14,126 @@ "idiomorph": "^0.7.4" }, "devDependencies": { + "@stylistic/stylelint-plugin": "^5.2.0", "standard": "^17.1.0", - "stylelint": "^15.10.2", - "stylelint-config-standard-scss": "^9.0.0" + "stylelint": "^17.12.0", + "stylelint-config-standard": "^40.0.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.5.5", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.0.0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.5.0", + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "hashery": "^1.4.0", + "hookified": "^1.15.0" }, "engines": { - "node": ">=4" + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@keyv/serialize": "^1.1.1" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "hashery": "^1.5.1", + "keyv": "^5.6.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.0" + "dependencies": { + "@keyv/serialize": "^1.1.1" } }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" + "node": ">=20.19.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.3.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", "dev": true, "funding": [ { @@ -124,14 +147,41 @@ ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.0" + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz", + "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", "dev": true, "funding": [ { @@ -145,11 +195,13 @@ ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=20.19.0" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.3", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", + "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", "dev": true, "funding": [ { @@ -163,15 +215,40 @@ ], "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz", + "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" + "postcss-selector-parser": "^7.1.1" } }, "node_modules/@csstools/selector-specificity": { - "version": "3.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", + "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", "dev": true, "funding": [ { @@ -185,16 +262,16 @@ ], "license": "MIT-0", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=20.19.0" }, "peerDependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.1.1" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -208,9 +285,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -224,9 +301,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -240,9 +317,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -256,9 +333,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -272,9 +349,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -288,9 +365,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -304,9 +381,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -320,9 +397,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -336,9 +413,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -352,9 +429,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -368,9 +445,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -384,9 +461,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -400,9 +477,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -416,9 +493,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -432,9 +509,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -448,9 +525,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -464,9 +541,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -480,9 +557,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -496,9 +573,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -512,9 +589,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -528,9 +605,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -544,9 +621,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -560,9 +637,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -576,9 +653,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -592,9 +669,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -608,29 +685,28 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -638,7 +714,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -659,24 +737,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@eslint/js": { - "version": "8.46.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { @@ -687,6 +751,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@hotwired/hotwire-native-bridge/-/hotwire-native-bridge-1.2.2.tgz", "integrity": "sha512-P74kFtXjpY1wV/YneZBOrWJmddLGiKBRj73JB1UgUEOfsM69xpGJbwY0sotFyJgevs2YrBgP9yDNw/uEica2VQ==", + "license": "MIT", "peerDependencies": { "@hotwired/stimulus": "^3.2.2" } @@ -694,7 +759,8 @@ "node_modules/@hotwired/stimulus": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@hotwired/stimulus/-/stimulus-3.2.2.tgz", - "integrity": "sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==" + "integrity": "sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==", + "license": "MIT" }, "node_modules/@hotwired/turbo": { "version": "8.0.23", @@ -716,28 +782,25 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -749,16 +812,28 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -766,7 +841,9 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.3", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -774,11 +851,13 @@ } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.4", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -786,31 +865,68 @@ } }, "node_modules/@rails/actioncable": { - "version": "7.0.2", + "version": "8.1.300", + "resolved": "https://registry.npmjs.org/@rails/actioncable/-/actioncable-8.1.300.tgz", + "integrity": "sha512-zOENQsq3NM2jyBY6Z2qtZa3V/R/6OEqA+LGKixQbBMl7kk/J3FXDRcszPe74LsHNgB01jCl/DXu/xA8sHt4I/g==", "license": "MIT" }, - "node_modules/@types/color-name": { - "version": "1.1.1", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@types/minimist": { - "version": "1.2.2", + "node_modules/@stylistic/stylelint-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-5.2.0.tgz", + "integrity": "sha512-pfa2PMvlH87qwoOMUH4rqz7x/vuO5Kh+r/R1Pe+/5T8sukDPe/VfF6mbdUGE5gwZPlj5O1X56qw55IZrFFRF0g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "@csstools/media-query-list-parser": "^5.0.0", + "postcss": "^8.5.8", + "postcss-selector-parser": "^7.1.1", + "postcss-value-parser": "^4.2.0", + "style-search": "^0.1.0" + }, + "peerDependencies": { + "stylelint": "^17.6.0" + } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "dev": true, + "license": "ISC" + }, "node_modules/acorn": { - "version": "8.10.0", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "bin": { @@ -822,6 +938,8 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -829,7 +947,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -845,6 +965,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -853,6 +975,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -865,44 +989,45 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.6", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -911,24 +1036,41 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -938,14 +1080,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -955,14 +1099,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -972,28 +1118,36 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -1002,26 +1156,35 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "1.0.1", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/astral-regex": { - "version": "2.0.0", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1030,19 +1193,16 @@ } }, "node_modules/balanced-match": { - "version": "2.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/brace-expansion": { - "version": "1.1.11", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -1050,23 +1210,23 @@ "concat-map": "0.0.1" } }, - "node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/builtins": { - "version": "5.0.1", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", "dependencies": { @@ -1074,12 +1234,11 @@ } }, "node_modules/builtins/node_modules/semver": { - "version": "7.3.7", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -1087,35 +1246,73 @@ "node": ">=10" } }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/call-bind": { - "version": "1.0.2", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind/node_modules/get-intrinsic": { - "version": "1.1.1", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/call-bind/node_modules/has-symbols": { - "version": "1.0.1", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, "engines": { "node": ">= 0.4" }, @@ -1125,53 +1322,18 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.3.0", - "map-obj": "^4.1.0", - "quick-lru": "^5.1.1", - "type-fest": "^1.2.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/map-obj": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/chalk": { - "version": "4.1.0", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -1185,48 +1347,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1238,78 +1362,105 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "8.2.0", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", "dependencies": { - "import-fresh": "^3.2.1", + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/css-functions-list": { - "version": "3.2.0", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.22" + "node": ">=12" } }, "node_modules/css-tree": { - "version": "2.3.1", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" @@ -1317,6 +1468,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", "bin": { @@ -1326,57 +1479,95 @@ "node": ">=4" } }, - "node_modules/debug": { - "version": "3.2.7", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/decamelize": { - "version": "5.0.1", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/decamelize-keys": { - "version": "1.1.0", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/decamelize-keys/node_modules/decamelize": { - "version": "1.2.0", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, - "node_modules/define-properties": { - "version": "1.2.0", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -1385,35 +1576,73 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dir-glob": { - "version": "3.0.1", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/doctrine": { - "version": "2.1.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { - "version": "1.3.2", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1421,49 +1650,66 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -1472,85 +1718,129 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-abstract/node_modules/internal-slot": { - "version": "1.0.5", + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-abstract/node_modules/object-inspect": { - "version": "1.12.3", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.4", + "node_modules/es-iterator-helpers": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.3.tgz", + "integrity": "sha512-0PuBxFi+4uPanB97iDxCLWuHeYud2FALrw5HFZGtAF38UpJDbDC8frwp2cnDyae692CQ0dou60UwWfhgsa4U/g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { - "has": "^1.0.3" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-to-primitive/node_modules/is-callable": { - "version": "1.1.5", + "node_modules/es-to-primitive": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", + "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" + }, "engines": { "node": ">= 0.4" }, @@ -1559,9 +1849,9 @@ } }, "node_modules/esbuild": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -1571,36 +1861,38 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.0", - "@esbuild/android-arm": "0.28.0", - "@esbuild/android-arm64": "0.28.0", - "@esbuild/android-x64": "0.28.0", - "@esbuild/darwin-arm64": "0.28.0", - "@esbuild/darwin-x64": "0.28.0", - "@esbuild/freebsd-arm64": "0.28.0", - "@esbuild/freebsd-x64": "0.28.0", - "@esbuild/linux-arm": "0.28.0", - "@esbuild/linux-arm64": "0.28.0", - "@esbuild/linux-ia32": "0.28.0", - "@esbuild/linux-loong64": "0.28.0", - "@esbuild/linux-mips64el": "0.28.0", - "@esbuild/linux-ppc64": "0.28.0", - "@esbuild/linux-riscv64": "0.28.0", - "@esbuild/linux-s390x": "0.28.0", - "@esbuild/linux-x64": "0.28.0", - "@esbuild/netbsd-arm64": "0.28.0", - "@esbuild/netbsd-x64": "0.28.0", - "@esbuild/openbsd-arm64": "0.28.0", - "@esbuild/openbsd-x64": "0.28.0", - "@esbuild/openharmony-arm64": "0.28.0", - "@esbuild/sunos-x64": "0.28.0", - "@esbuild/win32-arm64": "0.28.0", - "@esbuild/win32-ia32": "0.28.0", - "@esbuild/win32-x64": "0.28.0" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -1611,17 +1903,21 @@ } }, "node_modules/eslint": { - "version": "8.46.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1629,7 +1925,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -1665,6 +1961,8 @@ }, "node_modules/eslint-config-standard": { "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { @@ -1693,6 +1991,8 @@ }, "node_modules/eslint-config-standard-jsx": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", "dev": true, "funding": [ { @@ -1715,17 +2015,31 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1740,8 +2054,20 @@ } } }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-es": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1760,6 +2086,8 @@ }, "node_modules/eslint-plugin-es/node_modules/eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -1773,7 +2101,9 @@ } }, "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.1.0", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1781,54 +2111,66 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.0", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.12.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", - "resolve": "^1.22.3", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.3", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.12.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, "node_modules/eslint-plugin-n": { "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1851,88 +2193,107 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.5.4", + "node_modules/eslint-plugin-n/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "semver": "bin/semver.js" + "resolve": "bin/resolve" }, "engines": { - "node": ">=10" - } + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, "license": "ISC", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-react": { - "version": "7.33.1", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/is-core-module": { - "version": "2.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "esutils": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, "node_modules/eslint-scope": { "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1948,6 +2309,8 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "license": "MIT", "dependencies": { @@ -1965,6 +2328,8 @@ }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1972,7 +2337,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.2", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1982,100 +2349,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/glob-parent/node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint/node_modules/is-glob": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2091,7 +2368,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2103,6 +2382,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2114,6 +2395,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2122,6 +2405,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -2130,11 +2415,15 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.1", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -2142,24 +2431,60 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", "engines": { @@ -2167,7 +2492,9 @@ } }, "node_modules/fastq": { - "version": "1.8.0", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -2176,6 +2503,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -2186,7 +2515,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -2197,6 +2529,8 @@ }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -2211,11 +2545,14 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -2223,107 +2560,119 @@ } }, "node_modules/flatted": { - "version": "3.2.5", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.3", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.2", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name/node_modules/define-properties": { - "version": "1.1.3", + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", "dependencies": { - "object-keys": "^1.0.12" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { - "version": "1.2.2", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.2.1", + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "8.0.0", + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2332,23 +2681,44 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-symbol-description/node_modules/get-intrinsic": { - "version": "1.1.1", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description/node_modules/has-symbols": { - "version": "1.0.1", + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, "engines": { "node": ">= 0.4" }, @@ -2357,14 +2727,17 @@ } }, "node_modules/glob": { - "version": "7.1.6", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -2376,38 +2749,22 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.0.4", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "is-glob": "^4.0.3" }, "engines": { - "node": "*" + "node": ">=10.13.0" } }, "node_modules/global-modules": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2419,6 +2776,8 @@ }, "node_modules/global-prefix": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "license": "MIT", "dependencies": { @@ -2430,37 +2789,44 @@ "node": ">=6" } }, - "node_modules/globals": { - "version": "13.20.0", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "which": "bin/which" } }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2469,106 +2835,101 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globalthis/node_modules/define-properties": { - "version": "1.1.3", + "node_modules/globby": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.0.tgz", + "integrity": "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q==", "dev": true, "license": "MIT", "dependencies": { - "object-keys": "^1.0.12" + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" }, "engines": { - "node": ">= 0.4" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", + "node_modules/globby/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/globby/node_modules/fast-glob": { - "version": "3.2.11", + "node_modules/globby/node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, "engines": { - "node": ">=8.6.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globjoin": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true, "license": "MIT" }, "node_modules/gopd": { - "version": "1.0.1", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { - "version": "4.2.10", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, - "node_modules/hard-rejection": { - "version": "2.1.0", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" + "node": ">= 0.4" }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -2576,33 +2937,27 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-property-descriptors/node_modules/get-intrinsic": { - "version": "1.1.1", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "dunder-proto": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors/node_modules/has-symbols": { - "version": "1.0.1", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2610,8 +2965,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.1", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -2621,10 +2978,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -2632,60 +2994,78 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "hookified": "^1.15.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=20" } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, "node_modules/howler": { - "version": "2.2.3", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", + "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==", "license": "MIT" }, "node_modules/html-tags": { - "version": "3.3.1", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", + "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=20.10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/idiomorph": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/idiomorph/-/idiomorph-0.7.4.tgz", + "integrity": "sha512-uCdSpLo3uMfqOmrwXTpR1k/sq4sSmKC7l4o/LdJOEU+MMMq+wkevRqOQYn3lP7vfz9Mv+USBEqPvi0XhdL9ENw==", + "license": "0BSD" + }, "node_modules/ignore": { - "version": "5.2.0", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/immutable": { - "version": "4.1.0", - "license": "MIT" - }, "node_modules/import-fresh": { - "version": "3.3.0", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2699,43 +3079,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -2745,47 +3114,44 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/ini": { - "version": "1.3.5", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "ISC", - "engines": { - "node": "*" - } + "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.3", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/internal-slot/node_modules/get-intrinsic": { - "version": "1.1.1", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/internal-slot/node_modules/has-symbols": { - "version": "1.0.1", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2793,52 +3159,58 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, - "node_modules/is-bigint": { - "version": "1.0.4", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "has-bigints": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2849,6 +3221,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -2859,20 +3233,32 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { + "node_modules/is-data-view": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, "engines": { "node": ">= 0.4" }, @@ -2880,35 +3266,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, "engines": { "node": ">= 0.4" }, @@ -2916,19 +3299,24 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=0.10.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -2937,38 +3325,55 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -2976,37 +3381,38 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-string": { - "version": "1.0.7", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.12.0" } }, - "node_modules/is-symbol": { - "version": "1.0.3", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3015,23 +3421,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-symbol/node_modules/has-symbols": { - "version": "1.0.1", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-typed-array": { - "version": "1.1.12", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.11" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -3040,96 +3450,44 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref": { - "version": "1.0.2", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.2", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "call-bound": "^1.0.3" }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.4", - "object.assign": "^4.1.2" + "engines": { + "node": ">= 0.4" }, - "engines": { - "node": ">=4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/array-includes": { - "version": "3.1.4", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3138,42 +3496,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/define-properties": { - "version": "1.1.3", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "object-keys": "^1.0.12" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/es-abstract": { - "version": "1.19.5", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -3182,8 +3530,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/es-abstract/node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -3193,23 +3543,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/get-intrinsic": { + "node_modules/is-weakref": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/has-symbols": { - "version": "1.0.1", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { "node": ">= 0.4" }, @@ -3217,81 +3576,156 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/is-callable": { - "version": "1.2.4", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils/node_modules/string.prototype.trimend": { - "version": "1.0.4", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsx-ast-utils/node_modules/string.prototype.trimstart": { - "version": "1.0.4", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "minimist": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/jsx-ast-utils/node_modules/unbox-primitive": { - "version": "1.0.1", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4.0" } }, - "node_modules/jsx-ast-utils/node_modules/unbox-primitive/node_modules/has-symbols": { - "version": "1.0.3", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "json-buffer": "3.0.1" } }, "node_modules/kind-of": { - "version": "6.0.2", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/known-css-properties": { - "version": "0.27.0", - "dev": true, - "license": "MIT" - }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3303,12 +3737,16 @@ } }, "node_modules/lines-and-columns": { - "version": "1.1.6", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/load-json-file": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "dev": true, "license": "MIT", "dependencies": { @@ -3322,20 +3760,10 @@ "node": ">=6" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/load-json-file/node_modules/type-fest": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -3344,6 +3772,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -3358,16 +3788,22 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true, "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3377,27 +3813,20 @@ "loose-envify": "cli.js" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "1.0.1", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/mathml-tag-names": { - "version": "2.1.3", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", + "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", "dev": true, "license": "MIT", "funding": { @@ -3406,30 +3835,20 @@ } }, "node_modules/mdn-data": { - "version": "2.0.30", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, "node_modules/meow": { - "version": "10.1.5", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", + "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", "dev": true, "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3437,6 +3856,8 @@ }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -3444,27 +3865,23 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { - "version": "3.1.2", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3475,38 +3892,26 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "dev": true, - "license": "MIT" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minimist-options/node_modules/kind-of": { - "version": "6.0.3", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.6", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", "dev": true, "funding": [ { @@ -3524,50 +3929,35 @@ }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, - "node_modules/normalize-package-data": { - "version": "3.0.3", + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/is-core-module": { - "version": "2.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.7", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3575,6 +3965,8 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { @@ -3582,15 +3974,22 @@ } }, "node_modules/object-inspect": { - "version": "1.12.0", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -3598,13 +3997,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -3614,49 +4017,33 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.assign/node_modules/define-properties": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign/node_modules/has-symbols": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.entries": { - "version": "1.1.6", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3666,36 +4053,31 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.6", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3706,6 +4088,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { @@ -3713,23 +4097,45 @@ } }, "node_modules/optionator": { - "version": "0.9.3", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3744,6 +4150,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -3758,6 +4166,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -3766,6 +4176,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -3776,21 +4188,23 @@ } }, "node_modules/parse-json": { - "version": "5.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -3799,6 +4213,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -3807,6 +4223,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -3815,24 +4233,23 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, - "node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { - "version": "1.0.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -3843,6 +4260,8 @@ }, "node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "engines": { @@ -3851,6 +4270,8 @@ }, "node_modules/pkg-conf": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3863,6 +4284,8 @@ }, "node_modules/pkg-conf/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "license": "MIT", "dependencies": { @@ -3874,6 +4297,8 @@ }, "node_modules/pkg-conf/node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "license": "MIT", "dependencies": { @@ -3886,6 +4311,8 @@ }, "node_modules/pkg-conf/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -3900,6 +4327,8 @@ }, "node_modules/pkg-conf/node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3911,14 +4340,28 @@ }, "node_modules/pkg-conf/node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.27", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "dev": true, "funding": [ { @@ -3936,41 +4379,18 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.6", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "funding": [ { @@ -3979,19 +4399,25 @@ }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "engines": { - "node": ">=12.0" + "node": ">=18.0" }, "peerDependencies": { - "postcss": "^8.4.19" + "postcss": "^8.4.31" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", + "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "dev": true, "license": "MIT", "dependencies": { @@ -4004,11 +4430,15 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -4017,6 +4447,8 @@ }, "node_modules/prop-types": { "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", "dependencies": { @@ -4026,112 +4458,99 @@ } }, "node_modules/punycode": { - "version": "2.1.1", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "dev": true, - "license": "MIT" - }, - "node_modules/read-pkg": { - "version": "6.0.0", + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^1.0.1" + "hookified": "^2.1.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20" } }, - "node_modules/read-pkg-up": { - "version": "8.0.0", + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0", - "read-pkg": "^6.0.0", - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "5.2.0", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/readdirp": { - "version": "3.6.0", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" }, - "node_modules/redent": { - "version": "4.0.0", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -4140,16 +4559,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexp.prototype.flags/node_modules/functions-have-names": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "license": "MIT", "engines": { @@ -4161,6 +4574,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { @@ -4168,31 +4583,43 @@ } }, "node_modules/resolve": { - "version": "1.22.2", + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-from": { - "version": "5.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -4202,6 +4629,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -4215,18 +4645,40 @@ } }, "node_modules/run-parallel": { - "version": "1.1.9", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } }, "node_modules/safe-array-concat": { - "version": "1.0.0", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -4236,44 +4688,104 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-regex-test": { + "node_modules/safe-push-apply": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sass": { - "version": "1.64.2", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -4285,6 +4797,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -4292,35 +4806,74 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel/node_modules/get-intrinsic": { - "version": "1.1.1", + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel/node_modules/has-symbols": { + "node_modules/side-channel-map": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, "engines": { "node": ">= 0.4" }, @@ -4330,6 +4883,8 @@ }, "node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -4340,15 +4895,22 @@ } }, "node_modules/slash": { - "version": "3.0.0", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4363,43 +4925,20 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.5", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "CC0-1.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/standard": { - "version": "17.1.0", + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", + "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", "dev": true, "funding": [ { @@ -4423,8 +4962,8 @@ "eslint-plugin-import": "^2.27.5", "eslint-plugin-n": "^15.7.0", "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.32.2", - "standard-engine": "^15.0.0", + "eslint-plugin-react": "^7.36.1", + "standard-engine": "^15.1.0", "version-guard": "^1.1.1" }, "bin": { @@ -4435,7 +4974,9 @@ } }, "node_modules/standard-engine": { - "version": "15.0.0", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", "dev": true, "funding": [ { @@ -4462,45 +5003,120 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string-width": { - "version": "4.2.3", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.7", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4510,26 +5126,37 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4537,6 +5164,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -4548,28 +5177,18 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/strip-indent": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -4581,154 +5200,146 @@ }, "node_modules/style-search": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true, "license": "ISC" }, "node_modules/stylelint": { - "version": "15.10.2", + "version": "17.14.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.14.0.tgz", + "integrity": "sha512-8xkHPpdqYryeIsOgfsYTmr6cIeC4nLYWk5S8BPxpodq8mIuepggkMljsHewWfuAjj/+qpRKou2QerhjMH3iasg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^2.3.0", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/media-query-list-parser": "^2.1.2", - "@csstools/selector-specificity": "^3.0.0", - "balanced-match": "^2.0.0", + "@csstools/css-calc": "^3.2.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-syntax-patches-for-csstree": "^1.1.5", + "@csstools/css-tokenizer": "^4.0.0", + "@csstools/media-query-list-parser": "^5.0.0", + "@csstools/selector-resolve-nested": "^4.0.0", + "@csstools/selector-specificity": "^6.0.0", "colord": "^2.9.3", - "cosmiconfig": "^8.2.0", - "css-functions-list": "^3.2.0", - "css-tree": "^2.3.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.0", + "cosmiconfig": "^9.0.2", + "css-functions-list": "^3.3.3", + "css-tree": "^3.2.1", + "debug": "^4.4.3", + "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^11.1.3", "global-modules": "^2.0.0", - "globby": "^11.1.0", + "globby": "^16.2.0", "globjoin": "^0.1.4", - "html-tags": "^3.3.1", - "ignore": "^5.2.4", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.27.0", - "mathml-tag-names": "^2.1.3", - "meow": "^10.1.5", - "micromatch": "^4.0.5", + "html-tags": "^5.1.0", + "ignore": "^7.0.5", + "import-meta-resolve": "^4.2.0", + "mathml-tag-names": "^4.0.0", + "meow": "^14.1.0", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.25", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.13", + "picocolors": "^1.1.1", + "postcss": "^8.5.15", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.4", "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^3.0.0", + "string-width": "^8.2.1", + "supports-hyperlinks": "^4.4.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", - "write-file-atomic": "^5.0.1" + "table": "^6.9.0", + "write-file-atomic": "^7.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" + "node": ">=20.19.0" } }, "node_modules/stylelint-config-recommended": { - "version": "12.0.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "stylelint": "^15.5.0" - } - }, - "node_modules/stylelint-config-recommended-scss": { - "version": "11.0.0", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz", + "integrity": "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "license": "MIT", - "dependencies": { - "postcss-scss": "^4.0.6", - "stylelint-config-recommended": "^12.0.0", - "stylelint-scss": "^4.6.0" + "engines": { + "node": ">=20.19.0" }, "peerDependencies": { - "postcss": "^8.3.3", - "stylelint": "^15.5.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - } + "stylelint": "^17.0.0" } }, "node_modules/stylelint-config-standard": { - "version": "33.0.0", + "version": "40.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz", + "integrity": "sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "license": "MIT", "dependencies": { - "stylelint-config-recommended": "^12.0.0" + "stylelint-config-recommended": "^18.0.0" }, - "peerDependencies": { - "stylelint": "^15.5.0" - } - }, - "node_modules/stylelint-config-standard-scss": { - "version": "9.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "stylelint-config-recommended-scss": "^11.0.0", - "stylelint-config-standard": "^33.0.0" + "engines": { + "node": ">=20.19.0" }, "peerDependencies": { - "postcss": "^8.3.3", - "stylelint": "^15.5.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - } + "stylelint": "^17.0.0" } }, - "node_modules/stylelint-scss": { - "version": "4.7.0", + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", "dev": true, "license": "MIT", "dependencies": { - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "stylelint": "^14.5.1 || ^15.0.0" + "flat-cache": "^6.1.23" } }, - "node_modules/stylelint/node_modules/debug": { - "version": "4.3.4", + "node_modules/stylelint/node_modules/flat-cache": { + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.2.4", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -4737,6 +5348,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -4747,19 +5360,52 @@ } }, "node_modules/supports-hyperlinks": { - "version": "3.0.0", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.5.0.tgz", + "integrity": "sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "has-flag": "^5.0.1", + "supports-color": "^10.2.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=14.18" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -4771,10 +5417,14 @@ }, "node_modules/svg-tags": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, "node_modules/table": { - "version": "6.8.1", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4789,14 +5439,16 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.11.0", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -4805,16 +5457,38 @@ }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -4823,19 +5497,10 @@ "node": ">=8.0" } }, - "node_modules/trim-newlines": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tsconfig-paths": { - "version": "3.14.2", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { @@ -4847,6 +5512,8 @@ }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -4857,7 +5524,9 @@ } }, "node_modules/type-fest": { - "version": "1.4.0", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -4868,27 +5537,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -4898,15 +5572,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -4916,42 +5594,62 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unbox-primitive": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/has-bigints": { - "version": "1.0.2", + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", "dev": true, "license": "MIT", + "engines": { + "node": ">=20" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4960,20 +5658,15 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "license": "MIT" }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/version-guard": { - "version": "1.1.1", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", + "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", "dev": true, "license": "0BSD", "engines": { @@ -4981,35 +5674,62 @@ } }, "node_modules/which": { - "version": "1.3.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-boxed-primitive/node_modules/is-string": { - "version": "1.0.5", + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, "engines": { "node": ">= 0.4" }, @@ -5017,12 +5737,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-boxed-primitive/node_modules/is-symbol": { - "version": "1.0.4", + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -5032,15 +5757,19 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5049,46 +5778,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "5.0.1", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", + "integrity": "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==", "dev": true, "license": "ISC", "dependencies": { - "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/xdg-basedir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { From 8ac972b4752f4ab0418051397db275e8700a1e0f Mon Sep 17 00:00:00 2001 From: Ed Chao Date: Tue, 30 Jun 2026 20:48:40 +0900 Subject: [PATCH 17/18] feat: add marquee to player song title and link album/artist --- app/assets/stylesheets/application.css | 1 + app/assets/stylesheets/components/player.css | 4 ++++ app/assets/stylesheets/objects/marquee.css | 22 +++++++++++++++++++ .../controllers/player_controller.js | 10 +++++---- app/views/shared/_player.html.erb | 12 +++++++--- 5 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 app/assets/stylesheets/objects/marquee.css diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index f286e94e4..e38e10587 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -12,6 +12,7 @@ @import "./elements/content.css"; @import "./objects/animations.css"; +@import "./objects/marquee.css"; @import "./objects/grid.css"; @import "./objects/flex.css"; @import "./objects/container.css"; diff --git a/app/assets/stylesheets/components/player.css b/app/assets/stylesheets/components/player.css index 1e853dab9..63f162959 100644 --- a/app/assets/stylesheets/components/player.css +++ b/app/assets/stylesheets/components/player.css @@ -13,6 +13,10 @@ .c-player__header__content { max-width: 200px; padding: 0 var(--spacing-2); + + a { + color: inherit; + } } .c-player__header__image { diff --git a/app/assets/stylesheets/objects/marquee.css b/app/assets/stylesheets/objects/marquee.css new file mode 100644 index 000000000..7f00eb143 --- /dev/null +++ b/app/assets/stylesheets/objects/marquee.css @@ -0,0 +1,22 @@ +@layer objects { + .o-marquee { + overflow: hidden; + container-type: inline-size; + } + + .o-marquee__content { + display: inline-block; + white-space: nowrap; + animation: marquee-scroll 8s linear infinite; + } + + @keyframes marquee-scroll { + 0%, 10% { + transform: translateX(0); + } + + 80%, 100% { + transform: translateX(min(0px, 100cqw - 100%)); + } + } +} diff --git a/app/javascript/controllers/player_controller.js b/app/javascript/controllers/player_controller.js index fe08140e5..1c955d949 100644 --- a/app/javascript/controllers/player_controller.js +++ b/app/javascript/controllers/player_controller.js @@ -7,8 +7,8 @@ export default class extends Controller { static targets = [ 'image', 'songName', - 'artistName', - 'albumName', + 'artistLink', + 'albumLink', 'songDuration', 'songTimer', 'progress', @@ -141,8 +141,10 @@ export default class extends Controller { this.element.style.setProperty('--backdrop-image', `url(${currentSong.album_image_urls.small})`) this.imageTarget.src = currentSong.album_image_urls.small this.songNameTarget.textContent = currentSong.name - this.artistNameTarget.textContent = currentSong.artist_name - this.albumNameTarget.textContent = currentSong.album_name + this.artistLinkTarget.textContent = currentSong.artist_name + this.artistLinkTarget.href = `/artists/${currentSong.artist_id}` + this.albumLinkTarget.textContent = currentSong.album_name + this.albumLinkTarget.href = `/albums/${currentSong.album_id}` this.songDurationTarget.textContent = formatDuration(currentSong.duration) this.pauseButtonTarget.classList.remove('u-display-none') diff --git a/app/views/shared/_player.html.erb b/app/views/shared/_player.html.erb index 6c927e62c..82ee85f3c 100644 --- a/app/views/shared/_player.html.erb +++ b/app/views/shared/_player.html.erb @@ -8,9 +8,15 @@
From 99a4f28cfb1af6ba12e7d637f1671e333848446a Mon Sep 17 00:00:00 2001 From: Ed Chao Date: Mon, 6 Jul 2026 19:46:37 +0900 Subject: [PATCH 18/18] feat: replace infinite scroll with numbered pagination --- app/assets/stylesheets/application.css | 1 + app/assets/stylesheets/components/button.css | 1 + .../stylesheets/components/pagination.css | 43 +++++++++++++++ app/assets/stylesheets/components/table.css | 54 ++++--------------- app/assets/stylesheets/settings/theme.css | 7 +++ app/assets/stylesheets/utilities/display.css | 5 ++ app/views/albums/index.html.erb | 12 ++--- app/views/artists/index.html.erb | 12 ++--- app/views/layouts/application.html.erb | 4 +- app/views/playlists/index.html.erb | 12 ++--- app/views/search/songs/_table.html.erb | 26 ++++----- app/views/shared/_pagination.html.erb | 51 ++++++++++++++++++ app/views/songs/_song.html.erb | 22 ++++---- app/views/songs/_table.html.erb | 36 +++++-------- config/locales/en.yml | 4 ++ 15 files changed, 172 insertions(+), 118 deletions(-) create mode 100644 app/assets/stylesheets/components/pagination.css create mode 100644 app/views/shared/_pagination.html.erb diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index e38e10587..3ef17652d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -43,6 +43,7 @@ @import "./components/playlist.css"; @import "./components/song.css"; @import "./components/settings.css"; +@import "./components/pagination.css"; @import "./utilities/display.css"; @import "./utilities/spacing.css"; diff --git a/app/assets/stylesheets/components/button.css b/app/assets/stylesheets/components/button.css index 7c3d018de..714197317 100644 --- a/app/assets/stylesheets/components/button.css +++ b/app/assets/stylesheets/components/button.css @@ -94,5 +94,6 @@ .c-button[disabled] { opacity: 0.6; filter: grayscale(1); + pointer-events: none; } } diff --git a/app/assets/stylesheets/components/pagination.css b/app/assets/stylesheets/components/pagination.css new file mode 100644 index 000000000..008dfc5bb --- /dev/null +++ b/app/assets/stylesheets/components/pagination.css @@ -0,0 +1,43 @@ +@layer components { + .c-pagination { + display: flex; + align-items: center; + justify-content: center; + gap: var(--spacing-2); + margin-top: var(--spacing-5); + } + + .c-pagination__item { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 36px; + height: 36px; + border-radius: var(--border-radius-2); + color: var(--pagination-color); + + &:hover { + background: var(--pagination-hover-bg-color); + text-decoration: none; + } + + &.is-active { + background: var(--pagination-active-bg-color); + color: var(--pagination-active-color); + font-weight: bold; + } + + &.is-disabled { + color: var(--pagination-disabled-color); + pointer-events: none; + } + } + + .c-pagination__item--gap { + pointer-events: none; + + &:hover { + background: none; + } + } +} diff --git a/app/assets/stylesheets/components/table.css b/app/assets/stylesheets/components/table.css index 7a385929a..522413dc4 100644 --- a/app/assets/stylesheets/components/table.css +++ b/app/assets/stylesheets/components/table.css @@ -1,46 +1,26 @@ @layer components { .c-table { - display: table; width: 100%; - table-layout: auto; text-align: left; } - .c-table[role="table"] { - display: grid; - grid-template-columns: var(--grid-tc); - --grid-tc: repeat(5, auto); - } - - .c-table [role="rowgroup"] { - display: contents; - } - - .c-table [role="row"] { - display: contents; - } - - .c-table tr, - .c-table [role="cell"] { - border-top: 1px solid var(--table-border-color); + .c-table th, + .c-table td { + padding: var(--spacing-2); + text-align: left; + vertical-align: middle; + color: var(--table-color); } - .c-table [role="columnheader"] { + .c-table th { font-weight: bold; } - .c-table th, - .c-table td, - .c-table [role="columnheader"], - .c-table [role="cell"] { - display: inline-flex; - align-items: center; - padding: var(--spacing-2); - text-align: left; - color: var(--table-color); + .c-table td { + border-top: 1px solid var(--table-border-color); } - .c-table [role="row"]:hover > [role="cell"] { + .c-table tbody tr:hover > td { background-color: var(--table-hover-bg-color); border-top-color: transparent; @@ -55,19 +35,7 @@ } } - .c-table [role="row"]:hover + [role="row"] > [role="cell"] { + .c-table tbody tr:hover + tr > td { border-top-color: transparent; } - - .c-table [role="cell"][span="row"] { - grid-column: 1 / -1; - } - - @media (max-width: 1130px) { - .c-table[role="table"][cols-at-medium="3"] { --grid-tc: repeat(3, auto); } - } - - @media (max-width: 930px) { - .c-table[role="table"][cols-at-small="2"] { --grid-tc: repeat(2, auto); } - } } diff --git a/app/assets/stylesheets/settings/theme.css b/app/assets/stylesheets/settings/theme.css index 0e58b8ac5..2184ef071 100644 --- a/app/assets/stylesheets/settings/theme.css +++ b/app/assets/stylesheets/settings/theme.css @@ -70,6 +70,13 @@ --table-color: light-dark(var(--color-grey-600), var(--color-grey-300)); --table-hover-bg-color: light-dark(rgb(from var(--color-grey-100) r g b / 0.6), rgb(from var(--color-grey-800) r g b / 0.6)); + /* Pagination */ + --pagination-color: light-dark(var(--color-grey-900), var(--color-white)); + --pagination-hover-bg-color: light-dark(var(--color-grey-100), var(--color-grey-700)); + --pagination-active-bg-color: var(--color-purple); + --pagination-active-color: var(--color-white); + --pagination-disabled-color: light-dark(var(--color-grey-600), var(--color-grey-300)); + /* Input */ --input-bg-color: light-dark(var(--color-grey-200), var(--color-grey-700)); --input-color: light-dark(var(--color-grey-900), var(--color-white)); diff --git a/app/assets/stylesheets/utilities/display.css b/app/assets/stylesheets/utilities/display.css index 747f935ab..bfbf45af3 100644 --- a/app/assets/stylesheets/utilities/display.css +++ b/app/assets/stylesheets/utilities/display.css @@ -11,6 +11,10 @@ display: inline-block; } + .u-display-flex { + display: flex; + } + @media (min-width: 1880px) { .u-display-none\@extra-wide { display: none; } .u-display-block\@extra-wide { display: block; } @@ -44,6 +48,7 @@ @media (max-width: 730px) { .u-display-none\@extra-small { display: none; } .u-display-block\@extra-small { display: block; } + .u-display-flex\@extra-small { display: flex; } } @media (max-width: 560px) { diff --git a/app/views/albums/index.html.erb b/app/views/albums/index.html.erb index 50022b533..176504062 100644 --- a/app/views/albums/index.html.erb +++ b/app/views/albums/index.html.erb @@ -15,16 +15,10 @@ <%= empty_alert_tag has_icon: true, has_overlay: false %>
<% else %> - <%= turbo_frame_tag "turbo-albums-page-#{@pagy.page}", class: "o-grid o-grid--shelf", target: "_top" do %> +
<%= render partial: "albums/album", collection: @albums %> +
- <% if @pagy.next %> - <%= turbo_frame_tag "turbo-albums-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> -
- <%= loader_tag %> -
- <% end %> - <% end %> - <% end %> + <%= render partial: "shared/pagination", locals: { pagy: @pagy } %> <% end %>
diff --git a/app/views/artists/index.html.erb b/app/views/artists/index.html.erb index 06b1b656f..5b86960be 100644 --- a/app/views/artists/index.html.erb +++ b/app/views/artists/index.html.erb @@ -12,16 +12,10 @@ <%= empty_alert_tag has_icon: true, has_overlay: false %>
<% else %> - <%= turbo_frame_tag "turbo-artists-page-#{@pagy.page}", class: "o-grid o-grid--shelf", target: "_top" do %> +
<%= render partial: "artists/artist", collection: @artists %> +
- <% if @pagy.next %> - <%= turbo_frame_tag "turbo-artists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> -
- <%= loader_tag %> -
- <% end %> - <% end %> - <% end %> + <%= render partial: "shared/pagination", locals: { pagy: @pagy } %> <% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7d3b7d4a2..0bf243445 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -6,9 +6,8 @@ <%= turbo_stream_from "media_sync" if is_admin? %> <%= turbo_stream_from Current.user, :theme %> - <%= render "shared/flash" %> - <% if native_app? %> + <%= render "shared/flash" %>
<%= content_for?(:content) ? yield(:content) : yield %>
@@ -25,6 +24,7 @@
+ <%= render "shared/flash" %>
<%= render partial: "shared/top_bar", locals: { current_user: Current.user, current_controller: controller_name, query: params[:query] } %> diff --git a/app/views/playlists/index.html.erb b/app/views/playlists/index.html.erb index e1069b3cf..a0f274122 100644 --- a/app/views/playlists/index.html.erb +++ b/app/views/playlists/index.html.erb @@ -10,17 +10,11 @@
- <%= turbo_frame_tag "turbo-playlists-page-#{@pagy.page}", class: "o-grid o-grid--list", target: "_top" do %> +
<% if @playlists.present? %> <%= render partial: "playlists/playlist", collection: @playlists %> <% end %> +
- <% if @pagy.next %> - <%= turbo_frame_tag "turbo-playlists-page-#{@pagy.next}", src: pagy_url_for(@pagy, @pagy.next), loading: "lazy", class: "o-grid__item o-grid__item--row u-my-3", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> -
- <%= loader_tag %> -
- <% end %> - <% end %> - <% end %> + <%= render partial: "shared/pagination", locals: { pagy: @pagy } %> diff --git a/app/views/search/songs/_table.html.erb b/app/views/search/songs/_table.html.erb index 4ded1d380..f8c5d1f4f 100644 --- a/app/views/search/songs/_table.html.erb +++ b/app/views/search/songs/_table.html.erb @@ -1,14 +1,14 @@ -
-
-
-
<%= t("field.name") %>
-
<%= t("label.artist") %>
-
<%= t("label.album") %>
-
<%= t("label.duration") %>
-
<%= t("label.actions") %>
-
-
-
+ + + + + + + + + + + <%= render partial: "songs/song", collection: songs %> - - + +
<%= t("field.name") %><%= t("label.artist") %><%= t("label.album") %><%= t("label.duration") %><%= t("label.actions") %>
diff --git a/app/views/shared/_pagination.html.erb b/app/views/shared/_pagination.html.erb new file mode 100644 index 000000000..160710bf8 --- /dev/null +++ b/app/views/shared/_pagination.html.erb @@ -0,0 +1,51 @@ +<% if pagy.pages > 1 %> + + + +<% end %> diff --git a/app/views/songs/_song.html.erb b/app/views/songs/_song.html.erb index cd87ac44d..d24f84c8e 100644 --- a/app/views/songs/_song.html.erb +++ b/app/views/songs/_song.html.erb @@ -1,5 +1,5 @@ -
-
+ + <%= button_to( current_playlist_songs_path(song_id: song.id, should_play: true), class: "c-button c-button--link", @@ -19,15 +19,15 @@ <%= song.name %> <% end %> -
-
+ + <%= link_to song.artist.name, artist_path(song.artist) %> -
-
+ + <%= link_to song.album.name, album_path(song.album) %> -
-
<%= format_duration(song.duration) %>
-
+ + <%= format_duration(song.duration) %> +
<%= icon_tag "more-vertical", size: "small", title: t("label.more") %> @@ -60,5 +60,5 @@ ) %>
- - + + diff --git a/app/views/songs/_table.html.erb b/app/views/songs/_table.html.erb index a013226b1..6e6950d96 100644 --- a/app/views/songs/_table.html.erb +++ b/app/views/songs/_table.html.erb @@ -1,24 +1,16 @@ -<%# Because turbo frame doesn't support add on others built-in elements like tbody yet, %> -<%# So I can't use table element here to implement infinite scroll. %> -<%# If turbo frame support built-in elements later https://github.com/hotwired/turbo/pull/131,%> -<%# this view can use table element to refactor. %> -
-
-
-
<%= t("field.name") %>
-
<%= t("label.artist") %>
-
<%= t("label.album") %>
-
<%= t("label.duration") %>
-
<%= t("label.actions") %>
-
-
- <%= turbo_frame_tag "turbo-songs-page-#{pagy.page}", role: "rowgroup", target: "_top" do %> + + + + + + + + + + + <%= render partial: "songs/song", collection: songs %> + +
<%= t("field.name") %><%= t("label.artist") %><%= t("label.album") %><%= t("label.duration") %><%= t("label.actions") %>
- <% if pagy.next %> - <%= turbo_frame_tag "turbo-songs-page-#{pagy.next}", src: pagy_url_for(pagy, pagy.next), loading: "lazy", role: "cell", span: "row", class: "o-flex o-flex--justify-center u-my-3 u-border-none", data: { controller: "element", action: "turbo:frame-render->element#replaceWithChildren" } do %> - <%= loader_tag %> - <% end %> - <% end %> - <% end %> -
+<%= render partial: "shared/pagination", locals: { pagy: pagy } %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 05a09e451..9ac1ad8b3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -61,6 +61,10 @@ en: search_results_for: "Search results for \"%{query}\"" go_to_artist: 'Go to Artist' not_playing: 'Not Playing' + pagination: 'Pagination' + previous_page: 'Previous page' + next_page: 'Next page' + page_of: 'Page %{page} of %{pages}' button: login: 'Login'