@local-civics/mgmt-ui 0.1.213 → 0.1.215

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
@@ -61,7 +61,7 @@ function styleInject(css, ref) {
61
61
  }
62
62
  }
63
63
 
64
- 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: }.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.\\!relative{position:relative!important}.m-3{margin:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.mt-2{margin-top:.5rem}.mt-1\\.5{margin-top:.375rem}.ml-\\[29px\\]{margin-left:29px}.mt-0\\.5{margin-top:.125rem}.mt-0{margin-top:0}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-full{height:100%}.h-8{height:2rem}.h-7{height:1.75rem}.h-screen{height:100vh}.h-\\[30px\\]{height:30px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-8{width:2rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-7{width:1.75rem}.w-screen{width:100vw}.w-\\[230px\\]{width:230px}.w-24{width:6rem}.w-\\[30px\\]{width:30px}.min-w-0{min-width:0}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.rotate-90{--tw-rotate:90deg}.rotate-90,.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}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1\\.2fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1.2fr 1fr .6fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-5{gap:1.25rem}.gap-2\\.5{gap:.625rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-3{gap:.75rem}.gap-0\\.5{gap:.125rem}.gap-0{gap:0}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-y-4{row-gap:1rem}.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-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)))}.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-xl{border-radius:.75rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-2xl{border-radius:1rem}.rounded-\\[10px\\]{border-radius:10px}.rounded-\\[8px\\]{border-radius:8px}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.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-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}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-dark-blue-400{--tw-bg-opacity:1;background-color:rgb(35 42 58/var(--tw-bg-opacity))}.bg-mint-400\\/20{background-color:rgba(30,226,175,.2)}.bg-gold-400\\/15{background-color:rgba(255,212,77,.15)}.bg-sky-blue-400\\/15{background-color:rgba(59,208,242,.15)}.bg-sky-blue-400\\/25{background-color:rgba(59,208,242,.25)}.bg-mint-400\\/15{background-color:rgba(30,226,175,.15)}.bg-mint-400\\/25{background-color:rgba(30,226,175,.25)}.bg-gold-400\\/25{background-color:rgba(255,212,77,.25)}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.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-\\[\\#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-8{padding:2rem}.p-4{padding:1rem}.p-2\\.5{padding:.625rem}.p-2{padding:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-4{padding-bottom:1rem;padding-top:1rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}.py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-0\\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.pl-2\\.5{padding-left:.625rem}.pl-2{padding-left:.5rem}.text-center{text-align:center}.font-proxima{font-family:ProximaNova}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-\\[10px\\]{font-size:10px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\\[11px\\]{font-size:11px}.text-\\[11\\.5px\\]{font-size:11.5px}.font-extrabold{font-weight:800}.font-bold{font-weight:700}.font-medium{font-weight:500}.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-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-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-sky-blue-400{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-mint-400{--tw-text-opacity:1;color:rgb(30 226 175/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-white\\/70{color:hsla(0,0%,100%,.7)}.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{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)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}*,:after,:before{border-style:solid;border-width:0}.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))}.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\\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.disabled\\:opacity-50:disabled{opacity:.5}";
64
+ 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\\.5{left:.875rem}.top-1\\/2{top:50%}.left-3{left:.75rem}.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-\\[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-8{height:2rem}.h-7{height:1.75rem}.h-12{height:3rem}.h-9{height:2.25rem}.h-screen{height:100vh}.h-\\[30px\\]{height:30px}.w-10{width:2.5rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-8{width:2rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-7{width:1.75rem}.w-64{width:16rem}.w-12{width:3rem}.w-16{width:4rem}.w-36{width:9rem}.w-4{width:1rem}.w-9{width:2.25rem}.w-\\[440px\\]{width:440px}.w-40{width:10rem}.w-screen{width:100vw}.w-\\[230px\\]{width:230px}.w-24{width:6rem}.w-\\[30px\\]{width:30px}.min-w-0{min-width:0}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y:-50%}.-translate-y-1\\/2,.rotate-180{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-180{--tw-rotate:180deg}.rotate-90{--tw-rotate:90deg}.rotate-90,.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}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1\\.2fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1.2fr 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-2\\.5{gap:.625rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-3{gap:.75rem}.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>: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-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)))}.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-xl{border-radius:.75rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-\\[8px\\]{border-radius:8px}.border{border-width:1px}.border-l-4{border-left-width:4px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-l{border-left-width:1px}.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-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-transparent{background-color:transparent}.bg-dark-blue-400{--tw-bg-opacity:1;background-color:rgb(35 42 58/var(--tw-bg-opacity))}.bg-mint-400\\/20{background-color:rgba(30,226,175,.2)}.bg-mint-100{--tw-bg-opacity:1;background-color:rgb(208 251 240/var(--tw-bg-opacity))}.bg-sky-blue-400\\/20{background-color:rgba(59,208,242,.2)}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-white\\/90{background-color:hsla(0,0%,100%,.9)}.bg-gold-100{--tw-bg-opacity:1;background-color:rgb(255 248 214/var(--tw-bg-opacity))}.bg-gold-400\\/15{background-color:rgba(255,212,77,.15)}.bg-sky-blue-400\\/15{background-color:rgba(59,208,242,.15)}.bg-sky-blue-400\\/25{background-color:rgba(59,208,242,.25)}.bg-mint-400\\/15{background-color:rgba(30,226,175,.15)}.bg-mint-400\\/25{background-color:rgba(30,226,175,.25)}.bg-gold-400\\/25{background-color:rgba(255,212,77,.25)}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.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-8{padding:2rem}.p-4{padding:1rem}.p-1{padding:.25rem}.p-5{padding:1.25rem}.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-3{padding-bottom:.75rem;padding-top:.75rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-4{padding-bottom:1rem;padding-top:1rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}.py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-0\\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.pb-2{padding-bottom:.5rem}.pl-10{padding-left:2.5rem}.pr-4{padding-right:1rem}.pl-2\\.5{padding-left:.625rem}.pl-2{padding-left:.5rem}.text-left{text-align:left}.text-center{text-align:center}.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-lg{font-size:1.125rem;line-height:1.75rem}.text-\\[10px\\]{font-size:10px}.text-\\[10\\.5px\\]{font-size:10.5px}.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-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-sky-blue-400{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-mint-400{--tw-text-opacity:1;color:rgb(30 226 175/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-white\\/70{color:hsla(0,0%,100%,.7)}.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))}.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-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-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/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}";
65
65
  styleInject(css_248z);
66
66
 
67
67
  function UserButton({ image, name, email }) {
@@ -145,25 +145,25 @@ function LinksGroup({ icon: Icon, href, label, accent = "cyan", initiallyOpened,
145
145
  ), 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));
146
146
  }
147
147
 
148
- var __defProp$d = Object.defineProperty;
149
- var __defProps$9 = Object.defineProperties;
150
- var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
151
- var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
152
- var __hasOwnProp$d = Object.prototype.hasOwnProperty;
153
- var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
154
- var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
155
- var __spreadValues$d = (a, b) => {
148
+ var __defProp$f = Object.defineProperty;
149
+ var __defProps$b = Object.defineProperties;
150
+ var __getOwnPropDescs$b = Object.getOwnPropertyDescriptors;
151
+ var __getOwnPropSymbols$f = Object.getOwnPropertySymbols;
152
+ var __hasOwnProp$f = Object.prototype.hasOwnProperty;
153
+ var __propIsEnum$f = Object.prototype.propertyIsEnumerable;
154
+ var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
155
+ var __spreadValues$f = (a, b) => {
156
156
  for (var prop in b || (b = {}))
157
- if (__hasOwnProp$d.call(b, prop))
158
- __defNormalProp$d(a, prop, b[prop]);
159
- if (__getOwnPropSymbols$d)
160
- for (var prop of __getOwnPropSymbols$d(b)) {
161
- if (__propIsEnum$d.call(b, prop))
162
- __defNormalProp$d(a, prop, b[prop]);
157
+ if (__hasOwnProp$f.call(b, prop))
158
+ __defNormalProp$f(a, prop, b[prop]);
159
+ if (__getOwnPropSymbols$f)
160
+ for (var prop of __getOwnPropSymbols$f(b)) {
161
+ if (__propIsEnum$f.call(b, prop))
162
+ __defNormalProp$f(a, prop, b[prop]);
163
163
  }
164
164
  return a;
165
165
  };
166
- var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
166
+ var __spreadProps$b = (a, b) => __defProps$b(a, __getOwnPropDescs$b(b));
167
167
  const data = [
168
168
  { label: "Home", icon: icons.IconHome2, accent: "cyan" },
169
169
  { label: "Dashboard", icon: icons.IconGauge, accent: "mint" },
@@ -190,12 +190,12 @@ function Navbar(props) {
190
190
  }
191
191
  return /* @__PURE__ */ React__namespace.createElement(
192
192
  LinksGroup,
193
- __spreadProps$9(__spreadValues$d(__spreadValues$d({
193
+ __spreadProps$b(__spreadValues$f(__spreadValues$f({
194
194
  key: item.label,
195
195
  active: props.active
196
196
  }, item), context), {
197
197
  links: (item.links || []).map((link) => {
198
- return __spreadValues$d(__spreadValues$d({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
198
+ return __spreadValues$f(__spreadValues$f({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
199
199
  })
200
200
  })
201
201
  );
@@ -215,7 +215,7 @@ const UtilLink = (props) => {
215
215
  );
216
216
  };
217
217
 
218
- const useStyles$o = core.createStyles((theme) => ({
218
+ const useStyles$k = core.createStyles((theme) => ({
219
219
  inner: {
220
220
  paddingTop: theme.spacing.xl,
221
221
  paddingBottom: theme.spacing.xl * 4
@@ -251,7 +251,7 @@ const useStyles$o = core.createStyles((theme) => ({
251
251
  }
252
252
  }));
253
253
  const GettingStarted = (props) => {
254
- const { classes } = useStyles$o();
254
+ const { classes } = useStyles$k();
255
255
  return /* @__PURE__ */ React__namespace.createElement(
256
256
  core.Modal,
257
257
  {
@@ -265,7 +265,7 @@ const GettingStarted = (props) => {
265
265
  );
266
266
  };
267
267
 
268
- const useStyles$n = core.createStyles((theme) => ({
268
+ const useStyles$j = core.createStyles((theme) => ({
269
269
  title: {
270
270
  fontSize: 34,
271
271
  fontWeight: 900,
@@ -306,7 +306,7 @@ const useStyles$n = core.createStyles((theme) => ({
306
306
  }
307
307
  }));
308
308
  const SwitchAccount = (props) => {
309
- const { classes, theme } = useStyles$n();
309
+ const { classes, theme } = useStyles$j();
310
310
  const options = props.accounts.map((a) => {
311
311
  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")));
312
312
  });
@@ -343,7 +343,7 @@ const Tabs = (props) => {
343
343
  return /* @__PURE__ */ React__namespace.createElement(core.Tabs, { value: props.value, onTabChange: props.onChange }, /* @__PURE__ */ React__namespace.createElement(core.Tabs.List, null, tabs));
344
344
  };
345
345
 
346
- const useStyles$m = core.createStyles((theme) => ({
346
+ const useStyles$i = core.createStyles((theme) => ({
347
347
  button: {
348
348
  borderTopRightRadius: 0,
349
349
  borderBottomRightRadius: 0,
@@ -358,7 +358,7 @@ const useStyles$m = core.createStyles((theme) => ({
358
358
  }
359
359
  }));
360
360
  const SplitButton$4 = (props) => {
361
- const { classes, theme } = useStyles$m();
361
+ const { classes, theme } = useStyles$i();
362
362
  theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
363
363
  return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
364
364
  core.Button,
@@ -386,7 +386,7 @@ const SplitButton$4 = (props) => {
386
386
  ));
387
387
  };
388
388
 
389
- const useStyles$l = core.createStyles((theme) => ({
389
+ const useStyles$h = core.createStyles((theme) => ({
390
390
  wrapper: {
391
391
  display: "flex",
392
392
  alignItems: "center",
@@ -437,7 +437,7 @@ const useStyles$l = core.createStyles((theme) => ({
437
437
  }
438
438
  }));
439
439
  const PlaceholderBanner = (props) => {
440
- const { classes } = useStyles$l();
440
+ const { classes } = useStyles$h();
441
441
  const title = props.title || "Nothing to display";
442
442
  const description = props.description || "We don't have anything to show you here just yet. Add data, check back later, or adjust your search.";
443
443
  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 }));
@@ -489,28 +489,28 @@ function useSortableData(items, config = { key: "", direction: null }) {
489
489
  return { items: sortedItems, requestSort, sortConfig };
490
490
  }
491
491
 
492
- var __defProp$c = Object.defineProperty;
493
- var __defProps$8 = Object.defineProperties;
494
- var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;
495
- var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
496
- var __hasOwnProp$c = Object.prototype.hasOwnProperty;
497
- var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
498
- var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
499
- var __spreadValues$c = (a, b) => {
492
+ var __defProp$e = Object.defineProperty;
493
+ var __defProps$a = Object.defineProperties;
494
+ var __getOwnPropDescs$a = Object.getOwnPropertyDescriptors;
495
+ var __getOwnPropSymbols$e = Object.getOwnPropertySymbols;
496
+ var __hasOwnProp$e = Object.prototype.hasOwnProperty;
497
+ var __propIsEnum$e = Object.prototype.propertyIsEnumerable;
498
+ var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
499
+ var __spreadValues$e = (a, b) => {
500
500
  for (var prop in b || (b = {}))
501
- if (__hasOwnProp$c.call(b, prop))
502
- __defNormalProp$c(a, prop, b[prop]);
503
- if (__getOwnPropSymbols$c)
504
- for (var prop of __getOwnPropSymbols$c(b)) {
505
- if (__propIsEnum$c.call(b, prop))
506
- __defNormalProp$c(a, prop, b[prop]);
501
+ if (__hasOwnProp$e.call(b, prop))
502
+ __defNormalProp$e(a, prop, b[prop]);
503
+ if (__getOwnPropSymbols$e)
504
+ for (var prop of __getOwnPropSymbols$e(b)) {
505
+ if (__propIsEnum$e.call(b, prop))
506
+ __defNormalProp$e(a, prop, b[prop]);
507
507
  }
508
508
  return a;
509
509
  };
510
- var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));
510
+ var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
511
511
  function Table$k(props) {
512
512
  const preparedItems = React__namespace.useMemo(() => {
513
- return props.items.map((item) => __spreadProps$8(__spreadValues$c({}, item), {
513
+ return props.items.map((item) => __spreadProps$a(__spreadValues$e({}, item), {
514
514
  status: item.isComplete ? 1 : 0
515
515
  }));
516
516
  }, [props.items]);
@@ -607,7 +607,7 @@ function Table$j(props) {
607
607
  ));
608
608
  }
609
609
 
610
- const useStyles$k = core.createStyles((theme) => ({
610
+ const useStyles$g = core.createStyles((theme) => ({
611
611
  title: {
612
612
  fontSize: 34,
613
613
  fontWeight: 900,
@@ -620,12 +620,12 @@ const useStyles$k = core.createStyles((theme) => ({
620
620
  }
621
621
  }));
622
622
  const Badge = (props) => {
623
- const { classes } = useStyles$k();
623
+ const { classes } = useStyles$g();
624
624
  const [tab, setTab] = React.useState("lessons");
625
625
  const numberOfStudents = props.students.length;
626
626
  const numberOfBadges = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
627
627
  numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length / numberOfStudents : 0;
628
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
628
+ return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
629
629
  core.Badge,
630
630
  {
631
631
  variant: "filled",
@@ -706,7 +706,7 @@ function Table$i(props) {
706
706
  }
707
707
 
708
708
  const Badges = (props) => {
709
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "mx-auto flex max-w-4xl flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Badges and micro-credentials"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Project-sized skills acquisition and standards alignment.")), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-2.5 rounded-xl border border-slate-200 bg-white px-4 py-3 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(icons.IconSearch, { size: 15, stroke: 1.75, className: "text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
709
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Badges and micro-credentials"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Project-sized skills acquisition and standards alignment.")), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-2.5 rounded-xl border border-slate-200 bg-white px-4 py-3 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(icons.IconSearch, { size: 15, stroke: 1.75, className: "text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
710
710
  "input",
711
711
  {
712
712
  type: "text",
@@ -823,7 +823,7 @@ function Table$d(props) {
823
823
 
824
824
  const Dashboard = (props) => {
825
825
  const [tab, setTab] = React.useState("students");
826
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(core.Title, { size: "h3" }, "Dashboard"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", size: "sm", mt: "md" }, "Track your students\u2019 pathway progress")), /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
826
+ return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(core.Title, { size: "h3" }, "Dashboard"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", size: "sm", mt: "md" }, "Track your students\u2019 pathway progress")), /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
827
827
  {
828
828
  title: "# OF STUDENTS",
829
829
  value: props.students.length
@@ -905,6 +905,25 @@ const Dashboard = (props) => {
905
905
  )))))));
906
906
  };
907
907
 
908
+ var __defProp$d = Object.defineProperty;
909
+ var __defProps$9 = Object.defineProperties;
910
+ var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
911
+ var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
912
+ var __hasOwnProp$d = Object.prototype.hasOwnProperty;
913
+ var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
914
+ var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
915
+ var __spreadValues$d = (a, b) => {
916
+ for (var prop in b || (b = {}))
917
+ if (__hasOwnProp$d.call(b, prop))
918
+ __defNormalProp$d(a, prop, b[prop]);
919
+ if (__getOwnPropSymbols$d)
920
+ for (var prop of __getOwnPropSymbols$d(b)) {
921
+ if (__propIsEnum$d.call(b, prop))
922
+ __defNormalProp$d(a, prop, b[prop]);
923
+ }
924
+ return a;
925
+ };
926
+ var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
908
927
  const openDeleteModal = (student, onDelete) => modals.openConfirmModal({
909
928
  title: `Remove "${student.givenName && student.familyName ? `${student.givenName} ${student.familyName}` : student.email}" from this class?`,
910
929
  centered: true,
@@ -914,24 +933,32 @@ const openDeleteModal = (student, onDelete) => modals.openConfirmModal({
914
933
  onConfirm: () => onDelete(student)
915
934
  });
916
935
  function Table$c(props) {
936
+ const preparedItems = React__namespace.useMemo(() => {
937
+ return props.items.map((item) => __spreadProps$9(__spreadValues$d({}, item), {
938
+ fullName: item.givenName && item.familyName ? `${item.givenName} ${item.familyName}`.toLowerCase() : item.email.toLowerCase()
939
+ }));
940
+ }, [props.items]);
941
+ const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
917
942
  if (props.loading) {
918
943
  return /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm text-slate-400" }, "Loading\u2026");
919
944
  }
920
945
  if (props.items.length === 0) {
921
946
  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.");
922
947
  }
923
- 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-400" }, /* @__PURE__ */ React__namespace.createElement("div", null, "Name"), /* @__PURE__ */ React__namespace.createElement("div", null, "Role"), /* @__PURE__ */ React__namespace.createElement("div", null, "Badges Earned"), /* @__PURE__ */ React__namespace.createElement("div", null, "Lessons Completed"), /* @__PURE__ */ React__namespace.createElement("div", null, "Account Created?"), /* @__PURE__ */ React__namespace.createElement("div", null)), props.items.map((row, i) => {
948
+ const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
949
+ 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) => {
924
950
  var _a, _b;
925
951
  const name = row.givenName && row.familyName ? `${row.givenName} ${row.familyName}` : row.email;
926
952
  const initials = (((_a = row.givenName) == null ? void 0 : _a[0]) || row.email[0] || "?") + (((_b = row.familyName) == null ? void 0 : _b[0]) || "");
953
+ const identity = /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, row.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { className: "h-8 w-8 shrink-0 rounded-full object-cover", src: row.avatar, alt: name }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-mint-400/20 text-[10px] font-bold text-dark-blue-400" }, initials.toUpperCase()), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs font-bold text-dark-blue-400" }, name), /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-[10.5px] text-slate-500" }, row.email)));
927
954
  return /* @__PURE__ */ React__namespace.createElement(
928
955
  "div",
929
956
  {
930
957
  key: row.email,
931
- className: `grid grid-cols-[2.2fr_1.2fr_1fr_1.2fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i < props.items.length - 1 ? "border-b border-slate-100" : ""}`
958
+ className: `grid grid-cols-[2.2fr_1.2fr_1fr_1.2fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
932
959
  },
933
- /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "flex min-w-0 items-center gap-2.5 no-underline" }, row.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { className: "h-8 w-8 shrink-0 rounded-full object-cover", src: row.avatar, alt: name }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-mint-400/20 text-[10px] font-bold text-dark-blue-400" }, initials.toUpperCase()), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs font-bold text-dark-blue-400" }, name), /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-[10.5px] text-slate-400" }, row.email))),
934
- /* @__PURE__ */ React__namespace.createElement(
960
+ 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),
961
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React__namespace.createElement(
935
962
  "select",
936
963
  {
937
964
  disabled: row.readonly,
@@ -941,16 +968,16 @@ function Table$c(props) {
941
968
  },
942
969
  /* @__PURE__ */ React__namespace.createElement("option", { value: "student" }, "Student"),
943
970
  /* @__PURE__ */ React__namespace.createElement("option", { value: "educator" }, "Educator")
944
- ),
945
- /* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs font-bold text-dark-blue-400" }, row.badgesEarned),
946
- /* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs font-bold text-dark-blue-400" }, row.lessonsCompleted),
947
- /* @__PURE__ */ React__namespace.createElement("div", null, row.hasAccount && /* @__PURE__ */ React__namespace.createElement(icons.IconCheck, { size: 16, stroke: 3, className: "text-mint-400" })),
971
+ )),
972
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, row.badgesEarned),
973
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, row.lessonsCompleted),
974
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "flex justify-center" }, row.hasAccount && /* @__PURE__ */ React__namespace.createElement(icons.IconCheck, { size: 16, stroke: 3, className: "text-mint-400" })),
948
975
  /* @__PURE__ */ React__namespace.createElement("div", null, !row.readonly && !!props.onDelete && /* @__PURE__ */ React__namespace.createElement(
949
976
  "button",
950
977
  {
951
978
  type: "button",
952
979
  onClick: () => openDeleteModal(row, props.onDelete),
953
- className: "flex h-7 w-7 items-center justify-center rounded-md text-slate-300 hover:bg-red-50 hover:text-red-500"
980
+ className: "flex h-7 w-7 items-center justify-center rounded-md text-slate-400 hover:bg-red-50 hover:text-red-500"
954
981
  },
955
982
  /* @__PURE__ */ React__namespace.createElement(icons.IconTrash, { size: 14, stroke: 1.75 })
956
983
  ))
@@ -958,25 +985,25 @@ function Table$c(props) {
958
985
  }));
959
986
  }
960
987
 
961
- var __defProp$b = Object.defineProperty;
962
- var __defProps$7 = Object.defineProperties;
963
- var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;
964
- var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
965
- var __hasOwnProp$b = Object.prototype.hasOwnProperty;
966
- var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
967
- var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
968
- var __spreadValues$b = (a, b) => {
988
+ var __defProp$c = Object.defineProperty;
989
+ var __defProps$8 = Object.defineProperties;
990
+ var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;
991
+ var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
992
+ var __hasOwnProp$c = Object.prototype.hasOwnProperty;
993
+ var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
994
+ var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
995
+ var __spreadValues$c = (a, b) => {
969
996
  for (var prop in b || (b = {}))
970
- if (__hasOwnProp$b.call(b, prop))
971
- __defNormalProp$b(a, prop, b[prop]);
972
- if (__getOwnPropSymbols$b)
973
- for (var prop of __getOwnPropSymbols$b(b)) {
974
- if (__propIsEnum$b.call(b, prop))
975
- __defNormalProp$b(a, prop, b[prop]);
997
+ if (__hasOwnProp$c.call(b, prop))
998
+ __defNormalProp$c(a, prop, b[prop]);
999
+ if (__getOwnPropSymbols$c)
1000
+ for (var prop of __getOwnPropSymbols$c(b)) {
1001
+ if (__propIsEnum$c.call(b, prop))
1002
+ __defNormalProp$c(a, prop, b[prop]);
976
1003
  }
977
1004
  return a;
978
1005
  };
979
- var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));
1006
+ var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));
980
1007
  const Class = (props) => {
981
1008
  const [opened, setOpened] = React.useState(false);
982
1009
  return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(
@@ -988,8 +1015,8 @@ const Class = (props) => {
988
1015
  padding: "xl",
989
1016
  size: "xl"
990
1017
  },
991
- /* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$7(__spreadValues$b({}, props), { close: () => setOpened(false) }))
992
- ), /* @__PURE__ */ React__namespace.createElement("div", { className: "mx-auto flex max-w-5xl 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(
1018
+ /* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$8(__spreadValues$c({}, props), { close: () => setOpened(false) }))
1019
+ ), /* @__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(
993
1020
  "button",
994
1021
  {
995
1022
  type: "button",
@@ -1114,20 +1141,20 @@ const DropzoneButton$1 = (props) => {
1114
1141
  props.onCreateMembers && props.onCreateMembers([values]);
1115
1142
  }) }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
1116
1143
  core.TextInput,
1117
- __spreadValues$b({
1144
+ __spreadValues$c({
1118
1145
  withAsterisk: true,
1119
1146
  label: "Email",
1120
1147
  placeholder: "Email"
1121
1148
  }, form$1.getInputProps("email"))
1122
1149
  ), /* @__PURE__ */ React__namespace.createElement(core.Group, { grow: true }, /* @__PURE__ */ React__namespace.createElement(
1123
1150
  core.TextInput,
1124
- __spreadValues$b({
1151
+ __spreadValues$c({
1125
1152
  label: "Given name",
1126
1153
  placeholder: "Given name"
1127
1154
  }, form$1.getInputProps("givenName"))
1128
1155
  ), /* @__PURE__ */ React__namespace.createElement(
1129
1156
  core.TextInput,
1130
- __spreadValues$b({
1157
+ __spreadValues$c({
1131
1158
  label: "Family name",
1132
1159
  placeholder: "Family name"
1133
1160
  }, form$1.getInputProps("familyName"))
@@ -1207,23 +1234,23 @@ function Table$b(props) {
1207
1234
  ));
1208
1235
  }
1209
1236
 
1210
- var __defProp$a = Object.defineProperty;
1211
- var __getOwnPropSymbols$a = Object.getOwnPropertySymbols;
1212
- var __hasOwnProp$a = Object.prototype.hasOwnProperty;
1213
- var __propIsEnum$a = Object.prototype.propertyIsEnumerable;
1214
- var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1215
- var __spreadValues$a = (a, b) => {
1237
+ var __defProp$b = Object.defineProperty;
1238
+ var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
1239
+ var __hasOwnProp$b = Object.prototype.hasOwnProperty;
1240
+ var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
1241
+ var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1242
+ var __spreadValues$b = (a, b) => {
1216
1243
  for (var prop in b || (b = {}))
1217
- if (__hasOwnProp$a.call(b, prop))
1218
- __defNormalProp$a(a, prop, b[prop]);
1219
- if (__getOwnPropSymbols$a)
1220
- for (var prop of __getOwnPropSymbols$a(b)) {
1221
- if (__propIsEnum$a.call(b, prop))
1222
- __defNormalProp$a(a, prop, b[prop]);
1244
+ if (__hasOwnProp$b.call(b, prop))
1245
+ __defNormalProp$b(a, prop, b[prop]);
1246
+ if (__getOwnPropSymbols$b)
1247
+ for (var prop of __getOwnPropSymbols$b(b)) {
1248
+ if (__propIsEnum$b.call(b, prop))
1249
+ __defNormalProp$b(a, prop, b[prop]);
1223
1250
  }
1224
1251
  return a;
1225
1252
  };
1226
- const useStyles$j = core.createStyles((theme) => ({
1253
+ const useStyles$f = core.createStyles((theme) => ({
1227
1254
  title: {
1228
1255
  fontSize: 34,
1229
1256
  fontWeight: 900,
@@ -1236,7 +1263,7 @@ const useStyles$j = core.createStyles((theme) => ({
1236
1263
  }
1237
1264
  }));
1238
1265
  const Classes = (props) => {
1239
- const { classes } = useStyles$j();
1266
+ const { classes } = useStyles$f();
1240
1267
  const form$1 = form.useForm({
1241
1268
  initialValues: {
1242
1269
  classId: "",
@@ -1266,19 +1293,19 @@ const Classes = (props) => {
1266
1293
  props.onCreateClass && props.onCreateClass(values);
1267
1294
  }) }, /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(
1268
1295
  core.TextInput,
1269
- __spreadValues$a({
1296
+ __spreadValues$b({
1270
1297
  withAsterisk: true,
1271
1298
  label: "Name",
1272
1299
  placeholder: "Class name"
1273
1300
  }, form$1.getInputProps("name"))
1274
1301
  ), /* @__PURE__ */ React__namespace.createElement(
1275
1302
  core.TextInput,
1276
- __spreadValues$a({
1303
+ __spreadValues$b({
1277
1304
  label: "Description",
1278
1305
  placeholder: "A class for my first period English students"
1279
1306
  }, form$1.getInputProps("description"))
1280
1307
  )), /* @__PURE__ */ React__namespace.createElement(core.Button, { type: "submit", fullWidth: true, mt: "md" }, "Submit"))
1281
- ), /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.Badge, { variant: "filled", size: "lg" }, "Classes"), /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, "Organize people into classes"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, "Create classes, cohorts, or custom subgroups")), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "content" }, !props.loading && /* @__PURE__ */ React__namespace.createElement(
1308
+ ), /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.Badge, { variant: "filled", size: "lg" }, "Classes"), /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, "Organize people into classes"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, "Create classes, cohorts, or custom subgroups")), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "content" }, !props.loading && /* @__PURE__ */ React__namespace.createElement(
1282
1309
  core.Button,
1283
1310
  {
1284
1311
  onClick: () => setOpened(true),
@@ -1307,24 +1334,6 @@ const Classes = (props) => {
1307
1334
  ))))));
1308
1335
  };
1309
1336
 
1310
- const useStyles$i = core.createStyles((theme) => ({
1311
- title: {
1312
- fontSize: 34,
1313
- fontWeight: 900,
1314
- marginTop: 16,
1315
- [theme.fn.smallerThan("sm")]: {
1316
- fontSize: 24
1317
- }
1318
- },
1319
- description: {
1320
- maxWidth: 600
1321
- }
1322
- }));
1323
- const UserInfo = (props) => {
1324
- const { classes } = useStyles$i();
1325
- return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Title, { className: classes.title }, props.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "xs" }, props.impactStatement));
1326
- };
1327
-
1328
1337
  function Table$a(props) {
1329
1338
  if (props.items.length === 0) {
1330
1339
  return /* @__PURE__ */ React__namespace.createElement(
@@ -1337,28 +1346,15 @@ function Table$a(props) {
1337
1346
  }
1338
1347
  );
1339
1348
  }
1340
- return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(
1341
- mantineDatatable.DataTable,
1349
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, props.items.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
1350
+ "div",
1342
1351
  {
1343
- verticalSpacing: "sm",
1344
- sx: { minWidth: 700 },
1345
- withBorder: false,
1346
- borderRadius: "sm",
1347
- withColumnBorders: true,
1348
- striped: true,
1349
- highlightOnHover: true,
1350
- records: props.items,
1351
- idAccessor: "badgeId",
1352
- columns: [{
1353
- accessor: "name",
1354
- title: "Badge Name",
1355
- render: (row) => /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Text, null, row.badgeName))
1356
- }, {
1357
- accessor: "status",
1358
- render: (row) => /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, !!row.isComplete && /* @__PURE__ */ React__namespace.createElement(core.Badge, { variant: "filled" }, "Complete"), !row.isComplete && /* @__PURE__ */ React__namespace.createElement(core.Badge, { color: "red", variant: "filled" }, "Incomplete"))
1359
- }]
1360
- }
1361
- ));
1352
+ key: row.badgeId || row.badgeName,
1353
+ className: `flex items-center justify-between gap-4 px-5 py-4 ${i < props.items.length - 1 ? "border-b border-slate-100" : ""}`
1354
+ },
1355
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-bold text-dark-blue-400" }, row.badgeName),
1356
+ /* @__PURE__ */ React__namespace.createElement("span", { className: `shrink-0 rounded-full px-2.5 py-1 text-[10px] font-bold uppercase tracking-wide ${row.isComplete ? "bg-mint-100 text-dark-blue-400" : "bg-slate-100 text-slate-500"}` }, row.isComplete ? "Complete" : "Incomplete")
1357
+ )));
1362
1358
  }
1363
1359
 
1364
1360
  function Table$9(props) {
@@ -1373,8 +1369,26 @@ function Table$9(props) {
1373
1369
  }
1374
1370
  );
1375
1371
  }
1376
- const rows = props.items.map((row) => /* @__PURE__ */ React__namespace.createElement("tr", { key: row.questionName }, /* @__PURE__ */ React__namespace.createElement("td", null, /* @__PURE__ */ React__namespace.createElement(core.Text, { component: reactRouterDom.Link, to: row.href }, row.lessonName)), /* @__PURE__ */ React__namespace.createElement("td", null, row.questionName), /* @__PURE__ */ React__namespace.createElement("td", null, row.answer.join(","))));
1377
- return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(core.Table, { verticalSpacing: "sm", sx: { minWidth: 700 }, highlightOnHover: true, striped: true }, /* @__PURE__ */ React__namespace.createElement("thead", null, /* @__PURE__ */ React__namespace.createElement("tr", null, /* @__PURE__ */ React__namespace.createElement("th", null, "Lesson Name"), /* @__PURE__ */ React__namespace.createElement("th", null, "Question"), /* @__PURE__ */ React__namespace.createElement("th", null, "Answer"))), /* @__PURE__ */ React__namespace.createElement("tbody", null, rows)));
1372
+ const groups = [];
1373
+ const groupByLessonId = {};
1374
+ props.items.forEach((row) => {
1375
+ let group = groupByLessonId[row.lessonId];
1376
+ if (!group) {
1377
+ group = { lessonId: row.lessonId, lessonName: row.lessonName, badgeName: row.badgeName, href: row.href, items: [] };
1378
+ groupByLessonId[row.lessonId] = group;
1379
+ groups.push(group);
1380
+ }
1381
+ group.items.push(row);
1382
+ });
1383
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, groups.map((group) => /* @__PURE__ */ React__namespace.createElement("div", { key: group.lessonId, className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "border-b border-slate-100 px-5 py-4" }, /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: group.href, className: "text-sm font-bold text-dark-blue-400 no-underline hover:underline" }, group.lessonName), group.badgeName && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-500" }, group.badgeName)), group.items.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
1384
+ "div",
1385
+ {
1386
+ key: row.questionName,
1387
+ className: `px-5 py-4 ${i < group.items.length - 1 ? "border-b border-slate-100" : ""}`
1388
+ },
1389
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs font-semibold text-slate-500" }, row.questionName),
1390
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-600" }, row.answer.join(", "))
1391
+ )))));
1378
1392
  }
1379
1393
 
1380
1394
  function Table$8(props) {
@@ -1389,299 +1403,142 @@ function Table$8(props) {
1389
1403
  }
1390
1404
  );
1391
1405
  }
1392
- const rows = props.items.map((row) => /* @__PURE__ */ React__namespace.createElement("tr", { key: row.lessonName }, /* @__PURE__ */ React__namespace.createElement("td", null, /* @__PURE__ */ React__namespace.createElement(core.Text, { component: reactRouterDom.Link, to: row.href }, row.lessonName)), /* @__PURE__ */ React__namespace.createElement("td", null, row.reflection), /* @__PURE__ */ React__namespace.createElement("td", null, row.rating.toLocaleString())));
1393
- return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(core.Table, { verticalSpacing: "sm", sx: { minWidth: 700 }, highlightOnHover: true, striped: true }, /* @__PURE__ */ React__namespace.createElement("thead", null, /* @__PURE__ */ React__namespace.createElement("tr", null, /* @__PURE__ */ React__namespace.createElement("th", null, "Lesson Name"), /* @__PURE__ */ React__namespace.createElement("th", null, "Reflection"), /* @__PURE__ */ React__namespace.createElement("th", null, "Rating"))), /* @__PURE__ */ React__namespace.createElement("tbody", null, rows)));
1406
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, props.items.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
1407
+ "div",
1408
+ {
1409
+ key: row.lessonId || row.lessonName,
1410
+ className: `flex items-start justify-between gap-4 px-5 py-4 ${i < props.items.length - 1 ? "border-b border-slate-100" : ""}`
1411
+ },
1412
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "text-sm font-bold text-dark-blue-400 no-underline hover:underline" }, row.lessonName), row.badgeName && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-500" }, row.badgeName), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-xs text-slate-600" }, row.reflection)),
1413
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "shrink-0 rounded-full bg-gold-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, row.rating.toLocaleString())
1414
+ )));
1394
1415
  }
1395
1416
 
1417
+ const TABS$1 = [
1418
+ { label: "My badges", value: "badges" },
1419
+ { label: "My answers", value: "answers" },
1420
+ { label: "My reflections", value: "reflections" }
1421
+ ];
1396
1422
  const Student = (props) => {
1397
1423
  const [tab, setTab] = React.useState("badges");
1398
1424
  const numberOfBadgesCompleted = props.badges.length > 0 ? props.badges.filter((b) => b.isComplete).length : 0;
1399
- const TEMPORARY_numberOfLessonsCompleted = props.lessons.filter((l) => l.isComplete).length;
1400
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, { gutter: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
1401
- core.Badge,
1402
- {
1403
- variant: "filled",
1404
- leftSection: /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 14 })),
1405
- size: "lg"
1406
- },
1407
- "Back"
1408
- )), /* @__PURE__ */ React__namespace.createElement(
1409
- UserInfo,
1410
- {
1411
- variant: "compact",
1412
- name: props.name,
1413
- impactStatement: props.impactStatement
1414
- }
1415
- ))), /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "lg" }, /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
1425
+ const numberOfLessonsCompleted = props.lessons.filter((l) => l.isComplete).length;
1426
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__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.name || "Student"), props.impactStatement && /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.impactStatement)), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
1416
1427
  {
1417
1428
  title: "PROBLEMS SOLVED",
1418
1429
  value: props.numberOfProblemsSolved
1419
1430
  },
1420
1431
  {
1421
1432
  title: "LESSON COMPLETION",
1422
- value: TEMPORARY_numberOfLessonsCompleted,
1423
- unit: ""
1433
+ value: numberOfLessonsCompleted
1424
1434
  },
1425
1435
  {
1426
1436
  title: "BADGE COMPLETION",
1427
- value: numberOfBadgesCompleted,
1428
- unit: ""
1437
+ value: numberOfBadgesCompleted
1429
1438
  }
1430
- ] }), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(
1431
- Tabs,
1439
+ ] }), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS$1.map((t) => /* @__PURE__ */ React__namespace.createElement(
1440
+ "button",
1432
1441
  {
1433
- value: tab,
1434
- data: [
1435
- { label: "My badges", value: "badges" },
1436
- { label: "My answers", value: "answers" },
1437
- { label: "My reflections", value: "reflections" }
1438
- ],
1439
- onChange: setTab
1442
+ key: t.value,
1443
+ onClick: () => setTab(t.value),
1444
+ className: `rounded-lg px-4 py-2 text-xs font-bold ${tab === t.value ? "bg-sky-blue-400/20 text-dark-blue-400" : "text-slate-400 hover:text-slate-600"}`
1445
+ },
1446
+ t.label
1447
+ ))), tab === "badges" && /* @__PURE__ */ React__namespace.createElement(Table$a, { loading: props.loading, items: props.badges }), tab === "answers" && /* @__PURE__ */ React__namespace.createElement(Table$9, { loading: props.loading, items: props.answers }), tab === "reflections" && /* @__PURE__ */ React__namespace.createElement(Table$8, { loading: props.loading, items: props.reflections }));
1448
+ };
1449
+
1450
+ const ACCENT_BORDER = {
1451
+ cyan: "border-l-sky-blue-400",
1452
+ mint: "border-l-mint-400",
1453
+ gold: "border-l-gold-400"
1454
+ };
1455
+ const ACCENT_GRADIENT = {
1456
+ cyan: "from-sky-blue-400",
1457
+ mint: "from-mint-400",
1458
+ gold: "from-gold-400"
1459
+ };
1460
+ function CardGradient(props) {
1461
+ const accent = props.accent || "cyan";
1462
+ return /* @__PURE__ */ React__namespace.createElement(
1463
+ "div",
1464
+ {
1465
+ onClick: props.onClick,
1466
+ className: `flex cursor-pointer items-center gap-[18px] rounded-2xl border border-l-4 border-slate-200 bg-white px-[22px] py-[18px] transition-transform hover:scale-[1.02] hover:shadow-md ${ACCENT_BORDER[accent]}`
1467
+ },
1468
+ /* @__PURE__ */ React__namespace.createElement("div", { className: `flex h-10 w-10 shrink-0 items-center justify-center rounded-[10px] bg-gradient-to-br ${ACCENT_GRADIENT[accent]} to-dark-blue-400 text-white` }, props.icon),
1469
+ /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[15.5px] font-extrabold text-dark-blue-400" }, props.title), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-0.5 text-xs text-slate-500" }, props.description))
1470
+ );
1471
+ }
1472
+
1473
+ const Home = (props) => {
1474
+ const accessCode = props.organization.accessCode;
1475
+ const onCopyAccessCode = async () => {
1476
+ if (!accessCode)
1477
+ return;
1478
+ try {
1479
+ await navigator.clipboard.writeText(accessCode);
1480
+ notifications.showNotification({
1481
+ title: "Copied!",
1482
+ message: "Community code copied to clipboard.",
1483
+ autoClose: 3e3
1484
+ });
1485
+ } catch (err) {
1486
+ console.error("Failed to copy code", err);
1440
1487
  }
1441
- ), tab === "badges" && /* @__PURE__ */ React__namespace.createElement(
1442
- Table$a,
1488
+ };
1489
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-full flex-col gap-5" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-stretch gap-5" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[28px] font-extrabold text-dark-blue-400" }, props.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-[12.5px] text-slate-400" }, props.impactStatement)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-[440px] shrink-0 flex-col justify-between gap-3 rounded-2xl bg-gradient-to-br from-dark-blue-600 via-dark-blue-400 to-sky-blue-400 p-5" }, /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-base font-extrabold text-white" }, props.organization.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-[11.5px] leading-relaxed text-white/70" }, props.organization.description)), accessCode && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React__namespace.createElement("span", { className: "text-[11px] text-white/70" }, "Community code: ", accessCode), /* @__PURE__ */ React__namespace.createElement(
1490
+ "button",
1443
1491
  {
1444
- loading: props.loading,
1445
- items: props.badges
1492
+ onClick: onCopyAccessCode,
1493
+ className: "rounded-md bg-white/90 px-2.5 py-1 text-[10.5px] font-bold text-dark-blue-400 hover:bg-white"
1494
+ },
1495
+ "Copy"
1496
+ )))), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
1497
+ CardGradient,
1498
+ {
1499
+ title: "Dashboard",
1500
+ description: "Track your students\u2019 pathway progress",
1501
+ accent: "mint",
1502
+ icon: /* @__PURE__ */ React__namespace.createElement(icons.IconGauge, { size: 18, stroke: 1.75 }),
1503
+ onClick: props.onDashboardClick
1446
1504
  }
1447
- ), tab === "answers" && /* @__PURE__ */ React__namespace.createElement(
1448
- Table$9,
1505
+ ), /* @__PURE__ */ React__namespace.createElement(
1506
+ CardGradient,
1449
1507
  {
1450
- loading: props.loading,
1451
- items: props.answers
1508
+ title: "Classes",
1509
+ description: "Create classes, cohorts, or custom subgroups",
1510
+ accent: "gold",
1511
+ icon: /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, { size: 18, stroke: 1.75 }),
1512
+ onClick: props.onClassesClick
1452
1513
  }
1453
- ), tab === "reflections" && /* @__PURE__ */ React__namespace.createElement(
1454
- Table$8,
1514
+ ), /* @__PURE__ */ React__namespace.createElement(
1515
+ CardGradient,
1455
1516
  {
1456
- loading: props.loading,
1457
- items: props.reflections
1517
+ title: "Pathways",
1518
+ description: "Explore all your unique pathway requirements in one clear space",
1519
+ accent: "cyan",
1520
+ icon: /* @__PURE__ */ React__namespace.createElement(icons.IconRoute, { size: 18, stroke: 1.75 }),
1521
+ onClick: props.onPathwaysClick
1458
1522
  }
1459
- ))))));
1460
- };
1461
-
1462
- const useStyles$h = core.createStyles((theme, props) => {
1463
- const from = props.from || "blue";
1464
- const to = props.to || "green";
1465
- return {
1466
- card: {
1467
- position: "relative",
1468
- cursor: "pointer",
1469
- overflow: "hidden",
1470
- transition: "transform 150ms ease, box-shadow 100ms ease",
1471
- padding: theme.spacing.xl,
1472
- paddingLeft: theme.spacing.xl * 2,
1473
- "&:hover": {
1474
- boxShadow: theme.shadows.md,
1475
- transform: "scale(1.02)"
1476
- },
1477
- "&::before": {
1478
- content: '""',
1479
- position: "absolute",
1480
- top: 0,
1481
- bottom: 0,
1482
- left: 0,
1483
- width: 6,
1484
- backgroundImage: theme.fn.linearGradient(0, theme.colors[from][6], theme.colors[to][6])
1485
- }
1486
- }
1487
- };
1488
- });
1489
- function CardGradient(props) {
1490
- const { classes } = useStyles$h(props);
1491
- const from = props.from || "blue";
1492
- const to = props.to || "green";
1493
- const icon = props.icon || /* @__PURE__ */ React__namespace.createElement(icons.IconColorSwatch, { size: 28, stroke: 1.5 });
1494
- return /* @__PURE__ */ React__namespace.createElement(core.Paper, { withBorder: true, radius: "md", className: classes.card, onClick: props.onClick }, /* @__PURE__ */ React__namespace.createElement(
1495
- core.ThemeIcon,
1496
- {
1497
- size: "xl",
1498
- radius: "md",
1499
- variant: "gradient",
1500
- gradient: { deg: 0, from, to }
1501
- },
1502
- icon
1503
- ), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "xl", weight: 500, mt: "md" }, props.title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", mt: "sm", color: "dimmed" }, props.description));
1504
- }
1505
-
1506
- var __defProp$9 = Object.defineProperty;
1507
- var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
1508
- var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
1509
- var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
1510
- var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1511
- var __spreadValues$9 = (a, b) => {
1512
- for (var prop in b || (b = {}))
1513
- if (__hasOwnProp$9.call(b, prop))
1514
- __defNormalProp$9(a, prop, b[prop]);
1515
- if (__getOwnPropSymbols$9)
1516
- for (var prop of __getOwnPropSymbols$9(b)) {
1517
- if (__propIsEnum$9.call(b, prop))
1518
- __defNormalProp$9(a, prop, b[prop]);
1519
- }
1520
- return a;
1521
- };
1522
- var __objRest$1 = (source, exclude) => {
1523
- var target = {};
1524
- for (var prop in source)
1525
- if (__hasOwnProp$9.call(source, prop) && exclude.indexOf(prop) < 0)
1526
- target[prop] = source[prop];
1527
- if (source != null && __getOwnPropSymbols$9)
1528
- for (var prop of __getOwnPropSymbols$9(source)) {
1529
- if (exclude.indexOf(prop) < 0 && __propIsEnum$9.call(source, prop))
1530
- target[prop] = source[prop];
1531
- }
1532
- return target;
1533
- };
1534
- const useStyles$g = core.createStyles((theme) => ({
1535
- card: {
1536
- height: 240,
1537
- backgroundSize: "cover",
1538
- backgroundPosition: "center",
1539
- whiteSpace: "pre-line"
1540
- },
1541
- content: {
1542
- position: "absolute",
1543
- padding: theme.spacing.xl,
1544
- zIndex: 1,
1545
- top: 0,
1546
- bottom: 0,
1547
- right: 0,
1548
- left: 0
1549
- },
1550
- title: {
1551
- color: theme.white,
1552
- marginBottom: theme.spacing.xs / 2
1553
- },
1554
- description: {
1555
- color: theme.white,
1556
- maxWidth: 220
1557
- },
1558
- code: {
1559
- color: theme.white,
1560
- maxWidth: 220
1561
- }
1562
- }));
1563
- const TenantBanner = (_a) => {
1564
- var _b = _a, {
1565
- title,
1566
- description,
1567
- image,
1568
- style,
1569
- className,
1570
- code
1571
- } = _b, others = __objRest$1(_b, [
1572
- "title",
1573
- "description",
1574
- "image",
1575
- "style",
1576
- "className",
1577
- "code"
1578
- ]);
1579
- const { classes, cx, theme } = useStyles$g();
1580
- const handleCopy = async () => {
1581
- if (!code)
1582
- return;
1583
- try {
1584
- await navigator.clipboard.writeText(code);
1585
- notifications.showNotification({
1586
- title: "Copied!",
1587
- message: "Community code copied to clipboard.",
1588
- autoClose: 3e3
1589
- });
1590
- } catch (err) {
1591
- console.error("Failed to copy code", err);
1592
- }
1593
- };
1594
- return /* @__PURE__ */ React__namespace.createElement(
1595
- core.Card,
1596
- __spreadValues$9({
1597
- radius: "md",
1598
- style: __spreadValues$9({ backgroundImage: `url(${image})` }, style),
1599
- className: cx(classes.card, className)
1600
- }, others),
1601
- /* @__PURE__ */ React__namespace.createElement(
1602
- core.Overlay,
1603
- {
1604
- gradient: `linear-gradient(105deg, ${theme.black} 20%, #312f2f 50%, ${theme.colors.gray[6]} 100%)`,
1605
- opacity: 0.55,
1606
- zIndex: 0
1607
- }
1608
- ),
1609
- /* @__PURE__ */ React__namespace.createElement("div", { className: classes.content }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "lg", weight: 700, className: classes.title }, title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.description }, description), /* @__PURE__ */ React__namespace.createElement(core.Group, { mt: "sm", spacing: "xs" }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.code }, "Community Code: ", code || "\u2014"), code && /* @__PURE__ */ React__namespace.createElement(
1610
- core.Button,
1611
- {
1612
- size: "xs",
1613
- variant: "white",
1614
- onClick: handleCopy,
1615
- styles: {
1616
- root: {
1617
- backgroundColor: "rgba(255,255,255,0.9)"
1618
- }
1619
- }
1620
- },
1621
- "Copy"
1622
- )))
1623
- );
1624
- };
1625
-
1626
- const Home = (props) => {
1627
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "lg" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, { gutter: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { md: 6 }, /* @__PURE__ */ React__namespace.createElement(
1628
- UserInfo,
1629
- {
1630
- variant: "compact",
1631
- name: props.name,
1632
- impactStatement: props.impactStatement
1633
- }
1634
- )), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { md: 6 }, /* @__PURE__ */ React__namespace.createElement(
1635
- TenantBanner,
1636
- {
1637
- title: props.organization.name,
1638
- description: props.organization.description,
1639
- image: props.organization.image,
1640
- code: props.organization.accessCode
1641
- }
1642
- ))), /* @__PURE__ */ React__namespace.createElement(core.Grid, { gutter: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
1643
- CardGradient,
1644
- {
1645
- title: "Dashboard",
1646
- description: "Track your students\u2019 pathway progress",
1647
- onClick: props.onDashboardClick
1648
- }
1649
- )), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
1650
- CardGradient,
1651
- {
1652
- title: "Classes",
1653
- description: "Create classes, cohorts, or custom subgroups",
1654
- onClick: props.onClassesClick
1655
- }
1656
- )), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
1657
- CardGradient,
1658
- {
1659
- title: "Pathways",
1660
- description: "Explore all your unique pathway requirements in one clear space",
1661
- onClick: props.onPathwaysClick
1662
- }
1663
- )), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
1664
- CardGradient,
1665
- {
1666
- title: "Badges",
1667
- description: "Key milestones that reflect skill development, micro-credentials, or academic progress",
1668
- onClick: props.onBadgesClick
1669
- }
1670
- )), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
1671
- CardGradient,
1672
- {
1673
- title: "Lessons",
1674
- description: "Bite-sized activities and learning experiences accelerating students achievement",
1675
- onClick: props.onLessonsClick
1676
- }
1677
- )), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
1678
- CardGradient,
1679
- {
1680
- title: "File Locker",
1681
- description: "A secure space to view student-submitted work and provide feedback",
1682
- onClick: props.onFileLockerClick
1683
- }
1684
- )))));
1523
+ ), /* @__PURE__ */ React__namespace.createElement(
1524
+ CardGradient,
1525
+ {
1526
+ title: "Badges",
1527
+ description: "Key milestones that reflect skill development, micro-credentials, or academic progress",
1528
+ accent: "mint",
1529
+ icon: /* @__PURE__ */ React__namespace.createElement(icons.IconAlbum, { size: 18, stroke: 1.75 }),
1530
+ onClick: props.onBadgesClick
1531
+ }
1532
+ ), /* @__PURE__ */ React__namespace.createElement(
1533
+ CardGradient,
1534
+ {
1535
+ title: "File Locker",
1536
+ description: "A secure space to view student-submitted work and provide feedback",
1537
+ accent: "cyan",
1538
+ icon: /* @__PURE__ */ React__namespace.createElement(icons.IconClipboard, { size: 18, stroke: 1.75 }),
1539
+ onClick: props.onFileLockerClick
1540
+ }
1541
+ )));
1685
1542
  };
1686
1543
 
1687
1544
  function Table$7(props) {
@@ -1716,7 +1573,7 @@ function Table$7(props) {
1716
1573
  ));
1717
1574
  }
1718
1575
 
1719
- const useStyles$f = core.createStyles((theme) => ({
1576
+ const useStyles$e = core.createStyles((theme) => ({
1720
1577
  button: {
1721
1578
  borderTopRightRadius: 0,
1722
1579
  borderBottomRightRadius: 0,
@@ -1731,7 +1588,7 @@ const useStyles$f = core.createStyles((theme) => ({
1731
1588
  }
1732
1589
  }));
1733
1590
  const SplitButton$3 = (props) => {
1734
- const { classes, theme } = useStyles$f();
1591
+ const { classes, theme } = useStyles$e();
1735
1592
  theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
1736
1593
  return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
1737
1594
  core.Button,
@@ -1768,28 +1625,28 @@ function Stack$3(props) {
1768
1625
  return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { component: reactRouterDom.Link, to: props.href }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 24, sx: { padding: 20, minWidth: 700 } }, rows)));
1769
1626
  }
1770
1627
 
1771
- var __defProp$8 = Object.defineProperty;
1772
- var __defProps$6 = Object.defineProperties;
1773
- var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
1774
- var __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;
1775
- var __hasOwnProp$8 = Object.prototype.hasOwnProperty;
1776
- var __propIsEnum$8 = Object.prototype.propertyIsEnumerable;
1777
- var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1778
- var __spreadValues$8 = (a, b) => {
1628
+ var __defProp$a = Object.defineProperty;
1629
+ var __defProps$7 = Object.defineProperties;
1630
+ var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;
1631
+ var __getOwnPropSymbols$a = Object.getOwnPropertySymbols;
1632
+ var __hasOwnProp$a = Object.prototype.hasOwnProperty;
1633
+ var __propIsEnum$a = Object.prototype.propertyIsEnumerable;
1634
+ var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1635
+ var __spreadValues$a = (a, b) => {
1779
1636
  for (var prop in b || (b = {}))
1780
- if (__hasOwnProp$8.call(b, prop))
1781
- __defNormalProp$8(a, prop, b[prop]);
1782
- if (__getOwnPropSymbols$8)
1783
- for (var prop of __getOwnPropSymbols$8(b)) {
1784
- if (__propIsEnum$8.call(b, prop))
1785
- __defNormalProp$8(a, prop, b[prop]);
1637
+ if (__hasOwnProp$a.call(b, prop))
1638
+ __defNormalProp$a(a, prop, b[prop]);
1639
+ if (__getOwnPropSymbols$a)
1640
+ for (var prop of __getOwnPropSymbols$a(b)) {
1641
+ if (__propIsEnum$a.call(b, prop))
1642
+ __defNormalProp$a(a, prop, b[prop]);
1786
1643
  }
1787
1644
  return a;
1788
1645
  };
1789
- var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
1646
+ var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));
1790
1647
  function Table$6(props) {
1791
1648
  const preparedItems = React__namespace.useMemo(() => {
1792
- return props.items.map((item) => __spreadProps$6(__spreadValues$8({}, item), {
1649
+ return props.items.map((item) => __spreadProps$7(__spreadValues$a({}, item), {
1793
1650
  status: item.isComplete ? 2 : item.isStarted ? 1 : 0
1794
1651
  }));
1795
1652
  }, [props.items]);
@@ -1909,7 +1766,7 @@ function Stack$2(props) {
1909
1766
  }
1910
1767
  const truncateWithEllipses = (text, max) => text.substr(0, max - 1) + (text.length > max ? "&hellip;" : "");
1911
1768
 
1912
- const useStyles$e = core.createStyles((theme) => ({
1769
+ const useStyles$d = core.createStyles((theme) => ({
1913
1770
  title: {
1914
1771
  fontSize: 34,
1915
1772
  fontWeight: 900,
@@ -1922,7 +1779,7 @@ const useStyles$e = core.createStyles((theme) => ({
1922
1779
  }
1923
1780
  }));
1924
1781
  const Lesson = (props) => {
1925
- const { classes } = useStyles$e();
1782
+ const { classes } = useStyles$d();
1926
1783
  const [tab, setTab] = React.useState("question");
1927
1784
  const numberOfStudents = props.students.length;
1928
1785
  const numberOfLessons = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
@@ -1964,7 +1821,7 @@ const Lesson = (props) => {
1964
1821
  { label: "By student", value: "students" },
1965
1822
  { label: "By reflection", value: "reflections" }
1966
1823
  ];
1967
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
1824
+ return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
1968
1825
  core.Badge,
1969
1826
  {
1970
1827
  variant: "filled",
@@ -2035,65 +1892,35 @@ const Lesson = (props) => {
2035
1892
  };
2036
1893
 
2037
1894
  function Table$5(props) {
1895
+ if (props.loading) {
1896
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm text-slate-400" }, "Loading\u2026");
1897
+ }
2038
1898
  if (props.items.length === 0) {
2039
- return /* @__PURE__ */ React__namespace.createElement(
2040
- PlaceholderBanner,
2041
- {
2042
- title: "No lessons to display",
2043
- description: "We don't have any lessons to show you just yet.",
2044
- loading: props.loading,
2045
- icon: "lessons"
2046
- }
2047
- );
1899
+ 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" }, "No lessons to display.");
2048
1900
  }
2049
- const rows = props.items.map((row) => /* @__PURE__ */ React__namespace.createElement("tr", { key: row.lessonId }, /* @__PURE__ */ React__namespace.createElement("td", null, /* @__PURE__ */ React__namespace.createElement(
2050
- core.UnstyledButton,
1901
+ 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("div", { className: "flex-1" }, "Lesson"), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0" }, "Pathway"), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), props.items.map((row) => /* @__PURE__ */ React__namespace.createElement(
1902
+ reactRouterDom.Link,
2051
1903
  {
2052
- component: reactRouterDom.Link,
1904
+ key: row.lessonId,
2053
1905
  to: row.href,
2054
- sx: (theme) => ({
2055
- display: "block",
2056
- width: "100%",
2057
- padding: theme.spacing.md,
2058
- color: theme.colorScheme === "dark" ? theme.colors.dark[0] : theme.black,
2059
- "&:hover": {
2060
- backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[8] : theme.colors.gray[1]
2061
- }
2062
- })
1906
+ className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
2063
1907
  },
2064
- /* @__PURE__ */ React__namespace.createElement(core.Group, null, /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", weight: 500 }, row.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "xs", color: "dimmed" }, row.description)))
2065
- ))));
2066
- return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(core.Table, { horizontalSpacing: 0, verticalSpacing: 0, sx: { minWidth: 700 } }, /* @__PURE__ */ React__namespace.createElement("tbody", null, rows)));
1908
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-bold text-dark-blue-400" }, row.name), row.description && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs leading-relaxed text-slate-500" }, row.description)),
1909
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-xs text-slate-500" }, row.pathway || "\u2014"),
1910
+ /* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 16, stroke: 2, className: "w-4 shrink-0 text-slate-300" })
1911
+ )));
2067
1912
  }
2068
1913
 
2069
- const useStyles$d = core.createStyles((theme) => ({
2070
- title: {
2071
- fontSize: 34,
2072
- fontWeight: 900,
2073
- [theme.fn.smallerThan("sm")]: {
2074
- fontSize: 24
2075
- }
2076
- },
2077
- description: {
2078
- maxWidth: 600
2079
- }
2080
- }));
2081
1914
  const Lessons = (props) => {
2082
- const { classes } = useStyles$d();
2083
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.Badge, { variant: "filled", size: "lg" }, "Lessons"), /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, "Lessons"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, "Bite-sized activities and learning experiences accelerating students achievement"))), /* @__PURE__ */ React__namespace.createElement(
2084
- core.Autocomplete,
1915
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Lessons"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Bite-sized activities and learning experiences accelerating students achievement")), /* @__PURE__ */ React__namespace.createElement("div", { className: "relative" }, /* @__PURE__ */ React__namespace.createElement(icons.IconSearch, { size: 16, stroke: 2, className: "pointer-events-none absolute left-3.5 top-1/2 -translate-y-1/2 text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
1916
+ "input",
2085
1917
  {
1918
+ type: "text",
2086
1919
  placeholder: "Search for a lesson that fits your needs",
2087
- data: props.lessons.map((item) => item.name),
2088
- onChange: props.onAutocompleteChange
2089
- }
2090
- ), /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(
2091
- Table$5,
2092
- {
2093
- loading: props.loading,
2094
- items: props.lessons
1920
+ onChange: (e) => props.onAutocompleteChange(e.target.value),
1921
+ className: "w-full rounded-xl border border-slate-200 bg-white py-2.5 pl-10 pr-4 text-sm text-dark-blue-400 placeholder:text-slate-400 focus:border-sky-blue-400 focus:outline-none"
2095
1922
  }
2096
- ))));
1923
+ )), /* @__PURE__ */ React__namespace.createElement(Table$5, { loading: props.loading, items: props.lessons }));
2097
1924
  };
2098
1925
 
2099
1926
  const useStyles$c = core.createStyles((theme) => ({
@@ -2174,7 +2001,7 @@ const useStyles$b = core.createStyles((theme) => ({
2174
2001
  }));
2175
2002
  const Organization = (props) => {
2176
2003
  const { classes } = useStyles$b();
2177
- return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
2004
+ return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
2178
2005
  core.Badge,
2179
2006
  {
2180
2007
  variant: "filled",
@@ -2276,25 +2103,25 @@ function Table$4(props) {
2276
2103
  return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea, null, /* @__PURE__ */ React__namespace.createElement(core.Table, { verticalSpacing: 20, sx: { minWidth: 700 }, highlightOnHover: true, striped: true }, /* @__PURE__ */ React__namespace.createElement("thead", null, /* @__PURE__ */ React__namespace.createElement("tr", null, /* @__PURE__ */ React__namespace.createElement("th", null, "Name"), /* @__PURE__ */ React__namespace.createElement("th", null, "Role"), /* @__PURE__ */ React__namespace.createElement("th", null, "Account Created?"), /* @__PURE__ */ React__namespace.createElement("th", null, "# of Classes"), /* @__PURE__ */ React__namespace.createElement("th", null))), /* @__PURE__ */ React__namespace.createElement("tbody", null, rows)));
2277
2104
  }
2278
2105
 
2279
- var __defProp$7 = Object.defineProperty;
2280
- var __defProps$5 = Object.defineProperties;
2281
- var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
2282
- var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;
2283
- var __hasOwnProp$7 = Object.prototype.hasOwnProperty;
2284
- var __propIsEnum$7 = Object.prototype.propertyIsEnumerable;
2285
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2286
- var __spreadValues$7 = (a, b) => {
2287
- for (var prop in b || (b = {}))
2288
- if (__hasOwnProp$7.call(b, prop))
2289
- __defNormalProp$7(a, prop, b[prop]);
2290
- if (__getOwnPropSymbols$7)
2291
- for (var prop of __getOwnPropSymbols$7(b)) {
2292
- if (__propIsEnum$7.call(b, prop))
2293
- __defNormalProp$7(a, prop, b[prop]);
2106
+ var __defProp$9 = Object.defineProperty;
2107
+ var __defProps$6 = Object.defineProperties;
2108
+ var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
2109
+ var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
2110
+ var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
2111
+ var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
2112
+ var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2113
+ var __spreadValues$9 = (a, b) => {
2114
+ for (var prop in b || (b = {}))
2115
+ if (__hasOwnProp$9.call(b, prop))
2116
+ __defNormalProp$9(a, prop, b[prop]);
2117
+ if (__getOwnPropSymbols$9)
2118
+ for (var prop of __getOwnPropSymbols$9(b)) {
2119
+ if (__propIsEnum$9.call(b, prop))
2120
+ __defNormalProp$9(a, prop, b[prop]);
2294
2121
  }
2295
2122
  return a;
2296
2123
  };
2297
- var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
2124
+ var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
2298
2125
  const useStyles$9 = core.createStyles((theme) => ({
2299
2126
  title: {
2300
2127
  fontSize: 34,
@@ -2356,32 +2183,32 @@ const People = (props) => {
2356
2183
  padding: "xl",
2357
2184
  size: "xl"
2358
2185
  },
2359
- /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(DropzoneButton, __spreadProps$5(__spreadValues$7({}, props), { close: () => setOpened(false) })), /* @__PURE__ */ React__namespace.createElement(core.Divider, { label: "or", labelPosition: "center", my: "md", variant: "dashed" }), /* @__PURE__ */ React__namespace.createElement("form", { onSubmit: form$1.onSubmit(() => {
2186
+ /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(DropzoneButton, __spreadProps$6(__spreadValues$9({}, props), { close: () => setOpened(false) })), /* @__PURE__ */ React__namespace.createElement(core.Divider, { label: "or", labelPosition: "center", my: "md", variant: "dashed" }), /* @__PURE__ */ React__namespace.createElement("form", { onSubmit: form$1.onSubmit(() => {
2360
2187
  const values = form$1.values;
2361
2188
  form$1.reset();
2362
2189
  setOpened(false);
2363
2190
  props.onCreateUsers && props.onCreateUsers([values]);
2364
2191
  }) }, /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(
2365
2192
  core.TextInput,
2366
- __spreadValues$7({
2193
+ __spreadValues$9({
2367
2194
  withAsterisk: true,
2368
2195
  label: "Email",
2369
2196
  placeholder: "Email"
2370
2197
  }, form$1.getInputProps("email"))
2371
2198
  ), /* @__PURE__ */ React__namespace.createElement(core.Group, { grow: true }, /* @__PURE__ */ React__namespace.createElement(
2372
2199
  core.TextInput,
2373
- __spreadValues$7({
2200
+ __spreadValues$9({
2374
2201
  label: "Given name",
2375
2202
  placeholder: "Given name"
2376
2203
  }, form$1.getInputProps("givenName"))
2377
2204
  ), /* @__PURE__ */ React__namespace.createElement(
2378
2205
  core.TextInput,
2379
- __spreadValues$7({
2206
+ __spreadValues$9({
2380
2207
  label: "Family name",
2381
2208
  placeholder: "Family name"
2382
2209
  }, form$1.getInputProps("familyName"))
2383
2210
  )), /* @__PURE__ */ React__namespace.createElement(core.Button, { type: "submit", fullWidth: true, mt: "md" }, "Submit"))))
2384
- ), /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
2211
+ ), /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
2385
2212
  core.Badge,
2386
2213
  {
2387
2214
  variant: "filled",
@@ -2562,24 +2389,24 @@ const StartAnonymousLesson = (props) => {
2562
2389
  ))))));
2563
2390
  };
2564
2391
 
2565
- var __defProp$6 = Object.defineProperty;
2566
- var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
2567
- var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
2568
- var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
2569
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2570
- var __spreadValues$6 = (a, b) => {
2392
+ var __defProp$8 = Object.defineProperty;
2393
+ var __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;
2394
+ var __hasOwnProp$8 = Object.prototype.hasOwnProperty;
2395
+ var __propIsEnum$8 = Object.prototype.propertyIsEnumerable;
2396
+ var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2397
+ var __spreadValues$8 = (a, b) => {
2571
2398
  for (var prop in b || (b = {}))
2572
- if (__hasOwnProp$6.call(b, prop))
2573
- __defNormalProp$6(a, prop, b[prop]);
2574
- if (__getOwnPropSymbols$6)
2575
- for (var prop of __getOwnPropSymbols$6(b)) {
2576
- if (__propIsEnum$6.call(b, prop))
2577
- __defNormalProp$6(a, prop, b[prop]);
2399
+ if (__hasOwnProp$8.call(b, prop))
2400
+ __defNormalProp$8(a, prop, b[prop]);
2401
+ if (__getOwnPropSymbols$8)
2402
+ for (var prop of __getOwnPropSymbols$8(b)) {
2403
+ if (__propIsEnum$8.call(b, prop))
2404
+ __defNormalProp$8(a, prop, b[prop]);
2578
2405
  }
2579
2406
  return a;
2580
2407
  };
2581
2408
  const BadgeGrid = (props) => {
2582
- const badges = props.badges.map((b) => /* @__PURE__ */ React__namespace.createElement(TaskCard, __spreadValues$6({ key: b.title }, b)));
2409
+ const badges = props.badges.map((b) => /* @__PURE__ */ React__namespace.createElement(TaskCard, __spreadValues$8({ key: b.title }, b)));
2583
2410
  return /* @__PURE__ */ React__namespace.createElement(core.SimpleGrid, { cols: 4, breakpoints: [{ maxWidth: "sm", cols: 1 }, { maxWidth: "md", cols: 3 }] }, badges);
2584
2411
  };
2585
2412
  function TaskCard(props) {
@@ -2596,6 +2423,144 @@ function TaskCard(props) {
2596
2423
  }
2597
2424
 
2598
2425
  const useStyles$7 = core.createStyles((theme) => ({
2426
+ title: {
2427
+ fontSize: 34,
2428
+ fontWeight: 900,
2429
+ marginTop: 16,
2430
+ [theme.fn.smallerThan("sm")]: {
2431
+ fontSize: 24
2432
+ }
2433
+ },
2434
+ description: {
2435
+ maxWidth: 600
2436
+ }
2437
+ }));
2438
+ const UserInfo = (props) => {
2439
+ const { classes } = useStyles$7();
2440
+ return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Title, { className: classes.title }, props.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "xs" }, props.impactStatement));
2441
+ };
2442
+
2443
+ var __defProp$7 = Object.defineProperty;
2444
+ var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;
2445
+ var __hasOwnProp$7 = Object.prototype.hasOwnProperty;
2446
+ var __propIsEnum$7 = Object.prototype.propertyIsEnumerable;
2447
+ var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2448
+ var __spreadValues$7 = (a, b) => {
2449
+ for (var prop in b || (b = {}))
2450
+ if (__hasOwnProp$7.call(b, prop))
2451
+ __defNormalProp$7(a, prop, b[prop]);
2452
+ if (__getOwnPropSymbols$7)
2453
+ for (var prop of __getOwnPropSymbols$7(b)) {
2454
+ if (__propIsEnum$7.call(b, prop))
2455
+ __defNormalProp$7(a, prop, b[prop]);
2456
+ }
2457
+ return a;
2458
+ };
2459
+ var __objRest$1 = (source, exclude) => {
2460
+ var target = {};
2461
+ for (var prop in source)
2462
+ if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)
2463
+ target[prop] = source[prop];
2464
+ if (source != null && __getOwnPropSymbols$7)
2465
+ for (var prop of __getOwnPropSymbols$7(source)) {
2466
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))
2467
+ target[prop] = source[prop];
2468
+ }
2469
+ return target;
2470
+ };
2471
+ const useStyles$6 = core.createStyles((theme) => ({
2472
+ card: {
2473
+ height: 240,
2474
+ backgroundSize: "cover",
2475
+ backgroundPosition: "center",
2476
+ whiteSpace: "pre-line"
2477
+ },
2478
+ content: {
2479
+ position: "absolute",
2480
+ padding: theme.spacing.xl,
2481
+ zIndex: 1,
2482
+ top: 0,
2483
+ bottom: 0,
2484
+ right: 0,
2485
+ left: 0
2486
+ },
2487
+ title: {
2488
+ color: theme.white,
2489
+ marginBottom: theme.spacing.xs / 2
2490
+ },
2491
+ description: {
2492
+ color: theme.white,
2493
+ maxWidth: 220
2494
+ },
2495
+ code: {
2496
+ color: theme.white,
2497
+ maxWidth: 220
2498
+ }
2499
+ }));
2500
+ const TenantBanner = (_a) => {
2501
+ var _b = _a, {
2502
+ title,
2503
+ description,
2504
+ image,
2505
+ style,
2506
+ className,
2507
+ code
2508
+ } = _b, others = __objRest$1(_b, [
2509
+ "title",
2510
+ "description",
2511
+ "image",
2512
+ "style",
2513
+ "className",
2514
+ "code"
2515
+ ]);
2516
+ const { classes, cx, theme } = useStyles$6();
2517
+ const handleCopy = async () => {
2518
+ if (!code)
2519
+ return;
2520
+ try {
2521
+ await navigator.clipboard.writeText(code);
2522
+ notifications.showNotification({
2523
+ title: "Copied!",
2524
+ message: "Community code copied to clipboard.",
2525
+ autoClose: 3e3
2526
+ });
2527
+ } catch (err) {
2528
+ console.error("Failed to copy code", err);
2529
+ }
2530
+ };
2531
+ return /* @__PURE__ */ React__namespace.createElement(
2532
+ core.Card,
2533
+ __spreadValues$7({
2534
+ radius: "md",
2535
+ style: __spreadValues$7({ backgroundImage: `url(${image})` }, style),
2536
+ className: cx(classes.card, className)
2537
+ }, others),
2538
+ /* @__PURE__ */ React__namespace.createElement(
2539
+ core.Overlay,
2540
+ {
2541
+ gradient: `linear-gradient(105deg, ${theme.black} 20%, #312f2f 50%, ${theme.colors.gray[6]} 100%)`,
2542
+ opacity: 0.55,
2543
+ zIndex: 0
2544
+ }
2545
+ ),
2546
+ /* @__PURE__ */ React__namespace.createElement("div", { className: classes.content }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "lg", weight: 700, className: classes.title }, title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.description }, description), /* @__PURE__ */ React__namespace.createElement(core.Group, { mt: "sm", spacing: "xs" }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.code }, "Community Code: ", code || "\u2014"), code && /* @__PURE__ */ React__namespace.createElement(
2547
+ core.Button,
2548
+ {
2549
+ size: "xs",
2550
+ variant: "white",
2551
+ onClick: handleCopy,
2552
+ styles: {
2553
+ root: {
2554
+ backgroundColor: "rgba(255,255,255,0.9)"
2555
+ }
2556
+ }
2557
+ },
2558
+ "Copy"
2559
+ )))
2560
+ );
2561
+ };
2562
+
2563
+ const useStyles$5 = core.createStyles((theme) => ({
2599
2564
  action: {
2600
2565
  backgroundColor: "inherit",
2601
2566
  ":hover": {
@@ -2614,8 +2579,8 @@ const useStyles$7 = core.createStyles((theme) => ({
2614
2579
  }
2615
2580
  }));
2616
2581
  const TrialHome = (props) => {
2617
- const { classes } = useStyles$7();
2618
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg" }, /* @__PURE__ */ React__namespace.createElement(core.Badge, null, props.daysRemaining, " day", props.daysRemaining !== 1 ? "s" : "", " left"), /* @__PURE__ */ React__namespace.createElement(
2582
+ const { classes } = useStyles$5();
2583
+ return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true }, /* @__PURE__ */ React__namespace.createElement(core.Badge, null, props.daysRemaining, " day", props.daysRemaining !== 1 ? "s" : "", " left"), /* @__PURE__ */ React__namespace.createElement(
2619
2584
  core.Button,
2620
2585
  {
2621
2586
  className: classes.action,
@@ -2643,38 +2608,38 @@ const TrialHome = (props) => {
2643
2608
  )), /* @__PURE__ */ React__namespace.createElement(core.Title, { maw: 500, mb: 20, mt: 20, className: classes.title }, "Based on the tags you selected, check out these lessons to get started with your students!"), /* @__PURE__ */ React__namespace.createElement(BadgeGrid, { onAssign: props.onAssign, badges: props.badges })));
2644
2609
  };
2645
2610
 
2646
- var __defProp$5 = Object.defineProperty;
2647
- var __defProps$4 = Object.defineProperties;
2648
- var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
2649
- var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
2650
- var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
2651
- var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
2652
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2653
- var __spreadValues$5 = (a, b) => {
2611
+ var __defProp$6 = Object.defineProperty;
2612
+ var __defProps$5 = Object.defineProperties;
2613
+ var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
2614
+ var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
2615
+ var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
2616
+ var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
2617
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2618
+ var __spreadValues$6 = (a, b) => {
2654
2619
  for (var prop in b || (b = {}))
2655
- if (__hasOwnProp$5.call(b, prop))
2656
- __defNormalProp$5(a, prop, b[prop]);
2657
- if (__getOwnPropSymbols$5)
2658
- for (var prop of __getOwnPropSymbols$5(b)) {
2659
- if (__propIsEnum$5.call(b, prop))
2660
- __defNormalProp$5(a, prop, b[prop]);
2620
+ if (__hasOwnProp$6.call(b, prop))
2621
+ __defNormalProp$6(a, prop, b[prop]);
2622
+ if (__getOwnPropSymbols$6)
2623
+ for (var prop of __getOwnPropSymbols$6(b)) {
2624
+ if (__propIsEnum$6.call(b, prop))
2625
+ __defNormalProp$6(a, prop, b[prop]);
2661
2626
  }
2662
2627
  return a;
2663
2628
  };
2664
- var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
2629
+ var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
2665
2630
  var __objRest = (source, exclude) => {
2666
2631
  var target = {};
2667
2632
  for (var prop in source)
2668
- if (__hasOwnProp$5.call(source, prop) && exclude.indexOf(prop) < 0)
2633
+ if (__hasOwnProp$6.call(source, prop) && exclude.indexOf(prop) < 0)
2669
2634
  target[prop] = source[prop];
2670
- if (source != null && __getOwnPropSymbols$5)
2671
- for (var prop of __getOwnPropSymbols$5(source)) {
2672
- if (exclude.indexOf(prop) < 0 && __propIsEnum$5.call(source, prop))
2635
+ if (source != null && __getOwnPropSymbols$6)
2636
+ for (var prop of __getOwnPropSymbols$6(source)) {
2637
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$6.call(source, prop))
2673
2638
  target[prop] = source[prop];
2674
2639
  }
2675
2640
  return target;
2676
2641
  };
2677
- const useStyles$6 = core.createStyles((theme, { checked }) => ({
2642
+ const useStyles$4 = core.createStyles((theme, { checked }) => ({
2678
2643
  button: {
2679
2644
  display: "flex",
2680
2645
  alignItems: "center",
@@ -2716,10 +2681,10 @@ function ImageCheckbox(_a) {
2716
2681
  finalValue: false,
2717
2682
  onChange
2718
2683
  });
2719
- const { classes, cx } = useStyles$6({ checked: value });
2684
+ const { classes, cx } = useStyles$4({ checked: value });
2720
2685
  return /* @__PURE__ */ React__namespace.createElement(
2721
2686
  core.UnstyledButton,
2722
- __spreadProps$4(__spreadValues$5({}, others), {
2687
+ __spreadProps$5(__spreadValues$6({}, others), {
2723
2688
  onClick: () => handleChange(!value),
2724
2689
  className: cx(classes.button, className)
2725
2690
  }),
@@ -2740,7 +2705,7 @@ function ImageCheckbox(_a) {
2740
2705
  function SelectGrid(props) {
2741
2706
  const items = props.items.map((item) => /* @__PURE__ */ React__namespace.createElement(
2742
2707
  ImageCheckbox,
2743
- __spreadProps$4(__spreadValues$5({}, item), {
2708
+ __spreadProps$5(__spreadValues$6({}, item), {
2744
2709
  key: item.title,
2745
2710
  onChange: (checked) => props.onChange(item.title, checked)
2746
2711
  })
@@ -2758,26 +2723,26 @@ function SelectGrid(props) {
2758
2723
  );
2759
2724
  }
2760
2725
 
2761
- var __defProp$4 = Object.defineProperty;
2762
- var __defProps$3 = Object.defineProperties;
2763
- var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
2764
- var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
2765
- var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
2766
- var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
2767
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2768
- var __spreadValues$4 = (a, b) => {
2726
+ var __defProp$5 = Object.defineProperty;
2727
+ var __defProps$4 = Object.defineProperties;
2728
+ var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
2729
+ var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
2730
+ var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
2731
+ var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
2732
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2733
+ var __spreadValues$5 = (a, b) => {
2769
2734
  for (var prop in b || (b = {}))
2770
- if (__hasOwnProp$4.call(b, prop))
2771
- __defNormalProp$4(a, prop, b[prop]);
2772
- if (__getOwnPropSymbols$4)
2773
- for (var prop of __getOwnPropSymbols$4(b)) {
2774
- if (__propIsEnum$4.call(b, prop))
2775
- __defNormalProp$4(a, prop, b[prop]);
2735
+ if (__hasOwnProp$5.call(b, prop))
2736
+ __defNormalProp$5(a, prop, b[prop]);
2737
+ if (__getOwnPropSymbols$5)
2738
+ for (var prop of __getOwnPropSymbols$5(b)) {
2739
+ if (__propIsEnum$5.call(b, prop))
2740
+ __defNormalProp$5(a, prop, b[prop]);
2776
2741
  }
2777
2742
  return a;
2778
2743
  };
2779
- var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
2780
- const useStyles$5 = core.createStyles((theme) => ({
2744
+ var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
2745
+ const useStyles$3 = core.createStyles((theme) => ({
2781
2746
  wrapper: {
2782
2747
  minHeight: "100%",
2783
2748
  boxSizing: "border-box",
@@ -2840,7 +2805,7 @@ const OPTIONS = [
2840
2805
  { description: "project-based learning", title: "Project-Based Learning", icon: icons.IconTools }
2841
2806
  ];
2842
2807
  const TrialRegistration = (props) => {
2843
- const { classes } = useStyles$5();
2808
+ const { classes } = useStyles$3();
2844
2809
  const [firstName, setFirstName] = React__namespace.useState("");
2845
2810
  const [lastName, setLastName] = React__namespace.useState("");
2846
2811
  const [organization, setOrganization] = React__namespace.useState({ organizationId: "", displayName: "" });
@@ -2886,7 +2851,7 @@ const TrialRegistration = (props) => {
2886
2851
  label: "School/Organization Name",
2887
2852
  placeholder: "What's the name of your school?",
2888
2853
  data: props.organizations.map((o) => {
2889
- return __spreadProps$3(__spreadValues$4({}, o), { value: o.displayName });
2854
+ return __spreadProps$4(__spreadValues$5({}, o), { value: o.displayName });
2890
2855
  }),
2891
2856
  onItemSubmit: (item) => setOrganization({ organizationId: item.organizationId, displayName: item.displayName }),
2892
2857
  onChange: (next) => {
@@ -2898,7 +2863,7 @@ const TrialRegistration = (props) => {
2898
2863
  SelectGrid,
2899
2864
  {
2900
2865
  items: OPTIONS,
2901
- onChange: (e, checked) => setInterests(__spreadProps$3(__spreadValues$4({}, interests), { [e]: checked }))
2866
+ onChange: (e, checked) => setInterests(__spreadProps$4(__spreadValues$5({}, interests), { [e]: checked }))
2902
2867
  }
2903
2868
  ), /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "right", mt: "md" }, /* @__PURE__ */ React__namespace.createElement(
2904
2869
  core.Button,
@@ -2936,26 +2901,26 @@ const AdminProvider = (props) => {
2936
2901
  );
2937
2902
  };
2938
2903
 
2939
- var __defProp$3 = Object.defineProperty;
2940
- var __defProps$2 = Object.defineProperties;
2941
- var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
2942
- var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
2943
- var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
2944
- var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
2945
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2946
- var __spreadValues$3 = (a, b) => {
2904
+ var __defProp$4 = Object.defineProperty;
2905
+ var __defProps$3 = Object.defineProperties;
2906
+ var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
2907
+ var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
2908
+ var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
2909
+ var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
2910
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2911
+ var __spreadValues$4 = (a, b) => {
2947
2912
  for (var prop in b || (b = {}))
2948
- if (__hasOwnProp$3.call(b, prop))
2949
- __defNormalProp$3(a, prop, b[prop]);
2950
- if (__getOwnPropSymbols$3)
2951
- for (var prop of __getOwnPropSymbols$3(b)) {
2952
- if (__propIsEnum$3.call(b, prop))
2953
- __defNormalProp$3(a, prop, b[prop]);
2913
+ if (__hasOwnProp$4.call(b, prop))
2914
+ __defNormalProp$4(a, prop, b[prop]);
2915
+ if (__getOwnPropSymbols$4)
2916
+ for (var prop of __getOwnPropSymbols$4(b)) {
2917
+ if (__propIsEnum$4.call(b, prop))
2918
+ __defNormalProp$4(a, prop, b[prop]);
2954
2919
  }
2955
2920
  return a;
2956
2921
  };
2957
- var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
2958
- const useStyles$4 = core.createStyles((theme, props) => ({
2922
+ var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
2923
+ const useStyles$2 = core.createStyles((theme, props) => ({
2959
2924
  footer: {
2960
2925
  paddingTop: theme.spacing.md,
2961
2926
  paddingBottom: theme.spacing.md,
@@ -3042,7 +3007,7 @@ const useStyles$4 = core.createStyles((theme, props) => ({
3042
3007
  }
3043
3008
  }));
3044
3009
  const App = (props) => {
3045
- const { classes } = useStyles$4(props);
3010
+ const { classes } = useStyles$2(props);
3046
3011
  const account = useAccount(props.account, props.accounts, props.onAccountChange);
3047
3012
  return /* @__PURE__ */ React__namespace.createElement(
3048
3013
  core.AppShell,
@@ -3050,7 +3015,7 @@ const App = (props) => {
3050
3015
  padding: "xs",
3051
3016
  navbar: props.navbar && /* @__PURE__ */ React__namespace.createElement(
3052
3017
  Navbar,
3053
- __spreadProps$2(__spreadValues$3({}, props.navbar.props), {
3018
+ __spreadProps$3(__spreadValues$4({}, props.navbar.props), {
3054
3019
  onSwitchAccounts: account.accounts && account.accounts.length > 1 ? () => account.setChangeModalOpen(true) : void 0
3055
3020
  })
3056
3021
  ),
@@ -3157,10 +3122,10 @@ function Table$3(props) {
3157
3122
  }
3158
3123
 
3159
3124
  const Pathways = (props) => {
3160
- return /* @__PURE__ */ React__namespace.createElement("div", { className: "mx-auto flex max-w-4xl flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Pathways"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Explore all your unique pathway requirements in one clear space")), /* @__PURE__ */ React__namespace.createElement(Table$3, { loading: props.loading, items: props.pathways }));
3125
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Pathways"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Explore all your unique pathway requirements in one clear space")), /* @__PURE__ */ React__namespace.createElement(Table$3, { loading: props.loading, items: props.pathways }));
3161
3126
  };
3162
3127
 
3163
- const useStyles$3 = core.createStyles((theme) => ({
3128
+ const useStyles$1 = core.createStyles((theme) => ({
3164
3129
  button: {
3165
3130
  borderTopRightRadius: 0,
3166
3131
  borderBottomRightRadius: 0,
@@ -3175,7 +3140,7 @@ const useStyles$3 = core.createStyles((theme) => ({
3175
3140
  }
3176
3141
  }));
3177
3142
  const SplitButton$1 = (props) => {
3178
- const { classes, theme } = useStyles$3();
3143
+ const { classes, theme } = useStyles$1();
3179
3144
  theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
3180
3145
  return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
3181
3146
  core.Button,
@@ -3211,25 +3176,25 @@ function Stack$1(props) {
3211
3176
  return /* @__PURE__ */ React__namespace.createElement(core.Grid, { grow: true, gutter: "lg", sx: { padding: 20, minWidth: 700 } }, rows);
3212
3177
  }
3213
3178
 
3214
- var __defProp$2 = Object.defineProperty;
3215
- var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
3216
- var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
3217
- var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
3218
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3219
- var __spreadValues$2 = (a, b) => {
3179
+ var __defProp$3 = Object.defineProperty;
3180
+ var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
3181
+ var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
3182
+ var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
3183
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3184
+ var __spreadValues$3 = (a, b) => {
3220
3185
  for (var prop in b || (b = {}))
3221
- if (__hasOwnProp$2.call(b, prop))
3222
- __defNormalProp$2(a, prop, b[prop]);
3223
- if (__getOwnPropSymbols$2)
3224
- for (var prop of __getOwnPropSymbols$2(b)) {
3225
- if (__propIsEnum$2.call(b, prop))
3226
- __defNormalProp$2(a, prop, b[prop]);
3186
+ if (__hasOwnProp$3.call(b, prop))
3187
+ __defNormalProp$3(a, prop, b[prop]);
3188
+ if (__getOwnPropSymbols$3)
3189
+ for (var prop of __getOwnPropSymbols$3(b)) {
3190
+ if (__propIsEnum$3.call(b, prop))
3191
+ __defNormalProp$3(a, prop, b[prop]);
3227
3192
  }
3228
3193
  return a;
3229
3194
  };
3230
3195
  function Table$2(props) {
3231
3196
  const preparedItems = React__namespace.useMemo(() => {
3232
- return (props.items || []).map((item) => __spreadValues$2(__spreadValues$2({}, item), item.categoryPoints));
3197
+ return (props.items || []).map((item) => __spreadValues$3(__spreadValues$3({}, item), item.categoryPoints));
3233
3198
  }, [props.items]);
3234
3199
  const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
3235
3200
  if (props.loading && props.items.length === 0) {
@@ -3361,7 +3326,7 @@ function Table$1(props) {
3361
3326
  ));
3362
3327
  }
3363
3328
 
3364
- const useStyles$2 = core.createStyles((theme) => ({
3329
+ const useStyles = core.createStyles((theme) => ({
3365
3330
  title: {
3366
3331
  fontSize: 34,
3367
3332
  fontWeight: 900,
@@ -3374,12 +3339,12 @@ const useStyles$2 = core.createStyles((theme) => ({
3374
3339
  }
3375
3340
  }));
3376
3341
  const Pathway = (props) => {
3377
- const { classes } = useStyles$2();
3342
+ const { classes } = useStyles();
3378
3343
  const [tab, setTab] = React.useState("badges");
3379
3344
  const numberOfStudents = props.students.length;
3380
3345
  numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length / numberOfStudents : 0;
3381
3346
  const numberOfBadgesEarned = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
3382
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
3347
+ return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
3383
3348
  core.Badge,
3384
3349
  {
3385
3350
  variant: "filled",
@@ -3441,82 +3406,84 @@ const Pathway = (props) => {
3441
3406
  )))))));
3442
3407
  };
3443
3408
 
3444
- const useStyles$1 = core.createStyles((theme) => ({
3445
- button: {
3446
- borderTopRightRadius: 0,
3447
- borderBottomRightRadius: 0,
3448
- marginLeft: 0,
3449
- marginRight: 0
3450
- },
3451
- menuControl: {
3452
- borderTopLeftRadius: 0,
3453
- borderBottomLeftRadius: 0,
3454
- border: 0,
3455
- borderLeft: `1px solid ${theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.white}`
3456
- }
3457
- }));
3458
3409
  const SplitButton = (props) => {
3459
- const { classes, theme } = useStyles$1();
3460
- theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
3461
- return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
3462
- core.Button,
3410
+ return /* @__PURE__ */ React__namespace.createElement(
3411
+ "button",
3463
3412
  {
3464
- leftIcon: /* @__PURE__ */ React__namespace.createElement(icons.IconTableExport, { size: 14 }),
3465
- onClick: props.onExportDataClick
3413
+ onClick: props.onExportDataClick,
3414
+ className: "flex items-center gap-2 rounded-xl bg-gradient-to-r from-gold-400 to-[#f5c300] px-4 py-2.5 text-xs font-extrabold text-dark-blue-400"
3466
3415
  },
3416
+ /* @__PURE__ */ React__namespace.createElement(icons.IconTableExport, { size: 14, stroke: 2 }),
3467
3417
  "Export data (.csv)"
3468
- ));
3418
+ );
3469
3419
  };
3470
3420
 
3471
3421
  function Stack(props) {
3472
- const { items, hideBadge, hideLesson } = props;
3422
+ const { items, hideBadge, hideLesson, hidePathway } = props;
3473
3423
  if (!items.length)
3474
3424
  return null;
3475
- const visibleColumns = [
3476
- true,
3477
- !hideBadge,
3478
- !hideLesson,
3479
- true
3480
- ].filter(Boolean).length;
3481
- const span = 12 / visibleColumns;
3482
- return /* @__PURE__ */ React__namespace.createElement(core.Grid, { gutter: "md", sx: { padding: 20, minWidth: 700 } }, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(core.Text, { weight: "bold" }, "Link")), !hideBadge && /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(core.Text, { weight: "bold" }, "Badge")), !hideLesson && /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(core.Text, { weight: "bold" }, "Lesson")), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(core.Text, { weight: "bold" }, "Question")), items.map((row, i) => /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, { key: i }, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(
3483
- core.Button,
3484
- {
3485
- component: "a",
3486
- href: row.link,
3487
- target: "_blank",
3488
- rel: "noopener noreferrer",
3489
- size: "xs",
3490
- variant: "light"
3491
- },
3492
- "View File"
3493
- )), !hideBadge && /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(core.Text, null, row.badgeName)), !hideLesson && /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(core.Text, null, row.lessonName)), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { span }, /* @__PURE__ */ React__namespace.createElement(core.Text, null, row.question)))));
3425
+ const columns = [
3426
+ "minmax(0,2fr)",
3427
+ !hidePathway && "minmax(0,1.3fr)",
3428
+ !hideLesson && "minmax(0,1.3fr)",
3429
+ !hideBadge && "minmax(0,1.3fr)",
3430
+ "auto"
3431
+ ].filter(Boolean).join(" ");
3432
+ const headerCell = "border-b border-slate-100 pb-2 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400";
3433
+ const dataCell = "py-3";
3434
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "grid items-center gap-x-3", style: { gridTemplateColumns: columns } }, /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Question"), !hidePathway && /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Pathway"), !hideLesson && /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Lesson"), !hideBadge && /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Badge"), /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }), items.map((row, i) => {
3435
+ const rowBorder = i > 0 ? "border-t border-slate-100" : "";
3436
+ return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, { key: i }, /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} text-xs font-semibold text-dark-blue-400` }, row.question), !hidePathway && /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.pathwayName || "\u2014"), !hideLesson && /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.lessonName), !hideBadge && /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.badgeName), /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} flex shrink-0 gap-2` }, /* @__PURE__ */ React__namespace.createElement(
3437
+ "a",
3438
+ {
3439
+ href: row.link,
3440
+ target: "_blank",
3441
+ rel: "noopener noreferrer",
3442
+ className: "flex items-center gap-1 rounded-md border border-slate-200 px-2.5 py-1.5 text-[11px] font-bold text-slate-600 no-underline hover:bg-slate-50"
3443
+ },
3444
+ /* @__PURE__ */ React__namespace.createElement(icons.IconExternalLink, { size: 12, stroke: 2 }),
3445
+ "Preview"
3446
+ ), /* @__PURE__ */ React__namespace.createElement(
3447
+ "a",
3448
+ {
3449
+ href: row.link,
3450
+ download: true,
3451
+ target: "_blank",
3452
+ rel: "noopener noreferrer",
3453
+ className: "flex items-center gap-1 rounded-md border border-slate-200 px-2.5 py-1.5 text-[11px] font-bold text-slate-600 no-underline hover:bg-slate-50"
3454
+ },
3455
+ /* @__PURE__ */ React__namespace.createElement(icons.IconDownload, { size: 12, stroke: 2 }),
3456
+ "Download"
3457
+ )));
3458
+ }));
3494
3459
  }
3495
3460
 
3496
- var __defProp$1 = Object.defineProperty;
3497
- var __defProps$1 = Object.defineProperties;
3498
- var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
3499
- var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
3500
- var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
3501
- var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
3502
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3503
- var __spreadValues$1 = (a, b) => {
3461
+ var __defProp$2 = Object.defineProperty;
3462
+ var __defProps$2 = Object.defineProperties;
3463
+ var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
3464
+ var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
3465
+ var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
3466
+ var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
3467
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3468
+ var __spreadValues$2 = (a, b) => {
3504
3469
  for (var prop in b || (b = {}))
3505
- if (__hasOwnProp$1.call(b, prop))
3506
- __defNormalProp$1(a, prop, b[prop]);
3507
- if (__getOwnPropSymbols$1)
3508
- for (var prop of __getOwnPropSymbols$1(b)) {
3509
- if (__propIsEnum$1.call(b, prop))
3510
- __defNormalProp$1(a, prop, b[prop]);
3470
+ if (__hasOwnProp$2.call(b, prop))
3471
+ __defNormalProp$2(a, prop, b[prop]);
3472
+ if (__getOwnPropSymbols$2)
3473
+ for (var prop of __getOwnPropSymbols$2(b)) {
3474
+ if (__propIsEnum$2.call(b, prop))
3475
+ __defNormalProp$2(a, prop, b[prop]);
3511
3476
  }
3512
3477
  return a;
3513
3478
  };
3514
- var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
3479
+ var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
3480
+ const initials$1 = (name) => name.split(" ").map((w) => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
3515
3481
  function Table(props) {
3482
+ const [expanded, setExpanded] = React__namespace.useState({});
3516
3483
  const preparedItems = React__namespace.useMemo(() => {
3517
3484
  return props.items.map((item) => {
3518
3485
  var _a;
3519
- return __spreadProps$1(__spreadValues$1({}, item), {
3486
+ return __spreadProps$2(__spreadValues$2({}, item), {
3520
3487
  submissionCount: ((_a = item.submissions) == null ? void 0 : _a.length) || 0
3521
3488
  });
3522
3489
  });
@@ -3533,76 +3500,82 @@ function Table(props) {
3533
3500
  }
3534
3501
  );
3535
3502
  }
3536
- const sortStatus = {
3537
- columnAccessor: sortConfig.key,
3538
- direction: sortConfig.direction === "desc" ? "desc" : "asc"
3539
- };
3540
- return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(
3541
- mantineDatatable.DataTable,
3503
+ const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
3504
+ 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) => {
3505
+ const isOpen = !!expanded[row.userId];
3506
+ return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
3507
+ "div",
3508
+ {
3509
+ onClick: () => setExpanded(__spreadProps$2(__spreadValues$2({}, expanded), { [row.userId]: !isOpen })),
3510
+ className: "flex cursor-pointer items-center gap-4 p-4"
3511
+ },
3512
+ /* @__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-gradient-to-br from-mint-400 to-dark-blue-400 text-xs font-bold text-white" }, initials$1(row.name)), /* @__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))),
3513
+ /* @__PURE__ */ React__namespace.createElement("div", { className: "w-16 shrink-0 text-sm font-bold text-dark-blue-400" }, row.submissions.length),
3514
+ props.onReview && /* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0" }, /* @__PURE__ */ React__namespace.createElement(
3515
+ "button",
3516
+ {
3517
+ onClick: (e) => {
3518
+ e.stopPropagation();
3519
+ props.onReview(row);
3520
+ },
3521
+ className: "rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-3 py-1.5 text-[11px] font-extrabold text-dark-blue-400"
3522
+ },
3523
+ "Review Submission"
3524
+ )),
3525
+ /* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 16, stroke: 2, className: `w-4 shrink-0 text-slate-300 transition-transform ${isOpen ? "rotate-90" : ""}` })
3526
+ ), isOpen && /* @__PURE__ */ React__namespace.createElement("div", { className: "border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React__namespace.createElement(Stack, { items: row.submissions, hideBadge: props.hideBadge, hideLesson: props.hideLesson, hidePathway: props.hidePathway })));
3527
+ }));
3528
+ }
3529
+
3530
+ const initials = (name) => name.split(" ").map((w) => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
3531
+ function SubmissionDetail(props) {
3532
+ const { student } = props;
3533
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-full flex-col gap-4 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-2 text-xs text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: props.onBack, className: "font-bold text-sky-blue-400 hover:underline" }, "File Locker"), /* @__PURE__ */ React__namespace.createElement("span", null, "/"), /* @__PURE__ */ React__namespace.createElement("span", { className: "font-bold text-dark-blue-400" }, student.name)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm" }, student.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { src: student.avatar, className: "h-12 w-12 shrink-0 rounded-full object-cover", alt: "" }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-mint-400 to-dark-blue-400 text-sm font-bold text-white" }, initials(student.name)), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-lg font-extrabold text-dark-blue-400" }, student.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-0.5 text-xs text-slate-400" }, student.email, props.context ? ` \xB7 ${props.context}` : "")), /* @__PURE__ */ React__namespace.createElement("div", { className: "shrink-0 rounded-full bg-slate-100 px-3 py-1 text-xs font-bold text-slate-500" }, student.submissions.length, " file", student.submissions.length === 1 ? "" : "s")), /* @__PURE__ */ React__namespace.createElement("div", { className: "rounded-2xl border border-slate-200 bg-white p-5 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-extrabold text-dark-blue-400" }, "Files"), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-2" }, /* @__PURE__ */ React__namespace.createElement(Stack, { items: student.submissions }))), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-3" }, /* @__PURE__ */ React__namespace.createElement(
3534
+ "button",
3542
3535
  {
3543
- verticalSpacing: "sm",
3544
- sx: { minWidth: 700 },
3545
- withBorder: false,
3546
- borderRadius: "sm",
3547
- withColumnBorders: true,
3548
- striped: true,
3549
- highlightOnHover: true,
3550
- records: sortedItems,
3551
- sortStatus,
3552
- onSortStatusChange: (status) => requestSort(status.columnAccessor),
3553
- idAccessor: "userId",
3554
- columns: [{
3555
- accessor: "name",
3556
- title: "Student Name",
3557
- sortable: true,
3558
- render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Group, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(core.Avatar, { size: 40, src: row.avatar, radius: 40 }), /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", weight: 500 }, row.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "xs", color: "dimmed" }, row.email)))
3559
- }, {
3560
- accessor: "submissionCount",
3561
- title: "Files",
3562
- sortable: true,
3563
- render: (row) => row.submissions.length
3564
- }],
3565
- rowExpansion: {
3566
- content: ({ record }) => /* @__PURE__ */ React__namespace.createElement(
3567
- Stack,
3568
- {
3569
- items: record.submissions,
3570
- hideBadge: props.hideBadge,
3571
- hideLesson: props.hideLesson
3572
- }
3573
- )
3574
- }
3575
- }
3576
- ));
3536
+ onClick: () => props.onNav(-1),
3537
+ className: "flex flex-1 items-center justify-center gap-1.5 rounded-xl border border-slate-200 bg-white py-2.5 text-xs font-bold text-slate-600 hover:bg-slate-50"
3538
+ },
3539
+ /* @__PURE__ */ React__namespace.createElement(icons.IconChevronLeft, { size: 14, stroke: 2 }),
3540
+ "Previous Submission"
3541
+ ), /* @__PURE__ */ React__namespace.createElement(
3542
+ "button",
3543
+ {
3544
+ onClick: () => props.onNav(1),
3545
+ className: "flex flex-1 items-center justify-center gap-1.5 rounded-xl border border-slate-200 bg-white py-2.5 text-xs font-bold text-slate-600 hover:bg-slate-50"
3546
+ },
3547
+ "Next Submission",
3548
+ /* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 14, stroke: 2 })
3549
+ )));
3577
3550
  }
3578
3551
 
3579
- var __defProp = Object.defineProperty;
3580
- var __defProps = Object.defineProperties;
3581
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
3582
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3583
- var __hasOwnProp = Object.prototype.hasOwnProperty;
3584
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
3585
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3586
- var __spreadValues = (a, b) => {
3552
+ var __defProp$1 = Object.defineProperty;
3553
+ var __defProps$1 = Object.defineProperties;
3554
+ var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
3555
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
3556
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
3557
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
3558
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3559
+ var __spreadValues$1 = (a, b) => {
3587
3560
  for (var prop in b || (b = {}))
3588
- if (__hasOwnProp.call(b, prop))
3589
- __defNormalProp(a, prop, b[prop]);
3590
- if (__getOwnPropSymbols)
3591
- for (var prop of __getOwnPropSymbols(b)) {
3592
- if (__propIsEnum.call(b, prop))
3593
- __defNormalProp(a, prop, b[prop]);
3561
+ if (__hasOwnProp$1.call(b, prop))
3562
+ __defNormalProp$1(a, prop, b[prop]);
3563
+ if (__getOwnPropSymbols$1)
3564
+ for (var prop of __getOwnPropSymbols$1(b)) {
3565
+ if (__propIsEnum$1.call(b, prop))
3566
+ __defNormalProp$1(a, prop, b[prop]);
3594
3567
  }
3595
3568
  return a;
3596
3569
  };
3597
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
3570
+ var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
3598
3571
  const useFilteredStudents = (students) => {
3599
3572
  return React__namespace.useMemo(() => {
3600
- const byBadge = (badgeId) => students.map((s) => __spreadProps(__spreadValues({}, s), {
3573
+ const byBadge = (badgeId) => students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
3601
3574
  submissions: (s.submissions || []).filter(
3602
3575
  (sub) => sub.badgeId === badgeId
3603
3576
  )
3604
3577
  })).filter((s) => s.submissions.length);
3605
- const byLesson = (lessonName) => students.map((s) => __spreadProps(__spreadValues({}, s), {
3578
+ const byLesson = (lessonName) => students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
3606
3579
  submissions: (s.submissions || []).filter(
3607
3580
  (sub) => sub.lessonName === lessonName
3608
3581
  )
@@ -3613,7 +3586,7 @@ const useFilteredStudents = (students) => {
3613
3586
  (c) => c.startsWith(pathwayId)
3614
3587
  )
3615
3588
  ).map((b) => b.badgeId);
3616
- return students.map((s) => __spreadProps(__spreadValues({}, s), {
3589
+ return students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
3617
3590
  submissions: (s.submissions || []).filter(
3618
3591
  (sub) => validBadgeIds.includes(sub.badgeId)
3619
3592
  )
@@ -3623,167 +3596,166 @@ const useFilteredStudents = (students) => {
3623
3596
  }, [students]);
3624
3597
  };
3625
3598
 
3626
- const useStyles = core.createStyles((theme) => ({
3627
- title: {
3628
- fontSize: 34,
3629
- fontWeight: 900,
3630
- [theme.fn.smallerThan("sm")]: {
3631
- fontSize: 24
3599
+ var __defProp = Object.defineProperty;
3600
+ var __defProps = Object.defineProperties;
3601
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
3602
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3603
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
3604
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
3605
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3606
+ var __spreadValues = (a, b) => {
3607
+ for (var prop in b || (b = {}))
3608
+ if (__hasOwnProp.call(b, prop))
3609
+ __defNormalProp(a, prop, b[prop]);
3610
+ if (__getOwnPropSymbols)
3611
+ for (var prop of __getOwnPropSymbols(b)) {
3612
+ if (__propIsEnum.call(b, prop))
3613
+ __defNormalProp(a, prop, b[prop]);
3632
3614
  }
3633
- },
3634
- description: {
3635
- maxWidth: 600
3636
- }
3637
- }));
3638
- const BadgeTable = ({ badges, students, loading }) => {
3639
- const { byBadge } = useFilteredStudents(students);
3640
- const countFiles = (students2) => students2.reduce((acc, s) => {
3641
- var _a;
3642
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3643
- }, 0);
3644
- return /* @__PURE__ */ React__namespace.createElement(core.Accordion, null, badges.map((b) => {
3645
- const studentsForBadge = byBadge(b.badgeId);
3646
- const fileCount = countFiles(studentsForBadge);
3647
- return /* @__PURE__ */ React__namespace.createElement(core.Accordion.Item, { key: b.badgeId, value: b.badgeId }, /* @__PURE__ */ React__namespace.createElement(core.Accordion.Control, null, /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React__namespace.createElement(core.Text, null, b.displayName), /* @__PURE__ */ React__namespace.createElement(core.Badge, { size: "sm" }, fileCount))), /* @__PURE__ */ React__namespace.createElement(core.Accordion.Panel, null, /* @__PURE__ */ React__namespace.createElement(
3648
- Table,
3649
- {
3650
- loading,
3651
- items: studentsForBadge,
3652
- hideBadge: true
3653
- }
3654
- )));
3615
+ return a;
3616
+ };
3617
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
3618
+ const TABS = [
3619
+ { value: "students", label: "By student" },
3620
+ { value: "pathways", label: "By pathway" },
3621
+ { value: "badges", label: "By badge" },
3622
+ { value: "lessons", label: "By lesson" }
3623
+ ];
3624
+ const countFiles = (students) => students.reduce((acc, s) => {
3625
+ var _a;
3626
+ return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3627
+ }, 0);
3628
+ const GroupCard = (props) => {
3629
+ const [open, setOpen] = React__namespace.useState(false);
3630
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: () => setOpen(!open), className: "flex cursor-pointer items-center gap-3.5 p-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-extrabold text-dark-blue-400" }, props.title), props.description && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs leading-relaxed text-slate-500" }, props.description)), /* @__PURE__ */ React__namespace.createElement("div", { className: "shrink-0 rounded-full bg-mint-100 px-2.5 py-1 text-xs font-bold text-dark-blue-400" }, props.count), /* @__PURE__ */ React__namespace.createElement(icons.IconChevronDown, { size: 15, stroke: 2.3, className: `shrink-0 text-slate-400 transition-transform ${open ? "rotate-180" : ""}` })), open && /* @__PURE__ */ React__namespace.createElement("div", { className: "border-t border-slate-100 p-4" }, props.children));
3631
+ };
3632
+ const PathwayGroups = (props) => {
3633
+ const { byPathway } = useFilteredStudents(props.students);
3634
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.pathways.map((p) => {
3635
+ const filtered = byPathway(p.pathwayId, props.badges);
3636
+ return /* @__PURE__ */ React__namespace.createElement(GroupCard, { key: p.pathwayId, title: p.title, description: p.description, count: countFiles(filtered) }, /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: filtered, hidePathway: true, onReview: (item) => props.onReview(item, filtered, p.title) }));
3655
3637
  }));
3656
3638
  };
3657
- const LessonTableWrapper = ({ lessons, students, loading }) => {
3658
- const { byLesson } = useFilteredStudents(students);
3659
- const countFiles = (students2) => students2.reduce((acc, s) => {
3660
- var _a;
3661
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3662
- }, 0);
3663
- return /* @__PURE__ */ React__namespace.createElement(core.Accordion, null, lessons.map((l) => {
3664
- const studentsForLesson = byLesson(l.lessonName);
3665
- const fileCount = countFiles(studentsForLesson);
3666
- return /* @__PURE__ */ React__namespace.createElement(core.Accordion.Item, { key: l.lessonId, value: l.lessonId }, /* @__PURE__ */ React__namespace.createElement(core.Accordion.Control, null, /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React__namespace.createElement(core.Text, null, l.lessonName), /* @__PURE__ */ React__namespace.createElement(core.Badge, { size: "sm" }, fileCount))), /* @__PURE__ */ React__namespace.createElement(core.Accordion.Panel, null, /* @__PURE__ */ React__namespace.createElement(
3667
- Table,
3668
- {
3669
- loading,
3670
- items: studentsForLesson,
3671
- hideLesson: true
3672
- }
3673
- )));
3639
+ const BadgeGroups = (props) => {
3640
+ const { byBadge } = useFilteredStudents(props.students);
3641
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.badges.map((b) => {
3642
+ const filtered = byBadge(b.badgeId);
3643
+ const pathwayTitle = props.pathwayNameForBadge[b.badgeId];
3644
+ return /* @__PURE__ */ React__namespace.createElement(GroupCard, { key: b.badgeId, title: b.displayName, description: pathwayTitle ? `${pathwayTitle} pathway` : void 0, count: countFiles(filtered) }, /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: filtered, hideBadge: true, hidePathway: true, onReview: (item) => props.onReview(item, filtered, b.displayName) }));
3674
3645
  }));
3675
3646
  };
3676
- const PathwayTable = ({
3677
- pathways,
3678
- badges,
3679
- students,
3680
- loading
3681
- }) => {
3682
- const { byPathway } = useFilteredStudents(students);
3683
- const countFiles = (students2) => students2.reduce((acc, s) => {
3684
- var _a;
3685
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3686
- }, 0);
3687
- return /* @__PURE__ */ React__namespace.createElement(core.Accordion, null, pathways.map((p) => {
3688
- const studentsForPathway = byPathway(p.pathwayId, badges);
3689
- const fileCount = countFiles(studentsForPathway);
3690
- return /* @__PURE__ */ React__namespace.createElement(core.Accordion.Item, { key: p.pathwayId, value: p.pathwayId }, /* @__PURE__ */ React__namespace.createElement(core.Accordion.Control, null, /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("strong", null, p.title), /* @__PURE__ */ React__namespace.createElement("div", null, p.description)), /* @__PURE__ */ React__namespace.createElement(core.Badge, { size: "sm" }, fileCount))), /* @__PURE__ */ React__namespace.createElement(core.Accordion.Panel, null, /* @__PURE__ */ React__namespace.createElement(
3691
- Table,
3692
- {
3693
- loading,
3694
- items: studentsForPathway
3695
- }
3696
- )));
3647
+ const LessonGroups = (props) => {
3648
+ const { byLesson } = useFilteredStudents(props.students);
3649
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.lessons.map((l) => {
3650
+ const filtered = byLesson(l.lessonName);
3651
+ const badge = props.badgeForLesson[l.lessonId];
3652
+ const pathwayTitle = badge ? props.pathwayNameForBadge[badge.badgeId] : void 0;
3653
+ const description = badge ? pathwayTitle ? `${badge.displayName} \xB7 ${pathwayTitle} pathway` : badge.displayName : void 0;
3654
+ return /* @__PURE__ */ React__namespace.createElement(GroupCard, { key: l.lessonId, title: l.lessonName, description, count: countFiles(filtered) }, /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: filtered, hideBadge: true, hideLesson: true, hidePathway: true, onReview: (item) => props.onReview(item, filtered, l.lessonName) }));
3697
3655
  }));
3698
3656
  };
3699
3657
  const FileLocker = (props) => {
3700
- const { classes } = useStyles();
3701
- const [tab, setTab] = React.useState("students");
3702
- props.students.length;
3703
- const numberOfFiles = props.students.reduce(
3704
- (acc, s) => {
3705
- var _a;
3706
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3707
- },
3708
- 0
3709
- );
3710
- return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
3711
- core.Badge,
3712
- {
3713
- variant: "filled",
3714
- leftSection: /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 14 })),
3715
- size: "lg"
3716
- },
3717
- "Back"
3718
- )), /* @__PURE__ */ React__namespace.createElement(core.Group, null, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, props.displayName || "File"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, props.description || "No description")), !props.trial && /* @__PURE__ */ React__namespace.createElement(core.Stack, { ml: "auto" }, /* @__PURE__ */ React__namespace.createElement(
3719
- SplitButton,
3720
- {
3721
- href: props.href,
3722
- onCopyLinkClick: props.onCopyLinkClick,
3723
- onExportDataClick: props.onExportDataClick
3724
- }
3725
- ))))), /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
3726
- {
3727
- title: props.trial ? "LESSONS SUBMITTED" : "FILES",
3728
- value: props.trial ? props.lessonsCompleted || 0 : numberOfFiles,
3729
- unit: props.trial ? "" : ""
3730
- }
3731
- ] }), !props.trial && /* @__PURE__ */ React__namespace.createElement(
3732
- core.Select,
3658
+ const [tab, setTab] = React__namespace.useState("students");
3659
+ const [reviewing, setReviewing] = React__namespace.useState(null);
3660
+ const numberOfFiles = countFiles(props.students);
3661
+ const { thisWeek, thisMonth } = React__namespace.useMemo(() => {
3662
+ const now = new Date();
3663
+ const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1e3);
3664
+ const fom = new Date(now.getFullYear(), now.getMonth(), 1);
3665
+ let week = 0, month = 0;
3666
+ props.students.forEach((s) => {
3667
+ (s.submissions || []).forEach((sub) => {
3668
+ if (!sub.updatedAt)
3669
+ return;
3670
+ const d = new Date(sub.updatedAt);
3671
+ if (d >= weekAgo)
3672
+ week += 1;
3673
+ if (d >= fom)
3674
+ month += 1;
3675
+ });
3676
+ });
3677
+ return { thisWeek: week, thisMonth: month };
3678
+ }, [props.students]);
3679
+ const pathwayNameForBadge = React__namespace.useMemo(() => {
3680
+ const map = {};
3681
+ (props.badges || []).forEach((b) => {
3682
+ if (!Array.isArray(b.categories))
3683
+ return;
3684
+ const pathway = (props.pathways || []).find((p) => b.categories.some((c) => c.startsWith(p.pathwayId)));
3685
+ if (pathway)
3686
+ map[b.badgeId] = pathway.title;
3687
+ });
3688
+ return map;
3689
+ }, [props.badges, props.pathways]);
3690
+ const badgeForLesson = React__namespace.useMemo(() => {
3691
+ const map = {};
3692
+ (props.badges || []).forEach((b) => {
3693
+ if (!Array.isArray(b.lessonIds))
3694
+ return;
3695
+ b.lessonIds.forEach((lessonId) => {
3696
+ if (!(lessonId in map))
3697
+ map[lessonId] = { displayName: b.displayName, badgeId: b.badgeId };
3698
+ });
3699
+ });
3700
+ return map;
3701
+ }, [props.badges]);
3702
+ const enrichedStudents = React__namespace.useMemo(() => {
3703
+ return props.students.map((s) => __spreadProps(__spreadValues({}, s), {
3704
+ submissions: (s.submissions || []).map((sub) => __spreadProps(__spreadValues({}, sub), { pathwayName: pathwayNameForBadge[sub.badgeId] || "" }))
3705
+ }));
3706
+ }, [props.students, pathwayNameForBadge]);
3707
+ const { byPathway } = useFilteredStudents(enrichedStudents);
3708
+ const mostActivePathway = React__namespace.useMemo(() => {
3709
+ return (props.pathways || []).reduce((best, p) => {
3710
+ const count = countFiles(byPathway(p.pathwayId, props.badges || []));
3711
+ return count > 0 && (!best || count > best.count) ? { title: p.title, count } : best;
3712
+ }, null);
3713
+ }, [props.pathways, props.badges, byPathway]);
3714
+ const onReview = (item, list, context) => setReviewing({ student: item, list, context });
3715
+ const onNav = (dir) => {
3716
+ if (!reviewing)
3717
+ return;
3718
+ const idx = reviewing.list.findIndex((s) => s.userId === reviewing.student.userId);
3719
+ if (idx === -1)
3720
+ return;
3721
+ const next = reviewing.list[(idx + dir + reviewing.list.length) % reviewing.list.length];
3722
+ setReviewing(__spreadProps(__spreadValues({}, reviewing), { student: next }));
3723
+ };
3724
+ if (reviewing) {
3725
+ return /* @__PURE__ */ React__namespace.createElement(
3726
+ SubmissionDetail,
3727
+ {
3728
+ student: reviewing.student,
3729
+ context: reviewing.context,
3730
+ onBack: () => setReviewing(null),
3731
+ onNav
3732
+ }
3733
+ );
3734
+ }
3735
+ return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-full flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("button", { onClick: props.onBackClick, className: "flex items-center gap-1 text-xs font-bold text-sky-blue-400 hover:underline" }, /* @__PURE__ */ React__namespace.createElement(icons.IconChevronLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "mt-1.5 text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "File Locker"), /* @__PURE__ */ React__namespace.createElement("p", { className: "mt-1 text-sm text-slate-500" }, props.description || "No description")), !props.trial && /* @__PURE__ */ React__namespace.createElement(SplitButton, { href: props.href, onCopyLinkClick: props.onCopyLinkClick, onExportDataClick: props.onExportDataClick })), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: props.trial ? [
3736
+ { title: "LESSONS SUBMITTED", value: props.lessonsCompleted || 0 }
3737
+ ] : [
3738
+ { title: "FILES", value: numberOfFiles },
3739
+ { title: "THIS WEEK", value: thisWeek },
3740
+ { title: "THIS MONTH", value: thisMonth }
3741
+ ] }), !props.trial && mostActivePathway && /* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs text-slate-500" }, "Most active pathway: ", /* @__PURE__ */ React__namespace.createElement("span", { className: "font-bold text-dark-blue-400" }, mostActivePathway.title), " (", mostActivePathway.count, " submission", mostActivePathway.count === 1 ? "" : "s", ")"), !props.trial && /* @__PURE__ */ React__namespace.createElement(
3742
+ "select",
3733
3743
  {
3734
- clearable: true,
3735
- clearButtonLabel: "Clear class selection",
3736
- size: "sm",
3737
- placeholder: "Select a class",
3738
- nothingFound: "No options",
3739
3744
  value: props.classId,
3740
- onChange: props.onClassChange,
3741
- icon: /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, null),
3742
- data: props.classes.map((g) => {
3743
- return { value: g.classId, label: g.name };
3744
- })
3745
- }
3746
- ), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, !props.trial && /* @__PURE__ */ React__namespace.createElement(
3747
- Tabs,
3748
- {
3749
- value: tab,
3750
- data: [
3751
- { label: "By student", value: "students" },
3752
- { label: "By pathway", value: "pathways" },
3753
- { label: "By badge", value: "badges" },
3754
- { label: "By lesson", value: "lessons" }
3755
- ],
3756
- onChange: setTab
3757
- }
3758
- ), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(
3759
- Table,
3760
- {
3761
- loading: props.loading,
3762
- items: props.students
3763
- }
3764
- ), tab === "pathways" && /* @__PURE__ */ React__namespace.createElement(
3765
- PathwayTable,
3766
- {
3767
- pathways: props.pathways || [],
3768
- badges: props.badges || [],
3769
- students: props.students,
3770
- loading: props.loading
3771
- }
3772
- ), tab === "badges" && /* @__PURE__ */ React__namespace.createElement(
3773
- BadgeTable,
3774
- {
3775
- badges: props.badges || [],
3776
- students: props.students,
3777
- loading: props.loading
3778
- }
3779
- ), tab === "lessons" && /* @__PURE__ */ React__namespace.createElement(
3780
- LessonTableWrapper,
3745
+ onChange: (e) => props.onClassChange(e.target.value),
3746
+ className: "w-64 rounded-xl border border-slate-200 bg-white px-3.5 py-2.5 text-sm text-dark-blue-400 focus:border-sky-blue-400 focus:outline-none"
3747
+ },
3748
+ /* @__PURE__ */ React__namespace.createElement("option", { value: "" }, "Select a class"),
3749
+ props.classes.map((g) => /* @__PURE__ */ React__namespace.createElement("option", { key: g.classId, value: g.classId }, g.name))
3750
+ ), !props.trial && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS.map((t) => /* @__PURE__ */ React__namespace.createElement(
3751
+ "button",
3781
3752
  {
3782
- lessons: props.lessons,
3783
- students: props.students,
3784
- loading: props.loading
3785
- }
3786
- )))))));
3753
+ key: t.value,
3754
+ onClick: () => setTab(t.value),
3755
+ className: `rounded-lg px-4 py-2 text-xs font-bold ${tab === t.value ? "bg-sky-blue-400/20 text-dark-blue-400" : "text-slate-400 hover:text-slate-600"}`
3756
+ },
3757
+ t.label
3758
+ ))), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: enrichedStudents, onReview: (item) => onReview(item, enrichedStudents) }), !props.trial && tab === "pathways" && /* @__PURE__ */ React__namespace.createElement(PathwayGroups, { students: enrichedStudents, loading: props.loading, pathways: props.pathways || [], badges: props.badges || [], onReview }), !props.trial && tab === "badges" && /* @__PURE__ */ React__namespace.createElement(BadgeGroups, { students: enrichedStudents, loading: props.loading, badges: props.badges || [], pathwayNameForBadge, onReview }), !props.trial && tab === "lessons" && /* @__PURE__ */ React__namespace.createElement(LessonGroups, { students: enrichedStudents, loading: props.loading, lessons: props.lessons, badgeForLesson, pathwayNameForBadge, onReview }));
3787
3759
  };
3788
3760
 
3789
3761
  Object.defineProperty(exports, 'showNotification', {
@@ -3809,7 +3781,6 @@ exports.Lessons = Lessons;
3809
3781
  exports.Navbar = Navbar;
3810
3782
  exports.Organization = Organization;
3811
3783
  exports.Pathway = Pathway;
3812
- exports.PathwayTable = PathwayTable;
3813
3784
  exports.Pathways = Pathways;
3814
3785
  exports.People = People;
3815
3786
  exports.StartAnonymousLesson = StartAnonymousLesson;