diff --git a/app/assets/builds/application.css b/app/assets/builds/application.css index ba65962..0a97afd 100644 --- a/app/assets/builds/application.css +++ b/app/assets/builds/application.css @@ -1,3 +1,5461 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: } +/* + * Hack Club: The Game — design system + * + * Language: Helvetica/Inter, no gradients, grids, metro-line accents, + * neo-brutalist edges. Game flavour: snappy springs, layered cards, + * Switch-style pill tabs, Pokemon Go-style status alerts. + */ -/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body,html{font-family:Inter,Helvetica Neue,Helvetica,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent}body{overscroll-behavior-y:none}body,h1{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}h1{font-size:1.875rem;line-height:2.25rem;font-weight:900;letter-spacing:-.025em}@media (min-width:768px){h1{font-size:2.25rem;line-height:2.5rem}}h2{font-size:1.5rem;line-height:2rem;font-weight:900;letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}@media (min-width:768px){h2{font-size:1.875rem;line-height:2.25rem}}h3{font-size:1.125rem;line-height:1.75rem;font-weight:700;letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}@media (min-width:768px){h3{font-size:1.25rem;line-height:1.75rem}}p{line-height:1.625;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.btn-game,[role=button],a.btn-game,button{touch-action:manipulation}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.subway-blue{--tw-bg-opacity:1;background-color:rgb(0 57 166/var(--tw-bg-opacity,1))}.subway-orange{--tw-bg-opacity:1;background-color:rgb(255 99 25/var(--tw-bg-opacity,1))}.subway-red{--tw-bg-opacity:1;background-color:rgb(238 53 46/var(--tw-bg-opacity,1))}.subway-green{--tw-bg-opacity:1;background-color:rgb(0 147 60/var(--tw-bg-opacity,1))}.subway-yellow{--tw-bg-opacity:1;background-color:rgb(252 204 10/var(--tw-bg-opacity,1))}.neo-card{background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.neo-card,.neo-card-yellow{border-radius:1rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;padding:1.25rem;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.neo-card-yellow{background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.neo-card-dark{--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1));padding:1.25rem;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1));--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color)}.neo-card-dark,.neo-card-flush{border-radius:1rem;border-width:3px;border-color:rgb(0 0 0/var(--tw-border-opacity,1));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.neo-card-flush{overflow:hidden;--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color)}.btn-game{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:700;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-game,.btn-game:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-game:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.btn-game-primary,a.btn-game-primary{touch-action:manipulation}.btn-game-primary{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:700;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-game-primary,.btn-game-primary:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-game-primary:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.btn-game-primary{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.btn-game-dark,a.btn-game-dark{touch-action:manipulation}.btn-game-dark{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:700;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-game-dark,.btn-game-dark:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-game-dark:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.btn-game-dark{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.btn-game-ghost,a.btn-game-ghost{touch-action:manipulation}.btn-game-ghost{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:700;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-game-ghost,.btn-game-ghost:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-game-ghost:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.btn-game-ghost{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.btn-primary,a.btn-primary{touch-action:manipulation}.btn-primary{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:700;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-primary,.btn-primary:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-primary:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.btn-primary{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));padding:.75rem 1.5rem;font-size:1rem;line-height:1.5rem}.btn-secondary,a.btn-secondary{touch-action:manipulation}.btn-secondary{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:700;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-secondary,.btn-secondary:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-secondary:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.btn-secondary{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));padding:.75rem 1.5rem;font-size:1rem;line-height:1.5rem}.btn-dark,a.btn-dark{touch-action:manipulation}.btn-dark{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));padding:.75rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:700;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-dark,.btn-dark:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-dark:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.btn-dark{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1));padding:.75rem 1.5rem;font-size:1rem;line-height:1.5rem}.pill{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em}.pill-yellow{background-color:rgb(251 191 36/var(--tw-bg-opacity,1));color:rgb(0 0 0/var(--tw-text-opacity,1))}.pill-dark,.pill-yellow{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-bg-opacity:1;--tw-text-opacity:1}.pill-dark{background-color:rgb(0 0 0/var(--tw-bg-opacity,1));color:rgb(255 255 255/var(--tw-text-opacity,1))}.pill-green{background-color:rgb(52 211 153/var(--tw-bg-opacity,1));color:rgb(0 0 0/var(--tw-text-opacity,1))}.pill-green,.pill-red{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-bg-opacity:1;--tw-text-opacity:1}.pill-red{background-color:rgb(239 68 68/var(--tw-bg-opacity,1));color:rgb(255 255 255/var(--tw-text-opacity,1))}.pill-gray{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.pill-purple{background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.badge-team,.pill-purple{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-bg-opacity:1;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.badge-team{background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.badge-role{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em}.badge-role-admin{background-color:rgb(239 68 68/var(--tw-bg-opacity,1));color:rgb(255 255 255/var(--tw-text-opacity,1))}.badge-role-admin,.badge-role-user{display:inline-flex;align-items:center;gap:.375rem;border-radius:9999px;padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-bg-opacity:1;--tw-text-opacity:1}.badge-role-user{background-color:rgb(229 231 235/var(--tw-bg-opacity,1));color:rgb(55 65 81/var(--tw-text-opacity,1))}.app-shell{min-height:100vh;--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.mobile-topbar{position:sticky;top:0;z-index:40;display:flex;height:3.5rem;align-items:center;justify-content:space-between;border-bottom-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));padding-left:1rem;padding-right:1rem}@media (min-width:1024px){.mobile-topbar{display:none}}.mobile-topbar-floating{position:fixed;left:0;right:0;top:0;border-bottom-width:0;background-color:hsla(0,0%,100%,.85);--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);box-shadow:0 3px 0 0 #000}.tab-bar{position:fixed;left:0;right:0;bottom:0;z-index:40;display:flex;align-items:stretch;justify-content:space-around;gap:.5rem;border-top-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));padding:.5rem .5rem max(env(safe-area-inset-bottom),.5rem)}@media (min-width:1024px){.tab-bar{display:none}}.tab-bar-floating{background-color:hsla(0,0%,100%,.85);--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.tab-item{display:flex;flex:1 1 0%;flex-direction:column;align-items:center;justify-content:center;gap:.125rem;border-radius:.75rem;padding-top:.375rem;padding-bottom:.375rem;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.tab-item:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.tab-item .tab-icon{height:1.5rem;width:1.5rem}.tab-item.active{border-width:2px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));--tw-shadow:2px 2px 0px 0px #000;--tw-shadow-colored:2px 2px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.desktop-sidebar{position:fixed;left:0;top:0;bottom:0;z-index:30;display:none;width:18rem;flex-direction:column;--tw-bg-opacity:1;background-color:rgb(26 26 26/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}@media (min-width:1024px){.desktop-sidebar{display:flex}}.nav-item{display:flex;align-items:center;gap:.75rem;border-radius:.75rem;padding:.75rem 1rem;font-size:1rem;line-height:1.5rem;font-weight:700;color:hsla(0,0%,100%,.8);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.nav-item:hover{background-color:hsla(0,0%,100%,.1);--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.nav-item.active{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.nav-item .nav-icon{height:1.25rem;width:1.25rem;flex-shrink:0}.map-canvas{inset:0;--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1));isolation:isolate}.map-canvas,.map-overlay{position:absolute}.map-overlay{pointer-events:none;z-index:30}.map-overlay>*{pointer-events:auto}.map-alert{pointer-events:none;position:absolute;top:.75rem;left:.75rem;right:4.25rem;z-index:30}@media (min-width:1024px){.map-alert{top:1.5rem;left:5rem;right:auto;max-width:28rem}}.map-alert{top:max(env(safe-area-inset-top),.75rem)}.map-alert>*{pointer-events:auto}.map-fab{pointer-events:none;position:absolute;top:.75rem;right:.75rem;z-index:30;display:flex;flex-direction:column;gap:.5rem}@media (min-width:1024px){.map-fab{top:1.5rem;right:auto;left:1.5rem}}.map-fab{top:max(env(safe-area-inset-top),.75rem)}.map-fab>*{pointer-events:auto}.fab{display:flex;height:2.75rem;width:2.75rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:center;border-radius:9999px;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));font-weight:900;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));--tw-shadow:3px 3px 0px 0px #000;--tw-shadow-colored:3px 3px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.fab,.fab:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.fab:active{--tw-translate-x:2px;--tw-translate-y:2px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.map-legend{position:absolute;bottom:5.5rem;left:.75rem;z-index:30;display:flex;align-items:center;gap:.75rem;border-radius:9999px;border-width:2px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));background-color:hsla(0,0%,100%,.9);padding:.375rem .75rem;font-size:11px;font-weight:700;--tw-shadow:3px 3px 0px 0px #000;--tw-shadow-colored:3px 3px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}@media (min-width:1024px){.map-legend{bottom:1.5rem;left:1.5rem}}.map-sheet{pointer-events:none;position:absolute;left:0;right:0;bottom:0;z-index:30}@media (min-width:1024px){.map-sheet{left:auto;right:1.5rem;bottom:1.5rem;top:auto;width:20rem}}.map-sheet-inner{pointer-events:auto;display:flex;flex-direction:column;overflow:hidden;border-top-left-radius:1.5rem;border-top-right-radius:1.5rem;border-top-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:0 -4px 0 0 #000;--tw-shadow-colored:0 -4px 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s;transition-timing-function:cubic-bezier(.22,1,.36,1)}@media (min-width:1024px){.map-sheet-inner{border-radius:1rem;border-width:3px;--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}}.map-sheet-inner{margin-bottom:calc(env(safe-area-inset-bottom) + 4.5rem);max-height:45dvh}@media (min-width:1024px){.map-sheet-inner{margin-bottom:0;max-height:60vh;height:auto}}.map-sheet[data-state=collapsed] .map-sheet-inner{transform:translateY(calc(100% - 4.25rem))}@media (min-width:1024px){.map-sheet[data-state=collapsed] .map-sheet-inner{transform:none}}.map-sheet-handle{margin:.625rem auto;height:.375rem;width:3rem;border-radius:9999px;--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}@media (min-width:1024px){.map-sheet-handle{display:none}}.map-sheet-header{display:flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding-left:1rem;padding-right:1rem;padding-bottom:.75rem}@media (min-width:1024px){.map-sheet-header{padding-top:1rem;padding-bottom:.75rem}}.zone-row{position:relative}.zone-row-button{display:flex;width:100%;cursor:pointer;align-items:center;gap:.75rem;padding:.75rem 1rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.zone-row-button:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.zone-row-button:active{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.zone-row.open .zone-row-button{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.zone-row-chevron{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}.zone-row.open .zone-row-chevron{transform:rotate(180deg)}.zone-row-detail{display:none;border-top-width:1px;--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1));padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem}.zone-row.open .zone-row-detail{display:block}.home-hero{position:relative;margin-left:-1rem;margin-right:-1rem;margin-top:-1rem;display:flex;flex-direction:column;overflow:hidden;border-bottom-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}@media (min-width:768px){.home-hero{margin-left:-1.5rem;margin-right:-1.5rem}}@media (min-width:1024px){.home-hero{margin-left:-2.5rem;margin-right:-2.5rem;margin-top:-2.5rem}}.home-hero{height:50dvh;min-height:380px;padding:calc(env(safe-area-inset-top) + 1.5rem) 1.5rem 1.5rem}@media (min-width:768px){.home-hero{padding:2rem}}@media (min-width:1024px){.home-hero{border-radius:0;height:420px;min-height:420px}}.hero-grid{pointer-events:none;position:absolute;inset:0;background-image:linear-gradient(90deg,rgba(0,0,0,.1) 1px,transparent 0),linear-gradient(180deg,rgba(0,0,0,.1) 1px,transparent 0);background-size:32px 32px;mask-image:radial-gradient(ellipse at center,#000 30%,transparent 80%);-webkit-mask-image:radial-gradient(ellipse at center,#000 30%,transparent 80%)}.hero-eyebrow{font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.25em;color:rgba(0,0,0,.6)}.hero-name{font-size:1.875rem;line-height:2.25rem;font-weight:900;line-height:.95;letter-spacing:-.025em;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}@media (min-width:768px){.hero-name{font-size:2.25rem;line-height:2.5rem}}.hero-avatar-wrap{position:relative;display:inline-block}.hero-avatar-wrap:before{content:"";pointer-events:none;position:absolute;inset:-.75rem;border-radius:1.8rem;border-width:3px;border-color:rgba(0,0,0,.3);animation:heroPulse 2.4s ease-out infinite}.hero-avatar{position:relative;display:flex;height:8rem;width:8rem;align-items:center;justify-content:center;overflow:hidden;border-radius:1.5rem;border-width:4px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1));font-size:3.75rem;line-height:1;font-weight:900;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}@media (min-width:768px){.hero-avatar{height:10rem;width:10rem;font-size:4.5rem;line-height:1}}.hero-avatar{box-shadow:6px 6px 0 0 rgba(0,0,0,.85)}.hero-avatar img{position:absolute;inset:0;height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.team-row{position:relative;display:flex;align-items:center;justify-content:center}.team-row .hero-avatar-wrap{z-index:5}.teammate{position:absolute;top:50%;left:50%;height:3.5rem;width:3.5rem}@media (min-width:768px){.teammate{height:4rem;width:4rem}}.teammate{z-index:var(--tm-z,1);transform:translate(-50%,-50%) scale(.55);opacity:0;animation:teammateFanOut .6s cubic-bezier(.34,1.56,.64,1) both;animation-delay:var(--tm-delay,0ms);pointer-events:none}.teammate-inner{display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:9999px;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));font-size:1rem;line-height:1.5rem;font-weight:900;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}@media (min-width:768px){.teammate-inner{font-size:1.125rem;line-height:1.75rem}}.teammate-inner{box-shadow:2px 2px 0 0 #000;animation:teammateBob 3.6s ease-in-out infinite;animation-delay:var(--tm-bob-delay,0ms)}.teammate-inner img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}@keyframes teammateFanOut{0%{transform:translate(-50%,-50%) scale(.55);opacity:0}60%{opacity:1}to{transform:translate(calc(-50% + var(--tm-x, 0rem)),calc(-50% + var(--tm-y, 0rem))) scale(1);opacity:1}}@keyframes teammateBob{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}@keyframes heroPulse{0%{opacity:.6;transform:scale(1)}70%{opacity:0;transform:scale(1.18)}to{opacity:0;transform:scale(1.18)}}.hero-card{position:relative;display:flex;align-items:stretch;overflow:hidden;border-radius:1rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hero-stat{flex:1 1 0%;padding:.625rem .5rem;text-align:center}.hero-stat+.hero-stat{border-left-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.hero-stat-label{font-size:9px;font-weight:900;text-transform:uppercase;letter-spacing:.18em;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.hero-stat-value{margin-top:.25rem;font-size:1.25rem;line-height:1.75rem;font-weight:900;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}@media (min-width:768px){.hero-stat-value{font-size:1.5rem;line-height:2rem}}.lb-row{position:relative;display:flex;align-items:center;gap:.75rem;border-bottom-width:2px;border-color:rgba(0,0,0,.1);padding:.75rem 1rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.lb-row:last-child{border-bottom-width:0}.lb-row:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.lb-row.is-you{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.lb-rank{display:flex;height:2.25rem;width:2.25rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:9999px;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));font-size:1rem;line-height:1.5rem;font-weight:900;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);--tw-shadow:2px 2px 0px 0px #000;--tw-shadow-colored:2px 2px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lb-rank.lb-rank-1{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.lb-rank.lb-rank-2{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.lb-rank.lb-rank-3{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity,1))}.lb-swatch{height:2rem;width:2rem;flex-shrink:0;border-radius:.5rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-shadow:2px 2px 0px 0px #000;--tw-shadow-colored:2px 2px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.lb-name{font-size:1rem;line-height:1.5rem;font-weight:900;line-height:1.25;color:rgb(0 0 0/var(--tw-text-opacity,1))}.lb-name,.lb-sub{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-text-opacity:1}.lb-sub{font-size:.75rem;line-height:1rem;color:rgb(107 114 128/var(--tw-text-opacity,1))}.lb-points{font-size:1.25rem;line-height:1.75rem;font-weight:900;--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.lb-points-suffix{margin-top:.125rem;display:block;text-align:right;font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.18em;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.zone-alert{position:relative;overflow:hidden;border-radius:1rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.zone-alert-header{position:relative;display:flex;align-items:center;gap:.75rem;--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1));padding:1rem 1.25rem;--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.alert-dot{height:.75rem;width:.75rem;flex-shrink:0;border-radius:9999px;--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1));box-shadow:0 0 0 0 #fbbf24;animation:alertPulse 1.6s ease-out infinite}.alert-stripes{background-image:repeating-linear-gradient(45deg,#fbbf24,#fbbf24 12px,#000 0,#000 24px)}.metro-line,.metro-stop{position:absolute;border-radius:9999px}.metro-stop{border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.form-label{margin-bottom:.5rem;display:block;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.form-input{width:100%;border-radius:.5rem;border-width:2px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));padding:.75rem 1rem}.form-input:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity,1))}.filter-label{margin-bottom:.5rem;display:block;font-size:.75rem;line-height:1rem;font-weight:700;text-transform:uppercase;letter-spacing:.025em;--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.filter-input{width:100%;border-radius:.5rem;border-width:2px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));padding:.75rem 1rem}.filter-input:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity,1))}.sort-link{display:flex;align-items:center;gap:.5rem}.sort-link:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}@keyframes gridDrift{0%{background-position:0 0}to{background-position:150px 150px}}.splash{min-height:100dvh;width:100%;flex-direction:column;overflow:hidden;background-color:#e3ebee;background-image:linear-gradient(90deg,#dbe6ec 5px,transparent 0),linear-gradient(180deg,#dbe6ec 5px,transparent 0);background-size:150px 150px;animation:gridDrift 16s linear infinite}.splash,.splash-content{position:relative;display:flex}.splash-content{z-index:10;flex:1 1 0%;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1.5rem;text-align:center}.splash-title{font-size:clamp(2.25rem,9vw,4.5rem);font-weight:900;line-height:.95;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));letter-spacing:-.06em}.splash-sub{margin-top:1rem;max-width:28rem;font-size:1rem;line-height:1.5rem;line-height:1.375;--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}@media (min-width:768px){.splash-sub{font-size:1.125rem;line-height:1.75rem}}.splash-cta{margin-top:2.5rem;display:flex;width:100%;max-width:20rem;align-items:center;justify-content:center;gap:.75rem;border-radius:1rem;border-width:3px;--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1));padding:1rem 1.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:900;text-transform:uppercase;letter-spacing:.05em;--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1));--tw-shadow:5px 5px 0px 0px #000;--tw-shadow-colored:5px 5px 0px 0px var(--tw-shadow-color);transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s;transition-timing-function:cubic-bezier(0,0,.2,1)}.splash-cta,.splash-cta:active{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.splash-cta:active{--tw-translate-x:3px;--tw-translate-y:3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.splash-footer{position:relative;z-index:10;padding-left:1.5rem;padding-right:1.5rem;padding-bottom:2rem;text-align:center;font-size:.75rem;line-height:1rem;text-transform:uppercase;letter-spacing:.2em;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-balance{text-wrap:balance}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.-inset-3{inset:-.75rem}.inset-0{inset:0}.inset-x-0{left:0;right:0}.-right-1\.5{right:-.375rem}.-top-1\.5{top:-.375rem}.bottom-0{bottom:0}.bottom-6{bottom:1.5rem}.bottom-\[5\.5rem\]{bottom:5.5rem}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:.75rem}.right-0{right:0}.right-3{right:.75rem}.right-6{right:1.5rem}.right-\[4\.25rem\]{right:4.25rem}.top-0{top:0}.top-1\/2{top:50%}.top-3{top:.75rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.-mb-0\.5{margin-bottom:-.125rem}.-mt-4{margin-top:-1rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-7{margin-top:1.75rem}.mt-8{margin-top:2rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.\!grid{display:grid!important}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-\[400px\]{max-height:400px}.max-h-\[70vh\]{max-height:70vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-32{min-height:8rem}.min-h-64{min-height:16rem}.min-h-\[100dvh\]{min-height:100dvh}.min-h-\[200px\]{min-height:200px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-3{width:.75rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-\[150px\]{min-width:150px}.min-w-\[200px\]{min-width:200px}.max-w-2xl{max-width:42rem}.max-w-5xl{max-width:64rem}.max-w-\[180px\]{max-width:180px}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.translate-x-\[2px\]{--tw-translate-x:2px}.translate-x-\[2px\],.translate-x-\[3px\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[3px\]{--tw-translate-x:3px}.translate-y-\[2px\]{--tw-translate-y:2px}.translate-y-\[2px\],.translate-y-\[3px\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[3px\]{--tw-translate-y:3px}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.divide-x-2>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(2px*var(--tw-divide-x-reverse));border-left-width:calc(2px*(1 - var(--tw-divide-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(229 231 235/var(--tw-divide-opacity,1))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-wrap{text-wrap:wrap}.text-balance{text-wrap:balance}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[1\.5rem\]{border-radius:1.5rem}.rounded-\[1\.8rem\]{border-radius:1.8rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.rounded-t-\[12px\]{border-top-left-radius:12px;border-top-right-radius:12px}.border{border-width:1px}.border-2{border-width:2px}.border-\[2\.5px\]{border-width:2.5px}.border-\[2px\]{border-width:2px}.border-\[3px\]{border-width:3px}.border-\[4px\]{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-b-4{border-bottom-width:4px}.border-b-\[2px\]{border-bottom-width:2px}.border-b-\[3px\]{border-bottom-width:3px}.border-l-\[3px\]{border-left-width:3px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-2,.border-t-\[2px\]{border-top-width:2px}.border-t-\[3px\]{border-top-width:3px}.border-dashed{border-style:dashed}.border-\[\#4a154b\]{--tw-border-opacity:1;border-color:rgb(74 21 75/var(--tw-border-opacity,1))}.border-amber-400{--tw-border-opacity:1;border-color:rgb(251 191 36/var(--tw-border-opacity,1))}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.border-black\/10{border-color:rgba(0,0,0,.1)}.border-black\/30{border-color:rgba(0,0,0,.3)}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.border-green-300{--tw-border-opacity:1;border-color:rgb(134 239 172/var(--tw-border-opacity,1))}.border-red-300{--tw-border-opacity:1;border-color:rgb(252 165 165/var(--tw-border-opacity,1))}.border-red-500{--tw-border-opacity:1;border-color:rgb(239 68 68/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-white\/10{border-color:hsla(0,0%,100%,.1)}.border-white\/20{border-color:hsla(0,0%,100%,.2)}.border-white\/30{border-color:hsla(0,0%,100%,.3)}.border-yellow-300{--tw-border-opacity:1;border-color:rgb(253 224 71/var(--tw-border-opacity,1))}.bg-\[\#0039A6\]{--tw-bg-opacity:1;background-color:rgb(0 57 166/var(--tw-bg-opacity,1))}.bg-\[\#00933C\]{--tw-bg-opacity:1;background-color:rgb(0 147 60/var(--tw-bg-opacity,1))}.bg-\[\#1a1a1a\]{--tw-bg-opacity:1;background-color:rgb(26 26 26/var(--tw-bg-opacity,1))}.bg-\[\#EE352E\]{--tw-bg-opacity:1;background-color:rgb(238 53 46/var(--tw-bg-opacity,1))}.bg-\[\#FCCC0A\]{--tw-bg-opacity:1;background-color:rgb(252 204 10/var(--tw-bg-opacity,1))}.bg-\[\#FF6319\]{--tw-bg-opacity:1;background-color:rgb(255 99 25/var(--tw-bg-opacity,1))}.bg-\[\#f3f4f6\]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-\[\#f4ede4\]{--tw-bg-opacity:1;background-color:rgb(244 237 228/var(--tw-bg-opacity,1))}.bg-\[\#fbbf24\]{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.bg-\[\#fdba74\]{--tw-bg-opacity:1;background-color:rgb(253 186 116/var(--tw-bg-opacity,1))}.bg-\[\#fffbeb\]{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.bg-amber-50{--tw-bg-opacity:1;background-color:rgb(255 251 235/var(--tw-bg-opacity,1))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.bg-black\/0{background-color:transparent}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-black\/60{background-color:rgba(0,0,0,.6)}.bg-black\/80{background-color:rgba(0,0,0,.8)}.bg-current{background-color:currentColor}.bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.bg-gray-400{--tw-bg-opacity:1;background-color:rgb(156 163 175/var(--tw-bg-opacity,1))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-purple-600{--tw-bg-opacity:1;background-color:rgb(147 51 234/var(--tw-bg-opacity,1))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/10{background-color:hsla(0,0%,100%,.1)}.bg-white\/85{background-color:hsla(0,0%,100%,.85)}.bg-white\/90{background-color:hsla(0,0%,100%,.9)}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1\.5{padding:.375rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-2{padding-bottom:.5rem}.pb-28{padding-bottom:7rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-\[max\(env\(safe-area-inset-bottom\)\2c 0\.5rem\)\]{padding-bottom:max(env(safe-area-inset-bottom),.5rem)}.pl-1{padding-left:.25rem}.pl-5{padding-left:1.25rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-\[clamp\(2\.25rem\2c 9vw\2c 4\.5rem\)\]{font-size:clamp(2.25rem,9vw,4.5rem)}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[0\.95\]{line-height:.95}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.25em\]{letter-spacing:.25em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#4a154b\]{--tw-text-opacity:1;color:rgb(74 21 75/var(--tw-text-opacity,1))}.text-\[\#b45309\]{--tw-text-opacity:1;color:rgb(180 83 9/var(--tw-text-opacity,1))}.text-\[\#fbbf24\]{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-amber-600{--tw-text-opacity:1;color:rgb(217 119 6/var(--tw-text-opacity,1))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity,1))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.text-black\/60{color:rgba(0,0,0,.6)}.text-black\/70{color:rgba(0,0,0,.7)}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity,1))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-white\/50{color:hsla(0,0%,100%,.5)}.text-white\/60{color:hsla(0,0%,100%,.6)}.text-white\/70{color:hsla(0,0%,100%,.7)}.text-white\/80{color:hsla(0,0%,100%,.8)}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity,1))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-black{accent-color:#000}.opacity-0{opacity:0}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-\[0_-4px_0_0_rgba\(0\2c 0\2c 0\2c 1\)\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[0_-4px_0_0_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:0 -4px 0 0 #000;--tw-shadow-colored:0 -4px 0 0 var(--tw-shadow-color)}.shadow-\[1px_1px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color)}.shadow-\[1px_1px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\],.shadow-\[2px_2px_0_black\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[2px_2px_0_black\]{--tw-shadow:2px 2px 0 #000;--tw-shadow-colored:2px 2px 0 var(--tw-shadow-color)}.shadow-\[2px_2px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:2px 2px 0px 0px #000;--tw-shadow-colored:2px 2px 0px 0px var(--tw-shadow-color)}.shadow-\[2px_2px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\],.shadow-\[3px_3px_0_black\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[3px_3px_0_black\]{--tw-shadow:3px 3px 0 #000;--tw-shadow-colored:3px 3px 0 var(--tw-shadow-color)}.shadow-\[3px_3px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:3px 3px 0px 0px #000;--tw-shadow-colored:3px 3px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[4px_4px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[5px_5px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:5px 5px 0px 0px #000;--tw-shadow-colored:5px 5px 0px 0px var(--tw-shadow-color)}.shadow-\[5px_5px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\],.shadow-\[8px_8px_0px_\#000\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\[8px_8px_0px_\#000\]{--tw-shadow:8px 8px 0px #000;--tw-shadow-colored:8px 8px 0px var(--tw-shadow-color)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-inset{--tw-ring-inset:inset}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity,1))}.blur-sm{--tw-blur:blur(4px)}.blur-sm,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[transform\2c box-shadow\]{transition-property:transform,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-\[cubic-bezier\(0\.22\2c 1\2c 0\.36\2c 1\)\]{transition-timing-function:cubic-bezier(.22,1,.36,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}nav.pagy.series-nav{display:flex;align-items:center;gap:4px;flex-wrap:wrap}nav.pagy.series-nav a{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:34px;padding:0 10px;border:2px solid #000;font-size:.8rem;font-weight:700;line-height:1;text-decoration:none;color:#000;background:#fff;transition:background .1s;border-radius:6px}nav.pagy.series-nav a:not([aria-disabled]){cursor:pointer}nav.pagy.series-nav a:not([aria-disabled]):hover{background:#f3f4f6}nav.pagy.series-nav a[aria-current=page]{background:#000;color:#fff;border-color:#000;cursor:default}nav.pagy.series-nav a[aria-disabled=true]:not([role=separator]){color:#9ca3af;border-color:#e5e7eb;cursor:not-allowed}nav.pagy.series-nav a[role=separator]{border:none;background:transparent;color:#9ca3af;min-width:unset;padding:0 2px;cursor:default}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}.logo-float{animation:float 3.2s ease-in-out infinite}@keyframes alertPulse{0%{box-shadow:0 0 0 0 rgba(251,191,36,.7)}70%{box-shadow:0 0 0 14px rgba(251,191,36,0)}to{box-shadow:0 0 0 0 rgba(251,191,36,0)}}@keyframes popIn{0%{opacity:0;transform:scale(.85)}60%{opacity:1;transform:scale(1.04)}to{opacity:1;transform:scale(1)}}.pop-in{animation:popIn .35s cubic-bezier(.34,1.56,.64,1) both}@keyframes slideUp{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}.slide-up{animation:slideUp .45s cubic-bezier(.22,1,.36,1) both}.slide-up-1{animation:slideUp .45s cubic-bezier(.22,1,.36,1) 60ms both}.slide-up-2{animation:slideUp .45s cubic-bezier(.22,1,.36,1) .12s both}.slide-up-3{animation:slideUp .45s cubic-bezier(.22,1,.36,1) .18s both}.slide-up-4{animation:slideUp .45s cubic-bezier(.22,1,.36,1) .24s both}@keyframes slideDownOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(16px)}}.slide-down-out{animation:slideDownOut .45s cubic-bezier(.22,1,.36,1) both}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fade-in{animation:fadeIn .2s ease-out both}.fade-out{animation:fadeOut .2s ease-out both}@keyframes lineDraw{0%{transform:scaleX(0)}to{transform:scaleX(1)}}.line-draw{transform-origin:left center}.line-draw,.line-draw-r{animation:lineDraw .8s cubic-bezier(.22,1,.36,1) both}.line-draw-r{transform-origin:right center}@keyframes spinSlow{to{transform:rotate(1turn)}}.spin-slow{animation:spinSlow 12s linear infinite}@keyframes ping-soft{0%{transform:scale(1);opacity:.8}80%,to{transform:scale(2);opacity:0}}.ping-soft:after{content:"";position:absolute;inset:0;border-radius:inherit;background:inherit;animation:ping-soft 1.8s cubic-bezier(0,0,.2,1) infinite;z-index:-1}.file\:mr-3::file-selector-button{margin-right:.75rem}.file\:cursor-pointer::file-selector-button{cursor:pointer}.file\:rounded-lg::file-selector-button{border-radius:.5rem}.file\:border-0::file-selector-button{border-width:0}.file\:border-2::file-selector-button{border-width:2px}.file\:border-\[2px\]::file-selector-button{border-width:2px}.file\:border-r-2::file-selector-button{border-right-width:2px}.file\:border-black::file-selector-button{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.file\:bg-gray-100::file-selector-button{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.file\:bg-white::file-selector-button{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.file\:px-4::file-selector-button{padding-left:1rem;padding-right:1rem}.file\:py-1\.5::file-selector-button{padding-top:.375rem;padding-bottom:.375rem}.file\:py-2::file-selector-button{padding-top:.5rem;padding-bottom:.5rem}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-bold::file-selector-button{font-weight:700}.file\:text-black::file-selector-button{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.file\:transition-colors::file-selector-button{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:h-5:after{content:var(--tw-content);height:1.25rem}.after\:w-5:after{content:var(--tw-content);width:1.25rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:border:after{content:var(--tw-content);border-width:1px}.after\:border-gray-300:after{content:var(--tw-content);--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.last\:border-0:last-child{border-width:0}.last\:border-b-0:last-child{border-bottom-width:0}.hover\:border-black:hover{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity,1))}.hover\:bg-black:hover{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.hover\:bg-black\/10:hover{background-color:rgba(0,0,0,.1)}.hover\:bg-blue-50:hover{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\:bg-red-400:hover{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.hover\:bg-red-600:hover{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:bg-white\/10:hover{background-color:hsla(0,0%,100%,.1)}.hover\:bg-yellow-400:hover{--tw-bg-opacity:1;background-color:rgb(250 204 21/var(--tw-bg-opacity,1))}.hover\:bg-yellow-50:hover{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity,1))}.hover\:text-black:hover{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-75:hover{opacity:.75}.hover\:opacity-80:hover{opacity:.8}.hover\:file\:bg-gray-100::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:file\:bg-gray-200::file-selector-button:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.focus\:bg-gray-50:focus{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-\[\#fbbf24\]:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(251 191 36/var(--tw-ring-opacity,1))}.active\:translate-x-\[2px\]:active{--tw-translate-x:2px}.active\:translate-x-\[2px\]:active,.active\:translate-x-\[3px\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:translate-x-\[3px\]:active{--tw-translate-x:3px}.active\:translate-y-\[2px\]:active{--tw-translate-y:2px}.active\:translate-y-\[2px\]:active,.active\:translate-y-\[3px\]:active{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:translate-y-\[3px\]:active{--tw-translate-y:3px}.active\:bg-gray-100:active{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.active\:shadow-\[1px_1px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]:active{--tw-shadow:1px 1px 0px 0px #000;--tw-shadow-colored:1px 1px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.active\:shadow-none:active{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.group:hover .group-hover\:bg-black\/40{background-color:rgba(0,0,0,.4)}.group:hover .group-hover\:bg-black\/50{background-color:rgba(0,0,0,.5)}.group:hover .group-hover\:opacity-100{opacity:1}.peer:checked~.peer-checked\:bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity,1))}.peer:checked~.peer-checked\:after\:translate-x-full:after{content:var(--tw-content);--tw-translate-x:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.peer:checked~.peer-checked\:after\:border-white:after{content:var(--tw-content);--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.md\:h-28{height:7rem}.md\:h-40{height:10rem}.md\:w-16{width:4rem}.md\:w-40{width:10rem}.md\:w-72{width:18rem}.md\:max-w-md{max-width:28rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:rounded-2xl{border-radius:1rem}.md\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.md\:border-\[3px\]{border-width:3px}.md\:border-l-2{border-left-width:2px}.md\:border-t-0{border-top-width:0}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:text-2xl{font-size:1.5rem;line-height:2rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}.md\:text-7xl{font-size:4.5rem;line-height:1}.md\:text-lg{font-size:1.125rem;line-height:1.75rem}.md\:text-xl{font-size:1.25rem;line-height:1.75rem}.md\:shadow-\[6px_6px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:6px 6px 0px 0px #000;--tw-shadow-colored:6px 6px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}}@media (min-width:1024px){.lg\:bottom-6{bottom:1.5rem}.lg\:left-20{left:5rem}.lg\:left-6{left:1.5rem}.lg\:left-72{left:18rem}.lg\:left-auto{left:auto}.lg\:right-6{right:1.5rem}.lg\:right-auto{right:auto}.lg\:top-6{top:1.5rem}.lg\:top-auto{top:auto}.lg\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:-mt-10{margin-top:-2.5rem}.lg\:ml-72{margin-left:18rem}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-80{width:20rem}.lg\:max-w-md{max-width:28rem}.lg\:max-w-none{max-width:none}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:rounded-2xl{border-radius:1rem}.lg\:border-\[3px\]{border-width:3px}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pb-3{padding-bottom:.75rem}.lg\:pt-10{padding-top:2.5rem}.lg\:pt-4{padding-top:1rem}.lg\:shadow-\[4px_4px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]{--tw-shadow:4px 4px 0px 0px #000;--tw-shadow-colored:4px 4px 0px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}} \ No newline at end of file +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +/* + ! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com + */ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Inter, system-ui, -apple-system, sans-serif; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden]:where(:not([hidden="until-found"])) { + display: none; +} + +html, body { + font-family: 'Inter', 'Helvetica Neue', Helvetica, system-ui, -apple-system, sans-serif; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: transparent; +} + +body { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); + overscroll-behavior-y: none; +} + +h1 { + font-size: 1.875rem; + line-height: 2.25rem; + font-weight: 900; + letter-spacing: -0.025em; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + h1 { + font-size: 2.25rem; + line-height: 2.5rem; + } +} + +h2 { + font-size: 1.5rem; + line-height: 2rem; + font-weight: 900; + letter-spacing: -0.025em; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + h2 { + font-size: 1.875rem; + line-height: 2.25rem; + } +} + +h3 { + font-size: 1.125rem; + line-height: 1.75rem; + font-weight: 700; + letter-spacing: -0.025em; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + h3 { + font-size: 1.25rem; + line-height: 1.75rem; + } +} + +p { + line-height: 1.625; + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity, 1)); +} + +/* Buttons feel like they get pressed */ + +button, [role="button"], a.btn-game, .btn-game { + touch-action: manipulation; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +/* ────────────────────────────────────────── + METRO / MAP LINE COLORS (used as accents) + ────────────────────────────────────────── */ + +.subway-blue { + --tw-bg-opacity: 1; + background-color: rgb(0 57 166 / var(--tw-bg-opacity, 1)); +} + +.subway-orange { + --tw-bg-opacity: 1; + background-color: rgb(255 99 25 / var(--tw-bg-opacity, 1)); +} + +.subway-red { + --tw-bg-opacity: 1; + background-color: rgb(238 53 46 / var(--tw-bg-opacity, 1)); +} + +.subway-green { + --tw-bg-opacity: 1; + background-color: rgb(0 147 60 / var(--tw-bg-opacity, 1)); +} + +.subway-yellow { + --tw-bg-opacity: 1; + background-color: rgb(252 204 10 / var(--tw-bg-opacity, 1)); +} + +/* ────────────────────────────────────────── + NEO CARDS — flat, hard borders, hard shadow + ────────────────────────────────────────── */ + +.neo-card { + border-radius: 1rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + padding: 1.25rem; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.neo-card-yellow { + border-radius: 1rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + padding: 1.25rem; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.neo-card-dark { + border-radius: 1rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); + padding: 1.25rem; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.neo-card-flush { + overflow: hidden; + border-radius: 1rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +/* ────────────────────────────────────────── + GAME BUTTONS — pressable, springy + ────────────────────────────────────────── */ + +.btn-game { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: 0.75rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.btn-game:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + + a.btn-game-primary,.btn-game-primary { + touch-action: manipulation; +} + +.btn-game-primary { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: 0.75rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.btn-game-primary:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-game-primary { + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + + a.btn-game-dark,.btn-game-dark { + touch-action: manipulation; +} + +.btn-game-dark { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: 0.75rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.btn-game-dark:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-game-dark { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + + a.btn-game-ghost,.btn-game-ghost { + touch-action: manipulation; +} + +.btn-game-ghost { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: 0.75rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.btn-game-ghost:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-game-ghost { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +/* Legacy buttons still used in admin */ + + a.btn-primary,.btn-primary { + touch-action: manipulation; +} + +.btn-primary { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: 0.75rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.btn-primary:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-primary { + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; +} + + a.btn-secondary,.btn-secondary { + touch-action: manipulation; +} + +.btn-secondary { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: 0.75rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.btn-secondary:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-secondary { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; +} + + a.btn-dark,.btn-dark { + touch-action: manipulation; +} + +.btn-dark { + display: inline-flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + gap: 0.5rem; + border-radius: 0.75rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; + font-weight: 700; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.btn-dark:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.btn-dark { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; +} + +/* ────────────────────────────────────────── + PILLS / BADGES + ────────────────────────────────────────── */ + +.pill { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; +} + +.pill-yellow { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.pill-dark { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.pill-green { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(52 211 153 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.pill-red { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.pill-gray { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.pill-purple { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(147 51 234 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +/* Legacy aliases */ + +.badge-team { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.badge-role { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; +} + +.badge-role-admin { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.badge-role-user { + display: inline-flex; + align-items: center; + gap: 0.375rem; + border-radius: 9999px; + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.25rem; + padding-bottom: 0.25rem; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +/* ────────────────────────────────────────── + APP SHELL — bottom tab bar (mobile) + sidebar (desktop) + ────────────────────────────────────────── */ + +.app-shell { + min-height: 100vh; + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +/* Top bar (mobile) */ + +.mobile-topbar { + position: sticky; + top: 0px; + z-index: 40; + display: flex; + height: 3.5rem; + align-items: center; + justify-content: space-between; + border-bottom-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + padding-left: 1rem; + padding-right: 1rem; +} + +@media (min-width: 1024px) { + .mobile-topbar { + display: none; + } +} + +/* Floating variant — sits on top of fullscreen content (e.g. map) */ + +.mobile-topbar-floating { + position: fixed; + left: 0px; + right: 0px; + top: 0px; + border-bottom-width: 0px; + background-color: rgb(255 255 255 / 0.85); + --tw-backdrop-blur: blur(12px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + /* keep the hard edge as a thin black rule */ + box-shadow: 0 3px 0 0 rgba(0,0,0,1); +} + +/* Bottom tab bar (mobile) */ + +.tab-bar { + position: fixed; + left: 0px; + right: 0px; + bottom: 0px; + z-index: 40; + display: flex; + align-items: stretch; + justify-content: space-around; + gap: 0.5rem; + border-top-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-bottom: max(env(safe-area-inset-bottom), 0.5rem); + padding-top: 0.5rem; +} + +@media (min-width: 1024px) { + .tab-bar { + display: none; + } +} + +.tab-bar-floating { + background-color: rgb(255 255 255 / 0.85); + --tw-backdrop-blur: blur(12px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.tab-item { + display: flex; + flex: 1 1 0%; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.125rem; + border-radius: 0.75rem; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 10px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.tab-item:active { + --tw-scale-x: .95; + --tw-scale-y: .95; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.tab-item .tab-icon { + height: 1.5rem; + width: 1.5rem; +} + +.tab-item.active { + border-width: 2px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); + --tw-shadow: 2px 2px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 2px 2px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +/* Desktop sidebar */ + +.desktop-sidebar { + position: fixed; + left: 0px; + top: 0px; + bottom: 0px; + z-index: 30; + display: none; + width: 18rem; + flex-direction: column; + --tw-bg-opacity: 1; + background-color: rgb(26 26 26 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 1024px) { + .desktop-sidebar { + display: flex; + } +} + +.nav-item { + display: flex; + align-items: center; + gap: 0.75rem; + border-radius: 0.75rem; + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + font-weight: 700; + color: rgb(255 255 255 / 0.8); + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.nav-item:hover { + background-color: rgb(255 255 255 / 0.1); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.nav-item.active { + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.nav-item .nav-icon { + height: 1.25rem; + width: 1.25rem; + flex-shrink: 0; +} + +/* ────────────────────────────────────────── + MAP — fullscreen Pokemon-Go style + ────────────────────────────────────────── */ + +.map-canvas { + position: absolute; + inset: 0px; + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); + isolation: isolate; + /* contain Leaflet's internal z-index stack */ +} + +/* Anchor overlays so they sit above tab bar (z-40) but below modals (z-50) */ + +.map-overlay { + pointer-events: none; + position: absolute; + z-index: 30; +} + +.map-overlay > * { + pointer-events: auto; +} + +/* Floating top alert banner — leave room for the FAB cluster on the right */ + +.map-alert { + pointer-events: none; + position: absolute; + top: 0.75rem; + left: 0.75rem; + right: 4.25rem; + z-index: 30; +} + +@media (min-width: 1024px) { + .map-alert { + top: 1.5rem; + left: 5rem; + right: auto; + max-width: 28rem; + } +} + +.map-alert { + top: max(env(safe-area-inset-top), 0.75rem); +} + +.map-alert > * { + pointer-events: auto; +} + +/* Floating action buttons (FAB cluster) — top-right on mobile, + top-left on desktop to avoid the side panel */ + +.map-fab { + pointer-events: none; + position: absolute; + top: 0.75rem; + right: 0.75rem; + z-index: 30; + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +@media (min-width: 1024px) { + .map-fab { + top: 1.5rem; + right: auto; + left: 1.5rem; + } +} + +.map-fab { + top: max(env(safe-area-inset-top), 0.75rem); +} + +.map-fab > * { + pointer-events: auto; +} + +.fab { + display: flex; + height: 2.75rem; + width: 2.75rem; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: center; + border-radius: 9999px; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + font-weight: 900; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); + --tw-shadow: 3px 3px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 3px 3px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.fab:active { + --tw-translate-x: 2px; + --tw-translate-y: 2px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +/* Map legend chip */ + +.map-legend { + position: absolute; + bottom: 5.5rem; + left: 0.75rem; + z-index: 30; + display: flex; + align-items: center; + gap: 0.75rem; + border-radius: 9999px; + border-width: 2px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + background-color: rgb(255 255 255 / 0.9); + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + font-size: 11px; + font-weight: 700; + --tw-shadow: 3px 3px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 3px 3px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + --tw-backdrop-blur: blur(12px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +@media (min-width: 1024px) { + .map-legend { + bottom: 1.5rem; + left: 1.5rem; + } +} + +/* Bottom sheet (mobile) / side panel (desktop) */ + +.map-sheet { + pointer-events: none; + position: absolute; + left: 0px; + right: 0px; + bottom: 0px; + z-index: 30; +} + +@media (min-width: 1024px) { + .map-sheet { + left: auto; + right: 1.5rem; + bottom: 1.5rem; + top: auto; + width: 20rem; + } +} + +.map-sheet-inner { + pointer-events: auto; + display: flex; + flex-direction: column; + overflow: hidden; + border-top-left-radius: 1.5rem; + border-top-right-radius: 1.5rem; + border-top-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-shadow: 0 -4px 0 0 rgba(0,0,0,1); + --tw-shadow-colored: 0 -4px 0 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 300ms; + transition-timing-function: cubic-bezier(0.22,1,0.36,1); +} + +@media (min-width: 1024px) { + .map-sheet-inner { + border-radius: 1rem; + border-width: 3px; + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } +} + +.map-sheet-inner { + /* Reserve room above the mobile tab bar */ + margin-bottom: calc(env(safe-area-inset-bottom) + 4.5rem); + /* Short by design — map should stay visible */ + max-height: 45dvh; +} + +@media (min-width: 1024px) { + .map-sheet-inner { + margin-bottom: 0; + max-height: 60vh; + height: auto; + } +} + +/* Collapsed: only the handle + header peek above the tab bar */ + +.map-sheet[data-state="collapsed"] .map-sheet-inner { + transform: translateY(calc(100% - 4.25rem)); +} + +@media (min-width: 1024px) { + .map-sheet[data-state="collapsed"] .map-sheet-inner { + transform: none; + } +} + +.map-sheet-handle { + margin-left: auto; + margin-right: auto; + margin-top: 0.625rem; + margin-bottom: 0.625rem; + height: 0.375rem; + width: 3rem; + border-radius: 9999px; + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1)); +} + +@media (min-width: 1024px) { + .map-sheet-handle { + display: none; + } +} + +.map-sheet-header { + display: flex; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + align-items: center; + justify-content: space-between; + padding-left: 1rem; + padding-right: 1rem; + padding-bottom: 0.75rem; +} + +@media (min-width: 1024px) { + .map-sheet-header { + padding-top: 1rem; + padding-bottom: 0.75rem; + } +} + +/* Inline-expanding zone row */ + +.zone-row { + position: relative; +} + +.zone-row-button { + display: flex; + width: 100%; + cursor: pointer; + align-items: center; + gap: 0.75rem; + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.zone-row-button:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.zone-row-button:active { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.zone-row.open .zone-row-button { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.zone-row-chevron { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 200ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.zone-row.open .zone-row-chevron { + transform: rotate(180deg); +} + +.zone-row-detail { + display: none; + border-top-width: 1px; + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + font-size: 0.875rem; + line-height: 1.25rem; +} + +.zone-row.open .zone-row-detail { + display: block; +} + +/* ────────────────────────────────────────── + HOME HERO — Switch / Pokemon-Go style trainer card + ────────────────────────────────────────── */ + +.home-hero { + position: relative; + margin-left: -1rem; + margin-right: -1rem; + margin-top: -1rem; + display: flex; + flex-direction: column; + overflow: hidden; + border-bottom-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); +} + +@media (min-width: 768px) { + .home-hero { + margin-left: -1.5rem; + margin-right: -1.5rem; + } +} + +@media (min-width: 1024px) { + .home-hero { + margin-left: -2.5rem; + margin-right: -2.5rem; + margin-top: -2.5rem; + } +} + +.home-hero { + height: 50dvh; + min-height: 380px; + padding: calc(env(safe-area-inset-top) + 1.5rem) 1.5rem 1.5rem; +} + +@media (min-width: 768px) { + .home-hero { + padding: 2rem; + } +} + +@media (min-width: 1024px) { + .home-hero { + border-radius: 0; + height: 420px; + min-height: 420px; + } +} + +/* Subtle metro/grid pattern in the background */ + +.hero-grid { + pointer-events: none; + position: absolute; + inset: 0px; + background-image: + linear-gradient(to right, rgba(0,0,0,0.10) 1px, transparent 1px), + linear-gradient(to bottom, rgba(0,0,0,0.10) 1px, transparent 1px); + background-size: 32px 32px; + mask-image: radial-gradient(ellipse at center, #000 30%, transparent 80%); + -webkit-mask-image: radial-gradient(ellipse at center, #000 30%, transparent 80%); +} + +.hero-eyebrow { + font-size: 10px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.25em; + color: rgb(0 0 0 / 0.6); +} + +.hero-name { + font-size: 1.875rem; + line-height: 2.25rem; + font-weight: 900; + line-height: 0.95; + letter-spacing: -0.025em; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + .hero-name { + font-size: 2.25rem; + line-height: 2.5rem; + } +} + +/* Big "trainer" avatar in the centre */ + +.hero-avatar-wrap { + position: relative; + display: inline-block; +} + +/* Decorative pulsing ring lives on the wrapper so the inner can clip */ + +.hero-avatar-wrap::before { + content: ''; + pointer-events: none; + position: absolute; + inset: -0.75rem; + border-radius: 1.8rem; + border-width: 3px; + border-color: rgb(0 0 0 / 0.3); + animation: heroPulse 2.4s ease-out infinite; +} + +.hero-avatar { + position: relative; + display: flex; + height: 8rem; + width: 8rem; + align-items: center; + justify-content: center; + overflow: hidden; + border-radius: 1.5rem; + border-width: 4px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); + font-size: 3.75rem; + line-height: 1; + font-weight: 900; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + .hero-avatar { + height: 10rem; + width: 10rem; + font-size: 4.5rem; + line-height: 1; + } +} + +.hero-avatar { + box-shadow: 6px 6px 0 0 rgba(0,0,0,0.85); +} + +.hero-avatar img { + position: absolute; + inset: 0px; + height: 100%; + width: 100%; + -o-object-fit: cover; + object-fit: cover; +} + +/* Teammate avatars fan out from behind the main hero avatar */ + +.team-row { + position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.team-row .hero-avatar-wrap { + z-index: 5; +} + +.teammate { + position: absolute; + top: 50%; + left: 50%; + height: 3.5rem; + width: 3.5rem; +} + +@media (min-width: 768px) { + .teammate { + height: 4rem; + width: 4rem; + } +} + +.teammate { + z-index: var(--tm-z, 1); + /* start point: tucked behind the main avatar */ + transform: translate(-50%, -50%) scale(0.55); + opacity: 0; + animation: teammateFanOut 600ms cubic-bezier(0.34,1.56,0.64,1) both; + animation-delay: var(--tm-delay, 0ms); + pointer-events: none; +} + +/* Inner chip handles the continuous bob — composed with the outer + fan-out because they live on different elements. */ + +.teammate-inner { + display: flex; + height: 100%; + width: 100%; + align-items: center; + justify-content: center; + overflow: hidden; + border-radius: 9999px; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + font-size: 1rem; + line-height: 1.5rem; + font-weight: 900; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + .teammate-inner { + font-size: 1.125rem; + line-height: 1.75rem; + } +} + +.teammate-inner { + box-shadow: 2px 2px 0 0 rgba(0,0,0,1); + animation: teammateBob 3.6s ease-in-out infinite; + animation-delay: var(--tm-bob-delay, 0ms); +} + +.teammate-inner img { + height: 100%; + width: 100%; + -o-object-fit: cover; + object-fit: cover; +} + +@keyframes teammateFanOut { + 0% { + transform: translate(-50%, -50%) scale(0.55); + opacity: 0; + } + + 60% { + opacity: 1; + } + + 100% { + transform: translate( + calc(-50% + var(--tm-x, 0rem)), + calc(-50% + var(--tm-y, 0rem)) + ) scale(1); + opacity: 1; + } +} + +@keyframes teammateBob { + 0%, 100% { + transform: translateY(0); + } + + 50% { + transform: translateY(-6px); + } +} + +@keyframes heroPulse { + 0% { + opacity: 0.6; + transform: scale(1); + } + + 70% { + opacity: 0; + transform: scale(1.18); + } + + 100% { + opacity: 0; + transform: scale(1.18); + } +} + +/* Trainer stats card sits at the bottom of the hero */ + +.hero-card { + position: relative; + display: flex; + align-items: stretch; + overflow: hidden; + border-radius: 1rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.hero-stat { + flex: 1 1 0%; + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.625rem; + padding-bottom: 0.625rem; + text-align: center; +} + +.hero-stat + .hero-stat { + border-left-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); +} + +.hero-stat-label { + font-size: 9px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.18em; + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +.hero-stat-value { + margin-top: 0.25rem; + font-size: 1.25rem; + line-height: 1.75rem; + font-weight: 900; + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); + line-height: 1; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + .hero-stat-value { + font-size: 1.5rem; + line-height: 2rem; + } +} + +/* ────────────────────────────────────────── + LEADERBOARD + ────────────────────────────────────────── */ + +.lb-row { + position: relative; + display: flex; + align-items: center; + gap: 0.75rem; + border-bottom-width: 2px; + border-color: rgb(0 0 0 / 0.1); + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.lb-row:last-child { + border-bottom-width: 0px; +} + +.lb-row:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.lb-row.is-you { + --tw-bg-opacity: 1; + background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); +} + +.lb-rank { + display: flex; + height: 2.25rem; + width: 2.25rem; + flex-shrink: 0; + align-items: center; + justify-content: center; + border-radius: 9999px; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + font-size: 1rem; + line-height: 1.5rem; + font-weight: 900; + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); + --tw-shadow: 2px 2px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 2px 2px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.lb-rank.lb-rank-1 { + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); +} + +.lb-rank.lb-rank-2 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); +} + +.lb-rank.lb-rank-3 { + --tw-bg-opacity: 1; + background-color: rgb(253 186 116 / var(--tw-bg-opacity, 1)); +} + +.lb-swatch { + height: 2rem; + width: 2rem; + flex-shrink: 0; + border-radius: 0.5rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-shadow: 2px 2px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 2px 2px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.lb-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 1rem; + line-height: 1.5rem; + font-weight: 900; + line-height: 1.25; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.lb-sub { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.75rem; + line-height: 1rem; + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +.lb-points { + font-size: 1.25rem; + line-height: 1.75rem; + font-weight: 900; + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); + line-height: 1; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.lb-points-suffix { + margin-top: 0.125rem; + display: block; + text-align: right; + font-size: 10px; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.18em; + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +/* ────────────────────────────────────────── + ZONE ALERT — Pokemon Go style "you're in a zone!" hero + ────────────────────────────────────────── */ + +.zone-alert { + position: relative; + overflow: hidden; + border-radius: 1rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.zone-alert-header { + position: relative; + display: flex; + align-items: center; + gap: 0.75rem; + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); + padding-left: 1.25rem; + padding-right: 1.25rem; + padding-top: 1rem; + padding-bottom: 1rem; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.alert-dot { + height: 0.75rem; + width: 0.75rem; + flex-shrink: 0; + border-radius: 9999px; + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + box-shadow: 0 0 0 0 #fbbf24; + animation: alertPulse 1.6s ease-out infinite; +} + +.alert-stripes { + background-image: repeating-linear-gradient( + 45deg, + #fbbf24 0px, #fbbf24 12px, + #000 12px, #000 24px + ); +} + +/* ────────────────────────────────────────── + METRO LINE — animated stop-dot accent + ────────────────────────────────────────── */ + +.metro-line { + position: absolute; + border-radius: 9999px; +} + +.metro-stop { + position: absolute; + border-radius: 9999px; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +/* ────────────────────────────────────────── + FORM CONTROLS + ────────────────────────────────────────── */ + +.form-label { + margin-bottom: 0.5rem; + display: block; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.form-input { + width: 100%; + border-radius: 0.5rem; + border-width: 2px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.form-input:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-opacity: 1; + --tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity, 1)); +} + +.filter-label { + margin-bottom: 0.5rem; + display: block; + font-size: 0.75rem; + line-height: 1rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.025em; + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.filter-input { + width: 100%; + border-radius: 0.5rem; + border-width: 2px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); + padding-left: 1rem; + padding-right: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.filter-input:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-opacity: 1; + --tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity, 1)); +} + +.sort-link { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.sort-link:hover { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +/* ────────────────────────────────────────── + LANDING / SPLASH SCREEN + ────────────────────────────────────────── */ + +@keyframes gridDrift { + from { + background-position: 0 0; + } + + to { + background-position: 150px 150px; + } +} + +.splash { + position: relative; + display: flex; + min-height: 100dvh; + width: 100%; + flex-direction: column; + overflow: hidden; + background-color: #E3EBEE; + background-image: + linear-gradient(to right, #DBE6EC 5px, transparent 5px), + linear-gradient(to bottom, #DBE6EC 5px, transparent 5px); + background-size: 150px 150px; + animation: gridDrift 16s linear infinite; +} + +.splash-content { + position: relative; + z-index: 10; + display: flex; + flex: 1 1 0%; + flex-direction: column; + align-items: center; + justify-content: center; + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-top: 3rem; + padding-bottom: 3rem; + text-align: center; +} + +.splash-title { + font-size: clamp(2.25rem, 9vw, 4.5rem); + font-weight: 900; + line-height: 0.95; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); + letter-spacing: -0.06em; +} + +.splash-sub { + margin-top: 1rem; + max-width: 28rem; + font-size: 1rem; + line-height: 1.5rem; + line-height: 1.375; + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +@media (min-width: 768px) { + .splash-sub { + font-size: 1.125rem; + line-height: 1.75rem; + } +} + +.splash-cta { + margin-top: 2.5rem; + display: flex; + width: 100%; + max-width: 20rem; + align-items: center; + justify-content: center; + gap: 0.75rem; + border-radius: 1rem; + border-width: 3px; + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); + padding-top: 1rem; + padding-bottom: 1rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + font-size: 1.125rem; + line-height: 1.75rem; + font-weight: 900; + text-transform: uppercase; + letter-spacing: 0.05em; + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); + --tw-shadow: 5px 5px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 5px 5px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 100ms; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.splash-cta:active { + --tw-translate-x: 3px; + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.splash-footer { + position: relative; + z-index: 10; + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-bottom: 2rem; + text-align: center; + font-size: 0.75rem; + line-height: 1rem; + text-transform: uppercase; + letter-spacing: 0.2em; + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +/* Utility */ + +.text-balance { + text-wrap: balance; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.pointer-events-auto { + pointer-events: auto; +} + +.visible { + visibility: visible; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.sticky { + position: sticky; +} + +.-inset-3 { + inset: -0.75rem; +} + +.inset-0 { + inset: 0px; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.-right-1\.5 { + right: -0.375rem; +} + +.-top-1\.5 { + top: -0.375rem; +} + +.bottom-0 { + bottom: 0px; +} + +.bottom-6 { + bottom: 1.5rem; +} + +.bottom-\[5\.5rem\] { + bottom: 5.5rem; +} + +.left-0 { + left: 0px; +} + +.left-1\/2 { + left: 50%; +} + +.left-3 { + left: 0.75rem; +} + +.right-0 { + right: 0px; +} + +.right-3 { + right: 0.75rem; +} + +.right-6 { + right: 1.5rem; +} + +.right-\[4\.25rem\] { + right: 4.25rem; +} + +.top-0 { + top: 0px; +} + +.top-1\/2 { + top: 50%; +} + +.top-3 { + top: 0.75rem; +} + +.isolate { + isolation: isolate; +} + +.z-10 { + z-index: 10; +} + +.z-30 { + z-index: 30; +} + +.z-40 { + z-index: 40; +} + +.z-50 { + z-index: 50; +} + +.-mx-4 { + margin-left: -1rem; + margin-right: -1rem; +} + +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.-mb-0\.5 { + margin-bottom: -0.125rem; +} + +.-mt-4 { + margin-top: -1rem; +} + +.mb-0\.5 { + margin-bottom: 0.125rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-10 { + margin-bottom: 2.5rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-1\.5 { + margin-left: 0.375rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.ml-auto { + margin-left: auto; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-1\.5 { + margin-top: 0.375rem; +} + +.mt-10 { + margin-top: 2.5rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-3 { + margin-top: 0.75rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-5 { + margin-top: 1.25rem; +} + +.mt-6 { + margin-top: 1.5rem; +} + +.mt-7 { + margin-top: 1.75rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.-mt-1 { + margin-top: -0.25rem; +} + +.line-clamp-2 { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.\!grid { + display: grid !important; +} + +.grid { + display: grid; +} + +.contents { + display: contents; +} + +.hidden { + display: none; +} + +.h-1\.5 { + height: 0.375rem; +} + +.h-10 { + height: 2.5rem; +} + +.h-11 { + height: 2.75rem; +} + +.h-12 { + height: 3rem; +} + +.h-14 { + height: 3.5rem; +} + +.h-16 { + height: 4rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-2\.5 { + height: 0.625rem; +} + +.h-20 { + height: 5rem; +} + +.h-24 { + height: 6rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-32 { + height: 8rem; +} + +.h-4 { + height: 1rem; +} + +.h-40 { + height: 10rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-7 { + height: 1.75rem; +} + +.h-8 { + height: 2rem; +} + +.h-9 { + height: 2.25rem; +} + +.h-full { + height: 100%; +} + +.max-h-48 { + max-height: 12rem; +} + +.max-h-64 { + max-height: 16rem; +} + +.max-h-\[400px\] { + max-height: 400px; +} + +.max-h-\[70vh\] { + max-height: 70vh; +} + +.max-h-\[85vh\] { + max-height: 85vh; +} + +.max-h-\[90vh\] { + max-height: 90vh; +} + +.min-h-0 { + min-height: 0px; +} + +.min-h-32 { + min-height: 8rem; +} + +.min-h-64 { + min-height: 16rem; +} + +.min-h-\[100dvh\] { + min-height: 100dvh; +} + +.min-h-\[200px\] { + min-height: 200px; +} + +.min-h-screen { + min-height: 100vh; +} + +.w-1\.5 { + width: 0.375rem; +} + +.w-10 { + width: 2.5rem; +} + +.w-11 { + width: 2.75rem; +} + +.w-12 { + width: 3rem; +} + +.w-14 { + width: 3.5rem; +} + +.w-16 { + width: 4rem; +} + +.w-2 { + width: 0.5rem; +} + +.w-2\.5 { + width: 0.625rem; +} + +.w-20 { + width: 5rem; +} + +.w-3 { + width: 0.75rem; +} + +.w-32 { + width: 8rem; +} + +.w-4 { + width: 1rem; +} + +.w-40 { + width: 10rem; +} + +.w-44 { + width: 11rem; +} + +.w-48 { + width: 12rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-7 { + width: 1.75rem; +} + +.w-72 { + width: 18rem; +} + +.w-8 { + width: 2rem; +} + +.w-80 { + width: 20rem; +} + +.w-9 { + width: 2.25rem; +} + +.w-auto { + width: auto; +} + +.w-full { + width: 100%; +} + +.w-24 { + width: 6rem; +} + +.w-36 { + width: 9rem; +} + +.min-w-0 { + min-width: 0px; +} + +.min-w-\[150px\] { + min-width: 150px; +} + +.min-w-\[200px\] { + min-width: 200px; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-5xl { + max-width: 64rem; +} + +.max-w-\[180px\] { + max-width: 180px; +} + +.max-w-full { + max-width: 100%; +} + +.max-w-lg { + max-width: 32rem; +} + +.max-w-md { + max-width: 28rem; +} + +.max-w-sm { + max-width: 24rem; +} + +.max-w-xl { + max-width: 36rem; +} + +.max-w-xs { + max-width: 20rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-none { + flex: none; +} + +.flex-shrink { + flex-shrink: 1; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.flex-grow { + flex-grow: 1; +} + +.translate-x-\[2px\] { + --tw-translate-x: 2px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-\[3px\] { + --tw-translate-x: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-\[2px\] { + --tw-translate-y: 2px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-\[3px\] { + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.cursor-pointer { + cursor: pointer; +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.select-all { + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; +} + +.resize-none { + resize: none; +} + +.resize-y { + resize: vertical; +} + +.resize { + resize: both; +} + +.list-inside { + list-style-position: inside; +} + +.list-disc { + list-style-type: disc; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.items-stretch { + align-items: stretch; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +.gap-0\.5 { + gap: 0.125rem; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-1\.5 { + gap: 0.375rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.divide-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-x-reverse: 0; + border-right-width: calc(2px * var(--tw-divide-x-reverse)); + border-left-width: calc(2px * calc(1 - var(--tw-divide-x-reverse))); +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-gray-100 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-divide-opacity, 1)); +} + +.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-divide-opacity, 1)); +} + +.self-center { + align-self: center; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre-line { + white-space: pre-line; +} + +.whitespace-pre-wrap { + white-space: pre-wrap; +} + +.text-wrap { + text-wrap: wrap; +} + +.text-balance { + text-wrap: balance; +} + +.break-all { + word-break: break-all; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-2xl { + border-radius: 1rem; +} + +.rounded-\[1\.5rem\] { + border-radius: 1.5rem; +} + +.rounded-\[1\.8rem\] { + border-radius: 1.8rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.rounded-t-3xl { + border-top-left-radius: 1.5rem; + border-top-right-radius: 1.5rem; +} + +.rounded-t-\[12px\] { + border-top-left-radius: 12px; + border-top-right-radius: 12px; +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-\[2\.5px\] { + border-width: 2.5px; +} + +.border-\[2px\] { + border-width: 2px; +} + +.border-\[3px\] { + border-width: 3px; +} + +.border-\[4px\] { + border-width: 4px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-b-2 { + border-bottom-width: 2px; +} + +.border-b-4 { + border-bottom-width: 4px; +} + +.border-b-\[2px\] { + border-bottom-width: 2px; +} + +.border-b-\[3px\] { + border-bottom-width: 3px; +} + +.border-l-\[3px\] { + border-left-width: 3px; +} + +.border-t { + border-top-width: 1px; +} + +.border-t-2 { + border-top-width: 2px; +} + +.border-t-\[2px\] { + border-top-width: 2px; +} + +.border-t-\[3px\] { + border-top-width: 3px; +} + +.border-r { + border-right-width: 1px; +} + +.border-dashed { + border-style: dashed; +} + +.border-\[\#4a154b\] { + --tw-border-opacity: 1; + border-color: rgb(74 21 75 / var(--tw-border-opacity, 1)); +} + +.border-black { + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); +} + +.border-black\/10 { + border-color: rgb(0 0 0 / 0.1); +} + +.border-black\/30 { + border-color: rgb(0 0 0 / 0.3); +} + +.border-blue-500 { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); +} + +.border-gray-100 { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity, 1)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity, 1)); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)); +} + +.border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity, 1)); +} + +.border-green-300 { + --tw-border-opacity: 1; + border-color: rgb(134 239 172 / var(--tw-border-opacity, 1)); +} + +.border-red-300 { + --tw-border-opacity: 1; + border-color: rgb(252 165 165 / var(--tw-border-opacity, 1)); +} + +.border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(239 68 68 / var(--tw-border-opacity, 1)); +} + +.border-transparent { + border-color: transparent; +} + +.border-white { + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity, 1)); +} + +.border-white\/10 { + border-color: rgb(255 255 255 / 0.1); +} + +.border-white\/20 { + border-color: rgb(255 255 255 / 0.2); +} + +.border-white\/30 { + border-color: rgb(255 255 255 / 0.3); +} + +.border-yellow-300 { + --tw-border-opacity: 1; + border-color: rgb(253 224 71 / var(--tw-border-opacity, 1)); +} + +.border-amber-400 { + --tw-border-opacity: 1; + border-color: rgb(251 191 36 / var(--tw-border-opacity, 1)); +} + +.border-amber-300 { + --tw-border-opacity: 1; + border-color: rgb(252 211 77 / var(--tw-border-opacity, 1)); +} + +.border-blue-300 { + --tw-border-opacity: 1; + border-color: rgb(147 197 253 / var(--tw-border-opacity, 1)); +} + +.bg-\[\#0039A6\] { + --tw-bg-opacity: 1; + background-color: rgb(0 57 166 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#00933C\] { + --tw-bg-opacity: 1; + background-color: rgb(0 147 60 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#1a1a1a\] { + --tw-bg-opacity: 1; + background-color: rgb(26 26 26 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#EE352E\] { + --tw-bg-opacity: 1; + background-color: rgb(238 53 46 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#FCCC0A\] { + --tw-bg-opacity: 1; + background-color: rgb(252 204 10 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#FF6319\] { + --tw-bg-opacity: 1; + background-color: rgb(255 99 25 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#f3f4f6\] { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#f4ede4\] { + --tw-bg-opacity: 1; + background-color: rgb(244 237 228 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#fbbf24\] { + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#fdba74\] { + --tw-bg-opacity: 1; + background-color: rgb(253 186 116 / var(--tw-bg-opacity, 1)); +} + +.bg-\[\#fffbeb\] { + --tw-bg-opacity: 1; + background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); +} + +.bg-black\/0 { + background-color: rgb(0 0 0 / 0); +} + +.bg-black\/50 { + background-color: rgb(0 0 0 / 0.5); +} + +.bg-black\/60 { + background-color: rgb(0 0 0 / 0.6); +} + +.bg-black\/80 { + background-color: rgb(0 0 0 / 0.8); +} + +.bg-current { + background-color: currentColor; +} + +.bg-emerald-400 { + --tw-bg-opacity: 1; + background-color: rgb(52 211 153 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-300 { + --tw-bg-opacity: 1; + background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-600 { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity, 1)); +} + +.bg-gray-950 { + --tw-bg-opacity: 1; + background-color: rgb(3 7 18 / var(--tw-bg-opacity, 1)); +} + +.bg-green-100 { + --tw-bg-opacity: 1; + background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1)); +} + +.bg-purple-600 { + --tw-bg-opacity: 1; + background-color: rgb(147 51 234 / var(--tw-bg-opacity, 1)); +} + +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1)); +} + +.bg-red-50 { + --tw-bg-opacity: 1; + background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1)); +} + +.bg-red-500 { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); +} + +.bg-red-600 { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.bg-white\/10 { + background-color: rgb(255 255 255 / 0.1); +} + +.bg-white\/85 { + background-color: rgb(255 255 255 / 0.85); +} + +.bg-white\/90 { + background-color: rgb(255 255 255 / 0.9); +} + +.bg-yellow-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 249 195 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-400 { + --tw-bg-opacity: 1; + background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-50 { + --tw-bg-opacity: 1; + background-color: rgb(255 251 235 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-500 { + --tw-bg-opacity: 1; + background-color: rgb(245 158 11 / var(--tw-bg-opacity, 1)); +} + +.bg-amber-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 243 199 / var(--tw-bg-opacity, 1)); +} + +.bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity, 1)); +} + +.object-contain { + -o-object-fit: contain; + object-fit: contain; +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-1\.5 { + padding: 0.375rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-5 { + padding: 1.25rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-1\.5 { + padding-left: 0.375rem; + padding-right: 0.375rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-10 { + padding-top: 2.5rem; + padding-bottom: 2.5rem; +} + +.py-12 { + padding-top: 3rem; + padding-bottom: 3rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-2\.5 { + padding-top: 0.625rem; + padding-bottom: 0.625rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.pb-10 { + padding-bottom: 2.5rem; +} + +.pb-2 { + padding-bottom: 0.5rem; +} + +.pb-28 { + padding-bottom: 7rem; +} + +.pb-3 { + padding-bottom: 0.75rem; +} + +.pb-6 { + padding-bottom: 1.5rem; +} + +.pb-8 { + padding-bottom: 2rem; +} + +.pb-\[max\(env\(safe-area-inset-bottom\)\2c 0\.5rem\)\] { + padding-bottom: max(env(safe-area-inset-bottom), 0.5rem); +} + +.pl-1 { + padding-left: 0.25rem; +} + +.pl-5 { + padding-left: 1.25rem; +} + +.pr-3 { + padding-right: 0.75rem; +} + +.pr-4 { + padding-right: 1rem; +} + +.pt-0 { + padding-top: 0px; +} + +.pt-0\.5 { + padding-top: 0.125rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-3 { + padding-top: 0.75rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-8 { + padding-top: 2rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.align-top { + vertical-align: top; +} + +.font-mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.text-6xl { + font-size: 3.75rem; + line-height: 1; +} + +.text-\[10px\] { + font-size: 10px; +} + +.text-\[11px\] { + font-size: 11px; +} + +.text-\[9px\] { + font-size: 9px; +} + +.text-\[clamp\(2\.25rem\2c 9vw\2c 4\.5rem\)\] { + font-size: clamp(2.25rem, 9vw, 4.5rem); +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-black { + font-weight: 900; +} + +.font-bold { + font-weight: 700; +} + +.font-light { + font-weight: 300; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.capitalize { + text-transform: capitalize; +} + +.italic { + font-style: italic; +} + +.tabular-nums { + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); +} + +.leading-\[0\.95\] { + line-height: 0.95; +} + +.leading-none { + line-height: 1; +} + +.leading-relaxed { + line-height: 1.625; +} + +.leading-snug { + line-height: 1.375; +} + +.leading-tight { + line-height: 1.25; +} + +.tracking-\[0\.18em\] { + letter-spacing: 0.18em; +} + +.tracking-\[0\.25em\] { + letter-spacing: 0.25em; +} + +.tracking-\[0\.2em\] { + letter-spacing: 0.2em; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.tracking-wide { + letter-spacing: 0.025em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.tracking-widest { + letter-spacing: 0.1em; +} + +.text-\[\#4a154b\] { + --tw-text-opacity: 1; + color: rgb(74 21 75 / var(--tw-text-opacity, 1)); +} + +.text-\[\#b45309\] { + --tw-text-opacity: 1; + color: rgb(180 83 9 / var(--tw-text-opacity, 1)); +} + +.text-\[\#fbbf24\] { + --tw-text-opacity: 1; + color: rgb(251 191 36 / var(--tw-text-opacity, 1)); +} + +.text-amber-600 { + --tw-text-opacity: 1; + color: rgb(217 119 6 / var(--tw-text-opacity, 1)); +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.text-black\/60 { + color: rgb(0 0 0 / 0.6); +} + +.text-black\/70 { + color: rgb(0 0 0 / 0.7); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity, 1)); +} + +.text-emerald-700 { + --tw-text-opacity: 1; + color: rgb(4 120 87 / var(--tw-text-opacity, 1)); +} + +.text-gray-300 { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity, 1)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity, 1)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); +} + +.text-gray-600 { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity, 1)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity, 1)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity, 1)); +} + +.text-green-700 { + --tw-text-opacity: 1; + color: rgb(21 128 61 / var(--tw-text-opacity, 1)); +} + +.text-green-800 { + --tw-text-opacity: 1; + color: rgb(22 101 52 / var(--tw-text-opacity, 1)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity, 1)); +} + +.text-red-600 { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity, 1)); +} + +.text-red-700 { + --tw-text-opacity: 1; + color: rgb(185 28 28 / var(--tw-text-opacity, 1)); +} + +.text-red-800 { + --tw-text-opacity: 1; + color: rgb(153 27 27 / var(--tw-text-opacity, 1)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.text-white\/50 { + color: rgb(255 255 255 / 0.5); +} + +.text-white\/60 { + color: rgb(255 255 255 / 0.6); +} + +.text-white\/70 { + color: rgb(255 255 255 / 0.7); +} + +.text-white\/80 { + color: rgb(255 255 255 / 0.8); +} + +.text-yellow-400 { + --tw-text-opacity: 1; + color: rgb(250 204 21 / var(--tw-text-opacity, 1)); +} + +.text-yellow-600 { + --tw-text-opacity: 1; + color: rgb(202 138 4 / var(--tw-text-opacity, 1)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity, 1)); +} + +.text-amber-800 { + --tw-text-opacity: 1; + color: rgb(146 64 14 / var(--tw-text-opacity, 1)); +} + +.text-amber-700 { + --tw-text-opacity: 1; + color: rgb(180 83 9 / var(--tw-text-opacity, 1)); +} + +.text-blue-800 { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity, 1)); +} + +.underline { + text-decoration-line: underline; +} + +.line-through { + text-decoration-line: line-through; +} + +.underline-offset-2 { + text-underline-offset: 2px; +} + +.antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.accent-black { + accent-color: #000; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-60 { + opacity: 0.6; +} + +.opacity-70 { + opacity: 0.7; +} + +.opacity-80 { + opacity: 0.8; +} + +.opacity-90 { + opacity: 0.9; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[0_-4px_0_0_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 0 -4px 0 0 rgba(0,0,0,1); + --tw-shadow-colored: 0 -4px 0 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[1px_1px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[2px_2px_0_black\] { + --tw-shadow: 2px 2px 0 black; + --tw-shadow-colored: 2px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[2px_2px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 2px 2px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 2px 2px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[3px_3px_0_black\] { + --tw-shadow: 3px 3px 0 black; + --tw-shadow-colored: 3px 3px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[3px_3px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 3px 3px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 3px 3px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[4px_4px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[5px_5px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 5px 5px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 5px 5px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[8px_8px_0px_\#000\] { + --tw-shadow: 8px 8px 0px #000; + --tw-shadow-colored: 8px 8px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline { + outline-style: solid; +} + +.ring { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-2 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-inset { + --tw-ring-inset: inset; +} + +.ring-black { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1)); +} + +.blur-sm { + --tw-blur: blur(4px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.backdrop-blur-md { + --tw-backdrop-blur: blur(12px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.backdrop-blur-sm { + --tw-backdrop-blur: blur(4px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-\[transform\2c box-shadow\] { + transition-property: transform,box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-100 { + transition-duration: 100ms; +} + +.duration-200 { + transition-duration: 200ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.duration-500 { + transition-duration: 500ms; +} + +.ease-\[cubic-bezier\(0\.22\2c 1\2c 0\.36\2c 1\)\] { + transition-timing-function: cubic-bezier(0.22,1,0.36,1); +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +/* ────────────────────────────────────────── + PAGY PAGINATION + ────────────────────────────────────────── */ + +nav.pagy.series-nav { + display: flex; + align-items: center; + gap: 4px; + flex-wrap: wrap; +} + +nav.pagy.series-nav a { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 34px; + height: 34px; + padding: 0 10px; + border: 2px solid black; + font-size: 0.8rem; + font-weight: 700; + line-height: 1; + text-decoration: none; + color: black; + background: white; + transition: background 0.1s; + border-radius: 6px; +} + +nav.pagy.series-nav a:not([aria-disabled]) { + cursor: pointer; +} + +nav.pagy.series-nav a:not([aria-disabled]):hover { + background: #f3f4f6; +} + +nav.pagy.series-nav a[aria-current="page"] { + background: black; + color: white; + border-color: black; + cursor: default; +} + +nav.pagy.series-nav a[aria-disabled="true"]:not([role="separator"]) { + color: #9ca3af; + border-color: #e5e7eb; + cursor: not-allowed; +} + +nav.pagy.series-nav a[role="separator"] { + border: none; + background: transparent; + color: #9ca3af; + min-width: unset; + padding: 0 2px; + cursor: default; +} + +/* ────────────────────────────────────────── + ANIMATIONS — snappy, springy, game-like + ────────────────────────────────────────── */ + +@keyframes float { + 0%, 100% { + transform: translateY(0); + } + + 50% { + transform: translateY(-8px); + } +} + +.logo-float { + animation: float 3.2s ease-in-out infinite; +} + +@keyframes alertPulse { + 0% { + box-shadow: 0 0 0 0 rgba(251,191,36,0.7); + } + + 70% { + box-shadow: 0 0 0 14px rgba(251,191,36,0); + } + + 100% { + box-shadow: 0 0 0 0 rgba(251,191,36,0); + } +} + +@keyframes popIn { + 0% { + opacity: 0; + transform: scale(0.85); + } + + 60% { + opacity: 1; + transform: scale(1.04); + } + + 100% { + opacity: 1; + transform: scale(1); + } +} + +.pop-in { + animation: popIn 350ms cubic-bezier(0.34,1.56,0.64,1) both; +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(16px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.slide-up { + animation: slideUp 450ms cubic-bezier(0.22,1,0.36,1) both; +} + +.slide-up-1 { + animation: slideUp 450ms cubic-bezier(0.22,1,0.36,1) 60ms both; +} + +.slide-up-2 { + animation: slideUp 450ms cubic-bezier(0.22,1,0.36,1) 120ms both; +} + +.slide-up-3 { + animation: slideUp 450ms cubic-bezier(0.22,1,0.36,1) 180ms both; +} + +.slide-up-4 { + animation: slideUp 450ms cubic-bezier(0.22,1,0.36,1) 240ms both; +} + +/* Exit animations — keyframes reversed, easing and duration kept + identical to the entrance so the close feels just as snappy. */ + +@keyframes slideDownOut { + from { + opacity: 1; + transform: translateY(0); + } + + to { + opacity: 0; + transform: translateY(16px); + } +} + +.slide-down-out { + animation: slideDownOut 450ms cubic-bezier(0.22,1,0.36,1) both; +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fade-in { + animation: fadeIn 200ms ease-out both; +} + +.fade-out { + animation: fadeOut 200ms ease-out both; +} + +@keyframes lineDraw { + from { + transform: scaleX(0); + } + + to { + transform: scaleX(1); + } +} + +.line-draw { + transform-origin: left center; + animation: lineDraw 800ms cubic-bezier(0.22,1,0.36,1) both; +} + +.line-draw-r { + transform-origin: right center; + animation: lineDraw 800ms cubic-bezier(0.22,1,0.36,1) both; +} + +@keyframes spinSlow { + to { + transform: rotate(360deg); + } +} + +.spin-slow { + animation: spinSlow 12s linear infinite; +} + +@keyframes ping-soft { + 0% { + transform: scale(1); + opacity: 0.8; + } + + 80%, 100% { + transform: scale(2); + opacity: 0; + } +} + +.ping-soft::after { + content: ''; + position: absolute; + inset: 0; + border-radius: inherit; + background: inherit; + animation: ping-soft 1.8s cubic-bezier(0,0,0.2,1) infinite; + z-index: -1; +} + +.file\:mr-3::file-selector-button { + margin-right: 0.75rem; +} + +.file\:cursor-pointer::file-selector-button { + cursor: pointer; +} + +.file\:rounded-lg::file-selector-button { + border-radius: 0.5rem; +} + +.file\:border-0::file-selector-button { + border-width: 0px; +} + +.file\:border-2::file-selector-button { + border-width: 2px; +} + +.file\:border-\[2px\]::file-selector-button { + border-width: 2px; +} + +.file\:border-r-2::file-selector-button { + border-right-width: 2px; +} + +.file\:border-black::file-selector-button { + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); +} + +.file\:bg-gray-100::file-selector-button { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.file\:bg-white::file-selector-button { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.file\:px-4::file-selector-button { + padding-left: 1rem; + padding-right: 1rem; +} + +.file\:py-1\.5::file-selector-button { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.file\:py-2::file-selector-button { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.file\:text-sm::file-selector-button { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.file\:font-bold::file-selector-button { + font-weight: 700; +} + +.file\:text-black::file-selector-button { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.file\:transition-colors::file-selector-button { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.after\:absolute::after { + content: var(--tw-content); + position: absolute; +} + +.after\:left-\[2px\]::after { + content: var(--tw-content); + left: 2px; +} + +.after\:top-\[2px\]::after { + content: var(--tw-content); + top: 2px; +} + +.after\:h-5::after { + content: var(--tw-content); + height: 1.25rem; +} + +.after\:w-5::after { + content: var(--tw-content); + width: 1.25rem; +} + +.after\:rounded-full::after { + content: var(--tw-content); + border-radius: 9999px; +} + +.after\:border::after { + content: var(--tw-content); + border-width: 1px; +} + +.after\:border-gray-300::after { + content: var(--tw-content); + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)); +} + +.after\:bg-white::after { + content: var(--tw-content); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.after\:transition-all::after { + content: var(--tw-content); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.after\:content-\[\'\'\]::after { + --tw-content: ''; + content: var(--tw-content); +} + +.last\:border-0:last-child { + border-width: 0px; +} + +.last\:border-b-0:last-child { + border-bottom-width: 0px; +} + +.hover\:border-black:hover { + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity, 1)); +} + +.hover\:bg-black:hover { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-black\/10:hover { + background-color: rgb(0 0 0 / 0.1); +} + +.hover\:bg-blue-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(239 246 255 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-gray-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-red-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(248 113 113 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-red-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-white\/10:hover { + background-color: rgb(255 255 255 / 0.1); +} + +.hover\:bg-yellow-400:hover { + --tw-bg-opacity: 1; + background-color: rgb(250 204 21 / var(--tw-bg-opacity, 1)); +} + +.hover\:bg-yellow-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(254 252 232 / var(--tw-bg-opacity, 1)); +} + +.hover\:text-black:hover { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity, 1)); +} + +.hover\:text-gray-600:hover { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity, 1)); +} + +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.hover\:no-underline:hover { + text-decoration-line: none; +} + +.hover\:opacity-100:hover { + opacity: 1; +} + +.hover\:opacity-75:hover { + opacity: 0.75; +} + +.hover\:opacity-80:hover { + opacity: 0.8; +} + +.hover\:file\:bg-gray-100::file-selector-button:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.hover\:file\:bg-gray-200::file-selector-button:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity, 1)); +} + +.focus\:bg-gray-50:focus { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)); +} + +.focus\:bg-white:focus { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-\[\#fbbf24\]:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(251 191 36 / var(--tw-ring-opacity, 1)); +} + +.active\:translate-x-\[2px\]:active { + --tw-translate-x: 2px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.active\:translate-x-\[3px\]:active { + --tw-translate-x: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.active\:translate-y-\[2px\]:active { + --tw-translate-y: 2px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.active\:translate-y-\[3px\]:active { + --tw-translate-y: 3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.active\:bg-gray-100:active { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity, 1)); +} + +.active\:shadow-\[1px_1px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\]:active { + --tw-shadow: 1px 1px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 1px 1px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.active\:shadow-none:active { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.disabled\:cursor-not-allowed:disabled { + cursor: not-allowed; +} + +.disabled\:opacity-30:disabled { + opacity: 0.3; +} + +.group:hover .group-hover\:bg-black\/40 { + background-color: rgb(0 0 0 / 0.4); +} + +.group:hover .group-hover\:bg-black\/50 { + background-color: rgb(0 0 0 / 0.5); +} + +.group:hover .group-hover\:opacity-100 { + opacity: 1; +} + +.peer:checked ~ .peer-checked\:bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); +} + +.peer:checked ~ .peer-checked\:after\:translate-x-full::after { + content: var(--tw-content); + --tw-translate-x: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.peer:checked ~ .peer-checked\:after\:border-white::after { + content: var(--tw-content); + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity, 1)); +} + +.peer:focus ~ .peer-focus\:outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +@media (min-width: 768px) { + .md\:col-span-2 { + grid-column: span 2 / span 2; + } + + .md\:-mx-6 { + margin-left: -1.5rem; + margin-right: -1.5rem; + } + + .md\:h-28 { + height: 7rem; + } + + .md\:h-40 { + height: 10rem; + } + + .md\:w-16 { + width: 4rem; + } + + .md\:w-40 { + width: 10rem; + } + + .md\:w-72 { + width: 18rem; + } + + .md\:max-w-md { + max-width: 28rem; + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .md\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:items-center { + align-items: center; + } + + .md\:rounded-2xl { + border-radius: 1rem; + } + + .md\:rounded-t-2xl { + border-top-left-radius: 1rem; + border-top-right-radius: 1rem; + } + + .md\:border-\[3px\] { + border-width: 3px; + } + + .md\:border-l-2 { + border-left-width: 2px; + } + + .md\:border-t-0 { + border-top-width: 0px; + } + + .md\:px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + + .md\:text-2xl { + font-size: 1.5rem; + line-height: 2rem; + } + + .md\:text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; + } + + .md\:text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; + } + + .md\:text-7xl { + font-size: 4.5rem; + line-height: 1; + } + + .md\:text-lg { + font-size: 1.125rem; + line-height: 1.75rem; + } + + .md\:text-xl { + font-size: 1.25rem; + line-height: 1.75rem; + } + + .md\:shadow-\[6px_6px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 6px 6px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 6px 6px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } +} + +@media (min-width: 1024px) { + .lg\:bottom-6 { + bottom: 1.5rem; + } + + .lg\:left-20 { + left: 5rem; + } + + .lg\:left-6 { + left: 1.5rem; + } + + .lg\:left-72 { + left: 18rem; + } + + .lg\:left-auto { + left: auto; + } + + .lg\:right-6 { + right: 1.5rem; + } + + .lg\:right-auto { + right: auto; + } + + .lg\:top-6 { + top: 1.5rem; + } + + .lg\:top-auto { + top: auto; + } + + .lg\:-mx-10 { + margin-left: -2.5rem; + margin-right: -2.5rem; + } + + .lg\:mx-0 { + margin-left: 0px; + margin-right: 0px; + } + + .lg\:-mt-10 { + margin-top: -2.5rem; + } + + .lg\:ml-72 { + margin-left: 18rem; + } + + .lg\:flex { + display: flex; + } + + .lg\:hidden { + display: none; + } + + .lg\:w-80 { + width: 20rem; + } + + .lg\:max-w-md { + max-width: 28rem; + } + + .lg\:max-w-none { + max-width: none; + } + + .lg\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .lg\:rounded-2xl { + border-radius: 1rem; + } + + .lg\:border-\[3px\] { + border-width: 3px; + } + + .lg\:px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; + } + + .lg\:pb-12 { + padding-bottom: 3rem; + } + + .lg\:pb-3 { + padding-bottom: 0.75rem; + } + + .lg\:pt-10 { + padding-top: 2.5rem; + } + + .lg\:pt-4 { + padding-top: 1rem; + } + + .lg\:shadow-\[4px_4px_0px_0px_rgba\(0\2c 0\2c 0\2c 1\)\] { + --tw-shadow: 4px 4px 0px 0px rgba(0,0,0,1); + --tw-shadow-colored: 4px 4px 0px 0px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } +} + +@media (min-width: 1280px) { + .xl\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} diff --git a/app/controllers/admin/airtag_logs_controller.rb b/app/controllers/admin/airtag_logs_controller.rb index aad4fa7..82985b0 100644 --- a/app/controllers/admin/airtag_logs_controller.rb +++ b/app/controllers/admin/airtag_logs_controller.rb @@ -1,8 +1,19 @@ class Admin::AirtagLogsController < Admin::BaseController def index @logs = AirtagApiLog.order(fetched_at: :desc).limit(500).to_a - @next_refresh_at = @logs.first&.fetched_at&.+ 5.minutes + last_full_fetch = AirtagApiLog.where(slug: nil).order(fetched_at: :desc).first + @next_refresh_at = last_full_fetch&.fetched_at&.+ 5.minutes @airtag_ping_count = LocationPing.airtag.count + + teams = Team.where.not(airtag_slug: [ nil, "" ]).includes(:house).index_by(&:id) + last_pinged_at_by_team = LocationPing.airtag + .where(team_id: teams.keys) + .group(:team_id) + .maximum(:pinged_at) + + @last_detections = teams.map do |id, team| + { team: team, last_ping: last_pinged_at_by_team[id] } + end.sort_by { |h| h[:last_ping] || Time.at(0) }.reverse end def refresh diff --git a/app/controllers/admin/teams_controller.rb b/app/controllers/admin/teams_controller.rb index c951827..a642c12 100644 --- a/app/controllers/admin/teams_controller.rb +++ b/app/controllers/admin/teams_controller.rb @@ -1,5 +1,5 @@ class Admin::TeamsController < Admin::BaseController - before_action :set_team, only: [ :show, :edit, :update, :destroy ] + before_action :set_team, only: [ :show, :edit, :update, :destroy, :refresh_airtag ] before_action :load_form_data, only: [ :new, :edit, :create, :update ] def index @@ -66,6 +66,19 @@ def update end end + def refresh_airtag + unless @team.airtag_slug.present? + return redirect_to admin_team_path(@team), alert: "This team has no AirTag slug configured." + end + + result = MapDataService.new.fetch_device(@team.airtag_slug) + if result + redirect_to admin_team_path(@team), notice: "AirTag refreshed (#{result.length} ping(s) received)." + else + redirect_to admin_team_path(@team), alert: "AirTag refresh failed — check AirTag logs for details." + end + end + def destroy @team.destroy redirect_to admin_teams_path, notice: "Team deleted." diff --git a/app/models/airtag_api_log.rb b/app/models/airtag_api_log.rb index 5ed4e04..c5bb97b 100644 --- a/app/models/airtag_api_log.rb +++ b/app/models/airtag_api_log.rb @@ -7,6 +7,7 @@ # fetched_at :datetime not null # location_count :integer default(0), not null # response_body :text +# slug :string # success :boolean default(TRUE), not null # created_at :datetime not null # updated_at :datetime not null diff --git a/app/services/map_data_service.rb b/app/services/map_data_service.rb index 5a96706..cf16106 100644 --- a/app/services/map_data_service.rb +++ b/app/services/map_data_service.rb @@ -28,6 +28,22 @@ def force_fetch end end + def fetch_device(slug) + fetched_at = Time.current + response = @conn.get("/devices/#{slug}") + location = response.body + locations = location.is_a?(Array) ? location : [ location ] + persist_pings(locations) + AirtagApiLog.create(fetched_at:, slug:, response_body: locations.to_json, location_count: locations.length, success: true) + locations + rescue Faraday::TimeoutError => e + AirtagApiLog.create(fetched_at: Time.current, slug:, response_body: { error: e.class, message: e.message }.to_json, location_count: 0, success: false) + nil + rescue Faraday::Error => e + AirtagApiLog.create(fetched_at: Time.current, slug:, response_body: { error: e.class, message: e.message }.to_json, location_count: 0, success: false) + nil + end + private def fetch_from_api diff --git a/app/views/admin/airtag_logs/index.html.erb b/app/views/admin/airtag_logs/index.html.erb index 53baa74..bf59180 100644 --- a/app/views/admin/airtag_logs/index.html.erb +++ b/app/views/admin/airtag_logs/index.html.erb @@ -8,6 +8,39 @@ <%= render 'admin/nav' %> +<% if @last_detections.any? %> +
Last AirTag Detection per Team
+ <%= @last_detections.count %> tagged teams +Next Refresh
@@ -46,6 +79,7 @@