@local-civics/mgmt-ui 0.1.221 → 0.1.223

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,8 +4,8 @@ var React = require('react');
4
4
  var icons = require('@tabler/icons');
5
5
  var core = require('@mantine/core');
6
6
  var reactRouterDom = require('react-router-dom');
7
- var notifications = require('@mantine/notifications');
8
7
  require('external-svg-loader');
8
+ var notifications = require('@mantine/notifications');
9
9
  var dropzone = require('@mantine/dropzone');
10
10
  var form = require('@mantine/form');
11
11
  var papa = require('papaparse');
@@ -60,7 +60,7 @@ function styleInject(css, ref) {
60
60
  }
61
61
  }
62
62
 
63
- var css_248z = "@font-face{font-family:ProximaNova;src:url(https://cdn.localcivics.io/fonts/ProximaNova.otf) format(\"opentype\")}@font-face{font-family:ProximaNova;font-weight:700;src:url(https://cdn.localcivics.io/fonts/ProximaNovaBold.otf) format(\"opentype\")}*,: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-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: }::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-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: }.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.\\!relative{position:relative!important}.left-3{left:.75rem}.top-1\\/2{top:50%}.left-3\\.5{left:.875rem}.bottom-\\[-20px\\]{bottom:-20px}.left-1\\/2{left:50%}.m-3{margin:.75rem}.mt-0\\.5{margin-top:.125rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.mt-2{margin-top:.5rem}.mt-1\\.5{margin-top:.375rem}.-ml-2{margin-left:-.5rem}.mt-4{margin-top:1rem}.mt-3{margin-top:.75rem}.mb-8{margin-bottom:2rem}.ml-\\[29px\\]{margin-left:29px}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-full{height:100%}.h-9{height:2.25rem}.h-8{height:2rem}.h-7{height:1.75rem}.h-12{height:3rem}.h-\\[300px\\]{height:300px}.h-screen{height:100vh}.h-11{height:2.75rem}.h-16{height:4rem}.h-\\[30px\\]{height:30px}.max-h-\\[70vh\\]{max-height:70vh}.w-10{width:2.5rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-fit{width:-moz-fit-content;width:fit-content}.w-36{width:9rem}.w-28{width:7rem}.w-4{width:1rem}.w-9{width:2.25rem}.w-40{width:10rem}.w-8{width:2rem}.w-7{width:1.75rem}.w-64{width:16rem}.w-12{width:3rem}.w-16{width:4rem}.w-\\[440px\\]{width:440px}.w-20{width:5rem}.w-24{width:6rem}.w-\\[250px\\]{width:250px}.w-screen{width:100vw}.w-11{width:2.75rem}.w-\\[230px\\]{width:230px}.w-\\[30px\\]{width:30px}.min-w-0{min-width:0}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.max-w-\\[460px\\]{max-width:460px}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y:-50%}.-translate-x-1\\/2,.-translate-y-1\\/2{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-1\\/2{--tw-translate-x:-50%}.rotate-180{--tw-rotate:180deg}.rotate-180,.rotate-90{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))}.rotate-90{--tw-rotate:90deg}.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}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1\\.2fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1.2fr 1fr .6fr}.grid-cols-\\[1\\.5fr_2fr_1fr_0\\.6fr\\]{grid-template-columns:1.5fr 2fr 1fr .6fr}.grid-cols-\\[1\\.5fr_2fr_0\\.8fr\\]{grid-template-columns:1.5fr 2fr .8fr}.grid-cols-\\[1fr_3fr\\]{grid-template-columns:1fr 3fr}.grid-cols-\\[1fr_1fr_2fr_0\\.8fr\\]{grid-template-columns:1fr 1fr 2fr .8fr}.grid-cols-\\[2fr_1fr\\]{grid-template-columns:2fr 1fr}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1fr .6fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-\\[18px\\]{gap:18px}.gap-5{gap:1.25rem}.gap-4{gap:1rem}.gap-1{gap:.25rem}.gap-3{gap:.75rem}.gap-2{gap:.5rem}.gap-1\\.5{gap:.375rem}.gap-2\\.5{gap:.625rem}.gap-3\\.5{gap:.875rem}.gap-6{gap:1.5rem}.gap-0\\.5{gap:.125rem}.gap-0{gap:0}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-y-4{row-gap:1rem}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-none{overscroll-behavior:none}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-2xl{border-radius:1rem}.rounded-\\[10px\\]{border-radius:10px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded{border-radius:.25rem}.rounded-\\[8px\\]{border-radius:8px}.border{border-width:1px}.border-2{border-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-l{border-left-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-sky-blue-400\\/30{border-color:rgba(59,208,242,.3)}.border-mint-400\\/30{border-color:rgba(30,226,175,.3)}.border-gold-400\\/30{border-color:rgba(255,212,77,.3)}.border-transparent{border-color:transparent}.border-sky-blue-400\\/40{border-color:rgba(59,208,242,.4)}.border-l-sky-blue-400{--tw-border-opacity:1;border-left-color:rgb(59 208 242/var(--tw-border-opacity))}.border-l-mint-400{--tw-border-opacity:1;border-left-color:rgb(30 226 175/var(--tw-border-opacity))}.border-l-gold-400{--tw-border-opacity:1;border-left-color:rgb(255 212 77/var(--tw-border-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-sky-blue-400\\/20{background-color:rgba(59,208,242,.2)}.bg-mint-100{--tw-bg-opacity:1;background-color:rgb(208 251 240/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-gold-100{--tw-bg-opacity:1;background-color:rgb(255 248 214/var(--tw-bg-opacity))}.bg-mint-400\\/20{background-color:rgba(30,226,175,.2)}.bg-transparent{background-color:transparent}.bg-dark-blue-400{--tw-bg-opacity:1;background-color:rgb(35 42 58/var(--tw-bg-opacity))}.bg-white\\/90{background-color:hsla(0,0%,100%,.9)}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-50\\/60{background-color:rgba(248,250,252,.6)}.bg-sky-blue-400\\/15{background-color:rgba(59,208,242,.15)}.bg-gold-400\\/15{background-color:rgba(255,212,77,.15)}.bg-mint-400\\/15{background-color:rgba(30,226,175,.15)}.bg-sky-blue-400\\/25{background-color:rgba(59,208,242,.25)}.bg-mint-400\\/25{background-color:rgba(30,226,175,.25)}.bg-gold-400\\/25{background-color:rgba(255,212,77,.25)}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-sky-blue-400{--tw-gradient-from:#3bd0f2;--tw-gradient-to:rgba(59,208,242,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-mint-400{--tw-gradient-from:#1ee2af;--tw-gradient-to:rgba(30,226,175,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-gold-400{--tw-gradient-from:#ffd44d;--tw-gradient-to:rgba(255,212,77,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-dark-blue-600{--tw-gradient-from:#0a0f2e;--tw-gradient-to:rgba(10,15,46,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-sky-blue-400\\/15{--tw-gradient-from:rgba(59,208,242,.15);--tw-gradient-to:rgba(59,208,242,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-dark-blue-400{--tw-gradient-to:rgba(35,42,58,0);--tw-gradient-stops:var(--tw-gradient-from),#232a3a,var(--tw-gradient-to)}.to-dark-blue-400{--tw-gradient-to:#232a3a}.to-\\[\\#f5c300\\]{--tw-gradient-to:#f5c300}.to-sky-blue-400{--tw-gradient-to:#3bd0f2}.to-mint-400\\/15{--tw-gradient-to:rgba(30,226,175,.15)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-4{padding:1rem}.p-8{padding:2rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-3{padding:.75rem}.p-2\\.5{padding:.625rem}.p-2{padding:.5rem}.px-\\[22px\\]{padding-left:22px;padding-right:22px}.py-\\[18px\\]{padding-bottom:18px;padding-top:18px}.px-4{padding-left:1rem;padding-right:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-0\\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.py-4{padding-bottom:1rem;padding-top:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pl-9{padding-left:2.25rem}.pr-4{padding-right:1rem}.pl-10{padding-left:2.5rem}.pb-2{padding-bottom:.5rem}.pr-1{padding-right:.25rem}.pl-4{padding-left:1rem}.pt-0\\.5{padding-top:.125rem}.pt-0{padding-top:0}.pb-12{padding-bottom:3rem}.pl-2\\.5{padding-left:.625rem}.pl-2{padding-left:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-proxima{font-family:ProximaNova}.text-\\[15\\.5px\\]{font-size:15.5px}.text-xs{font-size:.75rem;line-height:1rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-\\[10px\\]{font-size:10px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-\\[11px\\]{font-size:11px}.text-\\[28px\\]{font-size:28px}.text-\\[12\\.5px\\]{font-size:12.5px}.text-base{font-size:1rem;line-height:1.5rem}.text-\\[11\\.5px\\]{font-size:11.5px}.text-3xl{font-size:1.875rem;line-height:2.25rem}.font-extrabold{font-weight:800}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-black{font-weight:900}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-dark-blue-400{--tw-text-opacity:1;color:rgb(35 42 58/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-sky-blue-400{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-mint-400{--tw-text-opacity:1;color:rgb(30 226 175/var(--tw-text-opacity))}.text-white\\/70{color:hsla(0,0%,100%,.7)}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-gold-400{--tw-text-opacity:1;color:rgb(255 212 77/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\],.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\]{--tw-shadow:0 3px 12px rgba(255,212,77,.35);--tw-shadow-colored:0 3px 12px var(--tw-shadow-color)}.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_2px_10px_rgba\\(30\\2c 226\\2c 175\\2c 0\\.15\\)\\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_2px_10px_rgba\\(30\\2c 226\\2c 175\\2c 0\\.15\\)\\]{--tw-shadow:0 2px 10px rgba(30,226,175,.15);--tw-shadow-colored:0 2px 10px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.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)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition{transition-duration:.15s;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-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}*,:after,:before{border-style:solid;border-width:0}button{background-color:transparent;background-image:none;color:inherit;cursor:pointer;font:inherit;margin:0;padding:0;text-transform:none}.placeholder\\:text-slate-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.placeholder\\:text-slate-400::placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.first\\:ml-0:first-child{margin-left:0}.hover\\:scale-\\[1\\.02\\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;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))}.hover\\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.hover\\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.hover\\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.hover\\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\\:text-sky-blue-400:hover{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.hover\\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\\:border-sky-blue-400:focus{--tw-border-opacity:1;border-color:rgb(59 208 242/var(--tw-border-opacity))}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\\:opacity-50:disabled{opacity:.5}";
63
+ var css_248z = "@font-face{font-family:ProximaNova;src:url(https://cdn.localcivics.io/fonts/ProximaNova.otf) format(\"opentype\")}@font-face{font-family:ProximaNova;font-weight:700;src:url(https://cdn.localcivics.io/fonts/ProximaNovaBold.otf) format(\"opentype\")}*,: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-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: }::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-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: }.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.\\!relative{position:relative!important}.left-3{left:.75rem}.top-1\\/2{top:50%}.left-3\\.5{left:.875rem}.bottom-\\[-20px\\]{bottom:-20px}.left-1\\/2{left:50%}.m-3{margin:.75rem}.mt-0\\.5{margin-top:.125rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.mt-2{margin-top:.5rem}.mt-1\\.5{margin-top:.375rem}.-ml-2{margin-left:-.5rem}.mt-4{margin-top:1rem}.mt-3{margin-top:.75rem}.mb-8{margin-bottom:2rem}.ml-\\[29px\\]{margin-left:29px}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-full{height:100%}.h-9{height:2.25rem}.h-8{height:2rem}.h-7{height:1.75rem}.h-12{height:3rem}.h-\\[300px\\]{height:300px}.h-screen{height:100vh}.h-14{height:3.5rem}.h-16{height:4rem}.h-28{height:7rem}.h-\\[30px\\]{height:30px}.h-\\[400px\\]{height:400px}.max-h-\\[70vh\\]{max-height:70vh}.w-10{width:2.5rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-fit{width:-moz-fit-content;width:fit-content}.w-36{width:9rem}.w-28{width:7rem}.w-4{width:1rem}.w-9{width:2.25rem}.w-40{width:10rem}.w-8{width:2rem}.w-7{width:1.75rem}.w-64{width:16rem}.w-12{width:3rem}.w-16{width:4rem}.w-\\[440px\\]{width:440px}.w-20{width:5rem}.w-24{width:6rem}.w-\\[250px\\]{width:250px}.w-screen{width:100vw}.w-\\[500px\\]{width:500px}.w-14{width:3.5rem}.w-\\[230px\\]{width:230px}.w-\\[30px\\]{width:30px}.min-w-0{min-width:0}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.max-w-\\[460px\\]{max-width:460px}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y:-50%}.-translate-x-1\\/2,.-translate-y-1\\/2{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-1\\/2{--tw-translate-x:-50%}.rotate-180{--tw-rotate:180deg}.rotate-180,.rotate-90{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))}.rotate-90{--tw-rotate:90deg}.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}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1\\.2fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1.2fr 1fr .6fr}.grid-cols-\\[1\\.5fr_2fr_1fr_0\\.6fr\\]{grid-template-columns:1.5fr 2fr 1fr .6fr}.grid-cols-\\[1\\.5fr_2fr_0\\.8fr\\]{grid-template-columns:1.5fr 2fr .8fr}.grid-cols-\\[1fr_3fr\\]{grid-template-columns:1fr 3fr}.grid-cols-\\[1fr_1fr_2fr_0\\.8fr\\]{grid-template-columns:1fr 1fr 2fr .8fr}.grid-cols-\\[2fr_1fr\\]{grid-template-columns:2fr 1fr}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1fr .6fr}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.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}.gap-\\[18px\\]{gap:18px}.gap-5{gap:1.25rem}.gap-4{gap:1rem}.gap-1{gap:.25rem}.gap-3{gap:.75rem}.gap-2{gap:.5rem}.gap-1\\.5{gap:.375rem}.gap-2\\.5{gap:.625rem}.gap-3\\.5{gap:.875rem}.gap-0\\.5{gap:.125rem}.gap-0{gap:0}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-y-4{row-gap:1rem}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.-space-y-\\[3px\\]>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(-3px*var(--tw-space-y-reverse));margin-top:calc(-3px*(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-none{overscroll-behavior:none}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-2xl{border-radius:1rem}.rounded-\\[10px\\]{border-radius:10px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:1.5rem}.rounded-\\[8px\\]{border-radius:8px}.border{border-width:1px}.border-2{border-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-l{border-left-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-sky-blue-400\\/40{border-color:rgba(59,208,242,.4)}.border-sky-blue-400\\/30{border-color:rgba(59,208,242,.3)}.border-mint-400\\/30{border-color:rgba(30,226,175,.3)}.border-gold-400\\/30{border-color:rgba(255,212,77,.3)}.border-transparent{border-color:transparent}.border-l-sky-blue-400{--tw-border-opacity:1;border-left-color:rgb(59 208 242/var(--tw-border-opacity))}.border-l-mint-400{--tw-border-opacity:1;border-left-color:rgb(30 226 175/var(--tw-border-opacity))}.border-l-gold-400{--tw-border-opacity:1;border-left-color:rgb(255 212 77/var(--tw-border-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-sky-blue-400\\/20{background-color:rgba(59,208,242,.2)}.bg-mint-100{--tw-bg-opacity:1;background-color:rgb(208 251 240/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-gold-100{--tw-bg-opacity:1;background-color:rgb(255 248 214/var(--tw-bg-opacity))}.bg-mint-400\\/20{background-color:rgba(30,226,175,.2)}.bg-transparent{background-color:transparent}.bg-dark-blue-400{--tw-bg-opacity:1;background-color:rgb(35 42 58/var(--tw-bg-opacity))}.bg-white\\/90{background-color:hsla(0,0%,100%,.9)}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-50\\/60{background-color:rgba(248,250,252,.6)}.bg-sky-blue-400\\/15{background-color:rgba(59,208,242,.15)}.bg-gold-400\\/15{background-color:rgba(255,212,77,.15)}.bg-mint-400\\/15{background-color:rgba(30,226,175,.15)}.bg-sky-blue-400\\/25{background-color:rgba(59,208,242,.25)}.bg-mint-400\\/25{background-color:rgba(30,226,175,.25)}.bg-gold-400\\/25{background-color:rgba(255,212,77,.25)}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-sky-blue-400{--tw-gradient-from:#3bd0f2;--tw-gradient-to:rgba(59,208,242,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-mint-400{--tw-gradient-from:#1ee2af;--tw-gradient-to:rgba(30,226,175,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-gold-400{--tw-gradient-from:#ffd44d;--tw-gradient-to:rgba(255,212,77,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-dark-blue-600{--tw-gradient-from:#0a0f2e;--tw-gradient-to:rgba(10,15,46,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-sky-blue-400\\/15{--tw-gradient-from:rgba(59,208,242,.15);--tw-gradient-to:rgba(59,208,242,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-dark-blue-400{--tw-gradient-to:rgba(35,42,58,0);--tw-gradient-stops:var(--tw-gradient-from),#232a3a,var(--tw-gradient-to)}.to-dark-blue-400{--tw-gradient-to:#232a3a}.to-\\[\\#f5c300\\]{--tw-gradient-to:#f5c300}.to-sky-blue-400{--tw-gradient-to:#3bd0f2}.to-mint-400\\/15{--tw-gradient-to:rgba(30,226,175,.15)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-4{padding:1rem}.p-8{padding:2rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-3{padding:.75rem}.p-2\\.5{padding:.625rem}.p-2{padding:.5rem}.px-\\[22px\\]{padding-left:22px;padding-right:22px}.py-\\[18px\\]{padding-bottom:18px;padding-top:18px}.px-4{padding-left:1rem;padding-right:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.py-0\\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.py-4{padding-bottom:1rem;padding-top:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pl-9{padding-left:2.25rem}.pr-4{padding-right:1rem}.pl-10{padding-left:2.5rem}.pb-2{padding-bottom:.5rem}.pr-1{padding-right:.25rem}.pl-4{padding-left:1rem}.pt-0\\.5{padding-top:.125rem}.pt-0{padding-top:0}.pb-12{padding-bottom:3rem}.pl-2\\.5{padding-left:.625rem}.pl-2{padding-left:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-proxima{font-family:ProximaNova}.text-\\[15\\.5px\\]{font-size:15.5px}.text-xs{font-size:.75rem;line-height:1rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-\\[10px\\]{font-size:10px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-\\[11px\\]{font-size:11px}.text-\\[28px\\]{font-size:28px}.text-\\[12\\.5px\\]{font-size:12.5px}.text-base{font-size:1rem;line-height:1.5rem}.text-\\[11\\.5px\\]{font-size:11.5px}.text-3xl{font-size:1.875rem;line-height:2.25rem}.font-extrabold{font-weight:800}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-black{font-weight:900}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-dark-blue-400{--tw-text-opacity:1;color:rgb(35 42 58/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-sky-blue-400{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-mint-400{--tw-text-opacity:1;color:rgb(30 226 175/var(--tw-text-opacity))}.text-white\\/70{color:hsla(0,0%,100%,.7)}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-gold-400{--tw-text-opacity:1;color:rgb(255 212 77/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\],.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\]{--tw-shadow:0 3px 12px rgba(255,212,77,.35);--tw-shadow-colored:0 3px 12px var(--tw-shadow-color)}.shadow-\\[0_2px_10px_rgba\\(30\\2c 226\\2c 175\\2c 0\\.15\\)\\]{--tw-shadow:0 2px 10px rgba(30,226,175,.15);--tw-shadow-colored:0 2px 10px 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-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.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)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition{transition-duration:.15s;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-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}*,:after,:before{border-style:solid;border-width:0}button{background-color:transparent;background-image:none;color:inherit;cursor:pointer;font:inherit;margin:0;padding:0;text-transform:none}.placeholder\\:text-slate-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.placeholder\\:text-slate-400::placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.first\\:ml-0:first-child{margin-left:0}.hover\\:scale-\\[1\\.02\\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;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))}.hover\\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.hover\\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.hover\\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\\:text-sky-blue-400:hover{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.hover\\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.hover\\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\\:border-sky-blue-400:focus{--tw-border-opacity:1;border-color:rgb(59 208 242/var(--tw-border-opacity))}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\\:opacity-50:disabled{opacity:.5}@media (min-width:640px){.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}";
64
64
  styleInject(css_248z);
