@local-civics/mgmt-ui 0.1.213 → 0.1.214

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.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { useState, useMemo } from 'react';
3
- import { IconChevronRight, IconVideo, IconSwitchHorizontal, IconLogout, IconHome2, IconGauge, IconCategory2, IconRoute, IconAlbum, IconLambda, IconClipboard, IconBuilding, IconBatteryEco, IconBooks, IconBackpack, IconClipboardCopy, IconTableExport, IconArrowLeft, IconSearch, IconCheck, IconTrash, IconPlus, IconLink, IconDownload, IconCloudUpload, IconInfoCircle, IconPlaylistAdd, IconColorSwatch, IconPointer, IconChevronDown, IconX, IconScribble, IconSchool, IconPodium, IconBriefcase, IconPresentation, IconNews, IconTools, IconBrandInstagram, IconBrandLinkedin, IconBrandFacebook } from '@tabler/icons';
4
- import { Avatar, createStyles, Modal, Center, Loader, Container, Group, Button, Title, Text, UnstyledButton, Card, ScrollArea, SimpleGrid, Tabs as Tabs$1, Stack as Stack$5, Image, Grid, Badge as Badge$1, ActionIcon, LoadingOverlay, Select, Table as Table$l, Drawer, Divider, TextInput, Tooltip, Autocomplete, Paper, ThemeIcon, Overlay, Anchor, Box, Menu, Checkbox, createEmotionCache, MantineProvider, AppShell, Accordion } from '@mantine/core';
3
+ import { IconChevronRight, IconVideo, IconSwitchHorizontal, IconLogout, IconHome2, IconGauge, IconCategory2, IconRoute, IconAlbum, IconLambda, IconClipboard, IconBuilding, IconBatteryEco, IconBooks, IconBackpack, IconClipboardCopy, IconTableExport, IconArrowLeft, IconSearch, IconCheck, IconTrash, IconPlus, IconLink, IconDownload, IconCloudUpload, IconInfoCircle, IconPlaylistAdd, IconPointer, IconChevronDown, IconX, IconScribble, IconSchool, IconPodium, IconBriefcase, IconPresentation, IconNews, IconTools, IconBrandInstagram, IconBrandLinkedin, IconBrandFacebook, IconExternalLink, IconChevronLeft } from '@tabler/icons';
4
+ import { Avatar, createStyles, Modal, Center, Loader, Container, Group, Button, Title, Text, UnstyledButton, Card, ScrollArea, SimpleGrid, Tabs as Tabs$1, Stack as Stack$5, Image, Grid, Badge as Badge$1, ActionIcon, LoadingOverlay, Select, Table as Table$l, Drawer, Divider, TextInput, Tooltip, Autocomplete, Paper, Anchor, Box, Menu, Overlay, ThemeIcon, Checkbox, createEmotionCache, MantineProvider, AppShell } from '@mantine/core';
5
5
  import { Link } from 'react-router-dom';
6
6
  import { showNotification, NotificationsProvider } from '@mantine/notifications';
7
7
  export { showNotification, updateNotification } from '@mantine/notifications';
@@ -41,7 +41,7 @@ function styleInject(css, ref) {
41
41
  }
42
42
  }
43
43
 
44
- 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}";
44
+ 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}.mx-auto{margin-left:auto;margin-right:auto}.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-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-\\[1100px\\]{max-width:1100px}.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-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-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}";
45
45
  styleInject(css_248z);
46
46
 
47
47
  function UserButton({ image, name, email }) {
@@ -125,25 +125,25 @@ function LinksGroup({ icon: Icon, href, label, accent = "cyan", initiallyOpened,
125
125
  ), hasLinks && opened && /* @__PURE__ */ React.createElement("div", { className: "ml-[29px] mt-0.5 flex flex-col gap-0.5 border-l border-slate-100 pl-2.5" }, items));
126
126
  }
127
127
 
