ubuntu2004
{ "version": 3, "file": "bundle.css", "sources": [ "DragDropList.svelte", "Icon.svelte", "App.svelte", "Exercise.svelte", "Pagination.svelte", "Sorter.svelte", "Assessment.svelte", "Bank.svelte" ], "sourcesContent": [ "<script>\n import {flip} from \"svelte/animate\";\n \n export let data = [];\n export let removesItems = false;\n\n let ghost;\n let grabbed;\n\n let lastTarget;\n\n let mouseY = 0; // pointer y coordinate within client\n let offsetY = 0; // y distance from top of grabbed element to pointer\n let layerY = 0; // distance from top of list to top of client\n\n function grab(clientY, element) {\n // modify grabbed element\n grabbed = element;\n grabbed.dataset.grabY = clientY;\n\n // modify ghost element (which is actually dragged)\n ghost.innerHTML = grabbed.innerHTML;\n\n // record offset from cursor to top of element\n // (used for positioning ghost)\n offsetY = grabbed.getBoundingClientRect().y - clientY;\n drag(clientY);\n }\n\n // drag handler updates cursor position\n function drag(clientY) {\n if (grabbed) {\n mouseY = clientY;\n layerY = ghost.parentNode.getBoundingClientRect().y;\n }\n }\n\n // touchEnter handler emulates the mouseenter event for touch input\n // (more or less)\n function touchEnter(ev) { \n drag(ev.clientY);\n // trigger dragEnter the first time the cursor moves over a list item\n let target = document.elementFromPoint(ev.clientX, ev.clientY).closest(\".item\");\n if (target && target != lastTarget) {\n lastTarget = target;\n dragEnter(ev, target);\n }\n }\n\n function dragEnter(ev, target) {\n // swap items in data\n if (grabbed && target != grabbed && target.classList.contains(\"item\")) {\n moveDatum(parseInt(grabbed.dataset.index), parseInt(target.dataset.index));\n }\n }\n\n // does the actual moving of items in data\n function moveDatum(from, to) {\n let temp = data[from];\n data = [...data.slice(0, from), ...data.slice(from + 1)];\n data = [...data.slice(0, to), temp, ...data.slice(to)];\n }\n\n function release(ev) {\n grabbed = null;\n }\n\n function removeDatum(index) {\n data = [...data.slice(0, index), ...data.slice(index + 1)];\n }\n</script>\n\n<style>\n main {\n position: relative;\n }\n\n .list {\n cursor: grab;\n z-index: 5;\n display: flex;\n flex-direction: column;\n }\n\n .item {\n box-sizing: border-box;\n display: inline-flex;\n width: 100%;\n min-height: 3em;\n margin-bottom: 0.5em;\n background-color: white;\n border: 1px solid rgb(190, 190, 190);\n border-radius: 2px;\n user-select: none;\n }\n\n .item:last-child {\n margin-bottom: 0;\n }\n\n .item:not(#grabbed):not(#ghost) {\n z-index: 10;\n }\n\n .item > * {\n margin: auto;\n }\n\n .buttons {\n width: 32px;\n min-width: 32px;\n margin: auto 0;\n display: flex;\n flex-direction: column;\n }\n\n .buttons button {\n cursor: pointer;\n width: 18px;\n height: 18px;\n margin: 0 auto;\n padding: 0;\n border: 1px solid rgba(0, 0, 0, 0);\n background-color: inherit;\n }\n\n .buttons button:focus {\n border: 1px solid black;\n }\n\n .delete {\n width: 32px;\n }\n\n #grabbed {\n opacity: 0.0;\n }\n\n #ghost {\n pointer-events: none;\n z-index: -5;\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0.0;\n }\n\n #ghost * {\n pointer-events: none;\n }\n\n #ghost.haunting {\n z-index: 20;\n opacity: 1.0;\n }\n</style>\n\n<!-- All the documentation has to go up here, sorry.\n (otherwise it conflicts with the HTML or svelte/animate) \n The .list has handlers for pointer movement and pointer up/release/end.\n Each .item has a handler for pointer down/click/start, which assigns that\n element as the item currently being \"grabbed\". They also have a handler\n for pointer enter (the touchmove handler has extra logic to behave like the\n no longer extant 'touchenter'), which swaps the entered element with the\n grabbed element when triggered.\n You'll also find reactive styling below, which keeps it from being directly\n part of the imperative javascript handlers. -->\n<main class=\"dragdroplist\">\n <div \n bind:this={ghost}\n id=\"ghost\"\n class={grabbed ? \"item haunting\" : \"item\"}\n style={\"top: \" + (mouseY + offsetY - layerY) + \"px\"}><p></p></div>\n <div \n class=\"list\"\n on:mousemove={function(ev) {ev.stopPropagation(); drag(ev.clientY);}}\n on:touchmove={function(ev) {ev.stopPropagation(); drag(ev.touches[0].clientY);}}\n on:mouseup={function(ev) {ev.stopPropagation(); release(ev);}}\n on:touchend={function(ev) {ev.stopPropagation(); release(ev.touches[0]);}}>\n {#each data as datum, i (datum.id ? datum.id : JSON.stringify(datum))}\n <div \n id={(grabbed && (datum.id ? datum.id : JSON.stringify(datum)) == grabbed.dataset.id) ? \"grabbed\" : \"\"}\n class=\"item\"\n data-index={i}\n data-id={(datum.id ? datum.id : JSON.stringify(datum))}\n data-grabY=\"0\"\n on:mousedown={function(ev) {grab(ev.clientY, this);}}\n on:touchstart={function(ev) {grab(ev.touches[0].clientY, this);}}\n on:mouseenter={function(ev) {ev.stopPropagation(); dragEnter(ev, ev.target);}}\n on:touchmove={function(ev) {ev.stopPropagation(); ev.preventDefault(); touchEnter(ev.touches[0]);}}\n animate:flip|local={{duration: 200}}>\n <div class=\"buttons\">\n <button \n class=\"up\" \n style={\"visibility: \" + (i > 0 ? \"\" : \"hidden\") + \";\"}\n on:click={function(ev) {moveDatum(i, i - 1)}}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"16px\" height=\"16px\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><path d=\"M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6 1.41 1.41z\"/></svg>\n </button>\n <button \n class=\"down\" \n style={\"visibility: \" + (i < data.length - 1 ? \"\" : \"hidden\") + \";\"}\n on:click={function(ev) {moveDatum(i, i + 1)}}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"16px\" height=\"16px\"><path d=\"M0 0h24v24H0V0z\" fill=\"none\"/><path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z\"/></svg>\n </button>\n </div>\n\n <div class=\"content\">\n {#if datum.html}\n {@html datum.html}\n {:else if datum.text}\n <p>{datum.text}</p>\n {:else}\n <p>{datum}</p>\n {/if}\n </div>\n\n <div class=\"buttons delete\">\n {#if removesItems}\n <button\n on:click={function(ev) {removeDatum(i);}}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"16\" viewBox=\"0 0 24 24\" width=\"16\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/></svg>\n </button>\n {/if}\n </div>\n </div>\n {/each}\n </div>\n</main>", "<script>\n import classnames from './utils';\n\n let className = '';\n export { className as class };\n export let name = '';\n\n $: classes = classnames(className, `bi-${name}`);\n</script>\n\n<style>\n @import url('https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css');\n</style>\n\n<i {...$$restProps} class={classes} />\n", "<script lang=\"ts\">var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { onMount } from 'svelte';\nimport { bank } from './stores/banks';\nimport Router, { querystring } from 'svelte-spa-router';\nimport { routes } from './routes';\nimport { Spinner } from 'sveltestrap';\nimport CodeCell from './components/CodeCell.svelte';\nimport Nav from './components/Nav.svelte';\nlet loading = true;\nonMount(() => __awaiter(void 0, void 0, void 0, function* () {\n const bankFetch = yield fetch(window['bankJsonUrl']);\n bank.set(yield bankFetch.json());\n loading = false;\n}));\n</script>\n\n{#if $querystring != \"embed\"}\n<Nav/>\n{/if}\n\n<CodeCell/>\n\n{#if loading}\n <div class=\"text-center\">\n <h1 class=\"display-4\">Loading ☑️It...</h1>\n <Spinner color=\"primary\" />\n </div>\n{:else}\n <Router {routes}/>\n\n <footer>\n <p class=\"text-center text-muted\">\n <small>\n <em>\n Randomized exericse bank powered by\n <a target=\"_blank\" href=\"https://checkit.clontz.org\">CheckIt</a>\n v0.1.1\n </em>\n </small>\n </p>\n </footer>\n{/if}\n\n<style>\n h1 { margin-top: 1em; }\n footer { margin-top: 2em; }\n</style>\n", "<script lang=\"ts\">import { afterUpdate } from 'svelte';\n;\nimport { instructorEnabled } from '../stores/instructor';\nimport { Nav, NavItem, NavLink, Row, Col } from 'sveltestrap';\nimport { parseMath } from '../utils';\nexport let embedded = false;\nexport let outcome = { title: 'unknown', slug: 'unknown', exercises: [], description: 'unknown', alignment: 'unknown' };\nexport let exercise;\nexport let page = 0;\nexport let hiddenAnswer = true;\nexport let statementOnly = false;\nlet exerciseDiv;\nconst decorateAnswer = () => {\n if (exerciseDiv) {\n for (let e of exerciseDiv.getElementsByClassName(\"exercise-answer\")) {\n e.classList.add(\"alert\");\n e.classList.add(\"alert-info\");\n if (hiddenAnswer || statementOnly) {\n e.classList.add(\"d-none\");\n }\n else {\n e.classList.remove(\"d-none\");\n }\n }\n }\n};\nafterUpdate(decorateAnswer);\nconst modes = ['display', 'html', 'embed', 'tex', 'pretext'];\nconst modeLabels = ['Display', 'HTML', 'Embed (HTML)', 'LaTeX', 'PreTeXt'];\nlet mode = \"display\";\nconst changeMode = (m) => (e) => {\n e.preventDefault();\n mode = m;\n};\n</script>\n\n{#if !statementOnly && !embedded}\n {#if $instructorEnabled}\n <div class=\"navtabs\">\n <Nav tabs>\n {#each modes as m,i}\n <NavItem>\n <NavLink \n active={mode==m} \n on:click={changeMode(m)} \n href=\"#/\">\n {modeLabels[i]}\n </NavLink>\n </NavItem>\n {/each}\n </Nav>\n </div>\n {:else}\n <hr/>\n {/if}\n{/if}\n\n{#if embedded }\n <div bind:this={exerciseDiv}>{@html parseMath(exercise.html)}</div>\n{:else}\n<Row>\n <Col sm={{ size: 10, offset: 1 }}>\n {#if mode == \"display\"}\n <div bind:this={exerciseDiv}>{@html parseMath(exercise.html)}</div>\n {:else if mode == \"html\"}\n <pre class=\"pre-scrollable\"><code>{exercise.html}</code></pre>\n {:else if mode == \"tex\"}\n <pre class=\"pre-scrollable\"><code>{exercise.tex}</code></pre>\n {:else if mode == \"pretext\"}\n <pre class=\"pre-scrollable\"><code>{exercise.pretext}</code></pre>\n {:else if mode == \"embed\"}\n <pre class=\"pre-scrollable\"><code><iframe title=\"Iframe CheckIt Outcome\"\n width=\"800\"\n height=\"450\"\n src=\"{location.protocol}//{location.host}{location.pathname}#/bank/{outcome.slug}/{page+1}/?embed\">\n</iframe></code></pre>\n {:else}\n Invalid mode.\n {/if}\n </Col>\n</Row>\n{/if}\n\n<style>\n pre {\n border: 1px #ddd solid;\n background-color: #eee;\n padding: 4px;\n border-radius: 5px;\n }\n .navtabs {\n margin-bottom: 1em;\n }\n</style>", "<script lang=\"ts\">import { Pagination, PaginationItem, PaginationLink } from 'sveltestrap';\nexport let page;\nexport let pages;\nexport let label = undefined;\nexport let keyboardControl = false;\nexport let minimal = false;\nconst pageRange = (p) => {\n let start = Math.max(0, Math.min(p - 2, pages - 5));\n let end = Math.min(pages, start + 5);\n return Array.from({ length: end - start }, (_, key) => start + key);\n};\nconst setPage = (p) => (e) => {\n e.preventDefault();\n page = p;\n};\nconst handleKeydown = (e) => {\n if (keyboardControl) {\n if (e.key === \"ArrowLeft\") {\n page = Math.max(0, page - 1);\n }\n else if (e.key === \"ArrowRight\") {\n page = Math.min(pages - 1, page + 1);\n }\n }\n};\n</script>\n\n\n<svelte:window on:keydown={handleKeydown}/>\n\n<div class=\"pagination\">\n <Pagination ariaLabel={label}>\n {#if label}\n <PaginationItem disabled>\n <PaginationLink>{label}</PaginationLink>\n </PaginationItem>\n {/if}\n {#if !minimal}\n <PaginationItem disabled={page==0}>\n <PaginationLink first on:click={setPage(0)} />\n </PaginationItem>\n {/if}\n <PaginationItem disabled={page==0}>\n <PaginationLink previous on:click={setPage(page-1)} />\n </PaginationItem>\n {#each pageRange(page) as p}\n <PaginationItem active={page==p}>\n <PaginationLink on:click={setPage(p)}>{p+1}</PaginationLink>\n </PaginationItem>\n {/each}\n <PaginationItem disabled={page==pages-1}>\n <PaginationLink next on:click={setPage(page+1)} />\n </PaginationItem>\n {#if !minimal}\n <PaginationItem disabled={page==pages-1}>\n <PaginationLink last on:click={setPage(pages-1)} />\n </PaginationItem>\n {/if}\n </Pagination>\n</div>\n\n<style>\n .pagination {\n overflow-x: auto;\n }\n</style>\n", "<script lang=\"ts\">import DragDropList from 'svelte-dragdroplist';\nexport let array;\nexport let removesItems = true;\nexport let display = (element) => element;\nlet ddArray = array.map((item, i) => {\n return {\n 'text': display(item),\n 'item': item,\n 'id': i,\n };\n});\n$: array = ddArray.map((i) => i.item);\n</script>\n\n{#if array.length > 0}\n <DragDropList bind:data={ddArray} {removesItems}/>\n{/if}\n\n<style>\n :global(*) {\n color: black;\n }\n</style>", "<script lang=\"ts\">import { Container, Row, Col, Button, UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem, } from 'sveltestrap';\nimport OutcomeDropdown from '../components/dropdowns/Outcome.svelte';\nimport Exercise from '../components/Exercise.svelte';\nimport Sorter from '../components/Sorter.svelte';\nimport { assessmentOutcomeSlugs, instructorEnabled } from '../stores/instructor';\nimport { bank } from '../stores/banks';\nimport { getOutcomeFromSlug, getRandomAssessmentFromSlugs } from '../utils';\n;\n$instructorEnabled = true;\n$assessmentOutcomeSlugs = $assessmentOutcomeSlugs.filter(s => getOutcomeFromSlug($bank, s) !== undefined);\nconst display = (slug) => {\n let o = getOutcomeFromSlug($bank, slug);\n return `${slug} — ${o.title}`;\n};\nlet generatedAssessment = undefined;\nconst generate = () => generatedAssessment = getRandomAssessmentFromSlugs($bank, $assessmentOutcomeSlugs);\nconst copyToClipboard = (text) => () => {\n navigator.clipboard.writeText(text);\n alert(\"Copied to clipboard!\");\n};\nlet latexForm;\nconst openInOverleaf = () => {\n latexForm.target = \"_blank\";\n latexForm.action = \"https://www.overleaf.com/docs\";\n latexForm.method = \"POST\";\n latexForm.submit();\n};\n</script>\n\n<main>\n <Container>\n <h1 class=\"display-4\">☑️It Assessment Builder</h1>\n <Row>\n <Col sm=\"4\">\n <p>\n Build your assessment by first adding learning outcomes:\n </p>\n <p><OutcomeDropdown/></p>\n <p>\n Then you can sort these outcomes into whatever order \n you wish. \n </p>\n </Col>\n <Col sm=\"8\">\n <div class=\"outcome-ordering\">\n {#if $assessmentOutcomeSlugs.length < 1}\n (Add outcomes for your assessment.)\n {/if}\n <Sorter bind:array={$assessmentOutcomeSlugs} {display} removesItems/>\n {#if $assessmentOutcomeSlugs.length > 0}\n <a \n href=\"#.\"\n on:click|preventDefault={()=>$assessmentOutcomeSlugs=[]}>\n [Reset outcomes]\n </a>\n {/if}\n </div>\n </Col>\n </Row>\n <Row>\n <Col>\n <p>\n Clicking \"Generate\" will choose a random exercise assessing\n each outcome.\n </p>\n {#if generatedAssessment}\n <form bind:this={latexForm}>\n <p>\n <em>Source code:</em>\n <textarea\n name=\"snip\"\n class=\"form-control text-monospace\"\n rows=\"4\"\n readonly\n value={generatedAssessment.tex}\n />\n </p>\n </form>\n {/if}\n <Row class=\"mb-2\">\n <Col xs=\"auto\" class=\"ml-auto\">\n <Button\n color=\"primary\"\n disabled={$assessmentOutcomeSlugs.length < 1}\n outline={generatedAssessment !== undefined}\n on:click={generate}>\n {#if generatedAssessment}\n Re-generate\n {:else}\n Generate\n {/if}\n </Button>\n </Col> \n <Col xs=\"auto\" class=\"mr-auto\">\n {#if generatedAssessment}\n <UncontrolledDropdown>\n <DropdownToggle caret>\n Export:\n </DropdownToggle>\n <DropdownMenu>\n <DropdownItem on:click={openInOverleaf}>\n Open PDF using Overleaf.com\n </DropdownItem>\n <DropdownItem\n on:click={copyToClipboard(generatedAssessment.tex)}>\n Copy LaTeX to your clipboard 📋\n </DropdownItem>\n </DropdownMenu>\n </UncontrolledDropdown>\n {/if}\n </Col>\n </Row>\n {#if generatedAssessment}\n <h3>Preview</h3>\n {#each generatedAssessment.exercises as exercise,i}\n <h4>Exercise {i+1}</h4>\n <Exercise {exercise} statementOnly/>\n {/each}\n {/if}\n </Col>\n </Row>\n </Container>\n</main>\n\n<style>\n h1 { margin-top:0.5em }\n .outcome-ordering {\n border: 1px #888 solid; \n border-radius: 5px; \n padding: 10px; \n margin-bottom: 1em;\n color: gray;\n text-align: center;\n }\n</style>", "<script lang=\"ts\">;\nexport let params;\nimport { Container, Alert, } from 'sveltestrap';\nimport OutcomeDropdown from '../components/dropdowns/Outcome.svelte';\nlet outcome = undefined;\n$: if (params && params.outcomeSlug) {\n outcome = $bank.outcomes.find((o) => o.slug == params.outcomeSlug);\n}\nimport { querystring } from 'svelte-spa-router';\nimport { bank } from '../stores/banks';\n</script>\n\n<main>\n <Container>\n <h1>{$bank.title}</h1>\n {#if $bank.outcomes}\n {#if $querystring != \"embed\"}\n <p>\n <OutcomeDropdown {outcome}/>\n </p>\n {/if}\n {:else}\n <Alert color=\"warning\">No outcomes found for this bank.</Alert>\n {/if}\n {#if !outcome}\n <p>Homepage: <a href={$bank.url}>{$bank.url}</a></p>\n {/if}\n <slot/>\n </Container>\n</main>\n\n<style>\n h1 {margin-top: 0.5em;}\n</style>" ], "names": [], "mappings": "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" }