65
65
 
66
66
  function UserButton({ image, name, email }) {
@@ -144,25 +144,25 @@ function LinksGroup({ icon: Icon, href, label, accent = "cyan", initiallyOpened,
144
144
  ), hasLinks && opened && /* @__PURE__ */ React__namespace.createElement("div", { className: "ml-[29px] mt-0.5 flex flex-col gap-0.5 border-l border-slate-100 pl-2.5" }, items));
145
145
  }
146
146
 
147
- var __defProp$h = Object.defineProperty;
148
- var __defProps$e = Object.defineProperties;
149
- var __getOwnPropDescs$e = Object.getOwnPropertyDescriptors;
150
- var __getOwnPropSymbols$h = Object.getOwnPropertySymbols;
151
- var __hasOwnProp$h = Object.prototype.hasOwnProperty;
152
- var __propIsEnum$h = Object.prototype.propertyIsEnumerable;
153
- var __defNormalProp$h = (obj, key, value) => key in obj ? __defProp$h(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
154
- var __spreadValues$h = (a, b) => {
147
+ var __defProp$i = Object.defineProperty;
148
+ var __defProps$f = Object.defineProperties;
149
+ var __getOwnPropDescs$f = Object.getOwnPropertyDescriptors;
150
+ var __getOwnPropSymbols$i = Object.getOwnPropertySymbols;
151
+ var __hasOwnProp$i = Object.prototype.hasOwnProperty;
152
+ var __propIsEnum$i = Object.prototype.propertyIsEnumerable;
153
+ var __defNormalProp$i = (obj, key, value) => key in obj ? __defProp$i(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
154
+ var __spreadValues$i = (a, b) => {
155
155
  for (var prop in b || (b = {}))
156
- if (__hasOwnProp$h.call(b, prop))
157
- __defNormalProp$h(a, prop, b[prop]);
158
- if (__getOwnPropSymbols$h)
159
- for (var prop of __getOwnPropSymbols$h(b)) {
160
- if (__propIsEnum$h.call(b, prop))
161
- __defNormalProp$h(a, prop, b[prop]);
156
+ if (__hasOwnProp$i.call(b, prop))
157
+ __defNormalProp$i(a, prop, b[prop]);
158
+ if (__getOwnPropSymbols$i)
159
+ for (var prop of __getOwnPropSymbols$i(b)) {
160
+ if (__propIsEnum$i.call(b, prop))
161
+ __defNormalProp$i(a, prop, b[prop]);
162
162
  }
163
163
  return a;
164
164
  };
165
- var __spreadProps$e = (a, b) => __defProps$e(a, __getOwnPropDescs$e(b));
165
+ var __spreadProps$f = (a, b) => __defProps$f(a, __getOwnPropDescs$f(b));
166
166
  const data = [
167
167
  { label: "Home", icon: icons.IconHome2, accent: "cyan" },
168
168
  { label: "Dashboard", icon: icons.IconGauge, accent: "mint" },
@@ -189,12 +189,12 @@ function Navbar(props) {
189
189
  }
190
190
  return /* @__PURE__ */ React__namespace.createElement(
191
191
  LinksGroup,
192
- __spreadProps$e(__spreadValues$h(__spreadValues$h({
192
+ __spreadProps$f(__spreadValues$i(__spreadValues$i({
193
193
  key: item.label,
194
194
  active: props.active
195
195
  }, item), context), {
196
196
  links: (item.links || []).map((link) => {
197
- return __spreadValues$h(__spreadValues$h({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
197
+ return __spreadValues$i(__spreadValues$i({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
198
198
  })
199
199
  })
200
200
  );
@@ -214,7 +214,7 @@ const UtilLink = (props) => {
214
214
  );
215
215
  };
216
216
 
217
- const useStyles$9 = core.createStyles((theme) => ({
217
+ const useStyles$8 = core.createStyles((theme) => ({
218
218
  inner: {
219
219
  paddingTop: theme.spacing.xl,
220
220
  paddingBottom: theme.spacing.xl * 4
@@ -250,7 +250,7 @@ const useStyles$9 = core.createStyles((theme) => ({
250
250
  }
251
251
  }));
252
252
  const GettingStarted = (props) => {
253
- const { classes } = useStyles$9();
253
+ const { classes } = useStyles$8();
254
254
  return /* @__PURE__ */ React__namespace.createElement(
255
255
  core.Modal,
256
256
  {
@@ -264,81 +264,10 @@ const GettingStarted = (props) => {
264
264
  );
265
265
  };
266
266
 
267
- const useStyles$8 = core.createStyles((theme) => ({
268
- title: {
269
- fontSize: 34,
270
- fontWeight: 900,
271
- [theme.fn.smallerThan("sm")]: {
272
- fontSize: 24
273
- }
274
- },
275
- description: {
276
- maxWidth: 600,
277
- margin: "auto",
278
- "&::after": {
279
- content: '""',
280
- display: "block",
281
- backgroundColor: theme.fn.primaryColor(),
282
- width: 45,
283
- height: 2,
284
- marginTop: theme.spacing.sm,
285
- marginLeft: "auto",
286
- marginRight: "auto"
287
- }
288
- },
289
- card: {
290
- transition: "box-shadow 150ms ease, transform 100ms ease",
291
- "&:hover": {
292
- boxShadow: `${theme.shadows.md} !important`,
293
- transform: "scale(1.02)"
294
- }
295
- },
296
- cardTitle: {
297
- "&::after": {
298
- content: '""',
299
- display: "block",
300
- backgroundColor: theme.fn.primaryColor(),
301
- width: 45,
302
- height: 2,
303
- marginTop: theme.spacing.sm
304
- }
305
- }
306
- }));
307
- const SwitchAccount = (props) => {
308
- const { classes, theme } = useStyles$8();
309
- const options = props.accounts.map((a) => {
310
- return /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: () => props.onClick && props.onClick(a.accountId), key: a.accountId, p: theme.spacing.md }, /* @__PURE__ */ React__namespace.createElement(core.Card, { withBorder: true, shadow: "md", radius: "md", className: classes.card, p: "xl" }, a.isAdmin && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(icons.IconBatteryEco, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), a.isGroupAdmin && !a.isAdmin && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(icons.IconBooks, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), !a.isAdmin && !a.isGroupAdmin && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(icons.IconBackpack, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "lg", weight: 500, className: classes.cardTitle, mt: "md" }, a.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", color: "dimmed", mt: "sm" }, a.isAdmin ? "Admin" : a.isGroupAdmin ? "Educator" : "Student")));
311
- });
312
- return /* @__PURE__ */ React__namespace.createElement(
313
- core.Modal,
314
- {
315
- centered: true,
316
- fullScreen: true,
317
- opened: props.opened,
318
- onClose: () => props.onClose && props.onClose(),
319
- size: "sm"
320
- },
321
- /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, props.loading && /* @__PURE__ */ React__namespace.createElement(core.Center, { style: { height: 400 } }, /* @__PURE__ */ React__namespace.createElement(core.Loader, null)), !props.loading && /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(core.SimpleGrid, { p: 20, cols: 3, spacing: "xl", breakpoints: [{ maxWidth: "md", cols: 1 }] }, options)))
322
- );
323
- };
324
-
325
- const StatsGroup = ({ data, footer }) => {
326
- const stats = data.map((stat) => {
327
- const value = (() => {
328
- if (stat.unit === "%") {
329
- return Math.round((stat.value + Number.EPSILON) * 100);
330
- }
331
- return stat.value;
332
- })();
333
- const safeValue = Number.isFinite(value) ? value : 0;
334
- return /* @__PURE__ */ React__namespace.createElement("div", { key: stat.title }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-3xl font-black text-white" }, safeValue.toLocaleString(), stat.unit), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-[11px] font-bold uppercase tracking-wide text-white/70" }, stat.title));
335
- });
336
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-x-10 gap-y-4 rounded-2xl bg-gradient-to-br from-dark-blue-600 via-dark-blue-400 to-sky-blue-400 px-8 py-6" }, stats, footer);
337
- };
338
-
339
267
  const SIZE = {
340
- sm: { box: "h-11 w-11", rounded: "rounded-xl", icon: 20 },
341
- lg: { box: "h-16 w-16", rounded: "rounded-2xl", icon: 28 }
268
+ sm: { box: "h-14 w-14", rounded: "rounded-xl", icon: 24 },
269
+ lg: { box: "h-16 w-16", rounded: "rounded-2xl", icon: 28 },
270
+ xl: { box: "h-28 w-28", rounded: "rounded-3xl", icon: 48 }
342
271
  };
343
272
  const ACCENT = {
344
273
  cyan: { bg: "bg-sky-blue-400/15", text: "text-sky-blue-400" },
@@ -374,6 +303,8 @@ function Emblem(props) {
374
303
  "svg",
375
304
  {
376
305
  ref,
306
+ role: "img",
307
+ "aria-label": props.alt,
377
308
  "data-cache": "disabled",
378
309
  "data-src": props.imageURL,
379
310
  className: `${s.box} shrink-0 ${s.rounded} object-cover`,
@@ -385,9 +316,53 @@ function Emblem(props) {
385
316
  }
386
317
  );
387
318
  }
388
- return /* @__PURE__ */ React__namespace.createElement("div", { className: `flex ${s.box} shrink-0 items-center justify-center ${s.rounded} ${a.bg}` }, /* @__PURE__ */ React__namespace.createElement(Icon, { size: s.icon, stroke: 1.75, className: a.text }));
319
+ return /* @__PURE__ */ React__namespace.createElement("div", { role: "img", "aria-label": props.alt, className: `flex ${s.box} shrink-0 items-center justify-center ${s.rounded} ${a.bg}` }, /* @__PURE__ */ React__namespace.createElement(Icon, { size: s.icon, stroke: 1.75, className: a.text, "aria-hidden": "true" }));
389
320
  }
390
321
 
322
+ const ROLE = {
323
+ admin: { icon: icons.IconBuilding, accent: "gold", label: "Admin" },
324
+ educator: { icon: icons.IconBooks, accent: "mint", label: "Educator" },
325
+ student: { icon: icons.IconBackpack, accent: "cyan", label: "Student" }
326
+ };
327
+ const PILL = {
328
+ cyan: "bg-sky-blue-400/15 text-dark-blue-400",
329
+ mint: "bg-mint-400/15 text-dark-blue-400",
330
+ gold: "bg-gold-400/15 text-dark-blue-400"
331
+ };
332
+ const roleFor = (a) => a.isAdmin ? ROLE.admin : a.isGroupAdmin ? ROLE.educator : ROLE.student;
333
+ const SwitchAccount = (props) => {
334
+ const options = props.accounts.map((a) => {
335
+ const role = roleFor(a);
336
+ return /* @__PURE__ */ React__namespace.createElement(
337
+ "button",
338
+ {
339
+ type: "button",
340
+ key: a.accountId,
341
+ onClick: () => props.onClick && props.onClick(a.accountId),
342
+ className: "flex flex-col items-center gap-3 rounded-xl border border-slate-200 bg-white p-6 text-center hover:bg-slate-50"
343
+ },
344
+ /* @__PURE__ */ React__namespace.createElement(Emblem, { icon: role.icon, accent: role.accent, size: "lg" }),
345
+ /* @__PURE__ */ React__namespace.createElement("span", { className: "text-base font-extrabold text-dark-blue-400" }, a.name),
346
+ /* @__PURE__ */ React__namespace.createElement("span", { className: `rounded-full px-2.5 py-1 text-[10px] font-bold ${PILL[role.accent]}` }, role.label)
347
+ );
348
+ });
349
+ return /* @__PURE__ */ React__namespace.createElement(core.Modal, { centered: true, fullScreen: true, title: "Change account", opened: props.opened, onClose: () => props.onClose && props.onClose() }, /* @__PURE__ */ React__namespace.createElement("div", { className: "relative" }, props.loading && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-[400px] items-center justify-center" }, /* @__PURE__ */ React__namespace.createElement(core.Loader, null)), !props.loading && /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-1 gap-4 p-5 sm:grid-cols-2 md:grid-cols-3" }, options)));
350
+ };
351
+
352
+ const StatsGroup = ({ data, footer }) => {
353
+ const stats = data.map((stat) => {
354
+ const value = (() => {
355
+ if (stat.unit === "%") {
356
+ return Math.round((stat.value + Number.EPSILON) * 100);
357
+ }
358
+ return stat.value;
359
+ })();
360
+ const safeValue = Number.isFinite(value) ? value : 0;
361
+ return /* @__PURE__ */ React__namespace.createElement("div", { key: stat.title }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-3xl font-black text-white" }, safeValue.toLocaleString(), stat.unit), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-[11px] font-bold uppercase tracking-wide text-white/70" }, stat.title));
362
+ });
363
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-x-10 gap-y-4 rounded-2xl bg-gradient-to-br from-dark-blue-600 via-dark-blue-400 to-sky-blue-400 px-8 py-6" }, stats, footer);
364
+ };
365
+
391
366
  const SplitButton$4 = (props) => {
392
367
  return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React__namespace.createElement(
393
368
  reactRouterDom.Link,
@@ -474,6 +449,22 @@ const PlaceholderBanner = (props) => {
474
449
  return /* @__PURE__ */ React__namespace.createElement("div", { className: classes.wrapper }, /* @__PURE__ */ React__namespace.createElement("div", { className: classes.body }, /* @__PURE__ */ React__namespace.createElement(core.Title, { className: classes.title }, props.loading ? "Loading..." : title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", color: "dimmed" }, props.loading ? "Hold on, we're loading your data." : description)), /* @__PURE__ */ React__namespace.createElement(core.Image, { src: `https://cdn.localcivics.io/illustrations/${props.icon}.svg`, className: classes.image }));
475
450
  };
476
451
 
452
+ function SortableHeader(props) {
453
+ const active = props.sortConfig.key === props.sortKey;
454
+ const direction = active ? props.sortConfig.direction : null;
455
+ const justify = props.align === "right" ? "justify-end" : props.align === "center" ? "justify-center" : "";
456
+ return /* @__PURE__ */ React__namespace.createElement(
457
+ "button",
458
+ {
459
+ type: "button",
460
+ onClick: () => props.onSort(props.sortKey),
461
+ className: `inline-flex items-center gap-1 text-[10px] font-bold uppercase tracking-wide text-slate-500 hover:text-slate-700 ${justify} ${props.className || ""}`
462
+ },
463
+ /* @__PURE__ */ React__namespace.createElement("span", null, props.label),
464
+ active ? direction === "desc" ? /* @__PURE__ */ React__namespace.createElement(icons.IconCaretDown, { size: 12, stroke: 2.5, className: "shrink-0 text-sky-blue-400" }) : /* @__PURE__ */ React__namespace.createElement(icons.IconCaretUp, { size: 12, stroke: 2.5, className: "shrink-0 text-sky-blue-400" }) : /* @__PURE__ */ React__namespace.createElement("span", { className: "flex shrink-0 flex-col -space-y-[3px]" }, /* @__PURE__ */ React__namespace.createElement(icons.IconCaretUp, { size: 10, stroke: 2.5 }), /* @__PURE__ */ React__namespace.createElement(icons.IconCaretDown, { size: 10, stroke: 2.5 }))
465
+ );
466
+ }
467
+
477
468
  function Stack$4(props) {
478
469
  if (props.items.length === 0) {
479
470
  return null;
@@ -519,29 +510,29 @@ function useSortableData(items, config = { key: "", direction: null }) {
519
510
  return { items: sortedItems, requestSort, sortConfig };
520
511
  }
521
512
 
522
- var __defProp$g = Object.defineProperty;
523
- var __defProps$d = Object.defineProperties;
524
- var __getOwnPropDescs$d = Object.getOwnPropertyDescriptors;
525
- var __getOwnPropSymbols$g = Object.getOwnPropertySymbols;
526
- var __hasOwnProp$g = Object.prototype.hasOwnProperty;
527
- var __propIsEnum$g = Object.prototype.propertyIsEnumerable;
528
- var __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
529
- var __spreadValues$g = (a, b) => {
513
+ var __defProp$h = Object.defineProperty;
514
+ var __defProps$e = Object.defineProperties;
515
+ var __getOwnPropDescs$e = Object.getOwnPropertyDescriptors;
516
+ var __getOwnPropSymbols$h = Object.getOwnPropertySymbols;
517
+ var __hasOwnProp$h = Object.prototype.hasOwnProperty;
518
+ var __propIsEnum$h = Object.prototype.propertyIsEnumerable;
519
+ var __defNormalProp$h = (obj, key, value) => key in obj ? __defProp$h(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
520
+ var __spreadValues$h = (a, b) => {
530
521
  for (var prop in b || (b = {}))
531
- if (__hasOwnProp$g.call(b, prop))
532
- __defNormalProp$g(a, prop, b[prop]);
533
- if (__getOwnPropSymbols$g)
534
- for (var prop of __getOwnPropSymbols$g(b)) {
535
- if (__propIsEnum$g.call(b, prop))
536
- __defNormalProp$g(a, prop, b[prop]);
522
+ if (__hasOwnProp$h.call(b, prop))
523
+ __defNormalProp$h(a, prop, b[prop]);
524
+ if (__getOwnPropSymbols$h)
525
+ for (var prop of __getOwnPropSymbols$h(b)) {
526
+ if (__propIsEnum$h.call(b, prop))
527
+ __defNormalProp$h(a, prop, b[prop]);
537
528
  }
538
529
  return a;
539
530
  };
540
- var __spreadProps$d = (a, b) => __defProps$d(a, __getOwnPropDescs$d(b));
531
+ var __spreadProps$e = (a, b) => __defProps$e(a, __getOwnPropDescs$e(b));
541
532
  function Table$k(props) {
542
533
  const [expanded, setExpanded] = React__namespace.useState({});
543
534
  const preparedItems = React__namespace.useMemo(() => {
544
- return props.items.map((item) => __spreadProps$d(__spreadValues$g({}, item), {
535
+ return props.items.map((item) => __spreadProps$e(__spreadValues$h({}, item), {
545
536
  status: item.isComplete ? 1 : 0
546
537
  }));
547
538
  }, [props.items]);
@@ -557,15 +548,14 @@ function Table$k(props) {
557
548
  }
558
549
  );
559
550
  }
560
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
561
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex-1 text-left hover:text-slate-600" }, "Student Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("status"), className: "w-28 shrink-0 text-center hover:text-slate-600" }, "Status", indicator("status")), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
551
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "name", sortConfig, onSort: requestSort, className: "flex-1" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Status", sortKey: "status", sortConfig, onSort: requestSort, align: "center", className: "w-28 shrink-0" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
562
552
  var _a;
563
553
  const isOpen = !!expanded[row.userId];
564
554
  const initials = (((_a = row.name) == null ? void 0 : _a[0]) || row.email[0] || "?").toUpperCase();
565
555
  return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
566
556
  "div",
567
557
  {
568
- onClick: () => setExpanded(__spreadProps$d(__spreadValues$g({}, expanded), { [row.userId]: !isOpen })),
558
+ onClick: () => setExpanded(__spreadProps$e(__spreadValues$h({}, expanded), { [row.userId]: !isOpen })),
569
559
  className: "flex cursor-pointer items-center gap-4 p-4"
570
560
  },
571
561
  /* @__PURE__ */ React__namespace.createElement("div", { className: "flex min-w-0 flex-1 items-center gap-3" }, row.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { src: row.avatar, className: "h-9 w-9 shrink-0 rounded-full object-cover", alt: "" }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-mint-400/20 text-xs font-bold text-dark-blue-400" }, initials), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-sm font-bold text-dark-blue-400" }, row.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-400" }, row.email))),
@@ -588,8 +578,7 @@ function Table$j(props) {
588
578
  }
589
579
  );
590
580
  }
591
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
592
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("lessonName"), className: "flex-1 text-left hover:text-slate-600" }, "Lesson Name", indicator("lessonName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "w-36 shrink-0 text-right hover:text-slate-600" }, "Lesson Completion", indicator("percentageCompletion"))), sortedItems.map((row) => /* @__PURE__ */ React__namespace.createElement(
581
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-4 px-4" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Lesson Name", sortKey: "lessonName", sortConfig, onSort: requestSort, className: "flex-1" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Lesson Completion", sortKey: "percentageCompletion", sortConfig, onSort: requestSort, align: "right", className: "w-36 shrink-0" })), sortedItems.map((row) => /* @__PURE__ */ React__namespace.createElement(
593
582
  reactRouterDom.Link,
594
583
  {
595
584
  key: row.lessonId,
@@ -609,7 +598,7 @@ const Badge = (props) => {
609
598
  const [tab, setTab] = React.useState("lessons");
610
599
  const numberOfStudents = props.students.length;
611
600
  const numberOfBadges = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
612
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: props.imageURL, alt: props.displayName, size: "lg", icon: icons.IconAlbum, accent: "mint" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: props.onBackClick, className: "flex w-max cursor-pointer items-center gap-1 text-xs font-bold text-sky-blue-400" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "Badge"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description"))), !props.trial && /* @__PURE__ */ React__namespace.createElement(
601
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: props.imageURL, alt: props.displayName, size: "xl", icon: icons.IconAlbum, accent: "mint" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: props.onBackClick, className: "flex w-max cursor-pointer items-center gap-1 text-xs font-bold text-sky-blue-400" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "Badge"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description"))), !props.trial && /* @__PURE__ */ React__namespace.createElement(
613
602
  SplitButton$4,
614
603
  {
615
604
  href: props.href,
@@ -709,8 +698,7 @@ function Table$h(props) {
709
698
  }
710
699
  );
711
700
  }
712
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
713
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[2fr_1fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("studentName"), className: "flex items-center text-left hover:text-slate-700" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("className"), className: "flex items-center text-left hover:text-slate-700" }, "Class Name", indicator("className"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
701
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[2fr_1fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "studentName", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Class Name", sortKey: "className", sortConfig, onSort: requestSort })), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
714
702
  "div",
715
703
  {
716
704
  key: row.studentId,
@@ -753,28 +741,28 @@ function relativeTimeFromElapsed(elapsed) {
753
741
  return "";
754
742
  }
755
743
 
756
- var __defProp$f = Object.defineProperty;
757
- var __defProps$c = Object.defineProperties;
758
- var __getOwnPropDescs$c = Object.getOwnPropertyDescriptors;
759
- var __getOwnPropSymbols$f = Object.getOwnPropertySymbols;
760
- var __hasOwnProp$f = Object.prototype.hasOwnProperty;
761
- var __propIsEnum$f = Object.prototype.propertyIsEnumerable;
762
- var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
763
- var __spreadValues$f = (a, b) => {
744
+ var __defProp$g = Object.defineProperty;
745
+ var __defProps$d = Object.defineProperties;
746
+ var __getOwnPropDescs$d = Object.getOwnPropertyDescriptors;
747
+ var __getOwnPropSymbols$g = Object.getOwnPropertySymbols;
748
+ var __hasOwnProp$g = Object.prototype.hasOwnProperty;
749
+ var __propIsEnum$g = Object.prototype.propertyIsEnumerable;
750
+ var __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
751
+ var __spreadValues$g = (a, b) => {
764
752
  for (var prop in b || (b = {}))
765
- if (__hasOwnProp$f.call(b, prop))
766
- __defNormalProp$f(a, prop, b[prop]);
767
- if (__getOwnPropSymbols$f)
768
- for (var prop of __getOwnPropSymbols$f(b)) {
769
- if (__propIsEnum$f.call(b, prop))
770
- __defNormalProp$f(a, prop, b[prop]);
753
+ if (__hasOwnProp$g.call(b, prop))
754
+ __defNormalProp$g(a, prop, b[prop]);
755
+ if (__getOwnPropSymbols$g)
756
+ for (var prop of __getOwnPropSymbols$g(b)) {
757
+ if (__propIsEnum$g.call(b, prop))
758
+ __defNormalProp$g(a, prop, b[prop]);
771
759
  }
772
760
  return a;
773
761
  };
774
- var __spreadProps$c = (a, b) => __defProps$c(a, __getOwnPropDescs$c(b));
762
+ var __spreadProps$d = (a, b) => __defProps$d(a, __getOwnPropDescs$d(b));
775
763
  function Table$g(props) {
776
764
  const preparedItems = React__namespace.useMemo(() => {
777
- return props.items.map((item) => __spreadProps$c(__spreadValues$f({}, item), {
765
+ return props.items.map((item) => __spreadProps$d(__spreadValues$g({}, item), {
778
766
  updatedAtDate: new Date(item.updatedAt)
779
767
  }));
780
768
  }, [props.items]);
@@ -790,8 +778,7 @@ function Table$g(props) {
790
778
  }
791
779
  );
792
780
  }
793
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
794
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1fr_1fr_2fr_0.8fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("studentName"), className: "flex items-center text-left hover:text-slate-700" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("lessonName"), className: "flex items-center text-left hover:text-slate-700" }, "Lesson Name", indicator("lessonName")), /* @__PURE__ */ React__namespace.createElement("div", null, "Reflection"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("updatedAtDate"), className: "flex items-center text-left hover:text-slate-700" }, "Updated At", indicator("updatedAtDate"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
781
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1fr_1fr_2fr_0.8fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "studentName", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Lesson Name", sortKey: "lessonName", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, "Reflection"), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Updated At", sortKey: "updatedAtDate", sortConfig, onSort: requestSort })), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
795
782
  "div",
796
783
  {
797
784
  key: row.studentName + row.lessonName,
@@ -817,8 +804,7 @@ function Table$f(props) {
817
804
  }
818
805
  );
819
806
  }
820
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
821
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1fr_3fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("studentName"), className: "flex items-center text-left hover:text-slate-700" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("div", null, "Impact Statement")), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
807
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1fr_3fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "studentName", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, "Impact Statement")), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
822
808
  "div",
823
809
  {
824
810
  key: row.studentName,
@@ -842,8 +828,7 @@ function Table$e(props) {
842
828
  }
843
829
  );
844
830
  }
845
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
846
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1.5fr_2fr_0.8fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex items-center text-left hover:text-slate-700" }, "Badge Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("div", null, "Description"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Completion", indicator("percentageCompletion"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
831
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1.5fr_2fr_0.8fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Badge Name", sortKey: "name", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, "Description"), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Completion", sortKey: "percentageCompletion", sortConfig, onSort: requestSort, align: "center" })), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
847
832
  "div",
848
833
  {
849
834
  key: row.badgeId,
@@ -876,8 +861,7 @@ function Table$d(props) {
876
861
  }
877
862
  );
878
863
  }
879
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
880
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1.5fr_2fr_0.8fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex items-center text-left hover:text-slate-700" }, "Lesson Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("div", null, "Description"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Completion", indicator("percentageCompletion"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
864
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1.5fr_2fr_0.8fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Lesson Name", sortKey: "name", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, "Description"), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Completion", sortKey: "percentageCompletion", sortConfig, onSort: requestSort, align: "center" })), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
881
865
  "div",
882
866
  {
883
867
  key: row.lessonId,
@@ -977,25 +961,25 @@ const Dashboard = (props) => {
977
961
  )));
978
962
  };
979
963
 
980
- var __defProp$e = Object.defineProperty;
981
- var __defProps$b = Object.defineProperties;
982
- var __getOwnPropDescs$b = Object.getOwnPropertyDescriptors;
983
- var __getOwnPropSymbols$e = Object.getOwnPropertySymbols;
984
- var __hasOwnProp$e = Object.prototype.hasOwnProperty;
985
- var __propIsEnum$e = Object.prototype.propertyIsEnumerable;
986
- var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
987
- var __spreadValues$e = (a, b) => {
964
+ var __defProp$f = Object.defineProperty;
965
+ var __defProps$c = Object.defineProperties;
966
+ var __getOwnPropDescs$c = Object.getOwnPropertyDescriptors;
967
+ var __getOwnPropSymbols$f = Object.getOwnPropertySymbols;
968
+ var __hasOwnProp$f = Object.prototype.hasOwnProperty;
969
+ var __propIsEnum$f = Object.prototype.propertyIsEnumerable;
970
+ var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
971
+ var __spreadValues$f = (a, b) => {
988
972
  for (var prop in b || (b = {}))
989
- if (__hasOwnProp$e.call(b, prop))
990
- __defNormalProp$e(a, prop, b[prop]);
991
- if (__getOwnPropSymbols$e)
992
- for (var prop of __getOwnPropSymbols$e(b)) {
993
- if (__propIsEnum$e.call(b, prop))
994
- __defNormalProp$e(a, prop, b[prop]);
973
+ if (__hasOwnProp$f.call(b, prop))
974
+ __defNormalProp$f(a, prop, b[prop]);
975
+ if (__getOwnPropSymbols$f)
976
+ for (var prop of __getOwnPropSymbols$f(b)) {
977
+ if (__propIsEnum$f.call(b, prop))
978
+ __defNormalProp$f(a, prop, b[prop]);
995
979
  }
996
980
  return a;
997
981
  };
998
- var __spreadProps$b = (a, b) => __defProps$b(a, __getOwnPropDescs$b(b));
982
+ var __spreadProps$c = (a, b) => __defProps$c(a, __getOwnPropDescs$c(b));
999
983
  const openDeleteModal$2 = (student, onDelete) => modals.openConfirmModal({
1000
984
  title: `Remove "${student.givenName && student.familyName ? `${student.givenName} ${student.familyName}` : student.email}" from this class?`,
1001
985
  centered: true,
@@ -1006,7 +990,7 @@ const openDeleteModal$2 = (student, onDelete) => modals.openConfirmModal({
1006
990
  });
1007
991
  function Table$c(props) {
1008
992
  const preparedItems = React__namespace.useMemo(() => {
1009
- return props.items.map((item) => __spreadProps$b(__spreadValues$e({}, item), {
993
+ return props.items.map((item) => __spreadProps$c(__spreadValues$f({}, item), {
1010
994
  fullName: item.givenName && item.familyName ? `${item.givenName} ${item.familyName}`.toLowerCase() : item.email.toLowerCase()
1011
995
  }));
1012
996
  }, [props.items]);
@@ -1017,8 +1001,7 @@ function Table$c(props) {
1017
1001
  if (props.items.length === 0) {
1018
1002
  return /* @__PURE__ */ React__namespace.createElement("div", { className: "rounded-xl border border-slate-200 bg-white p-8 text-center text-sm text-slate-400 shadow-sm" }, "You have not rostered any students yet.");
1019
1003
  }
1020
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
1021
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[2.2fr_1.2fr_1fr_1.2fr_1fr_0.6fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("fullName"), className: "flex items-center text-left hover:text-slate-700" }, "Name", indicator("fullName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("isAdmin"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Role", indicator("isAdmin")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("badgesEarned"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Badges Earned", indicator("badgesEarned")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("lessonsCompleted"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Lessons Completed", indicator("lessonsCompleted")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("hasAccount"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Account Created?", indicator("hasAccount")), /* @__PURE__ */ React__namespace.createElement("div", null)), sortedItems.map((row, i) => {
1004
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[2.2fr_1.2fr_1fr_1.2fr_1fr_0.6fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Name", sortKey: "fullName", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Role", sortKey: "isAdmin", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Badges Earned", sortKey: "badgesEarned", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Lessons Completed", sortKey: "lessonsCompleted", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Account Created?", sortKey: "hasAccount", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement("div", null)), sortedItems.map((row, i) => {
1022
1005
  var _a, _b;
1023
1006
  const name = row.givenName && row.familyName ? `${row.givenName} ${row.familyName}` : row.email;
1024
1007
  const initials = (((_a = row.givenName) == null ? void 0 : _a[0]) || row.email[0] || "?") + (((_b = row.familyName) == null ? void 0 : _b[0]) || "");
@@ -1057,25 +1040,25 @@ function Table$c(props) {
1057
1040
  }));
1058
1041
  }
1059
1042
 
1060
- var __defProp$d = Object.defineProperty;
1061
- var __defProps$a = Object.defineProperties;
1062
- var __getOwnPropDescs$a = Object.getOwnPropertyDescriptors;
1063
- var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
1064
- var __hasOwnProp$d = Object.prototype.hasOwnProperty;
1065
- var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
1066
- var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1067
- var __spreadValues$d = (a, b) => {
1043
+ var __defProp$e = Object.defineProperty;
1044
+ var __defProps$b = Object.defineProperties;
1045
+ var __getOwnPropDescs$b = Object.getOwnPropertyDescriptors;
1046
+ var __getOwnPropSymbols$e = Object.getOwnPropertySymbols;
1047
+ var __hasOwnProp$e = Object.prototype.hasOwnProperty;
1048
+ var __propIsEnum$e = Object.prototype.propertyIsEnumerable;
1049
+ var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1050
+ var __spreadValues$e = (a, b) => {
1068
1051
  for (var prop in b || (b = {}))
1069
- if (__hasOwnProp$d.call(b, prop))
1070
- __defNormalProp$d(a, prop, b[prop]);
1071
- if (__getOwnPropSymbols$d)
1072
- for (var prop of __getOwnPropSymbols$d(b)) {
1073
- if (__propIsEnum$d.call(b, prop))
1074
- __defNormalProp$d(a, prop, b[prop]);
1052
+ if (__hasOwnProp$e.call(b, prop))
1053
+ __defNormalProp$e(a, prop, b[prop]);
1054
+ if (__getOwnPropSymbols$e)
1055
+ for (var prop of __getOwnPropSymbols$e(b)) {
1056
+ if (__propIsEnum$e.call(b, prop))
1057
+ __defNormalProp$e(a, prop, b[prop]);
1075
1058
  }
1076
1059
  return a;
1077
1060
  };
1078
- var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
1061
+ var __spreadProps$b = (a, b) => __defProps$b(a, __getOwnPropDescs$b(b));
1079
1062
  const Class = (props) => {
1080
1063
  const [opened, setOpened] = React.useState(false);
1081
1064
  return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(
@@ -1087,7 +1070,7 @@ const Class = (props) => {
1087
1070
  padding: "xl",
1088
1071
  size: "xl"
1089
1072
  },
1090
- /* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$a(__spreadValues$d({}, props), { close: () => setOpened(false) }))
1073
+ /* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$b(__spreadValues$e({}, props), { close: () => setOpened(false) }))
1091
1074
  ), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: props.onBackClick, className: "flex w-max cursor-pointer items-center gap-1 text-xs font-bold text-sky-blue-400" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "Class"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, props.description || "No description")), !props.loading && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React__namespace.createElement(
1092
1075
  "button",
1093
1076
  {
@@ -1213,20 +1196,20 @@ const DropzoneButton$1 = (props) => {
1213
1196
  props.onCreateMembers && props.onCreateMembers([values]);
1214
1197
  }) }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
1215
1198
  core.TextInput,
1216
- __spreadValues$d({
1199
+ __spreadValues$e({
1217
1200
  withAsterisk: true,
1218
1201
  label: "Email",
1219
1202
  placeholder: "Email"
1220
1203
  }, form$1.getInputProps("email"))
1221
1204
  ), /* @__PURE__ */ React__namespace.createElement(core.Group, { grow: true }, /* @__PURE__ */ React__namespace.createElement(
1222
1205
  core.TextInput,
1223
- __spreadValues$d({
1206
+ __spreadValues$e({
1224
1207
  label: "Given name",
1225
1208
  placeholder: "Given name"
1226
1209
  }, form$1.getInputProps("givenName"))
1227
1210
  ), /* @__PURE__ */ React__namespace.createElement(
1228
1211
  core.TextInput,
1229
- __spreadValues$d({
1212
+ __spreadValues$e({
1230
1213
  label: "Family name",
1231
1214
  placeholder: "Family name"
1232
1215
  }, form$1.getInputProps("familyName"))
@@ -1261,8 +1244,7 @@ function Table$b(props) {
1261
1244
  }
1262
1245
  );
1263
1246
  }
1264
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
1265
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1.5fr_2fr_1fr_0.6fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex items-center text-left hover:text-slate-700" }, "Class Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("div", null, "Description"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("numberOfStudents"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "# of Students", indicator("numberOfStudents")), /* @__PURE__ */ React__namespace.createElement("div", null)), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
1247
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[1.5fr_2fr_1fr_0.6fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Class Name", sortKey: "name", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[10px] font-bold uppercase tracking-wide text-slate-500" }, "Description"), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "# of Students", sortKey: "numberOfStudents", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement("div", null)), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
1266
1248
  "div",
1267
1249
  {
1268
1250
  key: row.classId,
@@ -1283,19 +1265,19 @@ function Table$b(props) {
1283
1265
  )));
1284
1266
  }
1285
1267
 
1286
- var __defProp$c = Object.defineProperty;
1287
- var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
1288
- var __hasOwnProp$c = Object.prototype.hasOwnProperty;
1289
- var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
1290
- var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1291
- var __spreadValues$c = (a, b) => {
1268
+ var __defProp$d = Object.defineProperty;
1269
+ var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
1270
+ var __hasOwnProp$d = Object.prototype.hasOwnProperty;
1271
+ var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
1272
+ var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1273
+ var __spreadValues$d = (a, b) => {
1292
1274
  for (var prop in b || (b = {}))
1293
- if (__hasOwnProp$c.call(b, prop))
1294
- __defNormalProp$c(a, prop, b[prop]);
1295
- if (__getOwnPropSymbols$c)
1296
- for (var prop of __getOwnPropSymbols$c(b)) {
1297
- if (__propIsEnum$c.call(b, prop))
1298
- __defNormalProp$c(a, prop, b[prop]);
1275
+ if (__hasOwnProp$d.call(b, prop))
1276
+ __defNormalProp$d(a, prop, b[prop]);
1277
+ if (__getOwnPropSymbols$d)
1278
+ for (var prop of __getOwnPropSymbols$d(b)) {
1279
+ if (__propIsEnum$d.call(b, prop))
1280
+ __defNormalProp$d(a, prop, b[prop]);
1299
1281
  }
1300
1282
  return a;
1301
1283
  };
@@ -1329,14 +1311,14 @@ const Classes = (props) => {
1329
1311
  props.onCreateClass && props.onCreateClass(values);
1330
1312
  }) }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
1331
1313
  core.TextInput,
1332
- __spreadValues$c({
1314
+ __spreadValues$d({
1333
1315
  withAsterisk: true,
1334
1316
  label: "Name",
1335
1317
  placeholder: "Class name"
1336
1318
  }, form$1.getInputProps("name"))
1337
1319
  ), /* @__PURE__ */ React__namespace.createElement(
1338
1320
  core.TextInput,
1339
- __spreadValues$c({
1321
+ __spreadValues$d({
1340
1322
  label: "Description",
1341
1323
  placeholder: "A class for my first period English students"
1342
1324
  }, form$1.getInputProps("description"))
@@ -1600,8 +1582,7 @@ function Table$7(props) {
1600
1582
  }
1601
1583
  );
1602
1584
  }
1603
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
1604
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("studentName"), className: "w-40 shrink-0 text-left hover:text-slate-600" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1" }, "Reflection"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("rating"), className: "w-20 shrink-0 text-right hover:text-slate-600" }, "Rating", indicator("rating"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement("div", { key: `${row.studentName}-${i}`, className: "rounded-xl border border-slate-200 bg-white p-4 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-sm font-bold text-dark-blue-400" }, row.studentName), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1 text-sm text-slate-600" }, row.reflection), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-20 shrink-0 text-right text-sm text-slate-500" }, row.rating)))));
1585
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "studentName", sortConfig, onSort: requestSort, className: "w-40 shrink-0" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1" }, "Reflection"), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Rating", sortKey: "rating", sortConfig, onSort: requestSort, align: "right", className: "w-20 shrink-0" })), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement("div", { key: `${row.studentName}-${i}`, className: "rounded-xl border border-slate-200 bg-white p-4 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-sm font-bold text-dark-blue-400" }, row.studentName), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1 text-sm text-slate-600" }, row.reflection), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-20 shrink-0 text-right text-sm text-slate-500" }, row.rating)))));
1605
1586
  }
1606
1587
 
1607
1588
  const SplitButton$3 = (props) => {
@@ -1640,29 +1621,29 @@ function Stack$3(props) {
1640
1621
  return /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: props.href, className: "flex flex-col gap-4 no-underline" }, props.items.map((row) => /* @__PURE__ */ React__namespace.createElement("div", { key: row.questionName }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-bold text-dark-blue-400" }, row.questionName), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-sm text-slate-600" }, row.answer.join(", ") || "No answer."))));
1641
1622
  }
1642
1623
 
1643
- var __defProp$b = Object.defineProperty;
1644
- var __defProps$9 = Object.defineProperties;
1645
- var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
1646
- var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
1647
- var __hasOwnProp$b = Object.prototype.hasOwnProperty;
1648
- var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
1649
- var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1650
- var __spreadValues$b = (a, b) => {
1624
+ var __defProp$c = Object.defineProperty;
1625
+ var __defProps$a = Object.defineProperties;
1626
+ var __getOwnPropDescs$a = Object.getOwnPropertyDescriptors;
1627
+ var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
1628
+ var __hasOwnProp$c = Object.prototype.hasOwnProperty;
1629
+ var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
1630
+ var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1631
+ var __spreadValues$c = (a, b) => {
1651
1632
  for (var prop in b || (b = {}))
1652
- if (__hasOwnProp$b.call(b, prop))
1653
- __defNormalProp$b(a, prop, b[prop]);
1654
- if (__getOwnPropSymbols$b)
1655
- for (var prop of __getOwnPropSymbols$b(b)) {
1656
- if (__propIsEnum$b.call(b, prop))
1657
- __defNormalProp$b(a, prop, b[prop]);
1633
+ if (__hasOwnProp$c.call(b, prop))
1634
+ __defNormalProp$c(a, prop, b[prop]);
1635
+ if (__getOwnPropSymbols$c)
1636
+ for (var prop of __getOwnPropSymbols$c(b)) {
1637
+ if (__propIsEnum$c.call(b, prop))
1638
+ __defNormalProp$c(a, prop, b[prop]);
1658
1639
  }
1659
1640
  return a;
1660
1641
  };
1661
- var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
1642
+ var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
1662
1643
  function Table$6(props) {
1663
1644
  const [expanded, setExpanded] = React__namespace.useState({});
1664
1645
  const preparedItems = React__namespace.useMemo(() => {
1665
- return props.items.map((item) => __spreadProps$9(__spreadValues$b({}, item), {
1646
+ return props.items.map((item) => __spreadProps$a(__spreadValues$c({}, item), {
1666
1647
  status: item.isComplete ? 2 : item.isStarted ? 1 : 0
1667
1648
  }));
1668
1649
  }, [props.items]);
@@ -1678,15 +1659,14 @@ function Table$6(props) {
1678
1659
  }
1679
1660
  );
1680
1661
  }
1681
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
1682
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex-1 text-left hover:text-slate-600" }, "Student Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("status"), className: "w-28 shrink-0 text-center hover:text-slate-600" }, "Status", indicator("status")), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
1662
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "name", sortConfig, onSort: requestSort, className: "flex-1" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Status", sortKey: "status", sortConfig, onSort: requestSort, align: "center", className: "w-28 shrink-0" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
1683
1663
  var _a;
1684
1664
  const isOpen = !!expanded[row.userId];
1685
1665
  const initials = (((_a = row.name) == null ? void 0 : _a[0]) || row.email[0] || "?").toUpperCase();
1686
1666
  return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
1687
1667
  "div",
1688
1668
  {
1689
- onClick: () => setExpanded(__spreadProps$9(__spreadValues$b({}, expanded), { [row.userId]: !isOpen })),
1669
+ onClick: () => setExpanded(__spreadProps$a(__spreadValues$c({}, expanded), { [row.userId]: !isOpen })),
1690
1670
  className: "flex cursor-pointer items-center gap-4 p-4"
1691
1671
  },
1692
1672
  /* @__PURE__ */ React__namespace.createElement("div", { className: "flex min-w-0 flex-1 items-center gap-3" }, row.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { src: row.avatar, className: "h-9 w-9 shrink-0 rounded-full object-cover", alt: "" }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-mint-400/20 text-xs font-bold text-dark-blue-400" }, initials), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-sm font-bold text-dark-blue-400" }, row.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-400" }, row.email))),
@@ -1925,6 +1905,25 @@ const SplitButton$2 = (props) => {
1925
1905
  ));
1926
1906
  };
1927
1907
 
1908
+ var __defProp$b = Object.defineProperty;
1909
+ var __defProps$9 = Object.defineProperties;
1910
+ var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
1911
+ var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
1912
+ var __hasOwnProp$b = Object.prototype.hasOwnProperty;
1913
+ var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
1914
+ var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1915
+ var __spreadValues$b = (a, b) => {
1916
+ for (var prop in b || (b = {}))
1917
+ if (__hasOwnProp$b.call(b, prop))
1918
+ __defNormalProp$b(a, prop, b[prop]);
1919
+ if (__getOwnPropSymbols$b)
1920
+ for (var prop of __getOwnPropSymbols$b(b)) {
1921
+ if (__propIsEnum$b.call(b, prop))
1922
+ __defNormalProp$b(a, prop, b[prop]);
1923
+ }
1924
+ return a;
1925
+ };
1926
+ var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
1928
1927
  const openDeleteModal = (person, onDelete) => modals.openConfirmModal({
1929
1928
  title: `Remove "${person.givenName && person.familyName ? `${person.givenName} ${person.familyName}` : person.email}" from your organization?`,
1930
1929
  centered: true,
@@ -1934,6 +1933,13 @@ const openDeleteModal = (person, onDelete) => modals.openConfirmModal({
1934
1933
  onConfirm: () => onDelete(person)
1935
1934
  });
1936
1935
  function Table$4(props) {
1936
+ const preparedItems = React__namespace.useMemo(() => {
1937
+ return props.items.map((item) => __spreadProps$9(__spreadValues$b({}, item), {
1938
+ fullName: item.givenName && item.familyName ? `${item.givenName} ${item.familyName}`.toLowerCase() : item.email.toLowerCase(),
1939
+ roleRank: item.isAdmin ? 2 : item.isGroupAdmin ? 1 : 0
1940
+ }));
1941
+ }, [props.items]);
1942
+ const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
1937
1943
  if (props.loading) {
1938
1944
  return /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm text-slate-400" }, "Loading\u2026");
1939
1945
  }
@@ -1948,7 +1954,7 @@ function Table$4(props) {
1948
1954
  }
1949
1955
  );
1950
1956
  }
1951
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[2.2fr_1.2fr_1fr_1fr_0.6fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("div", null, "Name"), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center" }, "Role"), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center" }, "Account Created?"), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center" }, "# of Classes"), /* @__PURE__ */ React__namespace.createElement("div", null)), props.items.map((row, i) => {
1957
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[2.2fr_1.2fr_1fr_1fr_0.6fr] items-center gap-3 border-b border-slate-100 px-5 py-3" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Name", sortKey: "fullName", sortConfig, onSort: requestSort }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Role", sortKey: "roleRank", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Account Created?", sortKey: "hasAccount", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "# of Classes", sortKey: "numberOfClasses", sortConfig, onSort: requestSort, align: "center" }), /* @__PURE__ */ React__namespace.createElement("div", null)), sortedItems.map((row, i) => {
1952
1958
  var _a, _b;
1953
1959
  const name = row.givenName && row.familyName ? `${row.givenName} ${row.familyName}` : row.email;
1954
1960
  const initials = (((_a = row.givenName) == null ? void 0 : _a[0]) || row.email[0] || "?") + (((_b = row.familyName) == null ? void 0 : _b[0]) || "");
@@ -1957,7 +1963,7 @@ function Table$4(props) {
1957
1963
  "div",
1958
1964
  {
1959
1965
  key: row.email,
1960
- className: `grid grid-cols-[2.2fr_1.2fr_1fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i < props.items.length - 1 ? "border-b border-slate-100" : ""}`
1966
+ className: `grid grid-cols-[2.2fr_1.2fr_1fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
1961
1967
  },
1962
1968
  row.href ? /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "flex min-w-0 items-center gap-2.5 no-underline" }, identity) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex min-w-0 items-center gap-2.5" }, identity),
1963
1969
  /* @__PURE__ */ React__namespace.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React__namespace.createElement(
@@ -3057,8 +3063,7 @@ function Table$2(props) {
3057
3063
  }
3058
3064
  );
3059
3065
  }
3060
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
3061
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex-1 text-left hover:text-slate-600" }, "Student Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("isComplete"), className: "w-28 shrink-0 text-center hover:text-slate-600" }, "Status", indicator("isComplete")), categories.map((category) => /* @__PURE__ */ React__namespace.createElement("button", { key: category.categoryId, onClick: () => requestSort(category.categoryId), className: "w-24 shrink-0 text-center hover:text-slate-600" }, category.name, indicator(category.categoryId))), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
3066
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "name", sortConfig, onSort: requestSort, className: "flex-1" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Status", sortKey: "isComplete", sortConfig, onSort: requestSort, align: "center", className: "w-28 shrink-0" }), categories.map((category) => /* @__PURE__ */ React__namespace.createElement(SortableHeader, { key: category.categoryId, label: category.name, sortKey: category.categoryId, sortConfig, onSort: requestSort, align: "center", className: "w-24 shrink-0" })), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
3062
3067
  var _a;
3063
3068
  const isOpen = !!expanded[row.userId];
3064
3069
  const initials = (((_a = row.name) == null ? void 0 : _a[0]) || row.email[0] || "?").toUpperCase();
@@ -3079,8 +3084,10 @@ function Table$2(props) {
3079
3084
  }));
3080
3085
  }
3081
3086
 
3087
+ const OTHER_FILTER = "__other__";
3082
3088
  function Table$1(props) {
3083
3089
  const { items: sortedBadges, requestSort, sortConfig } = useSortableData(props.badges);
3090
+ const [categoryFilter, setCategoryFilter] = React__namespace.useState("");
3084
3091
  if (props.badges.length === 0) {
3085
3092
  return /* @__PURE__ */ React__namespace.createElement(
3086
3093
  PlaceholderBanner,
@@ -3092,29 +3099,44 @@ function Table$1(props) {
3092
3099
  }
3093
3100
  );
3094
3101
  }
3095
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
3096
3102
  const groupedIds = new Set(props.categories.map((c) => c.categoryId));
3097
- const forCategory = (categoryId) => sortedBadges.filter((b) => {
3098
- var _a;
3099
- return (_a = b.categories) == null ? void 0 : _a.includes(categoryId);
3100
- });
3101
3103
  const other = sortedBadges.filter((b) => {
3102
3104
  var _a;
3103
3105
  return !((_a = b.categories) == null ? void 0 : _a.some((id) => groupedIds.has(id)));
3104
3106
  });
3105
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("badgeName"), className: "flex-1 text-left hover:text-slate-600" }, "Badge Name", indicator("badgeName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("weight"), className: "w-24 shrink-0 text-right hover:text-slate-600" }, "Point Value", indicator("weight")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "w-36 shrink-0 text-right hover:text-slate-600" }, "Badge Completion", indicator("percentageCompletion"))), props.categories.map((category) => /* @__PURE__ */ React__namespace.createElement(CategorySection, { key: category.categoryId, name: category.name, badges: forCategory(category.categoryId) })), other.length > 0 && /* @__PURE__ */ React__namespace.createElement(CategorySection, { name: "Other badges", badges: other }));
3107
+ const visibleBadges = !categoryFilter ? sortedBadges : categoryFilter === OTHER_FILTER ? other : sortedBadges.filter((b) => {
3108
+ var _a;
3109
+ return (_a = b.categories) == null ? void 0 : _a.includes(categoryFilter);
3110
+ });
3111
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-2" }, /* @__PURE__ */ React__namespace.createElement(CategoryPill, { label: "All", active: !categoryFilter, onClick: () => setCategoryFilter("") }), props.categories.map((category) => /* @__PURE__ */ React__namespace.createElement(
3112
+ CategoryPill,
3113
+ {
3114
+ key: category.categoryId,
3115
+ label: category.name,
3116
+ active: categoryFilter === category.categoryId,
3117
+ onClick: () => setCategoryFilter(category.categoryId)
3118
+ }
3119
+ )), other.length > 0 && /* @__PURE__ */ React__namespace.createElement(CategoryPill, { label: "Other", active: categoryFilter === OTHER_FILTER, onClick: () => setCategoryFilter(OTHER_FILTER) })), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-4 px-4" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Badge Name", sortKey: "badgeName", sortConfig, onSort: requestSort, className: "flex-1" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Point Value", sortKey: "weight", sortConfig, onSort: requestSort, align: "right", className: "w-24 shrink-0" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Badge Completion", sortKey: "percentageCompletion", sortConfig, onSort: requestSort, align: "right", className: "w-36 shrink-0" })), visibleBadges.length === 0 && /* @__PURE__ */ React__namespace.createElement("div", { className: "rounded-xl border border-dashed border-slate-200 px-4 py-3 text-xs text-slate-400" }, categoryFilter ? "No badges in this category yet." : "No badges yet."), visibleBadges.map((row) => /* @__PURE__ */ React__namespace.createElement(
3120
+ reactRouterDom.Link,
3121
+ {
3122
+ key: row.badgeId,
3123
+ to: row.href,
3124
+ className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
3125
+ },
3126
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1 text-sm font-bold text-dark-blue-400" }, row.badgeName),
3127
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "w-24 shrink-0 text-right text-xs font-black text-mint-400" }, row.weight, " pts"),
3128
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0 text-right text-xs text-slate-500" }, Math.round((row.percentageCompletion + Number.EPSILON) * 100), "%")
3129
+ ))));
3106
3130
  }
3107
- const CategorySection = (props) => /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "px-1 text-sm font-extrabold tracking-tight text-dark-blue-400" }, props.name), props.badges.length === 0 && /* @__PURE__ */ React__namespace.createElement("div", { className: "rounded-xl border border-dashed border-slate-200 px-4 py-3 text-xs text-slate-400" }, "No badges yet."), props.badges.map((row) => /* @__PURE__ */ React__namespace.createElement(
3108
- reactRouterDom.Link,
3131
+ const CategoryPill = (props) => /* @__PURE__ */ React__namespace.createElement(
3132
+ "button",
3109
3133
  {
3110
- key: row.badgeId,
3111
- to: row.href,
3112
- className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
3134
+ type: "button",
3135
+ onClick: props.onClick,
3136
+ className: `rounded-full border px-3.5 py-1.5 text-xs font-bold ${props.active ? "border-sky-blue-400/40 bg-sky-blue-400/20 text-dark-blue-400" : "border-slate-200 bg-white text-slate-500 hover:bg-slate-50"}`
3113
3137
  },
3114
- /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1 text-sm font-bold text-dark-blue-400" }, row.badgeName),
3115
- /* @__PURE__ */ React__namespace.createElement("div", { className: "w-24 shrink-0 text-right text-xs font-black text-mint-400" }, row.weight, " pts"),
3116
- /* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0 text-right text-xs text-slate-500" }, Math.round((row.percentageCompletion + Number.EPSILON) * 100), "%")
3117
- )));
3138
+ props.label
3139
+ );
3118
3140
 
3119
3141
  var __defProp$3 = Object.defineProperty;
3120
3142
  var __defProps$3 = Object.defineProperties;
@@ -3194,7 +3216,7 @@ const Pathway = (props) => {
3194
3216
  (props.allCategories || []).filter((c) => !c.parentCategoryId).map((c) => c.categoryId)
3195
3217
  );
3196
3218
  const badgeGroupCategories = criteriaCategories.filter((c) => !rootCategoryIds.has(c.categoryId));
3197
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: props.imageURL, alt: props.title, size: "lg", icon: icons.IconRoute, accent: "cyan" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: props.onBackClick, className: "flex w-max cursor-pointer items-center gap-1 text-xs font-bold text-sky-blue-400" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.title || "Pathway"), !!((_a = props.displayTags) == null ? void 0 : _a.length) && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-1.5" }, props.displayTags.map((tag) => /* @__PURE__ */ React__namespace.createElement("span", { key: tag, className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, tag))), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description"), (criteriaCategories.length > 0 || !!((_b = props.allCategories) == null ? void 0 : _b.length)) && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-center gap-1.5 pt-0.5" }, criteriaCategories.length > 0 && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement("span", { className: "text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, "Criteria"), criteriaCategories.map((c) => /* @__PURE__ */ React__namespace.createElement("span", { key: c.categoryId, className: "rounded-full bg-sky-blue-400/15 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, c.name, ": ", criteria[c.categoryId], "+", c.maxPoints ? ` of ${c.maxPoints}` : "", " pts"))), !!((_c = props.allCategories) == null ? void 0 : _c.length) && /* @__PURE__ */ React__namespace.createElement(
3219
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: props.imageURL, alt: props.title, size: "xl", icon: icons.IconRoute, accent: "cyan" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: props.onBackClick, className: "flex w-max cursor-pointer items-center gap-1 text-xs font-bold text-sky-blue-400" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.title || "Pathway"), !!((_a = props.displayTags) == null ? void 0 : _a.length) && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-1.5" }, props.displayTags.map((tag) => /* @__PURE__ */ React__namespace.createElement("span", { key: tag, className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, tag))), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description"), (criteriaCategories.length > 0 || !!((_b = props.allCategories) == null ? void 0 : _b.length)) && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-center gap-1.5 pt-0.5" }, criteriaCategories.length > 0 && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement("span", { className: "text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, "Criteria"), criteriaCategories.map((c) => /* @__PURE__ */ React__namespace.createElement("span", { key: c.categoryId, className: "rounded-full bg-sky-blue-400/15 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, c.name, ": ", criteria[c.categoryId], "+", c.maxPoints ? ` of ${c.maxPoints}` : "", " pts"))), !!((_c = props.allCategories) == null ? void 0 : _c.length) && /* @__PURE__ */ React__namespace.createElement(
3198
3220
  "button",
3199
3221
  {
3200
3222
  onClick: () => setCategoriesOpen(true),
@@ -3336,8 +3358,7 @@ function Table(props) {
3336
3358
  }
3337
3359
  );
3338
3360
  }
3339
- const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
3340
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex-1 text-left hover:text-slate-600" }, "Student Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("submissionCount"), className: "w-16 shrink-0 text-left hover:text-slate-600" }, "Files", indicator("submissionCount")), props.onReview && /* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
3361
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4" }, /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Student Name", sortKey: "name", sortConfig, onSort: requestSort, className: "flex-1" }), /* @__PURE__ */ React__namespace.createElement(SortableHeader, { label: "Files", sortKey: "submissionCount", sortConfig, onSort: requestSort, className: "w-16 shrink-0" }), props.onReview && /* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
3341
3362
  const isOpen = !!expanded[row.userId];
3342
3363
  return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
3343
3364
  "div",