128
- var __defProp$d = Object.defineProperty;
129
- var __defProps$9 = Object.defineProperties;
130
- var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
131
- var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
132
- var __hasOwnProp$d = Object.prototype.hasOwnProperty;
133
- var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
134
- var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
135
- var __spreadValues$d = (a, b) => {
128
+ var __defProp$e = Object.defineProperty;
129
+ var __defProps$a = Object.defineProperties;
130
+ var __getOwnPropDescs$a = Object.getOwnPropertyDescriptors;
131
+ var __getOwnPropSymbols$e = Object.getOwnPropertySymbols;
132
+ var __hasOwnProp$e = Object.prototype.hasOwnProperty;
133
+ var __propIsEnum$e = Object.prototype.propertyIsEnumerable;
134
+ var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
135
+ var __spreadValues$e = (a, b) => {
136
136
  for (var prop in b || (b = {}))
137
- if (__hasOwnProp$d.call(b, prop))
138
- __defNormalProp$d(a, prop, b[prop]);
139
- if (__getOwnPropSymbols$d)
140
- for (var prop of __getOwnPropSymbols$d(b)) {
141
- if (__propIsEnum$d.call(b, prop))
142
- __defNormalProp$d(a, prop, b[prop]);
137
+ if (__hasOwnProp$e.call(b, prop))
138
+ __defNormalProp$e(a, prop, b[prop]);
139
+ if (__getOwnPropSymbols$e)
140
+ for (var prop of __getOwnPropSymbols$e(b)) {
141
+ if (__propIsEnum$e.call(b, prop))
142
+ __defNormalProp$e(a, prop, b[prop]);
143
143
  }
144
144
  return a;
145
145
  };
146
- var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
146
+ var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
147
147
  const data = [
148
148
  { label: "Home", icon: IconHome2, accent: "cyan" },
149
149
  { label: "Dashboard", icon: IconGauge, accent: "mint" },
@@ -170,12 +170,12 @@ function Navbar(props) {
170
170
  }
171
171
  return /* @__PURE__ */ React.createElement(
172
172
  LinksGroup,
173
- __spreadProps$9(__spreadValues$d(__spreadValues$d({
173
+ __spreadProps$a(__spreadValues$e(__spreadValues$e({
174
174
  key: item.label,
175
175
  active: props.active
176
176
  }, item), context), {
177
177
  links: (item.links || []).map((link) => {
178
- return __spreadValues$d(__spreadValues$d({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
178
+ return __spreadValues$e(__spreadValues$e({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
179
179
  })
180
180
  })
181
181
  );
@@ -195,7 +195,7 @@ const UtilLink = (props) => {
195
195
  );
196
196
  };
197
197
 
198
- const useStyles$o = createStyles((theme) => ({
198
+ const useStyles$k = createStyles((theme) => ({
199
199
  inner: {
200
200
  paddingTop: theme.spacing.xl,
201
201
  paddingBottom: theme.spacing.xl * 4
@@ -231,7 +231,7 @@ const useStyles$o = createStyles((theme) => ({
231
231
  }
232
232
  }));
233
233
  const GettingStarted = (props) => {
234
- const { classes } = useStyles$o();
234
+ const { classes } = useStyles$k();
235
235
  return /* @__PURE__ */ React.createElement(
236
236
  Modal,
237
237
  {
@@ -245,7 +245,7 @@ const GettingStarted = (props) => {
245
245
  );
246
246
  };
247
247
 
248
- const useStyles$n = createStyles((theme) => ({
248
+ const useStyles$j = createStyles((theme) => ({
249
249
  title: {
250
250
  fontSize: 34,
251
251
  fontWeight: 900,
@@ -286,7 +286,7 @@ const useStyles$n = createStyles((theme) => ({
286
286
  }
287
287
  }));
288
288
  const SwitchAccount = (props) => {
289
- const { classes, theme } = useStyles$n();
289
+ const { classes, theme } = useStyles$j();
290
290
  const options = props.accounts.map((a) => {
291
291
  return /* @__PURE__ */ React.createElement(UnstyledButton, { onClick: () => props.onClick && props.onClick(a.accountId), key: a.accountId, p: theme.spacing.md }, /* @__PURE__ */ React.createElement(Card, { withBorder: true, shadow: "md", radius: "md", className: classes.card, p: "xl" }, a.isAdmin && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(IconBatteryEco, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), a.isGroupAdmin && !a.isAdmin && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(IconBooks, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), !a.isAdmin && !a.isGroupAdmin && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(IconBackpack, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), /* @__PURE__ */ React.createElement(Text, { size: "lg", weight: 500, className: classes.cardTitle, mt: "md" }, a.name), /* @__PURE__ */ React.createElement(Text, { size: "sm", color: "dimmed", mt: "sm" }, a.isAdmin ? "Admin" : a.isGroupAdmin ? "Educator" : "Student")));
292
292
  });
@@ -323,7 +323,7 @@ const Tabs = (props) => {
323
323
  return /* @__PURE__ */ React.createElement(Tabs$1, { value: props.value, onTabChange: props.onChange }, /* @__PURE__ */ React.createElement(Tabs$1.List, null, tabs));
324
324
  };
325
325
 
326
- const useStyles$m = createStyles((theme) => ({
326
+ const useStyles$i = createStyles((theme) => ({
327
327
  button: {
328
328
  borderTopRightRadius: 0,
329
329
  borderBottomRightRadius: 0,
@@ -338,7 +338,7 @@ const useStyles$m = createStyles((theme) => ({
338
338
  }
339
339
  }));
340
340
  const SplitButton$4 = (props) => {
341
- const { classes, theme } = useStyles$m();
341
+ const { classes, theme } = useStyles$i();
342
342
  theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
343
343
  return /* @__PURE__ */ React.createElement(Stack$5, { spacing: "sm" }, /* @__PURE__ */ React.createElement(
344
344
  Button,
@@ -366,7 +366,7 @@ const SplitButton$4 = (props) => {
366
366
  ));
367
367
  };
368
368
 
369
- const useStyles$l = createStyles((theme) => ({
369
+ const useStyles$h = createStyles((theme) => ({
370
370
  wrapper: {
371
371
  display: "flex",
372
372
  alignItems: "center",
@@ -417,7 +417,7 @@ const useStyles$l = createStyles((theme) => ({
417
417
  }
418
418
  }));
419
419
  const PlaceholderBanner = (props) => {
420
- const { classes } = useStyles$l();
420
+ const { classes } = useStyles$h();
421
421
  const title = props.title || "Nothing to display";
422
422
  const description = props.description || "We don't have anything to show you here just yet. Add data, check back later, or adjust your search.";
423
423
  return /* @__PURE__ */ React.createElement("div", { className: classes.wrapper }, /* @__PURE__ */ React.createElement("div", { className: classes.body }, /* @__PURE__ */ React.createElement(Title, { className: classes.title }, props.loading ? "Loading..." : title), /* @__PURE__ */ React.createElement(Text, { size: "sm", color: "dimmed" }, props.loading ? "Hold on, we're loading your data." : description)), /* @__PURE__ */ React.createElement(Image, { src: `https://cdn.localcivics.io/illustrations/${props.icon}.svg`, className: classes.image }));
@@ -469,28 +469,28 @@ function useSortableData(items, config = { key: "", direction: null }) {
469
469
  return { items: sortedItems, requestSort, sortConfig };
470
470
  }
471
471
 
472
- var __defProp$c = Object.defineProperty;
473
- var __defProps$8 = Object.defineProperties;
474
- var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;
475
- var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
476
- var __hasOwnProp$c = Object.prototype.hasOwnProperty;
477
- var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
478
- var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
479
- var __spreadValues$c = (a, b) => {
472
+ var __defProp$d = Object.defineProperty;
473
+ var __defProps$9 = Object.defineProperties;
474
+ var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
475
+ var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
476
+ var __hasOwnProp$d = Object.prototype.hasOwnProperty;
477
+ var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
478
+ var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
479
+ var __spreadValues$d = (a, b) => {
480
480
  for (var prop in b || (b = {}))
481
- if (__hasOwnProp$c.call(b, prop))
482
- __defNormalProp$c(a, prop, b[prop]);
483
- if (__getOwnPropSymbols$c)
484
- for (var prop of __getOwnPropSymbols$c(b)) {
485
- if (__propIsEnum$c.call(b, prop))
486
- __defNormalProp$c(a, prop, b[prop]);
481
+ if (__hasOwnProp$d.call(b, prop))
482
+ __defNormalProp$d(a, prop, b[prop]);
483
+ if (__getOwnPropSymbols$d)
484
+ for (var prop of __getOwnPropSymbols$d(b)) {
485
+ if (__propIsEnum$d.call(b, prop))
486
+ __defNormalProp$d(a, prop, b[prop]);
487
487
  }
488
488
  return a;
489
489
  };
490
- var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));
490
+ var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
491
491
  function Table$k(props) {
492
492
  const preparedItems = React.useMemo(() => {
493
- return props.items.map((item) => __spreadProps$8(__spreadValues$c({}, item), {
493
+ return props.items.map((item) => __spreadProps$9(__spreadValues$d({}, item), {
494
494
  status: item.isComplete ? 1 : 0
495
495
  }));
496
496
  }, [props.items]);
@@ -587,7 +587,7 @@ function Table$j(props) {
587
587
  ));
588
588
  }
589
589
 
590
- const useStyles$k = createStyles((theme) => ({
590
+ const useStyles$g = createStyles((theme) => ({
591
591
  title: {
592
592
  fontSize: 34,
593
593
  fontWeight: 900,
@@ -600,7 +600,7 @@ const useStyles$k = createStyles((theme) => ({
600
600
  }
601
601
  }));
602
602
  const Badge = (props) => {
603
- const { classes } = useStyles$k();
603
+ const { classes } = useStyles$g();
604
604
  const [tab, setTab] = useState("lessons");
605
605
  const numberOfStudents = props.students.length;
606
606
  const numberOfBadges = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
@@ -938,25 +938,25 @@ function Table$c(props) {
938
938
  }));
939
939
  }
940
940
 
941
- var __defProp$b = Object.defineProperty;
942
- var __defProps$7 = Object.defineProperties;
943
- var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;
944
- var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
945
- var __hasOwnProp$b = Object.prototype.hasOwnProperty;
946
- var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
947
- var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
948
- var __spreadValues$b = (a, b) => {
941
+ var __defProp$c = Object.defineProperty;
942
+ var __defProps$8 = Object.defineProperties;
943
+ var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;
944
+ var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
945
+ var __hasOwnProp$c = Object.prototype.hasOwnProperty;
946
+ var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
947
+ var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
948
+ var __spreadValues$c = (a, b) => {
949
949
  for (var prop in b || (b = {}))
950
- if (__hasOwnProp$b.call(b, prop))
951
- __defNormalProp$b(a, prop, b[prop]);
952
- if (__getOwnPropSymbols$b)
953
- for (var prop of __getOwnPropSymbols$b(b)) {
954
- if (__propIsEnum$b.call(b, prop))
955
- __defNormalProp$b(a, prop, b[prop]);
950
+ if (__hasOwnProp$c.call(b, prop))
951
+ __defNormalProp$c(a, prop, b[prop]);
952
+ if (__getOwnPropSymbols$c)
953
+ for (var prop of __getOwnPropSymbols$c(b)) {
954
+ if (__propIsEnum$c.call(b, prop))
955
+ __defNormalProp$c(a, prop, b[prop]);
956
956
  }
957
957
  return a;
958
958
  };
959
- var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));
959
+ var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));
960
960
  const Class = (props) => {
961
961
  const [opened, setOpened] = useState(false);
962
962
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
@@ -968,7 +968,7 @@ const Class = (props) => {
968
968
  padding: "xl",
969
969
  size: "xl"
970
970
  },
971
- /* @__PURE__ */ React.createElement(DropzoneButton$1, __spreadProps$7(__spreadValues$b({}, props), { close: () => setOpened(false) }))
971
+ /* @__PURE__ */ React.createElement(DropzoneButton$1, __spreadProps$8(__spreadValues$c({}, props), { close: () => setOpened(false) }))
972
972
  ), /* @__PURE__ */ React.createElement("div", { className: "mx-auto flex max-w-5xl flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" }, /* @__PURE__ */ React.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React.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.createElement(IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "Class"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-slate-500" }, props.description || "No description")), !props.loading && /* @__PURE__ */ React.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React.createElement(
973
973
  "button",
974
974
  {
@@ -1094,20 +1094,20 @@ const DropzoneButton$1 = (props) => {
1094
1094
  props.onCreateMembers && props.onCreateMembers([values]);
1095
1095
  }) }, /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React.createElement(
1096
1096
  TextInput,
1097
- __spreadValues$b({
1097
+ __spreadValues$c({
1098
1098
  withAsterisk: true,
1099
1099
  label: "Email",
1100
1100
  placeholder: "Email"
1101
1101
  }, form.getInputProps("email"))
1102
1102
  ), /* @__PURE__ */ React.createElement(Group, { grow: true }, /* @__PURE__ */ React.createElement(
1103
1103
  TextInput,
1104
- __spreadValues$b({
1104
+ __spreadValues$c({
1105
1105
  label: "Given name",
1106
1106
  placeholder: "Given name"
1107
1107
  }, form.getInputProps("givenName"))
1108
1108
  ), /* @__PURE__ */ React.createElement(
1109
1109
  TextInput,
1110
- __spreadValues$b({
1110
+ __spreadValues$c({
1111
1111
  label: "Family name",
1112
1112
  placeholder: "Family name"
1113
1113
  }, form.getInputProps("familyName"))
@@ -1187,23 +1187,23 @@ function Table$b(props) {
1187
1187
  ));
1188
1188
  }
1189
1189
 
1190
- var __defProp$a = Object.defineProperty;
1191
- var __getOwnPropSymbols$a = Object.getOwnPropertySymbols;
1192
- var __hasOwnProp$a = Object.prototype.hasOwnProperty;
1193
- var __propIsEnum$a = Object.prototype.propertyIsEnumerable;
1194
- var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1195
- var __spreadValues$a = (a, b) => {
1190
+ var __defProp$b = Object.defineProperty;
1191
+ var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
1192
+ var __hasOwnProp$b = Object.prototype.hasOwnProperty;
1193
+ var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
1194
+ var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1195
+ var __spreadValues$b = (a, b) => {
1196
1196
  for (var prop in b || (b = {}))
1197
- if (__hasOwnProp$a.call(b, prop))
1198
- __defNormalProp$a(a, prop, b[prop]);
1199
- if (__getOwnPropSymbols$a)
1200
- for (var prop of __getOwnPropSymbols$a(b)) {
1201
- if (__propIsEnum$a.call(b, prop))
1202
- __defNormalProp$a(a, prop, b[prop]);
1197
+ if (__hasOwnProp$b.call(b, prop))
1198
+ __defNormalProp$b(a, prop, b[prop]);
1199
+ if (__getOwnPropSymbols$b)
1200
+ for (var prop of __getOwnPropSymbols$b(b)) {
1201
+ if (__propIsEnum$b.call(b, prop))
1202
+ __defNormalProp$b(a, prop, b[prop]);
1203
1203
  }
1204
1204
  return a;
1205
1205
  };
1206
- const useStyles$j = createStyles((theme) => ({
1206
+ const useStyles$f = createStyles((theme) => ({
1207
1207
  title: {
1208
1208
  fontSize: 34,
1209
1209
  fontWeight: 900,
@@ -1216,7 +1216,7 @@ const useStyles$j = createStyles((theme) => ({
1216
1216
  }
1217
1217
  }));
1218
1218
  const Classes = (props) => {
1219
- const { classes } = useStyles$j();
1219
+ const { classes } = useStyles$f();
1220
1220
  const form = useForm({
1221
1221
  initialValues: {
1222
1222
  classId: "",
@@ -1246,14 +1246,14 @@ const Classes = (props) => {
1246
1246
  props.onCreateClass && props.onCreateClass(values);
1247
1247
  }) }, /* @__PURE__ */ React.createElement(Stack$5, null, /* @__PURE__ */ React.createElement(
1248
1248
  TextInput,
1249
- __spreadValues$a({
1249
+ __spreadValues$b({
1250
1250
  withAsterisk: true,
1251
1251
  label: "Name",
1252
1252
  placeholder: "Class name"
1253
1253
  }, form.getInputProps("name"))
1254
1254
  ), /* @__PURE__ */ React.createElement(
1255
1255
  TextInput,
1256
- __spreadValues$a({
1256
+ __spreadValues$b({
1257
1257
  label: "Description",
1258
1258
  placeholder: "A class for my first period English students"
1259
1259
  }, form.getInputProps("description"))
@@ -1287,7 +1287,7 @@ const Classes = (props) => {
1287
1287
  ))))));
1288
1288
  };
1289
1289
 
1290
- const useStyles$i = createStyles((theme) => ({
1290
+ const useStyles$e = createStyles((theme) => ({
1291
1291
  title: {
1292
1292
  fontSize: 34,
1293
1293
  fontWeight: 900,
@@ -1301,7 +1301,7 @@ const useStyles$i = createStyles((theme) => ({
1301
1301
  }
1302
1302
  }));
1303
1303
  const UserInfo = (props) => {
1304
- const { classes } = useStyles$i();
1304
+ const { classes } = useStyles$e();
1305
1305
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Title, { className: classes.title }, props.name), /* @__PURE__ */ React.createElement(Text, { color: "dimmed", className: classes.description, mt: "xs" }, props.impactStatement));
1306
1306
  };
1307
1307
 
@@ -1439,129 +1439,36 @@ const Student = (props) => {
1439
1439
  ))))));
1440
1440
  };
1441
1441
 
1442
- const useStyles$h = createStyles((theme, props) => {
1443
- const from = props.from || "blue";
1444
- const to = props.to || "green";
1445
- return {
1446
- card: {
1447
- position: "relative",
1448
- cursor: "pointer",
1449
- overflow: "hidden",
1450
- transition: "transform 150ms ease, box-shadow 100ms ease",
1451
- padding: theme.spacing.xl,
1452
- paddingLeft: theme.spacing.xl * 2,
1453
- "&:hover": {
1454
- boxShadow: theme.shadows.md,
1455
- transform: "scale(1.02)"
1456
- },
1457
- "&::before": {
1458
- content: '""',
1459
- position: "absolute",
1460
- top: 0,
1461
- bottom: 0,
1462
- left: 0,
1463
- width: 6,
1464
- backgroundImage: theme.fn.linearGradient(0, theme.colors[from][6], theme.colors[to][6])
1465
- }
1466
- }
1467
- };
1468
- });
1442
+ const ACCENT_BORDER = {
1443
+ cyan: "border-l-sky-blue-400",
1444
+ mint: "border-l-mint-400",
1445
+ gold: "border-l-gold-400"
1446
+ };
1447
+ const ACCENT_GRADIENT = {
1448
+ cyan: "from-sky-blue-400",
1449
+ mint: "from-mint-400",
1450
+ gold: "from-gold-400"
1451
+ };
1469
1452
  function CardGradient(props) {
1470
- const { classes } = useStyles$h(props);
1471
- const from = props.from || "blue";
1472
- const to = props.to || "green";
1473
- const icon = props.icon || /* @__PURE__ */ React.createElement(IconColorSwatch, { size: 28, stroke: 1.5 });
1474
- return /* @__PURE__ */ React.createElement(Paper, { withBorder: true, radius: "md", className: classes.card, onClick: props.onClick }, /* @__PURE__ */ React.createElement(
1475
- ThemeIcon,
1476
- {
1477
- size: "xl",
1478
- radius: "md",
1479
- variant: "gradient",
1480
- gradient: { deg: 0, from, to }
1453
+ const accent = props.accent || "cyan";
1454
+ return /* @__PURE__ */ React.createElement(
1455
+ "div",
1456
+ {
1457
+ onClick: props.onClick,
1458
+ 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]}`
1481
1459
  },
1482
- icon
1483
- ), /* @__PURE__ */ React.createElement(Text, { size: "xl", weight: 500, mt: "md" }, props.title), /* @__PURE__ */ React.createElement(Text, { size: "sm", mt: "sm", color: "dimmed" }, props.description));
1460
+ /* @__PURE__ */ React.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),
1461
+ /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { className: "text-[15.5px] font-extrabold text-dark-blue-400" }, props.title), /* @__PURE__ */ React.createElement("div", { className: "mt-0.5 text-xs text-slate-500" }, props.description))
1462
+ );
1484
1463
  }
1485
1464
 
1486
- var __defProp$9 = Object.defineProperty;
1487
- var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
1488
- var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
1489
- var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
1490
- var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1491
- var __spreadValues$9 = (a, b) => {
1492
- for (var prop in b || (b = {}))
1493
- if (__hasOwnProp$9.call(b, prop))
1494
- __defNormalProp$9(a, prop, b[prop]);
1495
- if (__getOwnPropSymbols$9)
1496
- for (var prop of __getOwnPropSymbols$9(b)) {
1497
- if (__propIsEnum$9.call(b, prop))
1498
- __defNormalProp$9(a, prop, b[prop]);
1499
- }
1500
- return a;
1501
- };
1502
- var __objRest$1 = (source, exclude) => {
1503
- var target = {};
1504
- for (var prop in source)
1505
- if (__hasOwnProp$9.call(source, prop) && exclude.indexOf(prop) < 0)
1506
- target[prop] = source[prop];
1507
- if (source != null && __getOwnPropSymbols$9)
1508
- for (var prop of __getOwnPropSymbols$9(source)) {
1509
- if (exclude.indexOf(prop) < 0 && __propIsEnum$9.call(source, prop))
1510
- target[prop] = source[prop];
1511
- }
1512
- return target;
1513
- };
1514
- const useStyles$g = createStyles((theme) => ({
1515
- card: {
1516
- height: 240,
1517
- backgroundSize: "cover",
1518
- backgroundPosition: "center",
1519
- whiteSpace: "pre-line"
1520
- },
1521
- content: {
1522
- position: "absolute",
1523
- padding: theme.spacing.xl,
1524
- zIndex: 1,
1525
- top: 0,
1526
- bottom: 0,
1527
- right: 0,
1528
- left: 0
1529
- },
1530
- title: {
1531
- color: theme.white,
1532
- marginBottom: theme.spacing.xs / 2
1533
- },
1534
- description: {
1535
- color: theme.white,
1536
- maxWidth: 220
1537
- },
1538
- code: {
1539
- color: theme.white,
1540
- maxWidth: 220
1541
- }
1542
- }));
1543
- const TenantBanner = (_a) => {
1544
- var _b = _a, {
1545
- title,
1546
- description,
1547
- image,
1548
- style,
1549
- className,
1550
- code
1551
- } = _b, others = __objRest$1(_b, [
1552
- "title",
1553
- "description",
1554
- "image",
1555
- "style",
1556
- "className",
1557
- "code"
1558
- ]);
1559
- const { classes, cx, theme } = useStyles$g();
1560
- const handleCopy = async () => {
1561
- if (!code)
1465
+ const Home = (props) => {
1466
+ const accessCode = props.organization.accessCode;
1467
+ const onCopyAccessCode = async () => {
1468
+ if (!accessCode)
1562
1469
  return;
1563
1470
  try {
1564
- await navigator.clipboard.writeText(code);
1471
+ await navigator.clipboard.writeText(accessCode);
1565
1472
  showNotification({
1566
1473
  title: "Copied!",
1567
1474
  message: "Community code copied to clipboard.",
@@ -1571,97 +1478,59 @@ const TenantBanner = (_a) => {
1571
1478
  console.error("Failed to copy code", err);
1572
1479
  }
1573
1480
  };
1574
- return /* @__PURE__ */ React.createElement(
1575
- Card,
1576
- __spreadValues$9({
1577
- radius: "md",
1578
- style: __spreadValues$9({ backgroundImage: `url(${image})` }, style),
1579
- className: cx(classes.card, className)
1580
- }, others),
1581
- /* @__PURE__ */ React.createElement(
1582
- Overlay,
1583
- {
1584
- gradient: `linear-gradient(105deg, ${theme.black} 20%, #312f2f 50%, ${theme.colors.gray[6]} 100%)`,
1585
- opacity: 0.55,
1586
- zIndex: 0
1587
- }
1588
- ),
1589
- /* @__PURE__ */ React.createElement("div", { className: classes.content }, /* @__PURE__ */ React.createElement(Text, { size: "lg", weight: 700, className: classes.title }, title), /* @__PURE__ */ React.createElement(Text, { size: "sm", className: classes.description }, description), /* @__PURE__ */ React.createElement(Group, { mt: "sm", spacing: "xs" }, /* @__PURE__ */ React.createElement(Text, { size: "sm", className: classes.code }, "Community Code: ", code || "\u2014"), code && /* @__PURE__ */ React.createElement(
1590
- Button,
1591
- {
1592
- size: "xs",
1593
- variant: "white",
1594
- onClick: handleCopy,
1595
- styles: {
1596
- root: {
1597
- backgroundColor: "rgba(255,255,255,0.9)"
1598
- }
1599
- }
1600
- },
1601
- "Copy"
1602
- )))
1603
- );
1604
- };
1605
-
1606
- const Home = (props) => {
1607
- return /* @__PURE__ */ React.createElement(Container, { size: "lg" }, /* @__PURE__ */ React.createElement(Stack$5, { spacing: "lg" }, /* @__PURE__ */ React.createElement(Grid, { gutter: "md" }, /* @__PURE__ */ React.createElement(Grid.Col, { md: 6 }, /* @__PURE__ */ React.createElement(
1608
- UserInfo,
1609
- {
1610
- variant: "compact",
1611
- name: props.name,
1612
- impactStatement: props.impactStatement
1613
- }
1614
- )), /* @__PURE__ */ React.createElement(Grid.Col, { md: 6 }, /* @__PURE__ */ React.createElement(
1615
- TenantBanner,
1481
+ return /* @__PURE__ */ React.createElement("div", { className: "mx-auto flex w-full max-w-[1100px] flex-col gap-5" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-stretch gap-5" }, /* @__PURE__ */ React.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React.createElement("div", { className: "text-[28px] font-extrabold text-dark-blue-400" }, props.name), /* @__PURE__ */ React.createElement("div", { className: "mt-1.5 text-[12.5px] text-slate-400" }, props.impactStatement)), /* @__PURE__ */ React.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.createElement("div", null, /* @__PURE__ */ React.createElement("div", { className: "text-base font-extrabold text-white" }, props.organization.name), /* @__PURE__ */ React.createElement("div", { className: "mt-1.5 text-[11.5px] leading-relaxed text-white/70" }, props.organization.description)), accessCode && /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React.createElement("span", { className: "text-[11px] text-white/70" }, "Community code: ", accessCode), /* @__PURE__ */ React.createElement(
1482
+ "button",
1616
1483
  {
1617
- title: props.organization.name,
1618
- description: props.organization.description,
1619
- image: props.organization.image,
1620
- code: props.organization.accessCode
1621
- }
1622
- ))), /* @__PURE__ */ React.createElement(Grid, { gutter: "md" }, /* @__PURE__ */ React.createElement(Grid.Col, null, /* @__PURE__ */ React.createElement(
1484
+ onClick: onCopyAccessCode,
1485
+ className: "rounded-md bg-white/90 px-2.5 py-1 text-[10.5px] font-bold text-dark-blue-400 hover:bg-white"
1486
+ },
1487
+ "Copy"
1488
+ )))), /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React.createElement(
1623
1489
  CardGradient,
1624
1490
  {
1625
1491
  title: "Dashboard",
1626
1492
  description: "Track your students\u2019 pathway progress",
1493
+ accent: "mint",
1494
+ icon: /* @__PURE__ */ React.createElement(IconGauge, { size: 18, stroke: 1.75 }),
1627
1495
  onClick: props.onDashboardClick
1628
1496
  }
1629
- )), /* @__PURE__ */ React.createElement(Grid.Col, null, /* @__PURE__ */ React.createElement(
1497
+ ), /* @__PURE__ */ React.createElement(
1630
1498
  CardGradient,
1631
1499
  {
1632
1500
  title: "Classes",
1633
1501
  description: "Create classes, cohorts, or custom subgroups",
1502
+ accent: "gold",
1503
+ icon: /* @__PURE__ */ React.createElement(IconCategory2, { size: 18, stroke: 1.75 }),
1634
1504
  onClick: props.onClassesClick
1635
1505
  }
1636
- )), /* @__PURE__ */ React.createElement(Grid.Col, null, /* @__PURE__ */ React.createElement(
1506
+ ), /* @__PURE__ */ React.createElement(
1637
1507
  CardGradient,
1638
1508
  {
1639
1509
  title: "Pathways",
1640
1510
  description: "Explore all your unique pathway requirements in one clear space",
1511
+ accent: "cyan",
1512
+ icon: /* @__PURE__ */ React.createElement(IconRoute, { size: 18, stroke: 1.75 }),
1641
1513
  onClick: props.onPathwaysClick
1642
1514
  }
1643
- )), /* @__PURE__ */ React.createElement(Grid.Col, null, /* @__PURE__ */ React.createElement(
1515
+ ), /* @__PURE__ */ React.createElement(
1644
1516
  CardGradient,
1645
1517
  {
1646
1518
  title: "Badges",
1647
1519
  description: "Key milestones that reflect skill development, micro-credentials, or academic progress",
1520
+ accent: "mint",
1521
+ icon: /* @__PURE__ */ React.createElement(IconAlbum, { size: 18, stroke: 1.75 }),
1648
1522
  onClick: props.onBadgesClick
1649
1523
  }
1650
- )), /* @__PURE__ */ React.createElement(Grid.Col, null, /* @__PURE__ */ React.createElement(
1651
- CardGradient,
1652
- {
1653
- title: "Lessons",
1654
- description: "Bite-sized activities and learning experiences accelerating students achievement",
1655
- onClick: props.onLessonsClick
1656
- }
1657
- )), /* @__PURE__ */ React.createElement(Grid.Col, null, /* @__PURE__ */ React.createElement(
1524
+ ), /* @__PURE__ */ React.createElement(
1658
1525
  CardGradient,
1659
1526
  {
1660
1527
  title: "File Locker",
1661
1528
  description: "A secure space to view student-submitted work and provide feedback",
1529
+ accent: "cyan",
1530
+ icon: /* @__PURE__ */ React.createElement(IconClipboard, { size: 18, stroke: 1.75 }),
1662
1531
  onClick: props.onFileLockerClick
1663
1532
  }
1664
- )))));
1533
+ )));
1665
1534
  };
1666
1535
 
1667
1536
  function Table$7(props) {
@@ -1696,7 +1565,7 @@ function Table$7(props) {
1696
1565
  ));
1697
1566
  }
1698
1567
 
1699
- const useStyles$f = createStyles((theme) => ({
1568
+ const useStyles$d = createStyles((theme) => ({
1700
1569
  button: {
1701
1570
  borderTopRightRadius: 0,
1702
1571
  borderBottomRightRadius: 0,
@@ -1711,7 +1580,7 @@ const useStyles$f = createStyles((theme) => ({
1711
1580
  }
1712
1581
  }));
1713
1582
  const SplitButton$3 = (props) => {
1714
- const { classes, theme } = useStyles$f();
1583
+ const { classes, theme } = useStyles$d();
1715
1584
  theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
1716
1585
  return /* @__PURE__ */ React.createElement(Stack$5, { spacing: "sm" }, /* @__PURE__ */ React.createElement(
1717
1586
  Button,
@@ -1748,28 +1617,28 @@ function Stack$3(props) {
1748
1617
  return /* @__PURE__ */ React.createElement(ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React.createElement(UnstyledButton, { component: Link, to: props.href }, /* @__PURE__ */ React.createElement(Stack$5, { spacing: 24, sx: { padding: 20, minWidth: 700 } }, rows)));
1749
1618
  }
1750
1619
 
1751
- var __defProp$8 = Object.defineProperty;
1752
- var __defProps$6 = Object.defineProperties;
1753
- var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
1754
- var __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;
1755
- var __hasOwnProp$8 = Object.prototype.hasOwnProperty;
1756
- var __propIsEnum$8 = Object.prototype.propertyIsEnumerable;
1757
- var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1758
- var __spreadValues$8 = (a, b) => {
1620
+ var __defProp$a = Object.defineProperty;
1621
+ var __defProps$7 = Object.defineProperties;
1622
+ var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;
1623
+ var __getOwnPropSymbols$a = Object.getOwnPropertySymbols;
1624
+ var __hasOwnProp$a = Object.prototype.hasOwnProperty;
1625
+ var __propIsEnum$a = Object.prototype.propertyIsEnumerable;
1626
+ var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1627
+ var __spreadValues$a = (a, b) => {
1759
1628
  for (var prop in b || (b = {}))
1760
- if (__hasOwnProp$8.call(b, prop))
1761
- __defNormalProp$8(a, prop, b[prop]);
1762
- if (__getOwnPropSymbols$8)
1763
- for (var prop of __getOwnPropSymbols$8(b)) {
1764
- if (__propIsEnum$8.call(b, prop))
1765
- __defNormalProp$8(a, prop, b[prop]);
1629
+ if (__hasOwnProp$a.call(b, prop))
1630
+ __defNormalProp$a(a, prop, b[prop]);
1631
+ if (__getOwnPropSymbols$a)
1632
+ for (var prop of __getOwnPropSymbols$a(b)) {
1633
+ if (__propIsEnum$a.call(b, prop))
1634
+ __defNormalProp$a(a, prop, b[prop]);
1766
1635
  }
1767
1636
  return a;
1768
1637
  };
1769
- var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
1638
+ var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));
1770
1639
  function Table$6(props) {
1771
1640
  const preparedItems = React.useMemo(() => {
1772
- return props.items.map((item) => __spreadProps$6(__spreadValues$8({}, item), {
1641
+ return props.items.map((item) => __spreadProps$7(__spreadValues$a({}, item), {
1773
1642
  status: item.isComplete ? 2 : item.isStarted ? 1 : 0
1774
1643
  }));
1775
1644
  }, [props.items]);
@@ -1889,7 +1758,7 @@ function Stack$2(props) {
1889
1758
  }
1890
1759
  const truncateWithEllipses = (text, max) => text.substr(0, max - 1) + (text.length > max ? "&hellip;" : "");
1891
1760
 
1892
- const useStyles$e = createStyles((theme) => ({
1761
+ const useStyles$c = createStyles((theme) => ({
1893
1762
  title: {
1894
1763
  fontSize: 34,
1895
1764
  fontWeight: 900,
@@ -1902,7 +1771,7 @@ const useStyles$e = createStyles((theme) => ({
1902
1771
  }
1903
1772
  }));
1904
1773
  const Lesson = (props) => {
1905
- const { classes } = useStyles$e();
1774
+ const { classes } = useStyles$c();
1906
1775
  const [tab, setTab] = useState("question");
1907
1776
  const numberOfStudents = props.students.length;
1908
1777
  const numberOfLessons = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
@@ -2015,68 +1884,38 @@ const Lesson = (props) => {
2015
1884
  };
2016
1885
 
2017
1886
  function Table$5(props) {
1887
+ if (props.loading) {
1888
+ return /* @__PURE__ */ React.createElement("div", { className: "text-sm text-slate-400" }, "Loading\u2026");
1889
+ }
2018
1890
  if (props.items.length === 0) {
2019
- return /* @__PURE__ */ React.createElement(
2020
- PlaceholderBanner,
2021
- {
2022
- title: "No lessons to display",
2023
- description: "We don't have any lessons to show you just yet.",
2024
- loading: props.loading,
2025
- icon: "lessons"
2026
- }
2027
- );
1891
+ return /* @__PURE__ */ React.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.");
2028
1892
  }
2029
- const rows = props.items.map((row) => /* @__PURE__ */ React.createElement("tr", { key: row.lessonId }, /* @__PURE__ */ React.createElement("td", null, /* @__PURE__ */ React.createElement(
2030
- UnstyledButton,
1893
+ return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React.createElement("div", { className: "flex gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React.createElement("div", { className: "flex-1" }, "Lesson"), /* @__PURE__ */ React.createElement("div", { className: "w-40 shrink-0" }, "Pathway"), /* @__PURE__ */ React.createElement("div", { className: "w-4 shrink-0" })), props.items.map((row) => /* @__PURE__ */ React.createElement(
1894
+ Link,
2031
1895
  {
2032
- component: Link,
1896
+ key: row.lessonId,
2033
1897
  to: row.href,
2034
- sx: (theme) => ({
2035
- display: "block",
2036
- width: "100%",
2037
- padding: theme.spacing.md,
2038
- color: theme.colorScheme === "dark" ? theme.colors.dark[0] : theme.black,
2039
- "&:hover": {
2040
- backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[8] : theme.colors.gray[1]
2041
- }
2042
- })
1898
+ className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
2043
1899
  },
2044
- /* @__PURE__ */ React.createElement(Group, null, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Text, { size: "sm", weight: 500 }, row.name), /* @__PURE__ */ React.createElement(Text, { size: "xs", color: "dimmed" }, row.description)))
2045
- ))));
2046
- return /* @__PURE__ */ React.createElement(ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React.createElement(Table$l, { horizontalSpacing: 0, verticalSpacing: 0, sx: { minWidth: 700 } }, /* @__PURE__ */ React.createElement("tbody", null, rows)));
1900
+ /* @__PURE__ */ React.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React.createElement("div", { className: "text-sm font-bold text-dark-blue-400" }, row.name), row.description && /* @__PURE__ */ React.createElement("div", { className: "mt-1 text-xs leading-relaxed text-slate-500" }, row.description)),
1901
+ /* @__PURE__ */ React.createElement("div", { className: "w-40 shrink-0 text-xs text-slate-500" }, row.pathway || "\u2014"),
1902
+ /* @__PURE__ */ React.createElement(IconChevronRight, { size: 16, stroke: 2, className: "w-4 shrink-0 text-slate-300" })
1903
+ )));
2047
1904
  }
2048
1905
 
2049
- const useStyles$d = createStyles((theme) => ({
2050
- title: {
2051
- fontSize: 34,
2052
- fontWeight: 900,
2053
- [theme.fn.smallerThan("sm")]: {
2054
- fontSize: 24
2055
- }
2056
- },
2057
- description: {
2058
- maxWidth: 600
2059
- }
2060
- }));
2061
1906
  const Lessons = (props) => {
2062
- const { classes } = useStyles$d();
2063
- return /* @__PURE__ */ React.createElement(Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React.createElement(Stack$5, { spacing: "md" }, /* @__PURE__ */ React.createElement(Grid, null, /* @__PURE__ */ React.createElement(Grid.Col, { sm: "auto" }, /* @__PURE__ */ React.createElement(Badge$1, { variant: "filled", size: "lg" }, "Lessons"), /* @__PURE__ */ React.createElement(Title, { order: 2, className: classes.title, mt: "md" }, "Lessons"), /* @__PURE__ */ React.createElement(Text, { color: "dimmed", className: classes.description, mt: "sm" }, "Bite-sized activities and learning experiences accelerating students achievement"))), /* @__PURE__ */ React.createElement(
2064
- Autocomplete,
1907
+ return /* @__PURE__ */ React.createElement("div", { className: "mx-auto flex max-w-4xl flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Lessons"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-slate-500" }, "Bite-sized activities and learning experiences accelerating students achievement")), /* @__PURE__ */ React.createElement("div", { className: "relative" }, /* @__PURE__ */ React.createElement(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.createElement(
1908
+ "input",
2065
1909
  {
1910
+ type: "text",
2066
1911
  placeholder: "Search for a lesson that fits your needs",
2067
- data: props.lessons.map((item) => item.name),
2068
- onChange: props.onAutocompleteChange
2069
- }
2070
- ), /* @__PURE__ */ React.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React.createElement(LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React.createElement(
2071
- Table$5,
2072
- {
2073
- loading: props.loading,
2074
- items: props.lessons
1912
+ onChange: (e) => props.onAutocompleteChange(e.target.value),
1913
+ 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"
2075
1914
  }
2076
- ))));
1915
+ )), /* @__PURE__ */ React.createElement(Table$5, { loading: props.loading, items: props.lessons }));
2077
1916
  };
2078
1917
 
2079
- const useStyles$c = createStyles((theme) => ({
1918
+ const useStyles$b = createStyles((theme) => ({
2080
1919
  title: {
2081
1920
  fontSize: 22,
2082
1921
  fontWeight: 900,
@@ -2095,7 +1934,7 @@ const useStyles$c = createStyles((theme) => ({
2095
1934
  }
2096
1935
  }));
2097
1936
  function AccessCode(props) {
2098
- const { classes } = useStyles$c();
1937
+ const { classes } = useStyles$b();
2099
1938
  return /* @__PURE__ */ React.createElement(Container, { mx: "0", px: "0", size: 460, my: 30 }, /* @__PURE__ */ React.createElement(Title, { className: classes.title }, "Access code"), /* @__PURE__ */ React.createElement(Text, { color: "dimmed", size: "sm" }, "Grant access to join your organization"), /* @__PURE__ */ React.createElement(Paper, { withBorder: true, shadow: "md", p: 30, radius: "md", mt: "xl" }, /* @__PURE__ */ React.createElement(TextInput, { value: props.value, readOnly: true }), /* @__PURE__ */ React.createElement(Group, { position: "apart", mt: "lg", className: classes.controls }, /* @__PURE__ */ React.createElement(
2100
1939
  Anchor,
2101
1940
  {
@@ -2123,7 +1962,7 @@ const monthNames = [
2123
1962
  "November",
2124
1963
  "December"
2125
1964
  ];
2126
- const useStyles$b = createStyles((theme) => ({
1965
+ const useStyles$a = createStyles((theme) => ({
2127
1966
  title: {
2128
1967
  fontSize: 34,
2129
1968
  fontWeight: 900,
@@ -2153,7 +1992,7 @@ const useStyles$b = createStyles((theme) => ({
2153
1992
  }
2154
1993
  }));
2155
1994
  const Organization = (props) => {
2156
- const { classes } = useStyles$b();
1995
+ const { classes } = useStyles$a();
2157
1996
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React.createElement(Stack$5, { spacing: "md" }, /* @__PURE__ */ React.createElement(Grid, null, /* @__PURE__ */ React.createElement(Grid.Col, { sm: "auto" }, /* @__PURE__ */ React.createElement(UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React.createElement(
2158
1997
  Badge$1,
2159
1998
  {
@@ -2179,7 +2018,7 @@ const Organization = (props) => {
2179
2018
  ] }))))));
2180
2019
  };
2181
2020
 
2182
- const useStyles$a = createStyles((theme) => ({
2021
+ const useStyles$9 = createStyles((theme) => ({
2183
2022
  button: {
2184
2023
  borderTopRightRadius: 0,
2185
2024
  borderBottomRightRadius: 0,
@@ -2194,7 +2033,7 @@ const useStyles$a = createStyles((theme) => ({
2194
2033
  }
2195
2034
  }));
2196
2035
  const SplitButton$2 = (props) => {
2197
- const { classes, theme } = useStyles$a();
2036
+ const { classes, theme } = useStyles$9();
2198
2037
  const menuIconColor = theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
2199
2038
  const hasMenu = !!props.withOrganizationLink;
2200
2039
  return /* @__PURE__ */ React.createElement(Group, { noWrap: true, spacing: 0 }, /* @__PURE__ */ React.createElement(
@@ -2256,26 +2095,26 @@ function Table$4(props) {
2256
2095
  return /* @__PURE__ */ React.createElement(ScrollArea, null, /* @__PURE__ */ React.createElement(Table$l, { verticalSpacing: 20, sx: { minWidth: 700 }, highlightOnHover: true, striped: true }, /* @__PURE__ */ React.createElement("thead", null, /* @__PURE__ */ React.createElement("tr", null, /* @__PURE__ */ React.createElement("th", null, "Name"), /* @__PURE__ */ React.createElement("th", null, "Role"), /* @__PURE__ */ React.createElement("th", null, "Account Created?"), /* @__PURE__ */ React.createElement("th", null, "# of Classes"), /* @__PURE__ */ React.createElement("th", null))), /* @__PURE__ */ React.createElement("tbody", null, rows)));
2257
2096
  }
2258
2097
 
2259
- var __defProp$7 = Object.defineProperty;
2260
- var __defProps$5 = Object.defineProperties;
2261
- var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
2262
- var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;
2263
- var __hasOwnProp$7 = Object.prototype.hasOwnProperty;
2264
- var __propIsEnum$7 = Object.prototype.propertyIsEnumerable;
2265
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2266
- var __spreadValues$7 = (a, b) => {
2098
+ var __defProp$9 = Object.defineProperty;
2099
+ var __defProps$6 = Object.defineProperties;
2100
+ var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
2101
+ var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
2102
+ var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
2103
+ var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
2104
+ var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2105
+ var __spreadValues$9 = (a, b) => {
2267
2106
  for (var prop in b || (b = {}))
2268
- if (__hasOwnProp$7.call(b, prop))
2269
- __defNormalProp$7(a, prop, b[prop]);
2270
- if (__getOwnPropSymbols$7)
2271
- for (var prop of __getOwnPropSymbols$7(b)) {
2272
- if (__propIsEnum$7.call(b, prop))
2273
- __defNormalProp$7(a, prop, b[prop]);
2107
+ if (__hasOwnProp$9.call(b, prop))
2108
+ __defNormalProp$9(a, prop, b[prop]);
2109
+ if (__getOwnPropSymbols$9)
2110
+ for (var prop of __getOwnPropSymbols$9(b)) {
2111
+ if (__propIsEnum$9.call(b, prop))
2112
+ __defNormalProp$9(a, prop, b[prop]);
2274
2113
  }
2275
2114
  return a;
2276
2115
  };
2277
- var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
2278
- const useStyles$9 = createStyles((theme) => ({
2116
+ var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
2117
+ const useStyles$8 = createStyles((theme) => ({
2279
2118
  title: {
2280
2119
  fontSize: 34,
2281
2120
  fontWeight: 900,
@@ -2305,7 +2144,7 @@ const useStyles$9 = createStyles((theme) => ({
2305
2144
  }
2306
2145
  }));
2307
2146
  const People = (props) => {
2308
- const { classes } = useStyles$9();
2147
+ const { classes } = useStyles$8();
2309
2148
  const form = useForm({
2310
2149
  initialValues: {
2311
2150
  userId: "",
@@ -2336,27 +2175,27 @@ const People = (props) => {
2336
2175
  padding: "xl",
2337
2176
  size: "xl"
2338
2177
  },
2339
- /* @__PURE__ */ React.createElement(Stack$5, { spacing: "md" }, /* @__PURE__ */ React.createElement(DropzoneButton, __spreadProps$5(__spreadValues$7({}, props), { close: () => setOpened(false) })), /* @__PURE__ */ React.createElement(Divider, { label: "or", labelPosition: "center", my: "md", variant: "dashed" }), /* @__PURE__ */ React.createElement("form", { onSubmit: form.onSubmit(() => {
2178
+ /* @__PURE__ */ React.createElement(Stack$5, { spacing: "md" }, /* @__PURE__ */ React.createElement(DropzoneButton, __spreadProps$6(__spreadValues$9({}, props), { close: () => setOpened(false) })), /* @__PURE__ */ React.createElement(Divider, { label: "or", labelPosition: "center", my: "md", variant: "dashed" }), /* @__PURE__ */ React.createElement("form", { onSubmit: form.onSubmit(() => {
2340
2179
  const values = form.values;
2341
2180
  form.reset();
2342
2181
  setOpened(false);
2343
2182
  props.onCreateUsers && props.onCreateUsers([values]);
2344
2183
  }) }, /* @__PURE__ */ React.createElement(Stack$5, null, /* @__PURE__ */ React.createElement(
2345
2184
  TextInput,
2346
- __spreadValues$7({
2185
+ __spreadValues$9({
2347
2186
  withAsterisk: true,
2348
2187
  label: "Email",
2349
2188
  placeholder: "Email"
2350
2189
  }, form.getInputProps("email"))
2351
2190
  ), /* @__PURE__ */ React.createElement(Group, { grow: true }, /* @__PURE__ */ React.createElement(
2352
2191
  TextInput,
2353
- __spreadValues$7({
2192
+ __spreadValues$9({
2354
2193
  label: "Given name",
2355
2194
  placeholder: "Given name"
2356
2195
  }, form.getInputProps("givenName"))
2357
2196
  ), /* @__PURE__ */ React.createElement(
2358
2197
  TextInput,
2359
- __spreadValues$7({
2198
+ __spreadValues$9({
2360
2199
  label: "Family name",
2361
2200
  placeholder: "Family name"
2362
2201
  }, form.getInputProps("familyName"))
@@ -2409,7 +2248,7 @@ const People = (props) => {
2409
2248
  ))))));
2410
2249
  };
2411
2250
  const DropzoneButton = (props) => {
2412
- const { classes, theme } = useStyles$9();
2251
+ const { classes, theme } = useStyles$8();
2413
2252
  const openRef = React.useRef(null);
2414
2253
  const [loading, setLoading] = React.useState(false);
2415
2254
  const onDrop = React.useCallback((acceptedFiles) => {
@@ -2455,7 +2294,7 @@ const DropzoneButton = (props) => {
2455
2294
  } }, "Select file"));
2456
2295
  };
2457
2296
 
2458
- const useStyles$8 = createStyles((theme) => ({
2297
+ const useStyles$7 = createStyles((theme) => ({
2459
2298
  form: {
2460
2299
  backgroundColor: theme.white,
2461
2300
  padding: theme.spacing.xl,
@@ -2518,7 +2357,7 @@ const useStyles$8 = createStyles((theme) => ({
2518
2357
  }
2519
2358
  }));
2520
2359
  const StartAnonymousLesson = (props) => {
2521
- const { classes } = useStyles$8();
2360
+ const { classes } = useStyles$7();
2522
2361
  const [name, setName] = React.useState("");
2523
2362
  return /* @__PURE__ */ React.createElement("div", { className: classes.wrapper }, /* @__PURE__ */ React.createElement(Container, null, /* @__PURE__ */ React.createElement(SimpleGrid, { maw: 960, cols: 2, spacing: 15, breakpoints: [{ maxWidth: "sm", cols: 1 }] }, /* @__PURE__ */ React.createElement("div", { className: classes.content }, /* @__PURE__ */ React.createElement(Badge$1, { color: "violet" }, "Community"), /* @__PURE__ */ React.createElement(Title, { className: classes.title }, props.title), /* @__PURE__ */ React.createElement(Text, { color: "dimmed", mt: "md" }, props.description), /* @__PURE__ */ React.createElement(Text, { color: "dimmed", mt: "md" }, "You are now part of ", `${props.educatorName}'s`, " Class")), /* @__PURE__ */ React.createElement("div", { className: classes.form }, /* @__PURE__ */ React.createElement(
2524
2363
  TextInput,
@@ -2542,24 +2381,24 @@ const StartAnonymousLesson = (props) => {
2542
2381
  ))))));
2543
2382
  };
2544
2383
 
2545
- var __defProp$6 = Object.defineProperty;
2546
- var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
2547
- var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
2548
- var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
2549
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2550
- var __spreadValues$6 = (a, b) => {
2384
+ var __defProp$8 = Object.defineProperty;
2385
+ var __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;
2386
+ var __hasOwnProp$8 = Object.prototype.hasOwnProperty;
2387
+ var __propIsEnum$8 = Object.prototype.propertyIsEnumerable;
2388
+ var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2389
+ var __spreadValues$8 = (a, b) => {
2551
2390
  for (var prop in b || (b = {}))
2552
- if (__hasOwnProp$6.call(b, prop))
2553
- __defNormalProp$6(a, prop, b[prop]);
2554
- if (__getOwnPropSymbols$6)
2555
- for (var prop of __getOwnPropSymbols$6(b)) {
2556
- if (__propIsEnum$6.call(b, prop))
2557
- __defNormalProp$6(a, prop, b[prop]);
2391
+ if (__hasOwnProp$8.call(b, prop))
2392
+ __defNormalProp$8(a, prop, b[prop]);
2393
+ if (__getOwnPropSymbols$8)
2394
+ for (var prop of __getOwnPropSymbols$8(b)) {
2395
+ if (__propIsEnum$8.call(b, prop))
2396
+ __defNormalProp$8(a, prop, b[prop]);
2558
2397
  }
2559
2398
  return a;
2560
2399
  };
2561
2400
  const BadgeGrid = (props) => {
2562
- const badges = props.badges.map((b) => /* @__PURE__ */ React.createElement(TaskCard, __spreadValues$6({ key: b.title }, b)));
2401
+ const badges = props.badges.map((b) => /* @__PURE__ */ React.createElement(TaskCard, __spreadValues$8({ key: b.title }, b)));
2563
2402
  return /* @__PURE__ */ React.createElement(SimpleGrid, { cols: 4, breakpoints: [{ maxWidth: "sm", cols: 1 }, { maxWidth: "md", cols: 3 }] }, badges);
2564
2403
  };
2565
2404
  function TaskCard(props) {
@@ -2575,116 +2414,236 @@ function TaskCard(props) {
2575
2414
  ));
2576
2415
  }
2577
2416
 
2578
- const useStyles$7 = createStyles((theme) => ({
2579
- action: {
2580
- backgroundColor: "inherit",
2581
- ":hover": {
2582
- textDecoration: "underline"
2583
- }
2584
- },
2585
- title: {
2586
- color: theme.colorScheme === "dark" ? theme.white : theme.black,
2587
- fontFamily: `Greycliff CF, ${theme.fontFamily}`,
2588
- fontSize: theme.fontSizes.xl,
2589
- lineHeight: 1.5,
2590
- fontWeight: 900,
2591
- [theme.fn.smallerThan("xs")]: {
2592
- fontSize: theme.fontSizes.md
2593
- }
2594
- }
2595
- }));
2596
- const TrialHome = (props) => {
2597
- const { classes } = useStyles$7();
2598
- return /* @__PURE__ */ React.createElement(Container, { size: "lg" }, /* @__PURE__ */ React.createElement(Badge$1, null, props.daysRemaining, " day", props.daysRemaining !== 1 ? "s" : "", " left"), /* @__PURE__ */ React.createElement(
2599
- Button,
2600
- {
2601
- className: classes.action,
2602
- variant: "white",
2603
- component: "a",
2604
- size: "xs",
2605
- href: props.upgradeHref,
2606
- target: "_blank"
2607
- },
2608
- "UPGRADE NOW"
2609
- ), /* @__PURE__ */ React.createElement(Stack$5, { spacing: "sm" }, /* @__PURE__ */ React.createElement(Stack$5, { spacing: 0 }, /* @__PURE__ */ React.createElement(
2610
- UserInfo,
2611
- {
2612
- variant: "compact",
2613
- name: props.name,
2614
- impactStatement: ""
2615
- }
2616
- ), /* @__PURE__ */ React.createElement(
2617
- TenantBanner,
2618
- {
2619
- title: "Trial Account",
2620
- description: `Welcome to your Local Civics Trial Account${props.firstName ? ", " + props.firstName : ""}!`,
2621
- image: "https://cdn.localcivics.io/hub/landing.jpg"
2622
- }
2623
- )), /* @__PURE__ */ React.createElement(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.createElement(BadgeGrid, { onAssign: props.onAssign, badges: props.badges })));
2624
- };
2625
-
2626
- var __defProp$5 = Object.defineProperty;
2627
- var __defProps$4 = Object.defineProperties;
2628
- var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
2629
- var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
2630
- var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
2631
- var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
2632
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2633
- var __spreadValues$5 = (a, b) => {
2417
+ var __defProp$7 = Object.defineProperty;
2418
+ var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;
2419
+ var __hasOwnProp$7 = Object.prototype.hasOwnProperty;
2420
+ var __propIsEnum$7 = Object.prototype.propertyIsEnumerable;
2421
+ var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2422
+ var __spreadValues$7 = (a, b) => {
2634
2423
  for (var prop in b || (b = {}))
2635
- if (__hasOwnProp$5.call(b, prop))
2636
- __defNormalProp$5(a, prop, b[prop]);
2637
- if (__getOwnPropSymbols$5)
2638
- for (var prop of __getOwnPropSymbols$5(b)) {
2639
- if (__propIsEnum$5.call(b, prop))
2640
- __defNormalProp$5(a, prop, b[prop]);
2424
+ if (__hasOwnProp$7.call(b, prop))
2425
+ __defNormalProp$7(a, prop, b[prop]);
2426
+ if (__getOwnPropSymbols$7)
2427
+ for (var prop of __getOwnPropSymbols$7(b)) {
2428
+ if (__propIsEnum$7.call(b, prop))
2429
+ __defNormalProp$7(a, prop, b[prop]);
2641
2430
  }
2642
2431
  return a;
2643
2432
  };
2644
- var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
2645
- var __objRest = (source, exclude) => {
2433
+ var __objRest$1 = (source, exclude) => {
2646
2434
  var target = {};
2647
2435
  for (var prop in source)
2648
- if (__hasOwnProp$5.call(source, prop) && exclude.indexOf(prop) < 0)
2436
+ if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)
2649
2437
  target[prop] = source[prop];
2650
- if (source != null && __getOwnPropSymbols$5)
2651
- for (var prop of __getOwnPropSymbols$5(source)) {
2652
- if (exclude.indexOf(prop) < 0 && __propIsEnum$5.call(source, prop))
2438
+ if (source != null && __getOwnPropSymbols$7)
2439
+ for (var prop of __getOwnPropSymbols$7(source)) {
2440
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))
2653
2441
  target[prop] = source[prop];
2654
2442
  }
2655
2443
  return target;
2656
2444
  };
2657
- const useStyles$6 = createStyles((theme, { checked }) => ({
2658
- button: {
2659
- display: "flex",
2660
- alignItems: "center",
2661
- width: "100%",
2662
- transition: "background-color 150ms ease, border-color 150ms ease",
2663
- border: `1px solid ${checked ? theme.fn.variant({ variant: "outline", color: theme.primaryColor }).border : theme.colorScheme === "dark" ? theme.colors.dark[8] : theme.colors.gray[3]}`,
2664
- borderRadius: theme.radius.sm,
2665
- padding: theme.spacing.md,
2666
- paddingTop: theme.spacing.sm,
2667
- paddingBottom: theme.spacing.sm,
2668
- backgroundColor: checked ? theme.fn.variant({ variant: "light", color: theme.primaryColor }).background : theme.colorScheme === "dark" ? theme.colors.dark[8] : theme.white
2445
+ const useStyles$6 = createStyles((theme) => ({
2446
+ card: {
2447
+ height: 240,
2448
+ backgroundSize: "cover",
2449
+ backgroundPosition: "center",
2450
+ whiteSpace: "pre-line"
2669
2451
  },
2670
- body: {
2671
- flex: 1,
2672
- marginLeft: theme.spacing.md
2673
- }
2674
- }));
2675
- function ImageCheckbox(_a) {
2676
- var _b = _a, {
2677
- checked,
2678
- defaultChecked,
2679
- onChange,
2680
- title,
2681
- description,
2682
- className,
2683
- icon: Icon
2684
- } = _b, others = __objRest(_b, [
2685
- "checked",
2686
- "defaultChecked",
2687
- "onChange",
2452
+ content: {
2453
+ position: "absolute",
2454
+ padding: theme.spacing.xl,
2455
+ zIndex: 1,
2456
+ top: 0,
2457
+ bottom: 0,
2458
+ right: 0,
2459
+ left: 0
2460
+ },
2461
+ title: {
2462
+ color: theme.white,
2463
+ marginBottom: theme.spacing.xs / 2
2464
+ },
2465
+ description: {
2466
+ color: theme.white,
2467
+ maxWidth: 220
2468
+ },
2469
+ code: {
2470
+ color: theme.white,
2471
+ maxWidth: 220
2472
+ }
2473
+ }));
2474
+ const TenantBanner = (_a) => {
2475
+ var _b = _a, {
2476
+ title,
2477
+ description,
2478
+ image,
2479
+ style,
2480
+ className,
2481
+ code
2482
+ } = _b, others = __objRest$1(_b, [
2483
+ "title",
2484
+ "description",
2485
+ "image",
2486
+ "style",
2487
+ "className",
2488
+ "code"
2489
+ ]);
2490
+ const { classes, cx, theme } = useStyles$6();
2491
+ const handleCopy = async () => {
2492
+ if (!code)
2493
+ return;
2494
+ try {
2495
+ await navigator.clipboard.writeText(code);
2496
+ showNotification({
2497
+ title: "Copied!",
2498
+ message: "Community code copied to clipboard.",
2499
+ autoClose: 3e3
2500
+ });
2501
+ } catch (err) {
2502
+ console.error("Failed to copy code", err);
2503
+ }
2504
+ };
2505
+ return /* @__PURE__ */ React.createElement(
2506
+ Card,
2507
+ __spreadValues$7({
2508
+ radius: "md",
2509
+ style: __spreadValues$7({ backgroundImage: `url(${image})` }, style),
2510
+ className: cx(classes.card, className)
2511
+ }, others),
2512
+ /* @__PURE__ */ React.createElement(
2513
+ Overlay,
2514
+ {
2515
+ gradient: `linear-gradient(105deg, ${theme.black} 20%, #312f2f 50%, ${theme.colors.gray[6]} 100%)`,
2516
+ opacity: 0.55,
2517
+ zIndex: 0
2518
+ }
2519
+ ),
2520
+ /* @__PURE__ */ React.createElement("div", { className: classes.content }, /* @__PURE__ */ React.createElement(Text, { size: "lg", weight: 700, className: classes.title }, title), /* @__PURE__ */ React.createElement(Text, { size: "sm", className: classes.description }, description), /* @__PURE__ */ React.createElement(Group, { mt: "sm", spacing: "xs" }, /* @__PURE__ */ React.createElement(Text, { size: "sm", className: classes.code }, "Community Code: ", code || "\u2014"), code && /* @__PURE__ */ React.createElement(
2521
+ Button,
2522
+ {
2523
+ size: "xs",
2524
+ variant: "white",
2525
+ onClick: handleCopy,
2526
+ styles: {
2527
+ root: {
2528
+ backgroundColor: "rgba(255,255,255,0.9)"
2529
+ }
2530
+ }
2531
+ },
2532
+ "Copy"
2533
+ )))
2534
+ );
2535
+ };
2536
+
2537
+ const useStyles$5 = createStyles((theme) => ({
2538
+ action: {
2539
+ backgroundColor: "inherit",
2540
+ ":hover": {
2541
+ textDecoration: "underline"
2542
+ }
2543
+ },
2544
+ title: {
2545
+ color: theme.colorScheme === "dark" ? theme.white : theme.black,
2546
+ fontFamily: `Greycliff CF, ${theme.fontFamily}`,
2547
+ fontSize: theme.fontSizes.xl,
2548
+ lineHeight: 1.5,
2549
+ fontWeight: 900,
2550
+ [theme.fn.smallerThan("xs")]: {
2551
+ fontSize: theme.fontSizes.md
2552
+ }
2553
+ }
2554
+ }));
2555
+ const TrialHome = (props) => {
2556
+ const { classes } = useStyles$5();
2557
+ return /* @__PURE__ */ React.createElement(Container, { size: "lg" }, /* @__PURE__ */ React.createElement(Badge$1, null, props.daysRemaining, " day", props.daysRemaining !== 1 ? "s" : "", " left"), /* @__PURE__ */ React.createElement(
2558
+ Button,
2559
+ {
2560
+ className: classes.action,
2561
+ variant: "white",
2562
+ component: "a",
2563
+ size: "xs",
2564
+ href: props.upgradeHref,
2565
+ target: "_blank"
2566
+ },
2567
+ "UPGRADE NOW"
2568
+ ), /* @__PURE__ */ React.createElement(Stack$5, { spacing: "sm" }, /* @__PURE__ */ React.createElement(Stack$5, { spacing: 0 }, /* @__PURE__ */ React.createElement(
2569
+ UserInfo,
2570
+ {
2571
+ variant: "compact",
2572
+ name: props.name,
2573
+ impactStatement: ""
2574
+ }
2575
+ ), /* @__PURE__ */ React.createElement(
2576
+ TenantBanner,
2577
+ {
2578
+ title: "Trial Account",
2579
+ description: `Welcome to your Local Civics Trial Account${props.firstName ? ", " + props.firstName : ""}!`,
2580
+ image: "https://cdn.localcivics.io/hub/landing.jpg"
2581
+ }
2582
+ )), /* @__PURE__ */ React.createElement(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.createElement(BadgeGrid, { onAssign: props.onAssign, badges: props.badges })));
2583
+ };
2584
+
2585
+ var __defProp$6 = Object.defineProperty;
2586
+ var __defProps$5 = Object.defineProperties;
2587
+ var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
2588
+ var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
2589
+ var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
2590
+ var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
2591
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2592
+ var __spreadValues$6 = (a, b) => {
2593
+ for (var prop in b || (b = {}))
2594
+ if (__hasOwnProp$6.call(b, prop))
2595
+ __defNormalProp$6(a, prop, b[prop]);
2596
+ if (__getOwnPropSymbols$6)
2597
+ for (var prop of __getOwnPropSymbols$6(b)) {
2598
+ if (__propIsEnum$6.call(b, prop))
2599
+ __defNormalProp$6(a, prop, b[prop]);
2600
+ }
2601
+ return a;
2602
+ };
2603
+ var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
2604
+ var __objRest = (source, exclude) => {
2605
+ var target = {};
2606
+ for (var prop in source)
2607
+ if (__hasOwnProp$6.call(source, prop) && exclude.indexOf(prop) < 0)
2608
+ target[prop] = source[prop];
2609
+ if (source != null && __getOwnPropSymbols$6)
2610
+ for (var prop of __getOwnPropSymbols$6(source)) {
2611
+ if (exclude.indexOf(prop) < 0 && __propIsEnum$6.call(source, prop))
2612
+ target[prop] = source[prop];
2613
+ }
2614
+ return target;
2615
+ };
2616
+ const useStyles$4 = createStyles((theme, { checked }) => ({
2617
+ button: {
2618
+ display: "flex",
2619
+ alignItems: "center",
2620
+ width: "100%",
2621
+ transition: "background-color 150ms ease, border-color 150ms ease",
2622
+ border: `1px solid ${checked ? theme.fn.variant({ variant: "outline", color: theme.primaryColor }).border : theme.colorScheme === "dark" ? theme.colors.dark[8] : theme.colors.gray[3]}`,
2623
+ borderRadius: theme.radius.sm,
2624
+ padding: theme.spacing.md,
2625
+ paddingTop: theme.spacing.sm,
2626
+ paddingBottom: theme.spacing.sm,
2627
+ backgroundColor: checked ? theme.fn.variant({ variant: "light", color: theme.primaryColor }).background : theme.colorScheme === "dark" ? theme.colors.dark[8] : theme.white
2628
+ },
2629
+ body: {
2630
+ flex: 1,
2631
+ marginLeft: theme.spacing.md
2632
+ }
2633
+ }));
2634
+ function ImageCheckbox(_a) {
2635
+ var _b = _a, {
2636
+ checked,
2637
+ defaultChecked,
2638
+ onChange,
2639
+ title,
2640
+ description,
2641
+ className,
2642
+ icon: Icon
2643
+ } = _b, others = __objRest(_b, [
2644
+ "checked",
2645
+ "defaultChecked",
2646
+ "onChange",
2688
2647
  "title",
2689
2648
  "description",
2690
2649
  "className",
@@ -2696,10 +2655,10 @@ function ImageCheckbox(_a) {
2696
2655
  finalValue: false,
2697
2656
  onChange
2698
2657
  });
2699
- const { classes, cx } = useStyles$6({ checked: value });
2658
+ const { classes, cx } = useStyles$4({ checked: value });
2700
2659
  return /* @__PURE__ */ React.createElement(
2701
2660
  UnstyledButton,
2702
- __spreadProps$4(__spreadValues$5({}, others), {
2661
+ __spreadProps$5(__spreadValues$6({}, others), {
2703
2662
  onClick: () => handleChange(!value),
2704
2663
  className: cx(classes.button, className)
2705
2664
  }),
@@ -2720,7 +2679,7 @@ function ImageCheckbox(_a) {
2720
2679
  function SelectGrid(props) {
2721
2680
  const items = props.items.map((item) => /* @__PURE__ */ React.createElement(
2722
2681
  ImageCheckbox,
2723
- __spreadProps$4(__spreadValues$5({}, item), {
2682
+ __spreadProps$5(__spreadValues$6({}, item), {
2724
2683
  key: item.title,
2725
2684
  onChange: (checked) => props.onChange(item.title, checked)
2726
2685
  })
@@ -2738,26 +2697,26 @@ function SelectGrid(props) {
2738
2697
  );
2739
2698
  }
2740
2699
 
2741
- var __defProp$4 = Object.defineProperty;
2742
- var __defProps$3 = Object.defineProperties;
2743
- var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
2744
- var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
2745
- var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
2746
- var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
2747
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2748
- var __spreadValues$4 = (a, b) => {
2700
+ var __defProp$5 = Object.defineProperty;
2701
+ var __defProps$4 = Object.defineProperties;
2702
+ var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
2703
+ var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
2704
+ var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
2705
+ var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
2706
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2707
+ var __spreadValues$5 = (a, b) => {
2749
2708
  for (var prop in b || (b = {}))
2750
- if (__hasOwnProp$4.call(b, prop))
2751
- __defNormalProp$4(a, prop, b[prop]);
2752
- if (__getOwnPropSymbols$4)
2753
- for (var prop of __getOwnPropSymbols$4(b)) {
2754
- if (__propIsEnum$4.call(b, prop))
2755
- __defNormalProp$4(a, prop, b[prop]);
2709
+ if (__hasOwnProp$5.call(b, prop))
2710
+ __defNormalProp$5(a, prop, b[prop]);
2711
+ if (__getOwnPropSymbols$5)
2712
+ for (var prop of __getOwnPropSymbols$5(b)) {
2713
+ if (__propIsEnum$5.call(b, prop))
2714
+ __defNormalProp$5(a, prop, b[prop]);
2756
2715
  }
2757
2716
  return a;
2758
2717
  };
2759
- var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
2760
- const useStyles$5 = createStyles((theme) => ({
2718
+ var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
2719
+ const useStyles$3 = createStyles((theme) => ({
2761
2720
  wrapper: {
2762
2721
  minHeight: "100%",
2763
2722
  boxSizing: "border-box",
@@ -2820,7 +2779,7 @@ const OPTIONS = [
2820
2779
  { description: "project-based learning", title: "Project-Based Learning", icon: IconTools }
2821
2780
  ];
2822
2781
  const TrialRegistration = (props) => {
2823
- const { classes } = useStyles$5();
2782
+ const { classes } = useStyles$3();
2824
2783
  const [firstName, setFirstName] = React.useState("");
2825
2784
  const [lastName, setLastName] = React.useState("");
2826
2785
  const [organization, setOrganization] = React.useState({ organizationId: "", displayName: "" });
@@ -2866,7 +2825,7 @@ const TrialRegistration = (props) => {
2866
2825
  label: "School/Organization Name",
2867
2826
  placeholder: "What's the name of your school?",
2868
2827
  data: props.organizations.map((o) => {
2869
- return __spreadProps$3(__spreadValues$4({}, o), { value: o.displayName });
2828
+ return __spreadProps$4(__spreadValues$5({}, o), { value: o.displayName });
2870
2829
  }),
2871
2830
  onItemSubmit: (item) => setOrganization({ organizationId: item.organizationId, displayName: item.displayName }),
2872
2831
  onChange: (next) => {
@@ -2878,7 +2837,7 @@ const TrialRegistration = (props) => {
2878
2837
  SelectGrid,
2879
2838
  {
2880
2839
  items: OPTIONS,
2881
- onChange: (e, checked) => setInterests(__spreadProps$3(__spreadValues$4({}, interests), { [e]: checked }))
2840
+ onChange: (e, checked) => setInterests(__spreadProps$4(__spreadValues$5({}, interests), { [e]: checked }))
2882
2841
  }
2883
2842
  ), /* @__PURE__ */ React.createElement(Group, { position: "right", mt: "md" }, /* @__PURE__ */ React.createElement(
2884
2843
  Button,
@@ -2916,26 +2875,26 @@ const AdminProvider = (props) => {
2916
2875
  );
2917
2876
  };
2918
2877
 
2919
- var __defProp$3 = Object.defineProperty;
2920
- var __defProps$2 = Object.defineProperties;
2921
- var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
2922
- var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
2923
- var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
2924
- var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
2925
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2926
- var __spreadValues$3 = (a, b) => {
2878
+ var __defProp$4 = Object.defineProperty;
2879
+ var __defProps$3 = Object.defineProperties;
2880
+ var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
2881
+ var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
2882
+ var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
2883
+ var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
2884
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2885
+ var __spreadValues$4 = (a, b) => {
2927
2886
  for (var prop in b || (b = {}))
2928
- if (__hasOwnProp$3.call(b, prop))
2929
- __defNormalProp$3(a, prop, b[prop]);
2930
- if (__getOwnPropSymbols$3)
2931
- for (var prop of __getOwnPropSymbols$3(b)) {
2932
- if (__propIsEnum$3.call(b, prop))
2933
- __defNormalProp$3(a, prop, b[prop]);
2887
+ if (__hasOwnProp$4.call(b, prop))
2888
+ __defNormalProp$4(a, prop, b[prop]);
2889
+ if (__getOwnPropSymbols$4)
2890
+ for (var prop of __getOwnPropSymbols$4(b)) {
2891
+ if (__propIsEnum$4.call(b, prop))
2892
+ __defNormalProp$4(a, prop, b[prop]);
2934
2893
  }
2935
2894
  return a;
2936
2895
  };
2937
- var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
2938
- const useStyles$4 = createStyles((theme, props) => ({
2896
+ var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
2897
+ const useStyles$2 = createStyles((theme, props) => ({
2939
2898
  footer: {
2940
2899
  paddingTop: theme.spacing.md,
2941
2900
  paddingBottom: theme.spacing.md,
@@ -3022,7 +2981,7 @@ const useStyles$4 = createStyles((theme, props) => ({
3022
2981
  }
3023
2982
  }));
3024
2983
  const App = (props) => {
3025
- const { classes } = useStyles$4(props);
2984
+ const { classes } = useStyles$2(props);
3026
2985
  const account = useAccount(props.account, props.accounts, props.onAccountChange);
3027
2986
  return /* @__PURE__ */ React.createElement(
3028
2987
  AppShell,
@@ -3030,7 +2989,7 @@ const App = (props) => {
3030
2989
  padding: "xs",
3031
2990
  navbar: props.navbar && /* @__PURE__ */ React.createElement(
3032
2991
  Navbar,
3033
- __spreadProps$2(__spreadValues$3({}, props.navbar.props), {
2992
+ __spreadProps$3(__spreadValues$4({}, props.navbar.props), {
3034
2993
  onSwitchAccounts: account.accounts && account.accounts.length > 1 ? () => account.setChangeModalOpen(true) : void 0
3035
2994
  })
3036
2995
  ),
@@ -3140,7 +3099,7 @@ const Pathways = (props) => {
3140
3099
  return /* @__PURE__ */ React.createElement("div", { className: "mx-auto flex max-w-4xl flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Pathways"), /* @__PURE__ */ React.createElement("p", { className: "text-sm text-slate-500" }, "Explore all your unique pathway requirements in one clear space")), /* @__PURE__ */ React.createElement(Table$3, { loading: props.loading, items: props.pathways }));
3141
3100
  };
3142
3101
 
3143
- const useStyles$3 = createStyles((theme) => ({
3102
+ const useStyles$1 = createStyles((theme) => ({
3144
3103
  button: {
3145
3104
  borderTopRightRadius: 0,
3146
3105
  borderBottomRightRadius: 0,
@@ -3155,7 +3114,7 @@ const useStyles$3 = createStyles((theme) => ({
3155
3114
  }
3156
3115
  }));
3157
3116
  const SplitButton$1 = (props) => {
3158
- const { classes, theme } = useStyles$3();
3117
+ const { classes, theme } = useStyles$1();
3159
3118
  theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
3160
3119
  return /* @__PURE__ */ React.createElement(Stack$5, { spacing: "sm" }, /* @__PURE__ */ React.createElement(
3161
3120
  Button,
@@ -3191,25 +3150,25 @@ function Stack$1(props) {
3191
3150
  return /* @__PURE__ */ React.createElement(Grid, { grow: true, gutter: "lg", sx: { padding: 20, minWidth: 700 } }, rows);
3192
3151
  }
3193
3152
 
3194
- var __defProp$2 = Object.defineProperty;
3195
- var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
3196
- var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
3197
- var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
3198
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3199
- var __spreadValues$2 = (a, b) => {
3153
+ var __defProp$3 = Object.defineProperty;
3154
+ var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
3155
+ var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
3156
+ var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
3157
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3158
+ var __spreadValues$3 = (a, b) => {
3200
3159
  for (var prop in b || (b = {}))
3201
- if (__hasOwnProp$2.call(b, prop))
3202
- __defNormalProp$2(a, prop, b[prop]);
3203
- if (__getOwnPropSymbols$2)
3204
- for (var prop of __getOwnPropSymbols$2(b)) {
3205
- if (__propIsEnum$2.call(b, prop))
3206
- __defNormalProp$2(a, prop, b[prop]);
3160
+ if (__hasOwnProp$3.call(b, prop))
3161
+ __defNormalProp$3(a, prop, b[prop]);
3162
+ if (__getOwnPropSymbols$3)
3163
+ for (var prop of __getOwnPropSymbols$3(b)) {
3164
+ if (__propIsEnum$3.call(b, prop))
3165
+ __defNormalProp$3(a, prop, b[prop]);
3207
3166
  }
3208
3167
  return a;
3209
3168
  };
3210
3169
  function Table$2(props) {
3211
3170
  const preparedItems = React.useMemo(() => {
3212
- return (props.items || []).map((item) => __spreadValues$2(__spreadValues$2({}, item), item.categoryPoints));
3171
+ return (props.items || []).map((item) => __spreadValues$3(__spreadValues$3({}, item), item.categoryPoints));
3213
3172
  }, [props.items]);
3214
3173
  const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
3215
3174
  if (props.loading && props.items.length === 0) {
@@ -3341,7 +3300,7 @@ function Table$1(props) {
3341
3300
  ));
3342
3301
  }
3343
3302
 
3344
- const useStyles$2 = createStyles((theme) => ({
3303
+ const useStyles = createStyles((theme) => ({
3345
3304
  title: {
3346
3305
  fontSize: 34,
3347
3306
  fontWeight: 900,
@@ -3354,7 +3313,7 @@ const useStyles$2 = createStyles((theme) => ({
3354
3313
  }
3355
3314
  }));
3356
3315
  const Pathway = (props) => {
3357
- const { classes } = useStyles$2();
3316
+ const { classes } = useStyles();
3358
3317
  const [tab, setTab] = useState("badges");
3359
3318
  const numberOfStudents = props.students.length;
3360
3319
  numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length / numberOfStudents : 0;
@@ -3421,82 +3380,84 @@ const Pathway = (props) => {
3421
3380
  )))))));
3422
3381
  };
3423
3382
 
3424
- const useStyles$1 = createStyles((theme) => ({
3425
- button: {
3426
- borderTopRightRadius: 0,
3427
- borderBottomRightRadius: 0,
3428
- marginLeft: 0,
3429
- marginRight: 0
3430
- },
3431
- menuControl: {
3432
- borderTopLeftRadius: 0,
3433
- borderBottomLeftRadius: 0,
3434
- border: 0,
3435
- borderLeft: `1px solid ${theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.white}`
3436
- }
3437
- }));
3438
3383
  const SplitButton = (props) => {
3439
- const { classes, theme } = useStyles$1();
3440
- theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
3441
- return /* @__PURE__ */ React.createElement(Stack$5, { spacing: "sm" }, /* @__PURE__ */ React.createElement(
3442
- Button,
3384
+ return /* @__PURE__ */ React.createElement(
3385
+ "button",
3443
3386
  {
3444
- leftIcon: /* @__PURE__ */ React.createElement(IconTableExport, { size: 14 }),
3445
- onClick: props.onExportDataClick
3387
+ onClick: props.onExportDataClick,
3388
+ 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"
3446
3389
  },
3390
+ /* @__PURE__ */ React.createElement(IconTableExport, { size: 14, stroke: 2 }),
3447
3391
  "Export data (.csv)"
3448
- ));
3392
+ );
3449
3393
  };
3450
3394
 
3451
3395
  function Stack(props) {
3452
- const { items, hideBadge, hideLesson } = props;
3396
+ const { items, hideBadge, hideLesson, hidePathway } = props;
3453
3397
  if (!items.length)
3454
3398
  return null;
3455
- const visibleColumns = [
3456
- true,
3457
- !hideBadge,
3458
- !hideLesson,
3459
- true
3460
- ].filter(Boolean).length;
3461
- const span = 12 / visibleColumns;
3462
- return /* @__PURE__ */ React.createElement(Grid, { gutter: "md", sx: { padding: 20, minWidth: 700 } }, /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(Text, { weight: "bold" }, "Link")), !hideBadge && /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(Text, { weight: "bold" }, "Badge")), !hideLesson && /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(Text, { weight: "bold" }, "Lesson")), /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(Text, { weight: "bold" }, "Question")), items.map((row, i) => /* @__PURE__ */ React.createElement(React.Fragment, { key: i }, /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(
3463
- Button,
3464
- {
3465
- component: "a",
3466
- href: row.link,
3467
- target: "_blank",
3468
- rel: "noopener noreferrer",
3469
- size: "xs",
3470
- variant: "light"
3471
- },
3472
- "View File"
3473
- )), !hideBadge && /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(Text, null, row.badgeName)), !hideLesson && /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(Text, null, row.lessonName)), /* @__PURE__ */ React.createElement(Grid.Col, { span }, /* @__PURE__ */ React.createElement(Text, null, row.question)))));
3399
+ const columns = [
3400
+ "minmax(0,2fr)",
3401
+ !hidePathway && "minmax(0,1.3fr)",
3402
+ !hideLesson && "minmax(0,1.3fr)",
3403
+ !hideBadge && "minmax(0,1.3fr)",
3404
+ "auto"
3405
+ ].filter(Boolean).join(" ");
3406
+ const headerCell = "border-b border-slate-100 pb-2 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400";
3407
+ const dataCell = "py-3";
3408
+ return /* @__PURE__ */ React.createElement("div", { className: "grid items-center gap-x-3", style: { gridTemplateColumns: columns } }, /* @__PURE__ */ React.createElement("div", { className: headerCell }, "Question"), !hidePathway && /* @__PURE__ */ React.createElement("div", { className: headerCell }, "Pathway"), !hideLesson && /* @__PURE__ */ React.createElement("div", { className: headerCell }, "Lesson"), !hideBadge && /* @__PURE__ */ React.createElement("div", { className: headerCell }, "Badge"), /* @__PURE__ */ React.createElement("div", { className: headerCell }), items.map((row, i) => {
3409
+ const rowBorder = i > 0 ? "border-t border-slate-100" : "";
3410
+ return /* @__PURE__ */ React.createElement(React.Fragment, { key: i }, /* @__PURE__ */ React.createElement("div", { className: `${dataCell} ${rowBorder} text-xs font-semibold text-dark-blue-400` }, row.question), !hidePathway && /* @__PURE__ */ React.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.pathwayName || "\u2014"), !hideLesson && /* @__PURE__ */ React.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.lessonName), !hideBadge && /* @__PURE__ */ React.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.badgeName), /* @__PURE__ */ React.createElement("div", { className: `${dataCell} ${rowBorder} flex shrink-0 gap-2` }, /* @__PURE__ */ React.createElement(
3411
+ "a",
3412
+ {
3413
+ href: row.link,
3414
+ target: "_blank",
3415
+ rel: "noopener noreferrer",
3416
+ 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"
3417
+ },
3418
+ /* @__PURE__ */ React.createElement(IconExternalLink, { size: 12, stroke: 2 }),
3419
+ "Preview"
3420
+ ), /* @__PURE__ */ React.createElement(
3421
+ "a",
3422
+ {
3423
+ href: row.link,
3424
+ download: true,
3425
+ target: "_blank",
3426
+ rel: "noopener noreferrer",
3427
+ 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"
3428
+ },
3429
+ /* @__PURE__ */ React.createElement(IconDownload, { size: 12, stroke: 2 }),
3430
+ "Download"
3431
+ )));
3432
+ }));
3474
3433
  }
3475
3434
 
3476
- var __defProp$1 = Object.defineProperty;
3477
- var __defProps$1 = Object.defineProperties;
3478
- var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
3479
- var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
3480
- var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
3481
- var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
3482
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3483
- var __spreadValues$1 = (a, b) => {
3435
+ var __defProp$2 = Object.defineProperty;
3436
+ var __defProps$2 = Object.defineProperties;
3437
+ var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
3438
+ var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
3439
+ var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
3440
+ var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
3441
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3442
+ var __spreadValues$2 = (a, b) => {
3484
3443
  for (var prop in b || (b = {}))
3485
- if (__hasOwnProp$1.call(b, prop))
3486
- __defNormalProp$1(a, prop, b[prop]);
3487
- if (__getOwnPropSymbols$1)
3488
- for (var prop of __getOwnPropSymbols$1(b)) {
3489
- if (__propIsEnum$1.call(b, prop))
3490
- __defNormalProp$1(a, prop, b[prop]);
3444
+ if (__hasOwnProp$2.call(b, prop))
3445
+ __defNormalProp$2(a, prop, b[prop]);
3446
+ if (__getOwnPropSymbols$2)
3447
+ for (var prop of __getOwnPropSymbols$2(b)) {
3448
+ if (__propIsEnum$2.call(b, prop))
3449
+ __defNormalProp$2(a, prop, b[prop]);
3491
3450
  }
3492
3451
  return a;
3493
3452
  };
3494
- var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
3453
+ var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
3454
+ const initials$1 = (name) => name.split(" ").map((w) => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
3495
3455
  function Table(props) {
3456
+ const [expanded, setExpanded] = React.useState({});
3496
3457
  const preparedItems = React.useMemo(() => {
3497
3458
  return props.items.map((item) => {
3498
3459
  var _a;
3499
- return __spreadProps$1(__spreadValues$1({}, item), {
3460
+ return __spreadProps$2(__spreadValues$2({}, item), {
3500
3461
  submissionCount: ((_a = item.submissions) == null ? void 0 : _a.length) || 0
3501
3462
  });
3502
3463
  });
@@ -3513,76 +3474,82 @@ function Table(props) {
3513
3474
  }
3514
3475
  );
3515
3476
  }
3516
- const sortStatus = {
3517
- columnAccessor: sortConfig.key,
3518
- direction: sortConfig.direction === "desc" ? "desc" : "asc"
3519
- };
3520
- return /* @__PURE__ */ React.createElement(ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React.createElement(
3521
- DataTable,
3477
+ const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
3478
+ return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React.createElement("button", { onClick: () => requestSort("name"), className: "flex-1 text-left hover:text-slate-600" }, "Student Name", indicator("name")), /* @__PURE__ */ React.createElement("button", { onClick: () => requestSort("submissionCount"), className: "w-16 shrink-0 text-left hover:text-slate-600" }, "Files", indicator("submissionCount")), props.onReview && /* @__PURE__ */ React.createElement("div", { className: "w-36 shrink-0" }), /* @__PURE__ */ React.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
3479
+ const isOpen = !!expanded[row.userId];
3480
+ return /* @__PURE__ */ React.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React.createElement(
3481
+ "div",
3482
+ {
3483
+ onClick: () => setExpanded(__spreadProps$2(__spreadValues$2({}, expanded), { [row.userId]: !isOpen })),
3484
+ className: "flex cursor-pointer items-center gap-4 p-4"
3485
+ },
3486
+ /* @__PURE__ */ React.createElement("div", { className: "flex min-w-0 flex-1 items-center gap-3" }, row.avatar ? /* @__PURE__ */ React.createElement("img", { src: row.avatar, className: "h-9 w-9 shrink-0 rounded-full object-cover", alt: "" }) : /* @__PURE__ */ React.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.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React.createElement("div", { className: "truncate text-sm font-bold text-dark-blue-400" }, row.name), /* @__PURE__ */ React.createElement("div", { className: "truncate text-xs text-slate-400" }, row.email))),
3487
+ /* @__PURE__ */ React.createElement("div", { className: "w-16 shrink-0 text-sm font-bold text-dark-blue-400" }, row.submissions.length),
3488
+ props.onReview && /* @__PURE__ */ React.createElement("div", { className: "w-36 shrink-0" }, /* @__PURE__ */ React.createElement(
3489
+ "button",
3490
+ {
3491
+ onClick: (e) => {
3492
+ e.stopPropagation();
3493
+ props.onReview(row);
3494
+ },
3495
+ 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"
3496
+ },
3497
+ "Review Submission"
3498
+ )),
3499
+ /* @__PURE__ */ React.createElement(IconChevronRight, { size: 16, stroke: 2, className: `w-4 shrink-0 text-slate-300 transition-transform ${isOpen ? "rotate-90" : ""}` })
3500
+ ), isOpen && /* @__PURE__ */ React.createElement("div", { className: "border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React.createElement(Stack, { items: row.submissions, hideBadge: props.hideBadge, hideLesson: props.hideLesson, hidePathway: props.hidePathway })));
3501
+ }));
3502
+ }
3503
+
3504
+ const initials = (name) => name.split(" ").map((w) => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
3505
+ function SubmissionDetail(props) {
3506
+ const { student } = props;
3507
+ return /* @__PURE__ */ React.createElement("div", { className: "mx-auto flex w-full max-w-4xl flex-col gap-4 px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-2 text-xs text-slate-400" }, /* @__PURE__ */ React.createElement("button", { onClick: props.onBack, className: "font-bold text-sky-blue-400 hover:underline" }, "File Locker"), /* @__PURE__ */ React.createElement("span", null, "/"), /* @__PURE__ */ React.createElement("span", { className: "font-bold text-dark-blue-400" }, student.name)), /* @__PURE__ */ React.createElement("div", { className: "flex items-center gap-4 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm" }, student.avatar ? /* @__PURE__ */ React.createElement("img", { src: student.avatar, className: "h-12 w-12 shrink-0 rounded-full object-cover", alt: "" }) : /* @__PURE__ */ React.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.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React.createElement("div", { className: "text-lg font-extrabold text-dark-blue-400" }, student.name), /* @__PURE__ */ React.createElement("div", { className: "mt-0.5 text-xs text-slate-400" }, student.email, props.context ? ` \xB7 ${props.context}` : "")), /* @__PURE__ */ React.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.createElement("div", { className: "rounded-2xl border border-slate-200 bg-white p-5 shadow-sm" }, /* @__PURE__ */ React.createElement("div", { className: "text-sm font-extrabold text-dark-blue-400" }, "Files"), /* @__PURE__ */ React.createElement("div", { className: "mt-2" }, /* @__PURE__ */ React.createElement(Stack, { items: student.submissions }))), /* @__PURE__ */ React.createElement("div", { className: "flex gap-3" }, /* @__PURE__ */ React.createElement(
3508
+ "button",
3522
3509
  {
3523
- verticalSpacing: "sm",
3524
- sx: { minWidth: 700 },
3525
- withBorder: false,
3526
- borderRadius: "sm",
3527
- withColumnBorders: true,
3528
- striped: true,
3529
- highlightOnHover: true,
3530
- records: sortedItems,
3531
- sortStatus,
3532
- onSortStatusChange: (status) => requestSort(status.columnAccessor),
3533
- idAccessor: "userId",
3534
- columns: [{
3535
- accessor: "name",
3536
- title: "Student Name",
3537
- sortable: true,
3538
- render: (row) => /* @__PURE__ */ React.createElement(Group, { spacing: "sm" }, /* @__PURE__ */ React.createElement(Avatar, { size: 40, src: row.avatar, radius: 40 }), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Text, { size: "sm", weight: 500 }, row.name), /* @__PURE__ */ React.createElement(Text, { size: "xs", color: "dimmed" }, row.email)))
3539
- }, {
3540
- accessor: "submissionCount",
3541
- title: "Files",
3542
- sortable: true,
3543
- render: (row) => row.submissions.length
3544
- }],
3545
- rowExpansion: {
3546
- content: ({ record }) => /* @__PURE__ */ React.createElement(
3547
- Stack,
3548
- {
3549
- items: record.submissions,
3550
- hideBadge: props.hideBadge,
3551
- hideLesson: props.hideLesson
3552
- }
3553
- )
3554
- }
3555
- }
3556
- ));
3510
+ onClick: () => props.onNav(-1),
3511
+ 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"
3512
+ },
3513
+ /* @__PURE__ */ React.createElement(IconChevronLeft, { size: 14, stroke: 2 }),
3514
+ "Previous Submission"
3515
+ ), /* @__PURE__ */ React.createElement(
3516
+ "button",
3517
+ {
3518
+ onClick: () => props.onNav(1),
3519
+ 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"
3520
+ },
3521
+ "Next Submission",
3522
+ /* @__PURE__ */ React.createElement(IconChevronRight, { size: 14, stroke: 2 })
3523
+ )));
3557
3524
  }
3558
3525
 
3559
- var __defProp = Object.defineProperty;
3560
- var __defProps = Object.defineProperties;
3561
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
3562
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3563
- var __hasOwnProp = Object.prototype.hasOwnProperty;
3564
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
3565
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3566
- var __spreadValues = (a, b) => {
3526
+ var __defProp$1 = Object.defineProperty;
3527
+ var __defProps$1 = Object.defineProperties;
3528
+ var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
3529
+ var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
3530
+ var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
3531
+ var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
3532
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3533
+ var __spreadValues$1 = (a, b) => {
3567
3534
  for (var prop in b || (b = {}))
3568
- if (__hasOwnProp.call(b, prop))
3569
- __defNormalProp(a, prop, b[prop]);
3570
- if (__getOwnPropSymbols)
3571
- for (var prop of __getOwnPropSymbols(b)) {
3572
- if (__propIsEnum.call(b, prop))
3573
- __defNormalProp(a, prop, b[prop]);
3535
+ if (__hasOwnProp$1.call(b, prop))
3536
+ __defNormalProp$1(a, prop, b[prop]);
3537
+ if (__getOwnPropSymbols$1)
3538
+ for (var prop of __getOwnPropSymbols$1(b)) {
3539
+ if (__propIsEnum$1.call(b, prop))
3540
+ __defNormalProp$1(a, prop, b[prop]);
3574
3541
  }
3575
3542
  return a;
3576
3543
  };
3577
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
3544
+ var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
3578
3545
  const useFilteredStudents = (students) => {
3579
3546
  return React.useMemo(() => {
3580
- const byBadge = (badgeId) => students.map((s) => __spreadProps(__spreadValues({}, s), {
3547
+ const byBadge = (badgeId) => students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
3581
3548
  submissions: (s.submissions || []).filter(
3582
3549
  (sub) => sub.badgeId === badgeId
3583
3550
  )
3584
3551
  })).filter((s) => s.submissions.length);
3585
- const byLesson = (lessonName) => students.map((s) => __spreadProps(__spreadValues({}, s), {
3552
+ const byLesson = (lessonName) => students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
3586
3553
  submissions: (s.submissions || []).filter(
3587
3554
  (sub) => sub.lessonName === lessonName
3588
3555
  )
@@ -3593,7 +3560,7 @@ const useFilteredStudents = (students) => {
3593
3560
  (c) => c.startsWith(pathwayId)
3594
3561
  )
3595
3562
  ).map((b) => b.badgeId);
3596
- return students.map((s) => __spreadProps(__spreadValues({}, s), {
3563
+ return students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
3597
3564
  submissions: (s.submissions || []).filter(
3598
3565
  (sub) => validBadgeIds.includes(sub.badgeId)
3599
3566
  )
@@ -3603,168 +3570,167 @@ const useFilteredStudents = (students) => {
3603
3570
  }, [students]);
3604
3571
  };
3605
3572
 
3606
- const useStyles = createStyles((theme) => ({
3607
- title: {
3608
- fontSize: 34,
3609
- fontWeight: 900,
3610
- [theme.fn.smallerThan("sm")]: {
3611
- fontSize: 24
3573
+ var __defProp = Object.defineProperty;
3574
+ var __defProps = Object.defineProperties;
3575
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
3576
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3577
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
3578
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
3579
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3580
+ var __spreadValues = (a, b) => {
3581
+ for (var prop in b || (b = {}))
3582
+ if (__hasOwnProp.call(b, prop))
3583
+ __defNormalProp(a, prop, b[prop]);
3584
+ if (__getOwnPropSymbols)
3585
+ for (var prop of __getOwnPropSymbols(b)) {
3586
+ if (__propIsEnum.call(b, prop))
3587
+ __defNormalProp(a, prop, b[prop]);
3612
3588
  }
3613
- },
3614
- description: {
3615
- maxWidth: 600
3616
- }
3617
- }));
3618
- const BadgeTable = ({ badges, students, loading }) => {
3619
- const { byBadge } = useFilteredStudents(students);
3620
- const countFiles = (students2) => students2.reduce((acc, s) => {
3621
- var _a;
3622
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3623
- }, 0);
3624
- return /* @__PURE__ */ React.createElement(Accordion, null, badges.map((b) => {
3625
- const studentsForBadge = byBadge(b.badgeId);
3626
- const fileCount = countFiles(studentsForBadge);
3627
- return /* @__PURE__ */ React.createElement(Accordion.Item, { key: b.badgeId, value: b.badgeId }, /* @__PURE__ */ React.createElement(Accordion.Control, null, /* @__PURE__ */ React.createElement(Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React.createElement(Text, null, b.displayName), /* @__PURE__ */ React.createElement(Badge$1, { size: "sm" }, fileCount))), /* @__PURE__ */ React.createElement(Accordion.Panel, null, /* @__PURE__ */ React.createElement(
3628
- Table,
3629
- {
3630
- loading,
3631
- items: studentsForBadge,
3632
- hideBadge: true
3633
- }
3634
- )));
3589
+ return a;
3590
+ };
3591
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
3592
+ const TABS = [
3593
+ { value: "students", label: "By student" },
3594
+ { value: "pathways", label: "By pathway" },
3595
+ { value: "badges", label: "By badge" },
3596
+ { value: "lessons", label: "By lesson" }
3597
+ ];
3598
+ const countFiles = (students) => students.reduce((acc, s) => {
3599
+ var _a;
3600
+ return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3601
+ }, 0);
3602
+ const GroupCard = (props) => {
3603
+ const [open, setOpen] = React.useState(false);
3604
+ return /* @__PURE__ */ React.createElement("div", { className: "overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React.createElement("div", { onClick: () => setOpen(!open), className: "flex cursor-pointer items-center gap-3.5 p-4" }, /* @__PURE__ */ React.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React.createElement("div", { className: "text-sm font-extrabold text-dark-blue-400" }, props.title), props.description && /* @__PURE__ */ React.createElement("div", { className: "mt-1 text-xs leading-relaxed text-slate-500" }, props.description)), /* @__PURE__ */ React.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.createElement(IconChevronDown, { size: 15, stroke: 2.3, className: `shrink-0 text-slate-400 transition-transform ${open ? "rotate-180" : ""}` })), open && /* @__PURE__ */ React.createElement("div", { className: "border-t border-slate-100 p-4" }, props.children));
3605
+ };
3606
+ const PathwayGroups = (props) => {
3607
+ const { byPathway } = useFilteredStudents(props.students);
3608
+ return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3" }, props.pathways.map((p) => {
3609
+ const filtered = byPathway(p.pathwayId, props.badges);
3610
+ return /* @__PURE__ */ React.createElement(GroupCard, { key: p.pathwayId, title: p.title, description: p.description, count: countFiles(filtered) }, /* @__PURE__ */ React.createElement(Table, { loading: props.loading, items: filtered, hidePathway: true, onReview: (item) => props.onReview(item, filtered, p.title) }));
3635
3611
  }));
3636
3612
  };
3637
- const LessonTableWrapper = ({ lessons, students, loading }) => {
3638
- const { byLesson } = useFilteredStudents(students);
3639
- const countFiles = (students2) => students2.reduce((acc, s) => {
3640
- var _a;
3641
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3642
- }, 0);
3643
- return /* @__PURE__ */ React.createElement(Accordion, null, lessons.map((l) => {
3644
- const studentsForLesson = byLesson(l.lessonName);
3645
- const fileCount = countFiles(studentsForLesson);
3646
- return /* @__PURE__ */ React.createElement(Accordion.Item, { key: l.lessonId, value: l.lessonId }, /* @__PURE__ */ React.createElement(Accordion.Control, null, /* @__PURE__ */ React.createElement(Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React.createElement(Text, null, l.lessonName), /* @__PURE__ */ React.createElement(Badge$1, { size: "sm" }, fileCount))), /* @__PURE__ */ React.createElement(Accordion.Panel, null, /* @__PURE__ */ React.createElement(
3647
- Table,
3648
- {
3649
- loading,
3650
- items: studentsForLesson,
3651
- hideLesson: true
3652
- }
3653
- )));
3613
+ const BadgeGroups = (props) => {
3614
+ const { byBadge } = useFilteredStudents(props.students);
3615
+ return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3" }, props.badges.map((b) => {
3616
+ const filtered = byBadge(b.badgeId);
3617
+ const pathwayTitle = props.pathwayNameForBadge[b.badgeId];
3618
+ return /* @__PURE__ */ React.createElement(GroupCard, { key: b.badgeId, title: b.displayName, description: pathwayTitle ? `${pathwayTitle} pathway` : void 0, count: countFiles(filtered) }, /* @__PURE__ */ React.createElement(Table, { loading: props.loading, items: filtered, hideBadge: true, hidePathway: true, onReview: (item) => props.onReview(item, filtered, b.displayName) }));
3654
3619
  }));
3655
3620
  };
3656
- const PathwayTable = ({
3657
- pathways,
3658
- badges,
3659
- students,
3660
- loading
3661
- }) => {
3662
- const { byPathway } = useFilteredStudents(students);
3663
- const countFiles = (students2) => students2.reduce((acc, s) => {
3664
- var _a;
3665
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3666
- }, 0);
3667
- return /* @__PURE__ */ React.createElement(Accordion, null, pathways.map((p) => {
3668
- const studentsForPathway = byPathway(p.pathwayId, badges);
3669
- const fileCount = countFiles(studentsForPathway);
3670
- return /* @__PURE__ */ React.createElement(Accordion.Item, { key: p.pathwayId, value: p.pathwayId }, /* @__PURE__ */ React.createElement(Accordion.Control, null, /* @__PURE__ */ React.createElement(Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("strong", null, p.title), /* @__PURE__ */ React.createElement("div", null, p.description)), /* @__PURE__ */ React.createElement(Badge$1, { size: "sm" }, fileCount))), /* @__PURE__ */ React.createElement(Accordion.Panel, null, /* @__PURE__ */ React.createElement(
3671
- Table,
3672
- {
3673
- loading,
3674
- items: studentsForPathway
3675
- }
3676
- )));
3621
+ const LessonGroups = (props) => {
3622
+ const { byLesson } = useFilteredStudents(props.students);
3623
+ return /* @__PURE__ */ React.createElement("div", { className: "flex flex-col gap-3" }, props.lessons.map((l) => {
3624
+ const filtered = byLesson(l.lessonName);
3625
+ const badge = props.badgeForLesson[l.lessonId];
3626
+ const pathwayTitle = badge ? props.pathwayNameForBadge[badge.badgeId] : void 0;
3627
+ const description = badge ? pathwayTitle ? `${badge.displayName} \xB7 ${pathwayTitle} pathway` : badge.displayName : void 0;
3628
+ return /* @__PURE__ */ React.createElement(GroupCard, { key: l.lessonId, title: l.lessonName, description, count: countFiles(filtered) }, /* @__PURE__ */ React.createElement(Table, { loading: props.loading, items: filtered, hideBadge: true, hideLesson: true, hidePathway: true, onReview: (item) => props.onReview(item, filtered, l.lessonName) }));
3677
3629
  }));
3678
3630
  };
3679
3631
  const FileLocker = (props) => {
3680
- const { classes } = useStyles();
3681
- const [tab, setTab] = useState("students");
3682
- props.students.length;
3683
- const numberOfFiles = props.students.reduce(
3684
- (acc, s) => {
3685
- var _a;
3686
- return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
3687
- },
3688
- 0
3689
- );
3690
- return /* @__PURE__ */ React.createElement(Container, { size: "lg", py: "xl" }, /* @__PURE__ */ React.createElement(Stack$5, { spacing: "md" }, /* @__PURE__ */ React.createElement(Grid, null, /* @__PURE__ */ React.createElement(Grid.Col, { sm: "auto" }, /* @__PURE__ */ React.createElement(UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React.createElement(
3691
- Badge$1,
3692
- {
3693
- variant: "filled",
3694
- leftSection: /* @__PURE__ */ React.createElement(ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React.createElement(IconArrowLeft, { size: 14 })),
3695
- size: "lg"
3696
- },
3697
- "Back"
3698
- )), /* @__PURE__ */ React.createElement(Group, null, /* @__PURE__ */ React.createElement(Stack$5, { spacing: 0 }, /* @__PURE__ */ React.createElement(Title, { order: 2, className: classes.title, mt: "md" }, props.displayName || "File"), /* @__PURE__ */ React.createElement(Text, { color: "dimmed", className: classes.description, mt: "sm" }, props.description || "No description")), !props.trial && /* @__PURE__ */ React.createElement(Stack$5, { ml: "auto" }, /* @__PURE__ */ React.createElement(
3699
- SplitButton,
3700
- {
3701
- href: props.href,
3702
- onCopyLinkClick: props.onCopyLinkClick,
3703
- onExportDataClick: props.onExportDataClick
3704
- }
3705
- ))))), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React.createElement(LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React.createElement(Stack$5, null, /* @__PURE__ */ React.createElement(StatsGroup, { data: [
3706
- {
3707
- title: props.trial ? "LESSONS SUBMITTED" : "FILES",
3708
- value: props.trial ? props.lessonsCompleted || 0 : numberOfFiles,
3709
- unit: props.trial ? "" : ""
3710
- }
3711
- ] }), !props.trial && /* @__PURE__ */ React.createElement(
3712
- Select,
3632
+ const [tab, setTab] = React.useState("students");
3633
+ const [reviewing, setReviewing] = React.useState(null);
3634
+ const numberOfFiles = countFiles(props.students);
3635
+ const { thisWeek, thisMonth } = React.useMemo(() => {
3636
+ const now = new Date();
3637
+ const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1e3);
3638
+ const fom = new Date(now.getFullYear(), now.getMonth(), 1);
3639
+ let week = 0, month = 0;
3640
+ props.students.forEach((s) => {
3641
+ (s.submissions || []).forEach((sub) => {
3642
+ if (!sub.updatedAt)
3643
+ return;
3644
+ const d = new Date(sub.updatedAt);
3645
+ if (d >= weekAgo)
3646
+ week += 1;
3647
+ if (d >= fom)
3648
+ month += 1;
3649
+ });
3650
+ });
3651
+ return { thisWeek: week, thisMonth: month };
3652
+ }, [props.students]);
3653
+ const pathwayNameForBadge = React.useMemo(() => {
3654
+ const map = {};
3655
+ (props.badges || []).forEach((b) => {
3656
+ if (!Array.isArray(b.categories))
3657
+ return;
3658
+ const pathway = (props.pathways || []).find((p) => b.categories.some((c) => c.startsWith(p.pathwayId)));
3659
+ if (pathway)
3660
+ map[b.badgeId] = pathway.title;
3661
+ });
3662
+ return map;
3663
+ }, [props.badges, props.pathways]);
3664
+ const badgeForLesson = React.useMemo(() => {
3665
+ const map = {};
3666
+ (props.badges || []).forEach((b) => {
3667
+ if (!Array.isArray(b.lessonIds))
3668
+ return;
3669
+ b.lessonIds.forEach((lessonId) => {
3670
+ if (!(lessonId in map))
3671
+ map[lessonId] = { displayName: b.displayName, badgeId: b.badgeId };
3672
+ });
3673
+ });
3674
+ return map;
3675
+ }, [props.badges]);
3676
+ const enrichedStudents = React.useMemo(() => {
3677
+ return props.students.map((s) => __spreadProps(__spreadValues({}, s), {
3678
+ submissions: (s.submissions || []).map((sub) => __spreadProps(__spreadValues({}, sub), { pathwayName: pathwayNameForBadge[sub.badgeId] || "" }))
3679
+ }));
3680
+ }, [props.students, pathwayNameForBadge]);
3681
+ const { byPathway } = useFilteredStudents(enrichedStudents);
3682
+ const mostActivePathway = React.useMemo(() => {
3683
+ return (props.pathways || []).reduce((best, p) => {
3684
+ const count = countFiles(byPathway(p.pathwayId, props.badges || []));
3685
+ return count > 0 && (!best || count > best.count) ? { title: p.title, count } : best;
3686
+ }, null);
3687
+ }, [props.pathways, props.badges, byPathway]);
3688
+ const onReview = (item, list, context) => setReviewing({ student: item, list, context });
3689
+ const onNav = (dir) => {
3690
+ if (!reviewing)
3691
+ return;
3692
+ const idx = reviewing.list.findIndex((s) => s.userId === reviewing.student.userId);
3693
+ if (idx === -1)
3694
+ return;
3695
+ const next = reviewing.list[(idx + dir + reviewing.list.length) % reviewing.list.length];
3696
+ setReviewing(__spreadProps(__spreadValues({}, reviewing), { student: next }));
3697
+ };
3698
+ if (reviewing) {
3699
+ return /* @__PURE__ */ React.createElement(
3700
+ SubmissionDetail,
3701
+ {
3702
+ student: reviewing.student,
3703
+ context: reviewing.context,
3704
+ onBack: () => setReviewing(null),
3705
+ onNav
3706
+ }
3707
+ );
3708
+ }
3709
+ return /* @__PURE__ */ React.createElement("div", { className: "mx-auto flex w-full max-w-4xl flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("button", { onClick: props.onBackClick, className: "flex items-center gap-1 text-xs font-bold text-sky-blue-400 hover:underline" }, /* @__PURE__ */ React.createElement(IconChevronLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React.createElement("h1", { className: "mt-1.5 text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "File Locker"), /* @__PURE__ */ React.createElement("p", { className: "mt-1 text-sm text-slate-500" }, props.description || "No description")), !props.trial && /* @__PURE__ */ React.createElement(SplitButton, { href: props.href, onCopyLinkClick: props.onCopyLinkClick, onExportDataClick: props.onExportDataClick })), /* @__PURE__ */ React.createElement(StatsGroup, { data: props.trial ? [
3710
+ { title: "LESSONS SUBMITTED", value: props.lessonsCompleted || 0 }
3711
+ ] : [
3712
+ { title: "FILES", value: numberOfFiles },
3713
+ { title: "THIS WEEK", value: thisWeek },
3714
+ { title: "THIS MONTH", value: thisMonth }
3715
+ ] }), !props.trial && mostActivePathway && /* @__PURE__ */ React.createElement("div", { className: "text-xs text-slate-500" }, "Most active pathway: ", /* @__PURE__ */ React.createElement("span", { className: "font-bold text-dark-blue-400" }, mostActivePathway.title), " (", mostActivePathway.count, " submission", mostActivePathway.count === 1 ? "" : "s", ")"), !props.trial && /* @__PURE__ */ React.createElement(
3716
+ "select",
3713
3717
  {
3714
- clearable: true,
3715
- clearButtonLabel: "Clear class selection",
3716
- size: "sm",
3717
- placeholder: "Select a class",
3718
- nothingFound: "No options",
3719
3718
  value: props.classId,
3720
- onChange: props.onClassChange,
3721
- icon: /* @__PURE__ */ React.createElement(IconCategory2, null),
3722
- data: props.classes.map((g) => {
3723
- return { value: g.classId, label: g.name };
3724
- })
3725
- }
3726
- ), /* @__PURE__ */ React.createElement(Stack$5, { spacing: 0 }, !props.trial && /* @__PURE__ */ React.createElement(
3727
- Tabs,
3728
- {
3729
- value: tab,
3730
- data: [
3731
- { label: "By student", value: "students" },
3732
- { label: "By pathway", value: "pathways" },
3733
- { label: "By badge", value: "badges" },
3734
- { label: "By lesson", value: "lessons" }
3735
- ],
3736
- onChange: setTab
3737
- }
3738
- ), !props.trial && tab === "students" && /* @__PURE__ */ React.createElement(
3739
- Table,
3740
- {
3741
- loading: props.loading,
3742
- items: props.students
3743
- }
3744
- ), tab === "pathways" && /* @__PURE__ */ React.createElement(
3745
- PathwayTable,
3746
- {
3747
- pathways: props.pathways || [],
3748
- badges: props.badges || [],
3749
- students: props.students,
3750
- loading: props.loading
3751
- }
3752
- ), tab === "badges" && /* @__PURE__ */ React.createElement(
3753
- BadgeTable,
3754
- {
3755
- badges: props.badges || [],
3756
- students: props.students,
3757
- loading: props.loading
3758
- }
3759
- ), tab === "lessons" && /* @__PURE__ */ React.createElement(
3760
- LessonTableWrapper,
3719
+ onChange: (e) => props.onClassChange(e.target.value),
3720
+ 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"
3721
+ },
3722
+ /* @__PURE__ */ React.createElement("option", { value: "" }, "Select a class"),
3723
+ props.classes.map((g) => /* @__PURE__ */ React.createElement("option", { key: g.classId, value: g.classId }, g.name))
3724
+ ), !props.trial && /* @__PURE__ */ React.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS.map((t) => /* @__PURE__ */ React.createElement(
3725
+ "button",
3761
3726
  {
3762
- lessons: props.lessons,
3763
- students: props.students,
3764
- loading: props.loading
3765
- }
3766
- )))))));
3727
+ key: t.value,
3728
+ onClick: () => setTab(t.value),
3729
+ 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"}`
3730
+ },
3731
+ t.label
3732
+ ))), !props.trial && tab === "students" && /* @__PURE__ */ React.createElement(Table, { loading: props.loading, items: enrichedStudents, onReview: (item) => onReview(item, enrichedStudents) }), !props.trial && tab === "pathways" && /* @__PURE__ */ React.createElement(PathwayGroups, { students: enrichedStudents, loading: props.loading, pathways: props.pathways || [], badges: props.badges || [], onReview }), !props.trial && tab === "badges" && /* @__PURE__ */ React.createElement(BadgeGroups, { students: enrichedStudents, loading: props.loading, badges: props.badges || [], pathwayNameForBadge, onReview }), !props.trial && tab === "lessons" && /* @__PURE__ */ React.createElement(LessonGroups, { students: enrichedStudents, loading: props.loading, lessons: props.lessons, badgeForLesson, pathwayNameForBadge, onReview }));
3767
3733
  };
3768
3734
 
3769
- export { AdminProvider, App, Badge, Badges, Class, Classes, Dashboard, FileLocker, GettingStarted, Home, Lesson, Lessons, Navbar, Organization, Pathway, PathwayTable, Pathways, People, StartAnonymousLesson, Student, SwitchAccount, TrialHome, TrialRegistration };
3735
+ export { AdminProvider, App, Badge, Badges, Class, Classes, Dashboard, FileLocker, GettingStarted, Home, Lesson, Lessons, Navbar, Organization, Pathway, Pathways, People, StartAnonymousLesson, Student, SwitchAccount, TrialHome, TrialRegistration };
3770
3736
  //# sourceMappingURL=index.mjs.map