From 88ae4cfc4cb022020b975c0d835846f9168a6265 Mon Sep 17 00:00:00 2001 From: Younes ENNAJI Date: Mon, 10 Mar 2025 00:54:37 +0000 Subject: [PATCH] add themes to the docs --- docs/_data/manifest.json | 20 +- docs/_data/menu.yml | 20 +- docs/assets/js/controllers/ray_controller.js | 9 - .../js/controllers/theme_amazon_controller.js | 10 + .../js/controllers/theme_amber_controller.js | 10 + .../js/controllers/theme_aurora_controller.js | 10 + .../controllers/theme_crystal_controller.js | 10 + .../controllers/theme_emerald_controller.js | 10 + .../controllers/theme_facebook_controller.js | 10 + .../controllers/theme_flasher_controller.js | 10 + .../js/controllers/theme_google_controller.js | 10 + .../js/controllers/theme_ios_controller.js | 10 + .../js/controllers/theme_jade_controller.js | 10 + .../controllers/theme_material_controller.js | 10 + .../controllers/theme_minimal_controller.js | 10 + .../js/controllers/theme_neon_controller.js | 10 + .../js/controllers/theme_onyx_controller.js | 10 + .../js/controllers/theme_ruby_controller.js | 10 + .../controllers/theme_sapphire_controller.js | 10 + .../js/controllers/theme_slack_controller.js | 10 + .../assets/js/controllers/tryit_controller.js | 17 ++ docs/assets/js/show_notifications.js | 24 +- .../dist/{371.f9d2cf4e.js => 107.12087179.js} | 2 +- .../dist/{107.090fb6e1.js => 160.264e6e64.js} | 2 +- .../dist/{160.22e7905c.js => 265.396597b6.js} | 2 +- .../dist/{265.52505228.js => 371.324a7072.js} | 2 +- docs/dist/411.277b21bc.js | 1 - docs/dist/411.42e6794f.js | 1 + docs/dist/455.095e6545.js | 1 - docs/dist/455.17bc016b.js | 1 + docs/dist/641.a938263c.js | 1 - docs/dist/641.f8750364.js | 1 + docs/dist/735.3cd4e509.js | 1 + docs/dist/735.5b8d44b1.js | 1 - docs/dist/entrypoints.json | 4 +- docs/dist/main.4815a4d0.js | 2 - docs/dist/main.5346e699.css | 1 - docs/dist/main.855339d4.js | 2 + ...CENSE.txt => main.855339d4.js.LICENSE.txt} | 0 docs/dist/main.e2741770.css | 1 + docs/pages/index.md | 1 + docs/pages/themes/amazon.md | 206 +++++++++++-- docs/pages/themes/amber.md | 201 ++++++++++--- docs/pages/themes/aurora.md | 220 +++++++++++--- docs/pages/themes/crystal.md | 205 ++++++++++--- docs/pages/themes/emerald.md | 214 ++++++++++--- docs/pages/themes/facebook.md | 260 +++++++++++----- docs/pages/themes/flasher.md | 226 +++++++++----- docs/pages/themes/google.md | 245 +++++++++++---- docs/pages/themes/ios.md | 270 +++++++++++------ docs/pages/themes/jade.md | 225 ++++++++++---- docs/pages/themes/material.md | 229 ++++++++++---- docs/pages/themes/minimal.md | 249 ++++++++++----- docs/pages/themes/neon.md | 263 ++++++++++------ docs/pages/themes/onyx.md | 250 +++++++++++----- docs/pages/themes/ruby.md | 283 ++++++++++++------ docs/pages/themes/sapphire.md | 248 ++++++++++----- docs/pages/themes/slack.md | 248 +++++++++++---- docs/tailwind.config.js | 3 +- 59 files changed, 3231 insertions(+), 1101 deletions(-) delete mode 100644 docs/assets/js/controllers/ray_controller.js create mode 100644 docs/assets/js/controllers/theme_amazon_controller.js create mode 100644 docs/assets/js/controllers/theme_amber_controller.js create mode 100644 docs/assets/js/controllers/theme_aurora_controller.js create mode 100644 docs/assets/js/controllers/theme_crystal_controller.js create mode 100644 docs/assets/js/controllers/theme_emerald_controller.js create mode 100644 docs/assets/js/controllers/theme_facebook_controller.js create mode 100644 docs/assets/js/controllers/theme_flasher_controller.js create mode 100644 docs/assets/js/controllers/theme_google_controller.js create mode 100644 docs/assets/js/controllers/theme_ios_controller.js create mode 100644 docs/assets/js/controllers/theme_jade_controller.js create mode 100644 docs/assets/js/controllers/theme_material_controller.js create mode 100644 docs/assets/js/controllers/theme_minimal_controller.js create mode 100644 docs/assets/js/controllers/theme_neon_controller.js create mode 100644 docs/assets/js/controllers/theme_onyx_controller.js create mode 100644 docs/assets/js/controllers/theme_ruby_controller.js create mode 100644 docs/assets/js/controllers/theme_sapphire_controller.js create mode 100644 docs/assets/js/controllers/theme_slack_controller.js rename docs/dist/{371.f9d2cf4e.js => 107.12087179.js} (50%) rename docs/dist/{107.090fb6e1.js => 160.264e6e64.js} (50%) rename docs/dist/{160.22e7905c.js => 265.396597b6.js} (50%) rename docs/dist/{265.52505228.js => 371.324a7072.js} (50%) delete mode 100644 docs/dist/411.277b21bc.js create mode 100644 docs/dist/411.42e6794f.js delete mode 100644 docs/dist/455.095e6545.js create mode 100644 docs/dist/455.17bc016b.js delete mode 100644 docs/dist/641.a938263c.js create mode 100644 docs/dist/641.f8750364.js create mode 100644 docs/dist/735.3cd4e509.js delete mode 100644 docs/dist/735.5b8d44b1.js delete mode 100644 docs/dist/main.4815a4d0.js delete mode 100644 docs/dist/main.5346e699.css create mode 100644 docs/dist/main.855339d4.js rename docs/dist/{main.4815a4d0.js.LICENSE.txt => main.855339d4.js.LICENSE.txt} (100%) create mode 100644 docs/dist/main.e2741770.css diff --git a/docs/_data/manifest.json b/docs/_data/manifest.json index d73a1d9a..f540d9ac 100644 --- a/docs/_data/manifest.json +++ b/docs/_data/manifest.json @@ -1,21 +1,21 @@ { - "dist/main.css": "/dist/main.5346e699.css", - "dist/main.js": "/dist/main.4815a4d0.js", + "dist/main.css": "/dist/main.e2741770.css", + "dist/main.js": "/dist/main.855339d4.js", "dist/455.3a7b4474.css": "/dist/455.3a7b4474.css", - "dist/455.095e6545.js": "/dist/455.095e6545.js", + "dist/455.17bc016b.js": "/dist/455.17bc016b.js", "dist/411.29cd993e.css": "/dist/411.29cd993e.css", - "dist/411.277b21bc.js": "/dist/411.277b21bc.js", + "dist/411.42e6794f.js": "/dist/411.42e6794f.js", "dist/641.c0be7378.css": "/dist/641.c0be7378.css", - "dist/641.a938263c.js": "/dist/641.a938263c.js", + "dist/641.f8750364.js": "/dist/641.f8750364.js", "dist/160.554a2dcd.css": "/dist/160.554a2dcd.css", - "dist/160.22e7905c.js": "/dist/160.22e7905c.js", - "dist/265.52505228.js": "/dist/265.52505228.js", + "dist/160.264e6e64.js": "/dist/160.264e6e64.js", + "dist/265.396597b6.js": "/dist/265.396597b6.js", "dist/371.9523a7ff.css": "/dist/371.9523a7ff.css", - "dist/371.f9d2cf4e.js": "/dist/371.f9d2cf4e.js", + "dist/371.324a7072.js": "/dist/371.324a7072.js", "dist/735.11112420.css": "/dist/735.11112420.css", - "dist/735.5b8d44b1.js": "/dist/735.5b8d44b1.js", + "dist/735.3cd4e509.js": "/dist/735.3cd4e509.js", "dist/243.699ba66f.css": "/dist/243.699ba66f.css", "dist/243.991d9535.js": "/dist/243.991d9535.js", "dist/107.6a2ea759.css": "/dist/107.6a2ea759.css", - "dist/107.090fb6e1.js": "/dist/107.090fb6e1.js" + "dist/107.12087179.js": "/dist/107.12087179.js" } \ No newline at end of file diff --git a/docs/_data/menu.yml b/docs/_data/menu.yml index 47d23d89..fc5c9d93 100644 --- a/docs/_data/menu.yml +++ b/docs/_data/menu.yml @@ -5,8 +5,26 @@ Livewire: '/livewire/' Inertia: '/inertia/' - libraries: + 3rd Party: Noty: '/library/noty/' Notyf: '/library/notyf/' Sweetalert: '/library/sweetalert/' Toastr: '/library/toastr/' + + Themes soon: + Minimal: '/theme/minimal/' + Amber: '/theme/amber/' + Crystal: '/theme/crystal/' + Neon: '/theme/neon/' + Onyx: '/theme/onyx/' + Emerald: '/theme/emerald/' + Jade: '/theme/jade/' + Aurora: '/theme/aurora/' + Ruby: '/theme/ruby/' + Sapphire: '/theme/sapphire/' + Material: '/theme/material/' + Google: '/theme/google/' + Amazon: '/theme/amazon/' + Facebook: '/theme/facebook/' + IOS: '/theme/ios/' + Slack: '/theme/slack/' diff --git a/docs/assets/js/controllers/ray_controller.js b/docs/assets/js/controllers/ray_controller.js deleted file mode 100644 index 5dcf4055..00000000 --- a/docs/assets/js/controllers/ray_controller.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Controller } from '@hotwired/stimulus' - -import { ray } from 'node-ray/web' - -export default class extends Controller { - initialize() { - window.ray = ray - } -} diff --git a/docs/assets/js/controllers/theme_amazon_controller.js b/docs/assets/js/controllers/theme_amazon_controller.js new file mode 100644 index 00000000..05608667 --- /dev/null +++ b/docs/assets/js/controllers/theme_amazon_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/amazon/amazon.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.amazon') + } +} diff --git a/docs/assets/js/controllers/theme_amber_controller.js b/docs/assets/js/controllers/theme_amber_controller.js new file mode 100644 index 00000000..46474cd1 --- /dev/null +++ b/docs/assets/js/controllers/theme_amber_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/amber/amber.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.amber') + } +} diff --git a/docs/assets/js/controllers/theme_aurora_controller.js b/docs/assets/js/controllers/theme_aurora_controller.js new file mode 100644 index 00000000..90ccfa64 --- /dev/null +++ b/docs/assets/js/controllers/theme_aurora_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/aurora/aurora.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.aurora') + } +} diff --git a/docs/assets/js/controllers/theme_crystal_controller.js b/docs/assets/js/controllers/theme_crystal_controller.js new file mode 100644 index 00000000..2113cf8c --- /dev/null +++ b/docs/assets/js/controllers/theme_crystal_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/crystal/crystal.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.crystal') + } +} diff --git a/docs/assets/js/controllers/theme_emerald_controller.js b/docs/assets/js/controllers/theme_emerald_controller.js new file mode 100644 index 00000000..80292e36 --- /dev/null +++ b/docs/assets/js/controllers/theme_emerald_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/emerald/emerald.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.emerald') + } +} diff --git a/docs/assets/js/controllers/theme_facebook_controller.js b/docs/assets/js/controllers/theme_facebook_controller.js new file mode 100644 index 00000000..6e0de1a6 --- /dev/null +++ b/docs/assets/js/controllers/theme_facebook_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/facebook/facebook.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.facebook') + } +} diff --git a/docs/assets/js/controllers/theme_flasher_controller.js b/docs/assets/js/controllers/theme_flasher_controller.js new file mode 100644 index 00000000..5b55d7ea --- /dev/null +++ b/docs/assets/js/controllers/theme_flasher_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/flasher/flasher.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.flasher') + } +} diff --git a/docs/assets/js/controllers/theme_google_controller.js b/docs/assets/js/controllers/theme_google_controller.js new file mode 100644 index 00000000..ab7cd3d2 --- /dev/null +++ b/docs/assets/js/controllers/theme_google_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/google/google.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.google') + } +} diff --git a/docs/assets/js/controllers/theme_ios_controller.js b/docs/assets/js/controllers/theme_ios_controller.js new file mode 100644 index 00000000..1c360eea --- /dev/null +++ b/docs/assets/js/controllers/theme_ios_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/ios/ios.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.ios') + } +} diff --git a/docs/assets/js/controllers/theme_jade_controller.js b/docs/assets/js/controllers/theme_jade_controller.js new file mode 100644 index 00000000..5675f02a --- /dev/null +++ b/docs/assets/js/controllers/theme_jade_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/jade/jade.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.jade') + } +} diff --git a/docs/assets/js/controllers/theme_material_controller.js b/docs/assets/js/controllers/theme_material_controller.js new file mode 100644 index 00000000..44cd5d67 --- /dev/null +++ b/docs/assets/js/controllers/theme_material_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/material/material.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.material') + } +} diff --git a/docs/assets/js/controllers/theme_minimal_controller.js b/docs/assets/js/controllers/theme_minimal_controller.js new file mode 100644 index 00000000..36967667 --- /dev/null +++ b/docs/assets/js/controllers/theme_minimal_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/minimal/minimal.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.minimal') + } +} diff --git a/docs/assets/js/controllers/theme_neon_controller.js b/docs/assets/js/controllers/theme_neon_controller.js new file mode 100644 index 00000000..a01bac01 --- /dev/null +++ b/docs/assets/js/controllers/theme_neon_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/neon/neon.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.neon') + } +} diff --git a/docs/assets/js/controllers/theme_onyx_controller.js b/docs/assets/js/controllers/theme_onyx_controller.js new file mode 100644 index 00000000..f5374387 --- /dev/null +++ b/docs/assets/js/controllers/theme_onyx_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/onyx/onyx.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.onyx') + } +} diff --git a/docs/assets/js/controllers/theme_ruby_controller.js b/docs/assets/js/controllers/theme_ruby_controller.js new file mode 100644 index 00000000..c5403a1c --- /dev/null +++ b/docs/assets/js/controllers/theme_ruby_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/ruby/ruby.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.ruby') + } +} diff --git a/docs/assets/js/controllers/theme_sapphire_controller.js b/docs/assets/js/controllers/theme_sapphire_controller.js new file mode 100644 index 00000000..ac0e5f09 --- /dev/null +++ b/docs/assets/js/controllers/theme_sapphire_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/sapphire/sapphire.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.sapphire') + } +} diff --git a/docs/assets/js/controllers/theme_slack_controller.js b/docs/assets/js/controllers/theme_slack_controller.js new file mode 100644 index 00000000..e8535dca --- /dev/null +++ b/docs/assets/js/controllers/theme_slack_controller.js @@ -0,0 +1,10 @@ +import { Controller } from '@hotwired/stimulus' +import { showNotificationsForHandler } from '../show_notifications' + +import '@flasher/flasher/dist/themes/slack/slack.min.css' + +export default class extends Controller { + connect() { + showNotificationsForHandler('theme.slack') + } +} diff --git a/docs/assets/js/controllers/tryit_controller.js b/docs/assets/js/controllers/tryit_controller.js index d21daeae..eed44de6 100644 --- a/docs/assets/js/controllers/tryit_controller.js +++ b/docs/assets/js/controllers/tryit_controller.js @@ -8,6 +8,23 @@ import '@flasher/flasher-noty' import '@flasher/flasher-notyf' import '@flasher/flasher-sweetalert' +import '@flasher/flasher/dist/themes/amazon/amazon' +import '@flasher/flasher/dist/themes/amber/amber' +import '@flasher/flasher/dist/themes/aurora/aurora' +import '@flasher/flasher/dist/themes/crystal/crystal' +import '@flasher/flasher/dist/themes/emerald/emerald' +import '@flasher/flasher/dist/themes/facebook/facebook' +import '@flasher/flasher/dist/themes/google/google' +import '@flasher/flasher/dist/themes/ios/ios' +import '@flasher/flasher/dist/themes/jade/jade' +import '@flasher/flasher/dist/themes/material/material' +import '@flasher/flasher/dist/themes/minimal/minimal' +import '@flasher/flasher/dist/themes/neon/neon' +import '@flasher/flasher/dist/themes/onyx/onyx' +import '@flasher/flasher/dist/themes/ruby/ruby' +import '@flasher/flasher/dist/themes/sapphire/sapphire' +import '@flasher/flasher/dist/themes/slack/slack' + window.flasher = flasher export default class extends Controller { diff --git a/docs/assets/js/show_notifications.js b/docs/assets/js/show_notifications.js index c895a537..bf87b550 100644 --- a/docs/assets/js/show_notifications.js +++ b/docs/assets/js/show_notifications.js @@ -14,15 +14,31 @@ function showNotifications(notifications) { export function showNotificationsForHandler(handler, options = {}) { const factory = flasher.use(handler) - factory.info('Welcome back', 'Info', options) + // Handle theme-based handlers with different positions + const isThemeHandler = handler.startsWith('theme.') + + // Define position-specific options for theme handlers + let infoOptions = { ...options } + let errorOptions = { ...options } + let warningOptions = { ...options } + let successOptions = { ...options } + + if (isThemeHandler) { + infoOptions = { ...options, position: 'bottom-right' } + errorOptions = { ...options, position: 'bottom-right' } + warningOptions = { ...options, position: 'bottom-right' } + successOptions = { ...options, position: 'bottom-right' } + } + + factory.info('Welcome back', 'Info', infoOptions) if (['sweetalert'].includes(handler)) { return } showNotifications([ - () => factory.error('Oops! Something went wrong!', 'Error', options), - () => factory.warning('Are you sure you want to proceed ?', 'Warning', options), - () => factory.success('Data has been saved successfully!', 'Success', options), + () => factory.error('Oops! Something went wrong!', 'Error', errorOptions), + () => factory.warning('Are you sure you want to proceed?', 'Warning', warningOptions), + () => factory.success('Data has been saved successfully!', 'Success', successOptions), ]) } diff --git a/docs/dist/371.f9d2cf4e.js b/docs/dist/107.12087179.js similarity index 50% rename from docs/dist/371.f9d2cf4e.js rename to docs/dist/107.12087179.js index f194392c..4faff6c3 100644 --- a/docs/dist/371.f9d2cf4e.js +++ b/docs/dist/107.12087179.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[371],{9371:function(s,e,c){c.r(e)}}]); \ No newline at end of file +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[107],{107:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/107.090fb6e1.js b/docs/dist/160.264e6e64.js similarity index 50% rename from docs/dist/107.090fb6e1.js rename to docs/dist/160.264e6e64.js index c4850593..8b0ae4d0 100644 --- a/docs/dist/107.090fb6e1.js +++ b/docs/dist/160.264e6e64.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[107],{9107:function(s,e,c){c.r(e)}}]); \ No newline at end of file +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[160],{779:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/160.22e7905c.js b/docs/dist/265.396597b6.js similarity index 50% rename from docs/dist/160.22e7905c.js rename to docs/dist/265.396597b6.js index 13508443..4b2be5c5 100644 --- a/docs/dist/160.22e7905c.js +++ b/docs/dist/265.396597b6.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[160],{3160:function(s,e,c){c.r(e)}}]); \ No newline at end of file +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[265],{265:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/265.52505228.js b/docs/dist/371.324a7072.js similarity index 50% rename from docs/dist/265.52505228.js rename to docs/dist/371.324a7072.js index c69b9eac..95123f4f 100644 --- a/docs/dist/265.52505228.js +++ b/docs/dist/371.324a7072.js @@ -1 +1 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[265],{6265:function(s,e,c){c.r(e)}}]); \ No newline at end of file +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[371],{371:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/411.277b21bc.js b/docs/dist/411.277b21bc.js deleted file mode 100644 index 7bda41a4..00000000 --- a/docs/dist/411.277b21bc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[411],{9792:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/411.42e6794f.js b/docs/dist/411.42e6794f.js new file mode 100644 index 00000000..30fbf9c0 --- /dev/null +++ b/docs/dist/411.42e6794f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[411],{792:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/455.095e6545.js b/docs/dist/455.095e6545.js deleted file mode 100644 index 4d6b3478..00000000 --- a/docs/dist/455.095e6545.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[455],{3455:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/455.17bc016b.js b/docs/dist/455.17bc016b.js new file mode 100644 index 00000000..ccd9a758 --- /dev/null +++ b/docs/dist/455.17bc016b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[455],{455:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/641.a938263c.js b/docs/dist/641.a938263c.js deleted file mode 100644 index 9c3749de..00000000 --- a/docs/dist/641.a938263c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[641],{2641:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/641.f8750364.js b/docs/dist/641.f8750364.js new file mode 100644 index 00000000..3b0f437a --- /dev/null +++ b/docs/dist/641.f8750364.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[641],{641:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/735.3cd4e509.js b/docs/dist/735.3cd4e509.js new file mode 100644 index 00000000..ea1fe3e5 --- /dev/null +++ b/docs/dist/735.3cd4e509.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[735],{735:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/735.5b8d44b1.js b/docs/dist/735.5b8d44b1.js deleted file mode 100644 index 2619c0a8..00000000 --- a/docs/dist/735.5b8d44b1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk_flasher_docs=self.webpackChunk_flasher_docs||[]).push([[735],{8735:function(s,e,c){c.r(e)}}]); \ No newline at end of file diff --git a/docs/dist/entrypoints.json b/docs/dist/entrypoints.json index 9be78426..51333573 100644 --- a/docs/dist/entrypoints.json +++ b/docs/dist/entrypoints.json @@ -2,10 +2,10 @@ "entrypoints": { "main": { "css": [ - "/dist/main.5346e699.css" + "/dist/main.e2741770.css" ], "js": [ - "/dist/main.4815a4d0.js" + "/dist/main.855339d4.js" ] } } diff --git a/docs/dist/main.4815a4d0.js b/docs/dist/main.4815a4d0.js deleted file mode 100644 index 18f88aae..00000000 --- a/docs/dist/main.4815a4d0.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.4815a4d0.js.LICENSE.txt */ -!function(){var e,t,n={65:function(e,t,n){t.SourceMapGenerator=n(1945).SourceMapGenerator,t.SourceMapConsumer=n(1606).SourceMapConsumer,t.SourceNode=n(1171).SourceNode},113:function(e){var t;t=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.css=t.deepExtend=t.animationEndEvents=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.inArray=function(e,t,n){var r=void 0;if(n){for(r in t)if(t.hasOwnProperty(r)&&t[r]===e)return!0}else for(r in t)if(t.hasOwnProperty(r)&&t[r]===e)return!0;return!1},t.stopPropagation=function(e){void 0!==(e=e||window.event).stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.generateID=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t="noty_"+e+"_";return t+="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}))},t.outerHeight=function(e){var t=e.offsetHeight,n=window.getComputedStyle(e);return t+=parseInt(n.marginTop)+parseInt(n.marginBottom)},t.addListener=o,t.hasClass=s,t.addClass=function(e,t){var n=l(e),r=n+t;s(n,t)||(e.className=r.substring(1))},t.removeClass=function(e,t){var n=l(e),r=void 0;s(e,t)&&(r=n.replace(" "+t+" "," "),e.className=r.substring(1,r.length-1))},t.remove=a,t.classList=l,t.visibilityChangeFlow=function(){var e=void 0,t=void 0;function n(){i.PageHidden?setTimeout((function(){Object.keys(i.Store).forEach((function(e){i.Store.hasOwnProperty(e)&&i.Store[e].options.visibilityControl&&i.Store[e].stop()}))}),100):setTimeout((function(){Object.keys(i.Store).forEach((function(e){i.Store.hasOwnProperty(e)&&i.Store[e].options.visibilityControl&&i.Store[e].resume()})),i.queueRenderAll()}),100)}void 0!==document.hidden?(e="hidden",t="visibilitychange"):void 0!==document.msHidden?(e="msHidden",t="msvisibilitychange"):void 0!==document.webkitHidden&&(e="webkitHidden",t="webkitvisibilitychange"),t&&o(document,t,(function(){i.PageHidden=document[e],n()})),o(window,"blur",(function(){i.PageHidden=!0,n()})),o(window,"focus",(function(){i.PageHidden=!1,n()}))},t.createAudioElements=function(e){if(e.hasSound){var t=document.createElement("audio");e.options.sounds.sources.forEach((function(e){var n=document.createElement("source");n.src=e,n.type="audio/"+e.match(/\.([^.]+)$/)[1],t.appendChild(n)})),e.barDom?e.barDom.appendChild(t):document.querySelector("body").appendChild(t),t.volume=e.options.sounds.volume,e.soundPlayed||(t.play(),e.soundPlayed=!0),t.onended=function(){a(t)}}};var i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(1));function o(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t=t.split(" ");for(var i=0;i=0}function a(e){e.parentNode&&e.parentNode.removeChild(e)}function l(e){return(" "+(e&&e.className||"")+" ").replace(/\s+/gi," ")}t.animationEndEvents="webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",t.deepExtend=function e(t){t=t||{};for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:"global",t=0,n=a;return l.hasOwnProperty(e)&&(n=l[e].maxVisible,Object.keys(c).forEach((function(n){c[n].options.queue!==e||c[n].closed||t++}))),{current:t,maxVisible:n}},t.addToQueue=function(e){l.hasOwnProperty(e.options.queue)||(l[e.options.queue]={maxVisible:a,queue:[]}),l[e.options.queue].queue.push(e)},t.removeFromQueue=function(e){if(l.hasOwnProperty(e.options.queue)){var t=[];Object.keys(l[e.options.queue].queue).forEach((function(n){l[e.options.queue].queue[n].id!==e.id&&t.push(l[e.options.queue].queue[n])})),l[e.options.queue].queue=t}},t.queueRender=u,t.queueRenderAll=function(){Object.keys(l).forEach((function(e){u(e)}))},t.ghostFix=function(e){var t=r.generateID("ghost"),n=document.createElement("div");n.setAttribute("id",t),r.css(n,{height:r.outerHeight(e.barDom)+"px"}),e.barDom.insertAdjacentHTML("afterend",n.outerHTML),r.remove(e.barDom),n=document.getElementById(t),r.addClass(n,"noty_fix_effects_height"),r.addListener(n,r.animationEndEvents,(function(){r.remove(n)}))},t.build=function(e){!function(e){if(e.options.container)e.layoutDom=document.querySelector(e.options.container);else{var t="noty_layout__"+e.options.layout;e.layoutDom=document.querySelector("div#"+t),e.layoutDom||(e.layoutDom=document.createElement("div"),e.layoutDom.setAttribute("id",t),e.layoutDom.setAttribute("role","alert"),e.layoutDom.setAttribute("aria-live","polite"),r.addClass(e.layoutDom,"noty_layout"),document.querySelector("body").appendChild(e.layoutDom))}}(e);var t='
'+e.options.text+"
"+function(e){if(d(e)){var t=document.createElement("div");return r.addClass(t,"noty_buttons"),Object.keys(e.options.buttons).forEach((function(n){t.appendChild(e.options.buttons[n].dom)})),e.options.buttons.forEach((function(e){t.appendChild(e.dom)})),t.outerHTML}return""}(e)+'
';e.barDom=document.createElement("div"),e.barDom.setAttribute("id",e.id),r.addClass(e.barDom,"noty_bar noty_type__"+e.options.type+" noty_theme__"+e.options.theme),e.barDom.innerHTML=t,f(e,"onTemplate")},t.hasButtons=d,t.handleModal=function(e){var n,o;e.options.modal&&(0===i&&(n=document.querySelector("body"),o=document.createElement("div"),r.addClass(o,"noty_modal"),n.insertBefore(o,n.firstChild),r.addClass(o,"noty_modal_open"),r.addListener(o,r.animationEndEvents,(function(){r.removeClass(o,"noty_modal_open")}))),t.DocModalCount=i+=1)},t.handleModalClose=function(e){if(e.options.modal&&i>0&&(t.DocModalCount=i-=1,i<=0)){var n=document.querySelector(".noty_modal");n&&(r.removeClass(n,"noty_modal_open"),r.addClass(n,"noty_modal_close"),r.addListener(n,r.animationEndEvents,(function(){r.remove(n)})))}},t.queueClose=h,t.dequeueClose=p,t.fire=f,t.openFlow=function(e){f(e,"afterShow"),h(e),r.addListener(e.barDom,"mouseenter",(function(){p(e)})),r.addListener(e.barDom,"mouseleave",(function(){h(e)}))},t.closeFlow=function(e){delete c[e.id],e.closing=!1,f(e,"afterClose"),r.remove(e.barDom),0!==e.layoutDom.querySelectorAll(".noty_bar").length||e.options.container||r.remove(e.layoutDom),(r.inArray("docVisible",e.options.titleCount.conditions)||r.inArray("docHidden",e.options.titleCount.conditions))&&s.decrement(),u(e.options.queue)};var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(0));t.PageHidden=!1;var i=t.DocModalCount=0,o={originalTitle:null,count:0,changed:!1,timer:-1},s=t.docTitle={increment:function(){o.count++,s._update()},decrement:function(){o.count--,o.count<=0?s._clear():s._update()},_update:function(){var e=document.title;o.changed?document.title="("+o.count+") "+o.originalTitle:(o.originalTitle=e,document.title="("+o.count+") "+e,o.changed=!0)},_clear:function(){o.changed&&(o.count=0,document.title=o.originalTitle,o.changed=!1)}},a=t.DefaultMaxVisible=5,l=t.Queues={global:{maxVisible:a,queue:[]}},c=t.Store={};function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"global";if(l.hasOwnProperty(e)){var t=l[e].queue.shift();t&&t.show()}}function d(e){return!(!e.options.buttons||!Object.keys(e.options.buttons).length)}function h(e){e.options.timeout&&(e.options.progressBar&&e.progressDom&&r.css(e.progressDom,{transition:"width "+e.options.timeout+"ms linear",width:"0%"}),clearTimeout(e.closeTimer),e.closeTimer=setTimeout((function(){e.close()}),e.options.timeout))}function p(e){e.options.timeout&&e.closeTimer&&(clearTimeout(e.closeTimer),e.closeTimer=-1,e.options.progressBar&&e.progressDom&&r.css(e.progressDom,{transition:"width 0ms linear",width:"100%"}))}function f(e,t){e.listeners.hasOwnProperty(t)&&e.listeners[t].forEach((function(t){"function"==typeof t&&t.apply(e)}))}t.Defaults={type:"alert",layout:"topRight",theme:"mint",text:"",timeout:!1,progressBar:!0,closeWith:["click"],animation:{open:"noty_effects_open",close:"noty_effects_close"},id:!1,force:!1,killer:!1,queue:"global",container:!1,buttons:[],callbacks:{beforeShow:null,onShow:null,afterShow:null,onClose:null,afterClose:null,onClick:null,onHover:null,onTemplate:null},sounds:{sources:[],volume:1,conditions:[]},titleCount:{conditions:[]},modal:!1,visibilityControl:!1}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotyButton=void 0;var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(0));t.NotyButton=function e(t,n,i){var o=this,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.dom=document.createElement("button"),this.dom.innerHTML=t,this.id=s.id=s.id||r.generateID("button"),this.cb=i,Object.keys(s).forEach((function(e){o.dom.setAttribute(e,s[e])})),r.addClass(this.dom,n||"noty_btn"),this}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"/service-worker.js";return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.subData={},this.workerPath=t,this.listeners={onPermissionGranted:[],onPermissionDenied:[],onSubscriptionSuccess:[],onSubscriptionCancel:[],onWorkerError:[],onWorkerSuccess:[],onWorkerNotSupported:[]},this}return r(e,[{key:"on",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};return"function"==typeof t&&this.listeners.hasOwnProperty(e)&&this.listeners[e].push(t),this}},{key:"fire",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];this.listeners.hasOwnProperty(e)&&this.listeners[e].forEach((function(e){"function"==typeof e&&e.apply(t,n)}))}},{key:"create",value:function(){console.log("NOT IMPLEMENTED YET")}},{key:"isSupported",value:function(){var e=!1;try{e=window.Notification||window.webkitNotifications||navigator.mozNotification||window.external&&void 0!==window.external.msIsSiteMode()}catch(e){}return e}},{key:"getPermissionStatus",value:function(){var e="default";if(window.Notification&&window.Notification.permissionLevel)e=window.Notification.permissionLevel;else if(window.webkitNotifications&&window.webkitNotifications.checkPermission)switch(window.webkitNotifications.checkPermission()){case 1:e="default";break;case 0:e="granted";break;default:e="denied"}else window.Notification&&window.Notification.permission?e=window.Notification.permission:navigator.mozNotification?e="granted":window.external&&void 0!==window.external.msIsSiteMode()&&(e=window.external.msIsSiteMode()?"granted":"default");return e.toString().toLowerCase()}},{key:"getEndpoint",value:function(e){var t=e.endpoint,n=e.subscriptionId;return n&&-1===t.indexOf(n)&&(t+="/"+n),t}},{key:"isSWRegistered",value:function(){try{return"activated"===navigator.serviceWorker.controller.state}catch(e){return!1}}},{key:"unregisterWorker",value:function(){var e=this;"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then((function(t){var n=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done);n=!0)o.value.unregister(),e.fire("onSubscriptionCancel")}catch(e){r=!0,i=e}finally{try{!n&&s.return&&s.return()}finally{if(r)throw i}}}))}},{key:"requestSubscription",value:function(){var e=this,t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],n=this,r=this.getPermissionStatus(),i=function(r){"granted"===r?(e.fire("onPermissionGranted"),"serviceWorker"in navigator?navigator.serviceWorker.register(e.workerPath).then((function(){navigator.serviceWorker.ready.then((function(e){n.fire("onWorkerSuccess"),e.pushManager.subscribe({userVisibleOnly:t}).then((function(e){var t=e.getKey("p256dh"),r=e.getKey("auth");n.subData={endpoint:n.getEndpoint(e),p256dh:t?window.btoa(String.fromCharCode.apply(null,new Uint8Array(t))):null,auth:r?window.btoa(String.fromCharCode.apply(null,new Uint8Array(r))):null},n.fire("onSubscriptionSuccess",[n.subData])})).catch((function(e){n.fire("onWorkerError",[e])}))}))})):n.fire("onWorkerNotSupported")):"denied"===r&&(e.fire("onPermissionDenied"),e.unregisterWorker())};"default"===r?window.Notification&&window.Notification.requestPermission?window.Notification.requestPermission(i):window.webkitNotifications&&window.webkitNotifications.checkPermission&&window.webkitNotifications.requestPermission(i):i(r)}}]),e}()},function(e,t,n){(function(t,r){var i;i=function(){"use strict";function e(e){return"function"==typeof e}var i=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},o=0,s=void 0,a=void 0,l=function(e,t){m[o]=e,m[o+1]=t,2===(o+=2)&&(a?a(g):x())},c="undefined"!=typeof window?window:void 0,u=c||{},d=u.MutationObserver||u.WebKitMutationObserver,h="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),p="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function f(){var e=setTimeout;return function(){return e(g,1)}}var m=new Array(1e3);function g(){for(var e=0;e0&&void 0!==arguments[0]?arguments[0]:{};return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.options=a.deepExtend({},l.Defaults,t),l.Store[this.options.id]?l.Store[this.options.id]:(this.id=this.options.id||a.generateID("bar"),this.closeTimer=-1,this.barDom=null,this.layoutDom=null,this.progressDom=null,this.showing=!1,this.shown=!1,this.closed=!1,this.closing=!1,this.killable=this.options.timeout||this.options.closeWith.length>0,this.hasSound=this.options.sounds.sources.length>0,this.soundPlayed=!1,this.listeners={beforeShow:[],onShow:[],afterShow:[],onClose:[],afterClose:[],onClick:[],onHover:[],onTemplate:[]},this.promises={show:null,close:null},this.on("beforeShow",this.options.callbacks.beforeShow),this.on("onShow",this.options.callbacks.onShow),this.on("afterShow",this.options.callbacks.afterShow),this.on("onClose",this.options.callbacks.onClose),this.on("afterClose",this.options.callbacks.afterClose),this.on("onClick",this.options.callbacks.onClick),this.on("onHover",this.options.callbacks.onHover),this.on("onTemplate",this.options.callbacks.onTemplate),this)}return r(e,[{key:"on",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};return"function"==typeof t&&this.listeners.hasOwnProperty(e)&&this.listeners[e].push(t),this}},{key:"show",value:function(){var t=this;if(this.showing||this.shown)return this;!0===this.options.killer?e.closeAll():"string"==typeof this.options.killer&&e.closeAll(this.options.killer);var n=l.getQueueCounts(this.options.queue);if(n.current>=n.maxVisible||l.PageHidden&&this.options.visibilityControl)return l.addToQueue(this),l.PageHidden&&this.hasSound&&a.inArray("docHidden",this.options.sounds.conditions)&&a.createAudioElements(this),l.PageHidden&&a.inArray("docHidden",this.options.titleCount.conditions)&&l.docTitle.increment(),this;if(l.Store[this.id]=this,l.fire(this,"beforeShow"),this.showing=!0,this.closing)return this.showing=!1,this;if(l.build(this),l.handleModal(this),this.options.force?this.layoutDom.insertBefore(this.barDom,this.layoutDom.firstChild):this.layoutDom.appendChild(this.barDom),this.hasSound&&!this.soundPlayed&&a.inArray("docVisible",this.options.sounds.conditions)&&a.createAudioElements(this),a.inArray("docVisible",this.options.titleCount.conditions)&&l.docTitle.increment(),this.shown=!0,this.closed=!1,l.hasButtons(this)&&Object.keys(this.options.buttons).forEach((function(e){var n=t.barDom.querySelector("#"+t.options.buttons[e].id);a.addListener(n,"click",(function(n){a.stopPropagation(n),t.options.buttons[e].cb(t)}))})),this.progressDom=this.barDom.querySelector(".noty_progressbar"),a.inArray("click",this.options.closeWith)&&(a.addClass(this.barDom,"noty_close_with_click"),a.addListener(this.barDom,"click",(function(e){a.stopPropagation(e),l.fire(t,"onClick"),t.close()}),!1)),a.addListener(this.barDom,"mouseenter",(function(){l.fire(t,"onHover")}),!1),this.options.timeout&&a.addClass(this.barDom,"noty_has_timeout"),this.options.progressBar&&a.addClass(this.barDom,"noty_has_progressbar"),a.inArray("button",this.options.closeWith)){a.addClass(this.barDom,"noty_close_with_button");var r=document.createElement("div");a.addClass(r,"noty_close_button"),r.innerHTML="×",this.barDom.appendChild(r),a.addListener(r,"click",(function(e){a.stopPropagation(e),t.close()}),!1)}return l.fire(this,"onShow"),null===this.options.animation.open?this.promises.show=new s.default((function(e){e()})):"function"==typeof this.options.animation.open?this.promises.show=new s.default(this.options.animation.open.bind(this)):(a.addClass(this.barDom,this.options.animation.open),this.promises.show=new s.default((function(e){a.addListener(t.barDom,a.animationEndEvents,(function(){a.removeClass(t.barDom,t.options.animation.open),e()}))}))),this.promises.show.then((function(){var e=t;setTimeout((function(){l.openFlow(e)}),100)})),this}},{key:"stop",value:function(){return l.dequeueClose(this),this}},{key:"resume",value:function(){return l.queueClose(this),this}},{key:"setTimeout",value:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){if(this.stop(),this.options.timeout=e,this.barDom){this.options.timeout?a.addClass(this.barDom,"noty_has_timeout"):a.removeClass(this.barDom,"noty_has_timeout");var t=this;setTimeout((function(){t.resume()}),100)}return this}))},{key:"setText",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.barDom&&(this.barDom.querySelector(".noty_body").innerHTML=e),t&&(this.options.text=e),this}},{key:"setType",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.barDom&&(a.classList(this.barDom).split(" ").forEach((function(e){"noty_type__"===e.substring(0,11)&&a.removeClass(t.barDom,e)})),a.addClass(this.barDom,"noty_type__"+e)),n&&(this.options.type=e),this}},{key:"setTheme",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.barDom&&(a.classList(this.barDom).split(" ").forEach((function(e){"noty_theme__"===e.substring(0,12)&&a.removeClass(t.barDom,e)})),a.addClass(this.barDom,"noty_theme__"+e)),n&&(this.options.theme=e),this}},{key:"close",value:function(){var e=this;return this.closed?this:this.shown?(l.fire(this,"onClose"),this.closing=!0,null===this.options.animation.close||!1===this.options.animation.close?this.promises.close=new s.default((function(e){e()})):"function"==typeof this.options.animation.close?this.promises.close=new s.default(this.options.animation.close.bind(this)):(a.addClass(this.barDom,this.options.animation.close),this.promises.close=new s.default((function(t){a.addListener(e.barDom,a.animationEndEvents,(function(){e.options.force?a.remove(e.barDom):l.ghostFix(e),t()}))}))),this.promises.close.then((function(){l.closeFlow(e),l.handleModalClose(e)})),this.closed=!0,this):(l.removeFromQueue(this),this)}}],[{key:"closeAll",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return Object.keys(l.Store).forEach((function(t){e?l.Store[t].options.queue===e&&l.Store[t].killable&&l.Store[t].close():l.Store[t].killable&&l.Store[t].close()})),this}},{key:"clearQueue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"global";return l.Queues.hasOwnProperty(e)&&(l.Queues[e].queue=[]),this}},{key:"overrideDefaults",value:function(e){return l.Defaults=a.deepExtend({},l.Defaults,e),this}},{key:"setMaxVisible",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:l.DefaultMaxVisible,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"global";return l.Queues.hasOwnProperty(t)||(l.Queues[t]={maxVisible:e,queue:[]}),l.Queues[t].maxVisible=e,this}},{key:"button",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments[2],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return new c.NotyButton(e,t,n,r)}},{key:"version",value:function(){return"3.2.0-beta"}},{key:"Push",value:function(e){return new u.Push(e)}},{key:"Queues",get:function(){return l.Queues}},{key:"PageHidden",get:function(){return l.PageHidden}}]),e}();t.default=h,"undefined"!=typeof window&&a.visibilityChangeFlow(),e.exports=t.default},function(e,t){var n,r,i=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(e){n=o}try{r="function"==typeof clearTimeout?clearTimeout:s}catch(e){r=s}}();var l,c=[],u=!1,d=-1;function h(){u&&l&&(u=!1,l.length?c=l.concat(c):d=-1,c.length&&p())}function p(){if(!u){var e=a(h);u=!0;for(var t=c.length;t;){for(l=c,c=[];++d1)for(var n=1;n=0&&e{e[0](),i(e.slice(1))}),1500)}function o(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=r.A.use(e);n.info("Welcome back","Info",t),["sweetalert"].includes(e)||i([()=>n.error("Oops! Something went wrong!","Error",t),()=>n.warning("Are you sure you want to proceed ?","Warning",t),()=>n.success("Data has been saved successfully!","Success",t)])}},1162:function(e,t,n){"use strict";n.r(t);var r=n(2891);t.default=class extends r.xI{connect(){const e=document.getElementById("menu-toggle"),t=document.getElementById("main-navigation"),n=document.getElementById("main-article");function r(e,t){e.classList.contains(t)?e.classList.remove(t):e.classList.add(t)}e.addEventListener("click",(i=>{i.preventDefault(),r(e,"menu-closed"),r(t,"hidden"),r(n,"hidden")}))}}},1171:function(e,t,n){var r=n(1945).SourceMapGenerator,i=n(3835),o=/(\r?\n)/,s="$$$isSourceNode$$$";function a(e,t,n,r,i){this.children=[],this.sourceContents={},this.line=null==e?null:e,this.column=null==t?null:t,this.source=null==n?null:n,this.name=null==i?null:i,this[s]=!0,null!=r&&this.add(r)}a.fromStringWithSourceMap=function(e,t,n){var r=new a,s=e.split(o),l=function(){return s.shift()+(s.shift()||"")},c=1,u=0,d=null;return t.eachMapping((function(e){if(null!==d){if(!(c0&&(d&&h(d,l()),r.add(s.join(""))),t.sources.forEach((function(e){var o=t.sourceContentFor(e);null!=o&&(null!=n&&(e=i.join(n,e)),r.setSourceContent(e,o))})),r;function h(e,t){if(null===e||void 0===e.source)r.add(t);else{var o=n?i.join(n,e.source):e.source;r.add(new a(e.originalLine,e.originalColumn,o,t,e.name))}}},a.prototype.add=function(e){if(Array.isArray(e))e.forEach((function(e){this.add(e)}),this);else{if(!e[s]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);e&&this.children.push(e)}return this},a.prototype.prepend=function(e){if(Array.isArray(e))for(var t=e.length-1;t>=0;t--)this.prepend(e[t]);else{if(!e[s]&&"string"!=typeof e)throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e);this.children.unshift(e)}return this},a.prototype.walk=function(e){for(var t,n=0,r=this.children.length;n0){for(t=[],n=0;n=0){var a=this._originalMappings[s];if(void 0===e.column)for(var l=a.originalLine;a&&a.originalLine===l;)o.push({line:r.getArg(a,"generatedLine",null),column:r.getArg(a,"generatedColumn",null),lastColumn:r.getArg(a,"lastGeneratedColumn",null)}),a=this._originalMappings[++s];else for(var c=a.originalColumn;a&&a.originalLine===t&&a.originalColumn==c;)o.push({line:r.getArg(a,"generatedLine",null),column:r.getArg(a,"generatedColumn",null),lastColumn:r.getArg(a,"lastGeneratedColumn",null)}),a=this._originalMappings[++s]}return o},t.SourceMapConsumer=l,c.prototype=Object.create(l.prototype),c.prototype.consumer=l,c.fromSourceMap=function(e){var t=Object.create(c.prototype),n=t._names=o.fromArray(e._names.toArray(),!0),i=t._sources=o.fromArray(e._sources.toArray(),!0);t.sourceRoot=e._sourceRoot,t.sourcesContent=e._generateSourcesContent(t._sources.toArray(),t.sourceRoot),t.file=e._file;for(var s=e._mappings.toArray().slice(),l=t.__generatedMappings=[],d=t.__originalMappings=[],h=0,p=s.length;h1&&(n.source=m+o[1],m+=o[1],n.originalLine=p+o[2],p=n.originalLine,n.originalLine+=1,n.originalColumn=f+o[3],f=n.originalColumn,o.length>4&&(n.name=g+o[4],g+=o[4])),E.push(n),"number"==typeof n.originalLine&&x.push(n)}a(E,r.compareByGeneratedPositionsDeflated),this.__generatedMappings=E,a(x,r.compareByOriginalPositions),this.__originalMappings=x},c.prototype._findMapping=function(e,t,n,r,o,s){if(e[n]<=0)throw new TypeError("Line must be greater than or equal to 1, got "+e[n]);if(e[r]<0)throw new TypeError("Column must be greater than or equal to 0, got "+e[r]);return i.search(e,t,o,s)},c.prototype.computeColumnSpans=function(){for(var e=0;e=0){var i=this._generatedMappings[n];if(i.generatedLine===t.generatedLine){var o=r.getArg(i,"source",null);null!==o&&(o=this._sources.at(o),null!=this.sourceRoot&&(o=r.join(this.sourceRoot,o)));var s=r.getArg(i,"name",null);return null!==s&&(s=this._names.at(s)),{source:o,line:r.getArg(i,"originalLine",null),column:r.getArg(i,"originalColumn",null),name:s}}}return{source:null,line:null,column:null,name:null}},c.prototype.hasContentsOfAllSources=function(){return!!this.sourcesContent&&(this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some((function(e){return null==e})))},c.prototype.sourceContentFor=function(e,t){if(!this.sourcesContent)return null;if(null!=this.sourceRoot&&(e=r.relative(this.sourceRoot,e)),this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];var n;if(null!=this.sourceRoot&&(n=r.urlParse(this.sourceRoot))){var i=e.replace(/^file:\/\//,"");if("file"==n.scheme&&this._sources.has(i))return this.sourcesContent[this._sources.indexOf(i)];if((!n.path||"/"==n.path)&&this._sources.has("/"+e))return this.sourcesContent[this._sources.indexOf("/"+e)]}if(t)return null;throw new Error('"'+e+'" is not in the SourceMap.')},c.prototype.generatedPositionFor=function(e){var t=r.getArg(e,"source");if(null!=this.sourceRoot&&(t=r.relative(this.sourceRoot,t)),!this._sources.has(t))return{line:null,column:null,lastColumn:null};var n={source:t=this._sources.indexOf(t),originalLine:r.getArg(e,"line"),originalColumn:r.getArg(e,"column")},i=this._findMapping(n,this._originalMappings,"originalLine","originalColumn",r.compareByOriginalPositions,r.getArg(e,"bias",l.GREATEST_LOWER_BOUND));if(i>=0){var o=this._originalMappings[i];if(o.source===n.source)return{line:r.getArg(o,"generatedLine",null),column:r.getArg(o,"generatedColumn",null),lastColumn:r.getArg(o,"lastGeneratedColumn",null)}}return{line:null,column:null,lastColumn:null}},d.prototype=Object.create(l.prototype),d.prototype.constructor=l,d.prototype._version=3,Object.defineProperty(d.prototype,"sources",{get:function(){for(var e=[],t=0;t{try{const{message:t,title:n,type:r,options:i}=e,s=o[r](t,n,i);if(s&&s.parent)try{const e=s.parent();e&&"function"==typeof e.attr&&e.attr("data-turbo-temporary","")}catch(e){console.error("PHPFlasher Toastr: Error setting Turbo compatibility",e)}}catch(t){console.error("PHPFlasher Toastr: Error rendering notification",t,e)}}))}renderOptions(e){if(this.isDependencyAvailable())try{o.options=Object.assign({timeOut:e.timeOut||1e4,progressBar:e.progressBar||!0},e)}catch(e){console.error("PHPFlasher Toastr: Error applying options",e)}}isDependencyAvailable(){return!(!window.jQuery&&!window.$)||(console.error("PHPFlasher Toastr: jQuery is required but not loaded. Make sure jQuery is loaded before using Toastr."),!1)}};i.A.addPlugin("toastr",a);var l=n(113);class c{success(e,t,n){this.flash("success",e,t,n)}error(e,t,n){this.flash("error",e,t,n)}info(e,t,n){this.flash("info",e,t,n)}warning(e,t,n){this.flash("warning",e,t,n)}flash(e,t,n,r){let i,o,s,a={};if("object"==typeof e?(a=Object.assign({},e),i=a.type,o=a.message,s=a.title,delete a.type,delete a.message,delete a.title):"object"==typeof t?(a=Object.assign({},t),i=e,o=a.message,s=a.title,delete a.message,delete a.title):"object"==typeof n?(a=Object.assign({},n),i=e,o=t,s=a.title,delete a.title):(i=e,o=t,s=n,a=r||{}),!i)throw new Error("Type is required for notifications");if(null==o)throw new Error("Message is required for notifications");const l={type:i,message:o,title:s||i,options:a,metadata:{plugin:""}};this.renderOptions(a),this.renderEnvelopes([l])}}const u=new class extends c{constructor(){super(...arguments),this.defaultOptions={timeout:1e4}}renderEnvelopes(e){(null==e?void 0:e.length)&&e.forEach((e=>{try{const t=Object.assign({text:e.message,type:e.type},this.defaultOptions);e.options&&Object.assign(t,e.options);const n=new l(t);n.show();const r=n.layoutDom;r&&"object"==typeof r.dataset&&(r.dataset.turboTemporary="")}catch(t){console.error("PHPFlasher Noty: Error rendering notification",t,e)}}))}renderOptions(e){e&&(Object.assign(this.defaultOptions,e),l.overrideDefaults(this.defaultOptions))}};i.A.addPlugin("noty",u);class d{success(e,t,n){this.flash("success",e,t,n)}error(e,t,n){this.flash("error",e,t,n)}info(e,t,n){this.flash("info",e,t,n)}warning(e,t,n){this.flash("warning",e,t,n)}flash(e,t,n,r){let i,o,s,a={};if("object"==typeof e?(a=Object.assign({},e),i=a.type,o=a.message,s=a.title,delete a.type,delete a.message,delete a.title):"object"==typeof t?(a=Object.assign({},t),i=e,o=a.message,s=a.title,delete a.message,delete a.title):"object"==typeof n?(a=Object.assign({},n),i=e,o=t,s=a.title,delete a.title):(i=e,o=t,s=n,a=r||{}),!i)throw new Error("Type is required for notifications");if(null==o)throw new Error("Message is required for notifications");const l={type:i,message:o,title:s||i,options:a,metadata:{plugin:""}};this.renderOptions(a),this.renderEnvelopes([l])}}var h,p=function(){return p=Object.assign||function(e){for(var t,n=1,r=arguments.length;n{var t;try{const n=Object.assign(Object.assign({},e),e.options);null===(t=this.notyf)||void 0===t||t.open(n)}catch(t){console.error("PHPFlasher Notyf: Error rendering notification",t,e)}}));try{if(this.notyf){const e=this.notyf.view.container,t=this.notyf.view.a11yContainer;e&&e.dataset&&(e.dataset.turboTemporary=""),t&&t.dataset&&(t.dataset.turboTemporary="")}}catch(e){console.error("PHPFlasher Notyf: Error setting Turbo compatibility",e)}}renderOptions(e){if(!e)return;const t=Object.assign({duration:e.duration||1e4},e);t.types=t.types||[],this.addTypeIfNotExists(t.types,{type:"info",className:"notyf__toast--info",background:"#5784E5",icon:{className:"notyf__icon--info",tagName:"i"}}),this.addTypeIfNotExists(t.types,{type:"warning",className:"notyf__toast--warning",background:"#E3A008",icon:{className:"notyf__icon--warning",tagName:"i"}}),this.notyf=this.notyf||new w(t)}initializeNotyf(){this.notyf||this.renderOptions({duration:1e4,position:{x:"right",y:"top"},dismissible:!0})}addTypeIfNotExists(e,t){e.some((e=>e.type===t.type))||e.push(t)}};i.A.addPlugin("notyf",b);var x=n(2325);function E(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function a(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;class C{success(e,t,n){this.flash("success",e,t,n)}error(e,t,n){this.flash("error",e,t,n)}info(e,t,n){this.flash("info",e,t,n)}warning(e,t,n){this.flash("warning",e,t,n)}flash(e,t,n,r){let i,o,s,a={};if("object"==typeof e?(a=Object.assign({},e),i=a.type,o=a.message,s=a.title,delete a.type,delete a.message,delete a.title):"object"==typeof t?(a=Object.assign({},t),i=e,o=a.message,s=a.title,delete a.message,delete a.title):"object"==typeof n?(a=Object.assign({},n),i=e,o=t,s=a.title,delete a.title):(i=e,o=t,s=n,a=r||{}),!i)throw new Error("Type is required for notifications");if(null==o)throw new Error("Message is required for notifications");const l={type:i,message:o,title:s||i,options:a,metadata:{plugin:""}};this.renderOptions(a),this.renderEnvelopes([l])}}const k=new class extends C{renderEnvelopes(e){return E(this,void 0,void 0,(function*(){this.sweetalert||this.initializeSweetAlert();try{for(const t of e)yield this.renderEnvelope(t)}catch(e){console.error("PHPFlasher SweetAlert: Error rendering envelopes",e)}}))}renderOptions(e){try{this.sweetalert=this.sweetalert||x.mixin(Object.assign({timer:e.timer||1e4,timerProgressBar:e.timerProgressBar||!0},e)),this.setupTurboCompatibility()}catch(e){console.error("PHPFlasher SweetAlert: Error applying options",e)}}renderEnvelope(e){return E(this,void 0,void 0,(function*(){var t;try{let{options:n}=e;n=Object.assign(Object.assign({},n),{icon:(null==n?void 0:n.icon)||e.type,text:(null==n?void 0:n.text)||e.message});const r=yield null===(t=this.sweetalert)||void 0===t?void 0:t.fire(n);this.dispatchResultEvent(r,e)}catch(t){console.error("PHPFlasher SweetAlert: Error rendering envelope",t,e)}}))}initializeSweetAlert(){this.sweetalert||this.renderOptions({timer:1e4,timerProgressBar:!0})}setupTurboCompatibility(){document.addEventListener("turbo:before-cache",(()=>{if(x.isVisible()){const e=x.getPopup();e&&e.style.setProperty("animation-duration","0ms"),x.close()}}))}dispatchResultEvent(e,t){e&&window.dispatchEvent(new CustomEvent("flasher:sweetalert:promise",{detail:{promise:e,envelope:t}}))}};i.A.addPlugin("sweetalert",k),window.flasher=i.A;var A=class extends r.xI{connect(){this.initializeCodeBlocks()}initializeCodeBlocks(){document.querySelectorAll("pre > code").forEach((e=>{e.textContent.trim().startsWith("#/")&&this.addTryItButtonToCodeBlock(e)}))}addTryItButtonToCodeBlock(e){const t=document.createElement("button");t.className="tryit text-indigo-500",t.type="button",t.ariaLabel=t.title="Try it!",t.innerHTML='',e.parentElement.classList.add("tryable"),e.parentElement.append(t),t.addEventListener("click",(()=>this.handleTryItButtonClick(t,e.textContent.trim())))}handleTryItButtonClick(e,t){e.innerHTML='';const n=this.defineThemes(),r=t.split("\n")[0].trim();try{"#/ flasher darkMode"===r?this.toggleDarkMode(r):r in n?this.applyTheme(r,n):Array.isArray(window.messages[r])?window.messages[r].forEach(this.flash.bind(this)):this.flash(window.messages[r])}catch(e){console.error(e)}finally{setTimeout((()=>e.innerHTML=''),500)}}toggleDarkMode(e){document.documentElement.classList.add("dark"),this.flash(window.messages[e]),setTimeout((()=>document.documentElement.classList.remove("dark")),5e3)}applyTheme(e,t){n(9941)(`./${t[e]}`).then((()=>{window.messages[e].forEach(this.flash.bind(this))}))}defineThemes(){return{"#/ noty theme sunset":"sunset.css","#/ noty theme relax":"relax.css","#/ noty theme light":"light.css","#/ noty theme metroui":"metroui.css"}}flash(e){let{handler:t,type:n,message:r,title:o,options:s}=e;const a=i.A.use(t);a&&a.flash(n,r,o,s)}}},1835:function(e,t,n){"use strict";n.r(t);var r=n(2891);t.default=class extends r.xI{connect(){this.container=document.querySelector("#anchor-navigation"),this.container&&(this.createAnchorNavigation(),this.highlightCurrentAnchor(),this.stickyHeight(),this.setupEventListeners())}createAnchorNavigation(){const e=this.container.querySelector("ul"),t=document.querySelectorAll("#main-article h3, #main-article h2, #main-article a.anchor");0!==t.length?(this.container.classList.add("lg:block"),t.forEach((t=>{const n=this.createNavItem(t);e.appendChild(n)}))):this.container.remove()}createNavItem(e){const t=document.createElement("li");t.className="px-6 rounded w-full","A"===e.tagName&&(t.className="px-12 rounded w-full");const n=document.createElement("a");return n.href="A"===e.tagName?e.hash:`#${e.getAttribute("id")}`,n.innerHTML="A"===e.tagName?e.textContent:`${e.textContent}`,n.className="leading-loose text-md inline-block w-full text-indigo-500",t.appendChild(n),t}highlightCurrentAnchor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:window.location.hash;if(0===e.length)return;document.querySelectorAll("a.anchor, #anchor-navigation ul li a").forEach((t=>{const n=t.parentElement;e===t.hash?(t.classList.remove("text-gray-900"),t.classList.add("text-white"),n.classList.add("bg-indigo-500")):(t.classList.add("text-gray-900"),t.classList.remove("text-white"),n.classList.remove("bg-indigo-500"))}))}stickyHeight(){const e=document.querySelector("#main-article");document.querySelectorAll(".sticky").forEach((t=>{if(t.offsetHeight>window.innerHeight&&e.clientHeight>t.offsetHeight){const e=document.createElement("div");e.className="h-screen overflow-y-auto",e.innerHTML=t.innerHTML,t.innerHTML=e.outerHTML}}))}setupEventListeners(){this.container.querySelectorAll("a").forEach((e=>{e.addEventListener("click",(t=>{t.preventDefault(),window.location.hash=e.hash,this.highlightCurrentAnchor(e.hash)}))}))}}},1860:function(e,t,n){var r=n(9900);t.encode=function(e){var t,n="",i=function(e){return e<0?1+(-e<<1):0+(e<<1)}(e);do{t=31&i,(i>>>=5)>0&&(t|=32),n+=r.encode(t)}while(i>0);return n},t.decode=function(e,t,n){var i,o,s,a,l=e.length,c=0,u=0;do{if(t>=l)throw new Error("Expected more digits in base 64 VLQ value.");if(-1===(o=r.decode(e.charCodeAt(t++))))throw new Error("Invalid base64 digit: "+e.charAt(t-1));i=!!(32&o),c+=(o&=31)<>1,1&~s?a:-a),n.rest=t}},1880:function(e,t,n){"use strict";n.r(t);var r=n(2891),i=n(1061);t.default=class extends r.xI{connect(){(0,i.b)("noty")}}},1945:function(e,t,n){var r=n(1860),i=n(3835),o=n(671).C,s=n(7238).P;function a(e){e||(e={}),this._file=i.getArg(e,"file",null),this._sourceRoot=i.getArg(e,"sourceRoot",null),this._skipValidation=i.getArg(e,"skipValidation",!1),this._sources=new o,this._names=new o,this._mappings=new s,this._sourcesContents=null}a.prototype._version=3,a.fromSourceMap=function(e){var t=e.sourceRoot,n=new a({file:e.file,sourceRoot:t});return e.eachMapping((function(e){var r={generated:{line:e.generatedLine,column:e.generatedColumn}};null!=e.source&&(r.source=e.source,null!=t&&(r.source=i.relative(t,r.source)),r.original={line:e.originalLine,column:e.originalColumn},null!=e.name&&(r.name=e.name)),n.addMapping(r)})),e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&n.setSourceContent(t,r)})),n},a.prototype.addMapping=function(e){var t=i.getArg(e,"generated"),n=i.getArg(e,"original",null),r=i.getArg(e,"source",null),o=i.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,r,o),null!=r&&(r=String(r),this._sources.has(r)||this._sources.add(r)),null!=o&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:null!=n&&n.line,originalColumn:null!=n&&n.column,source:r,name:o})},a.prototype.setSourceContent=function(e,t){var n=e;null!=this._sourceRoot&&(n=i.relative(this._sourceRoot,n)),null!=t?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[i.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[i.toSetString(n)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},a.prototype.applySourceMap=function(e,t,n){var r=t;if(null==t){if(null==e.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\'s "file" property. Both were omitted.');r=e.file}var s=this._sourceRoot;null!=s&&(r=i.relative(s,r));var a=new o,l=new o;this._mappings.unsortedForEach((function(t){if(t.source===r&&null!=t.originalLine){var o=e.originalPositionFor({line:t.originalLine,column:t.originalColumn});null!=o.source&&(t.source=o.source,null!=n&&(t.source=i.join(n,t.source)),null!=s&&(t.source=i.relative(s,t.source)),t.originalLine=o.line,t.originalColumn=o.column,null!=o.name&&(t.name=o.name))}var c=t.source;null==c||a.has(c)||a.add(c);var u=t.name;null==u||l.has(u)||l.add(u)}),this),this._sources=a,this._names=l,e.sources.forEach((function(t){var r=e.sourceContentFor(t);null!=r&&(null!=n&&(t=i.join(n,t)),null!=s&&(t=i.relative(s,t)),this.setSourceContent(t,r))}),this)},a.prototype._validateMapping=function(e,t,n,r){if((!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0)||t||n||r)&&!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:r}))},a.prototype._serializeMappings=function(){for(var e,t,n,o,s=0,a=1,l=0,c=0,u=0,d=0,h="",p=this._mappings.toArray(),f=0,m=p.length;f0){if(!i.compareByGeneratedPositionsInflated(t,p[f-1]))continue;e+=","}e+=r.encode(t.generatedColumn-s),s=t.generatedColumn,null!=t.source&&(o=this._sources.indexOf(t.source),e+=r.encode(o-d),d=o,e+=r.encode(t.originalLine-1-c),c=t.originalLine-1,e+=r.encode(t.originalColumn-l),l=t.originalColumn,null!=t.name&&(n=this._names.indexOf(t.name),e+=r.encode(n-u),u=n)),h+=e}return h},a.prototype._generateSourcesContent=function(e,t){return e.map((function(e){if(!this._sourcesContents)return null;null!=t&&(e=i.relative(t,e));var n=i.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)},a.prototype.toJSON=function(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(e.file=this._file),null!=this._sourceRoot&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e},a.prototype.toString=function(){return JSON.stringify(this.toJSON())},t.SourceMapGenerator=a},2325:function(e){e.exports=function(){"use strict";function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function n(t,n){return t.get(e(t,n))}function r(e,n,r){t(e,n),n.set(e,r)}function i(t,n,r){return t.set(e(t,n),r),r}const o=100,s={},a=()=>{s.previousActiveElement instanceof HTMLElement?(s.previousActiveElement.focus(),s.previousActiveElement=null):document.body&&document.body.focus()},l=e=>new Promise((t=>{if(!e)return t();const n=window.scrollX,r=window.scrollY;s.restoreFocusTimeout=setTimeout((()=>{a(),t()}),o),window.scrollTo(n,r)})),c="swal2-",u=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","default-outline","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","draggable","dragging"].reduce(((e,t)=>(e[t]=c+t,e)),{}),d=["success","warning","info","question","error"].reduce(((e,t)=>(e[t]=c+t,e)),{}),h="SweetAlert2:",p=e=>e.charAt(0).toUpperCase()+e.slice(1),f=e=>{console.warn(`${h} ${"object"==typeof e?e.join(" "):e}`)},m=e=>{console.error(`${h} ${e}`)},g=[],y=e=>{g.includes(e)||(g.push(e),f(e))},v=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;y(`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`)},w=e=>"function"==typeof e?e():e,b=e=>e&&"function"==typeof e.toPromise,x=e=>b(e)?e.toPromise():Promise.resolve(e),E=e=>e&&Promise.resolve(e)===e,C=()=>document.body.querySelector(`.${u.container}`),k=e=>{const t=C();return t?t.querySelector(e):null},A=e=>k(`.${e}`),O=()=>A(u.popup),S=()=>A(u.icon),T=()=>A(u["icon-content"]),_=()=>A(u.title),N=()=>A(u["html-container"]),P=()=>A(u.image),L=()=>A(u["progress-steps"]),j=()=>A(u["validation-message"]),M=()=>k(`.${u.actions} .${u.confirm}`),D=()=>k(`.${u.actions} .${u.cancel}`),F=()=>k(`.${u.actions} .${u.deny}`),$=()=>A(u["input-label"]),R=()=>k(`.${u.loader}`),B=()=>A(u.actions),q=()=>A(u.footer),H=()=>A(u["timer-progress-bar"]),I=()=>A(u.close),z='\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex="0"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n',U=()=>{const e=O();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort(((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),r=parseInt(t.getAttribute("tabindex")||"0");return n>r?1:n"-1"!==e.getAttribute("tabindex")));return[...new Set(n.concat(i))].filter((e=>ue(e)))},V=()=>X(document.body,u.shown)&&!X(document.body,u["toast-shown"])&&!X(document.body,u["no-backdrop"]),W=()=>{const e=O();return!!e&&X(e,u.toast)},K=()=>{const e=O();return!!e&&e.hasAttribute("data-loading")},G=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),r=n.querySelector("head");r&&Array.from(r.childNodes).forEach((t=>{e.appendChild(t)}));const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach((t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)}))}},X=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{Array.from(e.classList).forEach((n=>{Object.values(u).includes(n)||Object.values(d).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)}))},J=(e,t,n)=>{if(Y(e,t),!t.customClass)return;const r=t.customClass[n];r&&("string"==typeof r||r.forEach?te(e,r):f(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof r}"`))},Z=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${u.popup} > .${u[t]}`);case"checkbox":return e.querySelector(`.${u.popup} > .${u.checkbox} input`);case"radio":return e.querySelector(`.${u.popup} > .${u.radio} input:checked`)||e.querySelector(`.${u.popup} > .${u.radio} input:first-child`);case"range":return e.querySelector(`.${u.popup} > .${u.range} input`);default:return e.querySelector(`.${u.popup} > .${u.input}`)}},Q=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},ee=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach((t=>{Array.isArray(e)?e.forEach((e=>{n?e.classList.add(t):e.classList.remove(t)})):n?e.classList.add(t):e.classList.remove(t)})))},te=(e,t)=>{ee(e,t,!0)},ne=(e,t)=>{ee(e,t,!1)},re=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(n)}`&&(n=parseInt(n)),n||0===parseInt(n)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},oe=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"flex";e&&(e.style.display=t)},se=e=>{e&&(e.style.display="none")},ae=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"block";e&&new MutationObserver((()=>{ce(e,e.innerHTML,t)})).observe(e,{childList:!0,subtree:!0})},le=(e,t,n,r)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,r)},ce=function(e,t){t?oe(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:"flex"):se(e)},ue=e=>!(!e||!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),de=()=>!ue(M())&&!ue(F())&&!ue(D()),he=e=>!!(e.scrollHeight>e.clientHeight),pe=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),r=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||r>0},fe=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=H();n&&ue(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout((()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"}),10))},me=()=>{const e=H();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`},ge=()=>"undefined"==typeof window||"undefined"==typeof document,ye=`\n
\n \n
    \n
    \n \n

    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n`.replace(/(^|\n)\s*/g,""),ve=()=>{const e=C();return!!e&&(e.remove(),ne([document.documentElement,document.body],[u["no-backdrop"],u["toast-shown"],u["has-column"]]),!0)},we=()=>{s.currentInstance.resetValidationMessage()},be=()=>{const e=O(),t=re(e,u.input),n=re(e,u.file),r=e.querySelector(`.${u.range} input`),i=e.querySelector(`.${u.range} output`),o=re(e,u.select),s=e.querySelector(`.${u.checkbox} input`),a=re(e,u.textarea);t.oninput=we,n.onchange=we,o.onchange=we,s.onchange=we,a.oninput=we,r.oninput=()=>{we(),i.value=r.value},r.onchange=()=>{we(),i.value=r.value}},xe=e=>"string"==typeof e?document.querySelector(e):e,Ee=e=>{const t=O();t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true")},Ce=e=>{"rtl"===window.getComputedStyle(e).direction&&te(C(),u.rtl)},ke=e=>{const t=ve();if(ge())return void m("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=u.container,t&&te(n,u["no-transition"]),G(n,ye),n.dataset.swal2Theme=e.theme;const r=xe(e.target);r.appendChild(n),Ee(e),Ce(r),be()},Ae=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?Oe(e,t):e&&G(t,e)},Oe=(e,t)=>{e.jquery?Se(t,e):G(t,e.toString())},Se=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},Te=(e,t)=>{const n=B(),r=R();n&&r&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?oe(n):se(n),J(n,t,"actions"),_e(n,r,t),G(r,t.loaderHtml||""),J(r,t,"loader"))};function _e(e,t,n){const r=M(),i=F(),o=D();r&&i&&o&&(Pe(r,"confirm",n),Pe(i,"deny",n),Pe(o,"cancel",n),Ne(r,i,o,n),n.reverseButtons&&(n.toast?(e.insertBefore(o,r),e.insertBefore(i,r)):(e.insertBefore(o,t),e.insertBefore(i,t),e.insertBefore(r,t))))}function Ne(e,t,n,r){r.buttonsStyling?(te([e,t,n],u.styled),r.confirmButtonColor&&(e.style.backgroundColor=r.confirmButtonColor,te(e,u["default-outline"])),r.denyButtonColor&&(t.style.backgroundColor=r.denyButtonColor,te(t,u["default-outline"])),r.cancelButtonColor&&(n.style.backgroundColor=r.cancelButtonColor,te(n,u["default-outline"]))):ne([e,t,n],u.styled)}function Pe(e,t,n){const r=p(t);ce(e,n[`show${r}Button`],"inline-block"),G(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=u[t],J(e,n,`${t}Button`)}const Le=(e,t)=>{const n=I();n&&(G(n,t.closeButtonHtml||""),J(n,t,"closeButton"),ce(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))},je=(e,t)=>{const n=C();n&&(Me(n,t.backdrop),De(n,t.position),Fe(n,t.grow),J(n,t,"container"))};function Me(e,t){"string"==typeof t?e.style.background=t:t||te([document.documentElement,document.body],u["no-backdrop"])}function De(e,t){t&&(t in u?te(e,u[t]):(f('The "position" parameter is not valid, defaulting to "center"'),te(e,u.center)))}function Fe(e,t){t&&te(e,u[`grow-${t}`])}var $e={innerParams:new WeakMap,domCache:new WeakMap};const Re=["input","file","range","select","radio","checkbox","textarea"],Be=(e,t)=>{const n=O();if(!n)return;const r=$e.innerParams.get(e),i=!r||t.input!==r.input;Re.forEach((e=>{const r=re(n,u[e]);r&&(Ie(e,t.inputAttributes),r.className=u[e],i&&se(r))})),t.input&&(i&&qe(t),ze(t))},qe=e=>{if(!e.input)return;if(!Ge[e.input])return void m(`Unexpected type of input! Expected ${Object.keys(Ge).join(" | ")}, got "${e.input}"`);const t=We(e.input);if(!t)return;const n=Ge[e.input](t,e);oe(t),e.inputAutoFocus&&setTimeout((()=>{Q(n)}))},He=e=>{for(let t=0;t{const n=O();if(!n)return;const r=Z(n,e);if(r){He(r);for(const e in t)r.setAttribute(e,t[e])}},ze=e=>{if(!e.input)return;const t=We(e.input);t&&J(t,e,"input")},Ue=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},Ve=(e,t,n)=>{if(n.inputLabel){const r=document.createElement("label"),i=u["input-label"];r.setAttribute("for",e.id),r.className=i,"object"==typeof n.customClass&&te(r,n.customClass.inputLabel),r.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",r)}},We=e=>{const t=O();if(t)return re(t,u[e]||u.input)},Ke=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:E(t)||f(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ge={};Ge.text=Ge.email=Ge.password=Ge.number=Ge.tel=Ge.url=Ge.search=Ge.date=Ge["datetime-local"]=Ge.time=Ge.week=Ge.month=(e,t)=>(Ke(e,t.inputValue),Ve(e,e,t),Ue(e,t),e.type=t.input,e),Ge.file=(e,t)=>(Ve(e,e,t),Ue(e,t),e),Ge.range=(e,t)=>{const n=e.querySelector("input"),r=e.querySelector("output");return Ke(n,t.inputValue),n.type=t.input,Ke(r,t.inputValue),Ve(n,e,t),e},Ge.select=(e,t)=>{if(e.textContent="",t.inputPlaceholder){const n=document.createElement("option");G(n,t.inputPlaceholder),n.value="",n.disabled=!0,n.selected=!0,e.appendChild(n)}return Ve(e,e,t),e},Ge.radio=e=>(e.textContent="",e),Ge.checkbox=(e,t)=>{const n=Z(O(),"checkbox");n.value="1",n.checked=Boolean(t.inputValue);const r=e.querySelector("span");return G(r,t.inputPlaceholder||t.inputLabel),n},Ge.textarea=(e,t)=>{Ke(e,t.inputValue),Ue(e,t),Ve(e,e,t);const n=e=>parseInt(window.getComputedStyle(e).marginLeft)+parseInt(window.getComputedStyle(e).marginRight);return setTimeout((()=>{if("MutationObserver"in window){const r=parseInt(window.getComputedStyle(O()).width);new MutationObserver((()=>{if(!document.body.contains(e))return;const i=e.offsetWidth+n(e);i>r?O().style.width=`${i}px`:ie(O(),"width",t.width)})).observe(e,{attributes:!0,attributeFilter:["style"]})}})),e};const Xe=(e,t)=>{const n=N();n&&(ae(n),J(n,t,"htmlContainer"),t.html?(Ae(t.html,n),oe(n,"block")):t.text?(n.textContent=t.text,oe(n,"block")):se(n),Be(e,t))},Ye=(e,t)=>{const n=q();n&&(ae(n),ce(n,t.footer,"block"),t.footer&&Ae(t.footer,n),J(n,t,"footer"))},Je=(e,t)=>{const n=$e.innerParams.get(e),r=S();if(r){if(n&&t.icon===n.icon)return nt(r,t),void Ze(r,t);if(t.icon||t.iconHtml){if(t.icon&&-1===Object.keys(d).indexOf(t.icon))return m(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void se(r);oe(r),nt(r,t),Ze(r,t),te(r,t.showClass&&t.showClass.icon),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",Qe)}else se(r)}},Ze=(e,t)=>{for(const[n,r]of Object.entries(d))t.icon!==n&&ne(e,r);te(e,t.icon&&d[t.icon]),rt(e,t),Qe(),J(e,t,"icon")},Qe=()=>{const e=O();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e\n \n
    \n
    \n',tt='\n \n \n \n \n',nt=(e,t)=>{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,r="";t.iconHtml?r=it(t.iconHtml):"success"===t.icon?(r=et,n=n.replace(/ style=".*?"/g,"")):"error"===t.icon?r=tt:t.icon&&(r=it({question:"?",warning:"!",info:"i"}[t.icon])),n.trim()!==r.trim()&&G(e,r)},rt=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])le(e,n,"background-color",t.iconColor);le(e,".swal2-success-ring","border-color",t.iconColor)}},it=e=>`
    ${e}
    `,ot=(e,t)=>{const n=P();n&&(t.imageUrl?(oe(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),ie(n,"width",t.imageWidth),ie(n,"height",t.imageHeight),n.className=u.image,J(n,t,"image")):se(n))};let st=!1,at=0,lt=0,ct=0,ut=0;const dt=e=>{e.addEventListener("mousedown",pt),document.body.addEventListener("mousemove",ft),e.addEventListener("mouseup",mt),e.addEventListener("touchstart",pt),document.body.addEventListener("touchmove",ft),e.addEventListener("touchend",mt)},ht=e=>{e.removeEventListener("mousedown",pt),document.body.removeEventListener("mousemove",ft),e.removeEventListener("mouseup",mt),e.removeEventListener("touchstart",pt),document.body.removeEventListener("touchmove",ft),e.removeEventListener("touchend",mt)},pt=e=>{const t=O();if(e.target===t||S().contains(e.target)){st=!0;const n=gt(e);at=n.clientX,lt=n.clientY,ct=parseInt(t.style.insetInlineStart)||0,ut=parseInt(t.style.insetBlockStart)||0,te(t,"swal2-dragging")}},ft=e=>{const t=O();if(st){let{clientX:n,clientY:r}=gt(e);t.style.insetInlineStart=`${ct+(n-at)}px`,t.style.insetBlockStart=`${ut+(r-lt)}px`}},mt=()=>{const e=O();st=!1,ne(e,"swal2-dragging")},gt=e=>{let t=0,n=0;return e.type.startsWith("mouse")?(t=e.clientX,n=e.clientY):e.type.startsWith("touch")&&(t=e.touches[0].clientX,n=e.touches[0].clientY),{clientX:t,clientY:n}},yt=(e,t)=>{const n=C(),r=O();if(n&&r){if(t.toast){ie(n,"width",t.width),r.style.width="100%";const e=R();e&&r.insertBefore(e,S())}else ie(r,"width",t.width);ie(r,"padding",t.padding),t.color&&(r.style.color=t.color),t.background&&(r.style.background=t.background),se(j()),vt(r,t),t.draggable&&!t.toast?(te(r,u.draggable),dt(r)):(ne(r,u.draggable),ht(r))}},vt=(e,t)=>{const n=t.showClass||{};e.className=`${u.popup} ${ue(e)?n.popup:""}`,t.toast?(te([document.documentElement,document.body],u["toast-shown"]),te(e,u.toast)):te(e,u.modal),J(e,t,"popup"),"string"==typeof t.customClass&&te(e,t.customClass),t.icon&&te(e,u[`icon-${t.icon}`])},wt=(e,t)=>{const n=L();if(!n)return;const{progressSteps:r,currentProgressStep:i}=t;r&&0!==r.length&&void 0!==i?(oe(n),n.textContent="",i>=r.length&&f("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),r.forEach(((e,o)=>{const s=bt(e);if(n.appendChild(s),o===i&&te(s,u["active-progress-step"]),o!==r.length-1){const e=xt(t);n.appendChild(e)}}))):se(n)},bt=e=>{const t=document.createElement("li");return te(t,u["progress-step"]),G(t,e),t},xt=e=>{const t=document.createElement("li");return te(t,u["progress-step-line"]),e.progressStepsDistance&&ie(t,"width",e.progressStepsDistance),t},Et=(e,t)=>{const n=_();n&&(ae(n),ce(n,t.title||t.titleText,"block"),t.title&&Ae(t.title,n),t.titleText&&(n.innerText=t.titleText),J(n,t,"title"))},Ct=(e,t)=>{yt(e,t),je(e,t),wt(e,t),Je(e,t),ot(e,t),Et(e,t),Le(e,t),Xe(e,t),Te(e,t),Ye(e,t);const n=O();"function"==typeof t.didRender&&n&&t.didRender(n),s.eventEmitter.emit("didRender",n)},kt=()=>ue(O()),At=()=>{var e;return null===(e=M())||void 0===e?void 0:e.click()},Ot=()=>{var e;return null===(e=F())||void 0===e?void 0:e.click()},St=()=>{var e;return null===(e=D())||void 0===e?void 0:e.click()},Tt=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),_t=e=>{e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1)},Nt=(e,t,n)=>{_t(e),t.toast||(e.keydownHandler=e=>Mt(t,e,n),e.keydownTarget=t.keydownListenerCapture?window:O(),e.keydownListenerCapture=t.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)},Pt=(e,t)=>{var n;const r=U();if(r.length)return(e+=t)===r.length?e=0:-1===e&&(e=r.length-1),void r[e].focus();null===(n=O())||void 0===n||n.focus()},Lt=["ArrowRight","ArrowDown"],jt=["ArrowLeft","ArrowUp"],Mt=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Dt(t,e):"Tab"===t.key?Ft(t):[...Lt,...jt].includes(t.key)?$t(t.key):"Escape"===t.key&&Rt(t,e,n)))},Dt=(e,t)=>{if(!w(t.allowEnterKey))return;const n=Z(O(),t.input);if(e.target&&n&&e.target instanceof HTMLElement&&e.target.outerHTML===n.outerHTML){if(["textarea","file"].includes(t.input))return;At(),e.preventDefault()}},Ft=e=>{const t=e.target,n=U();let r=-1;for(let e=0;e{const t=B(),n=M(),r=F(),i=D();if(!(t&&n&&r&&i))return;const o=[n,r,i];if(document.activeElement instanceof HTMLElement&&!o.includes(document.activeElement))return;const s=Lt.includes(e)?"nextElementSibling":"previousElementSibling";let a=document.activeElement;if(a){for(let e=0;e{w(t.allowEscapeKey)&&(e.preventDefault(),n(Tt.esc))};var Bt={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const qt=()=>{const e=C();Array.from(document.body.children).forEach((t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))}))},Ht=()=>{Array.from(document.body.children).forEach((e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")}))},It="undefined"!=typeof window&&!!window.GestureEvent,zt=()=>{if(It&&!X(document.body,u.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",te(document.body,u.iosfix),Ut()}},Ut=()=>{const e=C();if(!e)return;let t;e.ontouchstart=e=>{t=Vt(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},Vt=e=>{const t=e.target,n=C(),r=N();return!(!n||!r||Wt(e)||Kt(e)||t!==n&&(he(n)||!(t instanceof HTMLElement)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||he(r)&&r.contains(t)))},Wt=e=>e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType,Kt=e=>e.touches&&e.touches.length>1,Gt=()=>{if(X(document.body,u.iosfix)){const e=parseInt(document.body.style.top,10);ne(document.body,u.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}},Xt=()=>{const e=document.createElement("div");e.className=u["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t};let Yt=null;const Jt=e=>{null===Yt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(Yt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${Yt+Xt()}px`)},Zt=()=>{null!==Yt&&(document.body.style.paddingRight=`${Yt}px`,Yt=null)};function Qt(e,t,n,r){W()?cn(e,r):(l(n).then((()=>cn(e,r))),_t(s)),It?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),V()&&(Zt(),Gt(),Ht()),en()}function en(){ne([document.documentElement,document.body],[u.shown,u["height-auto"],u["no-backdrop"],u["toast-shown"]])}function tn(e){e=sn(e);const t=Bt.swalPromiseResolve.get(this),n=nn(this);this.isAwaitingPromise?e.isDismissed||(on(this),t(e)):n&&t(e)}const nn=e=>{const t=O();if(!t)return!1;const n=$e.innerParams.get(e);if(!n||X(t,n.hideClass.popup))return!1;ne(t,n.showClass.popup),te(t,n.hideClass.popup);const r=C();return ne(r,n.showClass.backdrop),te(r,n.hideClass.backdrop),an(e,t,n),!0};function rn(e){const t=Bt.swalPromiseReject.get(this);on(this),t&&t(e)}const on=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,$e.innerParams.get(e)||e._destroy())},sn=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),an=(e,t,n)=>{var r;const i=C(),o=pe(t);"function"==typeof n.willClose&&n.willClose(t),null===(r=s.eventEmitter)||void 0===r||r.emit("willClose",t),o?ln(e,t,i,n.returnFocus,n.didClose):Qt(e,i,n.returnFocus,n.didClose)},ln=(e,t,n,r,i)=>{s.swalCloseEventFinishedCallback=Qt.bind(null,e,n,r,i);const o=function(e){var n;e.target===t&&(null===(n=s.swalCloseEventFinishedCallback)||void 0===n||n.call(s),delete s.swalCloseEventFinishedCallback,t.removeEventListener("animationend",o),t.removeEventListener("transitionend",o))};t.addEventListener("animationend",o),t.addEventListener("transitionend",o)},cn=(e,t)=>{setTimeout((()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=s.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()}))},un=e=>{let t=O();if(t||new pi,t=O(),!t)return;const n=R();W()?se(S()):dn(t,e),oe(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},dn=(e,t)=>{const n=B(),r=R();n&&r&&(!t&&ue(M())&&(t=M()),oe(n),t&&(se(t),r.setAttribute("data-button-to-replace",t.className),n.insertBefore(r,t)),te([e,n],u.loading))},hn=(e,t)=>{"select"===t.input||"radio"===t.input?yn(e,t):["text","email","number","tel","textarea"].some((e=>e===t.input))&&(b(t.inputValue)||E(t.inputValue))&&(un(M()),vn(e,t))},pn=(e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return fn(n);case"radio":return mn(n);case"file":return gn(n);default:return t.inputAutoTrim?n.value.trim():n.value}},fn=e=>e.checked?1:0,mn=e=>e.checked?e.value:null,gn=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,yn=(e,t)=>{const n=O();if(!n)return;const r=e=>{"select"===t.input?wn(n,xn(e),t):"radio"===t.input&&bn(n,xn(e),t)};b(t.inputOptions)||E(t.inputOptions)?(un(M()),x(t.inputOptions).then((t=>{e.hideLoading(),r(t)}))):"object"==typeof t.inputOptions?r(t.inputOptions):m("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},vn=(e,t)=>{const n=e.getInput();n&&(se(n),x(t.inputValue).then((r=>{n.value="number"===t.input?`${parseFloat(r)||0}`:`${r}`,oe(n),n.focus(),e.hideLoading()})).catch((t=>{m(`Error in inputValue promise: ${t}`),n.value="",oe(n),n.focus(),e.hideLoading()})))};function wn(e,t,n){const r=re(e,u.select);if(!r)return;const i=(e,t,r)=>{const i=document.createElement("option");i.value=r,G(i,t),i.selected=En(r,n.inputValue),e.appendChild(i)};t.forEach((e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,r.appendChild(e),n.forEach((t=>i(e,t[1],t[0])))}else i(r,n,t)})),r.focus()}function bn(e,t,n){const r=re(e,u.radio);if(!r)return;t.forEach((e=>{const t=e[0],i=e[1],o=document.createElement("input"),s=document.createElement("label");o.type="radio",o.name=u.radio,o.value=t,En(t,n.inputValue)&&(o.checked=!0);const a=document.createElement("span");G(a,i),a.className=u.label,s.appendChild(o),s.appendChild(a),r.appendChild(s)}));const i=r.querySelectorAll("input");i.length&&i[0].focus()}const xn=e=>{const t=[];return e instanceof Map?e.forEach(((e,n)=>{let r=e;"object"==typeof r&&(r=xn(r)),t.push([n,r])})):Object.keys(e).forEach((n=>{let r=e[n];"object"==typeof r&&(r=xn(r)),t.push([n,r])})),t},En=(e,t)=>!!t&&t.toString()===e.toString(),Cn=e=>{const t=$e.innerParams.get(e);e.disableButtons(),t.input?On(e,"confirm"):Pn(e,!0)},kn=e=>{const t=$e.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?On(e,"deny"):Tn(e,!1)},An=(e,t)=>{e.disableButtons(),t(Tt.cancel)},On=(e,t)=>{const n=$e.innerParams.get(e);if(!n.input)return void m(`The "input" parameter is needed to be set when using returnInputValueOn${p(t)}`);const r=e.getInput(),i=pn(e,n);n.inputValidator?Sn(e,i,t):r&&!r.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||r.validationMessage)):"deny"===t?Tn(e,i):Pn(e,i)},Sn=(e,t,n)=>{const r=$e.innerParams.get(e);e.disableInput(),Promise.resolve().then((()=>x(r.inputValidator(t,r.validationMessage)))).then((r=>{e.enableButtons(),e.enableInput(),r?e.showValidationMessage(r):"deny"===n?Tn(e,t):Pn(e,t)}))},Tn=(e,t)=>{const n=$e.innerParams.get(e||void 0);n.showLoaderOnDeny&&un(F()),n.preDeny?(e.isAwaitingPromise=!0,Promise.resolve().then((()=>x(n.preDeny(t,n.validationMessage)))).then((n=>{!1===n?(e.hideLoading(),on(e)):e.close({isDenied:!0,value:void 0===n?t:n})})).catch((t=>Nn(e||void 0,t)))):e.close({isDenied:!0,value:t})},_n=(e,t)=>{e.close({isConfirmed:!0,value:t})},Nn=(e,t)=>{e.rejectPromise(t)},Pn=(e,t)=>{const n=$e.innerParams.get(e||void 0);n.showLoaderOnConfirm&&un(),n.preConfirm?(e.resetValidationMessage(),e.isAwaitingPromise=!0,Promise.resolve().then((()=>x(n.preConfirm(t,n.validationMessage)))).then((n=>{ue(j())||!1===n?(e.hideLoading(),on(e)):_n(e,void 0===n?t:n)})).catch((t=>Nn(e||void 0,t)))):_n(e,t)};function Ln(){const e=$e.innerParams.get(this);if(!e)return;const t=$e.domCache.get(this);se(t.loader),W()?e.icon&&oe(S()):jn(t),ne([t.popup,t.actions],u.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const jn=e=>{const t=e.popup.getElementsByClassName(e.loader.getAttribute("data-button-to-replace"));t.length?oe(t[0],"inline-block"):de()&&se(e.actions)};function Mn(){const e=$e.innerParams.get(this),t=$e.domCache.get(this);return t?Z(t.popup,e.input):null}function Dn(e,t,n){const r=$e.domCache.get(e);t.forEach((e=>{r[e].disabled=n}))}function Fn(e,t){const n=O();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${u.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(zn,e),Gn=e=>-1!==Un.indexOf(e),Xn=e=>Vn[e],Yn=e=>{Kn(e)||f(`Unknown parameter "${e}"`)},Jn=e=>{Wn.includes(e)&&f(`The parameter "${e}" is incompatible with toasts`)},Zn=e=>{const t=Xn(e);t&&v(e,t)},Qn=e=>{!1===e.backdrop&&e.allowOutsideClick&&f('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),e.theme&&!["light","dark","auto","borderless"].includes(e.theme)&&f(`Invalid theme "${e.theme}". Expected "light", "dark", "auto", or "borderless"`);for(const t in e)Yn(t),e.toast&&Jn(t),Zn(t)};function er(e){const t=C(),n=O(),r=$e.innerParams.get(this);if(!n||X(n,r.hideClass.popup))return void f("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const i=tr(e),o=Object.assign({},r,i);Qn(o),t.dataset.swal2Theme=o.theme,Ct(this,o),$e.innerParams.set(this,o),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const tr=e=>{const t={};return Object.keys(e).forEach((n=>{Gn(n)?t[n]=e[n]:f(`Invalid parameter to update: ${n}`)})),t};function nr(){const e=$e.domCache.get(this),t=$e.innerParams.get(this);t?(e.popup&&s.swalCloseEventFinishedCallback&&(s.swalCloseEventFinishedCallback(),delete s.swalCloseEventFinishedCallback),"function"==typeof t.didDestroy&&t.didDestroy(),s.eventEmitter.emit("didDestroy"),rr(this)):ir(this)}const rr=e=>{ir(e),delete e.params,delete s.keydownHandler,delete s.keydownTarget,delete s.currentInstance},ir=e=>{e.isAwaitingPromise?(or($e,e),e.isAwaitingPromise=!0):(or(Bt,e),or($e,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},or=(e,t)=>{for(const n in e)e[n].delete(t)};var sr=Object.freeze({__proto__:null,_destroy:nr,close:tn,closeModal:tn,closePopup:tn,closeToast:tn,disableButtons:Rn,disableInput:qn,disableLoading:Ln,enableButtons:$n,enableInput:Bn,getInput:Mn,handleAwaitingPromise:on,hideLoading:Ln,rejectPromise:rn,resetValidationMessage:In,showValidationMessage:Hn,update:er});const ar=(e,t,n)=>{e.toast?lr(e,t,n):(dr(t),hr(t),pr(e,t,n))},lr=(e,t,n)=>{t.popup.onclick=()=>{e&&(cr(e)||e.timer||e.input)||n(Tt.close)}},cr=e=>!!(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let ur=!1;const dr=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(ur=!0)}}},hr=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(ur=!0)}}},pr=(e,t,n)=>{t.container.onclick=r=>{ur?ur=!1:r.target===t.container&&w(e.allowOutsideClick)&&n(Tt.backdrop)}},fr=e=>"object"==typeof e&&e.jquery,mr=e=>e instanceof Element||fr(e),gr=e=>{const t={};return"object"!=typeof e[0]||mr(e[0])?["title","html","icon"].forEach(((n,r)=>{const i=e[r];"string"==typeof i||mr(i)?t[n]=i:void 0!==i&&m(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)})):Object.assign(t,e[0]),t};function yr(){for(var e=arguments.length,t=new Array(e),n=0;ns.timeout&&s.timeout.getTimerLeft(),br=()=>{if(s.timeout)return me(),s.timeout.stop()},xr=()=>{if(s.timeout){const e=s.timeout.start();return fe(e),e}},Er=()=>{const e=s.timeout;return e&&(e.running?br():xr())},Cr=e=>{if(s.timeout){const t=s.timeout.increase(e);return fe(t,!0),t}},kr=()=>!(!s.timeout||!s.timeout.isRunning());let Ar=!1;const Or={};function Sr(){Or[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"data-swal-template"]=this,Ar||(document.body.addEventListener("click",Tr),Ar=!0)}const Tr=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in Or){const n=t.getAttribute(e);if(n)return void Or[e].fire({template:n})}};class _r{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){var n=this;const r=function(){n.removeListener(e,r);for(var i=arguments.length,o=new Array(i),s=0;s1?t-1:0),r=1;r{try{e.apply(this,n)}catch(e){console.error(e)}}))}removeListener(e,t){const n=this._getHandlersByEventName(e),r=n.indexOf(t);r>-1&&n.splice(r,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}}s.eventEmitter=new _r;const Nr=(e,t)=>{s.eventEmitter.on(e,t)},Pr=(e,t)=>{s.eventEmitter.once(e,t)},Lr=(e,t)=>{e?t?s.eventEmitter.removeListener(e,t):s.eventEmitter.removeAllListeners(e):s.eventEmitter.reset()};var jr=Object.freeze({__proto__:null,argsToParams:gr,bindClickHandler:Sr,clickCancel:St,clickConfirm:At,clickDeny:Ot,enableLoading:un,fire:yr,getActions:B,getCancelButton:D,getCloseButton:I,getConfirmButton:M,getContainer:C,getDenyButton:F,getFocusableElements:U,getFooter:q,getHtmlContainer:N,getIcon:S,getIconContent:T,getImage:P,getInputLabel:$,getLoader:R,getPopup:O,getProgressSteps:L,getTimerLeft:wr,getTimerProgressBar:H,getTitle:_,getValidationMessage:j,increaseTimer:Cr,isDeprecatedParameter:Xn,isLoading:K,isTimerRunning:kr,isUpdatableParameter:Gn,isValidParameter:Kn,isVisible:kt,mixin:vr,off:Lr,on:Nr,once:Pr,resumeTimer:xr,showLoading:un,stopTimer:br,toggleTimer:Er});class Mr{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const Dr=["swal-title","swal-html","swal-footer"],Fr=e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return Ur(n),Object.assign($r(n),Rr(n),Br(n),qr(n),Hr(n),Ir(n),zr(n,Dr))},$r=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach((e=>{Vr(e,["name","value"]);const n=e.getAttribute("name"),r=e.getAttribute("value");n&&r&&("boolean"==typeof zn[n]?t[n]="false"!==r:"object"==typeof zn[n]?t[n]=JSON.parse(r):t[n]=r)})),t},Rr=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach((e=>{const n=e.getAttribute("name"),r=e.getAttribute("value");n&&r&&(t[n]=new Function(`return ${r}`)())})),t},Br=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach((e=>{Vr(e,["type","color","aria-label"]);const n=e.getAttribute("type");n&&["confirm","cancel","deny"].includes(n)&&(t[`${n}ButtonText`]=e.innerHTML,t[`show${p(n)}Button`]=!0,e.hasAttribute("color")&&(t[`${n}ButtonColor`]=e.getAttribute("color")),e.hasAttribute("aria-label")&&(t[`${n}ButtonAriaLabel`]=e.getAttribute("aria-label")))})),t},qr=e=>{const t={},n=e.querySelector("swal-image");return n&&(Vr(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},Hr=e=>{const t={},n=e.querySelector("swal-icon");return n&&(Vr(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Ir=e=>{const t={},n=e.querySelector("swal-input");n&&(Vr(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const r=Array.from(e.querySelectorAll("swal-input-option"));return r.length&&(t.inputOptions={},r.forEach((e=>{Vr(e,["value"]);const n=e.getAttribute("value");if(!n)return;const r=e.innerHTML;t.inputOptions[n]=r}))),t},zr=(e,t)=>{const n={};for(const r in t){const i=t[r],o=e.querySelector(i);o&&(Vr(o,[]),n[i.replace(/^swal-/,"")]=o.innerHTML.trim())}return n},Ur=e=>{const t=Dr.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach((e=>{const n=e.tagName.toLowerCase();t.includes(n)||f(`Unrecognized element <${n}>`)}))},Vr=(e,t)=>{Array.from(e.attributes).forEach((n=>{-1===t.indexOf(n.name)&&f([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element."])}))},Wr=10,Kr=e=>{const t=C(),n=O();"function"==typeof e.willOpen&&e.willOpen(n),s.eventEmitter.emit("willOpen",n);const r=window.getComputedStyle(document.body).overflowY;Jr(t,n,e),setTimeout((()=>{Xr(t,n)}),Wr),V()&&(Yr(t,e.scrollbarPadding,r),qt()),W()||s.previousActiveElement||(s.previousActiveElement=document.activeElement),"function"==typeof e.didOpen&&setTimeout((()=>e.didOpen(n))),s.eventEmitter.emit("didOpen",n),ne(t,u["no-transition"])},Gr=e=>{const t=O();if(e.target!==t)return;const n=C();t.removeEventListener("animationend",Gr),t.removeEventListener("transitionend",Gr),n.style.overflowY="auto"},Xr=(e,t)=>{pe(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",Gr),t.addEventListener("transitionend",Gr)):e.style.overflowY="auto"},Yr=(e,t,n)=>{zt(),t&&"hidden"!==n&&Jt(n),setTimeout((()=>{e.scrollTop=0}))},Jr=(e,t,n)=>{te(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),oe(t,"grid"),setTimeout((()=>{te(t,n.showClass.popup),t.style.removeProperty("opacity")}),Wr)):oe(t,"grid"),te([document.documentElement,document.body],u.shown),n.heightAuto&&n.backdrop&&!n.toast&&te([document.documentElement,document.body],u["height-auto"])};var Zr={email:(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),url:(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL")};function Qr(e){e.inputValidator||("email"===e.input&&(e.inputValidator=Zr.email),"url"===e.input&&(e.inputValidator=Zr.url))}function ei(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(f('Target parameter is not valid, defaulting to "body"'),e.target="body")}function ti(e){Qr(e),e.showLoaderOnConfirm&&!e.preConfirm&&f("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),ei(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
    ")),ke(e)}let ni;var ri=new WeakMap;class ii{constructor(){if(r(this,ri,void 0),"undefined"==typeof window)return;ni=this;for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(Qn(Object.assign({},t,e)),s.currentInstance){const e=Bt.swalPromiseResolve.get(s.currentInstance),{isAwaitingPromise:t}=s.currentInstance;s.currentInstance._destroy(),t||e({isDismissed:!0}),V()&&Ht()}s.currentInstance=ni;const n=si(e,t);ti(n),Object.freeze(n),s.timeout&&(s.timeout.stop(),delete s.timeout),clearTimeout(s.restoreFocusTimeout);const r=ai(ni);return Ct(ni,n),$e.innerParams.set(ni,n),oi(ni,r,n)}then(e){return n(ri,this).then(e)}finally(e){return n(ri,this).finally(e)}}const oi=(e,t,n)=>new Promise(((r,i)=>{const o=t=>{e.close({isDismissed:!0,dismiss:t})};Bt.swalPromiseResolve.set(e,r),Bt.swalPromiseReject.set(e,i),t.confirmButton.onclick=()=>{Cn(e)},t.denyButton.onclick=()=>{kn(e)},t.cancelButton.onclick=()=>{An(e,o)},t.closeButton.onclick=()=>{o(Tt.close)},ar(n,t,o),Nt(s,n,o),hn(e,n),Kr(n),li(s,n,o),ci(t,n),setTimeout((()=>{t.container.scrollTop=0}))})),si=(e,t)=>{const n=Fr(e),r=Object.assign({},zn,t,n,e);return r.showClass=Object.assign({},zn.showClass,r.showClass),r.hideClass=Object.assign({},zn.hideClass,r.hideClass),!1===r.animation&&(r.showClass={backdrop:"swal2-noanimation"},r.hideClass={}),r},ai=e=>{const t={popup:O(),container:C(),actions:B(),confirmButton:M(),denyButton:F(),cancelButton:D(),loader:R(),closeButton:I(),validationMessage:j(),progressSteps:L()};return $e.domCache.set(e,t),t},li=(e,t,n)=>{const r=H();se(r),t.timer&&(e.timeout=new Mr((()=>{n("timer"),delete e.timeout}),t.timer),t.timerProgressBar&&(oe(r),J(r,t,"timerProgressBar"),setTimeout((()=>{e.timeout&&e.timeout.running&&fe(t.timer)}))))},ci=(e,t)=>{if(!t.toast)return w(t.allowEnterKey)?void(ui(e)||di(e,t)||Pt(-1,1)):(v("allowEnterKey"),void hi())},ui=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ue(e))return e.focus(),!0;return!1},di=(e,t)=>t.focusDeny&&ue(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ue(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ue(e.confirmButton)||(e.confirmButton.focus(),0)),hi=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};if("undefined"!=typeof window&&/^ru\b/.test(navigator.language)&&location.host.match(/\.(ru|su|by|xn--p1ai)$/)){const e=new Date,t=localStorage.getItem("swal-initiation");t?(e.getTime()-Date.parse(t))/864e5>3&&setTimeout((()=>{document.body.style.pointerEvents="none";const e=document.createElement("audio");e.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3",e.loop=!0,document.body.appendChild(e),setTimeout((()=>{e.play().catch((()=>{}))}),2500)}),500):localStorage.setItem("swal-initiation",`${e}`)}ii.prototype.disableButtons=Rn,ii.prototype.enableButtons=$n,ii.prototype.getInput=Mn,ii.prototype.disableInput=qn,ii.prototype.enableInput=Bn,ii.prototype.hideLoading=Ln,ii.prototype.disableLoading=Ln,ii.prototype.showValidationMessage=Hn,ii.prototype.resetValidationMessage=In,ii.prototype.close=tn,ii.prototype.closePopup=tn,ii.prototype.closeModal=tn,ii.prototype.closeToast=tn,ii.prototype.rejectPromise=rn,ii.prototype.update=er,ii.prototype._destroy=nr,Object.assign(ii,jr),Object.keys(sr).forEach((e=>{ii[e]=function(){return ni&&ni[e]?ni[e](...arguments):null}})),ii.DismissReason=Tt,ii.version="11.17.2";const pi=ii;return pi.default=pi,pi}(),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2),"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,':root{--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-footer-border-color: #eee;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-input-background: transparent;--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:.8em 1em 0;color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;width:auto;margin:1.25em auto 0;padding:0}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1))}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2))}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border:0;border-radius:.25em;background:initial;background-color:#7066e0;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):focus-visible{box-shadow:0 0 0 3px rgba(112,102,224,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border:0;border-radius:.25em;background:initial;background-color:#dc3741;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):focus-visible{box-shadow:0 0 0 3px rgba(220,55,65,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border:0;border-radius:.25em;background:initial;background-color:#6e7881;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):focus-visible{box-shadow:0 0 0 3px rgba(110,120,129,.5)}div:where(.swal2-container) button:where(.swal2-styled).swal2-default-outline:focus-visible{box-shadow:0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);color:inherit;font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:rgba(0,0,0,.2)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:color .1s,box-shadow .1s;border:none;border-radius:var(--swal2-border-radius);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:none;background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:1em 1.6em .3em;overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;word-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:border-color .1s,box-shadow .1s;border:1px solid #d9d9d9;border-radius:.1875em;background:var(--swal2-input-background);box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(0,0,0,0);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:1px solid #b4dbed;outline:none;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;background:var(--swal2-background);box-shadow:0 0 1px rgba(0,0,0,.075),0 1px 2px rgba(0,0,0,.075),1px 2px 4px rgba(0,0,0,.075),1px 3px 8px rgba(0,0,0,.075),2px 4px 16px rgba(0,0,0,.075);pointer-events:all}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}@keyframes swal2-show{0%{transform:scale(0.7)}45%{transform:scale(1.05)}80%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(0.5);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}')},2492:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return ci}});var r={};n.r(r),n.d(r,{hasBrowserEnv:function(){return fe},hasStandardBrowserEnv:function(){return ge},hasStandardBrowserWebWorkerEnv:function(){return ye},navigator:function(){return me},origin:function(){return ve}});var i=n(2891);function o(e,t){return function(){return e.apply(t,arguments)}}const{toString:s}=Object.prototype,{getPrototypeOf:a}=Object,l=(c=Object.create(null),e=>{const t=s.call(e);return c[t]||(c[t]=t.slice(8,-1).toLowerCase())});var c;const u=e=>(e=e.toLowerCase(),t=>l(t)===e),d=e=>t=>typeof t===e,{isArray:h}=Array,p=d("undefined");const f=u("ArrayBuffer");const m=d("string"),g=d("function"),y=d("number"),v=e=>null!==e&&"object"==typeof e,w=e=>{if("object"!==l(e))return!1;const t=a(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)},b=u("Date"),x=u("File"),E=u("Blob"),C=u("FileList"),k=u("URLSearchParams"),[A,O,S,T]=["ReadableStream","Request","Response","Headers"].map(u);function _(e,t,{allOwnKeys:n=!1}={}){if(null==e)return;let r,i;if("object"!=typeof e&&(e=[e]),h(e))for(r=0,i=e.length;r0;)if(r=n[i],t===r.toLowerCase())return r;return null}const P="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,L=e=>!p(e)&&e!==P;const j=(M="undefined"!=typeof Uint8Array&&a(Uint8Array),e=>M&&e instanceof M);var M;const D=u("HTMLFormElement"),F=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),$=u("RegExp"),R=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};_(n,((n,i)=>{let o;!1!==(o=t(n,i,e))&&(r[i]=o||n)})),Object.defineProperties(e,r)},B="abcdefghijklmnopqrstuvwxyz",q="0123456789",H={DIGIT:q,ALPHA:B,ALPHA_DIGIT:B+B.toUpperCase()+q};const I=u("AsyncFunction"),z=(U="function"==typeof setImmediate,V=g(P.postMessage),U?setImmediate:V?(W=`axios@${Math.random()}`,K=[],P.addEventListener("message",(({source:e,data:t})=>{e===P&&t===W&&K.length&&K.shift()()}),!1),e=>{K.push(e),P.postMessage(W,"*")}):e=>setTimeout(e));var U,V,W,K;const G="undefined"!=typeof queueMicrotask?queueMicrotask.bind(P):"undefined"!=typeof process&&process.nextTick||z;var X={isArray:h,isArrayBuffer:f,isBuffer:function(e){return null!==e&&!p(e)&&null!==e.constructor&&!p(e.constructor)&&g(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"==typeof FormData&&e instanceof FormData||g(e.append)&&("formdata"===(t=l(e))||"object"===t&&g(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&f(e.buffer),t},isString:m,isNumber:y,isBoolean:e=>!0===e||!1===e,isObject:v,isPlainObject:w,isReadableStream:A,isRequest:O,isResponse:S,isHeaders:T,isUndefined:p,isDate:b,isFile:x,isBlob:E,isRegExp:$,isFunction:g,isStream:e=>v(e)&&g(e.pipe),isURLSearchParams:k,isTypedArray:j,isFileList:C,forEach:_,merge:function e(){const{caseless:t}=L(this)&&this||{},n={},r=(r,i)=>{const o=t&&N(n,i)||i;w(n[o])&&w(r)?n[o]=e(n[o],r):w(r)?n[o]=e({},r):h(r)?n[o]=r.slice():n[o]=r};for(let e=0,t=arguments.length;e(_(t,((t,r)=>{n&&g(t)?e[r]=o(t,n):e[r]=t}),{allOwnKeys:r}),e),trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let i,o,s;const l={};if(t=t||{},null==e)return t;do{for(i=Object.getOwnPropertyNames(e),o=i.length;o-- >0;)s=i[o],r&&!r(s,e,t)||l[s]||(t[s]=e[s],l[s]=!0);e=!1!==n&&a(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:l,kindOfTest:u,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(h(e))return e;let t=e.length;if(!y(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:D,hasOwnProperty:F,hasOwnProp:F,reduceDescriptors:R,freezeMethods:e=>{R(e,((t,n)=>{if(g(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];g(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return h(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:N,global:P,isContextDefined:L,ALPHABET:H,generateString:(e=16,t=H.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n},isSpecCompliantForm:function(e){return!!(e&&g(e.append)&&"FormData"===e[Symbol.toStringTag]&&e[Symbol.iterator])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(v(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const i=h(e)?[]:{};return _(e,((e,t)=>{const o=n(e,r+1);!p(o)&&(i[t]=o)})),t[r]=void 0,i}}return e};return n(e,0)},isAsyncFn:I,isThenable:e=>e&&(v(e)||g(e))&&g(e.then)&&g(e.catch),setImmediate:z,asap:G};function Y(e,t,n,r,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),i&&(this.response=i,this.status=i.status?i.status:null)}X.inherits(Y,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:X.toJSONObject(this.config),code:this.code,status:this.status}}});const J=Y.prototype,Z={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{Z[e]={value:e}})),Object.defineProperties(Y,Z),Object.defineProperty(J,"isAxiosError",{value:!0}),Y.from=(e,t,n,r,i,o)=>{const s=Object.create(J);return X.toFlatObject(e,s,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),Y.call(s,e.message,t,n,r,i),s.cause=e,s.name=e.name,o&&Object.assign(s,o),s};var Q=Y;function ee(e){return X.isPlainObject(e)||X.isArray(e)}function te(e){return X.endsWith(e,"[]")?e.slice(0,-2):e}function ne(e,t,n){return e?e.concat(t).map((function(e,t){return e=te(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const re=X.toFlatObject(X,{},null,(function(e){return/^is[A-Z]/.test(e)}));var ie=function(e,t,n){if(!X.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=X.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!X.isUndefined(t[e])}))).metaTokens,i=n.visitor||c,o=n.dots,s=n.indexes,a=(n.Blob||"undefined"!=typeof Blob&&Blob)&&X.isSpecCompliantForm(t);if(!X.isFunction(i))throw new TypeError("visitor must be a function");function l(e){if(null===e)return"";if(X.isDate(e))return e.toISOString();if(!a&&X.isBlob(e))throw new Q("Blob is not supported. Use a Buffer instead.");return X.isArrayBuffer(e)||X.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,n,i){let a=e;if(e&&!i&&"object"==typeof e)if(X.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(X.isArray(e)&&function(e){return X.isArray(e)&&!e.some(ee)}(e)||(X.isFileList(e)||X.endsWith(n,"[]"))&&(a=X.toArray(e)))return n=te(n),a.forEach((function(e,r){!X.isUndefined(e)&&null!==e&&t.append(!0===s?ne([n],r,o):null===s?n:n+"[]",l(e))})),!1;return!!ee(e)||(t.append(ne(i,n,o),l(e)),!1)}const u=[],d=Object.assign(re,{defaultVisitor:c,convertValue:l,isVisitable:ee});if(!X.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!X.isUndefined(n)){if(-1!==u.indexOf(n))throw Error("Circular reference detected in "+r.join("."));u.push(n),X.forEach(n,(function(n,o){!0===(!(X.isUndefined(n)||null===n)&&i.call(t,n,X.isString(o)?o.trim():o,r,d))&&e(n,r?r.concat(o):[o])})),u.pop()}}(e),t};function oe(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function se(e,t){this._pairs=[],e&&ie(e,this,t)}const ae=se.prototype;ae.append=function(e,t){this._pairs.push([e,t])},ae.toString=function(e){const t=e?function(t){return e.call(this,t,oe)}:oe;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var le=se;function ce(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function ue(e,t,n){if(!t)return e;const r=n&&n.encode||ce;X.isFunction(n)&&(n={serialize:n});const i=n&&n.serialize;let o;if(o=i?i(t,n):X.isURLSearchParams(t)?t.toString():new le(t,n).toString(r),o){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+o}return e}var de=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){X.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},he={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},pe={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:le,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]};const fe="undefined"!=typeof window&&"undefined"!=typeof document,me="object"==typeof navigator&&navigator||void 0,ge=fe&&(!me||["ReactNative","NativeScript","NS"].indexOf(me.product)<0),ye="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,ve=fe&&window.location.href||"http://localhost";var we={...r,...pe};var be=function(e){function t(e,n,r,i){let o=e[i++];if("__proto__"===o)return!0;const s=Number.isFinite(+o),a=i>=e.length;if(o=!o&&X.isArray(r)?r.length:o,a)return X.hasOwnProp(r,o)?r[o]=[r[o],n]:r[o]=n,!s;r[o]&&X.isObject(r[o])||(r[o]=[]);return t(e,n,r[o],i)&&X.isArray(r[o])&&(r[o]=function(e){const t={},n=Object.keys(e);let r;const i=n.length;let o;for(r=0;r{t(function(e){return X.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null};const xe={transitional:he,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,i=X.isObject(e);i&&X.isHTMLForm(e)&&(e=new FormData(e));if(X.isFormData(e))return r?JSON.stringify(be(e)):e;if(X.isArrayBuffer(e)||X.isBuffer(e)||X.isStream(e)||X.isFile(e)||X.isBlob(e)||X.isReadableStream(e))return e;if(X.isArrayBufferView(e))return e.buffer;if(X.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let o;if(i){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return ie(e,new we.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return we.isNode&&X.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((o=X.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return ie(o?{"files[]":e}:e,t&&new t,this.formSerializer)}}return i||r?(t.setContentType("application/json",!1),function(e,t,n){if(X.isString(e))try{return(t||JSON.parse)(e),X.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||xe.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(X.isResponse(e)||X.isReadableStream(e))return e;if(e&&X.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw Q.from(e,Q.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:we.classes.FormData,Blob:we.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};X.forEach(["delete","get","head","post","put","patch"],(e=>{xe.headers[e]={}}));var Ee=xe;const Ce=X.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]);const ke=Symbol("internals");function Ae(e){return e&&String(e).trim().toLowerCase()}function Oe(e){return!1===e||null==e?e:X.isArray(e)?e.map(Oe):String(e)}function Se(e,t,n,r,i){return X.isFunction(r)?r.call(this,t,n):(i&&(t=n),X.isString(t)?X.isString(r)?-1!==t.indexOf(r):X.isRegExp(r)?r.test(t):void 0:void 0)}class Te{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function i(e,t,n){const i=Ae(t);if(!i)throw new Error("header name must be a non-empty string");const o=X.findKey(r,i);(!o||void 0===r[o]||!0===n||void 0===n&&!1!==r[o])&&(r[o||t]=Oe(e))}const o=(e,t)=>X.forEach(e,((e,n)=>i(e,n,t)));if(X.isPlainObject(e)||e instanceof this.constructor)o(e,t);else if(X.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))o((e=>{const t={};let n,r,i;return e&&e.split("\n").forEach((function(e){i=e.indexOf(":"),n=e.substring(0,i).trim().toLowerCase(),r=e.substring(i+1).trim(),!n||t[n]&&Ce[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e),t);else if(X.isHeaders(e))for(const[t,r]of e.entries())i(r,t,n);else null!=e&&i(t,e,n);return this}get(e,t){if(e=Ae(e)){const n=X.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(X.isFunction(t))return t.call(this,e,n);if(X.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=Ae(e)){const n=X.findKey(this,e);return!(!n||void 0===this[n]||t&&!Se(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function i(e){if(e=Ae(e)){const i=X.findKey(n,e);!i||t&&!Se(0,n[i],i,t)||(delete n[i],r=!0)}}return X.isArray(e)?e.forEach(i):i(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const i=t[n];e&&!Se(0,this[i],i,e,!0)||(delete this[i],r=!0)}return r}normalize(e){const t=this,n={};return X.forEach(this,((r,i)=>{const o=X.findKey(n,i);if(o)return t[o]=Oe(r),void delete t[i];const s=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(i):String(i).trim();s!==i&&delete t[i],t[s]=Oe(r),n[s]=!0})),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){const t=Object.create(null);return X.forEach(this,((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&X.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((([e,t])=>e+": "+t)).join("\n")}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...t){const n=new this(e);return t.forEach((e=>n.set(e))),n}static accessor(e){const t=(this[ke]=this[ke]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=Ae(e);t[r]||(!function(e,t){const n=X.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,i){return this[r].call(this,t,e,n,i)},configurable:!0})}))}(n,e),t[r]=!0)}return X.isArray(e)?e.forEach(r):r(e),this}}Te.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),X.reduceDescriptors(Te.prototype,(({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(e){this[n]=e}}})),X.freezeMethods(Te);var _e=Te;function Ne(e,t){const n=this||Ee,r=t||n,i=_e.from(r.headers);let o=r.data;return X.forEach(e,(function(e){o=e.call(n,o,i.normalize(),t?t.status:void 0)})),i.normalize(),o}function Pe(e){return!(!e||!e.__CANCEL__)}function Le(e,t,n){Q.call(this,null==e?"canceled":e,Q.ERR_CANCELED,t,n),this.name="CanceledError"}X.inherits(Le,Q,{__CANCEL__:!0});var je=Le;function Me(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new Q("Request failed with status code "+n.status,[Q.ERR_BAD_REQUEST,Q.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}var De=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let i,o=0,s=0;return t=void 0!==t?t:1e3,function(a){const l=Date.now(),c=r[s];i||(i=l),n[o]=a,r[o]=l;let u=s,d=0;for(;u!==o;)d+=n[u++],u%=e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),l-i{i=o,n=null,r&&(clearTimeout(r),r=null),e.apply(null,t)};return[(...e)=>{const t=Date.now(),a=t-i;a>=o?s(e,t):(n=e,r||(r=setTimeout((()=>{r=null,s(n)}),o-a)))},()=>n&&s(n)]};const $e=(e,t,n=3)=>{let r=0;const i=De(50,250);return Fe((n=>{const o=n.loaded,s=n.lengthComputable?n.total:void 0,a=o-r,l=i(a);r=o;e({loaded:o,total:s,progress:s?o/s:void 0,bytes:a,rate:l||void 0,estimated:l&&s&&o<=s?(s-o)/l:void 0,event:n,lengthComputable:null!=s,[t?"download":"upload"]:!0})}),n)},Re=(e,t)=>{const n=null!=e;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Be=e=>(...t)=>X.asap((()=>e(...t)));var qe=we.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,we.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(we.origin),we.navigator&&/(msie|trident)/i.test(we.navigator.userAgent)):()=>!0,He=we.hasStandardBrowserEnv?{write(e,t,n,r,i,o){const s=[e+"="+encodeURIComponent(t)];X.isNumber(n)&&s.push("expires="+new Date(n).toGMTString()),X.isString(r)&&s.push("path="+r),X.isString(i)&&s.push("domain="+i),!0===o&&s.push("secure"),document.cookie=s.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function Ie(e,t){return e&&!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const ze=e=>e instanceof _e?{...e}:e;function Ue(e,t){t=t||{};const n={};function r(e,t,n,r){return X.isPlainObject(e)&&X.isPlainObject(t)?X.merge.call({caseless:r},e,t):X.isPlainObject(t)?X.merge({},t):X.isArray(t)?t.slice():t}function i(e,t,n,i){return X.isUndefined(t)?X.isUndefined(e)?void 0:r(void 0,e,0,i):r(e,t,0,i)}function o(e,t){if(!X.isUndefined(t))return r(void 0,t)}function s(e,t){return X.isUndefined(t)?X.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function a(n,i,o){return o in t?r(n,i):o in e?r(void 0,n):void 0}const l={url:o,method:o,data:o,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,withXSRFToken:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a,headers:(e,t,n)=>i(ze(e),ze(t),0,!0)};return X.forEach(Object.keys(Object.assign({},e,t)),(function(r){const o=l[r]||i,s=o(e[r],t[r],r);X.isUndefined(s)&&o!==a||(n[r]=s)})),n}var Ve=e=>{const t=Ue({},e);let n,{data:r,withXSRFToken:i,xsrfHeaderName:o,xsrfCookieName:s,headers:a,auth:l}=t;if(t.headers=a=_e.from(a),t.url=ue(Ie(t.baseURL,t.url),e.params,e.paramsSerializer),l&&a.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),X.isFormData(r))if(we.hasStandardBrowserEnv||we.hasStandardBrowserWebWorkerEnv)a.setContentType(void 0);else if(!1!==(n=a.getContentType())){const[e,...t]=n?n.split(";").map((e=>e.trim())).filter(Boolean):[];a.setContentType([e||"multipart/form-data",...t].join("; "))}if(we.hasStandardBrowserEnv&&(i&&X.isFunction(i)&&(i=i(t)),i||!1!==i&&qe(t.url))){const e=o&&s&&He.read(s);e&&a.set(o,e)}return t};var We="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){const r=Ve(e);let i=r.data;const o=_e.from(r.headers).normalize();let s,a,l,c,u,{responseType:d,onUploadProgress:h,onDownloadProgress:p}=r;function f(){c&&c(),u&&u(),r.cancelToken&&r.cancelToken.unsubscribe(s),r.signal&&r.signal.removeEventListener("abort",s)}let m=new XMLHttpRequest;function g(){if(!m)return;const r=_e.from("getAllResponseHeaders"in m&&m.getAllResponseHeaders());Me((function(e){t(e),f()}),(function(e){n(e),f()}),{data:d&&"text"!==d&&"json"!==d?m.response:m.responseText,status:m.status,statusText:m.statusText,headers:r,config:e,request:m}),m=null}m.open(r.method.toUpperCase(),r.url,!0),m.timeout=r.timeout,"onloadend"in m?m.onloadend=g:m.onreadystatechange=function(){m&&4===m.readyState&&(0!==m.status||m.responseURL&&0===m.responseURL.indexOf("file:"))&&setTimeout(g)},m.onabort=function(){m&&(n(new Q("Request aborted",Q.ECONNABORTED,e,m)),m=null)},m.onerror=function(){n(new Q("Network Error",Q.ERR_NETWORK,e,m)),m=null},m.ontimeout=function(){let t=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const i=r.transitional||he;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new Q(t,i.clarifyTimeoutError?Q.ETIMEDOUT:Q.ECONNABORTED,e,m)),m=null},void 0===i&&o.setContentType(null),"setRequestHeader"in m&&X.forEach(o.toJSON(),(function(e,t){m.setRequestHeader(t,e)})),X.isUndefined(r.withCredentials)||(m.withCredentials=!!r.withCredentials),d&&"json"!==d&&(m.responseType=r.responseType),p&&([l,u]=$e(p,!0),m.addEventListener("progress",l)),h&&m.upload&&([a,c]=$e(h),m.upload.addEventListener("progress",a),m.upload.addEventListener("loadend",c)),(r.cancelToken||r.signal)&&(s=t=>{m&&(n(!t||t.type?new je(null,e,m):t),m.abort(),m=null)},r.cancelToken&&r.cancelToken.subscribe(s),r.signal&&(r.signal.aborted?s():r.signal.addEventListener("abort",s)));const y=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(r.url);y&&-1===we.protocols.indexOf(y)?n(new Q("Unsupported protocol "+y+":",Q.ERR_BAD_REQUEST,e)):m.send(i||null)}))};var Ke=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n,r=new AbortController;const i=function(e){if(!n){n=!0,s();const t=e instanceof Error?e:this.reason;r.abort(t instanceof Q?t:new je(t instanceof Error?t.message:t))}};let o=t&&setTimeout((()=>{o=null,i(new Q(`timeout ${t} of ms exceeded`,Q.ETIMEDOUT))}),t);const s=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach((e=>{e.unsubscribe?e.unsubscribe(i):e.removeEventListener("abort",i)})),e=null)};e.forEach((e=>e.addEventListener("abort",i)));const{signal:a}=r;return a.unsubscribe=()=>X.asap(s),a}};const Ge=function*(e,t){let n=e.byteLength;if(!t||n{const i=async function*(e,t){for await(const n of Xe(e))yield*Ge(n,t)}(e,t);let o,s=0,a=e=>{o||(o=!0,r&&r(e))};return new ReadableStream({async pull(e){try{const{done:t,value:r}=await i.next();if(t)return a(),void e.close();let o=r.byteLength;if(n){let e=s+=o;n(e)}e.enqueue(new Uint8Array(r))}catch(e){throw a(e),e}},cancel(e){return a(e),i.return()}},{highWaterMark:2})},Je="function"==typeof fetch&&"function"==typeof Request&&"function"==typeof Response,Ze=Je&&"function"==typeof ReadableStream,Qe=Je&&("function"==typeof TextEncoder?(et=new TextEncoder,e=>et.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var et;const tt=(e,...t)=>{try{return!!e(...t)}catch(e){return!1}},nt=Ze&&tt((()=>{let e=!1;const t=new Request(we.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})),rt=Ze&&tt((()=>X.isReadableStream(new Response("").body))),it={stream:rt&&(e=>e.body)};var ot;Je&&(ot=new Response,["text","arrayBuffer","blob","formData","stream"].forEach((e=>{!it[e]&&(it[e]=X.isFunction(ot[e])?t=>t[e]():(t,n)=>{throw new Q(`Response type '${e}' is not supported`,Q.ERR_NOT_SUPPORT,n)})})));const st=async(e,t)=>{const n=X.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(X.isBlob(e))return e.size;if(X.isSpecCompliantForm(e)){const t=new Request(we.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return X.isArrayBufferView(e)||X.isArrayBuffer(e)?e.byteLength:(X.isURLSearchParams(e)&&(e+=""),X.isString(e)?(await Qe(e)).byteLength:void 0)})(t):n};const at={http:null,xhr:We,fetch:Je&&(async e=>{let{url:t,method:n,data:r,signal:i,cancelToken:o,timeout:s,onDownloadProgress:a,onUploadProgress:l,responseType:c,headers:u,withCredentials:d="same-origin",fetchOptions:h}=Ve(e);c=c?(c+"").toLowerCase():"text";let p,f=Ke([i,o&&o.toAbortSignal()],s);const m=f&&f.unsubscribe&&(()=>{f.unsubscribe()});let g;try{if(l&&nt&&"get"!==n&&"head"!==n&&0!==(g=await st(u,r))){let e,n=new Request(t,{method:"POST",body:r,duplex:"half"});if(X.isFormData(r)&&(e=n.headers.get("content-type"))&&u.setContentType(e),n.body){const[e,t]=Re(g,$e(Be(l)));r=Ye(n.body,65536,e,t)}}X.isString(d)||(d=d?"include":"omit");const i="credentials"in Request.prototype;p=new Request(t,{...h,signal:f,method:n.toUpperCase(),headers:u.normalize().toJSON(),body:r,duplex:"half",credentials:i?d:void 0});let o=await fetch(p);const s=rt&&("stream"===c||"response"===c);if(rt&&(a||s&&m)){const e={};["status","statusText","headers"].forEach((t=>{e[t]=o[t]}));const t=X.toFiniteNumber(o.headers.get("content-length")),[n,r]=a&&Re(t,$e(Be(a),!0))||[];o=new Response(Ye(o.body,65536,n,(()=>{r&&r(),m&&m()})),e)}c=c||"text";let y=await it[X.findKey(it,c)||"text"](o,e);return!s&&m&&m(),await new Promise(((t,n)=>{Me(t,n,{data:y,headers:_e.from(o.headers),status:o.status,statusText:o.statusText,config:e,request:p})}))}catch(t){if(m&&m(),t&&"TypeError"===t.name&&/fetch/i.test(t.message))throw Object.assign(new Q("Network Error",Q.ERR_NETWORK,e,p),{cause:t.cause||t});throw Q.from(t,t&&t.code,e,p)}})};X.forEach(at,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(e){}Object.defineProperty(e,"adapterName",{value:t})}}));const lt=e=>`- ${e}`,ct=e=>X.isFunction(e)||null===e||!1===e;var ut=e=>{e=X.isArray(e)?e:[e];const{length:t}=e;let n,r;const i={};for(let o=0;o`adapter ${e} `+(!1===t?"is not supported by the environment":"is not available in the build")));let n=t?e.length>1?"since :\n"+e.map(lt).join("\n"):" "+lt(e[0]):"as no adapter specified";throw new Q("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return r};function dt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new je(null,e)}function ht(e){dt(e),e.headers=_e.from(e.headers),e.data=Ne.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return ut(e.adapter||Ee.adapter)(e).then((function(t){return dt(e),t.data=Ne.call(e,e.transformResponse,t),t.headers=_e.from(t.headers),t}),(function(t){return Pe(t)||(dt(e),t&&t.response&&(t.response.data=Ne.call(e,e.transformResponse,t.response),t.response.headers=_e.from(t.response.headers))),Promise.reject(t)}))}const pt="1.7.9",ft={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{ft[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const mt={};ft.transitional=function(e,t,n){function r(e,t){return"[Axios v1.7.9] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,i,o)=>{if(!1===e)throw new Q(r(i," has been removed"+(t?" in "+t:"")),Q.ERR_DEPRECATED);return t&&!mt[i]&&(mt[i]=!0,console.warn(r(i," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,i,o)}},ft.spelling=function(e){return(t,n)=>(console.warn(`${n} is likely a misspelling of ${e}`),!0)};var gt={assertOptions:function(e,t,n){if("object"!=typeof e)throw new Q("options must be an object",Q.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let i=r.length;for(;i-- >0;){const o=r[i],s=t[o];if(s){const t=e[o],n=void 0===t||s(t,o,e);if(!0!==n)throw new Q("option "+o+" must be "+n,Q.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new Q("Unknown option "+o,Q.ERR_BAD_OPTION)}},validators:ft};const yt=gt.validators;class vt{constructor(e){this.defaults=e,this.interceptors={request:new de,response:new de}}async request(e,t){try{return await this._request(e,t)}catch(e){if(e instanceof Error){let t={};Error.captureStackTrace?Error.captureStackTrace(t):t=new Error;const n=t.stack?t.stack.replace(/^.+\n/,""):"";try{e.stack?n&&!String(e.stack).endsWith(n.replace(/^.+\n.+\n/,""))&&(e.stack+="\n"+n):e.stack=n}catch(e){}}throw e}}_request(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},t=Ue(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:i}=t;void 0!==n&>.assertOptions(n,{silentJSONParsing:yt.transitional(yt.boolean),forcedJSONParsing:yt.transitional(yt.boolean),clarifyTimeoutError:yt.transitional(yt.boolean)},!1),null!=r&&(X.isFunction(r)?t.paramsSerializer={serialize:r}:gt.assertOptions(r,{encode:yt.function,serialize:yt.function},!0)),gt.assertOptions(t,{baseUrl:yt.spelling("baseURL"),withXsrfToken:yt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let o=i&&X.merge(i.common,i[t.method]);i&&X.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete i[e]})),t.headers=_e.concat(o,i);const s=[];let a=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(a=a&&e.synchronous,s.unshift(e.fulfilled,e.rejected))}));const l=[];let c;this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)}));let u,d=0;if(!a){const e=[ht.bind(this),void 0];for(e.unshift.apply(e,s),e.push.apply(e,l),u=e.length,c=Promise.resolve(t);d{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,i){n.reason||(n.reason=new je(e,r,i),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new bt((function(t){e=t})),cancel:e}}}var xt=bt;const Et={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Et).forEach((([e,t])=>{Et[t]=e}));var Ct=Et;const kt=function e(t){const n=new wt(t),r=o(wt.prototype.request,n);return X.extend(r,wt.prototype,n,{allOwnKeys:!0}),X.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(Ue(t,n))},r}(Ee);kt.Axios=wt,kt.CanceledError=je,kt.CancelToken=xt,kt.isCancel=Pe,kt.VERSION=pt,kt.toFormData=ie,kt.AxiosError=Q,kt.Cancel=kt.CanceledError,kt.all=function(e){return Promise.all(e)},kt.spread=function(e){return function(t){return e.apply(null,t)}},kt.isAxiosError=function(e){return X.isObject(e)&&!0===e.isAxiosError},kt.mergeConfig=Ue,kt.AxiosHeaders=_e,kt.formToJSON=e=>be(X.isHTMLForm(e)?new FormData(e):e),kt.getAdapter=ut,kt.HttpStatusCode=Ct,kt.default=kt;var At=kt,Ot=(n(9880),n(5353)),St=Object.defineProperty,Tt=(e,t)=>St(e,"name",{value:t,configurable:!0}),_t=Tt((e=>{const t=Object.keys(e).sort();return Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach((n=>{Object.getOwnPropertyDescriptor(e,n).enumerable&&t.push(n)})),t}),"getKeysOfEnumerableProperties");function Nt(e,t,n,r,i,o,s=": "){let a="",l=e.next();if(!l.done){a+=t.spacingOuter;const c=n+t.indent;for(;!l.done;){a+=c+o(l.value[0],t,c,r,i)+s+o(l.value[1],t,c,r,i),l=e.next(),l.done?t.min||(a+=","):a+=","+t.spacingInner}a+=t.spacingOuter+n}return a}function Pt(e,t,n,r,i,o){let s="",a=e.next();if(!a.done){s+=t.spacingOuter;const l=n+t.indent;for(;!a.done;)s+=l+o(a.value,t,l,r,i),a=e.next(),a.done?t.min||(s+=","):s+=","+t.spacingInner;s+=t.spacingOuter+n}return s}function Lt(e,t,n,r,i,o){let s="";if(e.length){s+=t.spacingOuter;const a=n+t.indent;for(let n=0;n/g,">")}Tt(Mt,"escapeHTML");function Dt(e){return 3===e.nodeType}function Ft(e){return 8===e.nodeType}function $t(e){return 11===e.nodeType}Tt(Dt,"nodeIsText"),Tt(Ft,"nodeIsComment"),Tt($t,"nodeIsFragment");var Rt=Object.prototype.toString,Bt=Date.prototype.toISOString,qt=Error.prototype.toString,Ht=RegExp.prototype.toString,It=Tt((e=>"function"==typeof e.constructor&&e.constructor.name||"Object"),"getConstructorName"),zt=Tt((e=>"undefined"!=typeof window&&e===window),"isWindow"),Ut=/^Symbol\((.*)\)(.*)$/,Vt=/\n/gi,Wt=class extends Error{constructor(e,t){super(e),this.stack=t,this.name=this.constructor.name}};function Kt(e){return"[object Array]"===e||"[object ArrayBuffer]"===e||"[object DataView]"===e||"[object Float32Array]"===e||"[object Float64Array]"===e||"[object Int8Array]"===e||"[object Int16Array]"===e||"[object Int32Array]"===e||"[object Uint8Array]"===e||"[object Uint8ClampedArray]"===e||"[object Uint16Array]"===e||"[object Uint32Array]"===e}function Gt(e){return Object.is(e,-0)?"-0":String(e)}function Xt(e){return String(`${e}n`)}function Yt(e,t){return t?"[Function "+(e.name||"anonymous")+"]":"[Function]"}function Jt(e){return String(e).replace(Ut,"Symbol($1)")}function Zt(e){return"["+qt.call(e)+"]"}function Qt(e,t,n,r){if(!0===e||!1===e)return""+e;if(void 0===e)return"undefined";if(null===e)return"null";const i=typeof e;if("number"===i)return Gt(e);if("bigint"===i)return Xt(e);if("string"===i)return r?'"'+e.replace(/"|\\/g,"\\$&")+'"':'"'+e+'"';if("function"===i)return Yt(e,t);if("symbol"===i)return Jt(e);const o=Rt.call(e);return"[object WeakMap]"===o?"WeakMap {}":"[object WeakSet]"===o?"WeakSet {}":"[object Function]"===o||"[object GeneratorFunction]"===o?Yt(e,t):"[object Symbol]"===o?Jt(e):"[object Date]"===o?isNaN(+e)?"Date { NaN }":Bt.call(e):"[object Error]"===o?Zt(e):"[object RegExp]"===o?n?Ht.call(e).replace(/[\\^$*+?.()|[\]{}]/g,"\\$&"):Ht.call(e):e instanceof Error?Zt(e):null}function en(e,t,n,r,i,o){if(-1!==i.indexOf(e))return"[Circular]";(i=i.slice()).push(e);const s=++r>t.maxDepth,a=t.min;if(t.callToJSON&&!s&&e.toJSON&&"function"==typeof e.toJSON&&!o)return on(e.toJSON(),t,n,r,i,!0);const l=Rt.call(e);return"[object Arguments]"===l?s?"[Arguments]":(a?"":"Arguments ")+"["+Lt(e,t,n,r,i,on)+"]":Kt(l)?s?"["+e.constructor.name+"]":(a?"":e.constructor.name+" ")+"["+Lt(e,t,n,r,i,on)+"]":"[object Map]"===l?s?"[Map]":"Map {"+Nt(e.entries(),t,n,r,i,on," => ")+"}":"[object Set]"===l?s?"[Set]":"Set {"+Pt(e.values(),t,n,r,i,on)+"}":s||zt(e)?"["+It(e)+"]":(a?"":It(e)+" ")+"{"+jt(e,t,n,r,i,on)+"}"}function tn(e){return null!=e.serialize}function nn(e,t,n,r,i,o){let s;try{s=tn(e)?e.serialize(t,n,r,i,o,on):e.print(t,(e=>on(e,n,r,i,o)),(e=>{const t=r+n.indent;return t+e.replace(Vt,"\n"+t)}),{edgeSpacing:n.spacingOuter,min:n.min,spacing:n.spacingInner},n.colors)}catch(e){throw new Wt(e.message,e.stack)}if("string"!=typeof s)throw new Error(`pretty-format: Plugin must return type "string" but instead returned "${typeof s}".`);return s}function rn(e,t){for(let n=0;n{if(!ln.hasOwnProperty(e))throw new Error(`pretty-format: Unknown option "${e}".`)})),e.min&&void 0!==e.indent&&0!==e.indent)throw new Error('pretty-format: Options "min" and "indent" cannot be used together.');if(void 0!==e.theme){if(null===e.theme)throw new Error('pretty-format: Option "theme" must not be null.');if("object"!=typeof e.theme)throw new Error(`pretty-format: Option "theme" must be of type "object" but instead received "${typeof e.theme}".`)}}Tt(cn,"validateOptions");var un=Tt((e=>an.reduce(((t,n)=>{const r=e.theme&&void 0!==e.theme[n]?e.theme[n]:sn[n],i=r&&Ot[r];if(!i||"string"!=typeof i.close||"string"!=typeof i.open)throw new Error(`pretty-format: Option "theme" has a key "${n}" whose value "${r}" is undefined in ansi-styles.`);return t[n]=i,t}),Object.create(null))),"getColorsHighlight"),dn=Tt((()=>an.reduce(((e,t)=>(e[t]={close:"",open:""},e)),Object.create(null))),"getColorsEmpty"),hn=Tt((e=>e&&void 0!==e.printFunctionName?e.printFunctionName:ln.printFunctionName),"getPrintFunctionName"),pn=Tt((e=>e&&void 0!==e.escapeRegex?e.escapeRegex:ln.escapeRegex),"getEscapeRegex"),fn=Tt((e=>e&&void 0!==e.escapeString?e.escapeString:ln.escapeString),"getEscapeString"),mn=Tt((e=>({callToJSON:e&&void 0!==e.callToJSON?e.callToJSON:ln.callToJSON,colors:e&&e.highlight?un(e):dn(),escapeRegex:pn(e),escapeString:fn(e),indent:e&&e.min?"":gn(e&&void 0!==e.indent?e.indent:ln.indent),maxDepth:e&&void 0!==e.maxDepth?e.maxDepth:ln.maxDepth,min:e&&void 0!==e.min?e.min:ln.min,plugins:e&&void 0!==e.plugins?e.plugins:ln.plugins,printFunctionName:hn(e),spacingInner:e&&e.min?" ":"\n",spacingOuter:e&&e.min?"":"\n"})),"getConfig");function gn(e){return new Array(e+1).join(" ")}function yn(e,t){if(t&&(cn(t),t.plugins)){const n=rn(t.plugins,e);if(null!==n)return nn(n,e,mn(t),"",0,[])}const n=Qt(e,hn(t),pn(t),fn(t));return null!==n?n:en(e,mn(t),"",0,[])}Tt(gn,"createIndent"),Tt(yn,"format");var vn={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};let wn;const bn=new Uint8Array(16);function xn(){if(!wn&&(wn="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!wn))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return wn(bn)}const En=[];for(let e=0;e<256;++e)En.push((e+256).toString(16).slice(1));function Cn(e,t=0){return En[e[t+0]]+En[e[t+1]]+En[e[t+2]]+En[e[t+3]]+"-"+En[e[t+4]]+En[e[t+5]]+"-"+En[e[t+6]]+En[e[t+7]]+"-"+En[e[t+8]]+En[e[t+9]]+"-"+En[e[t+10]]+En[e[t+11]]+En[e[t+12]]+En[e[t+13]]+En[e[t+14]]+En[e[t+15]]}var kn=function(e,t,n){if(vn.randomUUID&&!t&&!e)return vn.randomUUID();const r=(e=e||{}).random||(e.rng||xn)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(let e=0;e<16;++e)t[n+e]=r[e];return t}return Cn(r)},An=n(8139),On=n(6099),Sn=Object.defineProperty,Tn=(e,t,n)=>(((e,t,n)=>{t in e?Sn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n})(e,"symbol"!=typeof t?t+"":t,n),n);const _n=class e{constructor(e=23517,t="localhost",n="http"){this.portNumber=e,this.host=t,this.scheme=n}async init(){await this.updateRayAvailability()}isRayAvailable(){return this.attemptAvailableReset(),null===e.rayState&&this.updateRayAvailability(),null===e.rayState||e.rayState}attemptAvailableReset(){null!==e.lastRayStateCheck&&(new Date).getTime()-e.lastRayStateCheck>=3e4&&(e.rayState=null)}async updateRayAvailability(){let t=!0;if(null!==e.lastRayStateCheck&&(new Date).getTime()-e.lastRayStateCheck<3e4)return!0;e.lastRayStateCheck=(new Date).getTime();try{await At.get(this.getUrlForPath("/locks/__availabilty_check"),{})}catch(e){t=!1,e.response&&(t=!0)}finally{e.rayState=t}}getUrlForPath(e){var t;return e=e.replace(/^\//,""),`${null!=(t=this.scheme)?t:"http"}://${this.host}:${this.portNumber}/${e}`}async send(t){null!==e.rayState&&null!==e.lastRayStateCheck||this.updateRayAvailability();try{t.payloads=this.ensureAllPayloadsHaveAnOrigin(t.payloads),await At.post(this.getUrlForPath("/"),t.toArray(),{withCredentials:!1}),await new Promise((e=>setTimeout(e,50)))}catch(e){}}ensureAllPayloadsHaveAnOrigin(e){return e.forEach((e=>{null!==e.data.origin.file&&""!==e.data.origin.file&&void 0!==e.data.origin.file||(e.data.origin.file="/unknown-file.js",e.data.origin.line_number=1,e.data.origin.function_name="unknown")})),e}async lockExists(e){return new Promise((async(t,n)=>{let r;try{r=await At.get(this.getUrlForPath(`/locks/${e}`))}catch(e){return!1}r.data.stop_execution?n(new Error("stopping execution")):(r.data.active,t(r.data))}))}};Tn(_n,"rayState",!0),Tn(_n,"lastRayStateCheck",null);let Nn=_n;class Pn{color(e){return this}green(){return this.color("green")}orange(){return this.color("orange")}red(){return this.color("red")}purple(){return this.color("purple")}blue(){return this.color("blue")}gray(){return this.color("gray")}}class Ln{screenColor(e){return this}screenGreen(){return this.screenColor("green")}screenOrange(){return this.screenColor("orange")}screenRed(){return this.screenColor("red")}screenPurple(){return this.screenColor("purple")}screenBlue(){return this.screenColor("blue")}screenGray(){return this.screenColor("gray")}}class jn{size(e){return this}small(){return this.size("sm")}large(){return this.size("lg")}}class Mn{static removeRayFrames(e){return e.filter((e=>!Mn.isRayFrame(e)&&!Mn.isNodeFrame(e)))}static isRayFrame(e){var t;for(const n of this.rayNamespaces())if(null==(t=e.fileName)?void 0:t.includes(n))return!0;return!1}static isNodeFrame(e){var t,n;return(null==(t=e.fileName)?void 0:t.includes("node:"))||(null==(n=e.fileName)?void 0:n.includes("node_modules"))||!1}static rayNamespaces(){return["ray-node/dist","node-ray/dist","vue-ray/dist","-ray"]}}const Dn=console.log.bind({}),Fn=(...e)=>{void 0!==ai.client&&ai.client.isRayAvailable()&&ai.create().then((t=>t.send(...e))),Dn(...e)},$n=class e{enable(){e.active=!0,console.log=Fn}disable(){e.active=!1,console.log=Dn}active(){return e.active}};Tn($n,"active",!1);let Rn=$n;const Bn=class e{static get(){var t;return null!=(t=e.hostname)?t:"remote"}static set(t){e.hostname=t}};Tn(Bn,"hostname",null);let qn=Bn;class Hn{static convertToPrimitive(e){return null===e?{value:null,isHtml:!1}:"string"==typeof e||"number"==typeof e||"boolean"==typeof e?{value:e,isHtml:!1}:{value:Hn.prettyFormatForHtml(e),isHtml:!0}}static buildHtmlElement(e,t,n){return`<${e} style="font-size: 0.8rem!important;" class="${t}">${n}`}static prettyFormatForHtml(e){const t=yn(e,{indent:" "}).replaceAll(" "," ").replace(/\r\n|\r|\n/g,"
    ").replace(/("[^"]+")/g,this.buildHtmlElement("code","bold text-green-600 p-0","$1")).replace(/Array( |\s)+(\[[^\]]+\])/g,this.buildHtmlElement("code","bold text-gray-500 p-0","$1$2")).replace(/^(\[[^\]]+\])$/g,this.buildHtmlElement("code","bold text-gray-500 p-0","$1")).replace(/(\{.+\})/g,this.buildHtmlElement("code","text-gray-600","$1")).replace(/(Array|Object|Number|Function|Circular|Symbol|WeakMap|Map)/g,this.buildHtmlElement("span","bold text-yellow-600","$1")).replaceAll(/(true|false|null|undefined|NaN)/g,this.buildHtmlElement("span","bold text-indigo-600","$1")).replace(/(: |[,[\]{}])/g,this.buildHtmlElement("span","bold text-orange-400","$1"));return this.buildHtmlElement("code","",t)}}class In{constructor(){Tn(this,"remotePath",null),Tn(this,"localPath",null),Tn(this,"initialized",!1),Tn(this,"data",{type:"",content:"",origin:{function_name:"",file:"",line_number:0,hostname:"remote"}})}replaceRemotePathWithLocalPath(e){if(null===this.remotePath||null===this.localPath)return e;const t=new RegExp(`^${this.remotePath}`);return e.replace(t,this.localPath)}getContent(){return{}}toArray(){return this.initialized||(this.initialized=!0,this.data.type=this.getType(),this.data.content=this.getContent(),this.data.origin.file=this.replaceRemotePathWithLocalPath(this.data.origin.file)),this.data}toJson(){return JSON.stringify(this.toArray())}}class zn extends In{constructor(e){super(),Tn(this,"value"),this.value=e}getType(){return"custom"}getContent(){return{content:this.value,label:"Boolean"}}}class Un extends In{constructor(e=""){super(),Tn(this,"html"),this.html=e}getType(){return"custom"}getContent(){return{content:this.html,label:"HTML"}}}class Vn extends In{constructor(e){super(),Tn(this,"values"),this.values=Array.isArray(e)?e:[e]}static createForArguments(e){return new this(e.map((e=>Hn.convertToPrimitive(e).value)))}getType(){return"log"}getContent(){return{values:this.values}}}class Wn extends In{getType(){return"custom"}getContent(){return{content:null,label:"Null"}}}class Kn{constructor(e){Tn(this,"values"),this.values=e}static createForValues(e){return new this(e).getPayloads()}static registerPayloadFinder(e){this.payloadFinder=e}getPayloads(){return this.values.map((e=>this.getPayload(e)))}getPayload(e){if("boolean"==typeof e)return new zn(e);if(null===e)return new Wn;const t=Hn.convertToPrimitive(e);return t.isHtml?new Un(t.value):new Vn(t.value)}}Tn(Kn,"payloadFinder",null);class Gn extends In{constructor(e){super(),Tn(this,"frames"),this.frames=Mn.removeRayFrames(e)}getType(){return"caller"}getContent(){var e,t,n,r,i,o,s,a;const l=this.frames.slice(0)[0]||null,c=null!=(r=null==(n=null==(t=null==(e=null==l?void 0:l.getFunctionName())?void 0:e.replace("Proxy.",""))?void 0:t.split("."))?void 0:n.slice(0))?r:[];return{frame:{file_name:this.replaceRemotePathWithLocalPath(null!=(i=null==l?void 0:l.getFileName())?i:""),line_number:(null==l?void 0:l.getLineNumber())||0,class:null!=(o=c[0])?o:"",method:c?c.slice(1).join("."):"",vendor_frame:null!=(a=null==(s=null==l?void 0:l.getFileName())?void 0:s.includes("node_modules"))&&a}}}}class Xn extends In{getType(){return"clear_all"}}class Yn extends In{constructor(e){super(),Tn(this,"color"),this.color=e}getType(){return"color"}getContent(){return{color:this.color}}}class Jn extends In{getType(){return"confetti"}}class Zn extends In{constructor(e){super(),Tn(this,"name"),this.name=e}getType(){return"create_lock"}getContent(){return{name:this.name}}}class Qn extends In{constructor(e,t=""){super(),Tn(this,"content"),Tn(this,"label"),this.content=e,this.label=t}getType(){return"custom"}getContent(){return{content:this.content,label:this.label}}}function er(e,t){if(void 0===t&&(t=e,e=0),"number"!=typeof e||"number"!=typeof t)throw new TypeError("Expected all arguments to be numbers");return Math.floor(Math.random()*(t-e+1)+e)}const tr=e=>{const t=(new Date).getTime();for(;(new Date).getTime()(t.encodeEntities&&(e=(e=>{const t={"¢":"cent","£":"pound","¥":"yen","€":"euro","©":"copy","®":"reg","<":"lt",">":"gt",'"':"quot","&":"amp","'":"#39"},n=Object.keys(t),r=new RegExp(`[${n.join("")}]`,"g");return e.replace(r,(e=>`&${t[e]};`))})(e)),e.replace(/^(\s+)/gm,(e=>{return`${t=e," ".repeat(t.length)}`;var t})).replace(/(\r\n|\r|\n)/g,"
    ")),rr=e=>!!e.length&&e[e.length-1];function ir(e){const t="0123456789abcdef";function n(e){let n,r="";for(n=0;n<=3;n++)r+=t.charAt(e>>8*n+4&15)+t.charAt(e>>8*n&15);return r}function r(e,t){const n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function i(e,t,n,i,o,s){return r((a=r(r(t,e),r(i,s)))<<(l=o)|a>>>32-l,n);var a,l}function o(e,t,n,r,o,s,a){return i(t&n|~t&r,e,t,o,s,a)}function s(e,t,n,r,o,s,a){return i(t&r|n&~r,e,t,o,s,a)}function a(e,t,n,r,o,s,a){return i(t^n^r,e,t,o,s,a)}function l(e,t,n,r,o,s,a){return i(n^(t|~r),e,t,o,s,a)}let c,u,d,h,p,f=1732584193,m=-271733879,g=-1732584194,y=271733878;const v=function(e){let t;const n=1+(e.length+8>>6),r=new Array(16*n);for(t=0;t<16*n;t++)r[t]=0;for(t=0;t>2]|=e.charCodeAt(t)<>2]|=128<e<10?`0${e}`:e,r={YYYY:()=>e.getFullYear(),YY:()=>String(e.getFullYear()).slice(-2),MM:()=>n(e.getMonth()+1),M:()=>e.getMonth()+1,DD:()=>n(e.getDate()),D:()=>e.getDate(),HH:()=>n(e.getHours()),H:()=>e.getHours(),hh:()=>n(e.getHours()%12||12),h:()=>e.getHours()%12||12,mm:()=>n(e.getMinutes()),m:()=>e.getMinutes(),ss:()=>n(e.getSeconds()),s:()=>e.getSeconds(),A:()=>e.getHours()<12?"AM":"PM",a:()=>e.getHours()<12?"am":"pm",T:()=>(e=>{const t=new Intl.DateTimeFormat("en",{timeZoneName:"short"}).formatToParts(e).find((e=>"timeZoneName"===e.type));return t?t.value:""})(e),Z:()=>{const t=e.getTimezoneOffset();return`${(t>0?"-":"+")+n(Math.floor(Math.abs(t)/60))}:${n(Math.abs(t)%60)}`},z:()=>{const t=e.getTimezoneOffset();return""+((t>0?"-":"+")+n(Math.floor(Math.abs(t)/60))+n(Math.abs(t)%60))}};let i="",o=!1;for(let e=0;e${this.err.name}:
    ${this.err.message}`}}class cr extends In{constructor(e,t){super(),Tn(this,"eventName"),Tn(this,"payload"),this.eventName=e,this.payload=t}getType(){return"event"}getContent(){return{name:this.eventName,event:this.payload[0],payload:Hn.convertToPrimitive(this.payload).value,class_based_event:!0}}}class ur extends In{constructor(e,t={}){super(),Tn(this,"exception"),Tn(this,"meta",{}),Tn(this,"stack"),this.exception=e,this.meta=t}static async make(e,t={}){const n=new ur(e,t);return n.stack=await An.get(),n}getType(){return"exception"}getContent(){return{class:this.exception.name,message:this.exception.message,frames:this.getFrames(),meta:this.meta}}getFrames(){return this.stack.slice(1).map((e=>{var t,n,r,i;const o=null!=(n=null==(t=e.functionName)?void 0:t.split("."))?n:["unknown","unknown"],s=o.pop();let a="string"!=typeof e.functionName?"unknown":o.pop();void 0===e.functionName&&(a="unknown");return{file_name:this.replaceRemotePathWithLocalPath(null!=(r=e.getFileName())?r:""),line_number:e.getLineNumber(),class:a,method:void 0===e.fileName?"":s,vendor_frame:null==(i=e.getFileName())?void 0:i.includes("node_modules"),snippet:[]}})).filter((e=>!e.file_name.startsWith("node:"))).filter((e=>!e.file_name.includes("jest-circus"))).filter((e=>"Ray"!==e.class&&"exception"!==e.method))}}class dr extends In{getType(){return"hide_app"}}class hr extends In{getType(){return"hide"}}class pr extends In{constructor(e,t={highlight:"none"}){super(),Tn(this,"value"),Tn(this,"options"),this.value=e,this.options=t}getType(){return"custom"}getContent(){return{content:this.formatMarkupForDisplay(this.value),label:"Markup"}}formatMarkupForDisplay(e){const t=this.formatAndIndentMarkup(e);return this.highlightHtmlMarkup(nr(t,{encodeEntities:!0}))}formatAndIndentMarkup(e){return On(e.toString(),{indentation:" ",collapseContent:!0,lineSeparator:"\n"})}highlightHtmlMarkup(e){return e.replace(/"/g,'"').replace(/="([^"]+)"/g,"="$1"").replace(/(<[A-Za-z\d-]+)(\s| |>)/g,'$1$2').replace(/(<\/[A-Za-z\d-]+)(>)/g,'$1$2')}}class fr extends In{constructor(e){super(),Tn(this,"location"),this.location=e}getType(){return"custom"}getContent(){return{content:``,label:"Image"}}}class mr extends In{constructor(e){super(),Tn(this,"value"),this.value=e}getType(){return"json_string"}getContent(){return{value:JSON.stringify(this.value)}}}class gr extends In{constructor(e){super(),Tn(this,"label"),this.label=e}getType(){return"label"}getContent(){return{label:this.label}}}class yr extends In{constructor(e,t){super(),Tn(this,"name"),Tn(this,"isNewTimer",!1),Tn(this,"totalTime",0),Tn(this,"maxMemoryUsageDuringTotalTime",0),Tn(this,"timeSinceLastCall",0),Tn(this,"maxMemoryUsageSinceLastCall",0),this.name=e,this.totalTime=t.getDuration(),this.maxMemoryUsageDuringTotalTime=t.getMemory();const n=t.getPeriods();n.length>1&&(this.timeSinceLastCall=rr(n),this.maxMemoryUsageSinceLastCall=0)}getType(){return"measure"}concernsNewTimer(){return this.isNewTimer=!0,this.totalTime=0,this.maxMemoryUsageDuringTotalTime=0,this.timeSinceLastCall=0,this.maxMemoryUsageSinceLastCall=0,this}getContent(){return{name:this.name,is_new_timer:this.isNewTimer,total_time:this.totalTime,max_memory_usage_during_total_time:this.maxMemoryUsageDuringTotalTime,time_since_last_call:this.timeSinceLastCall,max_memory_usage_since_last_call:this.maxMemoryUsageSinceLastCall}}}class vr extends In{constructor(e){super(),Tn(this,"name"),this.name=e}getType(){return"new_screen"}getContent(){return{name:this.name}}}class wr extends In{constructor(e){super(),Tn(this,"text"),this.text=e}getType(){return"notify"}getContent(){return{value:this.text}}}class br extends In{getType(){return"remove"}}class xr extends In{constructor(e){super(),Tn(this,"color"),this.color=e}getType(){return"screen_color"}getContent(){return{color:this.color}}}class Er extends In{getType(){return"separator"}}class Cr extends In{getType(){return"show_app"}}class kr extends In{constructor(e){super(),Tn(this,"size"),this.size=e}getType(){return"size"}getContent(){return{size:this.size}}}class Ar extends In{constructor(e,t="Table"){super(),Tn(this,"values"),Tn(this,"label"),this.values=e,this.label=t}getType(){return"table"}getContent(){return{values:this.getValues(),label:this.label}}getValues(){if(Array.isArray(this.values))return this.values.map((e=>Hn.convertToPrimitive(e).value));const e={};for(const t in this.values)e[t]=Hn.convertToPrimitive(this.values[t]).value;return e}}class Or extends In{constructor(e){super(),this.text=e}getType(){return"custom"}getContent(){return{content:nr(this.text,{encodeEntities:!0}),label:"Text"}}}class Sr extends In{constructor(e){super(),Tn(this,"frames"),Tn(this,"startFromIndexNum",null),Tn(this,"limitNum",null),this.frames=Mn.removeRayFrames(e)}getType(){return"trace"}getContent(){var e;let t=this.frames.map((e=>{var t,n,r,i;const o=null==(t=e.getFunctionName())?void 0:t.replace("Proxy.","").split(".").slice(0),s=(null==o?void 0:o.length)?o.shift():"",a=null!=(n=null==o?void 0:o.join("."))?n:"";return{file_name:this.replaceRemotePathWithLocalPath(null!=(r=e.getFileName())?r:""),line_number:e.getLineNumber(),class:s,method:a,vendor_frame:null==(i=e.getFileName())?void 0:i.includes("node_modules")}}));return null!==this.limitNum&&(t=t.slice(null!=(e=this.startFromIndexNum)?e:0,this.limitNum)),{frames:t}}}class Tr extends In{constructor(e){super(),Tn(this,"value"),this.value=e}getType(){return"custom"}getContent(){return{content:this.formatXmlForDisplay(this.value),label:"XML"}}formatXmlForDisplay(e){const t=this.formatAndIndentXml(e);return this.encodeXml(t)}encodeXml(e){return nr(e,{encodeEntities:!0})}formatAndIndentXml(e){return On(e.toString(),{indentation:" ",collapseContent:!0,lineSeparator:"\n"})}}class _r{constructor(e,t,n={}){Tn(this,"uuid"),Tn(this,"payloads"),Tn(this,"meta"),this.uuid=e,this.payloads=t,this.meta=n}toArray(){return{uuid:this.uuid,payloads:this.payloads.map((e=>e.toArray())),meta:this.meta}}toJson(){return JSON.stringify(this.toArray())}}class Nr{constructor(e){Tn(this,"enable",!0),Tn(this,"_host","localhost"),Tn(this,"_port",23517),Tn(this,"_scheme","http"),Tn(this,"remote_path",null),Tn(this,"local_path",null),Tn(this,"always_send_raw_values",!1),Tn(this,"intercept_console_log",!1),Tn(this,"enabled_callback",null),Tn(this,"sent_payload_callback",null),Tn(this,"sending_payload_callback",null),Tn(this,"originalSettings"),this.originalSettings=Object.assign({},e);for(const t in e)this[t]=e[t]}set host(e){this._host=e,ai.useClient(new Nn(this.port,this.host,this.scheme))}get host(){return this._host}set port(e){this._port=e,ai.useClient(new Nn(this.port,this.host,this.scheme))}get port(){return this._port}get scheme(){return this._scheme}set scheme(e){this._scheme=e,ai.useClient(new Nn(this.port,this.host,this.scheme))}toObject(){return this.originalSettings}}class Pr{constructor(e,t=null){var n;Tn(this,"name"),Tn(this,"laps",[]),Tn(this,"startedAt"),Tn(this,"endedAt"),Tn(this,"lapTime"),this.name=null==(n=e.name)?void 0:n.slice(0),this.laps=e.laps.slice(0),this.startedAt=e.startedAt,this.endedAt=e.endedAt,this.lapTime=null!=t?t:(new Date).getTime()}getDuration(){return this.laps.reduce(((e,t)=>t+e),0)}getMemory(e=null){return 0}getPeriods(){return this.laps.slice()}getPreviousDuration(){return rr(this.laps)-((new Date).getTime()-this.lapTime)}}class Lr{constructor(e=void 0){Tn(this,"name"),Tn(this,"laps",[]),Tn(this,"startedAt",0),Tn(this,"endedAt",0),this.name=e,this.laps=[],this.startedAt=0,this.endedAt=0}initialize(e){this.name=e,this.laps=[],this.startedAt=0,this.endedAt=0}start(e){return this.startedAt=(new Date).getTime(),new Pr(this)}lap(){const e=(new Date).getTime(),t=e-this.startedAt;return this.laps.push(t-this.totalDuration()),new Pr(this,e)}stop(){this.endedAt=(new Date).getTime();const e=this.endedAt-this.startedAt;return this.laps.push(e-this.totalDuration()),new Pr(this)}totalDuration(){return this.laps.reduce(((e,t)=>t+e),0)}reset(){return this.initialize(this.name),this}getLaps(){return this.laps}}class jr{constructor(e){Tn(this,"store",[]),Tn(this,"clock"),this.clock=e}hit(){return this.store.push(this.clock.now()),this}clear(){return this.store=[],this}count(){return this.store.length}countLastSecond(){const e=this.clock.now().subSeconds(1);let t=0;return this.store.forEach((n=>{this.isBetween(n,e,this.clock.now())&&t++})),t}isBetween(e,t,n){return e.getTimestamp()>=t.getTimestamp()&&e.getTimestamp()<=n.getTimestamp()}}class Mr{}class Dr{constructor(e=null){Tn(this,"dateStr"),Tn(this,"dateTs"),Tn(this,"_date"),this._date=null!=e?e:new Date,this.date=this._date,this.dateStr=this.date.toISOString(),this.dateTs=this.date.getTime()}get date(){return this._date}set date(e){this.dateTs=e.getTime(),this.dateStr=e.toISOString()}static createFrom(e){return new Dr(e)}getTimestamp(){return Math.floor(this.dateTs/1e3)}addSeconds(e){return Dr.createFrom(new Date(this.dateTs+1e3*e))}subSeconds(e){return Dr.createFrom(new Date(this.dateTs-1e3*e))}}class Fr extends Mr{now(){return new Dr}}class $r{constructor(e=null,t=null){Tn(this,"maxCalls"),Tn(this,"maxPerSecond"),Tn(this,"cache"),Tn(this,"notified",!1),this.maxCalls=e,this.maxPerSecond=t,this.cache=new jr(new Fr)}static disabled(){return new $r(null,null)}hit(){return this.cache.hit(),this}max(e=null){return this.maxCalls=e,this}perSecond(e=null){return this.maxPerSecond=e,this}isMaxReached(){if(null===this.maxCalls)return!1;const e=this.cache.count()>=this.maxCalls;return e||(this.notified=!1),e}isMaxPerSecondReached(){if(null===this.maxPerSecond)return!1;const e=this.cache.countLastSecond()>=this.maxPerSecond;return!1===e&&(this.notified=!1),e}clear(){return this.maxCalls=null,this.maxPerSecond=null,this.cache.clear(),this}isNotified(){return this.notified}notify(){this.notified=!0}getCache(){return this.cache}}var Rr=(e=>(e.Sending="sending",e.Sent="sent",e))(Rr||{});const Br="2.1.2",qr=(e,t,n=[])=>{const r=Object.getOwnPropertyDescriptors(t);for(let e of n)delete r[e];Object.defineProperties(e,r)},Hr=(e,t=[e])=>{const n=Object.getPrototypeOf(e);return null===n?t:Hr(n,[...t,n])},Ir=(e,t,n=[])=>{var r;const i=null!==(r=((...e)=>{if(0===e.length)return;let t;const n=e.map((e=>Hr(e)));for(;n.every((e=>e.length>0));){const e=n.map((e=>e.pop())),r=e[0];if(!e.every((e=>e===r)))break;t=r}return t})(...e))&&void 0!==r?r:Object.prototype,o=Object.create(i),s=Hr(i);for(let t of e){let e=Hr(t);for(let t=e.length-1;t>=0;t--){let r=e[t];-1===s.indexOf(r)&&(qr(o,r,["constructor",...n]),s.push(r))}}return o.constructor=t,o},zr=e=>e.filter(((t,n)=>e.indexOf(t)==n)),Ur=(e,t)=>{const n=t.map((e=>Hr(e)));let r=0,i=!0;for(;i;){i=!1;for(let o=t.length-1;o>=0;o--){const t=n[o][r];if(null!=t&&(i=!0,null!=Object.getOwnPropertyDescriptor(t,e)))return n[o][0]}r++}},Vr=(e,t=Object.prototype)=>new Proxy({},{getPrototypeOf(){return t},setPrototypeOf(){throw Error("Cannot set prototype of Proxies created by ts-mixer")},getOwnPropertyDescriptor(t,n){return Object.getOwnPropertyDescriptor(Ur(n,e)||{},n)},defineProperty(){throw new Error("Cannot define new properties on Proxies created by ts-mixer")},has(n,r){return void 0!==Ur(r,e)||void 0!==t[r]},get(n,r){return(Ur(r,e)||t)[r]},set(t,n,r){const i=Ur(n,e);if(void 0===i)throw new Error("Cannot set new properties on Proxies created by ts-mixer");return i[n]=r,!0},deleteProperty(){throw new Error("Cannot delete properties on Proxies created by ts-mixer")},ownKeys(){return e.map(Object.getOwnPropertyNames).reduce(((e,t)=>t.concat(e.filter((e=>t.indexOf(e)<0)))))}}),Wr=null,Kr="copy",Gr="copy",Xr="deep",Yr=new WeakMap,Jr=e=>Yr.get(e),Zr=(e,t)=>{var n,r;const i=zr([...Object.getOwnPropertyNames(e),...Object.getOwnPropertyNames(t)]),o={};for(let s of i)o[s]=zr([...null!==(n=null==e?void 0:e[s])&&void 0!==n?n:[],...null!==(r=null==t?void 0:t[s])&&void 0!==r?r:[]]);return o},Qr=(e,t)=>{var n,r,i,o;return{property:Zr(null!==(n=null==e?void 0:e.property)&&void 0!==n?n:{},null!==(r=null==t?void 0:t.property)&&void 0!==r?r:{}),method:Zr(null!==(i=null==e?void 0:e.method)&&void 0!==i?i:{},null!==(o=null==t?void 0:t.method)&&void 0!==o?o:{})}},ei=(e,t)=>{var n,r,i,o,s,a;return{class:zr([...null!==(n=null==e?void 0:e.class)&&void 0!==n?n:[],...null!==(r=null==t?void 0:t.class)&&void 0!==r?r:[]]),static:Qr(null!==(i=null==e?void 0:e.static)&&void 0!==i?i:{},null!==(o=null==t?void 0:t.static)&&void 0!==o?o:{}),instance:Qr(null!==(s=null==e?void 0:e.instance)&&void 0!==s?s:{},null!==(a=null==t?void 0:t.instance)&&void 0!==a?a:{})}},ti=new Map,ni=(...e)=>{const t=((...e)=>{var t;const n=new Set,r=new Set([...e]);for(;r.size>0;)for(let e of r){const i=[...Hr(e.prototype).map((e=>e.constructor)),...null!==(t=Jr(e))&&void 0!==t?t:[]].filter((e=>!n.has(e)));for(let e of i)r.add(e);n.add(e),r.delete(e)}return[...n]})(...e).map((e=>ti.get(e))).filter((e=>!!e));return 0==t.length?{}:1==t.length?t[0]:t.reduce(((e,t)=>ei(e,t)))},ri=e=>{let t=ti.get(e);return t||(t={},ti.set(e,t)),t};function ii(...e){var t,n,r;const i=e.map((e=>e.prototype)),o=Wr;if(null!==o){const e=i.map((e=>e[o])).filter((e=>"function"==typeof e)),t=function(...t){for(let n of e)n.apply(this,t)},n={[o]:t};i.push(n)}function s(...t){for(const n of e)qr(this,new n(...t));null!==o&&"function"==typeof this[o]&&this[o].apply(this,t)}var a,l;s.prototype="copy"===Gr?Ir(i,s):(a=i,l=s,Vr([...a,{constructor:l}])),Object.setPrototypeOf(s,"copy"===Kr?Ir(e,null,["prototype"]):Vr(e,Function.prototype));let c=s;if("none"!==Xr){const i="deep"===Xr?ni(...e):((...e)=>{const t=e.map((e=>ri(e)));return 0===t.length?{}:1===t.length?t[0]:t.reduce(((e,t)=>ei(e,t)))})(...e);for(let e of null!==(t=null==i?void 0:i.class)&&void 0!==t?t:[]){const t=e(c);t&&(c=t)}oi(null!==(n=null==i?void 0:i.static)&&void 0!==n?n:{},c),oi(null!==(r=null==i?void 0:i.instance)&&void 0!==r?r:{},c.prototype)}var u,d;return u=c,d=e,Yr.set(u,d),c}const oi=(e,t)=>{const n=e.property,r=e.method;if(n)for(let e in n)for(let r of n[e])r(t,e);if(r)for(let e in r)for(let n of r[e])n(t,e,Object.getOwnPropertyDescriptor(t,e))},si=class e extends(ii(Pn,jn,Ln)){constructor(t,n=null,r=null,i=!1){var o,s,a;super(),Tn(this,"inCallback",!1),Tn(this,"settings"),Tn(this,"uuid"),Tn(this,"limitOrigin",null),Tn(this,"canSendPayload",!0),Tn(this,"chaining",!1),Tn(this,"chainedPayloads",[]),!0===e.defaultSettings.not_defined&&(e.defaultSettings={enable:!0,host:"localhost",port:23517,scheme:"http",local_path:null,remote_path:null,always_send_raw_values:!1,enabled_callback:null,sending_payload_callback:null,sent_payload_callback:null,not_defined:!1}),e.defaultSettings=Object.assign({},e.defaultSettings,t.toObject()),this.inCallback=i,this.settings=new Nr(e.defaultSettings),null===e.enabled&&(e.enabled=!1!==this.settings.enable),e.client=null!=(o=null!=n?n:e.client)?o:new Nn(this.settings.port,this.settings.host),e._rateLimiter=null!=(s=e._rateLimiter)?s:$r.disabled(),this.uuid=null!=(a=null!=r?r:e.fakeUuid)?a:(()=>{const e={random:[er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255),er(1,255)]};return kn(e).toString()})(),this.settings.intercept_console_log&&!this.interceptor().active()&&this.interceptor().enable(),this.loadMacros()}static create(t=null,n=null){!0===e.defaultSettings.not_defined&&(e.defaultSettings={enable:!0,host:"localhost",port:23517,scheme:"http",local_path:null,remote_path:null,always_send_raw_values:!1,not_defined:!1,intercept_console_log:!1,enabled_callback:null,sending_payload_callback:null,sent_payload_callback:null});return new this(new Nr(e.defaultSettings),t,n)}static useDefaultSettings(t){return!0===e.defaultSettings.not_defined&&(e.defaultSettings={enable:!0,host:"localhost",port:23517,scheme:"http",local_path:null,remote_path:null,always_send_raw_values:!1,enabled_callback:null,sending_payload_callback:null,sent_payload_callback:null,not_defined:!1}),e.defaultSettings=Object.assign({},e.defaultSettings,t),e.defaultSettings.not_defined=!1,e.client=new Nn(this.defaultSettings.port,this.defaultSettings.host),this}loadMacros(){for(const t in e.macros){const n=e.macros[t];this[t]=n.bind(this)}return this}interceptor(){return e.interceptor}client(){return e.client}enable(){return e.enabled=!0,this}disable(){return e.enabled=!1,this}enabled(){return"function"==typeof this.settings.enabled_callback?e.enabled&&this.settings.enabled_callback():e.enabled}disabled(){return!this.enabled()}static useClient(e){this.client=e}project(t){return e.projectName=t,this}newScreen(e=""){const t=new vr(e);return this.sendRequest(t)}clearAll(){const e=new Xn;return this.sendRequest(e)}clearScreen(){return this.newScreen()}color(e){const t=new Yn(e);return this.sendRequest(t)}confetti(){const e=new Jn;return this.sendRequest(e)}screenColor(e){const t=new xr(e);return this.sendRequest(t)}label(e){const t=new gr(e);return this.sendRequest(t)}size(e){const t=new kr(e);return this.sendRequest(t)}remove(){const e=new br;return this.sendRequest(e)}hide(){const e=new hr;return this.sendRequest(e)}notify(e){const t=new wr(e);return this.sendRequest(t)}toJson(...e){const t=e.map((e=>new mr(e)));return this.sendRequest(t)}json(...e){const t=e.map((e=>new ar(e)));return this.sendRequest(t)}file(e){throw new Error("file() unsupported on node-ray/web.")}image(e){const t=new fr(e);return this.sendRequest(t)}die(e=""){throw new Error(`Ray.die() called: ${e||"no message"}`)}className(e){return this.send(e.constructor.name)}error(e){const t=new lr(e,"Error");return this.sendRequest(t).red()}event(e,t=[]){const n=new cr(e,t);return this.sendRequest(n)}async exception(e,t={}){const n=await ur.make(e,t);return await this.sendRequest(n).red()}ban(){return this.send("🕶")}charles(){return this.send("🎶 🎹 🎷 🕺")}table(e,t="Table"){const n=new Ar(e,t);return this.sendRequest(n)}async count(t=null){var n;const r=await this.getCaller(),i=ir(`${null==r?void 0:r.getFileName()}${null==r?void 0:r.getLineNumber()}`),[o,s]=await e.counters.increment(null!=(n=null!=t?t:i)?n:"none");let a="Called ";return t&&(a+=`'${t}' `),a+=`${s} ${1===s?"time":"times"}.`,o.sendCustom(a,"Count"),o}clearCounters(){return e.counters.clear(),this}async pause(){e.lockCounter++;const t=ir(`${(new Date).getTime()}-${e.lockCounter}`),n=new Zn(t);return this.sendRequest(n),new Promise((async(n,r)=>{let i;do{tr(1e3*1);try{i=await e.client.lockExists(t)}catch(e){return r(e),!1}if(!0!==i&&i&&i.stop_execution)return r(!1),!1}while(i.active);n(this)}))}stopTime(t=""){return""===t?(e.stopWatches={},this):(void 0!==e.stopWatches[t]&&delete e.stopWatches[t],this)}async caller(){const e=await An.get(),t=new Gn(e);return this.sendRequest(t)}async trace(){const e=await An.get();return this.sendRequest(new Sr(e))}measure(t="default"){if(t instanceof Function)return this.measureClosure(t);if(void 0===e.stopWatches[t]){const n=this.getStopwatch(t);e.stopWatches[t]=n;const r=n.start(t),i=this.getMeasurePayload(t,r);return i.concernsNewTimer(),this.sendRequest(i)}const n=e.stopWatches[t].lap(),r=this.getMeasurePayload(t,n);return this.sendRequest(r)}measureClosure(e){const t=this.getStopwatch("closure");t.start("closure"),e();const n=t.stop(),r=this.getMeasurePayload("closure",n);return this.sendRequest(r)}getStopwatch(e){return new Lr(e)}getMeasurePayload(e,t){return new yr(e,t)}separator(){const e=new Er;return this.sendRequest(e)}xml(e){const t=new Tr(e);return this.sendRequest(t)}html(e=""){const t=new Un(e);return this.sendRequest(t)}text(e=""){const t=new Or(e);return this.sendRequest(t)}date(e){const t=new sr(e);return this.sendRequest(t)}raw(...e){if(!e.length)return this;const t=e.map((e=>Vn.createForArguments([e])));return this.sendRequest(t)}send(...e){if(!e.length)return this;if(this.settings.always_send_raw_values)return this.raw(...e);const t=Kn.createForValues(e);return this.sendRequest(t)}pass(e){return this.send(e),e}showApp(){const e=new Cr;return this.sendRequest(e)}hideApp(){const e=new dr;return this.sendRequest(e)}macro(t,n){return e.macros[t]=n,this[t]=n.bind(this),this}htmlMarkup(e,t={}){const n=new pr(e,t);return this.sendRequest(n)}if(e,t=null){return"function"==typeof e&&(e=e()),e&&null!==t&&t(this),null===t&&(this.canSendPayload=e),this}async limit(t){const n=await this.getCaller();return this.limitOrigin={function_name:null==n?void 0:n.getFunctionName(),file:null==n?void 0:n.getFileName(),line_number:null==n?void 0:n.getLineNumber(),hostname:qn.get()},e.limiters.initialize(this.limitOrigin,t),this}async once(...t){const n=await this.getCaller();return this.limitOrigin={function_name:null==n?void 0:n.getFunctionName(),file:null==n?void 0:n.getFileName(),line_number:null==n?void 0:n.getLineNumber(),hostname:qn.get()},e.limiters.initialize(this.limitOrigin,1),t.length>0?this.send(...t):this}chain(e){return this.chaining=!0,e(this),this.chaining=!1,this.sendRequest(this.chainedPayloads.slice(0)),this.chainedPayloads=[],this}sendCustom(e,t=""){const n=new Qn(e,t);return this.sendRequest(n)}async getOriginFrame(){const e=await An.get();let t=e.findIndex((e=>{var t;return null==(t=e.functionName)?void 0:t.includes("Ray.sendRequest")}));-1===t&&(t=0);return Mn.removeRayFrames(e.slice(t)).slice(0).shift()}async getCaller(){const e=await An.get();let t=e.findIndex((e=>{var t;return null==(t=e.functionName)?void 0:t.includes("Ray.getCaller")}));-1===t&&(t=0);const n=e.slice(t);return 1===n.length?n.shift():n.slice(2).shift()}async getOriginData(){const e=await this.getOriginFrame();return{function_name:null==e?void 0:e.getFunctionName(),file:null==e?void 0:e.getFileName(),line_number:null==e?void 0:e.getLineNumber(),hostname:qn.get()}}prepareMeta(t){return Object.assign({},{node_ray_package_version:Br,project_name:e.projectName},t)}executePayloadCallback(t,n=[]){if(!this.inCallback){this.inCallback=!0;try{t===Rr.Sending&&null!==this.settings.sending_payload_callback&&this.settings.sending_payload_callback(new e(this.settings,this.client(),this.uuid,!0),n),t===Rr.Sent&&null!==this.settings.sent_payload_callback&&this.settings.sent_payload_callback(this)}catch(e){}this.inCallback=!1}}sendRequest(t,n=[]){if(!this.enabled())return this;if(!this.canSendPayload)return this;if(this.chaining){const e=Array.isArray(t)?t:[t];return this.chainedPayloads.push(...e),this}if(null!==this.limitOrigin){if(!e.limiters.canSendPayload(this.limitOrigin))return this;e.limiters.increment(this.limitOrigin)}return Array.isArray(t)||(t=[t]),this.rateLimiter().isMaxReached()||this.rateLimiter().isMaxPerSecondReached()?(this.rateLimiter().notified=!0,this.notifyWhenRateLimitReached(),this):(t.forEach((e=>{this.getOriginData().then((t=>{e.data.origin=t})),e.remotePath=this.settings.remote_path,e.localPath=this.settings.local_path})),this.executePayloadCallback(Rr.Sending,t),e.client.send(new _r(this.uuid,t,this.prepareMeta(n))),this.rateLimiter().hit(),this.executePayloadCallback(Rr.Sent,t),this)}rateLimiter(){return e._rateLimiter}async notifyWhenRateLimitReached(){if(this.rateLimiter().isNotified())return;const t=new Qn("Rate limit has been reached...","Rate limit"),n=new _r(this.uuid,[t],[]);await e.client.send(n),this.rateLimiter().notify()}standalone(t){void 0!==t&&(t.ray=li,t.Ray=e)}};Tn(si,"lockCounter",0),Tn(si,"defaultSettings",{not_defined:!0}),Tn(si,"client"),Tn(si,"projectName",""),Tn(si,"counters",new class{constructor(){Tn(this,"counters",{})}async increment(e){void 0===this.counters[e]&&(this.counters[e]=[await li(),0]);const t=this.counters[e],n=t[0],r=t[1]+1;return this.counters[e]=[n,r],[n,r]}get(e){return void 0===this.counters[e]?0:this.counters[e][1]}clear(){this.counters=[]}setRay(e,t){this.counters[e][0]=t}getCounters(){return this.counters}}),Tn(si,"limiters",new class{constructor(){Tn(this,"counters",{})}initialize(e,t){const n=`${e.file}:${e.line_number}`;return void 0===this.counters[n]&&(this.counters[n]={counter:0,limit:t,valid:!0}),this.counters[n]}increment(e){const t=`${e.file}:${e.line_number}`;if(void 0===this.counters[t])return{counter:0,limit:0,valid:!1};const{counter:n,limit:r,valid:i}=this.counters[t];return this.counters[t]={counter:n+1,limit:r,valid:i},this.counters[t]}canSendPayload(e){const t=`${e.file}:${e.line_number}`;if(void 0===this.counters[t])return!0;const{counter:n,limit:r,valid:i}=this.counters[t];return i&&(nai.create().send(...e);var ci=class extends i.xI{initialize(){window.ray=li}}},2891:function(e,t,n){"use strict";n.d(t,{lg:function(){return Q},xI:function(){return ce}});class r{constructor(e,t,n){this.eventTarget=e,this.eventName=t,this.eventOptions=n,this.unorderedBindings=new Set}connect(){this.eventTarget.addEventListener(this.eventName,this,this.eventOptions)}disconnect(){this.eventTarget.removeEventListener(this.eventName,this,this.eventOptions)}bindingConnected(e){this.unorderedBindings.add(e)}bindingDisconnected(e){this.unorderedBindings.delete(e)}handleEvent(e){const t=function(e){if("immediatePropagationStopped"in e)return e;{const{stopImmediatePropagation:t}=e;return Object.assign(e,{immediatePropagationStopped:!1,stopImmediatePropagation(){this.immediatePropagationStopped=!0,t.call(this)}})}}(e);for(const e of this.bindings){if(t.immediatePropagationStopped)break;e.handleEvent(t)}}hasBindings(){return this.unorderedBindings.size>0}get bindings(){return Array.from(this.unorderedBindings).sort(((e,t)=>{const n=e.index,r=t.index;return nr?1:0}))}}class i{constructor(e){this.application=e,this.eventListenerMaps=new Map,this.started=!1}start(){this.started||(this.started=!0,this.eventListeners.forEach((e=>e.connect())))}stop(){this.started&&(this.started=!1,this.eventListeners.forEach((e=>e.disconnect())))}get eventListeners(){return Array.from(this.eventListenerMaps.values()).reduce(((e,t)=>e.concat(Array.from(t.values()))),[])}bindingConnected(e){this.fetchEventListenerForBinding(e).bindingConnected(e)}bindingDisconnected(e,t=!1){this.fetchEventListenerForBinding(e).bindingDisconnected(e),t&&this.clearEventListenersForBinding(e)}handleError(e,t,n={}){this.application.handleError(e,`Error ${t}`,n)}clearEventListenersForBinding(e){const t=this.fetchEventListenerForBinding(e);t.hasBindings()||(t.disconnect(),this.removeMappedEventListenerFor(e))}removeMappedEventListenerFor(e){const{eventTarget:t,eventName:n,eventOptions:r}=e,i=this.fetchEventListenerMapForEventTarget(t),o=this.cacheKey(n,r);i.delete(o),0==i.size&&this.eventListenerMaps.delete(t)}fetchEventListenerForBinding(e){const{eventTarget:t,eventName:n,eventOptions:r}=e;return this.fetchEventListener(t,n,r)}fetchEventListener(e,t,n){const r=this.fetchEventListenerMapForEventTarget(e),i=this.cacheKey(t,n);let o=r.get(i);return o||(o=this.createEventListener(e,t,n),r.set(i,o)),o}createEventListener(e,t,n){const i=new r(e,t,n);return this.started&&i.connect(),i}fetchEventListenerMapForEventTarget(e){let t=this.eventListenerMaps.get(e);return t||(t=new Map,this.eventListenerMaps.set(e,t)),t}cacheKey(e,t){const n=[e];return Object.keys(t).sort().forEach((e=>{n.push(`${t[e]?"":"!"}${e}`)})),n.join(":")}}const o={stop({event:e,value:t}){return t&&e.stopPropagation(),!0},prevent({event:e,value:t}){return t&&e.preventDefault(),!0},self({event:e,value:t,element:n}){return!t||n===e.target}},s=/^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;function a(e){return"window"==e?window:"document"==e?document:void 0}function l(e){return e.replace(/(?:[_-])([a-z0-9])/g,((e,t)=>t.toUpperCase()))}function c(e){return l(e.replace(/--/g,"-").replace(/__/g,"_"))}function u(e){return e.charAt(0).toUpperCase()+e.slice(1)}function d(e){return e.replace(/([A-Z])/g,((e,t)=>`-${t.toLowerCase()}`))}function h(e){return null!=e}function p(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const f=["meta","ctrl","alt","shift"];class m{constructor(e,t,n,r){this.element=e,this.index=t,this.eventTarget=n.eventTarget||e,this.eventName=n.eventName||function(e){const t=e.tagName.toLowerCase();if(t in g)return g[t](e)}(e)||y("missing event name"),this.eventOptions=n.eventOptions||{},this.identifier=n.identifier||y("missing identifier"),this.methodName=n.methodName||y("missing method name"),this.keyFilter=n.keyFilter||"",this.schema=r}static forToken(e,t){return new this(e.element,e.index,function(e){const t=e.trim().match(s)||[];let n=t[2],r=t[3];return r&&!["keydown","keyup","keypress"].includes(n)&&(n+=`.${r}`,r=""),{eventTarget:a(t[4]),eventName:n,eventOptions:t[7]?(i=t[7],i.split(":").reduce(((e,t)=>Object.assign(e,{[t.replace(/^!/,"")]:!/^!/.test(t)})),{})):{},identifier:t[5],methodName:t[6],keyFilter:t[1]||r};var i}(e.content),t)}toString(){const e=this.keyFilter?`.${this.keyFilter}`:"",t=this.eventTargetName?`@${this.eventTargetName}`:"";return`${this.eventName}${e}${t}->${this.identifier}#${this.methodName}`}shouldIgnoreKeyboardEvent(e){if(!this.keyFilter)return!1;const t=this.keyFilter.split("+");if(this.keyFilterDissatisfied(e,t))return!0;const n=t.filter((e=>!f.includes(e)))[0];return!!n&&(p(this.keyMappings,n)||y(`contains unknown key filter: ${this.keyFilter}`),this.keyMappings[n].toLowerCase()!==e.key.toLowerCase())}shouldIgnoreMouseEvent(e){if(!this.keyFilter)return!1;const t=[this.keyFilter];return!!this.keyFilterDissatisfied(e,t)}get params(){const e={},t=new RegExp(`^data-${this.identifier}-(.+)-param$`,"i");for(const{name:n,value:r}of Array.from(this.element.attributes)){const i=n.match(t),o=i&&i[1];o&&(e[l(o)]=v(r))}return e}get eventTargetName(){return(e=this.eventTarget)==window?"window":e==document?"document":void 0;var e}get keyMappings(){return this.schema.keyMappings}keyFilterDissatisfied(e,t){const[n,r,i,o]=f.map((e=>t.includes(e)));return e.metaKey!==n||e.ctrlKey!==r||e.altKey!==i||e.shiftKey!==o}}const g={a:()=>"click",button:()=>"click",form:()=>"submit",details:()=>"toggle",input:e=>"submit"==e.getAttribute("type")?"click":"input",select:()=>"change",textarea:()=>"input"};function y(e){throw new Error(e)}function v(e){try{return JSON.parse(e)}catch(t){return e}}class w{constructor(e,t){this.context=e,this.action=t}get index(){return this.action.index}get eventTarget(){return this.action.eventTarget}get eventOptions(){return this.action.eventOptions}get identifier(){return this.context.identifier}handleEvent(e){const t=this.prepareActionEvent(e);this.willBeInvokedByEvent(e)&&this.applyEventModifiers(t)&&this.invokeWithEvent(t)}get eventName(){return this.action.eventName}get method(){const e=this.controller[this.methodName];if("function"==typeof e)return e;throw new Error(`Action "${this.action}" references undefined method "${this.methodName}"`)}applyEventModifiers(e){const{element:t}=this.action,{actionDescriptorFilters:n}=this.context.application,{controller:r}=this.context;let i=!0;for(const[o,s]of Object.entries(this.eventOptions))if(o in n){const a=n[o];i=i&&a({name:o,value:s,event:e,element:t,controller:r})}return i}prepareActionEvent(e){return Object.assign(e,{params:this.action.params})}invokeWithEvent(e){const{target:t,currentTarget:n}=e;try{this.method.call(this.controller,e),this.context.logDebugActivity(this.methodName,{event:e,target:t,currentTarget:n,action:this.methodName})}catch(t){const{identifier:n,controller:r,element:i,index:o}=this,s={identifier:n,controller:r,element:i,index:o,event:e};this.context.handleError(t,`invoking action "${this.action}"`,s)}}willBeInvokedByEvent(e){const t=e.target;return!(e instanceof KeyboardEvent&&this.action.shouldIgnoreKeyboardEvent(e))&&(!(e instanceof MouseEvent&&this.action.shouldIgnoreMouseEvent(e))&&(this.element===t||(t instanceof Element&&this.element.contains(t)?this.scope.containsElement(t):this.scope.containsElement(this.action.element))))}get controller(){return this.context.controller}get methodName(){return this.action.methodName}get element(){return this.scope.element}get scope(){return this.context.scope}}class b{constructor(e,t){this.mutationObserverInit={attributes:!0,childList:!0,subtree:!0},this.element=e,this.started=!1,this.delegate=t,this.elements=new Set,this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,this.mutationObserverInit),this.refresh())}pause(e){this.started&&(this.mutationObserver.disconnect(),this.started=!1),e(),this.started||(this.mutationObserver.observe(this.element,this.mutationObserverInit),this.started=!0)}stop(){this.started&&(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),this.started=!1)}refresh(){if(this.started){const e=new Set(this.matchElementsInTree());for(const t of Array.from(this.elements))e.has(t)||this.removeElement(t);for(const t of Array.from(e))this.addElement(t)}}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){"attributes"==e.type?this.processAttributeChange(e.target,e.attributeName):"childList"==e.type&&(this.processRemovedNodes(e.removedNodes),this.processAddedNodes(e.addedNodes))}processAttributeChange(e,t){this.elements.has(e)?this.delegate.elementAttributeChanged&&this.matchElement(e)?this.delegate.elementAttributeChanged(e,t):this.removeElement(e):this.matchElement(e)&&this.addElement(e)}processRemovedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.processTree(e,this.removeElement)}}processAddedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.elementIsActive(e)&&this.processTree(e,this.addElement)}}matchElement(e){return this.delegate.matchElement(e)}matchElementsInTree(e=this.element){return this.delegate.matchElementsInTree(e)}processTree(e,t){for(const n of this.matchElementsInTree(e))t.call(this,n)}elementFromNode(e){if(e.nodeType==Node.ELEMENT_NODE)return e}elementIsActive(e){return e.isConnected==this.element.isConnected&&this.element.contains(e)}addElement(e){this.elements.has(e)||this.elementIsActive(e)&&(this.elements.add(e),this.delegate.elementMatched&&this.delegate.elementMatched(e))}removeElement(e){this.elements.has(e)&&(this.elements.delete(e),this.delegate.elementUnmatched&&this.delegate.elementUnmatched(e))}}class x{constructor(e,t,n){this.attributeName=t,this.delegate=n,this.elementObserver=new b(e,this)}get element(){return this.elementObserver.element}get selector(){return`[${this.attributeName}]`}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get started(){return this.elementObserver.started}matchElement(e){return e.hasAttribute(this.attributeName)}matchElementsInTree(e){const t=this.matchElement(e)?[e]:[],n=Array.from(e.querySelectorAll(this.selector));return t.concat(n)}elementMatched(e){this.delegate.elementMatchedAttribute&&this.delegate.elementMatchedAttribute(e,this.attributeName)}elementUnmatched(e){this.delegate.elementUnmatchedAttribute&&this.delegate.elementUnmatchedAttribute(e,this.attributeName)}elementAttributeChanged(e,t){this.delegate.elementAttributeValueChanged&&this.attributeName==t&&this.delegate.elementAttributeValueChanged(e,t)}}function E(e,t,n){k(e,t).add(n)}function C(e,t,n){k(e,t).delete(n),function(e,t){const n=e.get(t);null!=n&&0==n.size&&e.delete(t)}(e,t)}function k(e,t){let n=e.get(t);return n||(n=new Set,e.set(t,n)),n}class A{constructor(){this.valuesByKey=new Map}get keys(){return Array.from(this.valuesByKey.keys())}get values(){return Array.from(this.valuesByKey.values()).reduce(((e,t)=>e.concat(Array.from(t))),[])}get size(){return Array.from(this.valuesByKey.values()).reduce(((e,t)=>e+t.size),0)}add(e,t){E(this.valuesByKey,e,t)}delete(e,t){C(this.valuesByKey,e,t)}has(e,t){const n=this.valuesByKey.get(e);return null!=n&&n.has(t)}hasKey(e){return this.valuesByKey.has(e)}hasValue(e){return Array.from(this.valuesByKey.values()).some((t=>t.has(e)))}getValuesForKey(e){const t=this.valuesByKey.get(e);return t?Array.from(t):[]}getKeysForValue(e){return Array.from(this.valuesByKey).filter((([t,n])=>n.has(e))).map((([e,t])=>e))}}class O{constructor(e,t,n,r){this._selector=t,this.details=r,this.elementObserver=new b(e,this),this.delegate=n,this.matchesByElement=new A}get started(){return this.elementObserver.started}get selector(){return this._selector}set selector(e){this._selector=e,this.refresh()}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get element(){return this.elementObserver.element}matchElement(e){const{selector:t}=this;if(t){const n=e.matches(t);return this.delegate.selectorMatchElement?n&&this.delegate.selectorMatchElement(e,this.details):n}return!1}matchElementsInTree(e){const{selector:t}=this;if(t){const n=this.matchElement(e)?[e]:[],r=Array.from(e.querySelectorAll(t)).filter((e=>this.matchElement(e)));return n.concat(r)}return[]}elementMatched(e){const{selector:t}=this;t&&this.selectorMatched(e,t)}elementUnmatched(e){const t=this.matchesByElement.getKeysForValue(e);for(const n of t)this.selectorUnmatched(e,n)}elementAttributeChanged(e,t){const{selector:n}=this;if(n){const t=this.matchElement(e),r=this.matchesByElement.has(n,e);t&&!r?this.selectorMatched(e,n):!t&&r&&this.selectorUnmatched(e,n)}}selectorMatched(e,t){this.delegate.selectorMatched(e,t,this.details),this.matchesByElement.add(t,e)}selectorUnmatched(e,t){this.delegate.selectorUnmatched(e,t,this.details),this.matchesByElement.delete(t,e)}}class S{constructor(e,t){this.element=e,this.delegate=t,this.started=!1,this.stringMap=new Map,this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){this.started||(this.started=!0,this.mutationObserver.observe(this.element,{attributes:!0,attributeOldValue:!0}),this.refresh())}stop(){this.started&&(this.mutationObserver.takeRecords(),this.mutationObserver.disconnect(),this.started=!1)}refresh(){if(this.started)for(const e of this.knownAttributeNames)this.refreshAttribute(e,null)}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){const t=e.attributeName;t&&this.refreshAttribute(t,e.oldValue)}refreshAttribute(e,t){const n=this.delegate.getStringMapKeyForAttribute(e);if(null!=n){this.stringMap.has(e)||this.stringMapKeyAdded(n,e);const r=this.element.getAttribute(e);if(this.stringMap.get(e)!=r&&this.stringMapValueChanged(r,n,t),null==r){const t=this.stringMap.get(e);this.stringMap.delete(e),t&&this.stringMapKeyRemoved(n,e,t)}else this.stringMap.set(e,r)}}stringMapKeyAdded(e,t){this.delegate.stringMapKeyAdded&&this.delegate.stringMapKeyAdded(e,t)}stringMapValueChanged(e,t,n){this.delegate.stringMapValueChanged&&this.delegate.stringMapValueChanged(e,t,n)}stringMapKeyRemoved(e,t,n){this.delegate.stringMapKeyRemoved&&this.delegate.stringMapKeyRemoved(e,t,n)}get knownAttributeNames(){return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))}get currentAttributeNames(){return Array.from(this.element.attributes).map((e=>e.name))}get recordedAttributeNames(){return Array.from(this.stringMap.keys())}}class T{constructor(e,t,n){this.attributeObserver=new x(e,t,this),this.delegate=n,this.tokensByElement=new A}get started(){return this.attributeObserver.started}start(){this.attributeObserver.start()}pause(e){this.attributeObserver.pause(e)}stop(){this.attributeObserver.stop()}refresh(){this.attributeObserver.refresh()}get element(){return this.attributeObserver.element}get attributeName(){return this.attributeObserver.attributeName}elementMatchedAttribute(e){this.tokensMatched(this.readTokensForElement(e))}elementAttributeValueChanged(e){const[t,n]=this.refreshTokensForElement(e);this.tokensUnmatched(t),this.tokensMatched(n)}elementUnmatchedAttribute(e){this.tokensUnmatched(this.tokensByElement.getValuesForKey(e))}tokensMatched(e){e.forEach((e=>this.tokenMatched(e)))}tokensUnmatched(e){e.forEach((e=>this.tokenUnmatched(e)))}tokenMatched(e){this.delegate.tokenMatched(e),this.tokensByElement.add(e.element,e)}tokenUnmatched(e){this.delegate.tokenUnmatched(e),this.tokensByElement.delete(e.element,e)}refreshTokensForElement(e){const t=this.tokensByElement.getValuesForKey(e),n=this.readTokensForElement(e),r=function(e,t){const n=Math.max(e.length,t.length);return Array.from({length:n},((n,r)=>[e[r],t[r]]))}(t,n).findIndex((([e,t])=>{return r=t,!((n=e)&&r&&n.index==r.index&&n.content==r.content);var n,r}));return-1==r?[[],[]]:[t.slice(r),n.slice(r)]}readTokensForElement(e){const t=this.attributeName;return function(e,t,n){return e.trim().split(/\s+/).filter((e=>e.length)).map(((e,r)=>({element:t,attributeName:n,content:e,index:r})))}(e.getAttribute(t)||"",e,t)}}class _{constructor(e,t,n){this.tokenListObserver=new T(e,t,this),this.delegate=n,this.parseResultsByToken=new WeakMap,this.valuesByTokenByElement=new WeakMap}get started(){return this.tokenListObserver.started}start(){this.tokenListObserver.start()}stop(){this.tokenListObserver.stop()}refresh(){this.tokenListObserver.refresh()}get element(){return this.tokenListObserver.element}get attributeName(){return this.tokenListObserver.attributeName}tokenMatched(e){const{element:t}=e,{value:n}=this.fetchParseResultForToken(e);n&&(this.fetchValuesByTokenForElement(t).set(e,n),this.delegate.elementMatchedValue(t,n))}tokenUnmatched(e){const{element:t}=e,{value:n}=this.fetchParseResultForToken(e);n&&(this.fetchValuesByTokenForElement(t).delete(e),this.delegate.elementUnmatchedValue(t,n))}fetchParseResultForToken(e){let t=this.parseResultsByToken.get(e);return t||(t=this.parseToken(e),this.parseResultsByToken.set(e,t)),t}fetchValuesByTokenForElement(e){let t=this.valuesByTokenByElement.get(e);return t||(t=new Map,this.valuesByTokenByElement.set(e,t)),t}parseToken(e){try{return{value:this.delegate.parseValueForToken(e)}}catch(e){return{error:e}}}}class N{constructor(e,t){this.context=e,this.delegate=t,this.bindingsByAction=new Map}start(){this.valueListObserver||(this.valueListObserver=new _(this.element,this.actionAttribute,this),this.valueListObserver.start())}stop(){this.valueListObserver&&(this.valueListObserver.stop(),delete this.valueListObserver,this.disconnectAllActions())}get element(){return this.context.element}get identifier(){return this.context.identifier}get actionAttribute(){return this.schema.actionAttribute}get schema(){return this.context.schema}get bindings(){return Array.from(this.bindingsByAction.values())}connectAction(e){const t=new w(this.context,e);this.bindingsByAction.set(e,t),this.delegate.bindingConnected(t)}disconnectAction(e){const t=this.bindingsByAction.get(e);t&&(this.bindingsByAction.delete(e),this.delegate.bindingDisconnected(t))}disconnectAllActions(){this.bindings.forEach((e=>this.delegate.bindingDisconnected(e,!0))),this.bindingsByAction.clear()}parseValueForToken(e){const t=m.forToken(e,this.schema);if(t.identifier==this.identifier)return t}elementMatchedValue(e,t){this.connectAction(t)}elementUnmatchedValue(e,t){this.disconnectAction(t)}}class P{constructor(e,t){this.context=e,this.receiver=t,this.stringMapObserver=new S(this.element,this),this.valueDescriptorMap=this.controller.valueDescriptorMap}start(){this.stringMapObserver.start(),this.invokeChangedCallbacksForDefaultValues()}stop(){this.stringMapObserver.stop()}get element(){return this.context.element}get controller(){return this.context.controller}getStringMapKeyForAttribute(e){if(e in this.valueDescriptorMap)return this.valueDescriptorMap[e].name}stringMapKeyAdded(e,t){const n=this.valueDescriptorMap[t];this.hasValue(e)||this.invokeChangedCallback(e,n.writer(this.receiver[e]),n.writer(n.defaultValue))}stringMapValueChanged(e,t,n){const r=this.valueDescriptorNameMap[t];null!==e&&(null===n&&(n=r.writer(r.defaultValue)),this.invokeChangedCallback(t,e,n))}stringMapKeyRemoved(e,t,n){const r=this.valueDescriptorNameMap[e];this.hasValue(e)?this.invokeChangedCallback(e,r.writer(this.receiver[e]),n):this.invokeChangedCallback(e,r.writer(r.defaultValue),n)}invokeChangedCallbacksForDefaultValues(){for(const{key:e,name:t,defaultValue:n,writer:r}of this.valueDescriptors)null==n||this.controller.data.has(e)||this.invokeChangedCallback(t,r(n),void 0)}invokeChangedCallback(e,t,n){const r=`${e}Changed`,i=this.receiver[r];if("function"==typeof i){const r=this.valueDescriptorNameMap[e];try{const e=r.reader(t);let o=n;n&&(o=r.reader(n)),i.call(this.receiver,e,o)}catch(e){throw e instanceof TypeError&&(e.message=`Stimulus Value "${this.context.identifier}.${r.name}" - ${e.message}`),e}}}get valueDescriptors(){const{valueDescriptorMap:e}=this;return Object.keys(e).map((t=>e[t]))}get valueDescriptorNameMap(){const e={};return Object.keys(this.valueDescriptorMap).forEach((t=>{const n=this.valueDescriptorMap[t];e[n.name]=n})),e}hasValue(e){const t=`has${u(this.valueDescriptorNameMap[e].name)}`;return this.receiver[t]}}class L{constructor(e,t){this.context=e,this.delegate=t,this.targetsByName=new A}start(){this.tokenListObserver||(this.tokenListObserver=new T(this.element,this.attributeName,this),this.tokenListObserver.start())}stop(){this.tokenListObserver&&(this.disconnectAllTargets(),this.tokenListObserver.stop(),delete this.tokenListObserver)}tokenMatched({element:e,content:t}){this.scope.containsElement(e)&&this.connectTarget(e,t)}tokenUnmatched({element:e,content:t}){this.disconnectTarget(e,t)}connectTarget(e,t){var n;this.targetsByName.has(t,e)||(this.targetsByName.add(t,e),null===(n=this.tokenListObserver)||void 0===n||n.pause((()=>this.delegate.targetConnected(e,t))))}disconnectTarget(e,t){var n;this.targetsByName.has(t,e)&&(this.targetsByName.delete(t,e),null===(n=this.tokenListObserver)||void 0===n||n.pause((()=>this.delegate.targetDisconnected(e,t))))}disconnectAllTargets(){for(const e of this.targetsByName.keys)for(const t of this.targetsByName.getValuesForKey(e))this.disconnectTarget(t,e)}get attributeName(){return`data-${this.context.identifier}-target`}get element(){return this.context.element}get scope(){return this.context.scope}}function j(e,t){const n=D(e);return Array.from(n.reduce(((e,n)=>(function(e,t){const n=e[t];return Array.isArray(n)?n:[]}(n,t).forEach((t=>e.add(t))),e)),new Set))}function M(e,t){return D(e).reduce(((e,n)=>(e.push(...function(e,t){const n=e[t];return n?Object.keys(n).map((e=>[e,n[e]])):[]}(n,t)),e)),[])}function D(e){const t=[];for(;e;)t.push(e),e=Object.getPrototypeOf(e);return t.reverse()}class F{constructor(e,t){this.started=!1,this.context=e,this.delegate=t,this.outletsByName=new A,this.outletElementsByName=new A,this.selectorObserverMap=new Map,this.attributeObserverMap=new Map}start(){this.started||(this.outletDefinitions.forEach((e=>{this.setupSelectorObserverForOutlet(e),this.setupAttributeObserverForOutlet(e)})),this.started=!0,this.dependentContexts.forEach((e=>e.refresh())))}refresh(){this.selectorObserverMap.forEach((e=>e.refresh())),this.attributeObserverMap.forEach((e=>e.refresh()))}stop(){this.started&&(this.started=!1,this.disconnectAllOutlets(),this.stopSelectorObservers(),this.stopAttributeObservers())}stopSelectorObservers(){this.selectorObserverMap.size>0&&(this.selectorObserverMap.forEach((e=>e.stop())),this.selectorObserverMap.clear())}stopAttributeObservers(){this.attributeObserverMap.size>0&&(this.attributeObserverMap.forEach((e=>e.stop())),this.attributeObserverMap.clear())}selectorMatched(e,t,{outletName:n}){const r=this.getOutlet(e,n);r&&this.connectOutlet(r,e,n)}selectorUnmatched(e,t,{outletName:n}){const r=this.getOutletFromMap(e,n);r&&this.disconnectOutlet(r,e,n)}selectorMatchElement(e,{outletName:t}){const n=this.selector(t),r=this.hasOutlet(e,t),i=e.matches(`[${this.schema.controllerAttribute}~=${t}]`);return!!n&&(r&&i&&e.matches(n))}elementMatchedAttribute(e,t){const n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}elementAttributeValueChanged(e,t){const n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}elementUnmatchedAttribute(e,t){const n=this.getOutletNameFromOutletAttributeName(t);n&&this.updateSelectorObserverForOutlet(n)}connectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)||(this.outletsByName.add(n,e),this.outletElementsByName.add(n,t),null===(r=this.selectorObserverMap.get(n))||void 0===r||r.pause((()=>this.delegate.outletConnected(e,t,n))))}disconnectOutlet(e,t,n){var r;this.outletElementsByName.has(n,t)&&(this.outletsByName.delete(n,e),this.outletElementsByName.delete(n,t),null===(r=this.selectorObserverMap.get(n))||void 0===r||r.pause((()=>this.delegate.outletDisconnected(e,t,n))))}disconnectAllOutlets(){for(const e of this.outletElementsByName.keys)for(const t of this.outletElementsByName.getValuesForKey(e))for(const n of this.outletsByName.getValuesForKey(e))this.disconnectOutlet(n,t,e)}updateSelectorObserverForOutlet(e){const t=this.selectorObserverMap.get(e);t&&(t.selector=this.selector(e))}setupSelectorObserverForOutlet(e){const t=this.selector(e),n=new O(document.body,t,this,{outletName:e});this.selectorObserverMap.set(e,n),n.start()}setupAttributeObserverForOutlet(e){const t=this.attributeNameForOutletName(e),n=new x(this.scope.element,t,this);this.attributeObserverMap.set(e,n),n.start()}selector(e){return this.scope.outlets.getSelectorForOutletName(e)}attributeNameForOutletName(e){return this.scope.schema.outletAttributeForScope(this.identifier,e)}getOutletNameFromOutletAttributeName(e){return this.outletDefinitions.find((t=>this.attributeNameForOutletName(t)===e))}get outletDependencies(){const e=new A;return this.router.modules.forEach((t=>{j(t.definition.controllerConstructor,"outlets").forEach((n=>e.add(n,t.identifier)))})),e}get outletDefinitions(){return this.outletDependencies.getKeysForValue(this.identifier)}get dependentControllerIdentifiers(){return this.outletDependencies.getValuesForKey(this.identifier)}get dependentContexts(){const e=this.dependentControllerIdentifiers;return this.router.contexts.filter((t=>e.includes(t.identifier)))}hasOutlet(e,t){return!!this.getOutlet(e,t)||!!this.getOutletFromMap(e,t)}getOutlet(e,t){return this.application.getControllerForElementAndIdentifier(e,t)}getOutletFromMap(e,t){return this.outletsByName.getValuesForKey(t).find((t=>t.element===e))}get scope(){return this.context.scope}get schema(){return this.context.schema}get identifier(){return this.context.identifier}get application(){return this.context.application}get router(){return this.application.router}}class ${constructor(e,t){this.logDebugActivity=(e,t={})=>{const{identifier:n,controller:r,element:i}=this;t=Object.assign({identifier:n,controller:r,element:i},t),this.application.logDebugActivity(this.identifier,e,t)},this.module=e,this.scope=t,this.controller=new e.controllerConstructor(this),this.bindingObserver=new N(this,this.dispatcher),this.valueObserver=new P(this,this.controller),this.targetObserver=new L(this,this),this.outletObserver=new F(this,this);try{this.controller.initialize(),this.logDebugActivity("initialize")}catch(e){this.handleError(e,"initializing controller")}}connect(){this.bindingObserver.start(),this.valueObserver.start(),this.targetObserver.start(),this.outletObserver.start();try{this.controller.connect(),this.logDebugActivity("connect")}catch(e){this.handleError(e,"connecting controller")}}refresh(){this.outletObserver.refresh()}disconnect(){try{this.controller.disconnect(),this.logDebugActivity("disconnect")}catch(e){this.handleError(e,"disconnecting controller")}this.outletObserver.stop(),this.targetObserver.stop(),this.valueObserver.stop(),this.bindingObserver.stop()}get application(){return this.module.application}get identifier(){return this.module.identifier}get schema(){return this.application.schema}get dispatcher(){return this.application.dispatcher}get element(){return this.scope.element}get parentElement(){return this.element.parentElement}handleError(e,t,n={}){const{identifier:r,controller:i,element:o}=this;n=Object.assign({identifier:r,controller:i,element:o},n),this.application.handleError(e,`Error ${t}`,n)}targetConnected(e,t){this.invokeControllerMethod(`${t}TargetConnected`,e)}targetDisconnected(e,t){this.invokeControllerMethod(`${t}TargetDisconnected`,e)}outletConnected(e,t,n){this.invokeControllerMethod(`${c(n)}OutletConnected`,e,t)}outletDisconnected(e,t,n){this.invokeControllerMethod(`${c(n)}OutletDisconnected`,e,t)}invokeControllerMethod(e,...t){const n=this.controller;"function"==typeof n[e]&&n[e](...t)}}function R(e){return function(e,t){const n=q(e),r=function(e,t){return B(t).reduce(((n,r)=>{const i=function(e,t,n){const r=Object.getOwnPropertyDescriptor(e,n);if(!r||!("value"in r)){const e=Object.getOwnPropertyDescriptor(t,n).value;return r&&(e.get=r.get||e.get,e.set=r.set||e.set),e}}(e,t,r);return i&&Object.assign(n,{[r]:i}),n}),{})}(e.prototype,t);return Object.defineProperties(n.prototype,r),n}(e,function(e){const t=j(e,"blessings");return t.reduce(((t,n)=>{const r=n(e);for(const e in r){const n=t[e]||{};t[e]=Object.assign(n,r[e])}return t}),{})}(e))}const B="function"==typeof Object.getOwnPropertySymbols?e=>[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)]:Object.getOwnPropertyNames,q=(()=>{function e(e){function t(){return Reflect.construct(e,arguments,new.target)}return t.prototype=Object.create(e.prototype,{constructor:{value:t}}),Reflect.setPrototypeOf(t,e),t}try{return function(){const t=e((function(){this.a.call(this)}));t.prototype.a=function(){},new t}(),e}catch(e){return e=>class extends e{}}})();class H{constructor(e,t){this.application=e,this.definition=function(e){return{identifier:e.identifier,controllerConstructor:R(e.controllerConstructor)}}(t),this.contextsByScope=new WeakMap,this.connectedContexts=new Set}get identifier(){return this.definition.identifier}get controllerConstructor(){return this.definition.controllerConstructor}get contexts(){return Array.from(this.connectedContexts)}connectContextForScope(e){const t=this.fetchContextForScope(e);this.connectedContexts.add(t),t.connect()}disconnectContextForScope(e){const t=this.contextsByScope.get(e);t&&(this.connectedContexts.delete(t),t.disconnect())}fetchContextForScope(e){let t=this.contextsByScope.get(e);return t||(t=new $(this,e),this.contextsByScope.set(e,t)),t}}class I{constructor(e){this.scope=e}has(e){return this.data.has(this.getDataKey(e))}get(e){return this.getAll(e)[0]}getAll(e){const t=this.data.get(this.getDataKey(e))||"";return t.match(/[^\s]+/g)||[]}getAttributeName(e){return this.data.getAttributeNameForKey(this.getDataKey(e))}getDataKey(e){return`${e}-class`}get data(){return this.scope.data}}class z{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get(e){const t=this.getAttributeNameForKey(e);return this.element.getAttribute(t)}set(e,t){const n=this.getAttributeNameForKey(e);return this.element.setAttribute(n,t),this.get(e)}has(e){const t=this.getAttributeNameForKey(e);return this.element.hasAttribute(t)}delete(e){if(this.has(e)){const t=this.getAttributeNameForKey(e);return this.element.removeAttribute(t),!0}return!1}getAttributeNameForKey(e){return`data-${this.identifier}-${d(e)}`}}class U{constructor(e){this.warnedKeysByObject=new WeakMap,this.logger=e}warn(e,t,n){let r=this.warnedKeysByObject.get(e);r||(r=new Set,this.warnedKeysByObject.set(e,r)),r.has(t)||(r.add(t),this.logger.warn(n,e))}}function V(e,t){return`[${e}~="${t}"]`}class W{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findTarget(t)||this.findLegacyTarget(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllTargets(t),...this.findAllLegacyTargets(t)]),[])}findTarget(e){const t=this.getSelectorForTargetName(e);return this.scope.findElement(t)}findAllTargets(e){const t=this.getSelectorForTargetName(e);return this.scope.findAllElements(t)}getSelectorForTargetName(e){return V(this.schema.targetAttributeForScope(this.identifier),e)}findLegacyTarget(e){const t=this.getLegacySelectorForTargetName(e);return this.deprecate(this.scope.findElement(t),e)}findAllLegacyTargets(e){const t=this.getLegacySelectorForTargetName(e);return this.scope.findAllElements(t).map((t=>this.deprecate(t,e)))}getLegacySelectorForTargetName(e){const t=`${this.identifier}.${e}`;return V(this.schema.targetAttribute,t)}deprecate(e,t){if(e){const{identifier:n}=this,r=this.schema.targetAttribute,i=this.schema.targetAttributeForScope(n);this.guide.warn(e,`target:${t}`,`Please replace ${r}="${n}.${t}" with ${i}="${t}". The ${r} attribute is deprecated and will be removed in a future version of Stimulus.`)}return e}get guide(){return this.scope.guide}}class K{constructor(e,t){this.scope=e,this.controllerElement=t}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findOutlet(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllOutlets(t)]),[])}getSelectorForOutletName(e){const t=this.schema.outletAttributeForScope(this.identifier,e);return this.controllerElement.getAttribute(t)}findOutlet(e){const t=this.getSelectorForOutletName(e);if(t)return this.findElement(t,e)}findAllOutlets(e){const t=this.getSelectorForOutletName(e);return t?this.findAllElements(t,e):[]}findElement(e,t){return this.scope.queryElements(e).filter((n=>this.matchesElement(n,e,t)))[0]}findAllElements(e,t){return this.scope.queryElements(e).filter((n=>this.matchesElement(n,e,t)))}matchesElement(e,t,n){const r=e.getAttribute(this.scope.schema.controllerAttribute)||"";return e.matches(t)&&r.split(" ").includes(n)}}class G{constructor(e,t,n,r){this.targets=new W(this),this.classes=new I(this),this.data=new z(this),this.containsElement=e=>e.closest(this.controllerSelector)===this.element,this.schema=e,this.element=t,this.identifier=n,this.guide=new U(r),this.outlets=new K(this.documentScope,t)}findElement(e){return this.element.matches(e)?this.element:this.queryElements(e).find(this.containsElement)}findAllElements(e){return[...this.element.matches(e)?[this.element]:[],...this.queryElements(e).filter(this.containsElement)]}queryElements(e){return Array.from(this.element.querySelectorAll(e))}get controllerSelector(){return V(this.schema.controllerAttribute,this.identifier)}get isDocumentScope(){return this.element===document.documentElement}get documentScope(){return this.isDocumentScope?this:new G(this.schema,document.documentElement,this.identifier,this.guide.logger)}}class X{constructor(e,t,n){this.element=e,this.schema=t,this.delegate=n,this.valueListObserver=new _(this.element,this.controllerAttribute,this),this.scopesByIdentifierByElement=new WeakMap,this.scopeReferenceCounts=new WeakMap}start(){this.valueListObserver.start()}stop(){this.valueListObserver.stop()}get controllerAttribute(){return this.schema.controllerAttribute}parseValueForToken(e){const{element:t,content:n}=e;return this.parseValueForElementAndIdentifier(t,n)}parseValueForElementAndIdentifier(e,t){const n=this.fetchScopesByIdentifierForElement(e);let r=n.get(t);return r||(r=this.delegate.createScopeForElementAndIdentifier(e,t),n.set(t,r)),r}elementMatchedValue(e,t){const n=(this.scopeReferenceCounts.get(t)||0)+1;this.scopeReferenceCounts.set(t,n),1==n&&this.delegate.scopeConnected(t)}elementUnmatchedValue(e,t){const n=this.scopeReferenceCounts.get(t);n&&(this.scopeReferenceCounts.set(t,n-1),1==n&&this.delegate.scopeDisconnected(t))}fetchScopesByIdentifierForElement(e){let t=this.scopesByIdentifierByElement.get(e);return t||(t=new Map,this.scopesByIdentifierByElement.set(e,t)),t}}class Y{constructor(e){this.application=e,this.scopeObserver=new X(this.element,this.schema,this),this.scopesByIdentifier=new A,this.modulesByIdentifier=new Map}get element(){return this.application.element}get schema(){return this.application.schema}get logger(){return this.application.logger}get controllerAttribute(){return this.schema.controllerAttribute}get modules(){return Array.from(this.modulesByIdentifier.values())}get contexts(){return this.modules.reduce(((e,t)=>e.concat(t.contexts)),[])}start(){this.scopeObserver.start()}stop(){this.scopeObserver.stop()}loadDefinition(e){this.unloadIdentifier(e.identifier);const t=new H(this.application,e);this.connectModule(t);const n=e.controllerConstructor.afterLoad;n&&n.call(e.controllerConstructor,e.identifier,this.application)}unloadIdentifier(e){const t=this.modulesByIdentifier.get(e);t&&this.disconnectModule(t)}getContextForElementAndIdentifier(e,t){const n=this.modulesByIdentifier.get(t);if(n)return n.contexts.find((t=>t.element==e))}proposeToConnectScopeForElementAndIdentifier(e,t){const n=this.scopeObserver.parseValueForElementAndIdentifier(e,t);n?this.scopeObserver.elementMatchedValue(n.element,n):console.error(`Couldn't find or create scope for identifier: "${t}" and element:`,e)}handleError(e,t,n){this.application.handleError(e,t,n)}createScopeForElementAndIdentifier(e,t){return new G(this.schema,e,t,this.logger)}scopeConnected(e){this.scopesByIdentifier.add(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.connectContextForScope(e)}scopeDisconnected(e){this.scopesByIdentifier.delete(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.disconnectContextForScope(e)}connectModule(e){this.modulesByIdentifier.set(e.identifier,e);this.scopesByIdentifier.getValuesForKey(e.identifier).forEach((t=>e.connectContextForScope(t)))}disconnectModule(e){this.modulesByIdentifier.delete(e.identifier);this.scopesByIdentifier.getValuesForKey(e.identifier).forEach((t=>e.disconnectContextForScope(t)))}}const J={controllerAttribute:"data-controller",actionAttribute:"data-action",targetAttribute:"data-target",targetAttributeForScope:e=>`data-${e}-target`,outletAttributeForScope:(e,t)=>`data-${e}-${t}-outlet`,keyMappings:Object.assign(Object.assign({enter:"Enter",tab:"Tab",esc:"Escape",space:" ",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",home:"Home",end:"End",page_up:"PageUp",page_down:"PageDown"},Z("abcdefghijklmnopqrstuvwxyz".split("").map((e=>[e,e])))),Z("0123456789".split("").map((e=>[e,e]))))};function Z(e){return e.reduce(((e,[t,n])=>Object.assign(Object.assign({},e),{[t]:n})),{})}class Q{constructor(e=document.documentElement,t=J){this.logger=console,this.debug=!1,this.logDebugActivity=(e,t,n={})=>{this.debug&&this.logFormattedMessage(e,t,n)},this.element=e,this.schema=t,this.dispatcher=new i(this),this.router=new Y(this),this.actionDescriptorFilters=Object.assign({},o)}static start(e,t){const n=new this(e,t);return n.start(),n}async start(){await new Promise((e=>{"loading"==document.readyState?document.addEventListener("DOMContentLoaded",(()=>e())):e()})),this.logDebugActivity("application","starting"),this.dispatcher.start(),this.router.start(),this.logDebugActivity("application","start")}stop(){this.logDebugActivity("application","stopping"),this.dispatcher.stop(),this.router.stop(),this.logDebugActivity("application","stop")}register(e,t){this.load({identifier:e,controllerConstructor:t})}registerActionOption(e,t){this.actionDescriptorFilters[e]=t}load(e,...t){(Array.isArray(e)?e:[e,...t]).forEach((e=>{e.controllerConstructor.shouldLoad&&this.router.loadDefinition(e)}))}unload(e,...t){(Array.isArray(e)?e:[e,...t]).forEach((e=>this.router.unloadIdentifier(e)))}get controllers(){return this.router.contexts.map((e=>e.controller))}getControllerForElementAndIdentifier(e,t){const n=this.router.getContextForElementAndIdentifier(e,t);return n?n.controller:null}handleError(e,t,n){var r;this.logger.error("%s\n\n%o\n\n%o",t,e,n),null===(r=window.onerror)||void 0===r||r.call(window,t,"",0,0,e)}logFormattedMessage(e,t,n={}){n=Object.assign({application:this},n),this.logger.groupCollapsed(`${e} #${t}`),this.logger.log("details:",Object.assign({},n)),this.logger.groupEnd()}}function ee(e,t,n){return e.application.getControllerForElementAndIdentifier(t,n)}function te(e,t,n){let r=ee(e,t,n);return r||(e.application.router.proposeToConnectScopeForElementAndIdentifier(t,n),r=ee(e,t,n),r||void 0)}function ne([e,t],n){return function(e){const{token:t,typeDefinition:n}=e,r=`${d(t)}-value`,i=function(e){const{controller:t,token:n,typeDefinition:r}=e,i={controller:t,token:n,typeObject:r},o=function(e){const{controller:t,token:n,typeObject:r}=e,i=h(r.type),o=h(r.default),s=i&&o,a=i&&!o,l=!i&&o,c=re(r.type),u=ie(e.typeObject.default);if(a)return c;if(l)return u;if(c!==u){throw new Error(`The specified default value for the Stimulus Value "${t?`${t}.${n}`:n}" must match the defined type "${c}". The provided default value of "${r.default}" is of type "${u}".`)}if(s)return c}(i),s=ie(r),a=re(r),l=o||s||a;if(l)return l;const c=t?`${t}.${r}`:n;throw new Error(`Unknown value type "${c}" for "${n}" value`)}(e);return{type:i,key:r,name:l(r),get defaultValue(){return function(e){const t=re(e);if(t)return oe[t];const n=p(e,"default"),r=p(e,"type"),i=e;if(n)return i.default;if(r){const{type:e}=i,t=re(e);if(t)return oe[t]}return e}(n)},get hasCustomDefaultValue(){return void 0!==ie(n)},reader:se[i],writer:ae[i]||ae.default}}({controller:n,token:e,typeDefinition:t})}function re(e){switch(e){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function ie(e){switch(typeof e){case"boolean":return"boolean";case"number":return"number";case"string":return"string"}return Array.isArray(e)?"array":"[object Object]"===Object.prototype.toString.call(e)?"object":void 0}const oe={get array(){return[]},boolean:!1,number:0,get object(){return{}},string:""},se={array(e){const t=JSON.parse(e);if(!Array.isArray(t))throw new TypeError(`expected value of type "array" but instead got value "${e}" of type "${ie(t)}"`);return t},boolean(e){return!("0"==e||"false"==String(e).toLowerCase())},number(e){return Number(e.replace(/_/g,""))},object(e){const t=JSON.parse(e);if(null===t||"object"!=typeof t||Array.isArray(t))throw new TypeError(`expected value of type "object" but instead got value "${e}" of type "${ie(t)}"`);return t},string(e){return e}},ae={default:function(e){return`${e}`},array:le,object:le};function le(e){return JSON.stringify(e)}class ce{constructor(e){this.context=e}static get shouldLoad(){return!0}static afterLoad(e,t){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(e,{target:t=this.element,detail:n={},prefix:r=this.identifier,bubbles:i=!0,cancelable:o=!0}={}){const s=new CustomEvent(r?`${r}:${e}`:e,{detail:n,bubbles:i,cancelable:o});return t.dispatchEvent(s),s}}ce.blessings=[function(e){return j(e,"classes").reduce(((e,t)=>{return Object.assign(e,(n=t,{[`${n}Class`]:{get(){const{classes:e}=this;if(e.has(n))return e.get(n);{const t=e.getAttributeName(n);throw new Error(`Missing attribute "${t}"`)}}},[`${n}Classes`]:{get(){return this.classes.getAll(n)}},[`has${u(n)}Class`]:{get(){return this.classes.has(n)}}}));var n}),{})},function(e){return j(e,"targets").reduce(((e,t)=>{return Object.assign(e,(n=t,{[`${n}Target`]:{get(){const e=this.targets.find(n);if(e)return e;throw new Error(`Missing target element "${n}" for "${this.identifier}" controller`)}},[`${n}Targets`]:{get(){return this.targets.findAll(n)}},[`has${u(n)}Target`]:{get(){return this.targets.has(n)}}}));var n}),{})},function(e){const t=M(e,"values"),n={valueDescriptorMap:{get(){return t.reduce(((e,t)=>{const n=ne(t,this.identifier),r=this.data.getAttributeNameForKey(n.key);return Object.assign(e,{[r]:n})}),{})}}};return t.reduce(((e,t)=>Object.assign(e,function(e,t){const n=ne(e,t),{key:r,name:i,reader:o,writer:s}=n;return{[i]:{get(){const e=this.data.get(r);return null!==e?o(e):n.defaultValue},set(e){void 0===e?this.data.delete(r):this.data.set(r,s(e))}},[`has${u(i)}`]:{get(){return this.data.has(r)||n.hasCustomDefaultValue}}}}(t))),n)},function(e){return j(e,"outlets").reduce(((e,t)=>Object.assign(e,function(e){const t=c(e);return{[`${t}Outlet`]:{get(){const t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t){const n=te(this,t,e);if(n)return n;throw new Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}Outlets`]:{get(){const t=this.outlets.findAll(e);return t.length>0?t.map((t=>{const n=te(this,t,e);if(n)return n;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,t)})).filter((e=>e)):[]}},[`${t}OutletElement`]:{get(){const t=this.outlets.find(e),n=this.outlets.getSelectorForOutletName(e);if(t)return t;throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${n}".`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${u(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}(t))),{})}],ce.targets=[],ce.outlets=[],ce.values={}},2995:function(e,t,n){"use strict";n.r(t);var r=n(2891);t.default=class extends r.xI{connect(){const e=document.querySelectorAll(".prev-next");let t,n,r;function i(e,t){document.querySelectorAll(e).forEach((e=>{e.querySelector("span").innerHTML=t.innerHTML.replace(/\d+\. /,"").replace(/<(\S*?)[^>]*>.*?<\/\1>|<.*?\/>/,""),e.href=t.href,e.classList.remove("hidden"),e.classList.remove("sm:hidden")}))}document.getElementById("main-navigation").querySelectorAll("a").forEach((e=>{void 0===n&&!1!==e.href.includes("/docs/")&&(e.classList.contains("text-white")?r=e:void 0===r?t=e:void 0===n&&(n=e))})),void 0!==r&&(e.forEach((e=>{e.classList.remove("hidden")})),t&&i(".link-previous",t),n&&i(".link-next",n))}}},3554:function(){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],r=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,i=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,o=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:r,operator:i,punctuation:o};var s={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},a=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:s}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:s}}];e.languages.insertBefore("php","variable",{string:a,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:a,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:r,operator:i,punctuation:o}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},3835:function(e,t){t.getArg=function(e,t,n){if(t in e)return e[t];if(3===arguments.length)return n;throw new Error('"'+t+'" is a required argument.')};var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/,r=/^data:.+\,.+$/;function i(e){var t=e.match(n);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function o(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}function s(e){var n=e,r=i(e);if(r){if(!r.path)return e;n=r.path}for(var s,a=t.isAbsolute(n),l=n.split(/\/+/),c=0,u=l.length-1;u>=0;u--)"."===(s=l[u])?l.splice(u,1):".."===s?c++:c>0&&(""===s?(l.splice(u+1,c),c=0):(l.splice(u,2),c--));return""===(n=l.join("/"))&&(n=a?"/":"."),r?(r.path=n,o(r)):n}t.urlParse=i,t.urlGenerate=o,t.normalize=s,t.join=function(e,t){""===e&&(e="."),""===t&&(t=".");var n=i(t),a=i(e);if(a&&(e=a.path||"/"),n&&!n.scheme)return a&&(n.scheme=a.scheme),o(n);if(n||t.match(r))return t;if(a&&!a.host&&!a.path)return a.host=t,o(a);var l="/"===t.charAt(0)?t:s(e.replace(/\/+$/,"")+"/"+t);return a?(a.path=l,o(a)):l},t.isAbsolute=function(e){return"/"===e.charAt(0)||!!e.match(n)},t.relative=function(e,t){""===e&&(e="."),e=e.replace(/\/$/,"");for(var n=0;0!==t.indexOf(e+"/");){var r=e.lastIndexOf("/");if(r<0)return t;if((e=e.slice(0,r)).match(/^([^\/]+:\/)?\/*$/))return t;++n}return Array(n+1).join("../")+t.substr(e.length+1)};var a=!("__proto__"in Object.create(null));function l(e){return e}function c(e){if(!e)return!1;var t=e.length;if(t<9)return!1;if(95!==e.charCodeAt(t-1)||95!==e.charCodeAt(t-2)||111!==e.charCodeAt(t-3)||116!==e.charCodeAt(t-4)||111!==e.charCodeAt(t-5)||114!==e.charCodeAt(t-6)||112!==e.charCodeAt(t-7)||95!==e.charCodeAt(t-8)||95!==e.charCodeAt(t-9))return!1;for(var n=t-10;n>=0;n--)if(36!==e.charCodeAt(n))return!1;return!0}function u(e,t){return e===t?0:e>t?1:-1}t.toSetString=a?l:function(e){return c(e)?"$"+e:e},t.fromSetString=a?l:function(e){return c(e)?e.slice(1):e},t.compareByOriginalPositions=function(e,t,n){var r=e.source-t.source;return 0!==r||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)||n||0!==(r=e.generatedColumn-t.generatedColumn)||0!==(r=e.generatedLine-t.generatedLine)?r:e.name-t.name},t.compareByGeneratedPositionsDeflated=function(e,t,n){var r=e.generatedLine-t.generatedLine;return 0!==r||0!==(r=e.generatedColumn-t.generatedColumn)||n||0!==(r=e.source-t.source)||0!==(r=e.originalLine-t.originalLine)||0!==(r=e.originalColumn-t.originalColumn)?r:e.name-t.name},t.compareByGeneratedPositionsInflated=function(e,t){var n=e.generatedLine-t.generatedLine;return 0!==n||0!==(n=e.generatedColumn-t.generatedColumn)||0!==(n=u(e.source,t.source))||0!==(n=e.originalLine-t.originalLine)||0!==(n=e.originalColumn-t.originalColumn)?n:u(e.name,t.name)}},3921:function(e,t,n){"use strict";n.r(t);var r=n(2891),i=n(1061);t.default=class extends r.xI{connect(){(0,i.b)("toastr")}}},4003:function(e,t,n){var r,i;n.amdD,r=[n(5616)],void 0===(i=function(e){return function(){var t,n,r,i=0,o="error",s="info",a="success",l="warning",c={clear:function(n,r){var i=f();t||u(i),d(n,i,r)||function(n){for(var r=t.children(),i=r.length-1;i>=0;i--)d(e(r[i]),n)}(i)},remove:function(n){var r=f();t||u(r),n&&0===e(":focus",n).length?m(n):t.children().length&&t.remove()},error:function(e,t,n){return p({type:o,iconClass:f().iconClasses.error,message:e,optionsOverride:n,title:t})},getContainer:u,info:function(e,t,n){return p({type:s,iconClass:f().iconClasses.info,message:e,optionsOverride:n,title:t})},options:{},subscribe:function(e){n=e},success:function(e,t,n){return p({type:a,iconClass:f().iconClasses.success,message:e,optionsOverride:n,title:t})},version:"2.1.4",warning:function(e,t,n){return p({type:l,iconClass:f().iconClasses.warning,message:e,optionsOverride:n,title:t})}};return c;function u(n,r){return n||(n=f()),(t=e("#"+n.containerId)).length||r&&(t=function(n){return(t=e("
    ").attr("id",n.containerId).addClass(n.positionClass)).appendTo(e(n.target)),t}(n)),t}function d(t,n,r){var i=!(!r||!r.force)&&r.force;return!(!t||!i&&0!==e(":focus",t).length||(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){m(t)}}),0))}function h(e){n&&n(e)}function p(n){var o=f(),s=n.iconClass||o.iconClass;if(void 0!==n.optionsOverride&&(o=e.extend(o,n.optionsOverride),s=n.optionsOverride.iconClass||s),!function(e,t){if(e.preventDuplicates){if(t.message===r)return!0;r=t.message}return!1}(o,n)){i++,t=u(o,!0);var a=null,l=e("
    "),c=e("
    "),d=e("
    "),p=e("
    "),g=e(o.closeHtml),y={intervalId:null,hideEta:null,maxHideTime:null},v={toastId:i,state:"visible",startTime:new Date,options:o,map:n};return n.iconClass&&l.addClass(o.toastClass).addClass(s),function(){if(n.title){var e=n.title;o.escapeHtml&&(e=w(n.title)),c.append(e).addClass(o.titleClass),l.append(c)}}(),function(){if(n.message){var e=n.message;o.escapeHtml&&(e=w(n.message)),d.append(e).addClass(o.messageClass),l.append(d)}}(),o.closeButton&&(g.addClass(o.closeClass).attr("role","button"),l.prepend(g)),o.progressBar&&(p.addClass(o.progressClass),l.prepend(p)),o.rtl&&l.addClass("rtl"),o.newestOnTop?t.prepend(l):t.append(l),function(){var e="";switch(n.iconClass){case"toast-success":case"toast-info":e="polite";break;default:e="assertive"}l.attr("aria-live",e)}(),l.hide(),l[o.showMethod]({duration:o.showDuration,easing:o.showEasing,complete:o.onShown}),o.timeOut>0&&(a=setTimeout(b,o.timeOut),y.maxHideTime=parseFloat(o.timeOut),y.hideEta=(new Date).getTime()+y.maxHideTime,o.progressBar&&(y.intervalId=setInterval(C,10))),o.closeOnHover&&l.hover(E,x),!o.onclick&&o.tapToDismiss&&l.click(b),o.closeButton&&g&&g.click((function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&!0!==e.cancelBubble&&(e.cancelBubble=!0),o.onCloseClick&&o.onCloseClick(e),b(!0)})),o.onclick&&l.click((function(e){o.onclick(e),b()})),h(v),o.debug&&console&&console.log(v),l}function w(e){return null==e&&(e=""),e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function b(t){var n=t&&!1!==o.closeMethod?o.closeMethod:o.hideMethod,r=t&&!1!==o.closeDuration?o.closeDuration:o.hideDuration,i=t&&!1!==o.closeEasing?o.closeEasing:o.hideEasing;if(!e(":focus",l).length||t)return clearTimeout(y.intervalId),l[n]({duration:r,easing:i,complete:function(){m(l),clearTimeout(a),o.onHidden&&"hidden"!==v.state&&o.onHidden(),v.state="hidden",v.endTime=new Date,h(v)}})}function x(){(o.timeOut>0||o.extendedTimeOut>0)&&(a=setTimeout(b,o.extendedTimeOut),y.maxHideTime=parseFloat(o.extendedTimeOut),y.hideEta=(new Date).getTime()+y.maxHideTime)}function E(){clearTimeout(a),y.hideEta=0,l.stop(!0,!0)[o.showMethod]({duration:o.showDuration,easing:o.showEasing})}function C(){var e=(y.hideEta-(new Date).getTime())/y.maxHideTime*100;p.width(e+"%")}}function f(){return e.extend({},{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,closeMethod:!1,closeDuration:!1,closeEasing:!1,closeOnHover:!0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",escapeHtml:!1,target:"body",closeHtml:'',closeClass:"toast-close-button",newestOnTop:!0,preventDuplicates:!1,progressBar:!1,progressClass:"toast-progress",rtl:!1},c.options)}function m(e){t||(t=u()),e.is(":visible")||(e.remove(),e=null,0===t.children().length&&(t.remove(),r=void 0))}}()}.apply(t,r))||(e.exports=i)},4104:function(e,t,n){"use strict";function r(e,t,n,r){return new(n||(n=Promise))((function(i,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function a(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))}n.d(t,{A:function(){return s}}),"function"==typeof SuppressedError&&SuppressedError;class i{success(e,t,n){this.flash("success",e,t,n)}error(e,t,n){this.flash("error",e,t,n)}info(e,t,n){this.flash("info",e,t,n)}warning(e,t,n){this.flash("warning",e,t,n)}flash(e,t,n,r){let i,o,s,a={};if("object"==typeof e?(a=Object.assign({},e),i=a.type,o=a.message,s=a.title,delete a.type,delete a.message,delete a.title):"object"==typeof t?(a=Object.assign({},t),i=e,o=a.message,s=a.title,delete a.message,delete a.title):"object"==typeof n?(a=Object.assign({},n),i=e,o=t,s=a.title,delete a.title):(i=e,o=t,s=n,a=r||{}),!i)throw new Error("Type is required for notifications");if(null==o)throw new Error("Message is required for notifications");const l={type:i,message:o,title:s||i,options:a,metadata:{plugin:""}};this.renderOptions(a),this.renderEnvelopes([l])}}class o extends i{constructor(e){if(super(),this.options={timeout:null,timeouts:{success:1e4,info:1e4,error:1e4,warning:1e4},fps:30,position:"top-right",direction:"top",rtl:!1,style:{},escapeHtml:!1},!e)throw new Error("Theme is required");if("function"!=typeof e.render)throw new TypeError("Theme must have a render function");this.theme=e}renderEnvelopes(e){if(!(null==e?void 0:e.length))return;const t=()=>{e.forEach((e=>{var t,n,r,i;try{const o=null!==(n=null!==(t=this.options.timeout)&&void 0!==t?t:this.options.timeouts[e.type])&&void 0!==n?n:1e4,s=Object.assign(Object.assign(Object.assign({},this.options),e.options),{timeout:null!==(r=e.options.timeout)&&void 0!==r?r:o,escapeHtml:null!==(i=e.options.escapeHtml)&&void 0!==i?i:this.options.escapeHtml}),a=this.createContainer(s),l={direction:s.direction,timeout:Number(s.timeout||0),fps:s.fps,rtl:s.rtl,escapeHtml:s.escapeHtml};this.addToContainer(a,e,l)}catch(t){console.error("PHPFlasher: Error rendering envelope",t,e)}}))};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",t):t()}renderOptions(e){e&&(this.options=Object.assign(Object.assign({},this.options),e))}createContainer(e){let t=document.querySelector(`.fl-wrapper[data-position="${e.position}"]`);return t||(t=document.createElement("div"),t.className="fl-wrapper",t.dataset.position=e.position,Object.entries(e.style).forEach((e=>{let[n,r]=e;null!=r&&t.style.setProperty(n,String(r))})),document.body.appendChild(t)),t.dataset.turboTemporary="",t}addToContainer(e,t,n){n.escapeHtml&&(t.title=this.escapeHtml(t.title),t.message=this.escapeHtml(t.message));const r=this.stringToHTML(this.theme.render(t));r.classList.add("fl-container"),n.rtl&&r.classList.add("fl-rtl"),"bottom"===n.direction?e.append(r):e.prepend(r),requestAnimationFrame((()=>r.classList.add("fl-show")));const i=r.querySelector(".fl-close");i&&i.addEventListener("click",(e=>{e.stopPropagation(),this.removeNotification(r)})),n.timeout>0&&this.addTimer(r,n)}addTimer(e,t){let{timeout:n,fps:r}=t;if(n<=0)return;const i=1e3/r;let o,s=0;const a=()=>{s+=i;const t=e.querySelector(".fl-progress-bar");if(t){let e=t.querySelector(".fl-progress");e||(e=document.createElement("span"),e.classList.add("fl-progress"),t.append(e));const r=100*(1-s/n);e.style.width=`${Math.max(0,r)}%`}s>=n&&(clearInterval(o),this.removeNotification(e))};o=window.setInterval(a,i),e.addEventListener("mouseout",(()=>{clearInterval(o),o=window.setInterval(a,i)})),e.addEventListener("mouseover",(()=>clearInterval(o)))}removeNotification(e){e&&(e.classList.remove("fl-show"),e.ontransitionend=()=>{const t=e.parentElement;e.remove(),t&&!t.hasChildNodes()&&t.remove()})}stringToHTML(e){const t=document.createElement("template");return t.innerHTML=e.trim(),t.content.firstElementChild}escapeHtml(e){if(null==e)return"";const t={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"=","/":"/"};return e.replace(/[&<>"'`=/]/g,(e=>t[e]||e))}}const s=new class extends i{constructor(){super(...arguments),this.defaultPlugin="flasher",this.plugins=new Map,this.themes=new Map,this.loadedAssets=new Set}render(e){return r(this,void 0,void 0,(function*(){const t=this.resolveResponse(e);try{yield this.addAssets([{urls:t.styles,nonce:t.context.csp_style_nonce,type:"style"},{urls:t.scripts,nonce:t.context.csp_script_nonce,type:"script"}]),this.renderOptions(t.options),this.renderEnvelopes(t.envelopes)}catch(e){console.error("PHPFlasher: Error rendering notifications",e)}}))}renderEnvelopes(e){if(!(null==e?void 0:e.length))return;const t={};e.forEach((e=>{const n=this.resolvePluginAlias(e.metadata.plugin);t[n]=t[n]||[],t[n].push(e)})),Object.entries(t).forEach((e=>{let[t,n]=e;try{this.use(t).renderEnvelopes(n)}catch(e){console.error(`PHPFlasher: Error rendering envelopes for plugin "${t}"`,e)}}))}renderOptions(e){e&&Object.entries(e).forEach((e=>{let[t,n]=e;try{this.use(t).renderOptions(n)}catch(e){console.error(`PHPFlasher: Error applying options for plugin "${t}"`,e)}}))}addPlugin(e,t){if(!e||!t)throw new Error("Both plugin name and instance are required");this.plugins.set(e,t)}addTheme(e,t){if(!e||!t)throw new Error("Both theme name and definition are required");this.themes.set(e,t)}use(e){const t=this.resolvePluginAlias(e);this.resolvePlugin(t);const n=this.plugins.get(t);if(!n)throw new Error(`Unable to resolve "${t}" plugin, did you forget to register it?`);return n}create(e){return this.use(e)}resolveResponse(e){const t=Object.assign({envelopes:[],options:{},scripts:[],styles:[],context:{}},e);return Object.entries(t.options).forEach((e=>{let[n,r]=e;t.options[n]=this.resolveOptions(r)})),t.context.csp_style_nonce=t.context.csp_style_nonce||"",t.context.csp_script_nonce=t.context.csp_script_nonce||"",t.envelopes.forEach((n=>{n.metadata=n.metadata||{},n.metadata.plugin=this.resolvePluginAlias(n.metadata.plugin),this.addThemeStyles(t,n.metadata.plugin),n.options=this.resolveOptions(n.options),n.context=e.context})),t}resolveOptions(e){if(!e)return{};const t=Object.assign({},e);return Object.entries(t).forEach((e=>{let[n,r]=e;t[n]=this.resolveFunction(r)})),t}resolveFunction(e){var t,n;if("string"!=typeof e)return e;const r=e.match(/^function\s*(\w*)\s*\(([^)]*)\)\s*\{([\s\S]*)\}$/)||e.match(/^\s*(\(([^)]*)\)|[^=]+)\s*=>\s*([\s\S]+)$/);if(!r)return e;const i=null!==(n=null===(t=r[2])||void 0===t?void 0:t.split(",").map((e=>e.trim())))&&void 0!==n?n:[];let o=r[3].trim();o.startsWith("{")||(o=`{ return ${o}; }`);try{return new Function(...i,o)}catch(t){return console.error("PHPFlasher: Error converting string to function:",t),e}}resolvePlugin(e){if(this.plugins.get(e)||!e.includes("theme."))return;const t=e.replace("theme.",""),n=this.themes.get(t);n&&this.addPlugin(e,new o(n))}resolvePluginAlias(e){return"flasher"===(e=e||this.defaultPlugin)?"theme.flasher":e}addAssets(e){return r(this,void 0,void 0,(function*(){try{const t=e.filter((e=>"style"===e.type)),n=[];for(const{urls:e,nonce:r,type:i}of t)if(null==e?void 0:e.length)for(const t of e)t&&!this.loadedAssets.has(t)&&(n.push(this.loadAsset(t,r,i)),this.loadedAssets.add(t));yield Promise.all(n);const r=e.filter((e=>"script"===e.type));for(const{urls:e,nonce:t,type:n}of r)if(null==e?void 0:e.length)for(const r of e)r&&!this.loadedAssets.has(r)&&(yield this.loadAsset(r,t,n),this.loadedAssets.add(r))}catch(e){console.error("PHPFlasher: Error loading assets",e)}}))}loadAsset(e,t,n){return document.querySelector(`${"style"===n?"link":"script"}[src="${e}"]`)?Promise.resolve():new Promise(((r,i)=>{const o=document.createElement("style"===n?"link":"script");"style"===n?(o.rel="stylesheet",o.href=e):(o.type="text/javascript",o.src=e),t&&o.setAttribute("nonce",t),o.onload=()=>r(),o.onerror=()=>i(new Error(`Failed to load ${e}`)),document.head.appendChild(o)}))}addThemeStyles(e,t){if("flasher"!==t&&!t.includes("theme."))return;const n=t.replace("theme.",""),r=this.themes.get(n);if(!(null==r?void 0:r.styles))return;const i=Array.isArray(r.styles)?r.styles:[r.styles];e.styles=Array.from(new Set([...e.styles,...i]))}};s.addTheme("flasher",{render:e=>{const{type:t,title:n,message:r}=e,i="error"===t||"warning"===t,o=i?"alert":"status",s=i?"assertive":"polite",a=n||t.charAt(0).toUpperCase()+t.slice(1);return`\n
    \n
    \n
    \n
    \n ${a}\n ${r}\n
    \n \n
    \n \n \n \n
    `}}),"undefined"!=typeof window&&(window.flasher=s)},4263:function(e,t,n){var r,i,o;!function(){"use strict";i=[n(343)],void 0===(o="function"==typeof(r=function(e){var t=/(^|@)\S+:\d+/,n=/^\s*at .*(\S+:\d+|\(native\))/m,r=/^(eval@)?(\[native code])?$/;return{parse:function(e){if(void 0!==e.stacktrace||void 0!==e["opera#sourceloc"])return this.parseOpera(e);if(e.stack&&e.stack.match(n))return this.parseV8OrIE(e);if(e.stack)return this.parseFFOrSafari(e);throw new Error("Cannot parse given Error object")},extractLocation:function(e){if(-1===e.indexOf(":"))return[e];var t=/(.+?)(?::(\d+))?(?::(\d+))?$/.exec(e.replace(/[()]/g,""));return[t[1],t[2]||void 0,t[3]||void 0]},parseV8OrIE:function(t){return t.stack.split("\n").filter((function(e){return!!e.match(n)}),this).map((function(t){t.indexOf("(eval ")>-1&&(t=t.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(,.*$)/g,""));var n=t.replace(/^\s+/,"").replace(/\(eval code/g,"(").replace(/^.*?\s+/,""),r=n.match(/ (\(.+\)$)/);n=r?n.replace(r[0],""):n;var i=this.extractLocation(r?r[1]:n),o=r&&n||void 0,s=["eval",""].indexOf(i[0])>-1?void 0:i[0];return new e({functionName:o,fileName:s,lineNumber:i[1],columnNumber:i[2],source:t})}),this)},parseFFOrSafari:function(t){return t.stack.split("\n").filter((function(e){return!e.match(r)}),this).map((function(t){if(t.indexOf(" > eval")>-1&&(t=t.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),-1===t.indexOf("@")&&-1===t.indexOf(":"))return new e({functionName:t});var n=/((.*".+"[^@]*)?[^@]*)(?:@)/,r=t.match(n),i=r&&r[1]?r[1]:void 0,o=this.extractLocation(t.replace(n,""));return new e({functionName:i,fileName:o[0],lineNumber:o[1],columnNumber:o[2],source:t})}),this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(t){for(var n=/Line (\d+).*script (?:in )?(\S+)/i,r=t.message.split("\n"),i=[],o=2,s=r.length;o/,"$2").replace(/\([^)]*\)/g,"")||void 0;o.match(/\(([^)]*)\)/)&&(n=o.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var a=void 0===n||"[arguments not available]"===n?void 0:n.split(",");return new e({functionName:s,args:a,fileName:i[0],lineNumber:i[1],columnNumber:i[2],source:t})}),this)}}})?r.apply(t,i):r)||(e.exports=o)}()},4983:function(e,t,n){"use strict";n.r(t);var r=n(2891),i=n(8848),o=n.n(i),s=n(4104);n(9700),n(3554);t.default=class extends r.xI{static values=(()=>({adapter:String,type:String,message:String,title:String}))();static targets=["optionsContainer","codeSnippet","message","title","adapter","type"];connect(){this.initializeActiveButtons(),this.updateAdapterOptions(),this.updateCodeSnippet(),o().highlightAll()}initializeActiveButtons(){this.updateButtonStyles("#adapter-options",this.adapterValue),this.updateButtonStyles("#type-options",this.typeValue)}selectType(e){const t=e.currentTarget.dataset.value;this.typeTarget.value=t,this.typeValue=t,this.updateButtonStyles("#type-options",t)}updateButtonStyles(e,t){document.querySelectorAll(`${e} button`).forEach((e=>{const n=e.dataset.value===t;e.classList.toggle("ring-2",n),e.classList.toggle("ring-offset-2",n)}))}updateAdapterOptions(){const e=this.fetchAdapterOptions(this.adapterValue);this.renderOptionsForm(e)}fetchAdapterOptions(e){return{flasher:{position:{type:"radio",default:"top-right",options:["top-right","top-left","top-center","bottom-right","bottom-left","bottom-center"]},direction:{type:"radio",default:"top",options:["top","bottom"]},timeout:{type:"radio",default:5e3,options:[0,3e3,9e3]}},toastr:{closeButton:{type:"checkbox",default:!0}}}[e]||{}}renderOptionsForm(e){let t='
    ';Object.entries(e).forEach((e=>{let[n,r]=e;t+=this.optionToFormHTML(n,r)})),t+="
    ",this.optionsContainerTarget.innerHTML=t}optionToFormHTML(e,t){let n="";return n="radio"===t.type?t.options.map((n=>`\n
    \n \n \n
    \n `)).join(""):"checkbox"===t.type?`\n
    \n \n \n
    \n `:`
    `,`\n
    \n \n
    \n ${n}\n
    \n
    \n `}showNotification(e){e.preventDefault();const t=this.collectOptions(),n=this.messageTarget.value,r=this.titleTarget.value,i=this.typeValue;this.updateCodeSnippet(),s.A.use(this.adapterValue).flash(i,n,r,t)}collectOptions(){const e=this.optionsContainerTarget.querySelector("#options-form"),t=new FormData(e),n={};return t.forEach(((e,t)=>{n[t]=e})),n}updateCodeSnippet(){const e=this.collectOptions(),t=this.messageTarget.value,n=this.titleTarget.value,r=this.typeValue,i=this.optionsToOptionMethods(e),s="toastr"===this.adapterValue?"toastr":"flash",a=i?`\n${i}`:"";this.codeSnippetTarget.textContent=`${s}()${a}\n\t->${r}('${t}', '${n}');`,o().highlightElement(this.codeSnippetTarget)}optionsToOptionMethods(e){return Object.entries(e).map((e=>{let[t,n]=e;return`\t->option('${t}', ${"string"==typeof n?`'${n}'`:n})`})).join("\n")}}},5035:function(e,t){function n(e,r,i,o,s,a){var l=Math.floor((r-e)/2)+e,c=s(i,o[l],!0);return 0===c?l:c>0?r-l>1?n(l,r,i,o,s,a):a==t.LEAST_UPPER_BOUND?r1?n(e,l,i,o,s,a):a==t.LEAST_UPPER_BOUND?l:e<0?-1:e}t.GREATEST_LOWER_BOUND=1,t.LEAST_UPPER_BOUND=2,t.search=function(e,r,i,o){if(0===r.length)return-1;var s=n(-1,r.length,e,r,i,o||t.GREATEST_LOWER_BOUND);if(s<0)return-1;for(;s-1>=0&&0===i(r[s],r[s-1],!0);)--s;return s}},5353:function(e,t,n){"use strict";e=n.nmd(e);const r=(e=0)=>t=>`[${38+e};5;${t}m`,i=(e=0)=>(t,n,r)=>`[${38+e};2;${t};${n};${r}m`;Object.defineProperty(e,"exports",{enumerable:!0,get:function(){const e=new Map,t={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};t.color.gray=t.color.blackBright,t.bgColor.bgGray=t.bgColor.bgBlackBright,t.color.grey=t.color.blackBright,t.bgColor.bgGrey=t.bgColor.bgBlackBright;for(const[n,r]of Object.entries(t)){for(const[n,i]of Object.entries(r))t[n]={open:`[${i[0]}m`,close:`[${i[1]}m`},r[n]=t[n],e.set(i[0],i[1]);Object.defineProperty(t,n,{value:r,enumerable:!1})}return Object.defineProperty(t,"codes",{value:e,enumerable:!1}),t.color.close="",t.bgColor.close="",t.color.ansi256=r(),t.color.ansi16m=i(),t.bgColor.ansi256=r(10),t.bgColor.ansi16m=i(10),Object.defineProperties(t,{rgbToAnsi256:{value:(e,t,n)=>e===t&&t===n?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(n/255*5),enumerable:!1},hexToRgb:{value:e=>{const t=/(?[a-f\d]{6}|[a-f\d]{3})/i.exec(e.toString(16));if(!t)return[0,0,0];let{colorString:n}=t.groups;3===n.length&&(n=n.split("").map((e=>e+e)).join(""));const r=Number.parseInt(n,16);return[r>>16&255,r>>8&255,255&r]},enumerable:!1},hexToAnsi256:{value:e=>t.rgbToAnsi256(...t.hexToRgb(e)),enumerable:!1}}),t}})},5498:function(e,t,n){var r={"./anchor_controller.js":1835,"./clipboard_controller.js":7374,"./flasher_controller.js":9447,"./navigation_controller.js":1162,"./noty_controller.js":1880,"./notyf_controller.js":6326,"./playground_controller.js":4983,"./prev-next_controller.js":2995,"./ray_controller.js":2492,"./sweetalert_controller.js":6242,"./toastr_controller.js":3921,"./tryit_controller.js":1759};function i(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}i.keys=function(){return Object.keys(r)},i.resolve=o,e.exports=i,i.id=5498},5616:function(e,t){var n;!function(t,n){"use strict";"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,(function(r,i){"use strict";var o=[],s=Object.getPrototypeOf,a=o.slice,l=o.flat?function(e){return o.flat.call(e)}:function(e){return o.concat.apply([],e)},c=o.push,u=o.indexOf,d={},h=d.toString,p=d.hasOwnProperty,f=p.toString,m=f.call(Object),g={},y=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},v=function(e){return null!=e&&e===e.window},w=r.document,b={type:!0,src:!0,nonce:!0,noModule:!0};function x(e,t,n){var r,i,o=(n=n||w).createElement("script");if(o.text=e,t)for(r in b)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function E(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?d[h.call(e)]||"object":typeof e}var C="3.7.1",k=/HTML$/i,A=function(e,t){return new A.fn.init(e,t)};function O(e){var t=!!e&&"length"in e&&e.length,n=E(e);return!y(e)&&!v(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function S(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}A.fn=A.prototype={jquery:C,constructor:A,length:0,toArray:function(){return a.call(this)},get:function(e){return null==e?a.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=A.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return A.each(this,e)},map:function(e){return this.pushStack(A.map(this,(function(t,n){return e.call(t,n,t)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(A.grep(this,(function(e,t){return(t+1)%2})))},odd:function(){return this.pushStack(A.grep(this,(function(e,t){return t%2})))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+P+")"+P+"*"),H=new RegExp(P+"|>"),I=new RegExp($),z=new RegExp("^"+j+"$"),U={ID:new RegExp("^#("+j+")"),CLASS:new RegExp("^\\.("+j+")"),TAG:new RegExp("^("+j+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:new RegExp("^(?:"+O+")$","i"),needsContext:new RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},V=/^(?:input|select|textarea|button)$/i,W=/^h\d$/i,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/[+~]/,X=new RegExp("\\\\[\\da-fA-F]{1,6}"+P+"?|\\\\([^\\r\\n\\f])","g"),Y=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},J=function(){le()},Z=he((function(e){return!0===e.disabled&&S(e,"fieldset")}),{dir:"parentNode",next:"legend"});try{m.apply(o=a.call(D.childNodes),D.childNodes),o[D.childNodes.length].nodeType}catch(e){m={apply:function(e,t){F.apply(e,a.call(t))},call:function(e){F.apply(e,a.call(arguments,1))}}}function Q(e,t,n,r){var i,o,s,a,c,u,p,f=t&&t.ownerDocument,v=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==v&&9!==v&&11!==v)return n;if(!r&&(le(t),t=t||l,d)){if(11!==v&&(c=K.exec(e)))if(i=c[1]){if(9===v){if(!(s=t.getElementById(i)))return n;if(s.id===i)return m.call(n,s),n}else if(f&&(s=f.getElementById(i))&&Q.contains(t,s)&&s.id===i)return m.call(n,s),n}else{if(c[2])return m.apply(n,t.getElementsByTagName(e)),n;if((i=c[3])&&t.getElementsByClassName)return m.apply(n,t.getElementsByClassName(i)),n}if(!(C[e+" "]||h&&h.test(e))){if(p=e,f=t,1===v&&(H.test(e)||q.test(e))){for((f=G.test(e)&&ae(t.parentNode)||t)==t&&g.scope||((a=t.getAttribute("id"))?a=A.escapeSelector(a):t.setAttribute("id",a=y)),o=(u=ue(e)).length;o--;)u[o]=(a?"#"+a:":scope")+" "+de(u[o]);p=u.join(",")}try{return m.apply(n,f.querySelectorAll(p)),n}catch(t){C(e,!0)}finally{a===y&&t.removeAttribute("id")}}}return ve(e.replace(L,"$1"),t,n,r)}function ee(){var e=[];return function n(r,i){return e.push(r+" ")>t.cacheLength&&delete n[e.shift()],n[r+" "]=i}}function te(e){return e[y]=!0,e}function ne(e){var t=l.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function re(e){return function(t){return S(t,"input")&&t.type===e}}function ie(e){return function(t){return(S(t,"input")||S(t,"button"))&&t.type===e}}function oe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&Z(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function se(e){return te((function(t){return t=+t,te((function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))}))}))}function ae(e){return e&&void 0!==e.getElementsByTagName&&e}function le(e){var n,r=e?e.ownerDocument||e:D;return r!=l&&9===r.nodeType&&r.documentElement?(c=(l=r).documentElement,d=!A.isXMLDoc(l),f=c.matches||c.webkitMatchesSelector||c.msMatchesSelector,c.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",J),g.getById=ne((function(e){return c.appendChild(e).id=A.expando,!l.getElementsByName||!l.getElementsByName(A.expando).length})),g.disconnectedMatch=ne((function(e){return f.call(e,"*")})),g.scope=ne((function(){return l.querySelectorAll(":scope")})),g.cssHas=ne((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}})),g.getById?(t.filter.ID=function(e){var t=e.replace(X,Y);return function(e){return e.getAttribute("id")===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&d){var n=t.getElementById(e);return n?[n]:[]}}):(t.filter.ID=function(e){var t=e.replace(X,Y);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},t.find.ID=function(e,t){if(void 0!==t.getElementById&&d){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),t.find.TAG=function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},t.find.CLASS=function(e,t){if(void 0!==t.getElementsByClassName&&d)return t.getElementsByClassName(e)},h=[],ne((function(e){var t;c.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+P+"*(?:value|"+O+")"),e.querySelectorAll("[id~="+y+"-]").length||h.push("~="),e.querySelectorAll("a#"+y+"+*").length||h.push(".#.+[+~]"),e.querySelectorAll(":checked").length||h.push(":checked"),(t=l.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),c.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&h.push(":enabled",":disabled"),(t=l.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||h.push("\\["+P+"*name"+P+"*="+P+"*(?:''|\"\")")})),g.cssHas||h.push(":has"),h=h.length&&new RegExp(h.join("|")),k=function(e,t){if(e===t)return s=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===l||e.ownerDocument==D&&Q.contains(D,e)?-1:t===l||t.ownerDocument==D&&Q.contains(D,t)?1:i?u.call(i,e)-u.call(i,t):0:4&n?-1:1)},l):l}for(e in Q.matches=function(e,t){return Q(e,null,null,t)},Q.matchesSelector=function(e,t){if(le(e),d&&!C[t+" "]&&(!h||!h.test(t)))try{var n=f.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){C(t,!0)}return Q(t,l,null,[e]).length>0},Q.contains=function(e,t){return(e.ownerDocument||e)!=l&&le(e),A.contains(e,t)},Q.attr=function(e,n){(e.ownerDocument||e)!=l&&le(e);var r=t.attrHandle[n.toLowerCase()],i=r&&p.call(t.attrHandle,n.toLowerCase())?r(e,n,!d):void 0;return void 0!==i?i:e.getAttribute(n)},Q.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},A.uniqueSort=function(e){var t,n=[],r=0,o=0;if(s=!g.sortStable,i=!g.sortStable&&a.call(e,0),_.call(e,k),s){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)N.call(e,n[r],1)}return i=null,e},A.fn.uniqueSort=function(){return this.pushStack(A.uniqueSort(a.apply(this)))},t=A.expr={cacheLength:50,createPseudo:te,match:U,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(X,Y),e[3]=(e[3]||e[4]||e[5]||"").replace(X,Y),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||Q.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&Q.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return U.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&I.test(n)&&(t=ue(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(X,Y).toLowerCase();return"*"===e?function(){return!0}:function(e){return S(e,t)}},CLASS:function(e){var t=b[e+" "];return t||(t=new RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&b(e,(function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var i=Q.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(R," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var c,u,d,h,p,f=o!==s?"nextSibling":"previousSibling",m=t.parentNode,g=a&&t.nodeName.toLowerCase(),w=!l&&!a,b=!1;if(m){if(o){for(;f;){for(d=t;d=d[f];)if(a?S(d,g):1===d.nodeType)return!1;p=f="only"===e&&!p&&"nextSibling"}return!0}if(p=[s?m.firstChild:m.lastChild],s&&w){for(b=(h=(c=(u=m[y]||(m[y]={}))[e]||[])[0]===v&&c[1])&&c[2],d=h&&m.childNodes[h];d=++h&&d&&d[f]||(b=h=0)||p.pop();)if(1===d.nodeType&&++b&&d===t){u[e]=[v,h,b];break}}else if(w&&(b=h=(c=(u=t[y]||(t[y]={}))[e]||[])[0]===v&&c[1]),!1===b)for(;(d=++h&&d&&d[f]||(b=h=0)||p.pop())&&(!(a?S(d,g):1===d.nodeType)||!++b||(w&&((u=d[y]||(d[y]={}))[e]=[v,b]),d!==t)););return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,n){var r,i=t.pseudos[e]||t.setFilters[e.toLowerCase()]||Q.error("unsupported pseudo: "+e);return i[y]?i(n):i.length>1?(r=[e,e,"",n],t.setFilters.hasOwnProperty(e.toLowerCase())?te((function(e,t){for(var r,o=i(e,n),s=o.length;s--;)e[r=u.call(e,o[s])]=!(t[r]=o[s])})):function(e){return i(e,0,r)}):i}},pseudos:{not:te((function(e){var t=[],n=[],r=ye(e.replace(L,"$1"));return r[y]?te((function(e,t,n,i){for(var o,s=r(e,null,i,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))})):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}})),has:te((function(e){return function(t){return Q(e,t).length>0}})),contains:te((function(e){return e=e.replace(X,Y),function(t){return(t.textContent||A.text(t)).indexOf(e)>-1}})),lang:te((function(e){return z.test(e||"")||Q.error("unsupported lang: "+e),e=e.replace(X,Y).toLowerCase(),function(t){var n;do{if(n=d?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}})),target:function(e){var t=r.location&&r.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===c},focus:function(e){return e===function(){try{return l.activeElement}catch(e){}}()&&l.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:oe(!1),disabled:oe(!0),checked:function(e){return S(e,"input")&&!!e.checked||S(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!t.pseudos.empty(e)},header:function(e){return W.test(e.nodeName)},input:function(e){return V.test(e.nodeName)},button:function(e){return S(e,"input")&&"button"===e.type||S(e,"button")},text:function(e){var t;return S(e,"input")&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:se((function(){return[0]})),last:se((function(e,t){return[t-1]})),eq:se((function(e,t,n){return[n<0?n+t:n]})),even:se((function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e})),gt:se((function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function fe(e,t,n,r,i){for(var o,s=[],a=0,l=e.length,c=null!=t;a-1&&(o[c]=!(s[c]=h))}}else p=fe(p===s?p.splice(y,p.length):p),i?i(null,s,p,l):m.apply(s,p)}))}function ge(e){for(var r,i,o,s=e.length,a=t.relative[e[0].type],l=a||t.relative[" "],c=a?1:0,d=he((function(e){return e===r}),l,!0),h=he((function(e){return u.call(r,e)>-1}),l,!0),p=[function(e,t,i){var o=!a&&(i||t!=n)||((r=t).nodeType?d(e,t,i):h(e,t,i));return r=null,o}];c1&&pe(p),c>1&&de(e.slice(0,c-1).concat({value:" "===e[c-2].type?"*":""})).replace(L,"$1"),i,c0,o=e.length>0,s=function(s,a,c,u,h){var p,f,g,y=0,w="0",b=s&&[],x=[],E=n,C=s||o&&t.find.TAG("*",h),k=v+=null==E?1:Math.random()||.1,O=C.length;for(h&&(n=a==l||a||h);w!==O&&null!=(p=C[w]);w++){if(o&&p){for(f=0,a||p.ownerDocument==l||(le(p),c=!d);g=e[f++];)if(g(p,a||l,c)){m.call(u,p);break}h&&(v=k)}i&&((p=!g&&p)&&y--,s&&b.push(p))}if(y+=w,i&&w!==y){for(f=0;g=r[f++];)g(b,x,a,c);if(s){if(y>0)for(;w--;)b[w]||x[w]||(x[w]=T.call(u));x=fe(x)}m.apply(u,x),h&&!s&&x.length>0&&y+r.length>1&&A.uniqueSort(u)}return h&&(v=k,n=E),b};return i?te(s):s}(s,o)),a.selector=e}return a}function ve(e,n,r,i){var o,s,a,l,c,u="function"==typeof e&&e,h=!i&&ue(e=u.selector||e);if(r=r||[],1===h.length){if((s=h[0]=h[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&d&&t.relative[s[1].type]){if(!(n=(t.find.ID(a.matches[0].replace(X,Y),n)||[])[0]))return r;u&&(n=n.parentNode),e=e.slice(s.shift().value.length)}for(o=U.needsContext.test(e)?0:s.length;o--&&(a=s[o],!t.relative[l=a.type]);)if((c=t.find[l])&&(i=c(a.matches[0].replace(X,Y),G.test(s[0].type)&&ae(n.parentNode)||n))){if(s.splice(o,1),!(e=i.length&&de(s)))return m.apply(r,i),r;break}}return(u||ye(e,h))(i,n,!d,r,!n||G.test(e)&&ae(n.parentNode)||n),r}ce.prototype=t.filters=t.pseudos,t.setFilters=new ce,g.sortStable=y.split("").sort(k).join("")===y,le(),g.sortDetached=ne((function(e){return 1&e.compareDocumentPosition(l.createElement("fieldset"))})),A.find=Q,A.expr[":"]=A.expr.pseudos,A.unique=A.uniqueSort,Q.compile=ye,Q.select=ve,Q.setDocument=le,Q.tokenize=ue,Q.escape=A.escapeSelector,Q.getText=A.text,Q.isXML=A.isXMLDoc,Q.selectors=A.expr,Q.support=A.support,Q.uniqueSort=A.uniqueSort}();var $=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&A(e).is(n))break;r.push(e)}return r},R=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},B=A.expr.match.needsContext,q=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function H(e,t,n){return y(t)?A.grep(e,(function(e,r){return!!t.call(e,r,e)!==n})):t.nodeType?A.grep(e,(function(e){return e===t!==n})):"string"!=typeof t?A.grep(e,(function(e){return u.call(t,e)>-1!==n})):A.filter(t,e,n)}A.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?A.find.matchesSelector(r,e)?[r]:[]:A.find.matches(e,A.grep(t,(function(e){return 1===e.nodeType})))},A.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(A(e).filter((function(){for(t=0;t1?A.uniqueSort(n):n},filter:function(e){return this.pushStack(H(this,e||[],!1))},not:function(e){return this.pushStack(H(this,e||[],!0))},is:function(e){return!!H(this,"string"==typeof e&&B.test(e)?A(e):e||[],!1).length}});var I,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(A.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||I,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:z.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof A?t[0]:t,A.merge(this,A.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:w,!0)),q.test(r[1])&&A.isPlainObject(t))for(r in t)y(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=w.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(A):A.makeArray(e,this)}).prototype=A.fn,I=A(w);var U=/^(?:parents|prev(?:Until|All))/,V={children:!0,contents:!0,next:!0,prev:!0};function W(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}A.fn.extend({has:function(e){var t=A(e,this),n=t.length;return this.filter((function(){for(var e=0;e-1:1===n.nodeType&&A.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?A.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(A(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(A.uniqueSort(A.merge(this.get(),A(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),A.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return $(e,"parentNode")},parentsUntil:function(e,t,n){return $(e,"parentNode",n)},next:function(e){return W(e,"nextSibling")},prev:function(e){return W(e,"previousSibling")},nextAll:function(e){return $(e,"nextSibling")},prevAll:function(e){return $(e,"previousSibling")},nextUntil:function(e,t,n){return $(e,"nextSibling",n)},prevUntil:function(e,t,n){return $(e,"previousSibling",n)},siblings:function(e){return R((e.parentNode||{}).firstChild,e)},children:function(e){return R(e.firstChild)},contents:function(e){return null!=e.contentDocument&&s(e.contentDocument)?e.contentDocument:(S(e,"template")&&(e=e.content||e),A.merge([],e.childNodes))}},(function(e,t){A.fn[e]=function(n,r){var i=A.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=A.filter(r,i)),this.length>1&&(V[e]||A.uniqueSort(i),U.test(e)&&i.reverse()),this.pushStack(i)}}));var K=/[^\x20\t\r\n\f]+/g;function G(e){return e}function X(e){throw e}function Y(e,t,n,r){var i;try{e&&y(i=e.promise)?i.call(e).done(t).fail(n):e&&y(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}A.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return A.each(e.match(K)||[],(function(e,n){t[n]=!0})),t}(e):A.extend({},e);var t,n,r,i,o=[],s=[],a=-1,l=function(){for(i=i||e.once,r=t=!0;s.length;a=-1)for(n=s.shift();++a-1;)o.splice(n,1),n<=a&&a--})),this},has:function(e){return e?A.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=s=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=s=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},A.extend({Deferred:function(e){var t=[["notify","progress",A.Callbacks("memory"),A.Callbacks("memory"),2],["resolve","done",A.Callbacks("once memory"),A.Callbacks("once memory"),0,"resolved"],["reject","fail",A.Callbacks("once memory"),A.Callbacks("once memory"),1,"rejected"]],n="pending",i={state:function(){return n},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return A.Deferred((function(n){A.each(t,(function(t,r){var i=y(e[r[4]])&&e[r[4]];o[r[1]]((function(){var e=i&&i.apply(this,arguments);e&&y(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[e]:arguments)}))})),e=null})).promise()},then:function(e,n,i){var o=0;function s(e,t,n,i){return function(){var a=this,l=arguments,c=function(){var r,c;if(!(e=o&&(n!==X&&(a=void 0,l=[r]),t.rejectWith(a,l))}};e?u():(A.Deferred.getErrorHook?u.error=A.Deferred.getErrorHook():A.Deferred.getStackHook&&(u.error=A.Deferred.getStackHook()),r.setTimeout(u))}}return A.Deferred((function(r){t[0][3].add(s(0,r,y(i)?i:G,r.notifyWith)),t[1][3].add(s(0,r,y(e)?e:G)),t[2][3].add(s(0,r,y(n)?n:X))})).promise()},promise:function(e){return null!=e?A.extend(e,i):i}},o={};return A.each(t,(function(e,r){var s=r[2],a=r[5];i[r[1]]=s.add,a&&s.add((function(){n=a}),t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),s.add(r[3].fire),o[r[0]]=function(){return o[r[0]+"With"](this===o?void 0:this,arguments),this},o[r[0]+"With"]=s.fireWith})),i.promise(o),e&&e.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=a.call(arguments),o=A.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?a.call(arguments):n,--t||o.resolveWith(r,i)}};if(t<=1&&(Y(e,o.done(s(n)).resolve,o.reject,!t),"pending"===o.state()||y(i[n]&&i[n].then)))return o.then();for(;n--;)Y(i[n],s(n),o.reject);return o.promise()}});var J=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;A.Deferred.exceptionHook=function(e,t){r.console&&r.console.warn&&e&&J.test(e.name)&&r.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},A.readyException=function(e){r.setTimeout((function(){throw e}))};var Z=A.Deferred();function Q(){w.removeEventListener("DOMContentLoaded",Q),r.removeEventListener("load",Q),A.ready()}A.fn.ready=function(e){return Z.then(e).catch((function(e){A.readyException(e)})),this},A.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--A.readyWait:A.isReady)||(A.isReady=!0,!0!==e&&--A.readyWait>0||Z.resolveWith(w,[A]))}}),A.ready.then=Z.then,"complete"===w.readyState||"loading"!==w.readyState&&!w.documentElement.doScroll?r.setTimeout(A.ready):(w.addEventListener("DOMContentLoaded",Q),r.addEventListener("load",Q));var ee=function(e,t,n,r,i,o,s){var a=0,l=e.length,c=null==n;if("object"===E(n))for(a in i=!0,n)ee(e,t,a,n[a],!0,o,s);else if(void 0!==r&&(i=!0,y(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(A(e),n)})),t))for(;a1,null,!0)},removeData:function(e){return this.each((function(){le.remove(this,e)}))}}),A.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=ae.get(e,t),n&&(!r||Array.isArray(n)?r=ae.access(e,t,A.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=A.queue(e,t),r=n.length,i=n.shift(),o=A._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,(function(){A.dequeue(e,t)}),o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return ae.get(e,n)||ae.access(e,n,{empty:A.Callbacks("once memory").add((function(){ae.remove(e,[t+"queue",n])}))})}}),A.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Se=/^$|^module$|\/(?:java|ecma)script/i;Ce=w.createDocumentFragment().appendChild(w.createElement("div")),(ke=w.createElement("input")).setAttribute("type","radio"),ke.setAttribute("checked","checked"),ke.setAttribute("name","t"),Ce.appendChild(ke),g.checkClone=Ce.cloneNode(!0).cloneNode(!0).lastChild.checked,Ce.innerHTML="",g.noCloneChecked=!!Ce.cloneNode(!0).lastChild.defaultValue,Ce.innerHTML="",g.option=!!Ce.lastChild;var Te={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function _e(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&S(e,t)?A.merge([e],n):n}function Ne(e,t){for(var n=0,r=e.length;n",""]);var Pe=/<|&#?\w+;/;function Le(e,t,n,r,i){for(var o,s,a,l,c,u,d=t.createDocumentFragment(),h=[],p=0,f=e.length;p-1)i&&i.push(o);else if(c=ge(o),s=_e(d.appendChild(o),"script"),c&&Ne(s),n)for(u=0;o=s[u++];)Se.test(o.type||"")&&n.push(o);return d}var je=/^([^.]*)(?:\.(.+)|)/;function Me(){return!0}function De(){return!1}function Fe(e,t,n,r,i,o){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(r=r||n,n=void 0),t)Fe(e,a,n,r,t[a],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=De;else if(!i)return e;return 1===o&&(s=i,i=function(e){return A().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=A.guid++)),e.each((function(){A.event.add(this,t,i,r,n)}))}function $e(e,t,n){n?(ae.set(e,t,!1),A.event.add(e,t,{namespace:!1,handler:function(e){var n,r=ae.get(this,t);if(1&e.isTrigger&&this[t]){if(r)(A.event.special[t]||{}).delegateType&&e.stopPropagation();else if(r=a.call(arguments),ae.set(this,t,r),this[t](),n=ae.get(this,t),ae.set(this,t,!1),r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n}else r&&(ae.set(this,t,A.event.trigger(r[0],r.slice(1),this)),e.stopPropagation(),e.isImmediatePropagationStopped=Me)}})):void 0===ae.get(e,t)&&A.event.add(e,t,Me)}A.event={global:{},add:function(e,t,n,r,i){var o,s,a,l,c,u,d,h,p,f,m,g=ae.get(e);if(oe(e))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&A.find.matchesSelector(me,i),n.guid||(n.guid=A.guid++),(l=g.events)||(l=g.events=Object.create(null)),(s=g.handle)||(s=g.handle=function(t){return void 0!==A&&A.event.triggered!==t.type?A.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(K)||[""]).length;c--;)p=m=(a=je.exec(t[c])||[])[1],f=(a[2]||"").split(".").sort(),p&&(d=A.event.special[p]||{},p=(i?d.delegateType:d.bindType)||p,d=A.event.special[p]||{},u=A.extend({type:p,origType:m,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&A.expr.match.needsContext.test(i),namespace:f.join(".")},o),(h=l[p])||((h=l[p]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(e,r,f,s)||e.addEventListener&&e.addEventListener(p,s)),d.add&&(d.add.call(e,u),u.handler.guid||(u.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,u):h.push(u),A.event.global[p]=!0)},remove:function(e,t,n,r,i){var o,s,a,l,c,u,d,h,p,f,m,g=ae.hasData(e)&&ae.get(e);if(g&&(l=g.events)){for(c=(t=(t||"").match(K)||[""]).length;c--;)if(p=m=(a=je.exec(t[c])||[])[1],f=(a[2]||"").split(".").sort(),p){for(d=A.event.special[p]||{},h=l[p=(r?d.delegateType:d.bindType)||p]||[],a=a[2]&&new RegExp("(^|\\.)"+f.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)u=h[o],!i&&m!==u.origType||n&&n.guid!==u.guid||a&&!a.test(u.namespace)||r&&r!==u.selector&&("**"!==r||!u.selector)||(h.splice(o,1),u.selector&&h.delegateCount--,d.remove&&d.remove.call(e,u));s&&!h.length&&(d.teardown&&!1!==d.teardown.call(e,f,g.handle)||A.removeEvent(e,p,g.handle),delete l[p])}else for(p in l)A.event.remove(e,p+t[c],n,r,!0);A.isEmptyObject(l)&&ae.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,s,a=new Array(arguments.length),l=A.event.fix(e),c=(ae.get(this,"events")||Object.create(null))[l.type]||[],u=A.event.special[l.type]||{};for(a[0]=l,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||!0!==c.disabled)){for(o=[],s={},n=0;n-1:A.find(i,this,null,[c]).length),s[i]&&o.push(r);o.length&&a.push({elem:c,handlers:o})}return c=this,l\s*$/g;function He(e,t){return S(e,"table")&&S(11!==t.nodeType?t:t.firstChild,"tr")&&A(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ze(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ue(e,t){var n,r,i,o,s,a;if(1===t.nodeType){if(ae.hasData(e)&&(a=ae.get(e).events))for(i in ae.remove(t,"handle events"),a)for(n=0,r=a[i].length;n1&&"string"==typeof f&&!g.checkClone&&Be.test(f))return e.each((function(i){var o=e.eq(i);m&&(t[0]=f.call(this,i,o.html())),We(o,t,n,r)}));if(h&&(o=(i=Le(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(a=(s=A.map(_e(i,"script"),Ie)).length;d0&&Ne(s,!l&&_e(e,"script")),a},cleanData:function(e){for(var t,n,r,i=A.event.special,o=0;void 0!==(n=e[o]);o++)if(oe(n)){if(t=n[ae.expando]){if(t.events)for(r in t.events)i[r]?A.event.remove(n,r):A.removeEvent(n,r,t.handle);n[ae.expando]=void 0}n[le.expando]&&(n[le.expando]=void 0)}}}),A.fn.extend({detach:function(e){return Ke(this,e,!0)},remove:function(e){return Ke(this,e)},text:function(e){return ee(this,(function(e){return void 0===e?A.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return We(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||He(this,e).appendChild(e)}))},prepend:function(){return We(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=He(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return We(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return We(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(A.cleanData(_e(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return A.clone(this,e,t)}))},html:function(e){return ee(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Re.test(e)&&!Te[(Oe.exec(e)||["",""])[1].toLowerCase()]){e=A.htmlPrefilter(e);try{for(;n=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-l-a-.5))||0),l+c}function ut(e,t,n){var r=Ye(e),i=(!g.boxSizingReliable()||n)&&"border-box"===A.css(e,"boxSizing",!1,r),o=i,s=Qe(e,t,r),a="offset"+t[0].toUpperCase()+t.slice(1);if(Ge.test(s)){if(!n)return s;s="auto"}return(!g.boxSizingReliable()&&i||!g.reliableTrDimensions()&&S(e,"tr")||"auto"===s||!parseFloat(s)&&"inline"===A.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===A.css(e,"boxSizing",!1,r),(o=a in e)&&(s=e[a])),(s=parseFloat(s)||0)+ct(e,t,n||(i?"border":"content"),o,r,s)+"px"}function dt(e,t,n,r,i){return new dt.prototype.init(e,t,n,r,i)}A.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Qe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=ie(t),l=Xe.test(t),c=e.style;if(l||(t=it(a)),s=A.cssHooks[t]||A.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(i=s.get(e,!1,r))?i:c[t];"string"===(o=typeof n)&&(i=pe.exec(n))&&i[1]&&(n=we(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||l||(n+=i&&i[3]||(A.cssNumber[a]?"":"px")),g.clearCloneStyle||""!==n||0!==t.indexOf("background")||(c[t]="inherit"),s&&"set"in s&&void 0===(n=s.set(e,n,r))||(l?c.setProperty(t,n):c[t]=n))}},css:function(e,t,n,r){var i,o,s,a=ie(t);return Xe.test(t)||(t=it(a)),(s=A.cssHooks[t]||A.cssHooks[a])&&"get"in s&&(i=s.get(e,!0,n)),void 0===i&&(i=Qe(e,t,r)),"normal"===i&&t in at&&(i=at[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),A.each(["height","width"],(function(e,t){A.cssHooks[t]={get:function(e,n,r){if(n)return!ot.test(A.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?ut(e,t,r):Je(e,st,(function(){return ut(e,t,r)}))},set:function(e,n,r){var i,o=Ye(e),s=!g.scrollboxSize()&&"absolute"===o.position,a=(s||r)&&"border-box"===A.css(e,"boxSizing",!1,o),l=r?ct(e,t,r,a,o):0;return a&&s&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-ct(e,t,"border",!1,o)-.5)),l&&(i=pe.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=A.css(e,t)),lt(0,n,l)}}})),A.cssHooks.marginLeft=et(g.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(Qe(e,"marginLeft"))||e.getBoundingClientRect().left-Je(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),A.each({margin:"",padding:"",border:"Width"},(function(e,t){A.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+fe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(A.cssHooks[e+t].set=lt)})),A.fn.extend({css:function(e,t){return ee(this,(function(e,t,n){var r,i,o={},s=0;if(Array.isArray(t)){for(r=Ye(e),i=t.length;s1)}}),A.Tween=dt,dt.prototype={constructor:dt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||A.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(A.cssNumber[n]?"":"px")},cur:function(){var e=dt.propHooks[this.prop];return e&&e.get?e.get(this):dt.propHooks._default.get(this)},run:function(e){var t,n=dt.propHooks[this.prop];return this.options.duration?this.pos=t=A.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):dt.propHooks._default.set(this),this}},dt.prototype.init.prototype=dt.prototype,dt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=A.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){A.fx.step[e.prop]?A.fx.step[e.prop](e):1!==e.elem.nodeType||!A.cssHooks[e.prop]&&null==e.elem.style[it(e.prop)]?e.elem[e.prop]=e.now:A.style(e.elem,e.prop,e.now+e.unit)}}},dt.propHooks.scrollTop=dt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},A.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},A.fx=dt.prototype.init,A.fx.step={};var ht,pt,ft=/^(?:toggle|show|hide)$/,mt=/queueHooks$/;function gt(){pt&&(!1===w.hidden&&r.requestAnimationFrame?r.requestAnimationFrame(gt):r.setTimeout(gt,A.fx.interval),A.fx.tick())}function yt(){return r.setTimeout((function(){ht=void 0})),ht=Date.now()}function vt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=fe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function wt(e,t,n){for(var r,i=(bt.tweeners[t]||[]).concat(bt.tweeners["*"]),o=0,s=i.length;o1)},removeAttr:function(e){return this.each((function(){A.removeAttr(this,e)}))}}),A.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?A.prop(e,t,n):(1===o&&A.isXMLDoc(e)||(i=A.attrHooks[t.toLowerCase()]||(A.expr.match.bool.test(t)?xt:void 0)),void 0!==n?null===n?void A.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=A.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!g.radioValue&&"radio"===t&&S(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(K);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),xt={set:function(e,t,n){return!1===t?A.removeAttr(e,n):e.setAttribute(n,n),n}},A.each(A.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=Et[t]||A.find.attr;Et[t]=function(e,t,r){var i,o,s=t.toLowerCase();return r||(o=Et[s],Et[s]=i,i=null!=n(e,t,r)?s:null,Et[s]=o),i}}));var Ct=/^(?:input|select|textarea|button)$/i,kt=/^(?:a|area)$/i;function At(e){return(e.match(K)||[]).join(" ")}function Ot(e){return e.getAttribute&&e.getAttribute("class")||""}function St(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(K)||[]}A.fn.extend({prop:function(e,t){return ee(this,A.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[A.propFix[e]||e]}))}}),A.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&A.isXMLDoc(e)||(t=A.propFix[t]||t,i=A.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=A.find.attr(e,"tabindex");return t?parseInt(t,10):Ct.test(e.nodeName)||kt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),g.optSelected||(A.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),A.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){A.propFix[this.toLowerCase()]=this})),A.fn.extend({addClass:function(e){var t,n,r,i,o,s;return y(e)?this.each((function(t){A(this).addClass(e.call(this,t,Ot(this)))})):(t=St(e)).length?this.each((function(){if(r=Ot(this),n=1===this.nodeType&&" "+At(r)+" "){for(o=0;o-1;)n=n.replace(" "+i+" "," ");s=At(n),r!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(e,t){var n,r,i,o,s=typeof e,a="string"===s||Array.isArray(e);return y(e)?this.each((function(n){A(this).toggleClass(e.call(this,n,Ot(this),t),t)})):"boolean"==typeof t&&a?t?this.addClass(e):this.removeClass(e):(n=St(e),this.each((function(){if(a)for(o=A(this),i=0;i-1)return!0;return!1}});var Tt=/\r/g;A.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=y(e),this.each((function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,A(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=A.map(i,(function(e){return null==e?"":e+""}))),(t=A.valHooks[this.type]||A.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))}))):i?(t=A.valHooks[i.type]||A.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(Tt,""):null==n?"":n:void 0}}),A.extend({valHooks:{option:{get:function(e){var t=A.find.attr(e,"value");return null!=t?t:At(A.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,s="select-one"===e.type,a=s?null:[],l=s?o+1:i.length;for(r=o<0?l:s?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),A.each(["radio","checkbox"],(function(){A.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=A.inArray(A(e).val(),t)>-1}},g.checkOn||(A.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}));var _t=r.location,Nt={guid:Date.now()},Pt=/\?/;A.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new r.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||A.error("Invalid XML: "+(n?A.map(n.childNodes,(function(e){return e.textContent})).join("\n"):e)),t};var Lt=/^(?:focusinfocus|focusoutblur)$/,jt=function(e){e.stopPropagation()};A.extend(A.event,{trigger:function(e,t,n,i){var o,s,a,l,c,u,d,h,f=[n||w],m=p.call(e,"type")?e.type:e,g=p.call(e,"namespace")?e.namespace.split("."):[];if(s=h=a=n=n||w,3!==n.nodeType&&8!==n.nodeType&&!Lt.test(m+A.event.triggered)&&(m.indexOf(".")>-1&&(g=m.split("."),m=g.shift(),g.sort()),c=m.indexOf(":")<0&&"on"+m,(e=e[A.expando]?e:new A.Event(m,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=g.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:A.makeArray(t,[e]),d=A.event.special[m]||{},i||!d.trigger||!1!==d.trigger.apply(n,t))){if(!i&&!d.noBubble&&!v(n)){for(l=d.delegateType||m,Lt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)f.push(s),a=s;a===(n.ownerDocument||w)&&f.push(a.defaultView||a.parentWindow||r)}for(o=0;(s=f[o++])&&!e.isPropagationStopped();)h=s,e.type=o>1?l:d.bindType||m,(u=(ae.get(s,"events")||Object.create(null))[e.type]&&ae.get(s,"handle"))&&u.apply(s,t),(u=c&&s[c])&&u.apply&&oe(s)&&(e.result=u.apply(s,t),!1===e.result&&e.preventDefault());return e.type=m,i||e.isDefaultPrevented()||d._default&&!1!==d._default.apply(f.pop(),t)||!oe(n)||c&&y(n[m])&&!v(n)&&((a=n[c])&&(n[c]=null),A.event.triggered=m,e.isPropagationStopped()&&h.addEventListener(m,jt),n[m](),e.isPropagationStopped()&&h.removeEventListener(m,jt),A.event.triggered=void 0,a&&(n[c]=a)),e.result}},simulate:function(e,t,n){var r=A.extend(new A.Event,n,{type:e,isSimulated:!0});A.event.trigger(r,null,t)}}),A.fn.extend({trigger:function(e,t){return this.each((function(){A.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return A.event.trigger(e,t,n,!0)}});var Mt=/\[\]$/,Dt=/\r?\n/g,Ft=/^(?:submit|button|image|reset|file)$/i,$t=/^(?:input|select|textarea|keygen)/i;function Rt(e,t,n,r){var i;if(Array.isArray(t))A.each(t,(function(t,i){n||Mt.test(e)?r(e,i):Rt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)}));else if(n||"object"!==E(t))r(e,t);else for(i in t)Rt(e+"["+i+"]",t[i],n,r)}A.param=function(e,t){var n,r=[],i=function(e,t){var n=y(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!A.isPlainObject(e))A.each(e,(function(){i(this.name,this.value)}));else for(n in e)Rt(n,e[n],t,i);return r.join("&")},A.fn.extend({serialize:function(){return A.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=A.prop(this,"elements");return e?A.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!A(this).is(":disabled")&&$t.test(this.nodeName)&&!Ft.test(e)&&(this.checked||!Ae.test(e))})).map((function(e,t){var n=A(this).val();return null==n?null:Array.isArray(n)?A.map(n,(function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}})):{name:t.name,value:n.replace(Dt,"\r\n")}})).get()}});var Bt=/%20/g,qt=/#.*$/,Ht=/([?&])_=[^&]*/,It=/^(.*?):[ \t]*([^\r\n]*)$/gm,zt=/^(?:GET|HEAD)$/,Ut=/^\/\//,Vt={},Wt={},Kt="*/".concat("*"),Gt=w.createElement("a");function Xt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(K)||[];if(y(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Yt(e,t,n,r){var i={},o=e===Wt;function s(a){var l;return i[a]=!0,A.each(e[a]||[],(function(e,a){var c=a(t,n,r);return"string"!=typeof c||o||i[c]?o?!(l=c):void 0:(t.dataTypes.unshift(c),s(c),!1)})),l}return s(t.dataTypes[0])||!i["*"]&&s("*")}function Jt(e,t){var n,r,i=A.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&A.extend(!0,e,r),e}Gt.href=_t.href,A.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:_t.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(_t.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":A.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Jt(Jt(e,A.ajaxSettings),t):Jt(A.ajaxSettings,e)},ajaxPrefilter:Xt(Vt),ajaxTransport:Xt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var n,i,o,s,a,l,c,u,d,h,p=A.ajaxSetup({},t),f=p.context||p,m=p.context&&(f.nodeType||f.jquery)?A(f):A.event,g=A.Deferred(),y=A.Callbacks("once memory"),v=p.statusCode||{},b={},x={},E="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=It.exec(o);)s[t[1].toLowerCase()+" "]=(s[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=s[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return c?o:null},setRequestHeader:function(e,t){return null==c&&(e=x[e.toLowerCase()]=x[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)C.always(e[C.status]);else for(t in e)v[t]=[v[t],e[t]];return this},abort:function(e){var t=e||E;return n&&n.abort(t),k(0,t),this}};if(g.promise(C),p.url=((e||p.url||_t.href)+"").replace(Ut,_t.protocol+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(K)||[""],null==p.crossDomain){l=w.createElement("a");try{l.href=p.url,l.href=l.href,p.crossDomain=Gt.protocol+"//"+Gt.host!=l.protocol+"//"+l.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=A.param(p.data,p.traditional)),Yt(Vt,p,t,C),c)return C;for(d in(u=A.event&&p.global)&&0==A.active++&&A.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!zt.test(p.type),i=p.url.replace(qt,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(Bt,"+")):(h=p.url.slice(i.length),p.data&&(p.processData||"string"==typeof p.data)&&(i+=(Pt.test(i)?"&":"?")+p.data,delete p.data),!1===p.cache&&(i=i.replace(Ht,"$1"),h=(Pt.test(i)?"&":"?")+"_="+Nt.guid+++h),p.url=i+h),p.ifModified&&(A.lastModified[i]&&C.setRequestHeader("If-Modified-Since",A.lastModified[i]),A.etag[i]&&C.setRequestHeader("If-None-Match",A.etag[i])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Kt+"; q=0.01":""):p.accepts["*"]),p.headers)C.setRequestHeader(d,p.headers[d]);if(p.beforeSend&&(!1===p.beforeSend.call(f,C,p)||c))return C.abort();if(E="abort",y.add(p.complete),C.done(p.success),C.fail(p.error),n=Yt(Wt,p,t,C)){if(C.readyState=1,u&&m.trigger("ajaxSend",[C,p]),c)return C;p.async&&p.timeout>0&&(a=r.setTimeout((function(){C.abort("timeout")}),p.timeout));try{c=!1,n.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(e,t,s,l){var d,h,w,b,x,E=t;c||(c=!0,a&&r.clearTimeout(a),n=void 0,o=l||"",C.readyState=e>0?4:0,d=e>=200&&e<300||304===e,s&&(b=function(e,t,n){for(var r,i,o,s,a=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){l.unshift(i);break}if(l[0]in n)o=l[0];else{for(i in n){if(!l[0]||e.converters[i+" "+l[0]]){o=i;break}s||(s=i)}o=o||s}if(o)return o!==l[0]&&l.unshift(o),n[o]}(p,C,s)),!d&&A.inArray("script",p.dataTypes)>-1&&A.inArray("json",p.dataTypes)<0&&(p.converters["text script"]=function(){}),b=function(e,t,n,r){var i,o,s,a,l,c={},u=e.dataTypes.slice();if(u[1])for(s in e.converters)c[s.toLowerCase()]=e.converters[s];for(o=u.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=u.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(!(s=c[l+" "+o]||c["* "+o]))for(i in c)if((a=i.split(" "))[1]===o&&(s=c[l+" "+a[0]]||c["* "+a[0]])){!0===s?s=c[i]:!0!==c[i]&&(o=a[0],u.unshift(a[1]));break}if(!0!==s)if(s&&e.throws)t=s(t);else try{t=s(t)}catch(e){return{state:"parsererror",error:s?e:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}(p,b,C,d),d?(p.ifModified&&((x=C.getResponseHeader("Last-Modified"))&&(A.lastModified[i]=x),(x=C.getResponseHeader("etag"))&&(A.etag[i]=x)),204===e||"HEAD"===p.type?E="nocontent":304===e?E="notmodified":(E=b.state,h=b.data,d=!(w=b.error))):(w=E,!e&&E||(E="error",e<0&&(e=0))),C.status=e,C.statusText=(t||E)+"",d?g.resolveWith(f,[h,E,C]):g.rejectWith(f,[C,E,w]),C.statusCode(v),v=void 0,u&&m.trigger(d?"ajaxSuccess":"ajaxError",[C,p,d?h:w]),y.fireWith(f,[C,E]),u&&(m.trigger("ajaxComplete",[C,p]),--A.active||A.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return A.get(e,t,n,"json")},getScript:function(e,t){return A.get(e,void 0,t,"script")}}),A.each(["get","post"],(function(e,t){A[t]=function(e,n,r,i){return y(n)&&(i=i||r,r=n,n=void 0),A.ajax(A.extend({url:e,type:t,dataType:i,data:n,success:r},A.isPlainObject(e)&&e))}})),A.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),A._evalUrl=function(e,t,n){return A.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){A.globalEval(e,t,n)}})},A.fn.extend({wrapAll:function(e){var t;return this[0]&&(y(e)&&(e=e.call(this[0])),t=A(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return y(e)?this.each((function(t){A(this).wrapInner(e.call(this,t))})):this.each((function(){var t=A(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=y(e);return this.each((function(n){A(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){A(this).replaceWith(this.childNodes)})),this}}),A.expr.pseudos.hidden=function(e){return!A.expr.pseudos.visible(e)},A.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},A.ajaxSettings.xhr=function(){try{return new r.XMLHttpRequest}catch(e){}};var Zt={0:200,1223:204},Qt=A.ajaxSettings.xhr();g.cors=!!Qt&&"withCredentials"in Qt,g.ajax=Qt=!!Qt,A.ajaxTransport((function(e){var t,n;if(g.cors||Qt&&!e.crossDomain)return{send:function(i,o){var s,a=e.xhr();if(a.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(s in e.xhrFields)a[s]=e.xhrFields[s];for(s in e.mimeType&&a.overrideMimeType&&a.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)a.setRequestHeader(s,i[s]);t=function(e){return function(){t&&(t=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?o(0,"error"):o(a.status,a.statusText):o(Zt[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=t(),n=a.onerror=a.ontimeout=t("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&r.setTimeout((function(){t&&n()}))},t=t("abort");try{a.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),A.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),A.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return A.globalEval(e),e}}}),A.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),A.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,i){t=A(" + +### PHP + +```php +#/ amazon types + +// With Amazon set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Amazon set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Amazon Theme for Specific Notifications + +If Amazon isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.amazon') + ->success('This notification uses Amazon theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.amazon').success('This notification uses Amazon theme.'); +``` + +### Custom Colors The Amazon theme uses CSS variables that can be customized to match your brand: @@ -52,11 +168,23 @@ The Amazon theme uses CSS variables that can be customized to match your brand: --amazon-error-border: #ff8f8f; /* Error border */ --amazon-error-icon: #c40000; /* Error icon color */ - /* Dark mode colors are also available with -dark suffix */ + /* Dark mode colors */ + --amazon-success-bg-dark: #0a3317; + --amazon-success-border-dark: #2a6e3f; + --amazon-success-icon-dark: #7fda95; + --amazon-info-bg-dark: #0a2940; + --amazon-info-border-dark: #2a5d6e; + --amazon-info-icon-dark: #7fb4da; + --amazon-warning-bg-dark: #3d2800; + --amazon-warning-border-dark: #6e5c2a; + --amazon-warning-icon-dark: #ffd996; + --amazon-error-bg-dark: #400a0a; + --amazon-error-border-dark: #6e2a2a; + --amazon-error-icon-dark: #ff8f8f; } ``` -## Structure +## HTML Structure The Amazon theme generates notifications with the following HTML structure: @@ -81,16 +209,26 @@ The Amazon theme generates notifications with the following HTML structure:
    ``` -## Accessibility Features +This structure provides proper semantic markup and accessibility attributes for screen readers and assistive technologies. -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +## Theme Features + +### Dark Mode + +The Amazon theme automatically adapts to system dark mode preferences without additional configuration using the `prefers-color-scheme` media query. + +### Accessibility Features + +The Amazon theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible - **High Contrast**: All text meets WCAG 2.1 AA color contrast standards - **Screen Reader Support**: Proper labeling of interactive elements -## Browser Support +## Browser Support The Amazon theme is compatible with all modern browsers: @@ -99,12 +237,16 @@ The Amazon theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android -## Implementation Details +## Implementation Details -The Amazon theme uses native CSS features: +The Amazon theme uses modern web technologies: -- **CSS Variables**: For theme customization -- **Flexbox**: For layout structure -- **SVG Icons**: For resolution-independent icons -- **Media Queries**: For responsive design, dark mode, and reduced motion +- **CSS Variables**: For theme customization and dark mode support +- **Flexbox Layout**: For responsive and flexible notification structure +- **SVG Icons**: For resolution-independent, lightweight icons +- **Media Queries**: For responsive design, dark mode, and reduced motion support +- **ARIA Attributes**: For accessibility and screen reader support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/amber.md b/docs/pages/themes/amber.md index 8a4327e4..64d10541 100644 --- a/docs/pages/themes/amber.md +++ b/docs/pages/themes/amber.md @@ -1,39 +1,154 @@ -# PHPFlasher Amber Theme +--- +permalink: /theme/amber/ +title: Amber Theme +description: Transform your notifications with the elegant Amber theme for PHPFlasher. Featuring a modern, minimalist design with subtle animations and comprehensive dark mode support. +handler: theme.amber +data-controller: theme-amber +--- -## Overview +## Amber Theme -The Amber theme is a modern, elegant notification style with refined aesthetics that focuses on clean design and readability. It offers a minimalist approach while maintaining visual appeal with subtle animations and transitions. +The Amber theme offers a modern, elegant notification style with refined aesthetics that focuses on clean design and readability. It provides a minimalist approach while maintaining visual appeal with subtle animations and transitions. -![Amber Theme Preview](./images/amber-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Modern Design**: Clean, minimalist styling with optimal readability -- **Type-Specific Icons**: Each notification type (success, error, warning, info) has its own icon -- **Progress Indicator**: Shows the time remaining before auto-dismiss -- **Smooth Animation**: Subtle entrance animation for a polished feel -- **Dark Mode Support**: Complete dark mode implementation with optimized colors -- **RTL Support**: Full right-to-left language support -- **Accessibility**: ARIA roles, reduced motion support, and keyboard accessibility +The easiest way to use the Amber theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.amber', // Make Amber the default theme + + 'themes' => [ + 'amber' => [ + 'scripts' => [ + '/vendor/flasher/themes/amber.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/amber.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.amber # Make Amber the default theme + + themes: + amber: + scripts: + - '/vendor/flasher/themes/amber.min.js' + styles: + - '/vendor/flasher/themes/amber.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { amberTheme } from '@flasher/flasher/themes'; flasher.addTheme('amber', amberTheme); -// Use the theme -flasher.use('theme.amber').success('Your changes have been saved'); -flasher.use('theme.amber').error('An error occurred while saving changes'); -flasher.use('theme.amber').warning('Your session will expire in 5 minutes'); -flasher.use('theme.amber').info('New features have been added'); - // Set as default theme flasher.defaultPlugin = 'theme.amber'; + +// Or use it for specific notifications +flasher.success('Your changes have been saved successfully'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Amber styling: + +{% assign successMessage = 'Your changes have been saved successfully.' %} +{% assign errorMessage = 'An error occurred while saving your changes.' %} +{% assign warningMessage = 'Your session will expire in 5 minutes.' %} +{% assign infoMessage = 'New features have been added to your account.' %} + + + +### PHP + +```php +#/ amber types + +// With Amber set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Amber set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Amber Theme for Specific Notifications + +If Amber isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.amber') + ->success('This notification uses Amber theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.amber').success('This notification uses Amber theme.'); +``` + +### Custom Colors The Amber theme uses CSS variables that can be customized to match your brand: @@ -52,10 +167,13 @@ The Amber theme uses CSS variables that can be customized to match your brand: --amber-info: #3b82f6; /* Info color */ --amber-warning: #f59e0b; /* Warning color */ --amber-error: #ef4444; /* Error color */ + + /* Dark mode shadows */ + --amber-shadow-dark: 0 5px 15px rgba(0, 0, 0, 0.25); } ``` -## Structure +## HTML Structure The Amber theme generates notifications with the following HTML structure: @@ -74,27 +192,37 @@ The Amber theme generates notifications with the following HTML structure:
    ``` -## Accessibility Features +This structure includes a progress bar that shows the time remaining before the notification auto-dismisses. -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +## Theme Features + +### Dark Mode + +The Amber theme automatically adapts to system dark mode preferences without additional configuration using the `prefers-color-scheme` media query. + +### Accessibility Features + +The Amber theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible - **Color Contrast**: All text meets WCAG 2.1 AA color contrast standards - **Button Labels**: Close button has descriptive aria-label for screen readers -## Differences from Default Theme +### Key Differences from Default Theme The Amber theme differs from the default theme in several ways: 1. **More Minimal**: Cleaner design with less ornamentation 2. **Subtle Shadows**: Uses softer box shadows for a modern look 3. **Smaller Icon**: Uses a more compact icon size -4. **No Title**: Focuses solely on the message content for simplicity +4. **Progress Bar**: Visual indicator for auto-dismiss timing 5. **Different Animation**: Uses a top-down entrance animation -6. **Colored Close Button**: Close button is colored based on notification type +6. **Colored Close Button**: Close button color matches notification type -## Browser Support +## Browser Support The Amber theme is compatible with all modern browsers: @@ -103,13 +231,16 @@ The Amber theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android -## Implementation Details +## Implementation Details -The Amber theme uses: +The Amber theme uses modern web technologies: -- **CSS Variables**: For theme customization -- **Flexbox**: For layout structure -- **CSS Animations**: For entrance effects -- **Media Queries**: For responsive design and accessibility +- **CSS Variables**: For theme customization and dark mode support +- **Flexbox Layout**: For responsive and flexible notification structure +- **CSS Animations**: For entrance effects and progress bar +- **Media Queries**: For responsive design, dark mode, and reduced motion support - **Core Icons**: Uses the PHPFlasher core icon system + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/aurora.md b/docs/pages/themes/aurora.md index 3e8f9c2d..8b85a278 100644 --- a/docs/pages/themes/aurora.md +++ b/docs/pages/themes/aurora.md @@ -1,40 +1,154 @@ -# PHPFlasher Aurora Theme +--- +permalink: /theme/aurora/ +title: Aurora Theme +description: Add elegant glass-like notifications to your application with the Aurora theme for PHPFlasher. Featuring translucent backgrounds, subtle gradients, and modern backdrop blur effects. +handler: theme.aurora +data-controller: theme-aurora +--- -## Overview +## Aurora Theme -The Aurora theme provides an elegant, glass-like notification style with translucent backgrounds, subtle gradients, and backdrop blur effects. It offers a modern, refined aesthetic inspired by contemporary UI design trends like Apple's glass morphism. +The Aurora theme provides an elegant, glass-like notification style with translucent backgrounds, subtle gradients, and backdrop blur effects. It offers a modern, refined aesthetic inspired by contemporary UI design trends like glass morphism. -![Aurora Theme Preview](./images/aurora-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Glass Morphism**: Semi-transparent backgrounds with backdrop blur for a frosted glass effect -- **Subtle Gradients**: Type-specific color gradients that elegantly indicate notification type -- **Soft Edges**: Generous border radius for a friendly, modern look -- **Minimalist Design**: Focuses on content by omitting icons and unnecessary UI elements -- **Smooth Animation**: Gentle fade-in with subtle scaling for a refined entrance -- **Progress Indicator**: Understated progress bar that shows remaining time -- **Dark Mode Support**: Beautiful dark mode implementation with adjusted colors and contrast -- **RTL Support**: Full right-to-left language support +The easiest way to use the Aurora theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.aurora', // Make Aurora the default theme + + 'themes' => [ + 'aurora' => [ + 'scripts' => [ + '/vendor/flasher/themes/aurora.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/aurora.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.aurora # Make Aurora the default theme + + themes: + aurora: + scripts: + - '/vendor/flasher/themes/aurora.min.js' + styles: + - '/vendor/flasher/themes/aurora.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { auroraTheme } from '@flasher/flasher/themes'; flasher.addTheme('aurora', auroraTheme); -// Use the theme -flasher.use('theme.aurora').success('Your profile has been updated'); -flasher.use('theme.aurora').error('Please check your connection'); -flasher.use('theme.aurora').warning('Your session will expire soon'); -flasher.use('theme.aurora').info('New feature available'); - // Set as default theme flasher.defaultPlugin = 'theme.aurora'; + +// Or use it for specific notifications +flasher.success('Your profile has been updated'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Aurora styling: + +{% assign successMessage = 'Your profile has been updated successfully.' %} +{% assign errorMessage = 'Please check your connection and try again.' %} +{% assign warningMessage = 'Your session will expire in 5 minutes.' %} +{% assign infoMessage = 'New feature available in your dashboard.' %} + + + +### PHP + +```php +#/ aurora types + +// With Aurora set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Aurora set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Aurora Theme for Specific Notifications + +If Aurora isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.aurora') + ->success('This notification uses Aurora theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.aurora').success('This notification uses Aurora theme.'); +``` + +### Custom Colors and Appearance The Aurora theme uses CSS variables that can be customized to match your brand: @@ -54,12 +168,15 @@ The Aurora theme uses CSS variables that can be customized to match your brand: --aurora-warning: #f59e0b; /* Warning color */ --aurora-error: #ef4444; /* Error color */ - /* Gradient colors can also be customized */ + /* Gradient colors */ --aurora-success-gradient: linear-gradient(135deg, rgba(16, 185, 129, 0.08) 0%, rgba(16, 185, 129, 0.2) 100%); + --aurora-info-gradient: linear-gradient(135deg, rgba(59, 130, 246, 0.08) 0%, rgba(59, 130, 246, 0.2) 100%); + --aurora-warning-gradient: linear-gradient(135deg, rgba(245, 158, 11, 0.08) 0%, rgba(245, 158, 11, 0.2) 100%); + --aurora-error-gradient: linear-gradient(135deg, rgba(239, 68, 68, 0.08) 0%, rgba(239, 68, 68, 0.2) 100%); } ``` -## Structure +## HTML Structure The Aurora theme generates notifications with the following HTML structure: @@ -75,25 +192,29 @@ The Aurora theme generates notifications with the following HTML structure:
    ``` -## Accessibility Features +This minimalist structure focuses on content by omitting unnecessary UI elements while still maintaining a progress bar that shows the time remaining before auto-dismiss. -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +## Theme Features + +### Glass Morphism Effect + +The Aurora theme uses CSS `backdrop-filter` to create its signature glass effect, giving notifications a modern, translucent appearance with background blur. + +### Dark Mode + +The theme automatically adapts to system dark mode preferences without additional configuration, adjusting both the background transparency and text colors for optimal readability. + +### Accessibility Features + +The Aurora theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible -- **Color Contrast**: Maintains proper contrast even with translucent backgrounds +- **Color Contrast**: Maintains proper contrast ratios even with translucent backgrounds - **Button Labels**: Close button has descriptive aria-label for screen readers -## Technical Details - -### Backdrop Filter Support - -The Aurora theme uses CSS `backdrop-filter` to create its signature glass effect. While this property has good browser support, you should be aware of a few considerations: - -- **Browser Compatibility**: Supported in most modern browsers -- **Performance**: Backdrop filters can be GPU-intensive on older devices -- **Fallback**: On browsers without backdrop-filter support, notifications still look good with just the translucent background - ### Animation Technique The entrance animation combines three effects for a refined appearance: @@ -104,15 +225,7 @@ The entrance animation combines three effects for a refined appearance: This combination creates a more organic, sophisticated appearance than simple fades or slides. -### CSS Implementation Notes - -- Uses `::before` pseudo-element for gradient overlays -- Applies different gradients based on notification type -- Leverages CSS custom properties for easy theming -- Implements proper RTL support with direction adjustments -- Provides complete dark mode styling - -## Browser Support +## Browser Support The Aurora theme is compatible with all modern browsers that support CSS variables and backdrop filters: @@ -121,5 +234,18 @@ The Aurora theme is compatible with all modern browsers that support CSS variabl - Safari 9+ - Edge 17+ - Opera 64+ +- Mobile browsers on iOS and Android For browsers that don't support backdrop filters, the theme gracefully degrades to using just the translucent background. + +## Implementation Details + +The Aurora theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **Backdrop Filter**: For the frosted glass effect +- **Gradient Overlays**: Using `::before` pseudo-elements for type-specific styling +- **CSS Animations**: For smooth entrance effects and progress bar +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/crystal.md b/docs/pages/themes/crystal.md index f9cc53a8..a0e68a25 100644 --- a/docs/pages/themes/crystal.md +++ b/docs/pages/themes/crystal.md @@ -1,39 +1,154 @@ -# PHPFlasher Crystal Theme +--- +permalink: /theme/crystal/ +title: Crystal Theme +description: Enhance your notifications with the elegant Crystal theme for PHPFlasher. Featuring a clean, monochromatic design with colored text and subtle animation effects. +handler: theme.crystal +data-controller: theme-crystal +--- -## Overview +## Crystal Theme The Crystal theme provides an elegant, clean notification style with subtle animations and a focus on simplicity. It features a monochromatic design with type-specific colored text and a gentle pulsing shadow effect on hover. -![Crystal Theme Preview](./images/crystal-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Clean Design**: Minimal, white background that lets the content shine -- **Colored Text**: Each notification type has its own text color for easy identification -- **Animated Shadows**: Gentle pulsing shadow effect when hovering over notifications -- **Smooth Entrance**: Subtle slide-in animation when notifications appear -- **Progress Indicator**: Shows the time remaining before auto-dismiss -- **Dark Mode Support**: Complete dark mode implementation with adjusted colors -- **RTL Support**: Full right-to-left language support +The easiest way to use the Crystal theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.crystal', // Make Crystal the default theme + + 'themes' => [ + 'crystal' => [ + 'scripts' => [ + '/vendor/flasher/themes/crystal.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/crystal.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.crystal # Make Crystal the default theme + + themes: + crystal: + scripts: + - '/vendor/flasher/themes/crystal.min.js' + styles: + - '/vendor/flasher/themes/crystal.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { crystalTheme } from '@flasher/flasher/themes'; flasher.addTheme('crystal', crystalTheme); -// Use the theme -flasher.use('theme.crystal').success('Document saved successfully'); -flasher.use('theme.crystal').error('An error occurred while saving'); -flasher.use('theme.crystal').warning('Your session will expire in 5 minutes'); -flasher.use('theme.crystal').info('New features have been added'); - // Set as default theme flasher.defaultPlugin = 'theme.crystal'; + +// Or use it for specific notifications +flasher.success('Document saved successfully'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Crystal styling: + +{% assign successMessage = 'Document saved successfully.' %} +{% assign errorMessage = 'An error occurred while saving your document.' %} +{% assign warningMessage = 'Your session will expire in 5 minutes.' %} +{% assign infoMessage = 'New features have been added to the editor.' %} + + + +### PHP + +```php +#/ crystal types + +// With Crystal set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Crystal set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Crystal Theme for Specific Notifications + +If Crystal isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.crystal') + ->success('This notification uses Crystal theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.crystal').success('This notification uses Crystal theme.'); +``` + +### Custom Colors and Appearance The Crystal theme uses CSS variables that can be customized to match your brand: @@ -55,7 +170,7 @@ The Crystal theme uses CSS variables that can be customized to match your brand: } ``` -## Structure +## HTML Structure The Crystal theme generates notifications with the following HTML structure: @@ -73,7 +188,11 @@ The Crystal theme generates notifications with the following HTML structure:
    ``` -## Animations +This minimalist structure focuses on content with a clean design, while still maintaining a progress bar that shows the time remaining before auto-dismiss. + +## Theme Features + +### Elegant Animations The Crystal theme features two distinct animations: @@ -82,22 +201,26 @@ The Crystal theme features two distinct animations: The hover animation is disabled in dark mode and for users who prefer reduced motion, replaced with a static enhanced shadow effect. -## Accessibility Features +### Dark Mode -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables animations +The theme automatically adapts to system dark mode preferences without additional configuration, adjusting both the background and text colors for optimal readability. + +### Design Philosophy + +The Crystal theme embodies clarity and simplicity. Rather than using colored backgrounds or borders, it employs colored text to indicate notification types. This creates a cleaner, more sophisticated appearance while still providing clear visual cues about the notification's nature. + +### Accessibility Features + +The Crystal theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables animations - **Keyboard Access**: Close button is fully keyboard accessible with visual feedback - **Color Contrast**: High contrast between text and background for readability - **Button Labels**: Close button has descriptive aria-label for screen readers -## Design Philosophy - -The Crystal theme embodies clarity and simplicity. Rather than using colored backgrounds or borders, it employs colored text to indicate notification types. This creates a cleaner, more sophisticated appearance while still providing clear visual cues about the notification's nature. - -The theme's name "Crystal" reflects its clean, transparent design and the subtle light effects created by its animations. - -## Browser Support +## Browser Support The Crystal theme is compatible with all modern browsers: @@ -106,11 +229,17 @@ The Crystal theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android -## Implementation Notes +## Implementation Details -- Uses CSS transitions for smooth hover effects -- Employs keyframe animations for entrance and pulsing shadow -- Uses absolute positioning for the close button to maintain consistent layout -- Provides comprehensive RTL support for international applications -- Implements different behavior in dark mode for optimal visibility +The Crystal theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **CSS Transitions**: For smooth hover effects +- **Keyframe Animations**: For entrance and pulsing shadow effects +- **Absolute Positioning**: For consistent close button layout +- **Progress Bar**: Shows countdown until notification dismissal +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/emerald.md b/docs/pages/themes/emerald.md index 17a4fe19..83c33ec2 100644 --- a/docs/pages/themes/emerald.md +++ b/docs/pages/themes/emerald.md @@ -1,40 +1,154 @@ -# PHPFlasher Emerald Theme +--- +permalink: /theme/emerald/ +title: Emerald Theme +description: Enhance your notifications with the elegant Emerald theme for PHPFlasher. Featuring a glass-like appearance with bounce animation and minimalist design for a modern, polished user experience. +handler: theme.emerald +data-controller: theme-emerald +--- -## Overview +## Emerald Theme The Emerald theme provides an elegant, glass-like notification style with a distinctive bounce animation and translucent background. It focuses on minimalism and modern aesthetics, featuring colored text rather than backgrounds to indicate notification types. -![Emerald Theme Preview](./images/emerald-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Glass Morphism**: Semi-transparent background with backdrop blur for a frosted glass effect -- **Bounce Animation**: Distinctive bounce animation when notifications appear -- **Colored Text**: Each notification type has its own text color for subtle visual distinction -- **Clean Typography**: Uses the modern Inter font with optimized readability -- **Minimalist Design**: Omits icons and progress bars for a cleaner, more elegant look -- **Soft Shadows**: Gentle shadows that add depth without heaviness -- **Dark Mode Support**: Complete dark mode implementation with adjusted opacity and contrast -- **RTL Support**: Full right-to-left language support +The easiest way to use the Emerald theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.emerald', // Make Emerald the default theme + + 'themes' => [ + 'emerald' => [ + 'scripts' => [ + '/vendor/flasher/themes/emerald.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/emerald.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.emerald # Make Emerald the default theme + + themes: + emerald: + scripts: + - '/vendor/flasher/themes/emerald.min.js' + styles: + - '/vendor/flasher/themes/emerald.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { emeraldTheme } from '@flasher/flasher/themes'; flasher.addTheme('emerald', emeraldTheme); -// Use the theme -flasher.use('theme.emerald').success('Your changes have been saved'); -flasher.use('theme.emerald').error('An error occurred while saving'); -flasher.use('theme.emerald').warning('Your session will expire soon'); -flasher.use('theme.emerald').info('New features have been added'); - // Set as default theme flasher.defaultPlugin = 'theme.emerald'; + +// Or use it for specific notifications +flasher.success('Your changes have been saved'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Emerald styling: + +{% assign successMessage = 'Your changes have been saved successfully.' %} +{% assign errorMessage = 'An error occurred while saving your changes.' %} +{% assign warningMessage = 'Your session will expire soon.' %} +{% assign infoMessage = 'New features have been added to your dashboard.' %} + + + +### PHP + +```php +#/ emerald types + +// With Emerald set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Emerald set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Emerald Theme for Specific Notifications + +If Emerald isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.emerald') + ->success('This notification uses Emerald theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.emerald').success('This notification uses Emerald theme.'); +``` + +### Custom Colors and Appearance The Emerald theme uses CSS variables that can be customized to match your brand: @@ -56,7 +170,7 @@ The Emerald theme uses CSS variables that can be customized to match your brand: } ``` -## Structure +## HTML Structure The Emerald theme generates notifications with the following HTML structure: @@ -69,9 +183,13 @@ The Emerald theme generates notifications with the following HTML structure:
    ``` -## Animation +This minimalist structure focuses on content by omitting unnecessary UI elements for a cleaner, more elegant look. -The Emerald theme features a distinctive bounce animation that works as follows: +## Theme Features + +### Distinctive Animation + +The Emerald theme features a unique bounce animation that works as follows: 1. **Start**: The notification begins at 50% size and slightly below its final position 2. **Middle**: It quickly grows to 110% size and slightly above its final position @@ -79,7 +197,15 @@ The Emerald theme features a distinctive bounce animation that works as follows: This creates a playful yet elegant "bounce" effect that draws attention without being too disruptive. -## Design Philosophy +### Glass Morphism Effect + +The theme uses CSS `backdrop-filter` to create a frosted glass effect, giving notifications a modern, translucent appearance with background blur. + +### Dark Mode + +The theme automatically adapts to system dark mode preferences without additional configuration, adjusting both the background transparency and text colors for optimal readability. + +### Design Philosophy The Emerald theme is named after its polished, refined appearance that gives notifications a gem-like quality. Its design principles include: @@ -89,30 +215,18 @@ The Emerald theme is named after its polished, refined appearance that gives not - **Modernity**: Contemporary typography and glass-like effects - **Focus**: Clear emphasis on the message content -## Accessibility Features +### Accessibility Features -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +The Emerald theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible - **Text Sizing**: Uses relative units (rem) for text to respect user font size preferences - **Button Labels**: Close button has descriptive aria-label for screen readers -## Technical Notes - -### Backdrop Filter Support - -The glass effect uses CSS `backdrop-filter` which has good but not universal browser support. In browsers without support, the theme falls back gracefully to a semi-transparent background without the blur effect. - -### Font Selection - -The theme specifies Inter as the preferred font, with fallback to the system font stack. To ensure optimal appearance, you may want to include Inter in your project: - -```html - -``` - -## Browser Support +## Browser Support The Emerald theme is compatible with all modern browsers: @@ -121,5 +235,19 @@ The Emerald theme is compatible with all modern browsers: - Safari 9+ - Edge 79+ - Opera 63+ +- Mobile browsers on iOS and Android For browsers that don't support backdrop-filter, the theme gracefully degrades to a translucent background without blur. + +## Implementation Details + +The Emerald theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **Backdrop Filter**: For the frosted glass effect +- **CSS Animations**: For the distinctive bounce entrance effect +- **Inter Font**: Optimized for clean, modern typography (with system font fallback) +- **Box Shadows**: For subtle depth and dimension +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/facebook.md b/docs/pages/themes/facebook.md index acaa909b..f27fa13a 100644 --- a/docs/pages/themes/facebook.md +++ b/docs/pages/themes/facebook.md @@ -1,46 +1,177 @@ -# PHPFlasher Facebook Theme +--- +permalink: /theme/facebook/ +title: Facebook Theme +description: Add Facebook-style notifications to your application with the Facebook theme for PHPFlasher. Featuring familiar notification cards, circular icons, and Facebook's signature design elements. +handler: theme.facebook +data-controller: theme-facebook +--- -## Overview +## Facebook Theme The Facebook theme replicates the familiar notification style from Facebook's interface, providing a user experience that billions of people worldwide will instantly recognize. It features Facebook's signature look and feel, including rounded cards, circular icons, and the platform's distinctive typography and color scheme. -![Facebook Theme Preview](./images/facebook-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Facebook-Style Cards**: Rounded notification cards with subtle shadows and hover effects -- **Circular Icons**: Type-specific colored icons in Facebook's style -- **Timestamp Display**: Shows the time when the notification was created -- **Interactive Elements**: Close button with hover effects -- **Facebook Typography**: Uses Facebook's font stack for authentic appearance -- **Dark Mode Support**: Complete dark mode implementation matching Facebook's dark theme -- **RTL Support**: Full right-to-left language support +The easiest way to use the Facebook theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.facebook', // Make Facebook the default theme + + 'themes' => [ + 'facebook' => [ + 'scripts' => [ + '/vendor/flasher/themes/facebook.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/facebook.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.facebook # Make Facebook the default theme + + themes: + facebook: + scripts: + - '/vendor/flasher/themes/facebook.min.js' + styles: + - '/vendor/flasher/themes/facebook.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { facebookTheme } from '@flasher/flasher/themes'; flasher.addTheme('facebook', facebookTheme); -// Use the theme -flasher.use('theme.facebook').success('Your post was published successfully'); -flasher.use('theme.facebook').error('There was a problem uploading your photo'); -flasher.use('theme.facebook').warning('Your account is approaching storage limits'); -flasher.use('theme.facebook').info('3 people reacted to your comment'); - // Set as default theme flasher.defaultPlugin = 'theme.facebook'; -// Add a timestamp to your notification -flasher.use('theme.facebook').success('Your post was published', { - timestamp: '2023-03-08 15:43:27' -}); +// Or use it for specific notifications +flasher.success('Your post was published successfully'); ``` -## Customization +## Notification Types -The Facebook theme uses CSS variables that can be customized: +Once configured, use standard PHPFlasher methods to create notifications with Facebook styling: + +{% assign successMessage = 'Your post was published successfully.' %} +{% assign errorMessage = 'There was a problem uploading your photo.' %} +{% assign warningMessage = 'Your account is approaching storage limits.' %} +{% assign infoMessage = '3 people reacted to your comment.' %} + + + +### PHP + +```php +#/ facebook types + +// With Facebook set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Facebook set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Facebook Theme for Specific Notifications + +If Facebook isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.facebook') + ->success('This notification uses Facebook theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.facebook').success('This notification uses Facebook theme.'); +``` + +### Adding a Timestamp + +You can add a timestamp to your Facebook-style notification: + +#### PHP + +```php +flash() + ->use('theme.facebook') + ->success('Your post was published successfully.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.facebook') + .success('Your post was published successfully'); +``` + +If no timestamp is provided, the current time will be used automatically. + +### Custom Colors and Appearance + +The Facebook theme uses CSS variables that can be customized to match your brand: ```css :root { @@ -49,7 +180,10 @@ The Facebook theme uses CSS variables that can be customized: --fb-bg-dark: #242526; /* Dark mode background */ --fb-text-light: #050505; /* Light mode primary text */ --fb-text-secondary-light: #65676b; /* Light mode secondary text */ + --fb-text-dark: #e4e6eb; /* Dark mode primary text */ + --fb-text-secondary-dark: #b0b3b8; /* Dark mode secondary text */ --fb-hover-light: #f0f2f5; /* Light mode hover state */ + --fb-hover-dark: #3a3b3c; /* Dark mode hover state */ /* Type colors */ --fb-success: #31a24c; /* Success color */ @@ -59,7 +193,7 @@ The Facebook theme uses CSS variables that can be customized: } ``` -## Structure +## HTML Structure The Facebook theme generates notifications with the following HTML structure: @@ -88,54 +222,36 @@ The Facebook theme generates notifications with the following HTML structure: ``` -## Configuration Options +This structure closely mimics Facebook's notification layout, including the circular icons, message content, timestamp, and close button. -### Timestamp +## Theme Features -You can customize the timestamp displayed in the notification: +### Facebook-Style Design -```typescript -flasher.use('theme.facebook').success('Your post was published', { - timestamp: '2023-03-08 15:43:27' // Format: YYYY-MM-DD HH:MM:SS -}); -``` +The Facebook theme accurately recreates Facebook's notification appearance with: -If no timestamp is provided, the current time will be used. +- Rounded notification cards with subtle shadows +- Circular colored icons for each notification type +- Timestamp display showing when the notification was created +- Interactive close button with hover effects +- Facebook's signature typography -## Accessibility Features +### Dark Mode -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +The theme automatically adapts to system dark mode preferences without additional configuration, switching to Facebook's dark theme colors for a consistent experience. + +### Accessibility Features + +The Facebook theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible - **Color Contrast**: Maintains Facebook's visual identity while ensuring readability - **Button Labels**: Close button has descriptive aria-label for screen readers -## Design Notes - -### Icons - -The theme uses SVG icons similar to those used in Facebook notifications: - -- **Success**: Checkmark circle icon -- **Info**: Information circle icon -- **Warning**: Exclamation triangle icon -- **Error**: Alert circle icon - -### Dark Mode - -The dark mode implementation follows Facebook's dark theme approach: - -- Dark background (#242526) -- Light text (#e4e6eb) -- Colored icons with dark backgrounds -- Subtle hover states - -### Animation - -The entrance animation uses a subtle slide-down with fade effect, providing a familiar experience for Facebook users who are accustomed to seeing notifications appear this way. - -## Browser Support +## Browser Support The Facebook theme is compatible with all modern browsers: @@ -144,11 +260,17 @@ The Facebook theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android -## Implementation Details +## Implementation Details -- Uses Facebook's font stack for authentic typography -- Implements Facebook's signature color palette -- Recreates Facebook's card design, shadows, and hover effects -- Uses a simplified version of Facebook's notification structure -- Includes timestamps in Facebook's time format +The Facebook theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **Facebook's Font Stack**: For authentic typography +- **SVG Icons**: For high-quality, resolution-independent icons +- **CSS Animations**: For subtle entrance effects +- **CSS Box Shadows**: For depth and dimension +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/flasher.md b/docs/pages/themes/flasher.md index b80c120e..6e51139b 100644 --- a/docs/pages/themes/flasher.md +++ b/docs/pages/themes/flasher.md @@ -1,43 +1,139 @@ -# PHPFlasher Default Theme +--- +permalink: /theme/flasher/ +title: Flasher Theme +description: Explore the default notification theme for PHPFlasher featuring a clean design with distinctive colored borders, clear type indicators, and comprehensive accessibility support. +handler: theme.flasher +data-controller: theme-flasher +--- -## Overview +## Flasher Theme The Flasher theme is the default notification theme for PHPFlasher. It provides a classic, clean design with a distinctive colored left border that visually indicates the notification type. This theme balances visual clarity with simplicity, making it suitable for a wide range of applications. -![Flasher Theme Preview](./images/flasher-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Colored Left Border**: Prominent left border that clearly indicates notification type -- **Type-Specific Icons**: Each notification type has its own distinctive icon -- **Title & Message**: Supports both a title and message text for clear communication -- **Hover Animation**: Subtle lift effect when hovering over notifications -- **Progress Bar**: Shows the time remaining before auto-dismiss -- **Slide-in Animation**: Smooth entrance animation from the left -- **Dark Mode Support**: Complete dark mode implementation with optimized colors -- **RTL Support**: Full right-to-left language support +As the default theme for PHPFlasher, the Flasher theme is automatically available without any additional configuration. However, you can explicitly set it as your default theme: -## Usage +### Laravel -The Flasher theme is available by default without requiring explicit registration: +```php + 'flasher', // Use the default Flasher theme + + // Other configuration options... +]; ``` -## Customization +### Symfony -The Flasher theme uses CSS variables that can be customized: +```yaml +# config/packages/flasher.yaml + +flasher: + default: flasher # Use the default Flasher theme + + # Other configuration options... +``` + +### JavaScript/TypeScript + +```typescript +// The Flasher theme is available by default +// You can use it directly: +flasher.success('Operation completed successfully'); + +// Or explicitly specify it: +flasher.defaultPlugin = 'flasher'; +``` + +## Notification Types + +Use standard PHPFlasher methods to create notifications with the default Flasher styling: + +{% assign successMessage = 'Operation completed successfully.' %} +{% assign errorMessage = 'An error occurred during the operation.' %} +{% assign warningMessage = 'This action cannot be undone.' %} +{% assign infoMessage = 'New updates are available.' %} + + + +### PHP + +```php +#/ flasher types + +// With Flasher as default theme +flash()->success('{{ successMessage }}', 'Success'); +flash()->error('{{ errorMessage }}', 'Error'); +flash()->warning('{{ warningMessage }}', 'Warning'); +flash()->info('{{ infoMessage }}', 'Information'); +``` + +### JavaScript + +```javascript +// With Flasher as default theme +flasher.success('{{ successMessage }}', 'Success'); +flasher.error('{{ errorMessage }}', 'Error'); +flasher.warning('{{ warningMessage }}', 'Warning'); +flasher.info('{{ infoMessage }}', 'Information'); +``` + +## Customization + +### Using Flasher Theme for Specific Notifications + +If another theme is set as your default, you can use the Flasher theme for specific notifications: + +#### PHP + +```php +flash() + ->use('flasher') + ->success('This notification uses the default Flasher theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('flasher').success('This notification uses the default Flasher theme.'); +``` + +### Custom Colors and Appearance + +The Flasher theme uses CSS variables that can be customized to match your brand: ```css :root { @@ -65,7 +161,7 @@ The Flasher theme uses CSS variables that can be customized: } ``` -## Structure +## HTML Structure The Flasher theme generates notifications with the following HTML structure: @@ -85,34 +181,19 @@ The Flasher theme generates notifications with the following HTML structure: ``` -## Animation +This structure provides a clear hierarchy with a colored left border, icon, title, message, close button, and progress bar. -The Flasher theme features two animations: +## Theme Features -1. **Entrance Animation**: A slide-in from the left with a fade-in effect: - ```css - @keyframes flasherIn { - from { - opacity: 0; - transform: translateX(-10px); - } - to { - opacity: 1; - transform: translateX(0); - } - } - ``` +### Visual Characteristics -2. **Hover Animation**: A subtle lift effect when hovering over notifications: - ```css - &:hover { - transform: translateY(-2px); - } - ``` +- **Colored Border**: Thick, colored left border that visually identifies the notification type +- **Type-Specific Icons**: Each notification type has its own distinctive icon +- **Title & Message Support**: Allows for both a title and detailed message +- **Progress Bar**: Shows the time remaining before auto-dismiss +- **Animation**: Smooth slide-in from the left with a subtle hover effect -Both animations are disabled for users who prefer reduced motion. - -## Design Philosophy +### Design Philosophy As the default theme for PHPFlasher, the Flasher theme is designed with these principles: @@ -121,24 +202,22 @@ As the default theme for PHPFlasher, the Flasher theme is designed with these pr 3. **Accessibility**: High contrast, clear typography, and semantic HTML ensure notifications are accessible 4. **Familiarity**: The design follows common notification patterns that users will find intuitive -## Visual Characteristics +### Dark Mode -- **Border**: Thick, colored left border (0.8em) that visually identifies the notification type -- **Typography**: Clear hierarchy with distinct title and message styles -- **Shadow**: Subtle shadow that gives depth without being too prominent -- **Icons**: Type-specific icons that help with quick visual identification -- **Progress Bar**: Thin progress indicator at the bottom that shows remaining time +The theme automatically adapts to system dark mode preferences without additional configuration, with optimized colors for dark backgrounds. -## Accessibility Features +### Accessibility Features -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +The Flasher theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible - **Color Contrast**: All text meets WCAG 2.1 AA color contrast standards - **RTL Support**: Full right-to-left language support with appropriately mirrored layout -## Browser Support +## Browser Support The Flasher theme is compatible with all modern browsers: @@ -147,14 +226,17 @@ The Flasher theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android -## Implementation Details +## Implementation Details -The Flasher theme is built using: +The Flasher theme uses modern web technologies: -- **SCSS Mixins**: Uses shared mixins for common functionality -- **CSS Variables**: For theme customization and consistency -- **Flexbox**: For layout structure -- **CSS Animation**: For entrance and hover effects -- **Media Queries**: For responsive design, dark mode, and reduced motion -- **CSS Transitions**: For smooth hover interactions +- **CSS Variables**: For theme customization and dark mode support +- **Flexbox Layout**: For responsive and flexible notification structure +- **CSS Animations**: For entrance and hover effects +- **Progress Bar**: Shows countdown until notification dismissal +- **Media Queries**: For responsive design, dark mode, and reduced motion support +- **SCSS Mixins**: For shared functionality across PHPFlasher themes + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/google.md b/docs/pages/themes/google.md index 3bd44f5c..e46a5971 100644 --- a/docs/pages/themes/google.md +++ b/docs/pages/themes/google.md @@ -1,44 +1,158 @@ -# PHPFlasher Google Theme +--- +permalink: /theme/google/ +title: Google Theme +description: Add Material Design-inspired notifications to your application with the Google theme for PHPFlasher. Featuring Google's card-based layout, typography, and interactive elements like ripple effects. +handler: theme.google +data-controller: theme-google +--- -## Overview +## Google Theme The Google theme provides notifications inspired by Google's Material Design system, one of the most recognized design languages worldwide. It features Google's distinctive card-based layout, typography, elevation patterns, and interactive elements like ripple effects that will be immediately familiar to users of Google products. -![Google Theme Preview](./images/google-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Material Design Cards**: Elevated cards with proper shadow depth following Material guidelines -- **Material Icons**: SVG icons following Google's Material Design iconography -- **Ripple Effect**: Interactive feedback with ripple animation on button press -- **Action Button**: DISMISS button with uppercase text following Material conventions -- **Slide-Up Animation**: Smooth entrance animation with Material motion easing -- **Material Typography**: Roboto font with Google's type scale and weights -- **Linear Progress**: Material Design progress indicator at the bottom of card -- **Dark Mode Support**: Proper implementation of Material dark theme -- **RTL Support**: Full right-to-left language support +The easiest way to use the Google theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.google', // Make Google the default theme + + 'themes' => [ + 'google' => [ + 'scripts' => [ + '/vendor/flasher/themes/google.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/google.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.google # Make Google the default theme + + themes: + google: + scripts: + - '/vendor/flasher/themes/google.min.js' + styles: + - '/vendor/flasher/themes/google.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { googleTheme } from '@flasher/flasher/themes'; flasher.addTheme('google', googleTheme); -// Use the theme -flasher.use('theme.google').success('Operation completed successfully'); -flasher.use('theme.google').error('An error occurred during the operation'); -flasher.use('theme.google').warning('This action cannot be undone'); -flasher.use('theme.google').info('New updates are available'); - -// With a title -flasher.use('theme.google').success('Your changes have been saved', 'Success'); - // Set as default theme flasher.defaultPlugin = 'theme.google'; + +// Or use it for specific notifications +flasher.success('Operation completed successfully'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Google styling: + +{% assign successMessage = 'Operation completed successfully.' %} +{% assign errorMessage = 'An error occurred during the operation.' %} +{% assign warningMessage = 'This action cannot be undone.' %} +{% assign infoMessage = 'New updates are available.' %} + + + +### PHP + +```php +#/ google types + +// With Google set as default theme +flash()->success('{{ successMessage }}', 'Success'); +flash()->error('{{ errorMessage }}', 'Error'); +flash()->warning('{{ warningMessage }}', 'Warning'); +flash()->info('{{ infoMessage }}', 'Information'); +``` + +### JavaScript + +```javascript +// With Google set as default theme +flasher.success('{{ successMessage }}', 'Success'); +flasher.error('{{ errorMessage }}', 'Error'); +flasher.warning('{{ warningMessage }}', 'Warning'); +flasher.info('{{ infoMessage }}', 'Information'); +``` + +## Customization + +### Using Google Theme for Specific Notifications + +If Google isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.google') + ->success('This notification uses Google theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.google').success('This notification uses Google theme.'); +``` + +### Custom Colors and Appearance The Google theme uses CSS variables that can be customized to match your brand while maintaining the Material Design feel: @@ -49,6 +163,8 @@ The Google theme uses CSS variables that can be customized to match your brand w --md-bg-dark: #2d2d2d; /* Dark mode background */ --md-text-light: rgba(0, 0, 0, 0.87); /* Primary text in light mode */ --md-text-secondary-light: rgba(0, 0, 0, 0.6); /* Secondary text in light mode */ + --md-text-dark: rgba(255, 255, 255, 0.87); /* Primary text in dark mode */ + --md-text-secondary-dark: rgba(255, 255, 255, 0.6); /* Secondary text in dark mode */ --md-elevation: 0 3px 5px -1px rgba(0,0,0,0.2), 0 6px 10px 0 rgba(0,0,0,0.14), 0 1px 18px 0 rgba(0,0,0,0.12); /* Card shadow */ --md-border-radius: 4px; /* Card corner radius */ @@ -64,7 +180,7 @@ The Google theme uses CSS variables that can be customized to match your brand w } ``` -## Structure +## HTML Structure The Google theme generates notifications with the following HTML structure: @@ -92,9 +208,13 @@ The Google theme generates notifications with the following HTML structure: ``` -## Material Design Elements +This structure follows Material Design principles with cards, proper typography hierarchy, and interactive elements. -### Elevation +## Theme Features + +### Material Design Elements + +#### Elevation The theme uses proper Material Design elevation with three shadow components: @@ -104,7 +224,7 @@ The theme uses proper Material Design elevation with three shadow components: This creates the characteristic Material Design "floating" effect for cards. -### Typography +#### Typography Following Material Design typography guidelines: @@ -112,7 +232,7 @@ Following Material Design typography guidelines: - **Message**: 14px (0.875rem), regular weight (400), 60% opacity for secondary text - **Button**: 13px (0.8125rem), medium weight (500), uppercase with letterSpacing -### Ripple Effect +#### Ripple Effect The theme includes Material Design's signature "ink ripple" effect: @@ -122,34 +242,7 @@ The theme includes Material Design's signature "ink ripple" effect: This provides visual feedback that enhances the tactile feeling of the interface. -## Animation Details - -### Entrance Animation - -The Google theme uses Material Design's standard motion curve (cubic-bezier(0.4, 0, 0.2, 1)) for its slide-up animation. This creates a natural-feeling motion that follows the principles of Material motion: - -- Quick acceleration from start -- Smooth deceleration to end -- Total duration of 300ms - -### Interaction Animations - -The theme includes several interaction animations: - -1. **Button Hover**: Background color transition (200ms) -2. **Button Press**: Ripple effect (600ms) -3. **Progress Bar**: Linear progress animation - -## Accessibility Features - -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables animations -- **Keyboard Access**: Action button is fully keyboard accessible -- **Color Contrast**: All text meets WCAG 2.1 AA color contrast standards -- **Text Alternatives**: Descriptive aria-labels for interactive elements - -## Dark Mode +### Dark Mode The Google theme implements Material Design's dark theme guidelines: @@ -158,17 +251,18 @@ The Google theme implements Material Design's dark theme guidelines: - Adjusted shadows for better visibility on dark backgrounds - Higher contrast for hover states (8% opacity instead of 4%) -## Font Considerations +### Accessibility Features -For the best experience, it's recommended to include the Roboto font in your project: +The Google theme includes several accessibility features: -```html - -``` +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables animations +- **Keyboard Access**: Action button is fully keyboard accessible +- **Color Contrast**: All text meets WCAG 2.1 AA color contrast standards +- **Text Alternatives**: Descriptive aria-labels for interactive elements -If Roboto is not available, the theme falls back to system fonts while maintaining the Material Design aesthetic as much as possible. - -## Browser Support +## Browser Support The Google theme is compatible with all modern browsers: @@ -177,5 +271,26 @@ The Google theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android The ripple effect and other animations may have slightly different appearances across browsers, but the core functionality works everywhere. + +## Implementation Details + +The Google theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **Material Design Elevation**: Proper shadow implementation for depth +- **Ripple Animation**: For tactile button feedback +- **CSS Animations**: With Material Design easing curves +- **Linear Progress**: For countdown visualization +- **Roboto Font**: Falls back to system fonts if unavailable +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. + +For the best experience, it's recommended to include the Roboto font in your project: + +```html + +``` diff --git a/docs/pages/themes/ios.md b/docs/pages/themes/ios.md index 296b446c..fed52e8f 100644 --- a/docs/pages/themes/ios.md +++ b/docs/pages/themes/ios.md @@ -1,43 +1,158 @@ -# PHPFlasher iOS Theme +--- +permalink: /theme/ios/ +title: iOS Theme +description: Add Apple iOS-style notifications to your application with the iOS theme for PHPFlasher. Featuring frosted glass effects, app icons, and animations that mimic native iOS notifications. +handler: theme.ios +data-controller: theme-ios +--- -## Overview +## iOS Theme The iOS theme provides notifications styled after Apple's iOS notification system, creating a familiar experience for users of iPhones and iPads. It features Apple's distinctive frosted glass effect, app icon style, and subtle animations that mimic native iOS notifications. -![iOS Theme Preview](./images/ios-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Frosted Glass Effect**: Semi-transparent background with backdrop blur -- **App Icon**: Type-specific colored app icon with white symbol -- **iOS Typography**: Apple's San Francisco font (with system fallbacks) -- **Current Time**: Real-time timestamp in iOS format -- **Smooth Animations**: iOS-like entrance and content expansion animations -- **iOS-Style Close Button**: Small circular button in the top right -- **Dark Mode Support**: Proper implementation of iOS dark appearance -- **RTL Support**: Full right-to-left language support +The easiest way to use the iOS theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.ios', // Make iOS the default theme + + 'themes' => [ + 'ios' => [ + 'scripts' => [ + '/vendor/flasher/themes/ios.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/ios.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.ios # Make iOS the default theme + + themes: + ios: + scripts: + - '/vendor/flasher/themes/ios.min.js' + styles: + - '/vendor/flasher/themes/ios.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { iosTheme } from '@flasher/flasher/themes'; flasher.addTheme('ios', iosTheme); -// Use the theme -flasher.use('theme.ios').success('Your photo was uploaded successfully'); -flasher.use('theme.ios').error('Unable to connect to server'); -flasher.use('theme.ios').warning('Low storage space on your device'); -flasher.use('theme.ios').info('New software update available'); - -// With a custom app name (title) -flasher.use('theme.ios').success('Message sent', 'Messages'); - // Set as default theme flasher.defaultPlugin = 'theme.ios'; + +// Or use it for specific notifications +flasher.success('Your photo was uploaded successfully'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with iOS styling: + +{% assign successMessage = 'Your photo was uploaded successfully.' %} +{% assign errorMessage = 'Unable to connect to server.' %} +{% assign warningMessage = 'Low storage space on your device.' %} +{% assign infoMessage = 'New software update available.' %} + + + +### PHP + +```php +#/ ios types + +// With iOS set as default theme +flash()->success('{{ successMessage }}', 'Photos'); +flash()->error('{{ errorMessage }}', 'Settings'); +flash()->warning('{{ warningMessage }}', 'Storage'); +flash()->info('{{ infoMessage }}', 'App Store'); +``` + +### JavaScript + +```javascript +// With iOS set as default theme +flasher.success('{{ successMessage }}', 'Photos'); +flasher.error('{{ errorMessage }}', 'Settings'); +flasher.warning('{{ warningMessage }}', 'Storage'); +flasher.info('{{ infoMessage }}', 'App Store'); +``` + +## Customization + +### Using iOS Theme for Specific Notifications + +If iOS isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.ios') + ->success('This notification uses iOS theme.', 'Photos'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.ios').success('This notification uses iOS theme.', 'Photos'); +``` + +### Custom Colors and Appearance The iOS theme uses CSS variables that can be customized to match your brand while maintaining the iOS look: @@ -48,6 +163,8 @@ The iOS theme uses CSS variables that can be customized to match your brand whil --ios-bg-dark: rgba(30, 30, 30, 0.85); /* Dark mode background */ --ios-text-light: #000000; /* Light mode text */ --ios-text-secondary-light: #6e6e6e; /* Light mode secondary text */ + --ios-text-dark: #ffffff; /* Dark mode text */ + --ios-text-secondary-dark: #a0a0a0; /* Dark mode secondary text */ --ios-border-radius: 13px; /* Corner radius */ --ios-blur: 30px; /* Backdrop blur amount */ @@ -59,7 +176,7 @@ The iOS theme uses CSS variables that can be customized to match your brand whil } ``` -## Structure +## HTML Structure The iOS theme generates notifications with the following HTML structure: @@ -72,7 +189,7 @@ The iOS theme generates notifications with the following HTML structure:
    App Name/Title
    -
    Current time
    +
    2025-03-10 00:14:11
    @@ -85,94 +202,56 @@ The iOS theme generates notifications with the following HTML structure:
    ``` -## Animation Details +This structure mimics the iOS notification layout, including the app icon, app name, current time, and message content. -The iOS theme features two carefully crafted animations that work together to create a smooth, iOS-like appearance: +## Theme Features -### Entrance Animation +### iOS-Specific Design Elements -The main notification slides in from above with a subtle scaling effect: - -```css -@keyframes iosSlideIn { - 0% { - opacity: 0; - transform: translateY(-15px) scale(0.96); - } - 100% { - opacity: 1; - transform: translateY(0) scale(1); - } -} -``` - -This animation uses a custom easing curve (cubic-bezier(0.23, 1, 0.32, 1)) which mimics the iOS animation style with a quick start and gentle end. - -### Content Expansion Animation - -After the notification appears, the content area expands with a slight delay: - -```css -@keyframes iosExpand { - 0% { - max-height: 0; - opacity: 0; - } - 100% { - max-height: 100px; - opacity: 1; - } -} -``` - -This creates a subtle two-step effect where the header appears first, followed by the message content—similar to how iOS reveals notification content. - -## iOS-Specific Design Elements - -### Frosted Glass Effect +#### Frosted Glass Effect The iOS theme uses `backdrop-filter: blur()` to create Apple's signature frosted glass effect. This creates a semi-transparent background that blurs content behind the notification. -### App Icon +#### App Icon The app icon follows iOS design principles: - Square with slightly rounded corners (5px radius) - Colored background based on notification type - White icon centered within the square -### Typography +#### Real-Time Timestamp -The theme uses Apple's system font stack: -- San Francisco on Apple devices -- Appropriate fallbacks for other platforms -- Font weights and sizes that match iOS notifications +The theme automatically displays the current time in the iOS format (HH:MM), just like native iOS notifications. -### Close Button +#### Smooth Animations -The close button mimics iOS UI elements: -- Small circular button (18px diameter) -- Semi-transparent background -- Simple "×" symbol -- Subtle hover effect +The iOS theme features two carefully crafted animations: -## Dark Mode +1. **Entrance Animation**: Slides in from above with a subtle scaling effect +2. **Content Expansion**: The content area expands with a slight delay after the header appears -The iOS theme implements Apple's dark mode approach: +These animations mimic the iOS notification animation style with a quick start and gentle end. + +### Dark Mode + +The theme automatically adapts to system dark mode preferences, switching to the iOS dark appearance: - Dark semi-transparent background - Light text - Adjusted shadows for better visibility - Lighter close button background -## Accessibility Features +### Accessibility Features -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables animations +The iOS theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables animations - **Keyboard Access**: Close button is fully keyboard accessible - **Color Contrast**: Maintains proper contrast ratios in both light and dark modes - **Mobile Optimization**: Responsive design that adjusts for small screens -## Browser Support +## Browser Support The iOS theme is compatible with all modern browsers: @@ -181,12 +260,21 @@ The iOS theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android For browsers that don't support backdrop-filter, the theme gracefully degrades to using just the semi-transparent background without blur. -## Implementation Notes +## Implementation Details -- The theme automatically displays the current time in a format similar to iOS notifications -- The title parameter is used as the "app name" in the notification -- If no title is provided, it defaults to "PHPFlasher" -- The theme does not include a progress bar, matching iOS's notification style +The iOS theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **Backdrop Filter**: For the frosted glass effect +- **CSS Animations**: For entrance and content expansion effects +- **San Francisco Font**: Uses Apple's system font stack with appropriate fallbacks +- **Real-Time Timestamps**: Automatically displays current time in iOS format +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. + +**Note:** The title parameter is used as the "app name" in the notification. If no title is provided, it defaults to "PHPFlasher". diff --git a/docs/pages/themes/jade.md b/docs/pages/themes/jade.md index 5f3e5920..8a07a26e 100644 --- a/docs/pages/themes/jade.md +++ b/docs/pages/themes/jade.md @@ -1,41 +1,154 @@ -# PHPFlasher Jade Theme +--- +permalink: /theme/jade/ +title: Jade Theme +description: Enhance your notifications with the calm, minimalist Jade theme for PHPFlasher. Featuring soft colors, rounded corners, and subtle animations for a soothing user experience. +handler: theme.jade +data-controller: theme-jade +--- -## Overview +## Jade Theme The Jade theme provides a calm, minimalist notification style with soft colors and subtle animations. It features a clean design that emphasizes message content through generous padding, rounded corners, and type-specific color schemes. The theme takes its name from the natural, soothing quality of its appearance. -![Jade Theme Preview](./images/jade-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Minimalist Design**: Clean layout without icons for a streamlined appearance -- **Soft Color Palette**: Gentle, pastel backgrounds with contrasting text colors -- **Rounded Corners**: Large border radius (1rem) for a friendly, approachable feel -- **Subtle Animation**: Combined scaling and movement for an elegant entrance -- **Type-Specific Styling**: Each notification type has its own color scheme -- **Refined Interactions**: Thoughtful hover effects and transitions -- **Progress Indicator**: Subtle progress bar showing time remaining -- **Dark Mode Support**: Complete dark mode implementation with adjusted colors -- **RTL Support**: Full right-to-left language support +The easiest way to use the Jade theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.jade', // Make Jade the default theme + + 'themes' => [ + 'jade' => [ + 'scripts' => [ + '/vendor/flasher/themes/jade.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/jade.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.jade # Make Jade the default theme + + themes: + jade: + scripts: + - '/vendor/flasher/themes/jade.min.js' + styles: + - '/vendor/flasher/themes/jade.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { jadeTheme } from '@flasher/flasher/themes'; flasher.addTheme('jade', jadeTheme); -// Use the theme -flasher.use('theme.jade').success('Your changes have been saved'); -flasher.use('theme.jade').error('An error occurred while saving changes'); -flasher.use('theme.jade').warning('Your session will expire in 5 minutes'); -flasher.use('theme.jade').info('New features have been added'); - // Set as default theme flasher.defaultPlugin = 'theme.jade'; + +// Or use it for specific notifications +flasher.success('Your changes have been saved'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Jade styling: + +{% assign successMessage = 'Your changes have been saved successfully.' %} +{% assign errorMessage = 'An error occurred while saving your changes.' %} +{% assign warningMessage = 'Your session will expire in 5 minutes.' %} +{% assign infoMessage = 'New features have been added to your dashboard.' %} + + + +### PHP + +```php +#/ jade types + +// With Jade set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Jade set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Jade Theme for Specific Notifications + +If Jade isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.jade') + ->success('This notification uses Jade theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.jade').success('This notification uses Jade theme.'); +``` + +### Custom Colors and Appearance The Jade theme uses CSS variables that can be customized to match your brand while maintaining its calm aesthetic: @@ -64,7 +177,7 @@ The Jade theme uses CSS variables that can be customized to match your brand whi } ``` -## Structure +## HTML Structure The Jade theme generates notifications with the following HTML structure: @@ -80,31 +193,11 @@ The Jade theme generates notifications with the following HTML structure: ``` -## Animation +This minimalist structure focuses on content by omitting icons and unnecessary UI elements for a cleaner, more elegant look. -The Jade theme features a refined entrance animation that combines two effects: +## Theme Features -```css -@keyframes jadeIn { - 0% { - opacity: 0; - transform: translateY(-10px) scale(0.95); - } - 100% { - opacity: 1; - transform: translateY(0) scale(1); - } -} -``` - -This animation creates a subtle effect where notifications: -1. Fade in from invisible to fully visible -2. Move upward slightly from their final position -3. Scale from 95% to 100% of their final size - -The combination of these effects creates a more organic, refined entrance than simple fades or slides. The animation uses a carefully tuned easing curve (`cubic-bezier(0.4, 0, 0.2, 1)`) for a natural feel. - -## Design Philosophy +### Design Philosophy The Jade theme embodies several design principles: @@ -114,7 +207,7 @@ The Jade theme embodies several design principles: 4. **Refinement**: Thoughtful attention to details like animation timing and hover states 5. **Consistency**: Each notification type follows the same pattern with its own color scheme -## Color System +### Color System The Jade theme uses a dual-color system for each notification type: @@ -123,27 +216,38 @@ The Jade theme uses a dual-color system for each notification type: This approach maintains excellent readability while providing clear visual differentiation between notification types. -## Dark Mode +### Animation -In dark mode, the theme switches to semi-transparent colored backgrounds that create a subtle glow effect: +The Jade theme features a refined entrance animation that combines scaling and movement: + +- Notifications fade in from invisible to fully visible +- They move upward slightly from their initial position +- They scale from 95% to 100% of their final size + +This combination creates a more organic, refined entrance than simple fades or slides, using a carefully tuned easing curve for a natural feel. + +### Dark Mode + +The theme automatically adapts to system dark mode preferences, with semi-transparent colored backgrounds that create a subtle glow effect: - Base text becomes lighter (#e2e8f0) - Backgrounds use semi-transparent colored overlays (15% opacity) -- Borders become slightly more visible (20% opacity instead of 10%) - Hover states use white instead of black (10% white opacity) This creates a cohesive dark appearance that maintains the theme's calm aesthetic. -## Accessibility Features +### Accessibility Features -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +The Jade theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible with visual feedback - **Color Contrast**: All text meets WCAG 2.1 AA color contrast standards - **Button Labeling**: Close button has descriptive aria-label for screen readers -## Browser Support +## Browser Support The Jade theme is compatible with all modern browsers: @@ -152,3 +256,16 @@ The Jade theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android + +## Implementation Details + +The Jade theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **CSS Animations**: For refined entrance effects +- **CSS Transitions**: For smooth hover interactions +- **Progress Bar**: Shows countdown until notification dismissal +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/material.md b/docs/pages/themes/material.md index c78b6c64..39f81435 100644 --- a/docs/pages/themes/material.md +++ b/docs/pages/themes/material.md @@ -1,41 +1,154 @@ -# PHPFlasher Material Theme +--- +permalink: /theme/material/ +title: Material Theme +description: Add minimalist Material Design notifications to your application with the Material theme for PHPFlasher. Featuring clean cards, proper elevation, and interactive elements following Material guidelines. +handler: theme.material +data-controller: theme-material +--- -## Overview +## Material Theme The Material theme provides a minimalist implementation of Google's Material Design system for notifications. It features clean cards with proper elevation, Material Design typography, and interactive elements that follow Material guidelines, all without unnecessary visual elements to maintain focus on the message content. -![Material Theme Preview](./images/material-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Material Design Card**: Clean, elevated card with proper shadow depth -- **Minimalist Approach**: No icons or extraneous elements for a focused experience -- **Material Typography**: Roboto font with proper text hierarchy and opacity -- **Action Button**: DISMISS button with uppercase text following Material conventions -- **Ripple Effect**: Interactive feedback with ripple animation on button press -- **Slide-Up Animation**: Smooth entrance animation with Material motion easing -- **Linear Progress**: Material Design progress indicator at the bottom -- **Dark Mode Support**: Proper implementation of Material dark theme -- **RTL Support**: Full right-to-left language support +The easiest way to use the Material theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.material', // Make Material the default theme + + 'themes' => [ + 'material' => [ + 'scripts' => [ + '/vendor/flasher/themes/material.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/material.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.material # Make Material the default theme + + themes: + material: + scripts: + - '/vendor/flasher/themes/material.min.js' + styles: + - '/vendor/flasher/themes/material.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { materialTheme } from '@flasher/flasher/themes'; flasher.addTheme('material', materialTheme); -// Use the theme -flasher.use('theme.material').success('Operation completed successfully'); -flasher.use('theme.material').error('An error occurred during the operation'); -flasher.use('theme.material').warning('This action cannot be undone'); -flasher.use('theme.material').info('New updates are available'); - // Set as default theme flasher.defaultPlugin = 'theme.material'; + +// Or use it for specific notifications +flasher.success('Operation completed successfully'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Material styling: + +{% assign successMessage = 'Operation completed successfully.' %} +{% assign errorMessage = 'An error occurred during the operation.' %} +{% assign warningMessage = 'This action cannot be undone.' %} +{% assign infoMessage = 'New updates are available.' %} + + + +### PHP + +```php +#/ material types + +// With Material set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Material set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Material Theme for Specific Notifications + +If Material isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.material') + ->success('This notification uses Material theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.material').success('This notification uses Material theme.'); +``` + +### Custom Colors and Appearance The Material theme uses CSS variables that can be customized to match your brand while maintaining the Material Design feel: @@ -46,6 +159,8 @@ The Material theme uses CSS variables that can be customized to match your brand --md-bg-dark: #2d2d2d; /* Dark mode background */ --md-text-light: rgba(0, 0, 0, 0.87); /* Primary text in light mode */ --md-text-secondary-light: rgba(0, 0, 0, 0.6); /* Secondary text in light mode */ + --md-text-dark: rgba(255, 255, 255, 0.87); /* Primary text in dark mode */ + --md-text-secondary-dark: rgba(255, 255, 255, 0.6); /* Secondary text in dark mode */ --md-elevation: 0 3px 5px -1px rgba(0,0,0,0.2), 0 6px 10px 0 rgba(0,0,0,0.14), 0 1px 18px 0 rgba(0,0,0,0.12); /* Card shadow */ --md-border-radius: 4px; /* Card corner radius */ @@ -61,7 +176,7 @@ The Material theme uses CSS variables that can be customized to match your brand } ``` -## Structure +## HTML Structure The Material theme generates notifications with the following HTML structure: @@ -85,9 +200,13 @@ The Material theme generates notifications with the following HTML structure: ``` -## Material Design Elements +This minimalist structure focuses on content by omitting unnecessary UI elements for a cleaner appearance. -### Elevation +## Theme Features + +### Material Design Elements + +#### Elevation The theme uses proper Material Design elevation with three shadow components: @@ -97,14 +216,14 @@ The theme uses proper Material Design elevation with three shadow components: This creates the characteristic Material Design "floating" effect for cards. -### Typography +#### Typography Following Material Design typography guidelines: - **Message**: 14px (0.875rem), regular weight (400), 60% opacity for secondary text - **Button**: 13px (0.8125rem), medium weight (500), uppercase with letterSpacing -### Ripple Effect +#### Ripple Effect The theme includes Material Design's signature "ink ripple" effect: @@ -114,9 +233,7 @@ The theme includes Material Design's signature "ink ripple" effect: This provides visual feedback that enhances the tactile feeling of the interface. -## Animation Details - -### Entrance Animation +### Animation Details The Material theme uses Material Design's standard motion curve (cubic-bezier(0.4, 0, 0.2, 1)) for its slide-up animation. This creates a natural-feeling motion that follows the principles of Material motion: @@ -124,15 +241,13 @@ The Material theme uses Material Design's standard motion curve (cubic-bezier(0. - Smooth deceleration to end - Total duration of 300ms -### Interaction Animations - -The theme includes several interaction animations: +The theme also includes several interaction animations: 1. **Button Hover**: Background color transition (200ms) 2. **Button Press**: Ripple effect (600ms) 3. **Progress Bar**: Linear progress animation -## Differences from Google Theme +### Differences from Google Theme While both the Material theme and Google theme follow Material Design guidelines, they differ in these key ways: @@ -140,16 +255,7 @@ While both the Material theme and Google theme follow Material Design guidelines 2. **Focus on Content**: With fewer visual elements, more focus is placed on the message text 3. **Simplified Structure**: The HTML structure is more straightforward without icon containers -## Accessibility Features - -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables animations -- **Keyboard Access**: Action button is fully keyboard accessible -- **Color Contrast**: All text meets WCAG 2.1 AA color contrast standards -- **Text Alternatives**: Descriptive aria-labels for interactive elements - -## Dark Mode +### Dark Mode The Material theme implements Material Design's dark theme guidelines: @@ -158,17 +264,18 @@ The Material theme implements Material Design's dark theme guidelines: - Adjusted shadows for better visibility on dark backgrounds - Higher contrast for hover states (8% opacity instead of 4%) -## Font Considerations +### Accessibility Features -For the best experience, it's recommended to include the Roboto font in your project: +The Material theme includes several accessibility features: -```html - -``` +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables animations +- **Keyboard Access**: Action button is fully keyboard accessible +- **Color Contrast**: All text meets WCAG 2.1 AA color contrast standards +- **Text Alternatives**: Descriptive aria-labels for interactive elements -If Roboto is not available, the theme falls back to system fonts while maintaining the Material Design aesthetic as much as possible. - -## Browser Support +## Browser Support The Material theme is compatible with all modern browsers: @@ -177,5 +284,25 @@ The Material theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android The ripple effect and other animations may have slightly different appearances across browsers, but the core functionality works everywhere. + +## Implementation Details + +The Material theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **Material Design Elevation**: Proper shadow implementation for depth +- **Ripple Animation**: For tactile button feedback +- **CSS Animations**: With Material Design easing curves +- **Linear Progress**: For countdown visualization +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. + +For the best experience, it's recommended to include the Roboto font in your project: + +```html + +``` diff --git a/docs/pages/themes/minimal.md b/docs/pages/themes/minimal.md index 50aea019..0ba76445 100644 --- a/docs/pages/themes/minimal.md +++ b/docs/pages/themes/minimal.md @@ -1,44 +1,156 @@ -# PHPFlasher Minimal Theme +--- +permalink: /theme/minimal/ +title: Minimal Theme +description: Enhance your application with ultra-clean, distraction-free notifications using the Minimal theme for PHPFlasher. Featuring a translucent design with subtle styling for unobtrusive messaging. +handler: theme.minimal +data-controller: theme-minimal +--- -## Overview +## Minimal Theme The Minimal theme provides an ultra-clean, distraction-free notification design that prioritizes simplicity and unobtrusiveness. With its compact dimensions, subtle visual styling, and reduced visual elements, this theme is perfect for applications where notifications should provide information without competing for attention with the main interface. -![Minimal Theme Preview](./images/minimal-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Ultra-Clean Design**: Stripped down to only essential elements -- **Translucent Background**: Semi-transparent with subtle backdrop blur -- **Compact Size**: Smaller footprint with comfortable spacing -- **Small Dot Indicator**: Uses a small colored dot instead of large icons -- **System Fonts**: Uses the system font stack for optimal readability -- **Thin Progress Bar**: Nearly invisible 2px progress indicator -- **Quick Animation**: Brief, subtle entrance animation -- **Minimal Shadows**: Very light shadows for just a hint of depth -- **Dark Mode Support**: Refined dark appearance with adjusted opacity -- **RTL Support**: Full right-to-left language support +The easiest way to use the Minimal theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.minimal', // Make Minimal the default theme + + 'themes' => [ + 'minimal' => [ + 'scripts' => [ + '/vendor/flasher/themes/minimal.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/minimal.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.minimal # Make Minimal the default theme + + themes: + minimal: + scripts: + - '/vendor/flasher/themes/minimal.min.js' + styles: + - '/vendor/flasher/themes/minimal.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { minimalTheme } from '@flasher/flasher/themes'; flasher.addTheme('minimal', minimalTheme); -// Use the theme -flasher.use('theme.minimal').success('Changes saved'); -flasher.use('theme.minimal').error('Connection lost'); -flasher.use('theme.minimal').warning('Low disk space'); -flasher.use('theme.minimal').info('Updates available'); - // Set as default theme flasher.defaultPlugin = 'theme.minimal'; + +// Or use it for specific notifications +flasher.success('Changes saved'); ``` -## Customization +## Notification Types -The Minimal theme uses CSS variables that can be customized: +Once configured, use standard PHPFlasher methods to create notifications with Minimal styling: + +{% assign successMessage = 'Changes saved.' %} +{% assign errorMessage = 'Connection lost.' %} +{% assign warningMessage = 'Low disk space.' %} +{% assign infoMessage = 'Updates available.' %} + + + +### PHP + +```php +#/ minimal types + +// With Minimal set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Minimal set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Minimal Theme for Specific Notifications + +If Minimal isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.minimal') + ->success('This notification uses Minimal theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.minimal').success('This notification uses Minimal theme.'); +``` + +### Custom Colors and Appearance + +The Minimal theme uses CSS variables that can be customized to match your brand: ```css :root { @@ -54,16 +166,21 @@ The Minimal theme uses CSS variables that can be customized: --minimal-info: rgba(14, 165, 233, 0.9); /* Info color */ --minimal-warning: rgba(245, 158, 11, 0.9); /* Warning color */ --minimal-error: rgba(239, 68, 68, 0.9); /* Error color */ + + /* Additional customization */ + --minimal-blur: 8px; /* Backdrop blur amount */ + --minimal-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); /* Shadow */ } ``` -## Structure +## HTML Structure The Minimal theme generates notifications with the following HTML structure: ```html
    +
    Message text
    @@ -73,9 +190,11 @@ The Minimal theme generates notifications with the following HTML structure:
    ``` -Note: The HTML includes the class `fl-dot`, but this element is not present in the rendered structure (this appears to be a small inconsistency in the theme). +This structure is deliberately minimalist, with just a small colored dot to indicate notification type and a thin progress bar at the bottom. -## Design Philosophy +## Theme Features + +### Design Philosophy The Minimal theme embodies several key design principles: @@ -87,75 +206,65 @@ The Minimal theme embodies several key design principles: The theme deliberately avoids large icons, bold colors, or pronounced animations that might distract users from their primary tasks. The small colored dot provides just enough visual indication of the notification type without overwhelming the interface. -## Visual Characteristics +### Visual Characteristics -### Frosted Glass Effect +#### Frosted Glass Effect The theme uses a semi-transparent background (80% opacity) with an 8px backdrop blur, creating a subtle "frosted glass" effect that lets the underlying content partially show through. -### System Font Stack +#### System Font Stack -```css -font-family: -apple-system, BlinkMacSystemFont, var(--fl-font), sans-serif; -``` +The theme uses the system UI font of the user's device (San Francisco on Apple devices, Segoe UI on Windows, etc.), ensuring that notifications look native to the platform. -This stack uses the system UI font of the user's device (San Francisco on Apple devices, Segoe UI on Windows, etc.), ensuring that notifications look native to the platform. - -### Size and Space +#### Compact Size and Spacing - **Max Width**: 320px - **Padding**: 0.75rem 1rem (12px 16px at default font size) - **Text Size**: 0.875rem (14px at default font size) - **Dot Size**: 8px diameter -### Animation +#### Quick Animation -The entrance animation is intentionally brief (0.2s) and subtle: +The entrance animation is intentionally brief (0.2s) and subtle, with just a small movement from above and fade-in effect. -```css -@keyframes minimalIn { - from { - opacity: 0; - transform: translateY(-8px); - } - to { - opacity: 1; - transform: translateY(0); - } -} -``` +### Dark Mode -## Accessibility Features +The theme automatically adapts to system dark mode preferences, with a dark semi-transparent background and light text that maintains the minimal aesthetic while ensuring readability. -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query +### Accessibility Features + +The Minimal theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query - **Keyboard Access**: Close button is fully keyboard accessible - **Color Indications**: Uses color dots to indicate type without relying solely on color - **System Fonts**: Improved readability through native font rendering - **Adequate Contrast**: Maintains good contrast ratio between text and background -## Dark Mode +## Browser Support -The dark mode implementation maintains the minimal aesthetic while ensuring readability: +The Minimal theme is compatible with all modern browsers: -- Dark semi-transparent background (rgba(25, 25, 25, 0.8)) -- Light text color (#f5f5f5) -- Slightly stronger shadows -- Subtle white border (10% opacity) +- Chrome (latest) +- Firefox (latest) - falls back gracefully to semi-transparent background without blur +- Safari (latest) +- Edge (latest) +- Opera (latest) +- Mobile browsers on iOS and Android -The colors of the dot indicators remain the same in both light and dark modes to maintain consistency. +## Implementation Details -## Browser Compatibility +The Minimal theme uses modern web technologies: -The Minimal theme is compatible with all modern browsers. For the backdrop blur effect: -- Full support: Chrome 76+, Safari 9+, Edge 17+ -- No backdrop blur: Firefox (falls back gracefully to semi-transparent background) +- **CSS Variables**: For theme customization and dark mode support +- **Backdrop Filter**: For the subtle frosted glass effect +- **System Font Stack**: For optimal readability with native fonts +- **CSS Transitions**: For subtle hover effects +- **CSS Animations**: For quick, minimal entrance animation +- **Performance Optimization**: Uses `will-change: transform, opacity` for smooth animations +- **Media Queries**: For responsive design, dark mode, and reduced motion support -## Performance Considerations +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times and minimal impact on application performance. -The theme is designed for optimal performance: -- Uses `will-change: transform, opacity` to optimize animations -- Minimal DOM structure reduces rendering complexity -- Short animations minimize computation -- No complex gradients or heavy visual effects diff --git a/docs/pages/themes/neon.md b/docs/pages/themes/neon.md index 3e8a6244..f6869c49 100644 --- a/docs/pages/themes/neon.md +++ b/docs/pages/themes/neon.md @@ -1,41 +1,154 @@ -# PHPFlasher Neon Theme +--- +permalink: /theme/neon/ +title: Neon Theme +description: Add elegant notifications with subtle glowing accents to your application using the Neon theme for PHPFlasher. Featuring frosted glass backgrounds, floating illuminated indicators, and refined typography. +handler: theme.neon +data-controller: theme-neon +--- -## Overview +## Neon Theme The Neon theme provides elegant notifications with subtle glowing accents that evoke the gentle illumination of neon lights. It features a frosted glass background, floating illuminated indicators, and refined typography that come together to create a modern, sophisticated appearance. -![Neon Theme Preview](./images/neon-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Subtle Glow Effects**: Gentle illumination based on notification type -- **Floating Indicator**: Colored dot that appears to float above the notification -- **Frosted Glass**: Semi-transparent background with backdrop blur -- **Elegant Typography**: Clean, refined text using Inter font -- **Pulsing Animation**: Subtle "breathing" effect on the glowing indicator -- **Entrance Animation**: Smooth appearance with combined movement and blur transitions -- **Progress Indicator**: Colored bar showing time remaining -- **Dark Mode Support**: Enhanced dark appearance that preserves glow effects -- **RTL Support**: Full right-to-left language support +The easiest way to use the Neon theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.neon', // Make Neon the default theme + + 'themes' => [ + 'neon' => [ + 'scripts' => [ + '/vendor/flasher/themes/neon.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/neon.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.neon # Make Neon the default theme + + themes: + neon: + scripts: + - '/vendor/flasher/themes/neon.min.js' + styles: + - '/vendor/flasher/themes/neon.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { neonTheme } from '@flasher/flasher/themes'; flasher.addTheme('neon', neonTheme); -// Use the theme -flasher.use('theme.neon').success('Your changes have been saved'); -flasher.use('theme.neon').error('There was a problem saving your changes'); -flasher.use('theme.neon').warning('This action cannot be undone'); -flasher.use('theme.neon').info('New features are available'); - // Set as default theme flasher.defaultPlugin = 'theme.neon'; + +// Or use it for specific notifications +flasher.success('Your changes have been saved'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Neon styling: + +{% assign successMessage = 'Your changes have been saved successfully.' %} +{% assign errorMessage = 'There was a problem saving your changes.' %} +{% assign warningMessage = 'This action cannot be undone.' %} +{% assign infoMessage = 'New features are available.' %} + + + +### PHP + +```php +#/ neon types + +// With Neon set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Neon set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Neon Theme for Specific Notifications + +If Neon isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.neon') + ->success('This notification uses Neon theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.neon').success('This notification uses Neon theme.'); +``` + +### Custom Colors and Appearance The Neon theme uses CSS variables that can be customized to match your brand: @@ -56,10 +169,11 @@ The Neon theme uses CSS variables that can be customized to match your brand: /* Glow properties */ --neon-glow-strength: 10px; /* How far the glow extends */ + --neon-blur: 10px; /* Backdrop blur amount */ } ``` -## Structure +## HTML Structure The Neon theme generates notifications with the following HTML structure: @@ -75,81 +189,41 @@ The Neon theme generates notifications with the following HTML structure: ``` -The `fl-icon-box` element is created using CSS pseudo-elements rather than being part of the HTML structure. +The floating illuminated indicator is created using CSS pseudo-elements rather than being part of the HTML structure. -## Animation Details +## Theme Features -The Neon theme features two distinctive animations: +### Floating Illuminated Indicator -### Entrance Animation - -```css -@keyframes neonEntrance { - 0% { - opacity: 0; - transform: translateY(-15px); - filter: blur(3px); - } - 100% { - opacity: 1; - transform: translateY(0); - filter: blur(0); - } -} -``` - -This combined animation creates a refined entrance where notifications: -1. Fade in from invisible to fully visible -2. Move downward slightly from above -3. Transition from a blurred state to sharp focus - -### Glow Animation - -```css -@keyframes neonGlow { - 0%, 100% { - filter: drop-shadow(0 0 var(--neon-glow-strength) currentColor); - } - 50% { - filter: drop-shadow(0 0 calc(var(--neon-glow-strength) * 0.7) currentColor); - } -} -``` - -This creates a subtle "breathing" effect where the glow gently pulses, becoming slightly dimmer in the middle of the animation cycle before returning to full brightness. - -## Floating Indicator Design - -The floating illuminated indicator is created using a combination of elements: +The Neon theme features a distinctive floating indicator that appears to hover above the notification with a subtle glow: 1. **Container**: Positioned above the notification's top edge -2. **Glow**: Applied using a filter drop-shadow with the type's color +2. **Glow**: Applied using a filter drop-shadow with the notification type's color 3. **Background**: Semi-transparent circle created with ::before pseudo-element 4. **Center dot**: Solid-colored small dot created with ::after pseudo-element This layering creates the illusion of a floating, glowing dot that serves as a visual indicator of the notification type. -## Frosted Glass Effect +### Animation Effects -The theme uses a semi-transparent background combined with backdrop-filter to create a frosted glass effect: +The Neon theme features two distinctive animations: -```css -backdrop-filter: blur(10px); --webkit-backdrop-filter: blur(10px); -``` +#### Entrance Animation -This creates a modern, sophisticated appearance where the notification appears to float above the page with a subtle blur applied to content behind it. +A combined animation creates a refined entrance where notifications: +1. Fade in from invisible to fully visible +2. Move downward slightly from above +3. Transition from a blurred state to sharp focus -## Typography +#### Glow Animation -The Neon theme prioritizes elegant typography: +A subtle "breathing" effect where the glow gently pulses, becoming slightly dimmer in the middle of the animation cycle before returning to full brightness. -- Uses the Inter font (with fallbacks) for a clean, modern look -- Medium font weight (500) for better readability without being too heavy -- Comfortable line height (1.5) for easy scanning -- Slightly larger than standard text size (15px) for better visibility +### Frosted Glass Effect -## Dark Mode +The theme uses a semi-transparent background combined with backdrop-filter to create a frosted glass effect that gives notifications a modern, sophisticated appearance where they appear to float above the page with a subtle blur applied to content behind them. + +### Dark Mode The dark mode implementation maintains the glowing aesthetic while adjusting for low-light environments: @@ -160,16 +234,18 @@ The dark mode implementation maintains the glowing aesthetic while adjusting for The glowing colors remain consistent between light and dark modes to maintain brand color recognition. -## Accessibility Features +### Accessibility Features -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables both entrance and glow animations +The Neon theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables both entrance and glow animations - **Keyboard Access**: Close button is fully keyboard accessible with visual feedback - **Color Contrast**: Maintains sufficient contrast ratio between text and background - **Visual Indicators**: Uses both color and position to signal notification type -## Browser Support +## Browser Support The Neon theme is compatible with all modern browsers: @@ -178,15 +254,26 @@ The Neon theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android For browsers that don't support backdrop-filter (like Firefox), the theme gracefully degrades to using just the semi-transparent background without the blur effect. -## Font Considerations +## Implementation Details + +The Neon theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **CSS Pseudo-elements**: For creating the floating indicator without extra HTML +- **Backdrop Filter**: For the frosted glass effect +- **Filter Effects**: For creating the glowing appearance +- **CSS Animations**: For entrance and glow pulsing effects +- **Typography**: Uses Inter font (with fallbacks) for a clean, modern look +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. For the best experience with the Neon theme, it's recommended to include the Inter font in your project: ```html ``` - -If Inter is not available, the theme falls back to the system font stack while maintaining its elegant aesthetic as much as possible. diff --git a/docs/pages/themes/onyx.md b/docs/pages/themes/onyx.md index 584e7419..542bf10e 100644 --- a/docs/pages/themes/onyx.md +++ b/docs/pages/themes/onyx.md @@ -1,41 +1,154 @@ -# PHPFlasher Onyx Theme +--- +permalink: /theme/onyx/ +title: Onyx Theme +description: Add modern, floating notifications to your application with the Onyx theme for PHPFlasher. Featuring elegant shadows, colored corner dots, and smooth animations for a sophisticated appearance. +handler: theme.onyx +data-controller: theme-onyx +--- -## Overview +## Onyx Theme The Onyx theme provides modern, floating notifications with a clean design and subtle accent elements. It features elegant shadows, colored corner dots indicating notification type, and smooth animations to create a sophisticated, contemporary appearance that integrates well with modern interfaces. -![Onyx Theme Preview](./images/onyx-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Floating Appearance**: Clean cards with elegant shadows for a floating effect -- **Accent Dots**: Small colored dots in the corners indicate notification type -- **Generous Rounded Corners**: Large border radius (1rem) for a contemporary look -- **Smooth Animation**: Combined movement and blur transitions for refined entrance -- **Minimal Design**: No large icons or visual elements to maintain focus on content -- **Progress Indicator**: Colored bar showing time remaining -- **Type-Specific Accents**: Each notification type has its own color scheme -- **Dark Mode Support**: Enhanced dark appearance with adjusted shadows and colors -- **RTL Support**: Full right-to-left language support with proper dot positioning +The easiest way to use the Onyx theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.onyx', // Make Onyx the default theme + + 'themes' => [ + 'onyx' => [ + 'scripts' => [ + '/vendor/flasher/themes/onyx.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/onyx.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.onyx # Make Onyx the default theme + + themes: + onyx: + scripts: + - '/vendor/flasher/themes/onyx.min.js' + styles: + - '/vendor/flasher/themes/onyx.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { onyxTheme } from '@flasher/flasher/themes'; flasher.addTheme('onyx', onyxTheme); -// Use the theme -flasher.use('theme.onyx').success('Your changes have been saved'); -flasher.use('theme.onyx').error('There was a problem saving your changes'); -flasher.use('theme.onyx').warning('This action cannot be undone'); -flasher.use('theme.onyx').info('New features are available'); - // Set as default theme flasher.defaultPlugin = 'theme.onyx'; + +// Or use it for specific notifications +flasher.success('Your changes have been saved'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Onyx styling: + +{% assign successMessage = 'Your changes have been saved successfully.' %} +{% assign errorMessage = 'There was a problem saving your changes.' %} +{% assign warningMessage = 'This action cannot be undone.' %} +{% assign infoMessage = 'New features are available.' %} + + + +### PHP + +```php +#/ onyx types + +// With Onyx set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Onyx set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Onyx Theme for Specific Notifications + +If Onyx isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.onyx') + ->success('This notification uses Onyx theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.onyx').success('This notification uses Onyx theme.'); +``` + +### Custom Colors and Appearance The Onyx theme uses CSS variables that can be customized to match your brand: @@ -47,6 +160,7 @@ The Onyx theme uses CSS variables that can be customized to match your brand: --onyx-text-light: #333333; /* Light mode text */ --onyx-text-dark: #f5f5f5; /* Dark mode text */ --onyx-shadow: 0 8px 30px rgba(0, 0, 0, 0.12); /* Light mode shadow */ + --onyx-shadow-dark: 0 8px 30px rgba(0, 0, 0, 0.25); /* Dark mode shadow */ --onyx-border-radius: 1rem; /* Corner roundness */ /* Accent colors */ @@ -57,7 +171,7 @@ The Onyx theme uses CSS variables that can be customized to match your brand: } ``` -## Structure +## HTML Structure The Onyx theme generates notifications with the following HTML structure: @@ -77,53 +191,40 @@ The Onyx theme generates notifications with the following HTML structure: The accent dots are created using CSS pseudo-elements (`::before` and `::after`) rather than being part of the HTML structure. -## Animation Details +## Theme Features -The Onyx theme features a sophisticated entrance animation that combines multiple effects: +### Design Philosophy -```css -@keyframes onyxIn { - 0% { - opacity: 0; - transform: translateY(15px); - filter: blur(3px); - } - 100% { - opacity: 1; - transform: translateY(0); - filter: blur(0); - } -} -``` +The Onyx theme embodies several design principles: -This combined animation creates a refined appearance where notifications: -1. Fade in from invisible to fully visible -2. Move upward slightly from below their final position -3. Transition from a blurred state to sharp focus +1. **Elegance**: Clean, sophisticated appearance with subtle details +2. **Minimalism**: Only essential elements are included, with no icons or extraneous components +3. **Focus**: The clean design keeps attention on the message content +4. **Refinement**: Thoughtful attention to details like animation timing and corner dots +5. **Consistency**: Each notification type follows the same pattern with its own accent color -The animation uses a carefully crafted easing curve (`cubic-bezier(0.16, 1, 0.3, 1)`) for a natural, refined movement. - -## Accent Dots Design +### Accent Dots Design One of the distinctive features of the Onyx theme is its use of subtle accent dots in the corners: -1. **Top-left dot**: Positioned 10px from the top and left edges -2. **Bottom-right dot**: Positioned 10px from the bottom and right edges -3. **Small size**: Each dot is just 6px in diameter -4. **Type-specific colors**: The dots match the color associated with the notification type +- **Top-left dot**: Positioned 10px from the top and left edges +- **Bottom-right dot**: Positioned 10px from the bottom and right edges +- **Small size**: Each dot is just 6px in diameter +- **Type-specific colors**: The dots match the color associated with the notification type These small visual elements provide a subtle but clear indication of the notification type without requiring large icons or colored backgrounds. -## Typography +### Animation Effects -The Onyx theme features clean, modern typography: +The Onyx theme features a sophisticated entrance animation that combines multiple effects: -- Regular weight (400) for a light, contemporary feel -- Comfortable line height (1.5) for easy reading -- Slight letter spacing (0.01rem) for improved legibility -- Modest font size (0.925rem or approximately 14.8px at default size) +- Notifications fade in from invisible to fully visible +- They move upward slightly from below their final position +- They transition from a blurred state to sharp focus -## Dark Mode +The animation uses a carefully crafted easing curve for a natural, refined movement. + +### Dark Mode The dark mode implementation maintains the sophisticated aesthetic while adjusting for low-light environments: @@ -134,26 +235,18 @@ The dark mode implementation maintains the sophisticated aesthetic while adjusti The accent dot colors remain consistent between light and dark modes to maintain brand color recognition. -## Accessibility Features +### Accessibility Features -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables entrance animation +The Onyx theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables entrance animation - **Keyboard Access**: Close button is fully keyboard accessible with visual feedback - **Color Indicators**: Uses colored dots to indicate type without relying solely on color for meaning - **Adequate Contrast**: Ensures good contrast between text and background in both light and dark modes -## Design Philosophy - -The Onyx theme embodies several design principles: - -1. **Elegance**: Clean, sophisticated appearance with subtle details -2. **Minimalism**: Only essential elements are included, with no icons or extraneous components -3. **Focus**: The clean design keeps attention on the message content -4. **Refinement**: Thoughtful attention to details like animation timing and corner dots -5. **Consistency**: Each notification type follows the same pattern with its own accent color - -## Browser Support +## Browser Support The Onyx theme is compatible with all modern browsers: @@ -162,5 +255,20 @@ The Onyx theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android No special polyfills or fallbacks are required as the theme uses standard CSS features that are well-supported across browsers. + +## Implementation Details + +The Onyx theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **CSS Pseudo-elements**: For creating the accent dots without extra HTML +- **Box Shadows**: For the floating card appearance +- **CSS Animations**: For refined entrance effects combining movement and blur +- **CSS Transitions**: For smooth hover interactions +- **Progress Bar**: Shows countdown until notification dismissal with type-specific colors +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/ruby.md b/docs/pages/themes/ruby.md index a0908567..0653fe65 100644 --- a/docs/pages/themes/ruby.md +++ b/docs/pages/themes/ruby.md @@ -1,43 +1,156 @@ -# PHPFlasher Ruby Theme +--- +permalink: /theme/ruby/ +title: Ruby Theme +description: Add vibrant notifications with rich gradient backgrounds to your application using the Ruby theme for PHPFlasher. Featuring an elegant shine animation, circular icons, and gemstone-like appearance. +handler: theme.ruby +data-controller: theme-ruby +--- -## Overview +## Ruby Theme The Ruby theme provides vibrant notifications with rich gradient backgrounds and a distinctive gemstone-like appearance. It features an elegant shine animation that mimics light reflecting off a precious stone, along with circular icon containers and smooth animations to create a premium, eye-catching visual experience. -![Ruby Theme Preview](./images/ruby-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Gradient Backgrounds**: Rich, vibrant gradients for each notification type -- **Gemstone Shine Effect**: Animated light reflection that moves across notifications -- **Circular Icon Container**: Translucent white circle housing the notification icon -- **Scale Animation**: Smooth entrance with a subtle scale effect -- **Enhanced Close Button**: Interactive button with scale and opacity effects -- **Thick Progress Bar**: More prominent progress indicator than other themes -- **High Contrast Text**: White text for excellent readability on colored backgrounds -- **RTL Support**: Full right-to-left language support -- **Reduced Motion Support**: Respectful fallbacks for users who prefer reduced motion +The easiest way to use the Ruby theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.ruby', // Make Ruby the default theme + + 'themes' => [ + 'ruby' => [ + 'scripts' => [ + '/vendor/flasher/themes/ruby.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/ruby.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.ruby # Make Ruby the default theme + + themes: + ruby: + scripts: + - '/vendor/flasher/themes/ruby.min.js' + styles: + - '/vendor/flasher/themes/ruby.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { rubyTheme } from '@flasher/flasher/themes'; flasher.addTheme('ruby', rubyTheme); -// Use the theme -flasher.use('theme.ruby').success('Your changes have been saved'); -flasher.use('theme.ruby').error('There was a problem saving your changes'); -flasher.use('theme.ruby').warning('This action cannot be undone'); -flasher.use('theme.ruby').info('New features are available'); - // Set as default theme flasher.defaultPlugin = 'theme.ruby'; + +// Or use it for specific notifications +flasher.success('Your changes have been saved'); ``` -## Customization +## Notification Types -The Ruby theme uses CSS variables that can be customized: +Once configured, use standard PHPFlasher methods to create notifications with Ruby styling: + +{% assign successMessage = 'Your changes have been saved successfully.' %} +{% assign errorMessage = 'There was a problem saving your changes.' %} +{% assign warningMessage = 'This action cannot be undone.' %} +{% assign infoMessage = 'New features are available.' %} + + + +### PHP + +```php +#/ ruby types + +// With Ruby set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Ruby set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Ruby Theme for Specific Notifications + +If Ruby isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.ruby') + ->success('This notification uses Ruby theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.ruby').success('This notification uses Ruby theme.'); +``` + +### Custom Colors and Appearance + +The Ruby theme uses CSS variables that can be customized to match your brand: ```css :root { @@ -54,7 +167,7 @@ The Ruby theme uses CSS variables that can be customized: } ``` -## Structure +## HTML Structure The Ruby theme generates notifications with the following HTML structure: @@ -76,57 +189,11 @@ The Ruby theme generates notifications with the following HTML structure: ``` -## Animation Details +This structure includes the shine element that creates the gemstone-like reflection animation and the circular icon container that's distinctive to this theme. -The Ruby theme features two distinctive animations: +## Theme Features -### Shine Animation - -```css -@keyframes rubyShine { - 0% { - left: -100%; - opacity: 0.6; - } - 60% { - left: 100%; - opacity: 0.6; - } - 100% { - left: 100%; - opacity: 0; - } -} -``` - -This animation creates a moving highlight that travels across the notification from left to right, mimicking light reflecting off a gemstone surface. The effect: -- Is angled with a skew transform -- Uses a semi-transparent white gradient -- Repeats every 6 seconds after an initial 1-second delay -- Fades out at the end of each cycle - -### Entrance Animation - -```css -@keyframes rubyIn { - 0% { - opacity: 0; - transform: scale(0.96); - } - 100% { - opacity: 1; - transform: scale(1); - } -} -``` - -This animation creates a smooth appearance where notifications: -- Fade in from invisible to fully visible -- Scale up slightly from 96% to 100% of their final size - -The animation uses a custom easing curve (`cubic-bezier(0.21, 1.02, 0.73, 1)`) for a natural, premium feel. - -## Gradient Design +### Gradient Design The theme uses rich, vibrant gradients that flow from a deeper shade to a brighter one: @@ -137,7 +204,19 @@ The theme uses rich, vibrant gradients that flow from a deeper shade to a bright All gradients are angled at 135 degrees, creating a consistent diagonal flow across all notification types. -## Icon Container Design +### Shine Animation + +The Ruby theme features a distinctive shine animation that mimics light reflecting off a gemstone surface: + +- A moving highlight travels across the notification from left to right +- The effect is angled with a skew transform +- Uses a semi-transparent white gradient +- Repeats every 6 seconds after an initial 1-second delay +- Fades out at the end of each cycle + +This animation adds a premium, dynamic quality to the notifications that draws the user's attention. + +### Circular Icon Container The circular icon container uses: - Semi-transparent white background (25% opacity) @@ -147,33 +226,15 @@ The circular icon container uses: This creates a subtle but distinctive visual element that helps identify the notification type. -## Progress Bar +### Animation Effects -The Ruby theme features a more prominent progress bar: -- 5px height (taller than most themes) -- Semi-transparent black background (10% opacity) -- Semi-transparent white progress indicator (40% opacity) -- Positioned at the bottom edge of the notification +In addition to the shine animation, the Ruby theme includes: -## Close Button Design +- **Entrance Animation**: A smooth scale-up from 96% to 100% combined with a fade-in +- **Close Button Interactions**: Scale and opacity changes on hover +- **Progress Bar Animation**: A fluid countdown indicator -The close button has several interactive features: -- Semi-transparent white background (20% opacity) -- Perfect circular shape -- Scale effect on hover (grows to 105% size) -- Opacity change from 80% to 100% on hover -- Background lightens to 30% opacity on hover - -## Accessibility Features - -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query by disabling animations and shine effect -- **Color Contrast**: White text (#ffffff) on colored backgrounds meets WCAG 2.1 AA contrast requirements -- **Keyboard Access**: Close button is fully keyboard accessible with visual feedback -- **RTL Support**: Complete right-to-left language support with appropriate directional adjustments - -## Design Philosophy +### Design Philosophy The Ruby theme embodies a premium, attention-grabbing design philosophy: 1. **Vibrance**: Rich, saturated colors that stand out @@ -182,7 +243,18 @@ The Ruby theme embodies a premium, attention-grabbing design philosophy: 4. **Polish**: Refined animations and hover states reflect a premium quality 5. **Legibility**: Despite the colorful backgrounds, text remains highly readable -## Browser Support +### Accessibility Features + +The Ruby theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query by disabling animations and shine effect +- **Color Contrast**: White text (#ffffff) on colored backgrounds meets WCAG 2.1 AA contrast requirements +- **Keyboard Access**: Close button is fully keyboard accessible with visual feedback +- **RTL Support**: Complete right-to-left language support with appropriate directional adjustments + +## Browser Support The Ruby theme is compatible with all modern browsers: @@ -191,5 +263,20 @@ The Ruby theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android The gradient backgrounds and animations are well-supported across modern browsers, requiring no special fallbacks. + +## Implementation Details + +The Ruby theme uses modern web technologies: + +- **CSS Variables**: For theme customization +- **CSS Gradients**: For rich, vibrant backgrounds +- **CSS Animations**: For shine effect and entrance animations +- **CSS Transitions**: For smooth hover interactions +- **Box Shadows**: For depth and premium feel +- **SVG Icons**: For crisp, scalable notification type indicators +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. diff --git a/docs/pages/themes/sapphire.md b/docs/pages/themes/sapphire.md index 4c8eea81..b5275f12 100644 --- a/docs/pages/themes/sapphire.md +++ b/docs/pages/themes/sapphire.md @@ -1,43 +1,156 @@ -# PHPFlasher Sapphire Theme +--- +permalink: /theme/sapphire/ +title: Sapphire Theme +description: Add modern, glassmorphic notifications to your application with the Sapphire theme for PHPFlasher. Featuring a blurred backdrop effect, minimal interface, and subtle animations. +handler: theme.sapphire +data-controller: theme-sapphire +--- -## Overview +## Sapphire Theme The Sapphire theme provides modern, glassmorphic notifications with a blurred backdrop effect. It features a clean, minimal design that emphasizes simplicity and contemporary aesthetics, with semi-transparent colored backgrounds and subtle animations that create a sophisticated, unobtrusive appearance. -![Sapphire Theme Preview](./images/sapphire-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Glassmorphic Design**: Semi-transparent backgrounds with backdrop blur effect -- **Minimal Interface**: Clean design without icons or close buttons -- **Bounce Animation**: Subtle entrance animation with a slight bounce effect -- **Colored Backgrounds**: Type-specific colors with high transparency -- **Progress Indicator**: Clean progress bar showing time remaining -- **Modern Typography**: Uses Roboto font for a contemporary look -- **Type-Based Colors**: Each notification type has its own colored background -- **RTL Support**: Full right-to-left language support -- **Reduced Motion Support**: Respects user preferences for reduced motion +The easiest way to use the Sapphire theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.sapphire', // Make Sapphire the default theme + + 'themes' => [ + 'sapphire' => [ + 'scripts' => [ + '/vendor/flasher/themes/sapphire.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/sapphire.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.sapphire # Make Sapphire the default theme + + themes: + sapphire: + scripts: + - '/vendor/flasher/themes/sapphire.min.js' + styles: + - '/vendor/flasher/themes/sapphire.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { sapphireTheme } from '@flasher/flasher/themes'; flasher.addTheme('sapphire', sapphireTheme); -// Use the theme -flasher.use('theme.sapphire').success('Your changes have been saved'); -flasher.use('theme.sapphire').error('There was a problem saving your changes'); -flasher.use('theme.sapphire').warning('This action cannot be undone'); -flasher.use('theme.sapphire').info('New features are available'); - // Set as default theme flasher.defaultPlugin = 'theme.sapphire'; + +// Or use it for specific notifications +flasher.success('Your changes have been saved'); ``` -## Customization +## Notification Types -The Sapphire theme uses CSS variables that can be customized: +Once configured, use standard PHPFlasher methods to create notifications with Sapphire styling: + +{% assign successMessage = 'Your changes have been saved successfully.' %} +{% assign errorMessage = 'There was a problem saving your changes.' %} +{% assign warningMessage = 'This action cannot be undone.' %} +{% assign infoMessage = 'New features are available.' %} + + + +### PHP + +```php +#/ sapphire types + +// With Sapphire set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Sapphire set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Sapphire Theme for Specific Notifications + +If Sapphire isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.sapphire') + ->success('This notification uses Sapphire theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.sapphire').success('This notification uses Sapphire theme.'); +``` + +### Custom Colors and Appearance + +The Sapphire theme uses CSS variables that can be customized to match your brand: ```css :root { @@ -45,6 +158,8 @@ The Sapphire theme uses CSS variables that can be customized: --sapphire-bg-base: rgba(30, 30, 30, 0.9); /* Base background color */ --sapphire-text: #f0f0f0; /* Text color */ --sapphire-shadow: rgba(0, 0, 0, 0.15); /* Shadow color */ + --sapphire-border-radius: 12px; /* Corner roundness */ + --sapphire-blur: 12px; /* Backdrop blur amount */ /* Progress bar colors */ --sapphire-progress-bg: rgba(255, 255, 255, 0.2); /* Progress background */ @@ -58,7 +173,7 @@ The Sapphire theme uses CSS variables that can be customized: } ``` -## Structure +## HTML Structure The Sapphire theme generates notifications with the following HTML structure: @@ -75,49 +190,18 @@ The Sapphire theme generates notifications with the following HTML structure: Note that unlike most themes, Sapphire intentionally omits a close button and icons for a more streamlined appearance. -## Animation Details +## Theme Features -The Sapphire theme features a distinctive bounce animation for a more dynamic entrance: +### Glassmorphic Design -```css -@keyframes sapphireIn { - 0% { - opacity: 0; - transform: translateY(10px); - } - 60% { - transform: translateY(-3px); - } - 100% { - opacity: 1; - transform: translateY(0); - } -} -``` +The Sapphire theme implements the popular glassmorphism design trend with a semi-transparent background and backdrop blur that creates a frosted glass effect where: -This animation creates a refined entrance where notifications: -1. Fade in from invisible to fully visible -2. Move upward from below their final position -3. Slightly overshoot their target position before settling (bounce effect) - -The animation uses a carefully tuned easing curve (`cubic-bezier(0.25, 0.46, 0.45, 0.94)`) that enhances the natural feel of the motion. - -## Glassmorphic Design - -The Sapphire theme implements the popular glassmorphism design trend: - -```css -backdrop-filter: blur(12px); --webkit-backdrop-filter: blur(12px); -``` - -This creates a frosted glass effect where: - The notification background is semi-transparent - Content behind the notification appears blurred - The effect creates depth and visual interest - The notification feels like it's floating above the content -## Minimalist Approach +### Minimalist Approach Unlike many notification themes, Sapphire takes a distinctly minimalist approach: @@ -129,33 +213,36 @@ Unlike many notification themes, Sapphire takes a distinctly minimalist approach This approach reduces visual noise and creates a more elegant, unobtrusive notification experience. -## Color System +### Animation Effects -The Sapphire theme uses a sophisticated color system: +The Sapphire theme features a distinctive bounce animation for a more dynamic entrance where notifications: + +1. Fade in from invisible to fully visible +2. Move upward from below their final position +3. Slightly overshoot their target position before settling (bounce effect) + +The animation uses a carefully tuned easing curve that enhances the natural feel of the motion. + +### Color System + +The theme uses a sophisticated color system: - High transparency backgrounds (95% opacity) - Type-specific colors that maintain a consistent visual language - Light text (#f0f0f0) for excellent contrast on all background colors - Semi-transparent progress indicator that works across all notification types -## Typography +### Accessibility Features -The theme prioritizes clean, modern typography: +The Sapphire theme includes several accessibility features: -- Prefers the Roboto font for a contemporary look -- Comfortable line height (1.4) for easy reading -- Slightly smaller than standard text size (0.925em) -- Consistent text color across all notification types - -## Accessibility Features - -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables animations +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables animations - **Color Contrast**: Ensures good contrast between text and all background colors - **RTL Support**: Complete right-to-left language support -## Browser Support +## Browser Support The Sapphire theme is compatible with all modern browsers: @@ -164,15 +251,24 @@ The Sapphire theme is compatible with all modern browsers: - Safari (latest) - Edge (latest) - Opera (latest) +- Mobile browsers on iOS and Android For browsers that don't support backdrop-filter (like older Firefox versions), the theme gracefully degrades to using just the semi-transparent background without the blur effect. -## Font Considerations +## Implementation Details + +The Sapphire theme uses modern web technologies: + +- **CSS Variables**: For theme customization +- **Backdrop Filter**: For the frosted glass effect +- **CSS Animations**: For the bounce entrance effect +- **CSS Transitions**: For smooth progress bar animation +- **Media Queries**: For responsive design and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. For the best experience with the Sapphire theme, it's recommended to include the Roboto font in your project: ```html ``` - -If Roboto is not available, the theme falls back to the system font stack while maintaining its clean aesthetic. diff --git a/docs/pages/themes/slack.md b/docs/pages/themes/slack.md index 20f759c6..2337ed75 100644 --- a/docs/pages/themes/slack.md +++ b/docs/pages/themes/slack.md @@ -1,40 +1,154 @@ -# PHPFlasher Slack Theme +--- +permalink: /theme/slack/ +title: Slack Theme +description: Add Slack-style notifications to your application with the Slack theme for PHPFlasher. Featuring message bubbles with colored avatars, clean typography, and interactive hover effects. +handler: theme.slack +data-controller: theme-slack +--- -## Overview +## Slack Theme The Slack theme provides notifications styled after Slack's familiar messaging interface. It features message bubbles with colored avatars, clean typography, and interactive hover effects that closely resemble the appearance and behavior of messages in the popular workplace communication platform. -![Slack Theme Preview](./images/slack-theme.png) +> **Note:** +> New to PHPFlasher? Check the [installation guide](/installation/) first. -## Features +## Setup -- **Message Bubbles**: Clean, bordered containers resembling Slack messages -- **Colored Avatars**: Type-specific colored icon containers (green, blue, orange, red) -- **Slack Typography**: Font styles matching Slack's clean text appearance -- **Hover Interactions**: Background change and button reveal on hover -- **Close Button**: SVG "X" icon that appears when hovering over messages -- **Quick Animation**: Fast fade-in animation for a responsive feel -- **Dark Mode Support**: Dark theme matching Slack's dark mode appearance -- **RTL Support**: Full right-to-left language support +The easiest way to use the Slack theme is to set it as your **default theme**: -## Usage +### Laravel + +```php + 'theme.slack', // Make Slack the default theme + + 'themes' => [ + 'slack' => [ + 'scripts' => [ + '/vendor/flasher/themes/slack.min.js', + ], + 'styles' => [ + '/vendor/flasher/themes/slack.min.css', + ], + ], + ], +]; +``` + +### Symfony + +```yaml +# config/packages/flasher.yaml + +flasher: + default: theme.slack # Make Slack the default theme + + themes: + slack: + scripts: + - '/vendor/flasher/themes/slack.min.js' + styles: + - '/vendor/flasher/themes/slack.min.css' +``` + +### JavaScript/TypeScript ```typescript // Import the theme (if not auto-registered) import { slackTheme } from '@flasher/flasher/themes'; flasher.addTheme('slack', slackTheme); -// Use the theme -flasher.use('theme.slack').success('Your file was uploaded successfully'); -flasher.use('theme.slack').error('Unable to connect to the server'); -flasher.use('theme.slack').warning('Your session will expire soon'); -flasher.use('theme.slack').info('New comments on your post'); - // Set as default theme flasher.defaultPlugin = 'theme.slack'; + +// Or use it for specific notifications +flasher.success('Your file was uploaded successfully'); ``` -## Customization +## Notification Types + +Once configured, use standard PHPFlasher methods to create notifications with Slack styling: + +{% assign successMessage = 'Your file was uploaded successfully.' %} +{% assign errorMessage = 'Unable to connect to the server.' %} +{% assign warningMessage = 'Your session will expire soon.' %} +{% assign infoMessage = 'New comments on your post.' %} + + + +### PHP + +```php +#/ slack types + +// With Slack set as default theme +flash()->success('{{ successMessage }}'); +flash()->error('{{ errorMessage }}'); +flash()->warning('{{ warningMessage }}'); +flash()->info('{{ infoMessage }}'); +``` + +### JavaScript + +```javascript +// With Slack set as default theme +flasher.success('{{ successMessage }}'); +flasher.error('{{ errorMessage }}'); +flasher.warning('{{ warningMessage }}'); +flasher.info('{{ infoMessage }}'); +``` + +## Customization + +### Using Slack Theme for Specific Notifications + +If Slack isn't your default theme, you can use it for specific notifications: + +#### PHP + +```php +flash() + ->use('theme.slack') + ->success('This notification uses Slack theme.'); +``` + +#### JavaScript + +```javascript +flasher.use('theme.slack').success('This notification uses Slack theme.'); +``` + +### Custom Colors and Appearance The Slack theme uses CSS variables that can be customized to match your brand while maintaining the Slack-like appearance: @@ -46,6 +160,7 @@ The Slack theme uses CSS variables that can be customized to match your brand wh --slack-text-light: #1d1c1d; /* Light mode text */ --slack-text-dark: #e0e0e0; /* Dark mode text */ --slack-border-light: #e0e0e0; /* Light mode border */ + --slack-border-dark: #393a3e; /* Dark mode border */ --slack-avatar-size: 36px; /* Avatar size */ /* Type colors */ @@ -56,7 +171,7 @@ The Slack theme uses CSS variables that can be customized to match your brand wh } ``` -## Structure +## HTML Structure The Slack theme generates notifications with the following HTML structure: @@ -78,9 +193,11 @@ The Slack theme generates notifications with the following HTML structure: ``` -## Design Details +This structure mirrors Slack's message layout with an avatar container, message content, and action button. -### Message Bubble +## Theme Features + +### Message Bubble Design The main container follows Slack's message styling: - White background (#ffffff) in light mode @@ -100,21 +217,6 @@ Each notification type has a colored square avatar: The avatars are 36px × 36px squares with slightly rounded corners (4px border radius). -### Typography - -The theme uses Slack's typography style: -- Font family: Lato, Slack-Lato, Helvetica Neue, Helvetica, sans-serif -- Font size: 15px for message text -- Line height: 1.46668 (Slack's specific line height) -- Text color: Near black (#1d1c1d) in light mode, off-white (#e0e0e0) in dark mode - -### Animation - -The theme uses a simple, quick fade-in animation: -- Duration: 150ms (matches Slack's quick, responsive feel) -- Timing function: ease-out -- Effect: Simple opacity change from 0 to 1 - ### Interactive Elements The close button appears on hover: @@ -124,7 +226,22 @@ The close button appears on hover: - Changes color on hover (from #616061 to #1d1c1d) - Has a subtle background on hover (#f8f8f8) -## Dark Mode +### Animation Effects + +The theme uses a simple, quick fade-in animation: +- Duration: 150ms (matches Slack's quick, responsive feel) +- Timing function: ease-out +- Effect: Simple opacity change from 0 to 1 + +### Typography + +The theme uses Slack's typography style: +- Font family: Lato, Slack-Lato, Helvetica Neue, Helvetica, sans-serif +- Font size: 15px for message text +- Line height: 1.46668 (Slack's specific line height) +- Text color: Near black (#1d1c1d) in light mode, off-white (#e0e0e0) in dark mode + +### Dark Mode The dark mode implementation closely matches Slack's dark theme: - Background: #1a1d21 (Slack's dark mode color) @@ -134,40 +251,45 @@ The dark mode implementation closely matches Slack's dark theme: The avatar colors remain consistent between light and dark modes to maintain clear visual indicators. -## Accessibility Features +### Accessibility Features -- **ARIA Roles**: Uses appropriate role="alert" for error/warning and role="status" for success/info -- **ARIA Live Regions**: Uses aria-live="assertive" for critical messages and aria-live="polite" for non-critical messages -- **Reduced Motion**: Respects prefers-reduced-motion media query and disables animations +The Slack theme includes several accessibility features: + +- **ARIA Roles**: Uses appropriate `role="alert"` for error/warning and `role="status"` for success/info +- **ARIA Live Regions**: Uses `aria-live="assertive"` for critical messages and `aria-live="polite"` for non-critical messages +- **Reduced Motion**: Respects `prefers-reduced-motion` media query and disables animations - **Keyboard Access**: Close button is fully keyboard accessible - **Color Indicators**: Each notification type has its own color, but also includes a symbol - **Text Contrast**: Maintains good contrast ratios in both light and dark modes +- **RTL Support**: Complete right-to-left language support with properly flipped layout -## RTL Support +## Browser Support -The theme includes comprehensive right-to-left language support: -- Swaps all directional padding and margins -- Moves the avatar to the right side -- Moves the close button to the left side -- Properly aligns text for RTL languages +The Slack theme is compatible with all modern browsers: -## Font Considerations +- Chrome (latest) +- Firefox (latest) +- Safari (latest) +- Edge (latest) +- Opera (latest) +- Mobile browsers on iOS and Android + +The theme uses standard CSS features that are well-supported across browsers, ensuring a consistent experience for all users. + +## Implementation Details + +The Slack theme uses modern web technologies: + +- **CSS Variables**: For theme customization and dark mode support +- **CSS Flexbox**: For proper message layout and alignment +- **CSS Transitions**: For smooth hover interactions +- **SVG Icons**: For the close button and notification type indicators +- **Media Queries**: For responsive design, dark mode, and reduced motion support + +All theme files are optimized for production use, with minified JavaScript and CSS to ensure fast loading times. For the best experience with the Slack theme, it's recommended to include the Lato font in your project: ```html ``` - -If Lato is not available, the theme falls back to Helvetica Neue or Helvetica, which provide a similar clean appearance. - -## Browser Support - -The Slack theme is compatible with all modern browsers: -- Chrome (latest) -- Firefox (latest) -- Safari (latest) -- Edge (latest) -- Opera (latest) - -The theme uses standard CSS features that are well-supported across browsers, ensuring a consistent experience for all users. diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js index b809f879..b07f6eff 100644 --- a/docs/tailwind.config.js +++ b/docs/tailwind.config.js @@ -2,13 +2,14 @@ module.exports = { content: [ // Source files only + './_site/**/*.{html,js}', './docs/**/*.{html,md}', './_includes/**/*.html', './_layouts/**/*.html', './assets/**/*.{js,pcss}', // Explicit exclusions - '!./_site/**', // Jekyll output directory + // '!./_site/**', // Jekyll output directory '!./node_modules/**', // Already excluded, but keeping it explicit '!./dist/**', // Webpack output ],