wuffle 0.48.1 → 0.50.0

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.
@@ -1,44 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "bundle.css",
4
- "sources": [
5
- "BoardFilter.svelte",
6
- "Card.svelte",
7
- "CardLink.svelte",
8
- "CardStatus.svelte",
9
- "CollaboratorLinks.svelte",
10
- "Taskboard.svelte",
11
- "Avatar.svelte",
12
- "EpicIcon.svelte",
13
- "HintList.svelte",
14
- "Icon.svelte",
15
- "LinkIcon.svelte",
16
- "Loader.svelte",
17
- "Notification.svelte",
18
- "Notifications.svelte",
19
- "PullRequestIcon.svelte",
20
- "SearchIcon.svelte",
21
- "Tag.svelte"
22
- ],
23
- "sourcesContent": [
24
- "<style lang=\"scss\">.input-prefixed {\n position: relative;\n width: 100%; }\n .input-prefixed .prefix {\n position: absolute;\n line-height: 1.5;\n vertical-align: middle;\n display: inline-block;\n left: 0;\n top: 1px;\n padding: 0.375rem 0.75rem;\n height: calc(1.5em + 0.75rem + 2px);\n color: #6c757d; }\n .input-prefixed.focussed .prefix {\n color: #495057; }\n .input-prefixed input {\n padding-left: 30px;\n width: 100%; }\n .input-prefixed.input-prefixed-lg .prefix {\n height: calc(1.5em + 1rem + 2px);\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5; }\n .input-prefixed.input-prefixed-lg input {\n padding-left: 36px; }\n .input-prefixed .help {\n border-radius: 4px;\n margin: 0;\n text-align: left;\n height: auto;\n position: relative;\n background: transparent;\n border: none;\n z-index: 999;\n width: 100%;\n min-width: 0 !important;\n max-width: none !important;\n padding: .6em 0;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: 0 0.1rem 1rem rgba(0, 0, 0, 0.075);\n position: absolute;\n top: 100%;\n z-index: 100;\n left: 0px;\n right: auto;\n display: block; }\n .input-prefixed .help .category {\n color: #37ACC8;\n font-weight: bold;\n padding: 0 .8rem; }\n .input-prefixed .help .note {\n padding: 0 .8rem;\n color: #6c757d;\n margin: 0; }\n .input-prefixed .help .note em {\n font-style: italic; }\n .input-prefixed .help .note + .note {\n margin-top: 5px; }\n\n.board-filter {\n width: 300px; }\n .board-filter.expanded {\n width: 500px;\n max-width: 100%; }\n\n.icon {\n color: #dee2e6; }\n</style>\n\n\n<script>\n import { Id } from './util';\n\n import {\n Icon,\n HintList\n } from './components';\n\n import {\n isFindShortcut\n } from './shortcuts';\n\n import {\n debounce\n } from './util';\n\n import SearchIcon from './components/SearchIcon.svelte';\n\n export { className as class }; let className = '';\n export let value = '';\n\n export let completionOptions = {};\n\n export let onChange;\n\n let temporalPresets = [\n [ 'today', Date.now() ],\n [ 'last week', Date.now() - 1000 * 60 * 60 * 24 * 7 ],\n [ 'last month', Date.now() - 1000 * 60 * 60 * 24 * 30 ]\n ].map(([ name, value ]) => {\n\n const date = new Date(value);\n\n return { name, value: `>=${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ` };\n });\n\n let staticValues = {\n is: [\n 'assigned',\n 'unassigned',\n 'closed',\n 'open',\n 'issue',\n 'pull',\n 'milestoned'\n ].map(name => {\n return { name, value: `${name} ` };\n }),\n created: temporalPresets,\n updated: temporalPresets\n };\n\n $: dynamicValues = Object.entries(completionOptions).reduce((values, entry) => {\n\n const [ key, value ] = entry;\n\n values[key] = value.slice().sort().map(name => {\n\n const separator = /[: ]/.test(name) ? '\"' : '';\n\n return { name, value: `${separator}${name}${separator} ` };\n });\n\n return values;\n }, {});\n\n const qualifierCategories = [\n {\n name: 'Operators',\n options: [\n 'label',\n 'assignee',\n 'author',\n 'repo',\n 'reviewer',\n 'milestone',\n 'created',\n 'updated',\n 'involves',\n 'is'\n ].map(name => {\n return {\n name,\n value: `${name}:`\n };\n })\n }\n ];\n\n let keyboardSelectedHint;\n let mouseSelectedHint;\n\n $: categoryValues = {\n ...staticValues,\n ...dynamicValues\n };\n\n $: selectedHint = mouseSelectedHint || keyboardSelectedHint;\n\n let input;\n\n let focussed = false;\n let match;\n let allHints;\n\n let position = 0;\n\n $: expanded = focussed || value;\n $: {\n console.time('BoardFilter#computeMatch');\n\n let opts = computeMatch(value, position, categoryValues);\n\n console.timeEnd('BoardFilter#computeMatch');\n\n match = opts.match;\n allHints = opts.allHints;\n\n keyboardSelectedHint = (\n allHints && keyboardSelectedHint && allHints.find(\n hint => hint.name === keyboardSelectedHint.name\n ) || opts.keyboardSelectedHint\n );\n }\n\n const searchId = Id();\n\n function computeMatch(value, searchEnd, categoryValues) {\n\n const beforeCursor = value.substring(0, searchEnd);\n\n const searchStart = beforeCursor.lastIndexOf(' ') + 1;\n\n value = value.substring(searchStart, searchEnd).toLowerCase();\n\n const match = /^([-!]?)(?:([\\w]+)(?:(:)(?:\"([\\w-]+)\"?|([\\w-]+))?)?)$/.exec(value);\n\n if (!match) {\n return {};\n }\n\n let [ _, negator, qualifier, sep, qualifierText, qualifierTextEscaped ] = match;\n\n const search = sep ? (qualifierText || qualifierTextEscaped || '') : qualifier;\n\n const allHints = [];\n\n const categories = sep ? [\n {\n name: 'Values',\n options: categoryValues[qualifier] || []\n }\n ] : qualifierCategories;\n\n const matchedCategories = categories.reduce((matchedCategories, category) => {\n\n const matchedValues = category.options.reduce((matchedValues, categoryOption) => {\n\n const {\n name,\n value\n } = categoryOption;\n\n if (name.toLowerCase().includes(search)) {\n\n const idx = name.indexOf(search);\n\n const hint = {\n name: name,\n parts: [\n {\n text: name.substring(0, idx)\n },\n {\n text: name.substring(idx, idx + search.length),\n matched: true\n },\n {\n text: name.substring(idx + search.length)\n }\n ],\n apply: (currentValue) => {\n\n const before = currentValue.substring(0, searchStart);\n const fix = (negator || '') + (sep ? qualifier + sep : '') + value;\n const after = currentValue.substring(searchEnd);\n\n return {\n val: `${before}${fix}${after}`,\n idx: before.length + fix.length\n };\n }\n };\n\n matchedValues.push(hint);\n allHints.push(hint);\n }\n\n return matchedValues;\n }, []);\n\n\n if (matchedValues.length) {\n matchedCategories.push({\n name: category.name,\n values: matchedValues\n });\n }\n\n return matchedCategories;\n }, []);\n\n if (matchedCategories.length) {\n\n return {\n match: { categories: matchedCategories },\n keyboardSelectedHint: matchedCategories[0].values[0],\n allHints\n };\n }\n\n return {\n match: null,\n keyboardSelectedHint: null,\n allHints: []\n };\n }\n\n function applyHint(hint) {\n\n const {\n val,\n idx\n } = hint.apply(value);\n\n input.value = value = val;\n input.selectionEnd = input.selectionStart = position = idx;\n\n triggerChanged(value);\n }\n\n function handleInput(event) {\n\n const target = event.target;\n\n value = target.value;\n position = target.selectionStart;\n\n triggerChanged(value);\n }\n\n function nextHint(currentHint, direction) {\n\n const hints = (allHints || []);\n\n const currentIndex = hints.findIndex(hint => hint.name === currentHint.name);\n\n let nextIndex = currentIndex + direction;\n\n if (nextIndex < 0) {\n nextIndex = hints.length - 1;\n }\n\n if (nextIndex === hints.length) {\n nextIndex = 0;\n }\n\n return hints[nextIndex];\n }\n\n function handleInputKey(event) {\n\n const key = event.key;\n\n if (key === 'Enter') {\n if (keyboardSelectedHint) {\n applyHint(keyboardSelectedHint);\n }\n\n event.preventDefault();\n }\n\n if (key === 'ArrowUp') {\n keyboardSelectedHint = nextHint(keyboardSelectedHint, -1);\n event.preventDefault();\n }\n\n if (key === 'ArrowDown') {\n keyboardSelectedHint = nextHint(keyboardSelectedHint, 1);\n event.preventDefault();\n }\n\n if (key === 'Escape' && !value) {\n input.blur();\n\n event.preventDefault();\n }\n }\n\n const triggerChanged = debounce((value) => {\n onChange && onChange(value);\n }, 500);\n\n function isInputTarget(event) {\n const {\n target\n } = event;\n\n return target === input;\n }\n\n function handleGlobalKey(event) {\n\n if (isFindShortcut(event)) {\n event.preventDefault();\n\n if (!isInputTarget(event)) {\n input.focus();\n }\n }\n }\n</script>\n\n<svelte:window on:keydown={ handleGlobalKey } />\n\n<div class=\"board-filter { className } { expanded && 'expanded' }\">\n <div class=\"input-prefixed\" class:focussed={ focussed }>\n\n <label class=\"prefix\" for={searchId}>\n <Icon class=\"icon\" name=\"search\">\n <SearchIcon />\n </Icon>\n </label>\n\n <input\n class=\"form-control\"\n type=\"search\"\n placeholder=\"Filter board\"\n id={searchId}\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Filter\"\n bind:this={ input }\n bind:value={ value }\n on:input={ handleInput }\n on:keydown={ handleInputKey }\n on:focus={ () => focussed = true }\n on:blur={ () => focussed = false }\n />\n\n {#if value && match}\n <div class=\"help\">\n {#each match.categories as category, idx}\n {#if idx > 0}\n <hr />\n {/if}\n\n <div class=\"category\">{ category.name }</div>\n\n <HintList\n hints={ category.values }\n selectedHint={ selectedHint }\n onHover={ hint => mouseSelectedHint = hint }\n onBlur={ () => mouseSelectedHint = null }\n onSelect={ applyHint }\n maxElements= { 7 }\n />\n\n {/each}\n </div>\n {:else if focussed && !value}\n <div class=\"help\">\n <p class=\"note\">\n Filter cards by title and description.\n </p>\n\n <p class=\"note\">\n Refine your search with operators: <em>created</em>, <em>updated</em>, <em>milestone</em>, <em>repo</em>, <em>assignee</em>, <em>label</em> and <em>is</em>.\n </p>\n </div>\n {/if}\n </div>\n</div>",
25
- "<script>\n import {\n isOpen,\n isMerged,\n isPull,\n noDuplicates\n } from './util';\n\n import {\n isApplyFilterClick,\n isAddFilterClick\n } from './shortcuts';\n\n import Tag from './components/Tag.svelte';\n import PullRequestIcon from './components/PullRequestIcon.svelte';\n import EpicIcon from './components/EpicIcon.svelte';\n\n import CardStatus from './CardStatus.svelte';\n import CollaboratorLinks from './CollaboratorLinks.svelte';\n\n import CardLink from './CardLink.svelte';\n\n const linkOrder = {\n 'DEPENDS_ON': 1,\n 'CLOSED_BY': 2,\n 'PARENT_OF': 3,\n 'REQUIRED_BY': 4,\n 'LINKED_TO': 5,\n 'CHILD_OF': 6\n };\n\n export let item;\n\n export { className as class }; let className = '';\n\n export let onSelect;\n\n let showChildren = false;\n\n let hovered = false;\n\n $: id = item.id;\n $: number = item.number;\n $: title = item.title;\n $: repository = item.repository;\n $: milestone = item.milestone;\n $: labels = item.labels.filter(l => !l.column_label);\n $: pull_request = item.pull_request;\n\n $: links = item.links || [];\n\n $: embeddedLinks = links.filter(\n (link) => !isPull(link.target) && link.type !== 'LINKED_BY'\n ).sort(\n (a, b) => {\n return linkOrder[a.type] - linkOrder[b.type];\n }\n );\n\n $: shownLinks = embeddedLinks.filter(link => showChildren || link.type !== 'PARENT_OF');\n\n $: children = embeddedLinks.filter(l => l.type === 'PARENT_OF');\n $: completedChildren = children.filter(l => l.target.state === 'closed');\n\n $: prLinks = links.filter(\n link => isPull(link.target) && (\n isOpen(link.target) || (\n isMerged(link.target) && link.type === 'CLOSED_BY'\n )\n )\n ).filter(noDuplicates(link => link.target.id));\n\n $: repositoryName = `${repository.owner.login}/${repository.name}`;\n\n $: repoUrl = `https://github.com/${ repositoryName }`;\n\n $: milestoneUrl = milestone && `${repoUrl}/milestone/${milestone.number}`;\n $: cardUrl = `${repoUrl}/issues/${ number }`;\n\n function handleSelection(qualifier, value, clickThrough=true) {\n\n return function(event) {\n\n if (clickThrough && !isApplyFilterClick(event)) {\n return;\n }\n\n event.preventDefault();\n\n onSelect(qualifier, value, isAddFilterClick(event));\n };\n }\n</script>\n\n<style lang=\"scss\">.board-card-container {\n width: 100%;\n margin-bottom: 10px; }\n\n.board-card {\n background: white;\n border-radius: 4px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n position: relative;\n z-index: 1;\n padding: 4px 8px; }\n .board-card .header {\n margin-bottom: 7px; }\n\n:global(.card-link):not(:last-child) > .card-status {\n margin-bottom: -2px !important; }\n\n:global(.board-card-links.attached) .card-link:last-child > .card-status .state:last-child,\n:global(.board-card) > .card-status .state:last-child {\n border-bottom-right-radius: 4px; }\n\n:global(.board-card-links.attached) .card-link:last-child > .card-status .state:first-child,\n:global(.board-card) > .card-status .state:first-child {\n border-bottom-left-radius: 4px; }\n\n.board-card-links {\n margin-top: 2px; }\n\n.header {\n display: flex;\n align-items: center;\n user-select: none; }\n .header > * {\n flex-shrink: 0; }\n .header > .repository {\n flex: 1; }\n .header > .collaborator-links {\n display: flex;\n align-items: center; }\n\n.issue-type {\n margin-right: 3px; }\n\n.issue-type-pull-request {\n color: #6cc644; }\n\n.issue-number {\n font-weight: bold;\n margin-right: 6px;\n display: flex;\n align-items: center;\n text-decoration: none; }\n\n.repository,\n.short-title {\n color: #6c757d;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; }\n\n.title {\n font-size: 1.1em;\n margin: 0 0 9px 0;\n min-height: 30px;\n line-height: 1.2em;\n color: #495057;\n overflow: hidden; }\n\n.title textarea {\n width: 100%;\n line-height: 1.2em;\n resize: none;\n border: none;\n padding: 2px;\n min-height: 30px;\n overflow: hidden;\n color: #495057; }\n\n.footer {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap; }\n\n.links {\n margin-left: auto; }\n\n.links a {\n color: #adb5bd; }\n\n.links a:hover {\n color: #6c757d; }\n\n:global(.tag).label,\n:global(.tag).tag.milestone {\n margin-right: 4px;\n margin-bottom: 4px; }\n\n:global(.tag).milestone {\n color: #343a40 !important;\n border: solid 1px #6c757d; }\n\n.board-card-links.attached {\n background: #F9F9F9;\n border-radius: 0 0 4px 4px;\n box-shadow: inset 0 3px 5px -2px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.1);\n margin-top: -6px;\n position: relative;\n padding: 7px 8px 4px 8px; }\n .board-card-links.attached :global(.card-link):first-child {\n border-top: none;\n margin-top: 1px; }\n\n.progress {\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-bottom: 7px;\n cursor: pointer; }\n .progress:hover svg {\n color: #6c757d; }\n .progress svg {\n color: #CCC;\n transition: color .3s; }\n .progress .bar {\n border-radius: 3px;\n height: 5px;\n width: 80px;\n background: #EEE;\n margin: auto 6px; }\n .progress .bar .indicator {\n border-radius: 3px;\n background: #6c757d;\n height: 100%; }\n .progress .text {\n margin-left: 6px;\n font-size: 0.9rem;\n color: #6c757d; }\n</style>\n\n<div class=\"board-card-container { className }\">\n <div class=\"board-card\"\n class:hovered={ hovered }\n on:mouseenter={ () => hovered = true }\n on:mouseleave={ () => hovered = false }\n >\n <div class=\"header\">\n <a href={ cardUrl }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"issue-number\"\n title=\"{ repositoryName }#{ number }\"\n on:click={ handleSelection('ref', item.key) }\n >\n\n {#if children.length}\n <EpicIcon item={ item } linkType=\"PARENT_OF\" />\n {/if}\n\n {#if pull_request}\n <PullRequestIcon item={ item } />\n {/if}\n\n { number }\n </a>\n\n <span class=\"repository\" title={ repositoryName }>{ repositoryName }</span>\n\n <span class=\"collaborator-links\">\n <CollaboratorLinks item={ item } />\n </span>\n </div>\n <div class=\"title\">\n { title }\n </div>\n {#if children.length}\n <div\n class=\"progress\"\n on:click={ () => showChildren = !showChildren }\n title=\"Click toggle child tasks ({ completedChildren.length } of { children.length } completed)\">\n <svg class=\"icon issue closed\" width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M7 10h2v2H7v-2zm2-6H7v5h2V4zm1.5 1.5l-1 1L12 9l4-4.5-1-1L12 7l-1.5-1.5zM8 13.7A5.71 5.71 0 0 1 2.3 8c0-3.14 2.56-5.7 5.7-5.7 1.83 0 3.45.88 4.5 2.2l.92-.92A6.947 6.947 0 0 0 8 1C4.14 1 1 4.14 1 8s3.14 7 7 7 7-3.14 7-7l-1.52 1.52c-.66 2.41-2.86 4.19-5.48 4.19v-.01z\"></path>\n </svg>\n <div class=\"text\">\n { completedChildren.length } of { children.length }\n </div>\n <div class=\"bar\">\n <div class=\"indicator\" style=\"width: { completedChildren.length / children.length * 100 }%\"></div>\n </div>\n </div>\n {/if}\n <div class=\"footer\">\n {#if milestone}\n <Tag\n class=\"tag milestone\"\n name={ milestone.title }\n href={ milestoneUrl }\n onClick={ onSelect && handleSelection('milestone', milestone.title, !!milestoneUrl) }\n />\n {/if}\n\n {#each labels as { name, color }}\n <Tag\n class=\"tag label\"\n color=\"#{ color }\"\n name={ name }\n onClick={ onSelect && handleSelection('label', name, false) }\n />\n {/each}\n\n <div class=\"links\">\n <a href={ cardUrl } title=\"View on GitHub\" target=\"_blank\" rel=\"noopener noreferrer\">\n <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z\"></path>\n </svg>\n </a>\n </div>\n </div>\n\n {#if shownLinks.length}\n <div class=\"board-card-links embedded\">\n {#each shownLinks as link}\n <CardLink item={link.target} type={ link.type } onSelect={ onSelect } />\n {/each}\n </div>\n {/if}\n\n <CardStatus item={ item } />\n </div>\n\n {#if prLinks.length}\n <div class=\"board-card-links attached\">\n {#each prLinks as link}\n <CardLink item={ link.target } type={ link.type } onSelect={ onSelect } />\n {/each}\n </div>\n {/if}\n\n</div>\n",
26
- "<script>\n import PullRequestIcon from './components/PullRequestIcon.svelte';\n import LinkIcon from './components/LinkIcon.svelte';\n\n import CollaboratorLinks from './CollaboratorLinks.svelte';\n import CardStatus from './CardStatus.svelte';\n\n import {\n isApplyFilterClick,\n isAddFilterClick\n } from './shortcuts';\n\n export let item;\n\n export { className as class }; let className = '';\n\n export let onSelect;\n\n export let hovered = false;\n\n export let type;\n\n $: id = item.id;\n $: number = item.number;\n $: title = item.title;\n $: repository = item.repository;\n $: pull_request = item.pull_request;\n $: state = item.state;\n\n $: assignees = item.assignees || [];\n\n $: requested_reviewers = item.requested_reviewers || [];\n\n $: repositoryName = `${repository.owner.login}/${repository.name}`;\n\n $: cardUrl = `https://github.com/${ repositoryName }/issues/${ number }`;\n\n $: linkTitle = ({\n CHILD_OF: 'Parent of',\n DEPENDS_ON: 'Required by',\n PARENT_OF: 'Child of',\n CLOSED_BY: 'Closes',\n REQUIRED_BY: 'Depends on',\n CLOSES: 'Closed by',\n LINKED_TO: 'Linked to',\n LINKED_BY: 'Linked to'\n })[type] || type;\n\n function handleSelection(qualifier, value) {\n\n return function(event) {\n\n if (!isApplyFilterClick(event)) {\n return;\n }\n\n event.preventDefault();\n\n onSelect(qualifier, value, isAddFilterClick(event));\n };\n }\n</script>\n\n<style lang=\"scss\">.board-card-container {\n width: 100%;\n margin-bottom: 10px; }\n\n.board-card {\n background: white;\n border-radius: 4px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n position: relative;\n z-index: 1;\n padding: 4px 8px; }\n .board-card .header {\n margin-bottom: 7px; }\n\n:global(.card-link):not(:last-child) > .card-status {\n margin-bottom: -2px !important; }\n\n:global(.board-card-links.attached) .card-link:last-child > .card-status .state:last-child,\n:global(.board-card) > .card-status .state:last-child {\n border-bottom-right-radius: 4px; }\n\n:global(.board-card-links.attached) .card-link:last-child > .card-status .state:first-child,\n:global(.board-card) > .card-status .state:first-child {\n border-bottom-left-radius: 4px; }\n\n.board-card-links {\n margin-top: 2px; }\n\n.header {\n display: flex;\n align-items: center;\n user-select: none; }\n .header > * {\n flex-shrink: 0; }\n .header > .repository {\n flex: 1; }\n .header > .collaborator-links {\n display: flex;\n align-items: center; }\n\n.issue-type {\n margin-right: 3px; }\n\n.issue-type-pull-request {\n color: #6cc644; }\n\n.issue-number {\n font-weight: bold;\n margin-right: 6px;\n display: flex;\n align-items: center;\n text-decoration: none; }\n\n.repository,\n.short-title {\n color: #6c757d;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis; }\n\n.title {\n font-size: 1.1em;\n margin: 0 0 9px 0;\n min-height: 30px;\n line-height: 1.2em;\n color: #495057;\n overflow: hidden; }\n\n.title textarea {\n width: 100%;\n line-height: 1.2em;\n resize: none;\n border: none;\n padding: 2px;\n min-height: 30px;\n overflow: hidden;\n color: #495057; }\n\n.footer {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap; }\n\n.links {\n margin-left: auto; }\n\n.links a {\n color: #adb5bd; }\n\n.links a:hover {\n color: #6c757d; }\n\n.card-link {\n border-top: solid 1px #F0F0F0;\n margin-top: 2px;\n padding-top: 2px; }\n\n.card-link .short-title {\n flex: 1; }\n\n:global(.card-link) .epic {\n color: #1d76db; }\n</style>\n\n<div class=\"card-link\"\n class:hovered={ hovered }\n on:mouseenter={ () => hovered = true }\n on:mouseleave={ () => hovered = false }\n>\n <div class=\"header\">\n <a href={ cardUrl }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"issue-number\"\n on:click={ onSelect && handleSelection('ref', item.key) }\n title=\"{ repositoryName }#{ number } · { linkTitle } this issue\"\n >\n {#if pull_request}\n <PullRequestIcon item={ item } />\n {:else}\n {#if type === 'PARENT_OF'}\n <LinkIcon name=\"issue\" state={ state } />\n {/if}\n\n {#if type === 'CHILD_OF'}\n <LinkIcon name=\"epic\" />\n {/if}\n\n {#if type === 'DEPENDS_ON' || type === 'CLOSED_BY'}\n <LinkIcon name=\"depends-on\" state={ state } />\n {/if}\n\n {#if type === 'REQUIRED_BY' || type === 'CLOSES' }\n {#if state === 'open'}\n <LinkIcon name=\"linked-to\" />\n {:else}\n <LinkIcon name=\"issue\" state={ state } />\n {/if}\n {/if}\n\n {#if type === 'LINKED_TO'}\n <LinkIcon name=\"linked-to\" />\n {/if}\n {/if}\n\n { number }\n </a>\n\n <span class=\"short-title\" title={ title }>{ title }</span>\n\n <span class=\"collaborator-links\">\n <CollaboratorLinks item={ item } />\n </span>\n </div>\n\n <CardStatus item={ item } />\n</div>",
27
- "<script>\n\n export let item;\n\n $: check_runs = item.check_runs || [];\n $: statuses = item.statuses || [];\n\n const check_run_result_map = {\n failure: 'failed',\n success: 'succeeded',\n in_progress: 'in progress',\n queued: 'queued',\n action_required: 'action required'\n };\n</script>\n\n<style lang=\"scss\">/*\n $color-success: #77da8e;\n $color-failure: #da8077;\n $color-action-required: #dac977;\n */\n.card-status {\n display: flex;\n flex-direction: row;\n align-items: stretch;\n height: 3px;\n width: auto;\n margin: 3px -8px -4px; }\n\n.state {\n flex: 1;\n background-color: #adb5bd; }\n .state > span {\n display: none; }\n .state.striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n animation: progress-bar-stripes 1s linear infinite;\n background-size: 1rem 1rem; }\n .state.success {\n background-color: #6cdc86;\n box-shadow: 0 1px 2px 0px rgba(53, 154, 76, 0.3); }\n .state.failure {\n background-color: #ea868f;\n box-shadow: 0 1px 2px 0px rgba(203, 70, 83, 0.3); }\n .state.action-required {\n background-color: #ffdc8d;\n box-shadow: 0 1px 2px 0px rgba(236, 190, 84, 0.3); }\n\n.state + .state {\n margin-left: 1px; }\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0; }\n to {\n background-position: 0 0; } }\n</style>\n\n{#if check_runs.length || statuses.length}\n <div class=\"card-status\">\n\n {#each check_runs as check_run}\n <a\n class=\"state\"\n class:success={ check_run.conclusion === 'success' || check_run.status === 'in_progress' }\n class:failure={ check_run.conclusion === 'failure' }\n class:action-required={ check_run.conclusion === 'action_required' }\n class:striped={ check_run.status === 'in_progress' || check_run.status === 'queued' }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={ `${ check_run.name } — ${check_run_result_map[check_run.conclusion] || check_run_result_map[check_run.status] }` }\n href={ check_run.html_url }\n ><span>{check_run.name} — {check_run_result_map[check_run.conclusion] || check_run_result_map[check_run.status] }</span></a>\n {/each}\n\n {#each statuses as status}\n <a\n class=\"state\"\n class:success={ status.state === 'success' || status.state === 'pending' }\n class:failure={ status.state === 'failure' }\n class:action-required={ status.state === 'error' }\n class:striped={ status.state === 'pending' }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={ `${ status.context } — ${status.description}` }\n href={ status.target_url }\n ><span>{ status.context } — {status.description}</span></a>\n {/each}\n </div>\n{/if}",
28
- "<script>\n export let item;\n\n $: number = item.number;\n $: repository = item.repository;\n $: repositoryName = `${repository.owner.login}/${repository.name}`;\n $: repoUrl = `https://github.com/${ repositoryName }`;\n\n $: assignees = item.assignees;\n\n $: requested_reviewers = item.requested_reviewers || [];\n\n $: reviews = Object.values(\n (item.reviews || [])\n .filter(review => !requested_reviewers.find(reviewer => reviewer.login === review.user.login))\n .reduce((byUser, review) => {\n\n const existingReview = byUser[review.user.login];\n\n // keep last definitive review (approved, changes_requested)\n // to match GitHub display and behavior\n if (\n !existingReview ||\n existingReview.state === 'commented' ||\n review.state !== 'commented'\n ) {\n byUser[review.user.login] = review;\n }\n\n return byUser;\n }, {})\n );\n\n const stateToVerb = {\n changes_requested: 'requested changes',\n approved: 'approved',\n commented: 'commented',\n dismissed: 'dismissed his review'\n };\n\n</script>\n\n<style lang=\"scss\">.assignee {\n box-sizing: border-box;\n margin: 0;\n font-size: 14px;\n position: relative;\n display: inline-block;\n text-align: center;\n border-radius: 2px;\n margin-left: 3px;\n transition: margin .1s;\n height: 18px; }\n .assignee img {\n height: 100%;\n border-radius: 2px;\n vertical-align: unset; }\n .assignee .icon-shadow {\n position: absolute;\n display: none;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n box-shadow: inset 0 0 2px 0 rgba(20, 20, 20, 0.3);\n border-radius: 2px; }\n .assignee.requested-reviewer:before {\n content: '';\n display: block;\n background: #8AD6E8;\n box-shadow: 0 0 0 2px white;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n position: absolute;\n top: -2px;\n left: -2px;\n z-index: 1; }\n .assignee.commented:before {\n content: '';\n display: block;\n background: #8AD6E8;\n box-shadow: 0 0 0 2px white;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n position: absolute;\n top: -2px;\n left: -2px;\n z-index: 1; }\n .assignee.approved:before {\n content: '';\n display: block;\n background: #28a745;\n box-shadow: 0 0 0 2px white;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n position: absolute;\n top: -2px;\n left: -2px;\n z-index: 1; }\n .assignee.requested-changes:before {\n content: '';\n display: block;\n background: #dc3545;\n box-shadow: 0 0 0 2px white;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n position: absolute;\n top: -2px;\n left: -2px;\n z-index: 1; }\n\n.assignee + .assignee {\n margin-left: -6px;\n box-shadow: 0 0 0 1px white; }\n\n:global(.hovered) > .header .assignee + .assignee {\n margin-left: 3px !important;\n box-shadow: none; }\n</style>\n\n{#each requested_reviewers as reviewer}\n <span class=\"assignee requested-reviewer\" title=\"{ reviewer.login } requested for review\">\n <img src=\"{ reviewer.avatar_url }&s=40\" alt=\"{ reviewer.login } avatar\" />\n <div class=\"icon-shadow\"></div>\n </span>\n{/each}\n\n{#each reviews as review}\n <a\n class=\"assignee reviewer\"\n class:approved={ review.state === 'approved' }\n class:requested-changes={ review.state === 'changes_requested' }\n class:commented={ review.state === 'commented' || review.state === 'dismissed' }\n title=\"{ review.user.login } { stateToVerb[review.state] }\"\n href={ `${repoUrl}/pull/${number}#pullrequestreview-${review.id}` }\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img src=\"{ review.user.avatar_url }&s=40\" alt=\"{ review.user.login } avatar\" />\n <div class=\"icon-shadow\"></div>\n </a>\n{/each}\n\n{#each assignees as assignee}\n <span class=\"assignee\" title=\"{ assignee.login } assigned\">\n <img src=\"{ assignee.avatar_url }&s=40\" alt=\"{ assignee.login } avatar\" />\n <div class=\"icon-shadow\"></div>\n </span>\n{/each}",
29
- "<script>\n import BoardFilter from './BoardFilter.svelte';\n\n import Avatar from './components/Avatar.svelte';\n import Loader from './components/Loader.svelte';\n\n import Notifications from './components/Notifications.svelte';\n import Notification from './components/Notification.svelte';\n\n import Card from './Card.svelte';\n\n import Api from './Api';\n\n import Dragula from 'dragula';\n\n import {\n Id,\n createLocalStore,\n createHistory,\n isClosingLink,\n isOpenOrMerged,\n isPull,\n periodic,\n throttle\n } from './util';\n\n import loaderImage from './logo-gray.svg';\n import errorImage from './error.svg';\n\n import wuffleLogo from './logo-gray.svg';\n\n import { onMount } from 'svelte';\n\n const DEFAULT_PER_COLUMN_RENDER_COUNT = 25;\n\n const COLUMNS_COLLAPSED_KEY = 'Taskboard_columns_collapsed_state';\n const POLL_KEY = 'Taskboard_polling';\n\n const api = new Api();\n const localStore = createLocalStore();\n const history = createHistory();\n\n const navId = Id();\n\n let name = '';\n let columns = [];\n let items = {};\n\n let itemsById = {};\n\n let localCollapsed = localStore.get(COLUMNS_COLLAPSED_KEY, {});\n let loading = true;\n let updating = 0;\n let error = null;\n let warnings = [];\n\n let filter = parseSearchFilter();\n let user = null;\n let cursor = null;\n\n let accessNotification = false;\n\n let renderCountByColumn = {};\n\n let filterOptions = {};\n\n $: defaultCollapsed = columns.reduce((defaultCollapsed, column) => {\n defaultCollapsed[column.name] = column.collapsed;\n\n return defaultCollapsed;\n }, {});\n\n $: collapsed = {\n ...defaultCollapsed,\n ...localCollapsed\n };\n\n $: localStore.set(COLUMNS_COLLAPSED_KEY, localCollapsed);\n\n // shown items\n $: shownItems = Object.keys(items).reduce((shownItems, column) => {\n\n const columnItems = items[column];\n\n shownItems[column] = columnItems.filter(item => !isClosingPull(item));\n\n return shownItems;\n }, {});\n\n // actually rendered items\n $: renderedItems = Object.keys(shownItems).reduce((renderedItems, column) => {\n\n const renderCount = renderCountByColumn[column] || DEFAULT_PER_COLUMN_RENDER_COUNT;\n const items = shownItems[column];\n\n renderedItems[column] = items.slice(0, renderCount);\n\n return renderedItems;\n }, {});\n\n function action(name, options = {}) {\n\n return fn => {\n\n return fn()\n .then(result => {\n discardWarning(name);\n\n return result;\n })\n .catch(err => {\n return handleWarning(name, err, options);\n });\n };\n }\n\n function handleWarning(action, error, options) {\n console.warn('%s failed', action, error);\n\n if (options.display === false) {\n throw error;\n }\n\n const index = warnings.findIndex(w => w.action === action);\n\n const warning = {\n action,\n error\n };\n\n if (index !== -1) {\n warnings = [\n ...warnings.slice(0, index),\n warning,\n ...warnings.slice(index + 1)\n ];\n } else {\n warnings = [\n ...warnings,\n warning\n ];\n }\n }\n\n function discardWarnings() {\n warnings = [];\n }\n\n function discardWarning(action) {\n warnings = warnings.filter(w => w.action !== action);\n }\n\n function handleError(_error) {\n console.error(_error);\n\n error = _error;\n }\n\n function discardError() {\n error = null;\n }\n\n function loadBoard() {\n discardError();\n discardWarnings();\n\n loading = true;\n\n return Promise.all([\n fetchBoard(),\n loginCheck(),\n fetchCards(filter)\n ]).then(_ => {\n discardError();\n }).catch(error => {\n handleError(error);\n }).finally(() => {\n loading = false;\n });\n }\n\n function setupHooks() {\n\n const poll = localStore.get(POLL_KEY, true);\n\n const teardownHooks = [\n\n // poll for issue updates every three seconds\n poll && periodic(pollUpdates, 1000 * 3),\n\n // check login every 1 minutes\n poll && periodic(loginCheck, 1000 * 60 * 1),\n\n // hook into history changes\n history.onPop(() => {\n const newFilter = parseSearchFilter();\n\n filterChanged(newFilter, false);\n })\n ];\n\n return () => teardownHooks.forEach(fn => fn && fn());\n }\n\n onMount(() => {\n loadBoard();\n setupHooks();\n });\n\n function applyFilter(qualifier, value, add) {\n\n if (/[\\s:]+/.test(value)) {\n value = '\"' + value + '\"';\n }\n\n const criteria = value && `${qualifier}:${value}`;\n\n if (!criteria) {\n return;\n }\n\n let newFilter;\n\n const criteriaIndex = filter.indexOf(criteria);\n\n if (criteriaIndex === 0) {\n newFilter = filter.substring(criteria.length + 1);\n } else if (criteriaIndex > 0) {\n newFilter = filter.substring(0, criteriaIndex - 1) + filter.substring(criteriaIndex + criteria.length);\n } else {\n if (add && filter.trim()) {\n newFilter = `${filter} ${qualifier}:${value}`;\n } else {\n newFilter = criteria;\n }\n }\n\n return filterChanged(newFilter);\n }\n\n function filterChanged(value, pushHistory=true) {\n\n if (value === filter) {\n return;\n }\n\n const currentFilter = filter;\n\n filter = value;\n\n if (pushHistory) {\n history.push(`/board${buildQueryString(filter)}`);\n }\n\n if (currentFilter.trim() !== filter.trim()) {\n\n action('Fetching cards')(\n () => fetchCards(filter)\n );\n }\n }\n\n function parseSearchFilter() {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const queryString = window.location.search;\n\n const search = queryString.split(/[?&]/).find(param => /^s=/.test(param));\n\n if (!search) {\n return '';\n }\n\n return decodeURIComponent(search.split(/=/)[1]);\n }\n\n function buildQueryString(filter, separator='?') {\n if (filter) {\n return `${separator}s=${encodeURIComponent(filter)}`;\n } else {\n return '';\n }\n }\n\n function loginCheck() {\n return action('User login check')(\n () => api.getLoggedInUser().then(newUser => {\n\n if (user && !newUser) {\n window.location.reload();\n } else {\n user = newUser;\n }\n })\n );\n }\n\n function fetchBoard() {\n return api.getBoard().then(result => {\n columns = result.columns;\n name = result.name;\n });\n }\n\n function updateCards(_items, _cursor) {\n console.time('Taskboard#updateCards');\n\n const _itemsById = {};\n const _filterOptions = {};\n\n for (const columnItems of Object.values(_items)) {\n\n for (const item of columnItems) {\n const {\n id,\n user,\n milestone,\n assignees,\n labels,\n repository,\n requested_reviewers\n } = item;\n\n const repoOptions = _filterOptions['repo'] = _filterOptions['repo'] || {};\n\n repoOptions[repository.owner.login + '/' + repository.name] = true;\n\n if (milestone) {\n const milestoneOptions = _filterOptions['milestone'] = _filterOptions['milestone'] || {};\n\n milestoneOptions[milestone.title] = true;\n }\n\n if (user) {\n const authorOptions = _filterOptions['author'] = _filterOptions['author'] || {};\n\n authorOptions[user.login] = true;\n }\n\n assignees.forEach(assignee => {\n const assigneeOptions = _filterOptions['assignee'] = _filterOptions['assignee'] || {};\n\n assigneeOptions[assignee.login] = true;\n });\n\n if (requested_reviewers) {\n requested_reviewers.forEach(reviewer => {\n const reviewerOptions = _filterOptions['reviewer'] = _filterOptions['reviewer'] || {};\n\n reviewerOptions[reviewer.login] = true;\n });\n }\n\n labels.forEach(label => {\n\n if (!label.column_label) {\n const labelOptions = _filterOptions['label'] = _filterOptions['label'] || {};\n\n labelOptions[label.name] = true;\n }\n });\n\n _itemsById[id] = item;\n }\n\n }\n\n items = _items;\n itemsById = _itemsById;\n filterOptions = Object.entries(_filterOptions).reduce((opts, entry) => {\n\n const [ key, value ] = entry;\n\n opts[key] = Object.keys(value);\n\n return opts;\n }, {});\n\n cursor = _cursor;\n console.timeEnd('Taskboard#updateCards');\n }\n\n function fetchCards(newFilter) {\n\n updating++;\n\n return api.listCards(newFilter).then(result => {\n\n // do not apply updates for outdated filters\n if (newFilter !== filter) {\n return;\n }\n\n const {\n items,\n cursor\n } = result;\n\n updateCards(items, cursor);\n }).finally(() => updating--);\n }\n\n\n function pollUpdates() {\n\n if (updating) {\n return;\n }\n\n const currentFilter = filter;\n\n return action('Checking for updates', { display: false })(\n () => api.listUpdates(currentFilter, cursor).then(updates => {\n\n if (!updates.length) {\n return;\n }\n\n if (currentFilter !== filter) {\n return;\n }\n\n const {\n items: _items,\n itemsById: _itemsById,\n cursor: _cursor\n } = applyUpdates(updates, items, itemsById);\n\n items = _items;\n itemsById = _itemsById;\n cursor = _cursor;\n })\n );\n }\n\n function applyUpdates(updates, items, itemsById) {\n\n const cursor = updates[updates.length - 1].id;\n\n updates.forEach(update => {\n const {\n type,\n issue\n } = update;\n\n const {\n id\n } = issue;\n\n const from = itemsById[id];\n\n const to = type !== 'remove' && issue;\n\n items = {\n ...items,\n ...moveItem(items, issue, from, to)\n };\n\n // remove from index\n if (type === 'remove') {\n const {\n [id]: removedItem,\n ...remainingItems\n } = itemsById;\n\n itemsById = remainingItems;\n } else {\n\n // update in index\n itemsById = {\n ...itemsById,\n [id]: issue\n };\n }\n });\n\n return {\n cursor,\n itemsById,\n items\n };\n }\n\n const drake = Dragula({\n isContainer: (el) => {\n return el.matches('[data-column-id]');\n }\n });\n\n function getCardId(el) {\n const dataset = el.dataset;\n return dataset.cardId;\n }\n\n function getCardOrder(el) {\n const dataset = el.dataset;\n return parseFloat(dataset.cardOrder);\n }\n\n function getColumnId(el) {\n const dataset = el.dataset;\n return dataset.columnId;\n }\n\n function checkCancel(event) {\n if (event.key === 'Escape') {\n drake.cancel(true);\n }\n }\n\n drake.on('drag', () => {\n document.addEventListener('keydown', checkCancel);\n });\n\n drake.on('dragend', () => {\n document.removeEventListener('keydown', checkCancel);\n });\n\n drake.on('drop', (el, target, source, nextEl) => {\n const cardId = getCardId(el);\n const cardOrder = getCardOrder(el);\n\n const previousEl = el.previousElementSibling;\n\n const nextOrder = nextEl && getCardOrder(nextEl);\n const previousOrder = previousEl && getCardOrder(previousEl);\n\n const newOrder =\n previousOrder && nextOrder\n ? (previousOrder + nextOrder) / 2\n : previousOrder\n ? previousOrder + 731241.218\n : nextOrder\n ? nextOrder - 811231.691\n : -71271.88455;\n\n handleCardDrop(\n itemsById[cardId],\n {\n order: cardOrder,\n column: getColumnId(source)\n },\n {\n order: newOrder,\n column: getColumnId(target)\n }\n );\n\n });\n\n function handleCardDrop(card, from, to) {\n\n const { before, after } = moveCard(card, from, to);\n\n return api.moveIssue(\n card.id,\n to.column,\n before && before.id,\n after && after.id\n ).catch(err => {\n console.warn('reverting card movement', err);\n\n accessNotification = user ? 'forbidden' : 'authentication-required';\n\n setTimeout(() => {\n accessNotification = false;\n }, 8000);\n\n moveCard(card, to, from);\n });\n }\n\n function removeItem(item, list = []) {\n const { id } = item;\n\n return list.filter(existing => existing.id !== id);\n }\n\n function insertItem(item, order, list = []) {\n const insertIdx = list.findIndex(existing => existing.order > order);\n\n if (insertIdx === -1) {\n return [ ...list, item ];\n }\n\n return [\n ...list.slice(0, insertIdx),\n item,\n ...list.slice(insertIdx)\n ];\n\n }\n\n function moveCard(card, from, to) {\n\n // temporarily update card with new column and ordering\n card.column = to.column;\n card.order = to.order;\n\n const updatedItems = moveItem(items, card, from, to);\n\n items = {\n ...items,\n ...updatedItems\n };\n\n const targetColumn = updatedItems[to.column];\n\n const cardIndex = targetColumn.findIndex(el => el.id === card.id);\n\n return {\n after: targetColumn[cardIndex - 1],\n before: targetColumn[cardIndex + 1]\n };\n }\n\n function moveItem(items, item, from, to) {\n\n const oldColumn = from && from.column;\n\n const newColumn = to && to.column;\n const newOrder = to && to.order;\n\n // remove from old column\n if (oldColumn) {\n const updatedColumn = removeItem(item, items[oldColumn]);\n\n items = {\n ...items,\n [oldColumn]: updatedColumn\n };\n }\n\n // add to new column\n if (newColumn) {\n const updatedColumn = insertItem(item, newOrder, items[newColumn]);\n\n items = {\n ...items,\n [newColumn]: updatedColumn\n };\n }\n\n return items;\n }\n\n function toggleCollapse(column) {\n\n localCollapsed = {\n ...localCollapsed,\n [column.name]: !collapsed[column.name]\n };\n }\n\n function isClosingPull(item) {\n return isPull(item) && isOpenOrMerged(item) && item.links.some(link => {\n return isClosingLink(link) && itemsById[link.target.id];\n });\n }\n\n function checkRender(columnName) {\n\n return throttle(function(event) {\n\n const node = event.target;\n\n const {\n scrollHeight,\n scrollTop,\n offsetHeight\n } = node;\n\n if (scrollTop + offsetHeight > scrollHeight * .95) {\n\n const columnItems = shownItems[columnName] || [];\n\n const columnRenderedCount = renderCountByColumn[columnName] || DEFAULT_PER_COLUMN_RENDER_COUNT;\n\n if (columnRenderedCount < columnItems.length) {\n\n renderCountByColumn = {\n ...renderCountByColumn,\n [columnName]: columnRenderedCount + DEFAULT_PER_COLUMN_RENDER_COUNT / 5\n };\n }\n }\n }, 5);\n }\n\n</script>\n\n<style lang=\"scss\">.taskboard {\n height: 100vh;\n display: flex;\n flex-direction: column; }\n\n@media all and (max-width: 600px) {\n :global(.board-filter) {\n width: 100% !important; }\n .brand-name {\n display: none; }\n :global(.navbar) .form-inline {\n flex: 1 !important; }\n :global(.navbar) .logo {\n width: 32px;\n height: 32px; } }\n\n.taskboard-error {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center; }\n .taskboard-error p {\n font-size: 1.3em;\n margin-top: 1.7rem;\n margin-bottom: 3rem;\n color: #495057; }\n\n.taskboard-board {\n display: flex;\n flex: 1;\n width: 100%;\n padding: 3px;\n padding-top: 0;\n overflow-x: auto; }\n\n.taskboard-column {\n display: flex;\n flex-direction: column;\n min-width: 250px;\n flex: 1;\n border-radius: 2px;\n margin: 3px;\n background: #ebecf0; }\n .taskboard-column.collapsed {\n line-height: 2em;\n min-width: 42px;\n flex: 0; }\n\n.taskboard-column-items {\n flex: 1;\n overflow-y: auto;\n padding: 3px 10px 10px; }\n\n.taskboard-column-header {\n text-align: center;\n line-height: 2.4em;\n font-size: 1.25em;\n color: inherit; }\n\n.taskboard-column-collapse {\n color: #adb5bd;\n float: left;\n padding: 0 12px;\n line-height: 2.4em;\n margin-right: -20px;\n font-size: 1.2rem; }\n\n.taskboard-column-collapse:hover {\n color: #495057; }\n\n.taskboard-column.collapsed .taskboard-column-collapse {\n float: unset;\n padding: 0 12px;\n margin: 0; }\n\n.taskboard-column.collapsed .taskboard-column-header {\n display: flex;\n flex-direction: column;\n flex: 1; }\n\n.taskboard-column.collapsed .taskboard-column-name,\n.taskboard-column.collapsed .taskboard-column-issue-count {\n transform: rotate(-180deg);\n writing-mode: vertical-rl; }\n\n.taskboard-column.collapsed .taskboard-column-name {\n order: 2; }\n\n.taskboard-column.collapsed .taskboard-column-issue-count {\n padding: .5em 0;\n order: 0; }\n\n.taskboard-column-name {\n color: #424657; }\n\n.taskboard-column-issue-count {\n color: #37ACC8;\n display: inline-block;\n padding: 0 .25em; }\n\n.logo {\n margin-right: 7px; }\n\n.vertical-divider {\n position: relative;\n top: -0.06em;\n display: inline-block;\n width: 1px;\n height: 0.9em;\n margin: 0 8px;\n vertical-align: middle;\n background: #dee2e6; }\n\n.muted {\n color: #6c757d; }\n\n.taskboard {\n position: relative; }\n\n.powered-by-logo {\n position: absolute;\n bottom: 18px;\n right: 12px;\n opacity: .5;\n transition: opacity .3s;\n z-index: 10; }\n .powered-by-logo:hover {\n opacity: 1; }\n</style>\n\n<svelte:head>\n {#if !loading}\n <title>{ name } · Wuffle Board</title>\n {/if}\n</svelte:head>\n\n<div class=\"taskboard\">\n\n <Loader shown={ loading }>\n <img src={ loaderImage } width=\"64\" alt=\"Loading\" />\n </Loader>\n\n {#if error}\n <div class=\"taskboard-error\">\n\n <img src={ errorImage } width=\"128\" alt=\"An error occured\" />\n\n <p>We could not load the board.</p>\n\n <button class=\"btn btn-primary\" on:click={ () => loadBoard() }>\n Retry\n </button>\n </div>\n {/if}\n\n <Notifications>\n {#if !error}\n {#each warnings as warning}\n <Notification type=\"warning\" message=\"{ warning.action } failed\">\n Could not reach the board back-end. <a href>Reload board.</a>\n </Notification>\n {/each}\n {/if}\n\n {#if accessNotification}\n <Notification type=\"error\" message=\"Failed to move card\">\n {#if accessNotification === 'forbidden'}\n It seems like you do not have write access to the underlying GitHub repository.\n {:else}\n Please <a href=\"/wuffle/login\" aria-label=\"Login via GitHub\">login via GitHub</a> to interact with cards.\n {/if}\n </Notification>\n {/if}\n </Notifications>\n\n <a class=\"powered-by-logo\" href=\"https://wuffle.dev\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"Powered by Wuffle Board\">\n <img src={ wuffleLogo } width=\"20\" height=\"20\" alt=\"Wuffle logo\" class=\"logo\">\n </a>\n\n <nav class=\"navbar navbar-expand navbar-light taskboard-header\">\n\n <a class=\"navbar-brand mb-0 h1\" href=\"/\" aria-label={ name }>\n <img src=\"./logo.svg\" width=\"20\" height=\"20\" alt=\"\" class=\"logo\">\n <span class=\"brand-name\">{ name }</span>\n </a>\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\"#{navId}\" aria-controls={navId} aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n\n <div class=\"collapse navbar-collapse\" id={navId}>\n <ul class=\"navbar-nav mr-auto\">\n </ul>\n\n <form class=\"form-inline my-2 my-lg-0\" on:submit={ (e) => e.preventDefault() }>\n <BoardFilter value={ filter } completionOptions={ filterOptions } onChange={ filterChanged } />\n </form>\n\n <div class=\"vertical-divider\"></div>\n\n <div class=\"taskboard-header-login\">\n {#if user}\n <a href=\"/wuffle/logout\" aria-label=\"Logout\">\n <Avatar title={ `Logout ${user.login}` } rounded>\n <img src=\"{ user.avatar_url }&s=40\" style=\"max-width: 100%\" alt=\"Logged in user avatar\" />\n </Avatar>\n </a>\n {:else}\n <a href=\"/wuffle/login\" aria-label=\"Login with GitHub\">\n <Avatar title=\"Login with GitHub\" rounded>\n <svg height=\"1.3em\" fill=\"currentColor\" viewBox=\"0 0 12 16\" version=\"1.1\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 14.002a.998.998 0 0 1-.998.998H1.001A1 1 0 0 1 0 13.999V13c0-2.633 4-4 4-4s.229-.409 0-1c-.841-.62-.944-1.59-1-4 .173-2.413 1.867-3 3-3s2.827.586 3 3c-.056 2.41-.159 3.38-1 4-.229.59 0 1 0 1s4 1.367 4 4v1.002z\"></path></svg>\n </Avatar>\n </a>\n {/if}\n </div>\n </div>\n </nav>\n\n <main class=\"taskboard-board\">\n\n {#if !error}\n {#each columns as column }\n <div class=\"taskboard-column\" class:collapsed={ collapsed[column.name] }>\n <div class=\"taskboard-column-header\">\n <button\n class=\"taskboard-column-collapse btn btn-link\"\n title=\"{ collapsed[column.name] ? 'Expand' : 'Collapse' } column\"\n on:click={ (e) => e.preventDefault() || toggleCollapse(column) }\n >\n {#if collapsed[column.name] }\n <svg viewBox=\"64 64 896 896\" height=\"1em\" aria-hidden=\"true\" fill=\"currentColor\"><path d=\"M602 548c0 4 4 8 8 8h186v74c0 6 7 9 11 6l150-120c3-3 3-8 0-11L807 386c-4-4-11-1-11 5v75H609c-4 0-7 3-7 7zM68 514l149 122c4 3 11 0 11-6v-76h186c4 0 8-2 8-6v-77c0-4-4-7-8-7H228v-75c0-6-7-9-11-5L68 503c-4 3-4 8 0 11z\"/></svg>\n {:else}\n <svg viewBox=\"64 64 896 896\" height=\"1em\" aria-hidden=\"true\" fill=\"currentColor\"><path d=\"M605 515l149 122c5 3 12 0 12-6v-76h186c4 0 7-2 7-6v-77c0-4-3-7-7-7H766v-75c0-6-7-9-12-5L605 504c-4 3-4 8 0 11zM65 547c0 4 3 8 7 8h186v74c0 6 7 9 12 6l149-120c4-3 4-8 0-11L270 385c-5-4-12-1-12 5v75H72c-4 0-7 3-7 7z\"/></svg>\n {/if}\n </button>\n <span class=\"taskboard-column-name\">\n { column.name }\n </span>\n <span class=\"taskboard-column-issue-count\">\n { (shownItems[column.name] || []).length }\n </span>\n </div>\n\n {#if !collapsed[column.name] }\n <div class=\"taskboard-column-items\"\n data-column-id={ column.name }\n on:scroll={ checkRender(column.name) }>\n\n {#each (renderedItems[column.name] || []) as item, index (item.id) }\n <div\n class=\"card-container\"\n data-card-id={ item.id }\n data-card-order={ item.order }\n >\n <Card\n item={item}\n onSelect={ applyFilter }\n />\n </div>\n {/each}\n\n </div>\n {/if}\n </div>\n {/each}\n {/if}\n </main>\n</div>",
30
- "<script>\n export let rounded = false;\n export let title = '';\n</script>\n\n<style lang=\"scss\">.avatar {\n position: relative;\n display: inline-block;\n overflow: hidden;\n color: #fff;\n white-space: nowrap;\n text-align: center;\n vertical-align: middle;\n background: #ccc;\n width: 32px;\n height: 32px;\n line-height: 32px; }\n\n.avatar-shadow {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n box-shadow: inset 0 0 2px 0 rgba(0, 0, 0, 0.1); }\n\n.avatar-rounded {\n border-radius: 50%; }\n .avatar-rounded .avatar-shadow {\n border-radius: 50%; }\n</style>\n\n<span class=\"avatar\" title={ title } class:avatar-rounded={ rounded }>\n <slot></slot>\n\n <div class=\"avatar-shadow\"></div>\n</span>",
31
- "<style lang=\"scss\">.icon {\n margin-right: 2px;\n color: #1d76db; }\n</style>\n\n<svg class=\"icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 12 16\" version=\"1.1\" aria-hidden=\"true\">\n\n <path fill=\"currentColor\" stroke=\"#1d76db\" d=\"M1 15V4l5-3 5 3v11l-5-4-5 4z\" stroke-width=\"1.5\" />\n\n</svg>",
32
- "<script>\n export { className as class }; let className = '';\n\n export let hints;\n export let selectedHint;\n\n export let onHover;\n export let onBlur;\n export let onSelect;\n\n export let maxElements;\n</script>\n\n<style lang=\"scss\">ul {\n list-style: none;\n margin: 0;\n padding: 0; }\n\nli {\n padding: 0 .8rem;\n line-height: 2em; }\n li.selectable {\n cursor: pointer; }\n li.selectable:hover, li.selectable.active {\n background: rgba(55, 172, 200, 0.1); }\n li.text {\n color: #6c757d; }\n\n.matched {\n background: rgba(55, 172, 200, 0.2);\n color: #2c8aa0; }\n</style>\n\n<ul class={ className }>\n {#each hints as hint, idx}\n {#if idx < maxElements || (selectedHint && selectedHint.name === hint.name) }\n <li\n class:active={ selectedHint && selectedHint.name === hint.name }\n class=\"selectable\"\n on:mouseover={ () => onHover(hint) }\n on:mouseout={ () => onBlur(hint) }\n on:mousedown={ (event) => { event.preventDefault(); onSelect(hint); } }\n >{#each hint.parts as part}<span class:matched={ part.matched }>{ part.text }</span>{/each}</li>\n {/if}\n {/each}\n\n {#if hints.length > maxElements}\n <li class=\"text\">...</li>\n {/if}\n</ul>",
33
- "<script>\n export { className as class }; let className = '';\n\n export let name;\n</script>\n\n<style>\n .icon {\n vertical-align: initial;\n }\n</style>\n\n<i class=\"icon { className }\" aria-label=\"icon: { name }\">\n <slot></slot>\n</i>",
34
- "<style lang=\"scss\">.icon {\n margin-right: 2px; }\n .icon.issue.open, .icon.depends-on.closed {\n color: #28a745; }\n .icon.issue.closed, .icon.depends-on {\n color: #cb2431; }\n .icon.linked-to {\n color: #37ACC8; }\n</style>\n\n<script>\n export let name;\n export let state = '';\n export { className as class }; let className = '';\n</script>\n\n{#if name === 'issue'}\n\n {#if state !== 'closed'}\n <svg class=\"icon issue { className }\" class:open={ state === 'open' } width=\"1em\" height=\"1em\" viewBox=\"0 0 14 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path>\n </svg>\n {:else}\n <svg class=\"icon issue closed { className }\" width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M7 10h2v2H7v-2zm2-6H7v5h2V4zm1.5 1.5l-1 1L12 9l4-4.5-1-1L12 7l-1.5-1.5zM8 13.7A5.71 5.71 0 0 1 2.3 8c0-3.14 2.56-5.7 5.7-5.7 1.83 0 3.45.88 4.5 2.2l.92-.92A6.947 6.947 0 0 0 8 1C4.14 1 1 4.14 1 8s3.14 7 7 7 7-3.14 7-7l-1.52 1.52c-.66 2.41-2.86 4.19-5.48 4.19v-.01z\"></path>\n </svg>\n {/if}\n\n{/if}\n\n{#if name === 'depends-on'}\n\n {#if state === 'closed'}\n <svg class=\"icon depends-on closed { className }\" width=\"1em\" height=\"1em\" viewBox=\"0 0 12 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path>\n </svg>\n {:else}\n <svg class=\"icon depends-on { className }\" width=\"1em\" height=\"1em\" viewBox=\"0 0 14 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm0 1.3c1.3 0 2.5.44 3.47 1.17l-8 8A5.755 5.755 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zm0 11.41c-1.3 0-2.5-.44-3.47-1.17l8-8c.73.97 1.17 2.17 1.17 3.47 0 3.14-2.56 5.7-5.7 5.7z\"></path>\n </svg>\n {/if}\n\n{/if}\n\n\n{#if name === 'linked-to'}\n <svg class=\"icon linked-to { className }\" width=\"1em\" height=\"1em\" viewBox=\"0 0 14 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z\"></path>\n </svg>\n{/if}\n\n\n{#if name === 'epic'}\n <svg class=\"icon epic { className}\" width=\"1em\" height=\"1em\" viewBox=\"0 0 12 16\" version=\"1.1\" aria-hidden=\"true\" stroke=\"currentColor\">\n <path fill=\"none\" fill-rule=\"evenodd\" transform=\"rotate(-89.89169311523438 5.963454723358154,7.855281829833984)\"\n d=\"m-1.079501,2.743426l10.564429,0l3.521483,5.111845l-3.521483,5.111868l-10.564429,0l3.521482,-5.111868l-3.521482,-5.111845z\" stroke-width=\"1.5\" />\n </svg>\n{/if}\n\n",
35
- "<style lang=\"scss\">.loader {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n z-index: 200; }\n .loader > .content {\n opacity: 0.3;\n transition: opacity 0.5s; }\n .loader.shown > .content {\n opacity: 1;\n animation: pulsate 1s infinite;\n animation-timing-function: ease-in-out; }\n .loader:not(.shown) > .content {\n opacity: 0;\n pointer-events: none; }\n\n@keyframes pulsate {\n 0% {\n transform: scale(1);\n opacity: 1; }\n 50% {\n transform: scale(0.9);\n opacity: 0.8; }\n 100% {\n transform: scale(1);\n opacity: 1; } }\n</style>\n\n<script>\n export { className as class }; let className = '';\n export let shown = true;\n</script>\n\n<div class=\"loader { className }\" class:shown={ shown }>\n <div class=\"content\">\n <slot></slot>\n </div>\n</div>",
36
- "<script>\n import { fly } from 'svelte/transition';\n\n export let message;\n\n export let type = 'info';\n</script>\n\n<style lang=\"scss\">.notification {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n color: #6c757d;\n font-size: 14px;\n font-variant: tabular-nums;\n line-height: 1.5;\n list-style: none;\n width: 384px;\n max-width: calc(100vw - 32px);\n padding: 16px 24px;\n overflow: hidden;\n line-height: 1.5;\n background: #fff;\n border-radius: 3px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n border-left: solid 4px #8AD6E8; }\n .notification.error {\n border-left-color: #dc3545; }\n .notification.warning {\n border-left-color: #FFC541; }\n\n.notification + .notification {\n margin-top: 16px; }\n\n.heading {\n color: #212529;\n font-weight: normal;\n font-size: 1.2em;\n margin-bottom: 5px; }\n</style>\n\n<div\n class=\"notification\"\n class:error={ type === 'error' }\n class:warning={ type === 'warning' }\n transition:fly\n>\n <div class=\"heading\">{ message }</div>\n <div class=\"detail\">\n <slot></slot>\n </div>\n</div>",
37
- "<style lang=\"scss\">.notifications {\n position: fixed;\n z-index: 1010;\n top: 24px;\n right: 24px; }\n</style>\n\n<div class=\"notifications\">\n <slot></slot>\n</div>",
38
- "<script>\n export let item;\n\n $: merged = item.merged;\n $: open = item.state === 'open';\n $: closed = item.state === 'closed';\n</script>\n\n<style lang=\"scss\">.pull-request-icon {\n margin-right: 1px; }\n .pull-request-icon.open {\n color: #28a745; }\n .pull-request-icon.closed {\n color: #cb2431; }\n .pull-request-icon.merged {\n color: #6f42c1; }\n</style>\n\n{#if merged}\n\n <svg class=\"pull-request-icon\" class:merged={ merged } width=\"1em\" height=\"1em\" viewBox=\"0 0 12 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M10 7c-.73 0-1.38.41-1.73 1.02V8C7.22 7.98 6 7.64 5.14 6.98c-.75-.58-1.5-1.61-1.89-2.44A1.993 1.993 0 0 0 2 .99C.89.99 0 1.89 0 3a2 2 0 0 0 1 1.72v6.56c-.59.35-1 .99-1 1.72 0 1.11.89 2 2 2a1.993 1.993 0 0 0 1-3.72V7.67c.67.7 1.44 1.27 2.3 1.69.86.42 2.03.63 2.97.64v-.02c.36.61 1 1.02 1.73 1.02 1.11 0 2-.89 2-2 0-1.11-.89-2-2-2zm-6.8 6c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm8 6c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"></path>\n </svg>\n\n{:else}\n <svg class=\"pull-request-icon\" class:closed={ closed } class:open={ open } width=\"1em\" height=\"1em\" viewBox=\"0 0 12 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\">\n <path fill-rule=\"evenodd\" d=\"M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0 0 10 15a1.993 1.993 0 0 0 1-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v6.56A1.993 1.993 0 0 0 2 15a1.993 1.993 0 0 0 1-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"></path>\n </svg>\n{/if}",
39
- "<style>\n .octicon {\n height: 1em;\n width: 1em;\n vertical-align: middle;\n }\n</style>\n\n<svg class=\"octicon\" viewBox=\"0 0 16 16\" version=\"1.1\" aria-hidden=\"true\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0 0 13 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 0 0 0-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\" fill=\"currentColor\"></path></svg>",
40
- "<script>\n function isLight(color) {\n /* eslint no-bitwise: \"off\" */\n\n color = +('0x' + color.slice(1).replace(color.length < 5 && /./g, '$&$&'));\n\n const r = color >> 16,\n g = (color >> 8) & 255,\n b = color & 255;\n\n const hsp = Math.sqrt(\n 0.299 * (r * r) +\n 0.587 * (g * g) +\n 0.114 * (b * b)\n );\n\n return hsp > 127.5;\n }\n\n export let name;\n export let color = '';\n export { className as class }; let className = '';\n\n export let onClick;\n export let href = null;\n\n $: inverted = color && isLight(color);\n</script>\n\n{#if href}\n <a\n href={ href }\n target=\"_blank\"\n title={ name }\n rel=\"noopener noreferrer\"\n class:inverted={ inverted }\n class=\"tag { className }\"\n style=\"background-color: { color }\"\n on:click={ onClick }\n >{ name }</a>\n{:else}\n <span\n class:inverted={ inverted }\n class=\"tag { className }\"\n class:clickable={ onClick }\n style=\"background-color: { color }\"\n on:click={ onClick }\n title={ name }\n >{ name }</span>\n{/if}\n\n<style lang=\"scss\">.tag {\n list-style: none;\n display: inline-block;\n height: auto;\n margin: 0 4px 4px 0;\n padding: 1px 7px;\n font-size: 12px;\n font-weight: 500;\n line-height: 20px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: white;\n background: #fafafa;\n border-radius: 4px;\n text-decoration: none; }\n .tag.inverted {\n color: #333; }\n\n:not(a.tag, .tag.clickable) {\n cursor: default; }\n</style>"
41
- ],
42
- "names": [],
43
- "mappings": "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"
44
- }
File without changes