tosijs-ui 1.0.8 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -11,16 +11,16 @@
11
11
  "/*#\n# carousel\n\n```html\n<xin-carousel arrows dots max-visible-items=2 auto=2 snap-delay=4 snap-duration=0.5 loop>\n <xin-icon icon=\"tosiFavicon\" class=\"thing\"></xin-icon>\n <xin-icon icon=\"tosi\" class=\"thing\"></xin-icon>\n <xin-icon icon=\"tosiUi\" class=\"thing\"></xin-icon>\n <xin-icon icon=\"tosiPlatform\" class=\"thing\"></xin-icon>\n <xin-icon icon=\"tosiXr\" class=\"thing\"></xin-icon>\n <xin-icon icon=\"blueprint\" class=\"thing\"></xin-icon>\n <xin-icon icon=\"cmy\" class=\"thing\"></xin-icon>\n <xin-icon icon=\"rgb\" class=\"thing\"></xin-icon>\n</xin-carousel>\n```\n```css\n.thing {\n --xin-icon-size: 160px;\n height: 160px;\n margin: 30px 0 70px;\n position: relative;\n}\n\n.thing::after {\n content: attr(icon);\n color: white;\n position: absolute;\n bottom: -50px;\n left: 50%;\n padding: 5px 15px;\n transform: translateX(-50%);\n filter: drop-shadow(0 1px 1px #0008);\n background: #0004;\n border-radius: 5px;\n}\n\n.preview xin-carousel {\n background: #8883;\n margin: 10px;\n border-radius: 10px;\n}\n```\n\nThis is a minimalist carousel component that supports the usual stuff.\n\n## Attributes\n\n- `arrows` (boolean, false by default) shows/hides the arrow paging controls\n- `dots` (boolean, false by default) shows/hides the dot progress indicators\n- `max-visible-items` (number, 1 by default) determines how many items are shown at once.\n- `snap-duration` (number, 0.25 [seconds] by default) determines the time taken to scroll / snap scroll.\n- `snap-delay` (number, 0.1 [seconds] by default)\n- `loop` (boolean, false by default) causes next/previous buttons to loop\n- `auto` (number, 0 [seconds] by default) if > 0, automatically advances after that many seconds (always loops!)\n\n<xin-css-var-editor element-selector=\"xin-carousel\"></xin-css-var-editor>\n*/\n\nimport {\n Component as WebComponent,\n ElementCreator,\n elements,\n vars,\n} from 'tosijs'\nimport { icons } from './icons'\n\nconst { button, slot, div } = elements\n\ninterface CarouselParts {\n [key: string]: HTMLElement\n back: HTMLButtonElement\n forward: HTMLButtonElement\n}\n\nexport class XinCarousel extends WebComponent {\n arrows = false\n dots = false\n loop = false\n maxVisibleItems = 1\n snapDelay = 0.1\n snapDuration = 0.25\n auto = 0\n\n private lastAutoAdvance = Date.now()\n private interval?: Timer\n\n private autoAdvance = () => {\n if (this.auto > 0 && this.auto * 1000 < Date.now() - this.lastAutoAdvance) {\n this.forward()\n }\n }\n\n private _page = 0\n\n get page(): number {\n return this._page\n }\n\n set page(p: number) {\n const { scroller, back, forward } = this.parts as CarouselParts\n if (this.lastPage <= 0) {\n forward.disabled = back.disabled = true\n p = 0\n } else {\n p = Math.max(0, Math.min(this.lastPage, p))\n p = isNaN(p) ? 0 : p\n }\n if (this._page !== p) {\n this._page = isNaN(p) ? 0 : p\n this.animateScroll(this._page * scroller.offsetWidth)\n back.disabled = this.page <= 0 && !this.loop\n forward.disabled = this.page >= this.lastPage && !this.loop\n }\n }\n\n get visibleItems(): HTMLElement[] {\n return [...this.children].filter(\n (element) => getComputedStyle(element).display !== 'none'\n ) as HTMLElement[]\n }\n\n get lastPage(): number {\n return Math.max(\n Math.ceil(this.visibleItems.length / (this.maxVisibleItems || 1)) - 1,\n 0\n )\n }\n\n static styleSpec = {\n ':host': {\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n },\n ':host svg': {\n height: vars.carouselIconSize,\n },\n ':host button': {\n outline: 'none',\n border: 'none',\n boxShadow: 'none',\n background: 'transparent',\n color: vars.carouselButtonColor,\n padding: 0,\n },\n ':host::part(back), :host::part(forward)': {\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: vars.carouseButtonWidth,\n zIndex: 2,\n },\n ':host::part(back)': {\n left: 0,\n },\n ':host::part(forward)': {\n right: 0,\n },\n ':host button:disabled': {\n opacity: 0.5,\n pointerEvents: 'none',\n },\n ':host button:hover': {\n color: vars.carouselButtonHoverColor,\n },\n ':host button:active': {\n color: vars.carouselButtonActiveColor,\n },\n ':host::part(pager)': {\n position: 'relative',\n },\n ':host::part(scroller)': {\n overflow: 'auto hidden',\n position: 'relative',\n },\n ':host::part(grid)': {\n display: 'grid',\n justifyItems: 'center',\n },\n ':host *::-webkit-scrollbar, *::-webkit-scrollbar-thumb': {\n display: 'none',\n },\n ':host .dot': {\n background: vars.carouselButtonColor,\n borderRadius: vars.carouselDotSize,\n height: vars.carouselDotSize,\n width: vars.carouselDotSize,\n transition: vars.carouselDotTransition,\n },\n ':host .dot:not(.current):hover': {\n background: vars.carouselButtonHoverColor,\n height: vars.carouselDotSize150,\n width: vars.carouselDotSize150,\n margin: vars.carouselDotSize_25,\n },\n ':host .dot:not(.current):active': {\n background: vars.carouselButtonActiveColor,\n },\n ':host .dot.current': {\n background: vars.carouselDotCurrentColor,\n },\n ':host::part(progress)': {\n display: 'flex',\n gap: vars.carouselDotSpacing,\n justifyContent: 'center',\n padding: vars.carouselProgressPadding,\n },\n }\n\n easing = (t: number) => {\n return Math.sin(t * Math.PI * 0.5)\n }\n\n indicateCurrent = () => {\n const { scroller, progress } = this.parts as CarouselParts\n const page = scroller.scrollLeft / scroller.offsetWidth\n ;[...progress.children].forEach((dot, index) => {\n dot.classList.toggle(\n 'current',\n Math.floor(index / this.maxVisibleItems - page) === 0\n )\n })\n this.lastAutoAdvance = Date.now()\n clearTimeout(this.snapTimer)\n this.snapTimer = setTimeout(this.snapPosition, this.snapDelay * 1000)\n }\n\n snapPosition = () => {\n const { scroller } = this.parts as CarouselParts\n const currentPosition = Math.round(\n scroller.scrollLeft / scroller.offsetWidth\n )\n if (currentPosition !== this.page) {\n this.page =\n currentPosition > this.page\n ? Math.ceil(currentPosition)\n : Math.floor(currentPosition)\n }\n this.lastAutoAdvance = Date.now()\n }\n\n back = () => {\n this.page = this.page > 0 ? this.page - 1 : this.lastPage\n }\n\n forward = () => {\n this.page = this.page < this.lastPage ? this.page + 1 : 0\n }\n\n handleDotClick = (event: Event) => {\n const { progress } = this.parts\n const index = [...progress.children].indexOf(event.target as HTMLElement)\n if (index > -1) {\n this.page = Math.floor(index / this.maxVisibleItems)\n }\n }\n\n private snapTimer: any\n private animationFrame: any\n animateScroll(position: number, startingPosition = -1, timestamp = 0) {\n cancelAnimationFrame(this.animationFrame)\n const { scroller } = this.parts\n if (startingPosition === -1) {\n startingPosition = scroller.scrollLeft\n timestamp = Date.now()\n this.animationFrame = requestAnimationFrame(() => {\n this.animateScroll(position, startingPosition, timestamp)\n })\n return\n }\n const elapsed = (Date.now() - timestamp) / 1000\n if (\n elapsed >= this.snapDuration ||\n Math.abs(scroller.scrollLeft - position) < 2\n ) {\n scroller.scrollLeft = position\n this.animationFrame = null\n } else {\n scroller.scrollLeft =\n startingPosition +\n this.easing(elapsed / this.snapDuration) * (position - startingPosition)\n this.animationFrame = requestAnimationFrame(() => {\n this.animateScroll(position, startingPosition, timestamp)\n })\n }\n }\n\n content = () => [\n div(\n { part: 'pager' },\n button({ title: 'previous slide', part: 'back' }, icons.chevronLeft()),\n div(\n { title: 'slides', role: 'group', part: 'scroller' },\n div({ part: 'grid' }, slot())\n ),\n button({ title: 'next slide', part: 'forward' }, icons.chevronRight())\n ),\n div({ title: 'choose slide to display', role: 'group', part: 'progress' }),\n ]\n\n constructor() {\n super()\n\n this.initAttributes(\n 'dots',\n 'arrows',\n 'maxVisibleItems',\n 'snapDuration',\n 'loop',\n 'auto'\n )\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n this.ariaRoleDescription = 'carousel'\n this.ariaOrientation = 'horizontal'\n this.ariaReadOnly = 'true'\n\n const { back, forward, scroller, progress } = this.parts\n back.addEventListener('click', this.back)\n forward.addEventListener('click', this.forward)\n scroller.addEventListener('scroll', this.indicateCurrent)\n progress.addEventListener('click', this.handleDotClick)\n\n this.lastAutoAdvance = Date.now()\n this.interval = setInterval(this.autoAdvance, 100)\n }\n\n disconnectedCallback() {\n clearInterval(this.interval)\n }\n\n render() {\n super.render()\n\n const { dots, arrows, visibleItems, lastPage } = this\n const { progress, back, forward, grid } = this.parts as CarouselParts\n\n visibleItems.forEach((item) => {\n item.role = 'group'\n })\n grid.style.gridTemplateColumns = `${\n 100 / this.maxVisibleItems / (1 + this.lastPage)\n }% `\n .repeat(visibleItems.length)\n .trim()\n grid.style.width = (1 + this.lastPage) * 100 + '%'\n progress.textContent = ''\n progress.append(\n ...visibleItems.map((_, index) =>\n button({ title: `item ${index + 1}`, class: 'dot' })\n )\n )\n\n this.indicateCurrent()\n progress.style.display = dots && lastPage > 0 ? '' : 'none'\n back.hidden = forward.hidden = !(arrows && lastPage > 0)\n }\n}\n\nexport const xinCarousel = XinCarousel.elementCreator({\n tag: 'xin-carousel',\n styleSpec: {\n ':host': {\n _carouselIconSize: 24,\n _carouselButtonColor: '#0004',\n _carouselButtonHoverColor: '#0006',\n _carouselButtonActiveColor: '#000c',\n _carouseButtonWidth: 48,\n _carouselDotCurrentColor: '#0008',\n _carouselDotSize: 8,\n _carouselDotSpacing: vars.carouselDotSize,\n _carouselProgressPadding: 12,\n _carouselDotTransition: '0.125s ease-in-out',\n },\n ':host:focus': {\n outline: 'none',\n boxShadow: 'none',\n },\n },\n}) as ElementCreator<XinCarousel>\n",
12
12
  "/*#\n# code\n\nAn [ACE Editor](https://ace.c9.io/) wrapper.\n\nSometimes, it's nice to be able to just toss a code-editor in a web-page.\n\n`<xin-code>`'s `value` is the code it contains. Its `mode` attribute sets the language, and you can further configure\nthe ACE editor instance via its `options` property.\n\n```html\n<xin-code style=\"width: 100%; height: 100%\" mode=\"css\">\nbody {\n box-sizing: border-box;\n}\n</xin-code>\n```\n\nThe `<xin-code>` element has an `editor` property that gives you its ACE editor instance,\nand an `ace` property that returns the `ace` module, giving you complete access to the\n[Ace API](https://ace.c9.io/api/index.html).\n*/\n\nimport { Component as WebComponent, ElementCreator } from 'tosijs'\nimport { scriptTag } from './via-tag'\n\nconst ACE_BASE_URL = 'https://cdnjs.cloudflare.com/ajax/libs/ace/1.23.2/'\nconst DEFAULT_THEME = 'ace/theme/tomorrow'\n\nconst getAce = async (): Promise<any> => {\n const { ace } = await scriptTag(`${ACE_BASE_URL}ace.min.js`)\n return ace\n}\n\nconst makeCodeEditor = async (\n codeElement: any,\n mode = 'html',\n options = {},\n theme = DEFAULT_THEME\n) => {\n const ace = await getAce()\n ace.config.set('basePath', ACE_BASE_URL)\n const editor = ace.edit(codeElement, {\n mode: `ace/mode/${mode}`,\n tabSize: 2,\n useSoftTabs: true,\n useWorker: false,\n ...options,\n })\n editor.setTheme(theme)\n return { ace, editor }\n}\n\nexport class CodeEditor extends WebComponent {\n private source = ''\n\n get value(): string {\n return this.editor === undefined ? this.source : this.editor.getValue()\n }\n\n set value(text: string) {\n if (this.editor === undefined) {\n this.source = text\n } else {\n this.editor.setValue(text)\n this.editor.clearSelection()\n this.editor.session.getUndoManager().reset()\n }\n }\n\n mode = 'javascript'\n disabled = false\n role = 'code editor'\n\n private _ace: any | undefined\n private _editor: any | undefined\n private _editorPromise: Promise<any> | undefined\n options: any = {}\n theme = DEFAULT_THEME\n\n get ace(): any {\n return this._ace\n }\n\n get editor(): any {\n return this._editor\n }\n\n static styleSpec = {\n ':host': {\n display: 'block',\n position: 'relative',\n width: '100%',\n height: '100%',\n },\n }\n\n constructor() {\n super()\n\n this.initAttributes('mode', 'theme', 'disabled')\n }\n\n onResize() {\n if (this.editor !== undefined) {\n this.editor.resize(true)\n }\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n if (this.source === '') {\n this.value = this.textContent !== null ? this.textContent.trim() : ''\n }\n\n if (this._editorPromise === undefined) {\n this._editorPromise = makeCodeEditor(\n this,\n this.mode,\n this.options,\n this.theme\n )\n this._editorPromise.then(({ ace, editor }) => {\n this._ace = ace\n this._editor = editor\n editor.setValue(this.source, 1)\n editor.clearSelection()\n editor.session.getUndoManager().reset()\n })\n }\n }\n\n render(): void {\n super.render()\n\n if (this._editorPromise !== undefined) {\n this._editorPromise.then(({ editor }) =>\n editor.setReadOnly(this.disabled)\n )\n }\n }\n}\n\nexport const codeEditor = CodeEditor.elementCreator({\n tag: 'xin-code',\n}) as ElementCreator<CodeEditor>\n",
13
13
  "/*#\n\n# color input field\n\nThis is a color input field that supports opacity\n\n```js\nconst colorInput = preview.querySelector('xin-color')\nconst circle = preview.querySelector('div')\n\ncolorInput.addEventListener('change', () => {\n circle.style.background = colorInput.value\n})\n```\n```html\n<xin-color value=\"red\"></xin-color>\n<div\n style=\"\n width: 200px;\n height: 200px;\n background: red;\n border-radius: 100px;\n \"\n></div>\n```\n\n\n<xin-css-var-editor element-selector=\"xin-color\"></xin-css-var-editor>\n*/\n\nimport {\n Component,\n ElementCreator,\n elements,\n Color,\n vars,\n PartsMap,\n} from 'tosijs'\n\nconst { input } = elements\n\nconst defaultColor = Color.fromCss('#8888')\n\ninterface ColorParts extends PartsMap {\n rgb: HTMLInputElement\n alpha: HTMLInputElement\n css: HTMLInputElement\n}\n\nclass ColorInput extends Component<ColorParts> {\n value = defaultColor.rgba\n color = defaultColor\n\n static styleSpec = {\n ':host': {\n _gap: 8,\n _swatchSize: 32,\n _cssWidth: 72,\n _alphaWidth: 72,\n display: 'inline-flex',\n gap: vars.gap,\n alignItems: 'center',\n },\n ':host input[type=\"color\"]': {\n border: 0,\n width: vars.swatchSize,\n height: vars.swatchSize,\n background: 'transparent',\n },\n ':host::part(alpha)': {\n width: vars.alphaWidth,\n },\n ':host::part(css)': {\n width: vars.cssWidth,\n fontFamily: 'monospace',\n },\n }\n\n content = [\n input({ title: 'base color', type: 'color', part: 'rgb' }),\n input({\n type: 'range',\n title: 'opacity',\n part: 'alpha',\n min: 0,\n max: 1,\n step: 0.05,\n }),\n input({ title: 'css color spec', part: 'css' }),\n ]\n\n private valueChanged = false\n update = (event: Event) => {\n const { rgb, alpha, css } = this.parts\n if (event.type === 'input') {\n this.color = Color.fromCss(rgb.value)\n this.color.a = Number(alpha.value)\n css.value = this.color.html\n } else {\n this.color = Color.fromCss(css.value)\n rgb.value = this.color.html.substring(0, 7)\n alpha.value = String(this.color.a)\n }\n rgb.style.opacity = String(this.color.a)\n this.value = this.color.rgba\n this.valueChanged = true\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n const { rgb, alpha, css } = this.parts\n rgb.addEventListener('input', this.update)\n alpha.addEventListener('input', this.update)\n css.addEventListener('change', this.update)\n }\n\n render() {\n if (this.valueChanged) {\n this.valueChanged = false\n return\n }\n const { rgb, alpha, css } = this.parts\n this.color = Color.fromCss(this.value)\n\n rgb.value = this.color.html.substring(0, 7)\n rgb.style.opacity = String(this.color.a)\n alpha.value = String(this.color.a)\n css.value = this.color.html\n }\n}\n\nexport const colorInput = ColorInput.elementCreator({\n tag: 'xin-color',\n}) as ElementCreator<ColorInput>\n",
14
- "/*#\n# table\n\nA virtual data-table, configurable via a `columns` array (which will automatically be generated if not provided),\nthat displays gigantic tables with fixed headers (and live column-resizing) using a minimum of resources and cpu.\n\n```js\nimport { dataTable } from 'tosijs-ui'\nimport { input } from 'tosijs'.elements\n\nconst emojiRequest = await fetch('https://raw.githubusercontent.com/tonioloewald/emoji-metadata/master/emoji-metadata.json')\nconst emojiData = await emojiRequest.json()\n\nconst columns = [\n {\n name: \"emoji\",\n prop: \"chars\",\n align: \"center\",\n width: 80,\n sort: false,\n visible: true\n },\n {\n prop: \"name\",\n width: 300,\n // custom cell using bindings to make the field editable\n dataCell() {\n return input({\n class: 'td',\n bindValue: '^.name',\n title: 'name',\n onMouseup: (event) => { event.stopPropagation() },\n onTouchend: (event) => { event.stopPropagation() },\n })\n },\n },\n {\n prop: \"category\",\n sort: \"ascending\",\n width: 150\n },\n {\n prop: \"subcategory\",\n width: 150\n },\n]\n\npreview.append(dataTable({\n multiple: true,\n array: emojiData,\n localized: true,\n columns,\n rowHeight: 40,\n pinnedBottom: 2\n}))\n```\n```css\n.preview input.td {\n margin: 0;\n border-radius: 0;\n box-shadow: none !important;\n background: #fff4;\n}\n\n.preview xin-table {\n height: 100%;\n}\n\n.preview xin-table [part=\"pinnedTopRows\"],\n.preview xin-table [part=\"pinnedBottomRows\"] {\n background: #ddd;\n}\n```\n\n> In the preceding example, the `name` column is *editable* (and *bound*, try editing something and scrolling\n> it out of view and back) and `multiple` select is enabled. In the console, you can try `$('xin-table').visibleRows`\n> and $('xin-table').selectedRows`.\n\nYou can set the `<xin-table>`'s `array`, `columns`, and `filter` properties directly, or set its `value` to:\n\n```\n{\n array: any[],\n columns: ColumnOptions[] | null,\n filter?: ArrayFilter\n}\n```\n\n## `ColumnOptions`\n\nYou can configure the table's columns by providing it an array of `ColumnOptions`:\n\n```\nexport interface ColumnOptions {\n name?: string\n prop: string\n width: number\n visible?: boolean\n align?: string\n sort?: false | 'ascending' | 'descending'\n headerCell?: (options: ColumnOptions) => HTMLElement\n dataCell?: (options: ColumnOptions) => HTMLElement\n}\n```\n\n## Selection\n\n`<xin-table>` supports `select` and `multiple` boolean properties allowing rows to be selectable. Selected rows will\nbe given the `[aria-selected]` attribute, so style them as you wish.\n\n`multiple` select supports shift-clicking and command/meta-clicking.\n\n`<xin-table>` provides an `selectionChanged(visibleSelectedRows: any[]): void` callback property allowing you to respond to changes\nin the selection, and also `selectedRows` and `visibleSelectedRows` properties.\n\nThe following methods are also provided:\n\n- `<xin-table>.selectRow(row: any, select = true)` (de)selects specified row\n- `<xin-table>.selectRows(rows?: any[], select = true)` (de)selects specified rows\n- `<xin-table>.deSelect(rows?: any[])` deselects all or specified rows.\n\nThese are rather fine-grained but they're used internally by the selection code so they may as well be documented.\n\n## Sorting\n\nBy default, the user can sort the table by any column which doesn't have a `sort === false`.\n\nYou can set the initial sort by setting the `sort` value of a specific column to `ascending`\nor `descending`.\n\nYou can override this by setting the table's sort function (it's an `Array.sort()` callback)\nto whatever you like, and you can replace the `headerCell` or set the `sort` of each column\nto `false` if you have some specific sorting in mind.\n\nYou can disable sorting controls by adding the `nosort` attribute to the `<xin-table>`.\n\n## Hiding (and Showing) Columns\n\nBy default, the user can show / hide columns by clicking via the column header menu.\nYou can remove this option by adding the `nohide` attribute to the `<xin-table>`\n\n## Reordering Columns\n\nBy default, the user can reorder columns by dragging them around. You can disable this\nby adding the `noreorder` attribute to the `<xin-table>`.\n\n## Row Height\n\nIf you set the `<xin-table>`'s `rowHeight` to `0` it will render all its elements (i.e. not be virtual). This is\nuseful for smaller tables, or tables with variable row-heights.\n\n## Styling\n\nAside from row height (see previous) the component doesn't use the shadowDOM, so it's easy to override\nits styles.\n\n## Pinned Rows\n\nThe table supports two attributes, `pinnedTop` and `pinnedBottom` that let you pin the specified number\nof top and bottom rows.\n\n## Localization\n\n`<xin-table>` supports the `localized` attribute which simply causes its default `headerCell`\nto render a `<xin-localized>` element instead of a span for its caption, and localize its\npopup menu.\n\nYou'll need to make sure your localized strings include:\n\n- Sort\n- Show\n- Hide\n- Column\n- Ascending\n- Descending\n\nAs well as any column names you want localized.\n*/\n\nimport {\n Component as WebComponent,\n ElementCreator,\n elements,\n vars,\n varDefault,\n xinValue,\n getListItem,\n tosi,\n touch,\n} from 'tosijs'\nimport { trackDrag } from './track-drag'\nimport { SortCallback } from './make-sorter'\nimport { icons } from './icons'\nimport { popMenu, MenuItem } from './menu'\nimport * as dragAndDrop from './drag-and-drop'\nimport { xinLocalized, localize } from './localize'\n\nfunction defaultWidth(\n array: any[],\n prop: string,\n charWidth: number\n): number | boolean {\n const example = array.find(\n (item) => item[prop] !== undefined && item[prop] !== null\n )\n if (example !== undefined) {\n const value = example[prop]\n switch (typeof value) {\n case 'string':\n if (value.match(/^\\d+(\\.\\d+)?$/)) {\n return 6 * charWidth\n } else if (value.includes(' ')) {\n return 20 * charWidth\n } else {\n return 12 * charWidth\n }\n case 'number':\n return 6 * charWidth\n case 'boolean':\n return 5 * charWidth\n case 'object':\n return false\n default:\n return 8 * charWidth\n }\n }\n return false\n}\n\nconst { div, span, button, template } = elements\n\nexport interface ColumnOptions {\n name?: string\n prop: string\n width: number\n visible?: boolean\n align?: string\n sort?: false | 'ascending' | 'descending'\n headerCell?: (options: ColumnOptions) => HTMLElement\n dataCell?: (options: ColumnOptions) => HTMLElement\n}\n\nexport interface TableData {\n columns?: ColumnOptions[] | null\n array: any[]\n filter?: ArrayFilter | null\n}\n\nexport type ArrayFilter = (array: any[]) => any[]\n\nconst passThru = (array: any[]) => array\n\nexport type SelectCallback = (selected: any[]) => void\n\nexport class DataTable extends WebComponent {\n select = false\n multiple = false\n nosort = false\n nohide = false\n noreorder = false\n selectionChanged: SelectCallback = () => {\n /* do not care */\n }\n localized = false\n\n private selectedKey = Symbol('selected')\n private selectBinding = (elt: Element, obj: any) => {\n elt.toggleAttribute('aria-selected', obj[this.selectedKey] === true)\n }\n\n pinnedTop = 0\n pinnedBottom = 0\n maxVisibleRows = 10000\n\n get value(): TableData {\n return {\n array: this.array,\n filter: this.filter,\n columns: this.columns,\n }\n }\n\n set value(data: TableData) {\n const { array, columns, filter } = xinValue(data)\n if (\n this._array !== array ||\n this._columns !== columns ||\n this._filter !== filter\n ) {\n this.queueRender()\n }\n this._array = array || []\n this._columns = columns || null\n this._filter = filter || passThru\n }\n\n private rowData = {\n visible: [] as any[],\n pinnedTop: [] as any[],\n pinnedBottom: [] as any[],\n }\n\n private _array: any[] = []\n private _columns: ColumnOptions[] | null = null\n private _filter: ArrayFilter = passThru\n charWidth = 15\n rowHeight = 30\n minColumnWidth = 30\n\n get virtual(): { height: number } | undefined {\n return this.rowHeight > 0 ? { height: this.rowHeight } : undefined\n }\n\n constructor() {\n super()\n\n this.rowData = tosi({\n [this.instanceId]: this.rowData,\n })[this.instanceId]\n\n this.initAttributes(\n 'rowHeight',\n 'charWidth',\n 'minColumnWidth',\n 'select',\n 'multiple',\n 'pinnedTop',\n 'pinnedBottom',\n 'nosort',\n 'nohide',\n 'noreorder',\n 'localized'\n )\n }\n\n get array(): any[] {\n return this._array\n }\n\n set array(newArray: any[]) {\n this._array = xinValue(newArray)\n this.queueRender()\n }\n\n get filter(): ArrayFilter {\n return this._filter\n }\n\n set filter(filterFunc: ArrayFilter) {\n if (this._filter !== filterFunc) {\n this._filter = filterFunc\n this.queueRender()\n }\n }\n\n get sort(): SortCallback | undefined {\n if (this._sort) {\n return this._sort\n }\n const sortColumn = this._columns?.find(\n (c) => c.sort === 'ascending' || c.sort === 'descending'\n )\n if (!sortColumn) {\n return undefined\n }\n const { prop } = sortColumn\n\n return sortColumn.sort === 'ascending'\n ? (a: any, b: any) => (a[prop] > b[prop] ? 1 : -1)\n : (a: any, b: any) => (a[prop] > b[prop] ? -1 : 1)\n }\n\n set sort(sortFunc: ArrayFilter) {\n if (this._sort !== sortFunc) {\n this._sort = sortFunc\n this.queueRender()\n }\n }\n\n get columns(): ColumnOptions[] {\n if (!Array.isArray(this._columns)) {\n const { _array } = this\n this._columns = Object.keys(_array[0] || {}).map((prop: string) => {\n const width = defaultWidth(_array, prop, this.charWidth)\n return {\n name: prop.replace(/([a-z])([A-Z])/g, '$1 $2').toLocaleLowerCase(),\n prop,\n align:\n typeof _array[0][prop] === 'number' ||\n (_array[0][prop] !== '' && !isNaN(_array[0][prop]))\n ? 'right'\n : 'left',\n visible: width !== false,\n width: width ? width : 0,\n } as ColumnOptions\n })\n }\n return this._columns\n }\n\n set columns(newColumns: ColumnOptions[]) {\n this._columns = newColumns\n this.queueRender()\n }\n\n get visibleColumns(): ColumnOptions[] {\n return this.columns.filter((c) => c.visible !== false)\n }\n\n content = null\n\n getColumn(event: any): ColumnOptions | undefined {\n const x =\n (event.touches !== undefined ? event.touches[0].clientX : event.clientX) -\n this.getBoundingClientRect().x\n const epsilon = event.touches !== undefined ? 20 : 5\n let boundaryX = 0\n const log: any[] = []\n const column = this.visibleColumns.find((options: ColumnOptions) => {\n if (options.visible !== false) {\n boundaryX += options.width\n log.push(boundaryX)\n return Math.abs(x - boundaryX) < epsilon\n }\n })\n return column\n }\n\n private setCursor = (event: Event) => {\n const column = this.getColumn(event)\n if (column !== undefined) {\n this.style.cursor = 'col-resize'\n } else {\n this.style.cursor = ''\n }\n }\n\n private resizeColumn = (event: any) => {\n const column = this.getColumn(event)\n if (column !== undefined) {\n const origWidth = Number(column.width)\n const isTouchEvent = event.touches !== undefined\n const touchIdentifier = isTouchEvent\n ? event.touches[0].identifier\n : undefined\n trackDrag(\n event,\n (dx, _dy, event: any) => {\n const touch = isTouchEvent\n ? [...event.touches].find(\n (touch: any) => touch.identifier === touchIdentifier\n )\n : true\n if (touch === undefined) {\n return true\n }\n const width = origWidth + dx\n column.width =\n width > this.minColumnWidth ? width : this.minColumnWidth\n this.setColumnWidths()\n if (event.type === 'mouseup') {\n return true\n }\n },\n 'col-resize'\n )\n }\n }\n\n selectRow(row: any, select = true) {\n if (select) {\n row[this.selectedKey] = true\n } else {\n delete row[this.selectedKey]\n }\n }\n\n selectRows(rows?: any[], select = true) {\n for (const row of rows || this.array) {\n this.selectRow(row, select)\n }\n }\n\n deSelect(rows?: any[]) {\n this.selectRows(rows, false)\n }\n\n // tracking click / shift-click\n private rangeStart?: any\n private updateSelection = (event: Event) => {\n if (!this.select && !this.multiple) {\n return\n }\n const { target } = event\n if (!(target instanceof HTMLElement)) {\n return\n }\n const tr = target.closest('.tr')\n if (!(tr instanceof HTMLElement)) {\n return\n }\n const pickedItem = getListItem(tr)\n if (pickedItem === false) {\n return\n }\n const mouseEvent = event as MouseEvent\n // prevent ugly selection artifacts\n const selection = window.getSelection()\n if (selection !== null) {\n selection.removeAllRanges()\n }\n const rows = this.visibleRows\n if (\n this.multiple &&\n mouseEvent.shiftKey &&\n rows.length > 0 &&\n this.rangeStart !== pickedItem\n ) {\n const mode =\n this.rangeStart === undefined ||\n this.rangeStart[this.selectedKey] === true\n const [start, finish] = [\n this.rangeStart !== undefined ? rows.indexOf(this.rangeStart) : 0,\n rows.indexOf(pickedItem),\n ].sort((a, b) => a - b)\n\n // if start is -1 then one of the items is no longer visible\n if (start > -1) {\n for (let idx = start; idx <= finish; idx++) {\n const row = rows[idx]\n this.selectRow(row, mode)\n }\n }\n } else if (this.multiple && mouseEvent.metaKey) {\n this.selectRow(pickedItem, !pickedItem[this.selectedKey])\n const pickedIndex = rows.indexOf(pickedItem)\n const nextItem = rows[pickedIndex + 1]\n const previousItem = pickedIndex > 0 ? rows[pickedIndex - 1] : undefined\n if (nextItem !== undefined && nextItem[this.selectedKey] === true) {\n this.rangeStart = nextItem\n } else if (\n previousItem !== undefined &&\n previousItem[this.selectedKey] === true\n ) {\n this.rangeStart = previousItem\n } else {\n this.rangeStart = undefined\n }\n } else {\n this.rangeStart = pickedItem\n this.deSelect()\n this.selectRow(pickedItem, true)\n }\n this.selectionChanged(this.visibleSelectedRows)\n for (const row of Array.from(this.querySelectorAll('.tr'))) {\n const item = getListItem(row)\n this.selectBinding(row, item)\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n this.addEventListener('mousemove', this.setCursor)\n this.addEventListener('mousedown', this.resizeColumn)\n this.addEventListener('touchstart', this.resizeColumn, { passive: true })\n this.addEventListener('mouseup', this.updateSelection)\n this.addEventListener('touchend', this.updateSelection)\n }\n\n setColumnWidths() {\n this.style.setProperty(\n '--grid-columns',\n this.visibleColumns.map((c) => c.width + 'px').join(' ')\n )\n this.style.setProperty(\n '--grid-row-width',\n this.visibleColumns.reduce((w, c) => w + c.width, 0) + 'px'\n )\n }\n\n sortByColumn = (\n columnOptions: ColumnOptions,\n direction: 'ascending' | 'descending' | 'auto' = 'auto'\n ) => {\n for (const column of this.columns.filter(\n (c) => xinValue(c.sort) !== false\n )) {\n if (xinValue(column) === columnOptions) {\n if (direction === 'auto') {\n column.sort = column.sort === 'ascending' ? 'descending' : 'ascending'\n } else {\n column.sort = direction\n }\n this.queueRender()\n } else {\n delete column.sort\n }\n }\n }\n\n popColumnMenu = (target: HTMLElement, options: ColumnOptions) => {\n const { sortByColumn } = this\n const hiddenColumns = this.columns.filter(\n (column) => column.visible === false\n )\n const queueRender = this.queueRender.bind(this)\n const menu: MenuItem[] = []\n if (!this.nosort && options.sort !== false) {\n menu.push(\n {\n caption: this.localized\n ? `${localize('Sort')} ${localize('Ascending')}`\n : 'Sort Ascending',\n icon: 'sortAscending',\n action() {\n sortByColumn(options)\n },\n },\n {\n caption: this.localized\n ? `${localize('Sort')} ${localize('Descending')}`\n : 'Sort Ascending',\n icon: 'sortDescending',\n action() {\n sortByColumn(options, 'descending')\n },\n }\n )\n }\n if (!this.nohide) {\n if (menu.length) {\n menu.push(null)\n }\n menu.push(\n {\n caption: this.localized\n ? `${localize('Hide')} ${localize('Column')}`\n : 'Hide Column',\n icon: 'eyeOff',\n enabled: () => options.visible !== true,\n action() {\n options.visible = false\n queueRender()\n },\n },\n {\n caption: this.localized\n ? `${localize('Show')} ${localize('Column')}`\n : 'Show Column',\n icon: 'eye',\n enabled: () => hiddenColumns.length > 0,\n menuItems: hiddenColumns.map((column) => {\n return {\n caption: column.name || column.prop,\n action() {\n delete column.visible\n queueRender()\n },\n }\n }),\n }\n )\n }\n\n popMenu({\n target,\n localized: this.localized,\n menuItems: menu,\n })\n }\n\n get captionSpan(): ElementCreator {\n return this.localized ? xinLocalized : span\n }\n\n headerCell = (options: ColumnOptions) => {\n const { popColumnMenu } = this\n let ariaSort = 'none'\n let sortIcon: SVGElement | undefined\n switch (options.sort) {\n case 'ascending':\n sortIcon = icons.sortAscending()\n ariaSort = 'descending'\n break\n case false:\n break\n default:\n break\n case 'descending':\n ariaSort = 'ascending'\n sortIcon = icons.sortDescending()\n }\n\n const menuButton = !(this.nosort && this.nohide)\n ? button(\n {\n class: 'menu-trigger',\n onClick(event: Event) {\n popColumnMenu(event.target as HTMLElement, options)\n event.stopPropagation()\n },\n },\n sortIcon || icons.moreVertical()\n )\n : {}\n\n return options.headerCell !== undefined\n ? options.headerCell(options)\n : span(\n {\n class: 'th',\n role: 'columnheader',\n ariaSort,\n style: {\n ...this.cellStyle,\n textAlign: options.align || 'left',\n },\n },\n this.captionSpan(\n typeof options.name === 'string' ? options.name : options.prop\n ),\n span({ style: { flex: '1' } }),\n menuButton\n )\n }\n\n dataCell = (options: ColumnOptions) => {\n if (options.dataCell !== undefined) {\n return options.dataCell(options)\n }\n return span({\n class: 'td',\n role: 'cell',\n style: {\n ...this.cellStyle,\n textAlign: options.align || 'left',\n },\n bindText: `^.${options.prop}`,\n })\n }\n\n get visibleRows(): any[] {\n return xinValue(this.rowData.visible) as any[]\n }\n\n get visibleSelectedRows(): any[] {\n return this.visibleRows.filter((obj) => obj[this.selectedKey])\n }\n\n get selectedRows(): any[] {\n return this.array.filter((obj) => obj[this.selectedKey])\n }\n\n rowTemplate(columns: ColumnOptions[]): HTMLTemplateElement {\n return template(\n div(\n {\n class: 'tr',\n role: 'row',\n bind: {\n value: '^',\n binding: { toDOM: this.selectBinding },\n },\n },\n ...columns.map(this.dataCell)\n )\n )\n }\n\n private draggedColumn?: ColumnOptions\n\n private dropColumn = (event: Event) => {\n const target = (event.target as HTMLElement).closest(\n '.drag-over'\n ) as HTMLElement\n const targetIndex = Array.from(target.parentElement!.children).indexOf(\n target\n )\n const dropped = this.visibleColumns[targetIndex]\n const draggedIndex = this.columns.indexOf(this.draggedColumn!)\n const droppedIndex = this.columns.indexOf(dropped)\n this.columns.splice(draggedIndex, 1)\n this.columns.splice(droppedIndex, 0, this.draggedColumn!)\n console.log({ event, target, targetIndex, draggedIndex, droppedIndex })\n this.queueRender()\n\n event.preventDefault()\n event.stopPropagation()\n }\n\n render() {\n super.render()\n\n this.rowData.pinnedTop =\n this.pinnedTop > 0 ? this._array.slice(0, this.pinnedTop) : []\n this.rowData.pinnedBottom =\n this.pinnedBottom > 0\n ? this._array.slice(this._array.length - this.pinnedBottom)\n : []\n this.rowData.visible = this.filter(\n this._array.slice(\n this.pinnedTop,\n Math.min(\n this.maxVisibleRows,\n this._array.length - this.pinnedTop - this.pinnedBottom\n )\n )\n )\n\n const { sort } = this\n if (sort) {\n this.rowData.visible.sort(sort)\n }\n\n this.textContent = ''\n\n this.style.display = 'flex'\n this.style.flexDirection = 'column'\n const { visibleColumns } = this\n this.style.setProperty('--row-height', `${this.rowHeight}px`)\n this.setColumnWidths()\n\n if (!this.noreorder) {\n dragAndDrop.init()\n }\n const dragId = this.instanceId + '-column-header'\n const columnHeaders = visibleColumns.map((column) => {\n const header = this.headerCell(column)\n if (!this.noreorder) {\n header.setAttribute('draggable', 'true')\n header.dataset.drag = dragId\n header.dataset.drop = dragId\n header.addEventListener('dragstart', () => {\n this.draggedColumn = column\n })\n header.addEventListener('drop', this.dropColumn)\n }\n return header\n })\n this.append(\n div(\n { class: 'thead', role: 'rowgroup', style: { touchAction: 'none' } },\n div(\n {\n class: 'tr',\n role: 'row',\n },\n ...columnHeaders\n )\n )\n )\n if (this.pinnedTop > 0) {\n this.append(\n div(\n {\n part: 'pinnedTopRows',\n class: 'tbody',\n role: 'rowgroup',\n style: {\n flex: '0 0 auto',\n overflow: 'hidden',\n height: `${this.rowHeight * this.pinnedTop}px`,\n },\n bindList: {\n value: this.rowData.pinnedTop,\n virtual: this.virtual,\n },\n },\n this.rowTemplate(visibleColumns)\n )\n )\n }\n this.append(\n div(\n {\n part: 'visibleRows',\n class: 'tbody',\n role: 'rowgroup',\n style: {\n content: ' ',\n minHeight: '100px',\n flex: '1 1 100px',\n overflow: 'hidden auto',\n },\n bindList: {\n value: this.rowData.visible,\n virtual: this.virtual,\n },\n },\n this.rowTemplate(visibleColumns)\n )\n )\n if (this.pinnedBottom > 0) {\n this.append(\n div(\n {\n part: 'pinnedBottomRows',\n class: 'tbody',\n role: 'rowgroup',\n style: {\n flex: '0 0 auto',\n overflow: 'hidden',\n height: `${this.rowHeight * this.pinnedBottom}px`,\n },\n bindList: {\n value: this.rowData.pinnedBottom,\n virtual: this.virtual,\n },\n },\n this.rowTemplate(visibleColumns)\n )\n )\n }\n }\n}\n\nexport const dataTable = DataTable.elementCreator({\n tag: 'xin-table',\n styleSpec: {\n ':host': {\n overflow: 'auto hidden',\n },\n ':host .thead, :host .tbody': {\n width: vars.gridRowWidth,\n },\n ':host .tr': {\n display: 'grid',\n gridTemplateColumns: vars.gridColumns,\n height: vars.rowHeight,\n lineHeight: vars.rowHeight,\n },\n ':host .td, :host .th': {\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n display: 'flex',\n alignItems: 'center',\n },\n ':host .th .menu-trigger': {\n color: 'currentColor',\n background: 'none',\n padding: 0,\n lineHeight: vars.touchSize,\n height: vars.touchSize,\n width: vars.touchSize,\n },\n ':host [draggable=\"true\"]': {\n cursor: 'ew-resize',\n },\n ':host [draggable=\"true\"]:active': {\n background: varDefault.draggedHeaderBg('#0004'),\n color: varDefault.draggedHeaderColor('#fff'),\n },\n ':host .drag-over': {\n background: varDefault.dropHeaderBg('#fff4'),\n },\n },\n}) as ElementCreator<DataTable>\n",
14
+ "/*#\n# table\n\nA virtual data-table, configurable via a `columns` array (which will automatically be generated if not provided),\nthat displays gigantic tables with fixed headers (and live column-resizing) using a minimum of resources and cpu.\n\n```js\nimport { dataTable } from 'tosijs-ui'\nimport { input } from 'tosijs'.elements\n\nconst emojiRequest = await fetch('https://raw.githubusercontent.com/tonioloewald/emoji-metadata/master/emoji-metadata.json')\nconst emojiData = await emojiRequest.json()\n\nconst columns = [\n {\n name: \"emoji\",\n prop: \"chars\",\n align: \"center\",\n width: 80,\n sort: false,\n visible: true\n },\n {\n prop: \"name\",\n width: 300,\n // custom cell using bindings to make the field editable\n dataCell() {\n return input({\n class: 'td',\n bindValue: '^.name',\n title: 'name',\n onMouseup: (event) => { event.stopPropagation() },\n onTouchend: (event) => { event.stopPropagation() },\n })\n },\n },\n {\n prop: \"category\",\n sort: \"ascending\",\n width: 150\n },\n {\n prop: \"subcategory\",\n width: 150\n },\n]\n\npreview.append(dataTable({\n multiple: true,\n array: emojiData,\n localized: true,\n columns,\n rowHeight: 40,\n pinnedBottom: 2\n}))\n```\n```css\n.preview input.td {\n margin: 0;\n border-radius: 0;\n box-shadow: none !important;\n background: #fff4;\n}\n\n.preview xin-table {\n height: 100%;\n}\n\n.preview xin-table [part=\"pinnedTopRows\"],\n.preview xin-table [part=\"pinnedBottomRows\"] {\n background: #ddd;\n}\n```\n\n> In the preceding example, the `name` column is *editable* (and *bound*, try editing something and scrolling\n> it out of view and back) and `multiple` select is enabled. In the console, you can try `$('xin-table').visibleRows`\n> and $('xin-table').selectedRows`.\n\nYou can set the `<xin-table>`'s `array`, `columns`, and `filter` properties directly, or set its `value` to:\n\n```\n{\n array: any[],\n columns: ColumnOptions[] | null,\n filter?: ArrayFilter\n}\n```\n\n## `ColumnOptions`\n\nYou can configure the table's columns by providing it an array of `ColumnOptions`:\n\n```\nexport interface ColumnOptions {\n name?: string\n prop: string\n width: number\n visible?: boolean\n align?: string\n sort?: false | 'ascending' | 'descending'\n headerCell?: (options: ColumnOptions) => HTMLElement\n dataCell?: (options: ColumnOptions) => HTMLElement\n}\n```\n\n## Selection\n\n`<xin-table>` supports `select` and `multiple` boolean properties allowing rows to be selectable. Selected rows will\nbe given the `[aria-selected]` attribute, so style them as you wish.\n\n`multiple` select supports shift-clicking and command/meta-clicking.\n\n`<xin-table>` provides an `selectionChanged(visibleSelectedRows: any[]): void` callback property allowing you to respond to changes\nin the selection, and also `selectedRows` and `visibleSelectedRows` properties.\n\nThe following methods are also provided:\n\n- `<xin-table>.selectRow(row: any, select = true)` (de)selects specified row\n- `<xin-table>.selectRows(rows?: any[], select = true)` (de)selects specified rows\n- `<xin-table>.deSelect(rows?: any[])` deselects all or specified rows.\n\nThese are rather fine-grained but they're used internally by the selection code so they may as well be documented.\n\n## Sorting\n\nBy default, the user can sort the table by any column which doesn't have a `sort === false`.\n\nYou can set the initial sort by setting the `sort` value of a specific column to `ascending`\nor `descending`.\n\nYou can override this by setting the table's sort function (it's an `Array.sort()` callback)\nto whatever you like, and you can replace the `headerCell` or set the `sort` of each column\nto `false` if you have some specific sorting in mind.\n\nYou can disable sorting controls by adding the `nosort` attribute to the `<xin-table>`.\n\n## Hiding (and Showing) Columns\n\nBy default, the user can show / hide columns by clicking via the column header menu.\nYou can remove this option by adding the `nohide` attribute to the `<xin-table>`\n\n## Reordering Columns\n\nBy default, the user can reorder columns by dragging them around. You can disable this\nby adding the `noreorder` attribute to the `<xin-table>`.\n\n## Row Height\n\nIf you set the `<xin-table>`'s `rowHeight` to `0` it will render all its elements (i.e. not be virtual). This is\nuseful for smaller tables, or tables with variable row-heights.\n\n## Styling\n\nAside from row height (see previous) the component doesn't use the shadowDOM, so it's easy to override\nits styles.\n\n## Pinned Rows\n\nThe table supports two attributes, `pinnedTop` and `pinnedBottom` that let you pin the specified number\nof top and bottom rows.\n\n## Localization\n\n`<xin-table>` supports the `localized` attribute which simply causes its default `headerCell`\nto render a `<xin-localized>` element instead of a span for its caption, and localize its\npopup menu.\n\nYou'll need to make sure your localized strings include:\n\n- Sort\n- Show\n- Hide\n- Column\n- Ascending\n- Descending\n\nAs well as any column names you want localized.\n*/\n\nimport {\n Component as WebComponent,\n ElementCreator,\n elements,\n vars,\n varDefault,\n xinValue,\n getListItem,\n tosi,\n touch,\n} from 'tosijs'\nimport { trackDrag } from './track-drag'\nimport { SortCallback } from './make-sorter'\nimport { icons } from './icons'\nimport { popMenu, MenuItem } from './menu'\nimport * as dragAndDrop from './drag-and-drop'\nimport { xinLocalized, localize } from './localize'\n\nfunction defaultWidth(\n array: any[],\n prop: string,\n charWidth: number\n): number | boolean {\n const example = array.find(\n (item) => item[prop] !== undefined && item[prop] !== null\n )\n if (example !== undefined) {\n const value = example[prop]\n switch (typeof value) {\n case 'string':\n if (value.match(/^\\d+(\\.\\d+)?$/)) {\n return 6 * charWidth\n } else if (value.includes(' ')) {\n return 20 * charWidth\n } else {\n return 12 * charWidth\n }\n case 'number':\n return 6 * charWidth\n case 'boolean':\n return 5 * charWidth\n case 'object':\n return false\n default:\n return 8 * charWidth\n }\n }\n return false\n}\n\nconst { div, span, button, template } = elements\n\nexport interface ColumnOptions {\n name?: string\n prop: string\n width: number\n visible?: boolean\n align?: string\n sort?: false | 'ascending' | 'descending'\n headerCell?: (options: ColumnOptions) => HTMLElement\n dataCell?: (options: ColumnOptions) => HTMLElement\n}\n\nexport interface TableData {\n columns?: ColumnOptions[] | null\n array: any[]\n filter?: ArrayFilter | null\n}\n\nexport type ArrayFilter = (array: any[]) => any[]\n\nconst passThru = (array: any[]) => array\n\nexport type SelectCallback = (selected: any[]) => void\n\nexport class DataTable extends WebComponent {\n select = false\n multiple = false\n nosort = false\n nohide = false\n noreorder = false\n selectionChanged: SelectCallback = () => {\n /* do not care */\n }\n localized = false\n\n private selectedKey = Symbol('selected')\n private selectBinding = (elt: Element, obj: any) => {\n elt.toggleAttribute('aria-selected', obj[this.selectedKey] === true)\n }\n\n pinnedTop = 0\n pinnedBottom = 0\n maxVisibleRows = 10000\n\n get value(): TableData {\n return {\n array: this.array,\n filter: this.filter,\n columns: this.columns,\n }\n }\n\n set value(data: TableData) {\n const { array, columns, filter } = xinValue(data)\n if (\n this._array !== array ||\n this._columns !== columns ||\n this._filter !== filter\n ) {\n this.queueRender()\n }\n this._array = array || []\n this._columns = columns || null\n this._filter = filter || passThru\n }\n\n private rowData = {\n visible: [] as any[],\n pinnedTop: [] as any[],\n pinnedBottom: [] as any[],\n }\n\n private _array: any[] = []\n private _columns: ColumnOptions[] | null = null\n private _filter: ArrayFilter = passThru\n charWidth = 15\n rowHeight = 30\n minColumnWidth = 30\n\n get virtual(): { height: number } | undefined {\n return this.rowHeight > 0 ? { height: this.rowHeight } : undefined\n }\n\n constructor() {\n super()\n\n this.rowData = tosi({\n [this.instanceId]: this.rowData,\n })[this.instanceId]\n\n this.initAttributes(\n 'rowHeight',\n 'charWidth',\n 'minColumnWidth',\n 'select',\n 'multiple',\n 'pinnedTop',\n 'pinnedBottom',\n 'nosort',\n 'nohide',\n 'noreorder',\n 'localized'\n )\n }\n\n get array(): any[] {\n return this._array\n }\n\n set array(newArray: any[]) {\n this._array = xinValue(newArray)\n this.queueRender()\n }\n\n get filter(): ArrayFilter {\n return this._filter\n }\n\n set filter(filterFunc: ArrayFilter) {\n if (this._filter !== filterFunc) {\n this._filter = filterFunc\n this.queueRender()\n }\n }\n\n get sort(): SortCallback | undefined {\n if (this._sort) {\n return this._sort\n }\n const sortColumn = this._columns?.find(\n (c) => c.sort === 'ascending' || c.sort === 'descending'\n )\n if (!sortColumn) {\n return undefined\n }\n const { prop } = sortColumn\n\n return sortColumn.sort === 'ascending'\n ? (a: any, b: any) => (a[prop] > b[prop] ? 1 : -1)\n : (a: any, b: any) => (a[prop] > b[prop] ? -1 : 1)\n }\n\n set sort(sortFunc: ArrayFilter) {\n if (this._sort !== sortFunc) {\n this._sort = sortFunc\n this.queueRender()\n }\n }\n\n get columns(): ColumnOptions[] {\n if (!Array.isArray(this._columns)) {\n const { _array } = this\n this._columns = Object.keys(_array[0] || {}).map((prop: string) => {\n const width = defaultWidth(_array, prop, this.charWidth)\n return {\n name: prop.replace(/([a-z])([A-Z])/g, '$1 $2').toLocaleLowerCase(),\n prop,\n align:\n typeof _array[0][prop] === 'number' ||\n (_array[0][prop] !== '' && !isNaN(_array[0][prop]))\n ? 'right'\n : 'left',\n visible: width !== false,\n width: width ? width : 0,\n } as ColumnOptions\n })\n }\n return this._columns\n }\n\n set columns(newColumns: ColumnOptions[]) {\n this._columns = newColumns\n this.queueRender()\n }\n\n get visibleColumns(): ColumnOptions[] {\n return this.columns.filter((c) => c.visible !== false)\n }\n\n content = null\n\n getColumn(event: any): ColumnOptions | undefined {\n const x =\n (event.touches !== undefined ? event.touches[0].clientX : event.clientX) -\n this.getBoundingClientRect().x\n const epsilon = event.touches !== undefined ? 20 : 5\n let boundaryX = 0\n const log: any[] = []\n const column = this.visibleColumns.find((options: ColumnOptions) => {\n if (options.visible !== false) {\n boundaryX += options.width\n log.push(boundaryX)\n return Math.abs(x - boundaryX) < epsilon\n }\n })\n return column\n }\n\n private setCursor = (event: Event) => {\n const column = this.getColumn(event)\n if (column !== undefined) {\n this.style.cursor = 'col-resize'\n } else {\n this.style.cursor = ''\n }\n }\n\n private resizeColumn = (event: any) => {\n const column = this.getColumn(event)\n if (column !== undefined) {\n const origWidth = Number(column.width)\n const isTouchEvent = event.touches !== undefined\n const touchIdentifier = isTouchEvent\n ? event.touches[0].identifier\n : undefined\n trackDrag(\n event,\n (dx, _dy, event: any) => {\n const touch = isTouchEvent\n ? [...event.touches].find(\n (touch: any) => touch.identifier === touchIdentifier\n )\n : true\n if (touch === undefined) {\n return true\n }\n const width = origWidth + dx\n column.width =\n width > this.minColumnWidth ? width : this.minColumnWidth\n this.setColumnWidths()\n if (event.type === 'mouseup') {\n return true\n }\n },\n 'col-resize'\n )\n }\n }\n\n selectRow(row: any, select = true) {\n if (select) {\n row[this.selectedKey] = true\n } else {\n delete row[this.selectedKey]\n }\n }\n\n selectRows(rows?: any[], select = true) {\n for (const row of rows || this.array) {\n this.selectRow(row, select)\n }\n }\n\n deSelect(rows?: any[]) {\n this.selectRows(rows, false)\n }\n\n // tracking click / shift-click\n private rangeStart?: any\n private updateSelection = (event: Event) => {\n if (!this.select && !this.multiple) {\n return\n }\n const { target } = event\n if (!(target instanceof HTMLElement)) {\n return\n }\n const tr = target.closest('.tr')\n if (!(tr instanceof HTMLElement)) {\n return\n }\n const pickedItem = getListItem(tr)\n if (pickedItem === false) {\n return\n }\n const mouseEvent = event as MouseEvent\n // prevent ugly selection artifacts\n const selection = window.getSelection()\n if (selection !== null) {\n selection.removeAllRanges()\n }\n const rows = this.visibleRows\n if (\n this.multiple &&\n mouseEvent.shiftKey &&\n rows.length > 0 &&\n this.rangeStart !== pickedItem\n ) {\n const mode =\n this.rangeStart === undefined ||\n this.rangeStart[this.selectedKey] === true\n const [start, finish] = [\n this.rangeStart !== undefined ? rows.indexOf(this.rangeStart) : 0,\n rows.indexOf(pickedItem),\n ].sort((a, b) => a - b)\n\n // if start is -1 then one of the items is no longer visible\n if (start > -1) {\n for (let idx = start; idx <= finish; idx++) {\n const row = rows[idx]\n this.selectRow(row, mode)\n }\n }\n } else if (this.multiple && mouseEvent.metaKey) {\n this.selectRow(pickedItem, !pickedItem[this.selectedKey])\n const pickedIndex = rows.indexOf(pickedItem)\n const nextItem = rows[pickedIndex + 1]\n const previousItem = pickedIndex > 0 ? rows[pickedIndex - 1] : undefined\n if (nextItem !== undefined && nextItem[this.selectedKey] === true) {\n this.rangeStart = nextItem\n } else if (\n previousItem !== undefined &&\n previousItem[this.selectedKey] === true\n ) {\n this.rangeStart = previousItem\n } else {\n this.rangeStart = undefined\n }\n } else {\n this.rangeStart = pickedItem\n this.deSelect()\n this.selectRow(pickedItem, true)\n }\n this.selectionChanged(this.visibleSelectedRows)\n for (const row of Array.from(this.querySelectorAll('.tr'))) {\n const item = getListItem(row)\n this.selectBinding(row, item)\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n this.addEventListener('mousemove', this.setCursor)\n this.addEventListener('mousedown', this.resizeColumn)\n this.addEventListener('touchstart', this.resizeColumn, { passive: true })\n this.addEventListener('mouseup', this.updateSelection)\n this.addEventListener('touchend', this.updateSelection)\n }\n\n setColumnWidths() {\n this.style.setProperty(\n '--grid-columns',\n this.visibleColumns.map((c) => c.width + 'px').join(' ')\n )\n this.style.setProperty(\n '--grid-row-width',\n this.visibleColumns.reduce((w, c) => w + c.width, 0) + 'px'\n )\n }\n\n sortByColumn = (\n columnOptions: ColumnOptions,\n direction: 'ascending' | 'descending' | 'auto' = 'auto'\n ) => {\n for (const column of this.columns.filter(\n (c) => xinValue(c.sort) !== false\n )) {\n if (xinValue(column) === columnOptions) {\n if (direction === 'auto') {\n column.sort = column.sort === 'ascending' ? 'descending' : 'ascending'\n } else {\n column.sort = direction\n }\n this.queueRender()\n } else {\n delete column.sort\n }\n }\n }\n\n popColumnMenu = (target: HTMLElement, options: ColumnOptions) => {\n const { sortByColumn } = this\n const hiddenColumns = this.columns.filter(\n (column) => column.visible === false\n )\n const queueRender = this.queueRender.bind(this)\n const menu: MenuItem[] = []\n if (!this.nosort && options.sort !== false) {\n menu.push(\n {\n caption: this.localized\n ? `${localize('Sort')} ${localize('Ascending')}`\n : 'Sort Ascending',\n icon: 'sortAscending',\n action() {\n sortByColumn(options)\n },\n },\n {\n caption: this.localized\n ? `${localize('Sort')} ${localize('Descending')}`\n : 'Sort Descending',\n icon: 'sortDescending',\n action() {\n sortByColumn(options, 'descending')\n },\n }\n )\n }\n if (!this.nohide) {\n if (menu.length) {\n menu.push(null)\n }\n menu.push(\n {\n caption: this.localized\n ? `${localize('Hide')} ${localize('Column')}`\n : 'Hide Column',\n icon: 'eyeOff',\n enabled: () => options.visible !== true,\n action() {\n options.visible = false\n queueRender()\n },\n },\n {\n caption: this.localized\n ? `${localize('Show')} ${localize('Column')}`\n : 'Show Column',\n icon: 'eye',\n enabled: () => hiddenColumns.length > 0,\n menuItems: hiddenColumns.map((column) => {\n return {\n caption: column.name || column.prop,\n action() {\n delete column.visible\n queueRender()\n },\n }\n }),\n }\n )\n }\n\n popMenu({\n target,\n localized: this.localized,\n menuItems: menu,\n })\n }\n\n get captionSpan(): ElementCreator {\n return this.localized ? xinLocalized : span\n }\n\n headerCell = (options: ColumnOptions) => {\n const { popColumnMenu } = this\n let ariaSort = 'none'\n let sortIcon: SVGElement | undefined\n switch (options.sort) {\n case 'ascending':\n sortIcon = icons.sortAscending()\n ariaSort = 'descending'\n break\n case false:\n break\n default:\n break\n case 'descending':\n ariaSort = 'ascending'\n sortIcon = icons.sortDescending()\n }\n\n const menuButton = !(this.nosort && this.nohide)\n ? button(\n {\n class: 'menu-trigger',\n onClick(event: Event) {\n popColumnMenu(event.target as HTMLElement, options)\n event.stopPropagation()\n },\n },\n sortIcon || icons.moreVertical()\n )\n : {}\n\n return options.headerCell !== undefined\n ? options.headerCell(options)\n : span(\n {\n class: 'th',\n role: 'columnheader',\n ariaSort,\n style: {\n ...this.cellStyle,\n justifyContent: options.align || 'left',\n },\n },\n this.captionSpan(\n { style: { flex: '1' } },\n typeof options.name === 'string' ? options.name : options.prop\n ),\n menuButton\n )\n }\n\n dataCell = (options: ColumnOptions) => {\n if (options.dataCell !== undefined) {\n return options.dataCell(options)\n }\n return span({\n class: 'td',\n role: 'cell',\n style: {\n ...this.cellStyle,\n justifyContent: options.align || 'left',\n },\n bindText: `^.${options.prop}`,\n })\n }\n\n get visibleRows(): any[] {\n return xinValue(this.rowData.visible) as any[]\n }\n\n get visibleSelectedRows(): any[] {\n return this.visibleRows.filter((obj) => obj[this.selectedKey])\n }\n\n get selectedRows(): any[] {\n return this.array.filter((obj) => obj[this.selectedKey])\n }\n\n rowTemplate(columns: ColumnOptions[]): HTMLTemplateElement {\n return template(\n div(\n {\n class: 'tr',\n role: 'row',\n bind: {\n value: '^',\n binding: { toDOM: this.selectBinding },\n },\n },\n ...columns.map(this.dataCell)\n )\n )\n }\n\n private draggedColumn?: ColumnOptions\n\n private dropColumn = (event: Event) => {\n const target = (event.target as HTMLElement).closest(\n '.drag-over'\n ) as HTMLElement\n const targetIndex = Array.from(target.parentElement!.children).indexOf(\n target\n )\n const dropped = this.visibleColumns[targetIndex]\n const draggedIndex = this.columns.indexOf(this.draggedColumn!)\n const droppedIndex = this.columns.indexOf(dropped)\n this.columns.splice(draggedIndex, 1)\n this.columns.splice(droppedIndex, 0, this.draggedColumn!)\n console.log({ event, target, targetIndex, draggedIndex, droppedIndex })\n this.queueRender()\n\n event.preventDefault()\n event.stopPropagation()\n }\n\n render() {\n super.render()\n\n this.rowData.pinnedTop =\n this.pinnedTop > 0 ? this._array.slice(0, this.pinnedTop) : []\n this.rowData.pinnedBottom =\n this.pinnedBottom > 0\n ? this._array.slice(this._array.length - this.pinnedBottom)\n : []\n this.rowData.visible = this.filter(\n this._array.slice(\n this.pinnedTop,\n Math.min(\n this.maxVisibleRows,\n this._array.length - this.pinnedTop - this.pinnedBottom\n )\n )\n )\n\n const { sort } = this\n if (sort) {\n this.rowData.visible.sort(sort)\n }\n\n this.textContent = ''\n\n this.style.display = 'flex'\n this.style.flexDirection = 'column'\n const { visibleColumns } = this\n this.style.setProperty('--row-height', `${this.rowHeight}px`)\n this.setColumnWidths()\n\n if (!this.noreorder) {\n dragAndDrop.init()\n }\n const dragId = this.instanceId + '-column-header'\n const columnHeaders = visibleColumns.map((column) => {\n const header = this.headerCell(column)\n if (!this.noreorder && header.children[0]) {\n const caption = header.children[0] as HTMLElement\n caption.setAttribute('draggable', 'true')\n caption.style.pointerEvents = 'all'\n caption.dataset.drag = dragId\n header.dataset.drop = dragId\n caption.addEventListener('dragstart', () => {\n this.draggedColumn = column\n })\n header.addEventListener('drop', this.dropColumn)\n }\n return header\n })\n this.append(\n div(\n { class: 'thead', role: 'rowgroup', style: { touchAction: 'none' } },\n div(\n {\n class: 'tr',\n role: 'row',\n },\n ...columnHeaders\n )\n )\n )\n if (this.pinnedTop > 0) {\n this.append(\n div(\n {\n part: 'pinnedTopRows',\n class: 'tbody',\n role: 'rowgroup',\n style: {\n flex: '0 0 auto',\n overflow: 'hidden',\n height: `${this.rowHeight * this.pinnedTop}px`,\n },\n bindList: {\n value: this.rowData.pinnedTop,\n virtual: this.virtual,\n },\n },\n this.rowTemplate(visibleColumns)\n )\n )\n }\n this.append(\n div(\n {\n part: 'visibleRows',\n class: 'tbody',\n role: 'rowgroup',\n style: {\n content: ' ',\n minHeight: '100px',\n flex: '1 1 100px',\n overflow: 'hidden auto',\n },\n bindList: {\n value: this.rowData.visible,\n virtual: this.virtual,\n },\n },\n this.rowTemplate(visibleColumns)\n )\n )\n if (this.pinnedBottom > 0) {\n this.append(\n div(\n {\n part: 'pinnedBottomRows',\n class: 'tbody',\n role: 'rowgroup',\n style: {\n flex: '0 0 auto',\n overflow: 'hidden',\n height: `${this.rowHeight * this.pinnedBottom}px`,\n },\n bindList: {\n value: this.rowData.pinnedBottom,\n virtual: this.virtual,\n },\n },\n this.rowTemplate(visibleColumns)\n )\n )\n }\n }\n}\n\nexport const dataTable = DataTable.elementCreator({\n tag: 'xin-table',\n styleSpec: {\n ':host': {\n overflow: 'auto hidden',\n },\n ':host .thead, :host .tbody': {\n width: vars.gridRowWidth,\n },\n ':host .tr': {\n display: 'grid',\n gridTemplateColumns: vars.gridColumns,\n height: vars.rowHeight,\n lineHeight: vars.rowHeight,\n },\n ':host .td, :host .th': {\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n display: 'flex',\n alignItems: 'center',\n },\n ':host .th .menu-trigger': {\n color: 'currentColor',\n background: 'none',\n padding: 0,\n lineHeight: vars.touchSize,\n height: vars.touchSize,\n width: vars.touchSize,\n },\n ':host [draggable=\"true\"]': {\n cursor: 'ew-resize',\n },\n ':host [draggable=\"true\"]:active': {\n background: varDefault.draggedHeaderBg('#0004'),\n color: varDefault.draggedHeaderColor('#fff'),\n },\n ':host .drag-over': {\n background: varDefault.dropHeaderBg('#fff4'),\n },\n },\n}) as ElementCreator<DataTable>\n",
15
15
  "import { elements } from 'tosijs'\n\ntype TrackerCallback = (\n dx: number,\n dy: number,\n event: PointerEvent\n) => boolean | undefined\n\n/*#\n# trackDrag\n\nSometimes you want to track a mouse-drag or touch-drag operation without messing around.\nThis is how the resizeable columns in `<xin-table>` work.\n\nJust call `trackDrag(event, (dx, dy, event) => { ... })` and you'll get updates on corresponding events until\nyou return `true` from the event-handler (or, in the case of `touch` events, the last `touch` ends).\nFor mouse events, a \"tracker\" element is thrown up in front of everything for the event.\n\n```html\n<p>\n Try dragging the squares…<br>\n (You can drag them separately with multi-touch!)\n</p>\n<div class=\"draggable\" style=\"top: 20px; left: 40px; background: #f008\"></div>\n<div class=\"draggable\" style=\"left: 40%; bottom: 30%; background: #0f08\"></div>\n<div class=\"draggable\" style=\"bottom: 30px; right: 10px; background: #00f8\"></div>\n```\n```css\n.preview {\n touch-action: none;\n}\n\n.draggable {\n content: ' ';\n position: absolute;\n width: 50px;\n height: 50px;\n cursor: move;\n}\n\n.preview p {\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translateX(-50%) translateY(-50%);\n}\n```\n```js\nimport { trackDrag } from 'tosijs-ui'\n\nfunction dragItem(event) {\n const draggable = event.target\n if (draggable.classList.contains('draggable')) {\n const x = draggable.offsetLeft\n const y = draggable.offsetTop\n trackDrag(event, (dx, dy, event) => {\n draggable.style.left = (x + dx) + 'px'\n draggable.style.top = (y + dy) + 'px'\n draggable.style.bottom = 'auto'\n draggable.style.right = 'auto'\n return event.type === 'mouseup'\n })\n }\n}\n\npreview.addEventListener('mousedown', dragItem )\npreview.addEventListener('touchstart', dragItem, { passive: true } )\n```\n\nFor `touch` events, `dx` and `dy` are based on tracking `event.changedTouches[0]` which\nis almost certainly what you want.\n\nTo handle multi-touch gestures you will need to track the touches yourself.\n\n## bringToFront\n\n`bringToFront(element: HTMLElement, selector = 'body *')` gives the element the highest\n`z-index` of any element matching the selector (which is passed to findHighestZ).\n\n## findHighestZ\n\n`findHighestZ(selector = 'body *'): number` returns the the highest `z-index` of any element\nmatching `selector`.\n*/\nconst TRACKER = elements.div({\n style: {\n content: ' ',\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n },\n})\n\nconst PASSIVE = { passive: true }\n\nexport const trackDrag = (\n event: PointerEvent,\n callback: TrackerCallback,\n cursor = 'move'\n): void => {\n const isTouchEvent = event.type.startsWith('touch')\n\n if (!isTouchEvent) {\n const origX = event.clientX\n const origY = event.clientY\n\n TRACKER.style.cursor = cursor\n bringToFront(TRACKER)\n document.body.append(TRACKER)\n\n const wrappedCallback = (event: any) => {\n const dx = event.clientX - origX\n const dy = event.clientY - origY\n if (callback(dx, dy, event) === true) {\n TRACKER.removeEventListener('mousemove', wrappedCallback)\n TRACKER.removeEventListener('mouseup', wrappedCallback)\n TRACKER.remove()\n }\n }\n\n TRACKER.addEventListener('mousemove', wrappedCallback, PASSIVE)\n TRACKER.addEventListener('mouseup', wrappedCallback, PASSIVE)\n } else if (event instanceof TouchEvent) {\n const touch = event.changedTouches[0]\n const touchId = touch.identifier\n const origX = touch.clientX\n const origY = touch.clientY\n const target: any = event.target\n\n let dx = 0\n let dy = 0\n const wrappedCallback = (event: any) => {\n const touch = [...event.touches].find(\n (touch) => touch.identifier === touchId\n )\n if (touch !== undefined) {\n dx = touch.clientX - origX\n dy = touch.clientY - origY\n }\n if (event.type === 'touchmove') {\n event.stopPropagation()\n event.preventDefault()\n }\n if (callback(dx, dy, event) === true || touch === undefined) {\n target.removeEventListener('touchmove', wrappedCallback)\n target.removeEventListener('touchend', wrappedCallback)\n target.removeEventListener('touchcancel', wrappedCallback)\n }\n }\n\n target.addEventListener('touchmove', wrappedCallback)\n target.addEventListener('touchend', wrappedCallback, PASSIVE)\n target.addEventListener('touchcancel', wrappedCallback, PASSIVE)\n }\n}\n\nexport const findHighestZ = (selector = 'body *'): number =>\n [...document.querySelectorAll(selector)]\n .map((elt) => parseFloat(getComputedStyle(elt).zIndex))\n .reduce(\n (z, highest) => (isNaN(z) || Number(z) < highest ? highest : Number(z)),\n 0\n )\n\nexport const bringToFront = (\n element: HTMLElement,\n selector = 'body *'\n): void => {\n element.style.zIndex = String(findHighestZ(selector) + 1)\n}\n",
16
16
  "/*#\n# menu\n\nBeing able to pop a menu up anywhere is just so nice, and `tosijs-ui` allows menus\nto be generated on-the-fly, and even supports hierarchical menus.\n\n## popMenu and `<xin-menu>`\n\n`popMenu({target, menuItems, …})` will spawn a menu from a target.\n\nThe `<xin-menu>` component places creates a trigger button, hosts\nmenuItems, and (because it persists in the DOM) supports keyboard\nshortcuts.\n\n```js\nimport { popMenu, localize, xinMenu, postNotification, xinLocalized, icons } from 'tosijs-ui'\nimport { elements } from 'tosijs'\n\nlet picked = ''\nlet testingEnabled = false\n\nconst menuItems = [\n {\n icon: 'thumbsUp',\n caption: 'Like',\n shortcut: '^L',\n action() {\n postNotification({\n message: 'I like it!',\n icon: 'thumbsUp',\n duration: 1\n })\n }\n },\n {\n icon: 'heart',\n caption: 'Love',\n shortcut: '⌘⇧L',\n action() {\n postNotification({\n type: 'success',\n message: 'I LOVE it!',\n icon: 'heart',\n duration: 1\n })\n }\n },\n {\n icon: 'thumbsDown',\n caption: 'dislike',\n shortcut: '⌘D',\n action() {\n postNotification({\n type: 'error',\n message: 'Awwwwwww…',\n icon: 'thumbsDown',\n duration: 1\n })\n }\n },\n null, // separator\n {\n caption: localize('Localized placeholder'),\n action() {\n alert(localize('Localized placeholder'))\n }\n },\n {\n icon: elements.span('🥹'),\n caption: 'Also see…',\n menuItems: [\n {\n icon: elements.span('😳'),\n caption: 'And that’s not all…',\n menuItems: [\n {\n icon: 'externalLink',\n caption: 'timezones',\n action: 'https://timezones.tosijs.net/'\n },\n {\n icon: 'externalLink',\n caption: 'b8rjs',\n action: 'https://b8rjs.com'\n },\n ]\n },\n {\n icon: 'tosi',\n caption: 'tosi',\n action: 'https://xinjs.net'\n },\n {\n icon: 'tosiPlatform',\n caption: 'tosi-platform',\n action: 'https://xinie.net'\n },\n ]\n },\n {\n icon: testingEnabled ? 'check' : '',\n caption: 'Testing Enabled',\n action() {\n testingEnabled = !testingEnabled\n }\n },\n {\n caption: 'Testing…',\n enabled() {\n return testingEnabled\n },\n menuItems: [\n {\n caption: 'one',\n checked: () => picked === 'one',\n action () {\n picked = 'one'\n }\n },\n {\n caption: 'two',\n checked: () => picked === 'two',\n action () {\n picked = 'two'\n }\n },\n {\n caption: 'three',\n checked: () => picked === 'three',\n action () {\n picked = 'three'\n }\n }\n ]\n }\n]\n\npreview.addEventListener('click', (event) => {\n if (!event.target.closest('button')) {\n return\n }\n popMenu({\n target: event.target,\n menuItems\n })\n})\n\npreview.append(\n xinMenu(\n {\n menuItems,\n localized: true,\n },\n xinLocalized('Menu'),\n icons.chevronDown()\n )\n)\n```\n```html\n<button title=\"menu test\">\n <xin-icon icon=\"moreVertical\"></xin-icon>\n</button>\n<button title=\"menu test from bottom-right\" style=\"position: absolute; bottom: 0; right: 0\">\n <xin-icon icon=\"moreVertical\"></xin-icon>\n</button>\n```\n```css\n.preview button {\n min-width: 44px;\n text-align: center;\n height: 44px;\n margin: 5px;\n}\n```\n\n## Overflow test\n\n```js\nimport { popMenu, icons, postNotification } from 'tosijs-ui'\nimport { elements } from 'tosijs'\n\npreview.querySelector('button').addEventListener('click', (event) => {\n popMenu({\n target: event.target,\n menuItems: Object.keys(icons).map(icon => ({\n icon,\n caption: icon,\n action() {\n postNotification({\n icon: icon,\n message: icon,\n duration: 1\n })\n }\n }))\n })\n})\n```\n```html\n<button title=\"big menu test\" style=\"position: absolute; top: 0; left: 0\">\n Big Menu Test\n</button>\n```\n\n## popMenu({target, width, menuItems…})\n\n```\nexport interface PopMenuOptions {\n target: HTMLElement\n menuItems: MenuItem[]\n width?: string | number\n position?: FloatPosition\n submenuDepth?: number // don't set this, it's set internally by popMenu\n submenuOffset?: { x: number; y: number }\n localized?: boolean,\n showChecked?: boolean, // if true, scroll checked item(s) into view\n}\n```\n\n`popMenu` will spawn a menu on a target element. A menu is just a `MenuItem[]`.\n\n## MenuItem\n\nA `MenuItem` can be one of three things:\n\n- `null` denotes a separator\n- `MenuAction` denotes a labeled button or `<a>` tag based on whether the `action` provided\n is a url (string) or an event handler (function).\n- `SubMenu` is a submenu.\n\n### MenuAction\n\nNote that popMenu does not implement shortcuts for you (yet!).\n\n```\ninterface MenuAction {\n caption: string\n shortcut?: string\n checked?: () => boolean\n enabled?: () => boolean\n action: ActionCallback | string\n icon?: string | Element\n}\n```\n\n### SubMenu\n\n```\ninterface SubMenu {\n caption: string\n enabled?: () => boolean\n menuItems: MenuItem[]\n icon?: string | Element\n}\n```\n\n### Keyboard Shortcuts\n\nIf a menu is embodied in a `<xin-menu>` it is supported by keyboard\nshortcuts. Both text and symbolic shortcut descriptions are supported,\ne.g.\n\n- `⌘C` or `meta-C`\n- `⇧P` for `shift-P`\n- `^F` or `ctrl-f`\n- `⌥x`, `⎇x`, `alt-x` or `option-x`\n\n## Localization\n\nIf you set `localized: true` in `PopMenuOptions` then menu captions will be be\npassed through `localize`. You'll need to provide the appropriate localized strings,\nof course.\n\n> `<xin-menu>` supports the `localized` attribute but it doesn't localize\n> its trigger button.\n\nTo see this in action, see the example below, or look at the\n[table example](?data-table.ts). It uses a `localized` menu\nto render column names when you show hidden columns.\n\n```js\nimport { elements } from 'tosijs'\nimport { xinLocalized, localize, icons, popMenu, postNotification } from 'tosijs-ui'\nconst { button } = elements\nconst makeItem = s => ({\n caption: s,\n action() {\n postNotification({\n message: localize(s),\n duration: 1\n })\n }\n})\nconst target = button(\n {\n onClick(event) {\n popMenu({\n target: event.target.closest('button'),\n localized: true,\n menuItems: [\n makeItem('New'),\n makeItem('Open...'),\n makeItem('Save'),\n makeItem('Close'),\n ]\n })\n }\n },\n xinLocalized(\n { style: { marginRight: '5px' }},\n 'menu'\n ),\n icons.chevronDown()\n)\npreview.append(target)\n```\n\n## Why another menu library?!\n\nSupport for menus is sadly lacking in HTML, and unfortunately there's a huge conceptual problem\nwith menus implemented the way React and React-influenced libraries work, i.e. you need\nto have an instance of a menu \"wrapped around\" the DOM element that triggers it, whereas\na better approach (and one dating back at least as far as the original Mac UI) is to treat\na menu as a separate resource that can be instantiated on demand.\n\nA simple example where this becomes really obvious is if you want to associate a \"more options\"\nmenu with every row of a large table. Either you end up having an enormous DOM (virtual or otherwise)\nor you have to painfully swap out components on-the-fly.\n\nAnd, finally, submenus are darn useful for any serious app.\n\nFor this reason, `tosijs-ui` has its own menu implementation.\n*/\n\nimport {\n elements,\n varDefault,\n vars,\n StyleSheet,\n Component,\n PartsMap,\n} from 'tosijs'\nimport { popFloat, FloatPosition } from './pop-float'\nimport { icons, svgIcon, SvgIcon } from './icons'\nimport { localize, xinLocalized } from './localize'\nimport { matchShortcut } from './match-shortcut'\n\nexport type ActionCallback = () => void | Promise<void>\n\nexport interface MenuAction {\n caption: string\n shortcut?: string\n checked?: () => boolean\n enabled?: () => boolean\n action: ActionCallback | string\n icon?: string | Element\n}\n\nexport interface SubMenu {\n caption: string\n checked?: () => boolean\n enabled?: () => boolean\n menuItems: MenuItem[]\n icon?: string | Element\n}\n\nexport type MenuSeparator = null\n\nexport type MenuItem = MenuAction | SubMenu | MenuSeparator\n\nconst { div, button, span, a, xinSlot } = elements\n\nStyleSheet('xin-menu-helper', {\n '.xin-menu': {\n overflow: 'hidden auto',\n maxHeight: `calc(${vars.maxHeight} - ${varDefault.menuInset('8px')})`,\n borderRadius: vars.spacing50,\n background: varDefault.menuBg('#fafafa'),\n boxShadow: varDefault.menuShadow(\n `${vars.spacing13} ${vars.spacing50} ${vars.spacing} #0004`\n ),\n },\n '.xin-menu > div': {\n width: varDefault.menuWidth('auto'),\n },\n '.xin-menu-trigger': {\n paddingLeft: 0,\n paddingRight: 0,\n minWidth: varDefault.touchSize('48px'),\n },\n '.xin-menu-separator': {\n display: 'inline-block',\n content: ' ',\n height: '1px',\n width: '100%',\n background: varDefault.menuSeparatorColor('#2224'),\n margin: varDefault.menuSeparatorMargin('8px 0'),\n },\n '.xin-menu-item': {\n boxShadow: 'none',\n border: 'none !important',\n display: 'grid',\n alignItems: 'center',\n justifyContent: 'flex-start',\n textDecoration: 'none',\n gridTemplateColumns: '0px 1fr 30px',\n width: '100%',\n gap: 0,\n background: 'transparent',\n padding: varDefault.menuItemPadding('0 16px'),\n height: varDefault.menuItemHeight('48px'),\n lineHeight: varDefault.menuItemHeight('48px'),\n textAlign: 'left',\n },\n '.xin-menu-item, .xin-menu-item > span': {\n color: varDefault.menuItemColor('#222'),\n },\n '.xin-menu-with-icons .xin-menu-item': {\n gridTemplateColumns: '30px 1fr 30px',\n },\n '.xin-menu-item svg': {\n stroke: varDefault.menuItemIconColor('#222'),\n },\n '.xin-menu-item.xin-menu-item-checked': {\n background: varDefault.menuItemHoverBg('#eee'),\n },\n '.xin-menu-item > span:nth-child(2)': {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n textAlign: 'left',\n },\n '.xin-menu-item:hover': {\n // chrome rendering bug\n boxShadow: 'none !important',\n background: varDefault.menuItemHoverBg('#eee'),\n },\n '.xin-menu-item:active': {\n // chrome rendering bug\n boxShadow: 'none !important',\n background: varDefault.menuItemActiveBg('#aaa'),\n color: varDefault.menuItemActiveColor('#000'),\n },\n '.xin-menu-item:active svg': {\n stroke: varDefault.menuItemIconActiveColor('#000'),\n },\n})\n\nexport const createMenuAction = (\n item: MenuAction,\n options: PopMenuOptions\n): HTMLElement => {\n const checked = (item.checked && item.checked() && 'check') || false\n let icon = item?.icon || checked || span(' ')\n if (typeof icon === 'string') {\n icon = icons[icon]()\n }\n let menuItem: HTMLElement\n if (typeof item?.action === 'string') {\n menuItem = a(\n {\n class: 'xin-menu-item',\n href: item.action,\n },\n icon,\n options.localized ? span(localize(item.caption)) : span(item.caption),\n span(item.shortcut || ' ')\n )\n } else {\n menuItem = button(\n {\n class: 'xin-menu-item',\n onClick: item.action,\n },\n icon,\n options.localized ? span(localize(item.caption)) : span(item.caption),\n span(item.shortcut || ' ')\n )\n }\n menuItem.classList.toggle('xin-menu-item-checked', checked !== false)\n if (item?.enabled && !item.enabled()) {\n menuItem.setAttribute('disabled', '')\n }\n return menuItem\n}\n\nexport const createSubMenu = (\n item: SubMenu,\n options: PopMenuOptions\n): HTMLElement => {\n const checked = (item.checked && item.checked() && 'check') || false\n let icon = item?.icon || checked || span(' ')\n if (typeof icon === 'string') {\n icon = icons[icon]()\n }\n const submenuItem = button(\n {\n class: 'xin-menu-item',\n disabled: !(!item.enabled || item.enabled()),\n onClick(event: Event) {\n popMenu(\n Object.assign({}, options, {\n menuItems: item.menuItems,\n target: submenuItem,\n submenuDepth: (options.submenuDepth || 0) + 1,\n position: 'side',\n })\n )\n event.stopPropagation()\n event.preventDefault()\n },\n },\n icon,\n options.localized ? span(localize(item.caption)) : span(item.caption),\n icons.chevronRight({ style: { justifySelf: 'flex-end' } })\n )\n return submenuItem\n}\n\nexport const createMenuItem = (\n item: MenuItem,\n options: PopMenuOptions\n): HTMLElement => {\n if (item === null) {\n return span({ class: 'xin-menu-separator' })\n } else {\n const createdItem = (item as MenuAction)?.action\n ? createMenuAction(item as MenuAction, options)\n : createSubMenu(item as SubMenu, options)\n if (options.showChecked && item.checked && item.checked()) {\n requestAnimationFrame(() => {\n createdItem.scrollIntoView({ block: 'center' })\n })\n }\n return createdItem\n }\n}\n\nexport const menu = (options: PopMenuOptions): HTMLDivElement => {\n const { target, width, menuItems } = options\n const hasIcons = menuItems.find(\n (item) => item?.icon || (item as MenuAction)?.checked\n )\n return div(\n {\n class: hasIcons ? 'xin-menu xin-menu-with-icons' : 'xin-menu',\n onClick() {\n removeLastMenu(0)\n },\n },\n div(\n {\n style: {\n minWidth: target.offsetWidth + 'px',\n width: typeof width === 'number' ? `${width}px` : width,\n },\n onMousedown(event: Event) {\n event.preventDefault()\n event.stopPropagation()\n },\n },\n ...menuItems.map((item) => createMenuItem(item, options))\n )\n )\n}\n\ninterface PoppedMenu {\n target: HTMLElement\n menu: HTMLElement\n}\nlet lastPopped: PoppedMenu | undefined\nconst poppedMenus: PoppedMenu[] = []\n\nexport const removeLastMenu = (depth = 0): PoppedMenu | undefined => {\n const toBeRemoved = poppedMenus.splice(depth)\n for (const popped of toBeRemoved) {\n popped.menu.remove()\n }\n lastPopped = toBeRemoved[0]\n return depth > 0 ? poppedMenus[depth - 1] : undefined\n}\n\nexport interface PopMenuOptions {\n target: HTMLElement\n menuItems: MenuItem[]\n width?: string | number\n position?: FloatPosition\n submenuDepth?: number\n submenuOffset?: { x: number; y: number }\n localized?: boolean\n showChecked?: boolean\n}\n\ndocument.body.addEventListener('mousedown', (event: Event) => {\n if (\n event.target &&\n !poppedMenus.find((popped) => popped.target.contains(event.target as Node))\n ) {\n removeLastMenu(0)\n }\n})\ndocument.body.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n removeLastMenu(0)\n }\n})\n\nexport const popMenu = (options: PopMenuOptions): void => {\n options = Object.assign({ submenuDepth: 0 }, options)\n const { target, position, submenuDepth } = options\n if (lastPopped && !document.body.contains(lastPopped?.menu)) {\n lastPopped = undefined\n }\n if (poppedMenus.length && !document.body.contains(poppedMenus[0].menu)) {\n poppedMenus.splice(0)\n }\n if (submenuDepth === 0 && lastPopped?.target === target) return\n const popped = removeLastMenu(submenuDepth)\n if (lastPopped?.target === target) return\n if (popped && popped.target === target) {\n removeLastMenu()\n return\n }\n\n if (!options.menuItems?.length) {\n return\n }\n const content = menu(options)\n const float = popFloat({\n content,\n target,\n position,\n })\n float.remainOnScroll = 'remove'\n poppedMenus.push({\n target,\n menu: float,\n })\n}\n\nfunction findShortcutAction(\n items: MenuItem[],\n event: KeyboardEvent\n): MenuAction | undefined {\n for (const item of items) {\n if (!item) continue\n const { shortcut } = item as MenuAction\n const { menuItems } = item as SubMenu\n\n if (shortcut) {\n if (matchShortcut(event, shortcut)) {\n return item as MenuAction\n }\n } else if (menuItems) {\n const foundAction = findShortcutAction(menuItems, event)\n if (foundAction) {\n return foundAction\n }\n }\n }\n return undefined\n}\n\ninterface XinMenuParts extends PartsMap {\n trigger: HTMLButtonElement\n icon: SvgIcon\n}\n\nexport class XinMenu extends Component<XinMenuParts> {\n menuItems: MenuItem[] = []\n menuWidth = 'auto'\n localized = false\n\n showMenu = (event: Event) => {\n if (event.type === 'click' || (event as KeyboardEvent).code === 'Space') {\n popMenu({\n target: this.parts.trigger,\n width: this.menuWidth,\n localized: this.localized,\n menuItems: this.menuItems,\n })\n event.stopPropagation()\n event.preventDefault()\n }\n }\n\n content = () =>\n button({ tabindex: 0, part: 'trigger', onClick: this.showMenu }, xinSlot())\n\n handleShortcut = async (event: KeyboardEvent) => {\n const menuAction = findShortcutAction(this.menuItems, event)\n if (menuAction) {\n if (menuAction.action instanceof Function) {\n menuAction.action()\n }\n }\n }\n\n constructor() {\n super()\n\n this.initAttributes('menuWidth', 'localized', 'icon')\n\n this.addEventListener('keydown', this.showMenu)\n }\n\n connectedCallback() {\n super.connectedCallback()\n document.addEventListener('keydown', this.handleShortcut, true)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n document.removeEventListener('keydown', this.handleShortcut)\n }\n}\n\nexport const xinMenu = XinMenu.elementCreator({\n tag: 'xin-menu',\n styleSpec: {\n ':host': {\n display: 'inline-block',\n },\n ':host button > xin-slot': {\n display: 'flex',\n alignItems: 'center',\n gap: varDefault.xinMenuTriggerGap('10px'),\n },\n },\n})\n",
17
- "/*#\n# float\n\nA floating, potentially draggable user interface element.\n\n```html\n<xin-float class=\"float\" remain-on-resize=\"remain\" remain-on-scroll=\"remain\" drag>\n <h4>Drag Me</h4>\n <div class=\"no-drag balloon\">🎈</div>\n <div class=\"behavior\">I ignore resizing and scrolling</div>\n <footer style=\"font-size: 75%\">neunundneunzig pixel-ballon</footer>\n</xin-float>\n\n<xin-float class=\"float\" remain-on-scroll=\"remain\" style=\"top: 50px; right: 20px;\" drag>\n <h4>Drag Me</h4>\n <div class=\"no-drag balloon\">🎈</div>\n <div class=\"behavior\">I disappear on resize</div>\n <footer style=\"font-size: 75%\">neunundneunzig pixel-ballon</footer>\n</xin-float>\n\n<xin-float class=\"float\" remain-on-resize=\"remain\" remain-on-scroll=\"remove\" style=\"bottom: 20px; left: 50px;\" drag>\n <h4>Drag Me</h4>\n <div class=\"no-drag balloon\">🎈</div>\n <div class=\"behavior\">I disappear on scroll</div>\n <footer style=\"font-size: 75%\">neunundneunzig pixel-ballon</footer>\n</xin-float>\n```\n```css\n.preview .float {\n width: 220px;\n height: 180px;\n padding: 0;\n gap: 5px;\n display: flex;\n flex-direction: column;\n border-radius: 5px;\n background: #fff8;\n box-shadow: 2px 10px 20px #0004;\n overflow: hidden;\n cursor: move;\n}\n\n.preview h4 {\n margin: 0;\n padding: 5px 10px;\n color: white;\n background: red;\n}\n\n.preview .balloon {\n cursor: default;\n flex: 1 1 auto;\n font-size: 99px;\n line-height: 120px;\n text-align: center;\n height: auto;\n overflow: hidden;\n}\n\n.preview .behavior {\n position: absolute;\n bottom: 16px;\n left: 8px;\n right: 8px;\n background: #fffc;\n}\n\n.preview footer {\n text-align: center;\n background: #f008;\n color: white;\n```\n\n## Styling\n\nNote that the `<xin-float>` element has absolutely minimal styling. It's up to you to provide a drop\nshadow and background and so on.\n\n## Attributes\n\n- `drag` false | true — to make a `<xin-float>` element draggable, simply set its `drag` attribute.\n- `remain-on-resize` 'remove' | 'hide' | 'remain' — by default, floats will hide if the window is resized\n- `remain-on-scroll` 'remain' | 'remove' | 'hide' — by default, floats will remain if the document is scrolled\n\nNote that `remain-on-scroll` behavior applies to any scrolling in the document (including within the float) so\nif you want finer-grained disappearing behavior triggered by scrolling, you might want to implement it yourself.\n\nTo prevent dragging for an interior element (e.g. if you want a floating palette with buttons or input fields)\njust add the `no-drag` class to an element or its container.\n*/\n\nimport { Component as WebComponent, elements, ElementCreator } from 'tosijs'\nimport { trackDrag, bringToFront } from './track-drag'\n\nconst { slot } = elements\n\nexport class XinFloat extends WebComponent {\n static floats: Set<XinFloat> = new Set()\n\n drag = false\n remainOnResize: 'hide' | 'remove' | 'remain' = 'remove'\n remainOnScroll: 'hide' | 'remove' | 'remain' = 'remain'\n\n content = slot()\n\n static styleSpec = {\n ':host': {\n position: 'fixed',\n },\n }\n\n constructor() {\n super()\n this.initAttributes('drag', 'remainOnResize', 'remainOnScroll')\n }\n\n reposition = (event: Event) => {\n const target = event.target as HTMLElement | null\n if (target?.closest('.no-drag')) {\n return\n }\n if (this.drag) {\n bringToFront(this)\n const x = this.offsetLeft\n const y = this.offsetTop\n\n trackDrag(\n event as PointerEvent,\n (\n dx: number,\n dy: number,\n pointerEvent: PointerEvent\n ): true | undefined => {\n this.style.left = `${x + dx}px`\n this.style.top = `${y + dy}px`\n this.style.right = 'auto'\n this.style.bottom = 'auto'\n if (pointerEvent.type === 'mouseup') {\n return true\n }\n }\n )\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n XinFloat.floats.add(this)\n const PASSIVE = { passive: true }\n this.addEventListener('touchstart', this.reposition, PASSIVE)\n this.addEventListener('mousedown', this.reposition, PASSIVE)\n bringToFront(this)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n XinFloat.floats.delete(this)\n }\n}\n\nexport const xinFloat = XinFloat.elementCreator({\n tag: 'xin-float',\n}) as ElementCreator<XinFloat>\n\nwindow.addEventListener(\n 'resize',\n () => {\n ;[...XinFloat.floats].forEach((float: XinFloat) => {\n if (float.remainOnResize === 'hide') {\n float.hidden = true\n } else if (float.remainOnResize === 'remove') {\n float.remove()\n }\n })\n },\n { passive: true }\n)\n\ndocument.addEventListener(\n 'scroll',\n (event: Event) => {\n if (\n event.target instanceof HTMLElement &&\n event.target.closest(XinFloat.tagName as string)\n ) {\n return\n }\n ;[...XinFloat.floats].forEach((float: XinFloat) => {\n if (float.remainOnScroll === 'hide') {\n float.hidden = true\n } else if (float.remainOnScroll === 'remove') {\n float.remove()\n }\n })\n },\n { passive: true, capture: true }\n)\n",
18
- "/*#\n# popFloat\n\nThere are so many cases in user-interfaces where it's useful to pop-up a floating\nuser interface element that a simple and reliable way of doing this seems like\na good idea.\n\nThe problem with many such approaches is that they assume a highly specific\nuse-case (e.g. popup menu or combo box) and while meeting the creator's intended\npurpose admirably, turn out to have some annoying limitation that prevents them\nhandling the specific case at hand.\n\n```js\nimport { popFloat, positionFloat } from 'tosijs-ui'\nimport { button } from 'tosijs'.elements\nconst grid = preview.querySelector('.grid')\n\ngrid.addEventListener('click', (event) => {\n const { target } = event\n if (!target.closest('button')) {\n return\n }\n const float = preview.querySelector('xin-float')\n if (float === null) {\n // create and position a float\n preview.append(\n popFloat({\n content: [\n 'hello, I am a float',\n button('close me', {\n onClick(event){\n event.target.closest('xin-float').remove()\n }\n })\n ],\n target,\n position: target.dataset.float,\n remainOnScroll: 'remove',\n remainOnResize: 'remove'\n })\n )\n } else {\n // position an existing float\n positionFloat(float, target, target.dataset.float, 'remove', 'remove')\n }\n})\n```\n```html\n<h2>Pop Float Demo</h2>\n<div class=\"grid\">\n <button data-float=\"nw\">nw</button>\n <button data-float=\"n\">n</button>\n <button data-float=\"ne\">ne</button>\n <button data-float=\"wn\">wn</button>\n <span>&nbsp;</span>\n <button data-float=\"en\">en</button>\n <button data-float=\"w\">w</button>\n <button data-float=\"auto\">auto</button>\n <button data-float=\"e\">e</button>\n <button data-float=\"ws\">ws</button>\n <button data-float=\"side\">side</button>\n <button data-float=\"es\">es</button>\n <button data-float=\"sw\">sw</button>\n <button data-float=\"s\">s</button>\n <button data-float=\"se\">se</button>\n</div>\n```\n```css\n.preview .grid {\n display: grid;\n grid-template-columns: 80px 80px 80px;\n}\n\n.preview xin-float {\n display: flex;\n flex-direction: column;\n border-radius: 5px;\n padding: 10px 15px;\n background: var(--inset-bg);\n box-shadow:\n inset 0 0 0 1px var(--brand-color),\n 2px 10px 5px #0004;\n}\n```\n\n## popFloat\n\n```\nexport interface PopFloatOptions {\n content: HTMLElement | ElementPart[]\n target: HTMLElement\n position?: FloatPosition\n remainOnResize?: 'hide' | 'remove' | 'remain' // default is 'remove',\n remainOnScroll?: 'hide' | 'remove' | 'remain' // default is 'remain'\n}\n\nexport const popFloat = (options: PopFloatOptions): XinFloat\n```\n\nCreate a `<xin-float>` with the content provided, positioned as specified (or automatically).\n\n## positionFloat\n\n```\nexport const positionFloat = (\n element: HTMLElement,\n target: HTMLElement,\n position?: FloatPosition,\n remainOnScroll: 'hide' | 'remove' | 'remain' = 'remain'\n remainOnResize: 'hide' | 'remove' | 'remain' = 'remove',\n): void\n```\n\nThis allows you to, for example, provide a global menu that can be used on any element\ninstead of needing to have a whole instance of the menu wrapped around every instance\nof the thing you want the menu to affect (a common anti-pattern of front-end frameworks).\n\n### Handling Overflow\n\n`positionFloat` automatically sets two css-variables `--max-height` and `--max-width` on\nthe floating element to help you deal with overflow (e.g. in menus). E.g. if the float\nis positioned with `top: 125px` then it will set `--max-height: calc(100vh - 125px)`.\n\n## FloatPosition\n\n```\nexport type FloatPosition =\n| 'n'\n| 's'\n| 'e'\n| 'w'\n| 'ne'\n| 'nw'\n| 'se'\n| 'sw'\n| 'en'\n| 'wn'\n| 'es'\n| 'ws'\n| 'side'\n| 'auto'\n```\n\n*/\n\nimport { ElementPart } from 'tosijs'\nimport { xinFloat, XinFloat } from './float'\nimport { bringToFront } from './track-drag'\n\nexport type FloatPosition =\n | 'n'\n | 's'\n | 'e'\n | 'w'\n | 'ne'\n | 'nw'\n | 'se'\n | 'sw'\n | 'en'\n | 'wn'\n | 'es'\n | 'ws'\n | 'side'\n | 'auto'\n\nexport interface PopFloatOptions {\n content: HTMLElement | ElementPart[]\n target: HTMLElement\n position?: FloatPosition\n remainOnScroll?: 'hide' | 'remove' | 'remain'\n remainOnResize?: 'hide' | 'remove' | 'remain'\n}\n\nexport const popFloat = (options: PopFloatOptions): XinFloat => {\n const { content, target, position, remainOnScroll, remainOnResize } = options\n const float = Array.isArray(content)\n ? xinFloat(...content)\n : xinFloat(content)\n\n positionFloat(float, target, position, remainOnScroll, remainOnResize)\n document.body.append(float)\n return float\n}\n\nexport const positionFloat = (\n element: XinFloat,\n target: HTMLElement,\n position?: FloatPosition,\n remainOnScroll?: 'hide' | 'remove' | 'remain',\n remainOnResize?: 'hide' | 'remove' | 'remain'\n): void => {\n {\n const { position } = getComputedStyle(element)\n if (position !== 'fixed') {\n element.style.position = 'fixed'\n }\n if (remainOnResize) element.remainOnResize = remainOnResize\n if (remainOnScroll) element.remainOnScroll = remainOnScroll\n bringToFront(element)\n }\n const { left, top, width, height } = target.getBoundingClientRect()\n const cx = left + width * 0.5\n const cy = top + height * 0.5\n const w = window.innerWidth\n const h = window.innerHeight\n if (position === 'side') {\n position = ((cx < w * 0.5 ? 'e' : 'w') +\n (cy < h * 0.5 ? 's' : 'n')) as FloatPosition\n } else if (position === 'auto' || position === undefined) {\n position = ((cy < h * 0.5 ? 's' : 'n') +\n (cx < w * 0.5 ? 'e' : 'w')) as FloatPosition\n }\n element.style.top =\n element.style.left =\n element.style.right =\n element.style.bottom =\n element.style.transform =\n ''\n if (position.length === 2) {\n const [first, second] = position\n switch (first) {\n case 'n':\n element.style.bottom = (h - top).toFixed(2) + 'px'\n break\n case 'e':\n element.style.left = (left + width).toFixed(2) + 'px'\n break\n case 's':\n element.style.top = (top + height).toFixed(2) + 'px'\n break\n case 'w':\n element.style.right = (w - left).toFixed(2) + 'px'\n break\n }\n\n switch (second) {\n case 'n':\n element.style.bottom = (h - top - height).toFixed(2) + 'px'\n break\n case 'e':\n element.style.left = left.toFixed(2) + 'px'\n break\n case 's':\n element.style.top = top.toFixed(2) + 'px'\n break\n case 'w':\n element.style.right = (w - left - width).toFixed(2) + 'px'\n break\n }\n element.style.transform = ''\n } else if (position === 'n') {\n element.style.bottom = (h - top).toFixed(2) + 'px'\n element.style.left = cx.toFixed(2) + 'px'\n element.style.transform = 'translateX(-50%)'\n } else if (position === 's') {\n element.style.top = (top + height).toFixed(2) + 'px'\n element.style.left = cx.toFixed(2) + 'px'\n element.style.transform = 'translateX(-50%)'\n } else if (position === 'e') {\n element.style.left = (left + width).toFixed(2) + 'px'\n element.style.top = cy.toFixed(2) + 'px'\n element.style.transform = 'translateY(-50%)'\n } else if (position === 'w') {\n element.style.right = (w - left).toFixed(2) + 'px'\n element.style.top = cy.toFixed(2) + 'px'\n element.style.transform = 'translateY(-50%)'\n }\n element.style.setProperty(\n '--max-height',\n `calc(100vh - ${element.style.top || element.style.bottom})`\n )\n element.style.setProperty(\n '--max-width',\n `calc(100vw - ${element.style.left || element.style.right})`\n )\n}\n",
19
- "/*#\n# localize\n\n`tosijs-ui` provides support for localization via the `localize` method and the `<xin-locale-picker>`\nand `<xin-localized>` custom-elements.\n\n> ### Important Note\n> This module deals with the **language** used in the user interface. \"locale\" is\n> *not the same thing*. The (usually) two-letter codes used designate **language**\n> and **not locale**.\n>\n> E.g. the US *locale* includes things like measurement systems\n> and date format. Most European locales use commas where we use decimal points in the US.\n>\n> Similarly, `ja` is the code for the Japanese **language** while `jp` is the **locale**.\n\n## `initLocalization(localizationData: string)`\n\nEnables localization from TSV string data.\n\n## XinLocalePicker\n\nA selector that lets the user pick from among supported languages.\n\n```html\n<h3>Locale Picker</h3>\n<xin-locale-picker></xin-locale-picker>\n\n<h3>Locale Picker with <code>hide-captions</code></h3>\n<xin-locale-picker hide-caption></xin-locale-picker>\n```\n\n## `localize()`\n\nIf you just want to localize a string with code, use `localize(s: string): string`.\n\nIf the reference string only matches when both are converted to\nlowercase, the output string will also be lowercase.\n\nE.g. if you have localized `Cancel` as `Annuler`, then `localize(\"cancel\")\nwill output `annuler`.\n\n### ellipses\n\nIf you end a string with an ellipsis, `localize` will ignore the ellipsis,\nlocalize the string, and then append the ellipsis.\n\n## `setLocale(language: string)`\n\n```js\nimport { button, p } from 'tosijs'.elements\nimport { setLocale } from 'tosijs-ui'\n\npreview.append(\n p(\n button(\n {\n onClick() {\n setLocale('en-US')\n }\n },\n 'setLocale(\"en-US\")'\n )\n ),\n p(\n button(\n {\n onClick() {\n setLocale('fr')\n }\n },\n 'setLocale(\"fr\")'\n )\n ),\n p(\n button(\n {\n onClick() {\n setLocale('qq')\n }\n },\n 'setLocale(\"qq\") (see console for error message)'\n )\n ),\n)\n```\n\nIf you want to directly set locale, just use `setLocale()`.\n\n## XinLocalized\n\nA span-replacement that automatically localizes its text content.\nBy default the case in the localized data is preserved unless the\nreference text is all lowercase, in which case the localized text\nis also lowercased.\n\nWhile viewing this documentation, all `<xin-localized>` elements should display a **red\nunderline**.\n\n```html\n<h3>Localized Widgets</h3>\n<button><xin-localized>Yes</xin-localized></button>\n<button><xin-localized>No</xin-localized></button>\n<button><xin-localized>Open…</xin-localized></button> <i>note the ellipsis</i>\n\n<h3>Lowercase is preserved</h3>\n<button><xin-localized>yes</xin-localized></button>\n<button><xin-localized>no</xin-localized></button>\n<button><xin-localized>open…</xin-localized></button>\n\n<h3>Localized Attribute</h3>\n<input>\n```\n```css\nxin-localized {\n border-bottom: 2px solid red;\n}\n```\n```js\nimport { xinLocalized, localize } from 'tosijs-ui'\n\npreview.append(xinLocalized({\n refString: 'localized placeholder',\n localeChanged() {\n this.previousElementSibling.setAttribute('placeholder', localize(this.refString))\n }\n}))\n```\n\n`<xin-localized>` has a `refString` attribute (which defaults to its initial `textContent`)\nwhich is the text that it localizes. You can set it directly.\n\nIt also has an `localeChanged` method which defaults to setting the content of the element\nto the localized reference string, but which you can override, to (for example) set a property\nor attribute of the parent element.\n\n> `<xin-localized>` *can* be used inside the shadowDOM of other custom-elements.\n\n## `i18n`\n\nAll of the data can be bound in the `i18n` proxy (`xin.i18n`), including the currently selected\nlocale (which will default to `navigator.language`).\n\nYou can take a look at `xin.i18n` in the console. `i18n` can be used to access localization\ndata directly, and also to determine which locales are available `i18n.locales` and set the\nlocale programmatically (e.g. `i18n.locale = 'en'`).\n\n```\nif (i18n.locales.includes('fr')) {\n i18n.locale = 'fr'\n}\n```\n\n## Creating Localized String Data\n\nYou can create your own localization data using any spreadsheet and exporting TSV.\n\nE.g. you can automatically create localization data\nusing something like my [localized](https://docs.google.com/spreadsheets/d/1L0_4g_dDhVCwVVxLzYbMj_H86xSp9lsRCKj7IS9psso/edit?usp=sharing)\nGoogle Sheet which leverages `googletranslate` to automatically translate reference strings\n(and which you can manually override as you like).\n\nE.g. in this demo I've replaced the incorrect translation of \"Finnish\"\n(`googletranslate` used the word for Finnish nationality rather than the language).\n\nThe format of the input data is a table in TSV format, that looks like this:\n\nen-US | fr | fi | sv | zh\n------|----|----|----|----\nEnglish (US) | French | Finnish | Swedish | Chinese (Mandarin)\nEnglish (US) | Français | suomi | svenska | 中文(普通话)\n🇺🇸 | 🇫🇷 | 🇫🇮 | 🇸🇪 | 🇨🇳\nIcon | Icône | Kuvake | Ikon | 图标\nOk | D'accord | Ok | Ok | 好的\nCancel | Annuler | Peruuttaa | Avboka | 取消\n\n- Column 1 is your reference language.\n- Row 1 is [language code](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes).\n- Row 2 is the name of the language in your reference language.\n- Row 3 is the name of the language in itself (because it's silly to expect people\n to know the name of their language in a language they don't know)\n- Row 4 is the flag emoji for that language (yes, that's problematic, but languages\n do not have flags, per se)\n- Rows 5 and on are user interface strings you want to localize\n\nIn the spreadsheet provided, each cell contains a formula that translates the term\nin the left-most column from the language in that column to the language in the\ndestination column. Once you have an automatic translation, you can hand off the\nsheet to language experts to vet the translations.\n\nFinally, create a `tsv` file and then turn that into a Typescript file by wrapping\nthe content thus:\n\n```\nexport default `( content of tsv file )`\n```\n\nYou use this data using `initLocalization()`.\n\n## Leveraging XinLocalized Automatic Updates\n\nIf you want to leverage XinLocalized's automatic updates you simply need to\nimplement `updateLocale` and register yourself with `XinLocalized.allInstances`\n(which is a `Set<AbstractLocalized>).\n\nTypically, this would look like something like:\n\n```\nclass MyLocalizedComponent extends Component {\n ...\n\n // register yourself as a localized component\n connectecCallback() {\n super.connectedCallback()\n\n XinLocalized.allInstances.add(this)\n }\n\n // avoid leaking!\n disconnectecCallback() {\n super.connectedCallback()\n\n XinLocalized.allInstances.delete(this)\n }\n\n // presumably your render method does the right things\n updateLocale = () => {\n this.queueRender()\n }\n}\n```\n*/\n\nimport {\n Component,\n tosi,\n elements,\n bindings,\n observe,\n BoxedProxy,\n} from 'tosijs'\nimport { makeSorter } from './make-sorter'\nimport { xinSelect, XinSelect } from './select'\n\ninterface TranslationMap {\n [key: string]: string[]\n}\n\ninterface I18nConfig {\n locale: string\n locales: string[]\n languages: string[]\n emoji: string[]\n stringMap: TranslationMap\n localeOptions: Array<{\n icon: any // simplified to prevent inferred type from being massive\n caption: string\n value: string\n }>\n}\n\nconst { span } = elements\n\nexport const { i18n } = tosi({\n i18n: {\n locale: window.navigator.language,\n locales: [window.navigator.language],\n languages: [window.navigator.language],\n emoji: [''],\n stringMap: {} as TranslationMap,\n localeOptions: [\n {\n icon: span() as any,\n caption: window.navigator.language,\n value: window.navigator.language,\n },\n ],\n },\n})\n\nbindings.localeOptions = {\n toDOM(select, options) {\n if (select instanceof XinSelect) {\n select.options = options\n }\n },\n}\n\nexport const setLocale = (language: string) => {\n if (i18n.locales.xinValue.includes(language)) {\n i18n.locale.xinValue = language\n } else {\n console.error(`language ${language} is not available`)\n }\n}\n\nexport const updateLocalized = () => {\n const localizeds = Array.from(XinLocalized.allInstances)\n for (const localized of localizeds) {\n localized.localeChanged()\n }\n}\n\n// @ts-ignore-error it's a proxy\nobserve(i18n.locale.xinPath, updateLocalized)\n\nconst captionSort = makeSorter((locale: { caption: string }) => [\n locale.caption.toLocaleLowerCase(),\n])\n\nexport function initLocalization(localizedStrings: string) {\n const [locales, , languages, emoji, ...strings] = localizedStrings\n .split('\\n')\n .map((line) => line.split('\\t'))\n if (locales && languages && emoji && strings) {\n i18n.locales.xinValue = locales\n i18n.languages.xinValue = languages\n i18n.emoji.xinValue = emoji\n i18n.stringMap.xinValue = strings.reduce(\n (map: TranslationMap, strings: string[]) => {\n map[strings[0].toLocaleLowerCase()] = strings\n return map\n },\n {} as TranslationMap\n )\n i18n.localeOptions.xinValue = locales\n .map((locale, index) => ({\n icon: span({ title: locales[index] }, emoji[index]),\n caption: languages[index],\n value: locale,\n }))\n .sort(captionSort)\n\n // if user locale isn't available, find the best match\n if (!i18n.locales.xinValue.includes(i18n.locale.xinValue)) {\n const language = i18n.locale.substring(0, 2)\n i18n.locale.xinValue =\n i18n.locales.xinValue.find(\n (locale: string) => locale.substring(0, 2) === language\n ) || i18n.locales.xinValue[0]\n }\n updateLocalized()\n }\n}\n\nexport function localize(ref: string): string {\n if (ref.endsWith('…')) {\n return localize(ref.substring(0, ref.length - 1)) + '…'\n }\n const index = i18n.locales.xinValue.indexOf(i18n.locale.xinValue)\n if (index > -1) {\n const map = i18n.stringMap[ref.toLocaleLowerCase()]\n const localized = map && map[index]\n if (localized) {\n ref =\n ref.toLocaleLowerCase() === ref\n ? localized.toLocaleLowerCase()\n : localized.valueOf()\n }\n }\n return ref\n}\n\nexport class LocalePicker extends Component {\n hideCaption = false\n\n content = () => {\n return xinSelect({\n part: 'select',\n showIcon: true,\n title: localize('Language'),\n bindValue: i18n.locale,\n bindLocaleOptions: i18n.localeOptions,\n })\n }\n\n constructor() {\n super()\n\n this.initAttributes('hideCaption')\n }\n\n render(): void {\n super.render()\n\n this.parts.select.toggleAttribute('hide-caption', this.hideCaption)\n }\n}\n\nexport const localePicker = LocalePicker.elementCreator({\n tag: 'xin-locale-picker',\n})\n\ninterface AbstractLocalized {\n localeChanged: () => void\n connectedCallback: () => void\n disconnectedCallback: () => void\n}\n\nexport class XinLocalized extends Component {\n static allInstances = new Set<AbstractLocalized>()\n\n contents = () => elements.xinSlot()\n\n refString = ''\n\n constructor() {\n super()\n\n this.initAttributes('refString')\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n XinLocalized.allInstances.add(this as unknown as AbstractLocalized)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n XinLocalized.allInstances.delete(this as unknown as AbstractLocalized)\n }\n\n localeChanged() {\n if (!this.refString) {\n this.refString = this.textContent || ''\n }\n this.textContent = this.refString ? localize(this.refString) : ''\n }\n\n render() {\n super.render()\n\n this.localeChanged()\n }\n}\n\nexport const xinLocalized = XinLocalized.elementCreator({\n tag: 'xin-localized',\n styleSpec: {\n ':host': {\n pointerEvents: 'none',\n },\n },\n})\n",
17
+ "/*#\n# float\n\nA floating, potentially draggable user interface element.\n\n```html\n<xin-float class=\"float\" remain-on-resize=\"remain\" remain-on-scroll=\"remain\" drag>\n <h4>Drag Me</h4>\n <div class=\"no-drag balloon\">🎈</div>\n <div class=\"behavior\">I ignore resizing and scrolling</div>\n <footer style=\"font-size: 75%\">neunundneunzig pixel-ballon</footer>\n</xin-float>\n\n<xin-float class=\"float\" remain-on-scroll=\"remain\" style=\"top: 50px; right: 20px;\" drag>\n <h4>Drag Me</h4>\n <div class=\"no-drag balloon\">🎈</div>\n <div class=\"behavior\">I disappear on resize</div>\n <footer style=\"font-size: 75%\">neunundneunzig pixel-ballon</footer>\n</xin-float>\n\n<xin-float class=\"float\" remain-on-resize=\"remain\" remain-on-scroll=\"remove\" style=\"bottom: 20px; left: 50px;\" drag>\n <h4>Drag Me</h4>\n <div class=\"no-drag balloon\">🎈</div>\n <div class=\"behavior\">I disappear on scroll</div>\n <footer style=\"font-size: 75%\">neunundneunzig pixel-ballon</footer>\n</xin-float>\n```\n```css\n.preview .float {\n width: 220px;\n height: 180px;\n padding: 0;\n gap: 5px;\n display: flex;\n flex-direction: column;\n border-radius: 5px;\n background: #fff8;\n box-shadow: 2px 10px 20px #0004;\n overflow: hidden;\n cursor: move;\n}\n\n.preview h4 {\n margin: 0;\n padding: 5px 10px;\n color: white;\n background: red;\n}\n\n.preview .balloon {\n cursor: default;\n flex: 1 1 auto;\n font-size: 99px;\n line-height: 120px;\n text-align: center;\n height: auto;\n overflow: hidden;\n}\n\n.preview .behavior {\n position: absolute;\n bottom: 16px;\n left: 8px;\n right: 8px;\n background: #fffc;\n}\n\n.preview footer {\n text-align: center;\n background: #f008;\n color: white;\n```\n\n## Styling\n\nNote that the `<xin-float>` element has absolutely minimal styling. It's up to you to provide a drop\nshadow and background and so on.\n\n## Attributes\n\n- `drag` false | true — to make a `<xin-float>` element draggable, simply set its `drag` attribute.\n- `remain-on-resize` 'remove' | 'hide' | 'remain' — by default, floats will hide if the window is resized\n- `remain-on-scroll` 'remain' | 'remove' | 'hide' — by default, floats will remain if the document is scrolled\n\nNote that `remain-on-scroll` behavior applies to any scrolling in the document (including within the float) so\nif you want finer-grained disappearing behavior triggered by scrolling, you might want to implement it yourself.\n\nTo prevent dragging for an interior element (e.g. if you want a floating palette with buttons or input fields)\njust add the `no-drag` class to an element or its container.\n*/\n\nimport { Component as WebComponent, elements, ElementCreator } from 'tosijs'\nimport { trackDrag, bringToFront } from './track-drag'\n\nconst { slot } = elements\n\nexport class XinFloat extends WebComponent {\n static floats: Set<XinFloat> = new Set()\n\n drag = false\n remainOnResize: 'hide' | 'remove' | 'remain' = 'remove'\n remainOnScroll: 'hide' | 'remove' | 'remain' = 'remain'\n\n content = slot()\n\n static styleSpec = {\n ':host': {\n position: 'fixed',\n },\n }\n\n constructor() {\n super()\n this.initAttributes('drag', 'remainOnResize', 'remainOnScroll')\n }\n\n reposition = (event: Event) => {\n const target = event.target as HTMLElement | null\n if (target?.closest('.no-drag')) {\n return\n }\n if (this.drag) {\n bringToFront(this)\n const x = this.offsetLeft\n const y = this.offsetTop\n\n trackDrag(\n event as PointerEvent,\n (\n dx: number,\n dy: number,\n pointerEvent: PointerEvent\n ): true | undefined => {\n this.style.left = `${x + dx}px`\n this.style.top = `${y + dy}px`\n this.style.right = 'auto'\n this.style.bottom = 'auto'\n if (pointerEvent.type === 'mouseup') {\n return true\n }\n }\n )\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n XinFloat.floats.add(this)\n const PASSIVE = { passive: true }\n this.addEventListener('touchstart', this.reposition, PASSIVE)\n this.addEventListener('mousedown', this.reposition, PASSIVE)\n bringToFront(this)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n XinFloat.floats.delete(this)\n }\n}\n\nexport const xinFloat = XinFloat.elementCreator({\n tag: 'xin-float',\n}) as ElementCreator<XinFloat>\n\nwindow.addEventListener(\n 'resize',\n () => {\n Array.from(XinFloat.floats).forEach((float: XinFloat) => {\n if (float.remainOnResize === 'hide') {\n float.hidden = true\n } else if (float.remainOnResize === 'remove') {\n float.remove()\n }\n })\n },\n { passive: true }\n)\n\ndocument.addEventListener(\n 'scroll',\n (event: Event) => {\n if (\n event.target instanceof HTMLElement &&\n event.target.closest(XinFloat.tagName as string)\n ) {\n return\n }\n Array.from(XinFloat.floats).forEach((float: XinFloat) => {\n if (float.remainOnScroll === 'hide') {\n float.hidden = true\n } else if (float.remainOnScroll === 'remove') {\n float.remove()\n }\n })\n },\n { passive: true, capture: true }\n)\n",
18
+ "/*#\n# popFloat\n\nThere are so many cases in user-interfaces where it's useful to pop-up a floating\nuser interface element that a simple and reliable way of doing this seems like\na good idea.\n\nThe problem with many such approaches is that they assume a highly specific\nuse-case (e.g. popup menu or combo box) and while meeting the creator's intended\npurpose admirably, turn out to have some annoying limitation that prevents them\nhandling the specific case at hand.\n\n```js\nimport { popFloat, positionFloat } from 'tosijs-ui'\nimport { button } from 'tosijs'.elements\nconst grid = preview.querySelector('.grid')\n\ngrid.addEventListener('click', (event) => {\n const { target } = event\n if (!target.closest('button')) {\n return\n }\n const float = document.querySelector('.popped-float')\n if (float === null) {\n // create and position a float\n popFloat({\n class: 'popped-float',\n content: [\n 'hello, I am a float',\n button('close me', {\n onClick(event){\n event.target.closest('xin-float').remove()\n }\n })\n ],\n target,\n position: target.dataset.float,\n remainOnScroll: 'remove',\n remainOnResize: 'remove'\n })\n } else {\n // position an existing float\n positionFloat(float, target, target.dataset.float, 'remove', 'remove')\n }\n})\n```\n```html\n<h2>Pop Float Demo</h2>\n<div class=\"grid\">\n <button data-float=\"nw\">nw</button>\n <button data-float=\"n\">n</button>\n <button data-float=\"ne\">ne</button>\n <button data-float=\"wn\">wn</button>\n <span>&nbsp;</span>\n <button data-float=\"en\">en</button>\n <button data-float=\"w\">w</button>\n <button data-float=\"auto\">auto</button>\n <button data-float=\"e\">e</button>\n <button data-float=\"ws\">ws</button>\n <button data-float=\"side\">side</button>\n <button data-float=\"es\">es</button>\n <button data-float=\"sw\">sw</button>\n <button data-float=\"s\">s</button>\n <button data-float=\"se\">se</button>\n</div>\n```\n```css\n.preview .grid {\n display: grid;\n grid-template-columns: 80px 80px 80px;\n}\n\n.popped-float {\n display: flex;\n flex-direction: column;\n border-radius: 5px;\n padding: 10px 15px;\n background: var(--inset-bg);\n box-shadow:\n inset 0 0 0 1px var(--brand-color),\n 2px 10px 5px #0004;\n}\n```\n\n## popFloat\n\n```\nexport interface PopFloatOptions {\n class?: string\n content: HTMLElement | ElementPart[]\n target: HTMLElement\n position?: FloatPosition\n remainOnResize?: 'hide' | 'remove' | 'remain' // default is 'remove',\n remainOnScroll?: 'hide' | 'remove' | 'remain' // default is 'remain',\n draggable?: boolean\n}\n\nexport const popFloat = (options: PopFloatOptions): XinFloat\n```\n\nCreate a `<xin-float>` with the content provided, positioned as specified (or automatically).\n\n## positionFloat\n\n```\nexport const positionFloat = (\n element: HTMLElement,\n target: HTMLElement,\n position?: FloatPosition,\n remainOnScroll: 'hide' | 'remove' | 'remain' = 'remain',\n remainOnResize: 'hide' | 'remove' | 'remain' = 'remove',\n draggable = false\n): void\n```\n\nThis allows you to, for example, provide a global menu that can be used on any element\ninstead of needing to have a whole instance of the menu wrapped around every instance\nof the thing you want the menu to affect (a common anti-pattern of front-end frameworks).\n\n### Handling Overflow\n\n`positionFloat` automatically sets two css-variables `--max-height` and `--max-width` on\nthe floating element to help you deal with overflow (e.g. in menus). E.g. if the float\nis positioned with `top: 125px` then it will set `--max-height: calc(100vh - 125px)`.\n\n## FloatPosition\n\n```\nexport type FloatPosition =\n| 'n'\n| 's'\n| 'e'\n| 'w'\n| 'ne'\n| 'nw'\n| 'se'\n| 'sw'\n| 'en'\n| 'wn'\n| 'es'\n| 'ws'\n| 'side'\n| 'auto'\n```\n\n## Draggable\n\nSometimes it's nice to have popup palettes and modeless dialogs the user can drag away.\n`popFloat()` makes this really easy to do.\n\n```js\nimport { elements } from 'tosijs'\nimport { popFloat, icons } from 'tosijs-ui'\n\nconst { button, h4, p } = elements\n\npreview.append(button(\n 'Draggable Popup',\n {\n class: 'spawn-draggable',\n onClick(event) {\n popFloat({\n class: 'tearoff',\n content: [\n h4('Move me!'),\n p('I’m delicious!'),\n button(\n icons.x(),\n {\n class: 'no-drag close-tearoff',\n onClick(event) {\n event.target.closest('xin-float').remove()\n }\n }\n )\n ],\n target: event.target,\n remainOnScroll: 'remain',\n remainOnResize: 'remain',\n draggable: true,\n })\n }\n },\n))\n```\n```css\n.tearoff {\n --tearoff-bg: #fff6;\n --tearoff-button-bg: #fff2;\n --tearoff-color: #222;\n --tearoff-hilite: #fff8;\n --tearoff-shadow: #0002;\n display: flex;\n flex-direction: column;\n border-radius: 20px;\n padding: 10px 15px;\n background: var(--tearoff-bg);\n backdrop-filter: blur(6px);\n box-shadow:\n inset 1px 1px 0 1px var(--tearoff-hilite),\n inset -1px -1px 0 1px var(--tearoff-shadow),\n 2px 5px 10px var(--tearoff-shadow);\n width: 200px;\n color: var(--tearoff-color);\n --text-color: var(--tearoff-color);\n}\n\n.darkmode .tearoff {\n --tearoff-bg: #0004;\n --tearoff-button-bg: #0001;\n --tearoff-color: #fff;\n}\n\n.tearoff > :first-child {\n margin-top: 0;\n}\n\n.tearoff > :last-child {\n margin-bottom: 0;\n}\n\n.spawn-draggable {\n margin: 10px;\n}\n\n.close-tearoff {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 32px;\n height: 32px;\n text-align: center;\n padding: 0;\n line-height: 32px;\n background: var(--tearoff-button-bg);\n border-radius: 100px;\n box-shadow:\n inset 1px 1px 0 1px var(--tearoff-hilite),\n inset -1px -1px 0 1px var(--tearoff-shadow);\n}\n```\n\n*/\n\nimport { ElementPart } from 'tosijs'\nimport { xinFloat, XinFloat } from './float'\nimport { bringToFront } from './track-drag'\n\nexport type FloatPosition =\n | 'n'\n | 's'\n | 'e'\n | 'w'\n | 'ne'\n | 'nw'\n | 'se'\n | 'sw'\n | 'en'\n | 'wn'\n | 'es'\n | 'ws'\n | 'side'\n | 'auto'\n\nexport interface PopFloatOptions {\n class?: string\n content: HTMLElement | ElementPart[]\n target: HTMLElement\n position?: FloatPosition\n remainOnScroll?: 'hide' | 'remove' | 'remain'\n remainOnResize?: 'hide' | 'remove' | 'remain'\n draggable?: boolean\n}\n\nexport const popFloat = (options: PopFloatOptions): XinFloat => {\n const {\n content,\n target,\n position,\n remainOnScroll,\n remainOnResize,\n draggable,\n } = options\n const float = Array.isArray(content)\n ? xinFloat(...content)\n : xinFloat(content)\n\n positionFloat(\n float,\n target,\n position,\n remainOnScroll,\n remainOnResize,\n draggable\n )\n if (options.class) {\n float.setAttribute('class', options.class)\n }\n document.body.append(float)\n return float\n}\n\nexport const positionFloat = (\n element: XinFloat,\n target: HTMLElement,\n position?: FloatPosition,\n remainOnScroll?: 'hide' | 'remove' | 'remain',\n remainOnResize?: 'hide' | 'remove' | 'remain',\n draggable = false\n): void => {\n {\n const { position } = getComputedStyle(element)\n if (position !== 'fixed') {\n element.style.position = 'fixed'\n }\n if (remainOnResize) element.remainOnResize = remainOnResize\n if (remainOnScroll) element.remainOnScroll = remainOnScroll\n bringToFront(element)\n }\n element.drag = draggable\n const { left, top, width, height } = target.getBoundingClientRect()\n const cx = left + width * 0.5\n const cy = top + height * 0.5\n const w = window.innerWidth\n const h = window.innerHeight\n if (position === 'side') {\n position = ((cx < w * 0.5 ? 'e' : 'w') +\n (cy < h * 0.5 ? 's' : 'n')) as FloatPosition\n } else if (position === 'auto' || position === undefined) {\n position = ((cy < h * 0.5 ? 's' : 'n') +\n (cx < w * 0.5 ? 'e' : 'w')) as FloatPosition\n }\n element.style.top =\n element.style.left =\n element.style.right =\n element.style.bottom =\n element.style.transform =\n ''\n if (position.length === 2) {\n const [first, second] = position\n switch (first) {\n case 'n':\n element.style.bottom = (h - top).toFixed(2) + 'px'\n break\n case 'e':\n element.style.left = (left + width).toFixed(2) + 'px'\n break\n case 's':\n element.style.top = (top + height).toFixed(2) + 'px'\n break\n case 'w':\n element.style.right = (w - left).toFixed(2) + 'px'\n break\n }\n\n switch (second) {\n case 'n':\n element.style.bottom = (h - top - height).toFixed(2) + 'px'\n break\n case 'e':\n element.style.left = left.toFixed(2) + 'px'\n break\n case 's':\n element.style.top = top.toFixed(2) + 'px'\n break\n case 'w':\n element.style.right = (w - left - width).toFixed(2) + 'px'\n break\n }\n element.style.transform = ''\n } else if (position === 'n') {\n element.style.bottom = (h - top).toFixed(2) + 'px'\n element.style.left = cx.toFixed(2) + 'px'\n element.style.transform = 'translateX(-50%)'\n } else if (position === 's') {\n element.style.top = (top + height).toFixed(2) + 'px'\n element.style.left = cx.toFixed(2) + 'px'\n element.style.transform = 'translateX(-50%)'\n } else if (position === 'e') {\n element.style.left = (left + width).toFixed(2) + 'px'\n element.style.top = cy.toFixed(2) + 'px'\n element.style.transform = 'translateY(-50%)'\n } else if (position === 'w') {\n element.style.right = (w - left).toFixed(2) + 'px'\n element.style.top = cy.toFixed(2) + 'px'\n element.style.transform = 'translateY(-50%)'\n }\n element.style.setProperty(\n '--max-height',\n `calc(100vh - ${element.style.top || element.style.bottom})`\n )\n element.style.setProperty(\n '--max-width',\n `calc(100vw - ${element.style.left || element.style.right})`\n )\n}\n",
19
+ "/*#\n# localize\n\n`tosijs-ui` provides support for localization via the `localize` method and the `<xin-locale-picker>`\nand `<xin-localized>` custom-elements.\n\n> ### Important Note\n> This module deals with the **language** used in the user interface. \"locale\" is\n> *not the same thing*. The (usually) two-letter codes used designate **language**\n> and **not locale**.\n>\n> E.g. the US *locale* includes things like measurement systems\n> and date format. Most European locales use commas where we use decimal points in the US.\n>\n> Similarly, `ja` is the code for the Japanese **language** while `jp` is the **locale**.\n\n## `initLocalization(localizationData: string)`\n\nEnables localization from TSV string data.\n\n## XinLocalePicker\n\nA selector that lets the user pick from among supported languages.\n\n```html\n<h3>Locale Picker</h3>\n<xin-locale-picker></xin-locale-picker>\n\n<h3>Locale Picker with <code>hide-captions</code></h3>\n<xin-locale-picker hide-caption></xin-locale-picker>\n```\n\n## `localize()`\n\nIf you just want to localize a string with code, use `localize(s: string): string`.\n\nIf the reference string only matches when both are converted to\nlowercase, the output string will also be lowercase.\n\nE.g. if you have localized `Cancel` as `Annuler`, then `localize(\"cancel\")\nwill output `annuler`.\n\n### ellipses\n\nIf you end a string with an ellipsis, `localize` will ignore the ellipsis,\nlocalize the string, and then append the ellipsis.\n\n## `setLocale(language: string)`\n\n```js\nimport { button, p } from 'tosijs'.elements\nimport { setLocale } from 'tosijs-ui'\n\npreview.append(\n p(\n button(\n {\n onClick() {\n setLocale('en-US')\n }\n },\n 'setLocale(\"en-US\")'\n )\n ),\n p(\n button(\n {\n onClick() {\n setLocale('fr')\n }\n },\n 'setLocale(\"fr\")'\n )\n ),\n p(\n button(\n {\n onClick() {\n setLocale('qq')\n }\n },\n 'setLocale(\"qq\") (see console for error message)'\n )\n ),\n)\n```\n\nIf you want to directly set locale, just use `setLocale()`.\n\n## XinLocalized\n\nA span-replacement that automatically localizes its text content.\nBy default the case in the localized data is preserved unless the\nreference text is all lowercase, in which case the localized text\nis also lowercased.\n\nWhile viewing this documentation, all `<xin-localized>` elements should display a **red\nunderline**.\n\n```html\n<h3>Localized Widgets</h3>\n<button><xin-localized>Yes</xin-localized></button>\n<button><xin-localized>No</xin-localized></button>\n<button><xin-localized>Open…</xin-localized></button> <i>note the ellipsis</i>\n\n<h3>Lowercase is preserved</h3>\n<button><xin-localized>yes</xin-localized></button>\n<button><xin-localized>no</xin-localized></button>\n<button><xin-localized>open…</xin-localized></button>\n\n<h3>Localized Attribute</h3>\n<input>\n```\n```css\nxin-localized {\n border-bottom: 2px solid red;\n}\n```\n```js\nimport { xinLocalized, localize } from 'tosijs-ui'\n\npreview.append(xinLocalized({\n refString: 'localized placeholder',\n localeChanged() {\n this.previousElementSibling.setAttribute('placeholder', localize(this.refString))\n }\n}))\n```\n\n`<xin-localized>` has a `refString` attribute (which defaults to its initial `textContent`)\nwhich is the text that it localizes. You can set it directly.\n\nIt also has an `localeChanged` method which defaults to setting the content of the element\nto the localized reference string, but which you can override, to (for example) set a property\nor attribute of the parent element.\n\n> `<xin-localized>` *can* be used inside the shadowDOM of other custom-elements.\n\n## `i18n`\n\nAll of the data can be bound in the `i18n` proxy (`xin.i18n`), including the currently selected\nlocale (which will default to `navigator.language`).\n\nYou can take a look at `xin.i18n` in the console. `i18n` can be used to access localization\ndata directly, and also to determine which locales are available `i18n.locales` and set the\nlocale programmatically (e.g. `i18n.locale = 'en'`).\n\n```\nif (i18n.locales.includes('fr')) {\n i18n.locale = 'fr'\n}\n```\n\n## Creating Localized String Data\n\nYou can create your own localization data using any spreadsheet and exporting TSV.\n\nE.g. you can automatically create localization data\nusing something like my [localized](https://docs.google.com/spreadsheets/d/1L0_4g_dDhVCwVVxLzYbMj_H86xSp9lsRCKj7IS9psso/edit?usp=sharing)\nGoogle Sheet which leverages `googletranslate` to automatically translate reference strings\n(and which you can manually override as you like).\n\nE.g. in this demo I've replaced the incorrect translation of \"Finnish\"\n(`googletranslate` used the word for Finnish nationality rather than the language).\n\nThe format of the input data is a table in TSV format, that looks like this:\n\nen-US | fr | fi | sv | zh\n------|----|----|----|----\nEnglish (US) | French | Finnish | Swedish | Chinese (Mandarin)\nEnglish (US) | Français | suomi | svenska | 中文(普通话)\n🇺🇸 | 🇫🇷 | 🇫🇮 | 🇸🇪 | 🇨🇳\nIcon | Icône | Kuvake | Ikon | 图标\nOk | D'accord | Ok | Ok | 好的\nCancel | Annuler | Peruuttaa | Avboka | 取消\n\n- Column 1 is your reference language.\n- Row 1 is [language code](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes).\n- Row 2 is the name of the language in your reference language.\n- Row 3 is the name of the language in itself (because it's silly to expect people\n to know the name of their language in a language they don't know)\n- Row 4 is the flag emoji for that language (yes, that's problematic, but languages\n do not have flags, per se)\n- Rows 5 and on are user interface strings you want to localize\n\nIn the spreadsheet provided, each cell contains a formula that translates the term\nin the left-most column from the language in that column to the language in the\ndestination column. Once you have an automatic translation, you can hand off the\nsheet to language experts to vet the translations.\n\nFinally, create a `tsv` file and then turn that into a Typescript file by wrapping\nthe content thus:\n\n```\nexport default `( content of tsv file )`\n```\n\nYou use this data using `initLocalization()`.\n\n## Leveraging XinLocalized Automatic Updates\n\nIf you want to leverage XinLocalized's automatic updates you simply need to\nimplement `updateLocale` and register yourself with `XinLocalized.allInstances`\n(which is a `Set<AbstractLocalized>).\n\nTypically, this would look like something like:\n\n```\nclass MyLocalizedComponent extends Component {\n ...\n\n // register yourself as a localized component\n connectecCallback() {\n super.connectedCallback()\n\n XinLocalized.allInstances.add(this)\n }\n\n // avoid leaking!\n disconnectecCallback() {\n super.connectedCallback()\n\n XinLocalized.allInstances.delete(this)\n }\n\n // presumably your render method does the right things\n updateLocale = () => {\n this.queueRender()\n }\n}\n```\n*/\n\nimport {\n Component,\n tosi,\n elements,\n bindings,\n observe,\n BoxedProxy,\n} from 'tosijs'\nimport { makeSorter } from './make-sorter'\nimport { xinSelect, XinSelect } from './select'\n\ninterface TranslationMap {\n [key: string]: string[]\n}\n\ninterface I18nConfig {\n locale: string\n locales: string[]\n languages: string[]\n emoji: string[]\n stringMap: TranslationMap\n localeOptions: Array<{\n icon: any // simplified to prevent inferred type from being massive\n caption: string\n value: string\n }>\n}\n\nconst { span } = elements\n\nexport const { i18n } = tosi({\n i18n: {\n locale: window.navigator.language,\n locales: [window.navigator.language],\n languages: [window.navigator.language],\n emoji: [''],\n stringMap: {} as TranslationMap,\n localeOptions: [\n {\n icon: span() as any,\n caption: window.navigator.language,\n value: window.navigator.language,\n },\n ],\n },\n})\n\nbindings.localeOptions = {\n toDOM(select, options) {\n if (select instanceof XinSelect) {\n select.options = options\n }\n },\n}\n\nexport const setLocale = (language: string) => {\n if (i18n.locales.xinValue.includes(language)) {\n i18n.locale.xinValue = language\n } else {\n console.error(`language ${language} is not available`)\n }\n}\n\nexport const updateLocalized = () => {\n const localizeds = Array.from(XinLocalized.allInstances)\n for (const localized of localizeds) {\n localized.localeChanged()\n }\n}\n\n// @ts-ignore-error it's a proxy\nobserve(i18n.locale.xinPath, updateLocalized)\n\nconst captionSort = makeSorter((locale: { caption: string }) => [\n locale.caption.toLocaleLowerCase(),\n])\n\nexport function initLocalization(localizedStrings: string) {\n const [locales, , languages, emoji, ...strings] = localizedStrings\n .split('\\n')\n .map((line) => line.split('\\t'))\n if (locales && languages && emoji && strings) {\n i18n.locales.xinValue = locales\n i18n.languages.xinValue = languages\n i18n.emoji.xinValue = emoji\n i18n.stringMap.xinValue = strings.reduce(\n (map: TranslationMap, strings: string[]) => {\n map[strings[0].toLocaleLowerCase()] = strings\n return map\n },\n {} as TranslationMap\n )\n i18n.localeOptions.xinValue = locales\n .map((locale, index) => ({\n icon: span({ title: locales[index] }, emoji[index]),\n caption: languages[index],\n value: locale,\n }))\n .sort(captionSort)\n\n // if user locale isn't available, find the best match\n if (!i18n.locales.xinValue.includes(i18n.locale.xinValue)) {\n const language = i18n.locale.substring(0, 2)\n i18n.locale.xinValue =\n i18n.locales.xinValue.find(\n (locale: string) => locale.substring(0, 2) === language\n ) || i18n.locales.xinValue[0]\n }\n updateLocalized()\n }\n}\n\nexport function localize(ref: string): string {\n if (ref.endsWith('…')) {\n return localize(ref.substring(0, ref.length - 1)) + '…'\n }\n const index = i18n.locales.xinValue.indexOf(i18n.locale.xinValue)\n if (index > -1) {\n const map = i18n.stringMap[ref.toLocaleLowerCase()]\n const localized = map.xinValue && map[index]\n if (localized) {\n ref =\n ref.toLocaleLowerCase() === ref\n ? localized.toLocaleLowerCase()\n : localized.tosiValue\n }\n }\n return ref\n}\n\nexport class LocalePicker extends Component {\n hideCaption = false\n\n content = () => {\n return xinSelect({\n part: 'select',\n showIcon: true,\n title: localize('Language'),\n bindValue: i18n.locale,\n bindLocaleOptions: i18n.localeOptions,\n })\n }\n\n constructor() {\n super()\n\n this.initAttributes('hideCaption')\n }\n\n render(): void {\n super.render()\n\n this.parts.select.toggleAttribute('hide-caption', this.hideCaption)\n }\n}\n\nexport const localePicker = LocalePicker.elementCreator({\n tag: 'xin-locale-picker',\n})\n\ninterface AbstractLocalized {\n localeChanged: () => void\n connectedCallback: () => void\n disconnectedCallback: () => void\n}\n\nexport class XinLocalized extends Component {\n static allInstances = new Set<AbstractLocalized>()\n\n contents = () => elements.xinSlot()\n\n refString = ''\n\n constructor() {\n super()\n\n this.initAttributes('refString')\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n XinLocalized.allInstances.add(this as unknown as AbstractLocalized)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n XinLocalized.allInstances.delete(this as unknown as AbstractLocalized)\n }\n\n localeChanged() {\n if (!this.refString) {\n this.refString = this.textContent || ''\n }\n this.textContent = this.refString ? localize(this.refString) : ''\n }\n\n render() {\n super.render()\n\n this.localeChanged()\n }\n}\n\nexport const xinLocalized = XinLocalized.elementCreator({\n tag: 'xin-localized',\n styleSpec: {\n ':host': {\n pointerEvents: 'none',\n },\n },\n})\n",
20
20
  "export type SortValuator<T = object> = (f: T) => (string | number)[]\n\nexport type SortCallback<T = object> = (p: T, q: T) => number\n\n/*#\n# makeSorter\n\nI'm always confusing myself when writing sort functions, so I wrote `makeSorter()`. It's\ninsanely simple and just works™. It makes writing an array sort callback for anything\nother than an array of numbers or strings easier.\n\n```js\nimport { select, option, div, span, ul, li } from 'tosijs'.elements\nimport { icons, makeSorter } from 'tosijs-ui'\n\nconst people = [\n { first: 'Frasier', last: 'Crane', age: 38 },\n { first: 'Lilith', last: 'Crane', age: 37 },\n { first: 'Rebecca', last: 'Howe', age: 35 },\n { first: 'Woody', last: 'Boyd', age: 25 },\n { first: 'Sam', last: 'Malone', age: 40 },\n { first: 'Norm', last: 'Peterson', age: 38 },\n]\n\nconst sorters = {\n firstSort: makeSorter(person => [person.first]),\n firstDescSort: makeSorter(person => [person.first], false),\n nameSort: makeSorter(person => [person.last, person.first]),\n ageFirst: makeSorter(person => [-person.age, person.last]),\n ageLast: makeSorter(person => [person.age, person.first], [true, false]),\n}\n\nfunction person({first, last, age}) {\n return li(`${first} ${last}, ${age}`)\n}\n\nconst list = ul()\nsortPicker = select(\n option('Sort by first', {value: 'firstSort'}),\n option('Sort by first (desc)', {value: 'firstDescSort'}),\n option('Sort by last, first', {value: 'nameSort'}),\n option('Sort by age (desc), first', {value: 'ageFirst'}),\n option('Sort by age, last (desc)', {value: 'ageLast'}),\n {\n onChange: render,\n value: 'nameSort'\n },\n)\n\nfunction render () {\n list.textContent = ''\n list.append(...people.sort(sorters[sortPicker.value]).map(person))\n}\n\npreview.append(\n div(\n sortPicker,\n icons.chevronDown()\n ),\n list\n)\n\nrender()\n```\n```css\n.preview {\n padding: var(--spacing);\n}\n\n.preview div {\n position: absolute;\n top: var(--spacing);\n right: var(--spacing);\n}\n```\n\n## Details\n\nTo create a sort callback that sorts by propA then propB (if propA is tied):\n\n```\nconst sorter = makeSorter(\n obj => [obj.propA, obj.propB]\n)\n```\n\nAs above, but sort descending:\n```\nconst sorter = makeSorter(\n obj => [obj.propA, obj.propB],\n false\n)\n```\n\nAs above but propA is sorted ascending, propB descending\n```\nconst sorter = makeSorter(\n obj => [obj.propA, obj.propB],\n [true, false]\n)\n```\n*/\n\nexport function makeSorter<T>(\n sortValuator: SortValuator<T>,\n ascending: boolean | boolean[] = true\n): SortCallback<T> {\n return (p: any, q: any) => {\n const pSort = sortValuator(p)\n const qSort = sortValuator(q)\n for (const i in pSort) {\n if (pSort[i] !== qSort[i]) {\n const isAscending = Array.isArray(ascending)\n ? ascending[i] !== false\n : ascending\n return isAscending\n ? pSort[i] > qSort[i]\n ? 1\n : -1\n : pSort[i] > qSort[i]\n ? -1\n : 1\n }\n }\n return 0\n }\n}\n",
21
- "/*#\n# select\n\n`<xin-select>` (`xinSelect` is the `ElementCreator`) is a replacement for the lamentable\nbuilt in `<select>` element that addresses its various shortcomings.\n\n- since `<xin-select>` is powered by `popMenu`, and supports separators and submenus.\n- options can have icons.\n- `<xin-select>` will retain and display a value even if the matching option is missing.\n- its displayed value can be made `editable`, allowing use as a \"combo box\".\n- options can have `async` callbacks that return a value.\n- picking an item triggers an `action` event even if the value hasn't changed.\n- available options are set via the `options` attribute or the element's `options` property (not `<option>` elements)\n\n```html\n<xin-select\n title=\"simple select\"\n options=\"this,that,,the other\"\n value=\"not an option!\"\n></xin-select><br>\n<xin-select\n show-icon\n title=\"has captions\"\n class=\"captions\"\n value=\"image\"\n></xin-select><br>\n<xin-select\n show-icon\n title=\"combo select with icons\"\n class=\"icons\"\n editable\n placeholder=\"pick an icon\"\n></xin-select><br>\n<xin-select\n show-icon\n hide-caption\n title=\"icons only\"\n class=\"icons-only\"\n placeholder=\"pick an icon\"\n></xin-select>\n<pre contenteditable>Select some text in here…\n…to check for focus stealing</pre>\n```\n```js\nimport { icons } from 'tosijs-ui'\n\nconst captions = preview.querySelector('.captions')\n\ncaptions.options = [\n {\n caption: 'a heading',\n value: 'heading'\n },\n {\n caption: 'a paragraph',\n value: 'paragraph'\n },\n null,\n {\n caption: 'choose some other',\n options: [\n {\n icon: 'image',\n caption: 'an image',\n value: 'image'\n },\n {\n icon: 'fileText',\n caption: 'a text file',\n value: 'text',\n },\n {\n icon: 'video',\n caption: 'a video',\n value: 'video'\n },\n null,\n {\n caption: 'anything goes…',\n value: () => prompt('Enter your other', 'other') || undefined\n },\n {\n caption: 'brother… (after 1s delay)',\n value: async () => new Promise(resolve => {\n setTimeout(() => resolve('brother'), 1000)\n })\n }\n ]\n }\n]\n\nconst iconsSelect = preview.querySelector('.icons')\nconst iconsOnly = preview.querySelector('.icons-only')\n\niconsSelect.options = iconsOnly.options = Object.keys(icons).sort().map(icon =>({\n icon,\n caption: icon,\n value: icon\n}))\n\npreview.addEventListener('action', (event) => {\n console.log(event.target.title, 'user picked', event.target.value)\n}, true)\n\npreview.addEventListener('change', (event) => {\n console.log(event.target.title, 'changed to', event.target.value)\n}, true)\n```\n<xin-css-var-editor element-selector=\"xin-select\"></xin-css-var-editor>\n\n## `options`\n\n type OptionRequest = () => Promise<string | undefined>\n\n export interface SelectOption {\n icon?: string | HTMLElement\n caption: string\n value: string | OptionRequest\n }\n\n export interface SelectOptionSubmenu {\n icon?: string | HTMLElement\n caption: string\n options: SelectOptions\n }\n\n export type SelectOptions = Array<string | null | SelectOption | SelectOptionSubmenu>\n\nA `<xin-select>` can be assigned `options` as a string of comma-delimited choices,\nor be provided a `SelectOptions` array (which allows for submenus, separators, etc.).\n\n## Attributes\n\n`<xin-select>` supports several attributes:\n\n- `editable` lets the user directly edit the value (like a \"combo box\").\n- `show-icon` displays the icon corresponding to the currently selected value.\n- `hide-caption` hides the caption.\n- `placeholder` allows you to set a placeholder.\n- `options` allows you to assign options as a comma-delimited string attribute.\n\n## Events\n\nPicking an option triggers an `action` event (whether or not this changes the value).\n\nChanging the value, either by typing in an editable `<xin-select>` or picking a new\nvalue triggers a `change` event.\n\nYou can look at the console to see the events triggered by the second example.\n\n## Localization\n\n`<xin-select>` supports the `localized` attribute which automatically localizes\noptions.\n\n```html\n<xin-select\n localized\n placeholder=\"localized placeholder\"\n options=\"yes,no,,moderate\"\n></xin-select>\n```\n*/\n\nimport {\n Component,\n ElementCreator,\n PartsMap,\n elements,\n vars,\n throttle,\n} from 'tosijs'\nimport { icons } from './icons'\nimport { popMenu, MenuItem, SubMenu, removeLastMenu } from './menu'\nimport { localize, XinLocalized } from './localize'\n\nconst { button, span, input } = elements\n\ntype OptionRequest = () => Promise<string | undefined>\n\nexport interface SelectOption {\n icon?: string | HTMLElement\n caption: string\n value: string | OptionRequest\n}\n\nexport interface SelectOptionSubmenu {\n icon?: string | HTMLElement\n caption: string\n options: SelectOptions\n}\n\nexport type SelectOptions = Array<\n string | null | SelectOption | SelectOptionSubmenu\n>\n\nconst hasValue = (options: SelectOptions, value: string): boolean => {\n return !!options.find((option) => {\n if (option === null || value == null) {\n return false\n } else if (Array.isArray(option)) {\n return hasValue(option, value)\n } else if ((option as SelectOption).value === value || option === value) {\n return true\n }\n })\n}\n\ninterface SelectParts extends PartsMap {\n button: HTMLButtonElement\n value: HTMLInputElement\n}\n\nexport class XinSelect extends Component<SelectParts> {\n editable = false\n showIcon = false\n hideCaption = false\n options: string | SelectOptions = ''\n value = ''\n placeholder = ''\n filter = ''\n localized = false\n disabled = false\n\n private setValue = (value: string, triggerAction = false) => {\n if (this.value !== value) {\n this.value = value\n }\n if (triggerAction) {\n this.dispatchEvent(new Event('action'))\n }\n }\n\n private getValue = () => this.value\n\n get selectOptions(): SelectOptions {\n return typeof this.options === 'string'\n ? this.options.split(',').map((option) => option.trim() || null)\n : this.options\n }\n\n private buildOptionMenuItem = (\n option: string | null | SelectOption | SelectOptionSubmenu\n ): MenuItem => {\n if (option === null) {\n return null\n }\n const { setValue, getValue } = this\n let icon: string | HTMLElement | undefined\n let caption: string\n let value: string | OptionRequest\n if (typeof option === 'string') {\n caption = value = option\n } else {\n ;({ icon, caption, value } = option as SelectOption)\n }\n if (this.localized) {\n caption = localize(caption)\n }\n const { options } = option as SelectOptionSubmenu\n if (options) {\n return {\n icon,\n caption,\n checked: () => hasValue(options, getValue()),\n menuItems: options.map(this.buildOptionMenuItem),\n }\n }\n return {\n icon,\n caption,\n checked: () => getValue() === value,\n action:\n typeof value === 'function'\n ? async () => {\n const newValue = await (value as OptionRequest)()\n if (newValue !== undefined) {\n setValue(newValue, true)\n }\n }\n : () => {\n if (typeof value === 'string') {\n setValue(value, true)\n }\n },\n }\n }\n\n get optionsMenu(): MenuItem[] {\n const options = this.selectOptions.map(this.buildOptionMenuItem)\n if (this.filter === '') {\n return options\n }\n const showOption = (option: MenuItem) => {\n if (option === null) {\n return true\n } else if ((option as SubMenu).menuItems) {\n ;(option as SubMenu).menuItems = (option as SubMenu).menuItems.filter(\n showOption\n )\n return (option as SubMenu).menuItems.length > 0\n } else {\n return option.caption.toLocaleLowerCase().includes(this.filter)\n }\n }\n return options.filter(showOption)\n }\n\n handleChange = (event: Event) => {\n const { value } = this.parts\n const newValue = value.value || ''\n if (this.value !== String(newValue)) {\n this.value = newValue\n this.dispatchEvent(new Event('change'))\n }\n this.filter = ''\n event.stopPropagation()\n event.preventDefault()\n }\n\n handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n }\n }\n\n filterMenu = throttle(() => {\n this.filter = (\n this.parts.value as HTMLInputElement\n ).value.toLocaleLowerCase()\n removeLastMenu(0)\n this.popOptions()\n })\n\n popOptions = (event?: Event) => {\n if (event && event.type === 'click') {\n this.filter = ''\n }\n this.poppedOptions = this.optionsMenu\n popMenu({\n target: this,\n menuItems: this.poppedOptions,\n showChecked: true,\n })\n }\n content = () => [\n button(\n {\n part: 'button',\n onClick: this.popOptions,\n },\n span(),\n input({\n part: 'value',\n value: this.value,\n tabindex: 0,\n onKeydown: this.handleKey,\n onInput: this.filterMenu,\n onChange: this.handleChange,\n }),\n icons.chevronDown()\n ),\n ]\n\n constructor() {\n super()\n\n this.initAttributes(\n 'options',\n 'editable',\n 'placeholder',\n 'showIcon',\n 'hideCaption',\n 'localized',\n 'disabled'\n )\n }\n\n get allOptions(): SelectOption[] {\n const all: SelectOption[] = []\n\n function flatten(some: SelectOptions): void {\n for (const option of some) {\n if (typeof option === 'string') {\n all.push({ caption: option, value: option })\n } else if ((option as SelectOption)?.value) {\n all.push(option as SelectOption)\n } else if ((option as SelectOptionSubmenu)?.options) {\n flatten((option as SelectOptionSubmenu).options)\n }\n }\n }\n\n flatten(this.selectOptions)\n return all\n }\n findOption(): SelectOption {\n const found = this.allOptions.find((option) => option.value === this.value)\n return found || { caption: this.value, value: this.value }\n }\n\n localeChanged = () => {\n this.queueRender()\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n if (this.localized) {\n XinLocalized.allInstances.add(this)\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n if (this.localized) {\n XinLocalized.allInstances.delete(this)\n }\n }\n\n render(): void {\n super.render()\n\n const { value, button } = this.parts\n button.disabled = this.disabled\n const icon = value.previousElementSibling as HTMLElement\n\n const option = this.findOption()\n let newIcon: Element = span()\n value.value = this.localized ? localize(option.caption) : option.caption\n if (option.icon) {\n if (option.icon instanceof HTMLElement) {\n newIcon = option.icon.cloneNode(true) as HTMLElement\n } else {\n newIcon = icons[option.icon]()\n }\n }\n icon.replaceWith(newIcon)\n value.setAttribute(\n 'placeholder',\n this.localized ? localize(this.placeholder) : this.placeholder\n )\n value.style.pointerEvents = this.editable ? '' : 'none'\n value.readOnly = !this.editable\n }\n}\n\nexport const xinSelect = XinSelect.elementCreator({\n tag: 'xin-select',\n styleSpec: {\n ':host': {\n '--gap': '8px',\n '--touch-size': '44px',\n '--padding': '0 8px',\n '--value-padding': '0 8px',\n '--icon-width': '24px',\n '--fieldWidth': '140px',\n display: 'inline-block',\n position: 'relative',\n },\n ':host button': {\n display: 'flex',\n alignItems: 'center',\n justifyItems: 'center',\n gap: vars.gap,\n textAlign: 'left',\n height: vars.touchSize,\n padding: vars.padding,\n position: 'relative',\n width: '100%',\n },\n ':host:not([show-icon]) button > :first-child': {\n display: 'none',\n },\n ':host[hide-caption] button > :nth-child(2)': {\n display: 'none',\n },\n ':host [part=\"value\"]': {\n width: vars.fieldWidth,\n padding: vars.valuePadding,\n height: vars.touchSize,\n lineHeight: vars.touchSize,\n boxShadow: 'none',\n whiteSpace: 'nowrap',\n outline: 'none',\n background: 'transparent',\n flex: '1',\n },\n ':host [part=\"value\"]:not(:focus)': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n background: 'transparent',\n },\n },\n}) as ElementCreator<XinSelect>\n",
21
+ "/*#\n# select\n\n`<xin-select>` (`xinSelect` is the `ElementCreator`) is a replacement for the lamentable\nbuilt in `<select>` element that addresses its various shortcomings.\n\n- since `<xin-select>` is powered by `popMenu`, and supports separators and submenus.\n- options can have icons.\n- `<xin-select>` will retain and display a value even if the matching option is missing.\n- its displayed value can be made `editable`, allowing use as a \"combo box\".\n- options can have `async` callbacks that return a value.\n- picking an item triggers an `action` event even if the value hasn't changed.\n- available options are set via the `options` attribute or the element's `options` property (not `<option>` elements)\n\n```html\n<xin-select\n title=\"simple select\"\n options=\"this,that,,the other\"\n value=\"not an option!\"\n></xin-select><br>\n<xin-select\n show-icon\n title=\"has captions\"\n class=\"captions\"\n value=\"image\"\n></xin-select><br>\n<xin-select\n show-icon\n title=\"combo select with icons\"\n class=\"icons\"\n editable\n placeholder=\"pick an icon\"\n></xin-select><br>\n<xin-select\n show-icon\n hide-caption\n title=\"icons only\"\n class=\"icons-only\"\n placeholder=\"pick an icon\"\n></xin-select>\n<pre contenteditable>Select some text in here…\n…to check for focus stealing</pre>\n```\n```js\nimport { icons } from 'tosijs-ui'\n\nconst captions = preview.querySelector('.captions')\n\ncaptions.options = [\n {\n caption: 'a heading',\n value: 'heading'\n },\n {\n caption: 'a paragraph',\n value: 'paragraph'\n },\n null,\n {\n caption: 'choose some other',\n options: [\n {\n icon: 'image',\n caption: 'an image',\n value: 'image'\n },\n {\n icon: 'fileText',\n caption: 'a text file',\n value: 'text',\n },\n {\n icon: 'video',\n caption: 'a video',\n value: 'video'\n },\n null,\n {\n caption: 'anything goes…',\n value: () => prompt('Enter your other', 'other') || undefined\n },\n {\n caption: 'brother… (after 1s delay)',\n value: async () => new Promise(resolve => {\n setTimeout(() => resolve('brother'), 1000)\n })\n }\n ]\n }\n]\n\nconst iconsSelect = preview.querySelector('.icons')\nconst iconsOnly = preview.querySelector('.icons-only')\n\niconsSelect.options = iconsOnly.options = Object.keys(icons).sort().map(icon =>({\n icon,\n caption: icon,\n value: icon\n}))\n\npreview.addEventListener('action', (event) => {\n console.log(event.target.title, 'user picked', event.target.value)\n}, true)\n\npreview.addEventListener('change', (event) => {\n console.log(event.target.title, 'changed to', event.target.value)\n}, true)\n```\n<xin-css-var-editor element-selector=\"xin-select\"></xin-css-var-editor>\n\n## `options`\n\n type OptionRequest = () => Promise<string | undefined>\n\n export interface SelectOption {\n icon?: string | HTMLElement\n caption: string\n value: string | OptionRequest\n }\n\n export interface SelectOptionSubmenu {\n icon?: string | HTMLElement\n caption: string\n options: SelectOptions\n }\n\n export type SelectOptions = Array<string | null | SelectOption | SelectOptionSubmenu>\n\nA `<xin-select>` can be assigned `options` as a string of comma-delimited choices,\nor be provided a `SelectOptions` array (which allows for submenus, separators, etc.).\n\n## Attributes\n\n`<xin-select>` supports several attributes:\n\n- `editable` lets the user directly edit the value (like a \"combo box\").\n- `show-icon` displays the icon corresponding to the currently selected value.\n- `hide-caption` hides the caption.\n- `placeholder` allows you to set a placeholder.\n- `options` allows you to assign options as a comma-delimited string attribute.\n\n## Events\n\nPicking an option triggers an `action` event (whether or not this changes the value).\n\nChanging the value, either by typing in an editable `<xin-select>` or picking a new\nvalue triggers a `change` event.\n\nYou can look at the console to see the events triggered by the second example.\n\n## Localization\n\n`<xin-select>` supports the `localized` attribute which automatically localizes\noptions.\n\n```html\n<xin-select\n localized\n placeholder=\"localized placeholder\"\n options=\"yes,no,,moderate\"\n></xin-select>\n```\n*/\n\nimport {\n Component,\n ElementCreator,\n PartsMap,\n elements,\n vars,\n throttle,\n} from 'tosijs'\nimport { icons } from './icons'\nimport { popMenu, MenuItem, SubMenu, removeLastMenu } from './menu'\nimport { localize, XinLocalized } from './localize'\n\nconst { button, span, input } = elements\n\ntype OptionRequest = () => Promise<string | undefined>\n\nexport interface SelectOption {\n icon?: string | HTMLElement\n caption: string\n value: string | OptionRequest\n}\n\nexport interface SelectOptionSubmenu {\n icon?: string | HTMLElement\n caption: string\n options: SelectOptions\n}\n\nexport type SelectOptions = Array<\n string | null | SelectOption | SelectOptionSubmenu\n>\n\nconst hasValue = (options: SelectOptions, value: string): boolean => {\n return !!options.find((option) => {\n if (option === null || value == null) {\n return false\n } else if (Array.isArray(option)) {\n return hasValue(option, value)\n } else if ((option as SelectOption).value === value || option === value) {\n return true\n }\n })\n}\n\ninterface SelectParts extends PartsMap {\n button: HTMLButtonElement\n value: HTMLInputElement\n}\n\nexport class XinSelect extends Component<SelectParts> {\n editable = false\n showIcon = false\n hideCaption = false\n options: string | SelectOptions = ''\n value = ''\n placeholder = ''\n filter = ''\n localized = false\n disabled = false\n\n private setValue = (value: string, triggerAction = false) => {\n if (this.value !== value) {\n this.value = value\n }\n if (triggerAction) {\n this.dispatchEvent(new Event('action'))\n }\n }\n\n private getValue = () => this.value\n\n get selectOptions(): SelectOptions {\n return typeof this.options === 'string'\n ? this.options.split(',').map((option) => option.trim() || null)\n : this.options\n }\n\n private buildOptionMenuItem = (\n option: string | null | SelectOption | SelectOptionSubmenu\n ): MenuItem => {\n if (option === null) {\n return null\n }\n const { setValue, getValue } = this\n let icon: string | HTMLElement | undefined\n let caption: string\n let value: string | OptionRequest\n if (typeof option === 'string') {\n caption = value = option\n } else {\n ;({ icon, caption, value } = option as SelectOption)\n }\n if (this.localized) {\n caption = localize(caption)\n }\n const { options } = option as SelectOptionSubmenu\n if (options) {\n return {\n icon,\n caption,\n checked: () => hasValue(options, getValue()),\n menuItems: options.map(this.buildOptionMenuItem),\n }\n }\n return {\n icon,\n caption,\n checked: () => getValue() === value,\n action:\n typeof value === 'function'\n ? async () => {\n const newValue = await (value as OptionRequest)()\n if (newValue !== undefined) {\n setValue(newValue, true)\n }\n }\n : () => {\n if (typeof value === 'string') {\n setValue(value, true)\n }\n },\n }\n }\n\n get optionsMenu(): MenuItem[] {\n const options = this.selectOptions.map(this.buildOptionMenuItem)\n if (this.filter === '') {\n return options\n }\n const showOption = (option: MenuItem) => {\n if (option === null) {\n return true\n } else if ((option as SubMenu).menuItems) {\n ;(option as SubMenu).menuItems = (option as SubMenu).menuItems.filter(\n showOption\n )\n return (option as SubMenu).menuItems.length > 0\n } else {\n return option.caption.toLocaleLowerCase().includes(this.filter)\n }\n }\n return options.filter(showOption)\n }\n\n handleChange = (event: Event) => {\n const { value } = this.parts\n const newValue = value.value || ''\n if (this.value !== String(newValue)) {\n this.value = newValue\n this.dispatchEvent(new Event('change'))\n }\n this.filter = ''\n event.stopPropagation()\n event.preventDefault()\n }\n\n handleKey = (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n }\n }\n\n filterMenu = throttle(() => {\n this.filter = (\n this.parts.value as HTMLInputElement\n ).value.toLocaleLowerCase()\n removeLastMenu(0)\n this.popOptions()\n })\n\n popOptions = (event?: Event) => {\n if (event && event.type === 'click') {\n this.filter = ''\n }\n this.poppedOptions = this.optionsMenu\n popMenu({\n target: this,\n menuItems: this.poppedOptions,\n showChecked: true,\n })\n }\n content = () => [\n button(\n {\n part: 'button',\n onClick: this.popOptions,\n },\n span(),\n input({\n part: 'value',\n value: this.value,\n tabindex: 0,\n onKeydown: this.handleKey,\n onInput: this.filterMenu,\n onChange: this.handleChange,\n }),\n icons.chevronDown()\n ),\n ]\n\n constructor() {\n super()\n\n this.initAttributes(\n 'options',\n 'editable',\n 'placeholder',\n 'showIcon',\n 'hideCaption',\n 'localized',\n 'disabled'\n )\n }\n\n get allOptions(): SelectOption[] {\n const all: SelectOption[] = []\n\n function flatten(some: SelectOptions): void {\n for (const option of some) {\n if (typeof option === 'string') {\n all.push({ caption: option, value: option })\n } else if ((option as SelectOption)?.value) {\n all.push(option as SelectOption)\n } else if ((option as SelectOptionSubmenu)?.options) {\n flatten((option as SelectOptionSubmenu).options)\n }\n }\n }\n\n flatten(this.selectOptions)\n return all\n }\n findOption(): SelectOption {\n const found = this.allOptions.find((option) => option.value === this.value)\n return found || { caption: this.value, value: this.value }\n }\n\n localeChanged = () => {\n this.queueRender()\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n if (this.localized) {\n XinLocalized.allInstances.add(this)\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n\n if (this.localized) {\n XinLocalized.allInstances.delete(this)\n }\n }\n\n render(): void {\n super.render()\n\n const { value, button } = this.parts\n button.disabled = this.disabled\n const icon = value.previousElementSibling as HTMLElement\n\n const option = this.findOption()\n let newIcon: Element = span()\n value.value = this.localized ? localize(option.caption) : option.caption\n if (option.icon) {\n if (option.icon instanceof HTMLElement) {\n newIcon = option.icon.cloneNode(true) as HTMLElement\n } else {\n newIcon = icons[option.icon]()\n }\n }\n icon.replaceWith(newIcon)\n value.setAttribute(\n 'placeholder',\n this.localized ? localize(this.placeholder) : this.placeholder\n )\n value.style.pointerEvents = this.editable ? '' : 'none'\n value.readOnly = !this.editable\n }\n}\n\nexport const xinSelect = XinSelect.elementCreator({\n tag: 'xin-select',\n styleSpec: {\n ':host': {\n '--gap': '8px',\n '--touch-size': '44px',\n '--padding': '0 8px',\n '--value-padding': '0 8px',\n '--icon-width': '24px',\n '--fieldWidth': '140px',\n display: 'inline-flex',\n position: 'relative',\n },\n ':host button': {\n display: 'flex',\n alignItems: 'center',\n justifyItems: 'center',\n gap: vars.gap,\n textAlign: 'left',\n height: vars.touchSize,\n padding: vars.padding,\n position: 'relative',\n width: '100%',\n },\n ':host:not([show-icon]) button > :first-child': {\n display: 'none',\n },\n ':host[hide-caption] button > :nth-child(2)': {\n display: 'none',\n },\n ':host [part=\"value\"]': {\n width: vars.fieldWidth,\n padding: vars.valuePadding,\n height: vars.touchSize,\n lineHeight: vars.touchSize,\n boxShadow: 'none',\n whiteSpace: 'nowrap',\n outline: 'none',\n background: 'transparent',\n flex: '1',\n },\n ':host [part=\"value\"]:not(:focus)': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n background: 'transparent',\n },\n },\n}) as ElementCreator<XinSelect>\n",
22
22
  "interface KeyboardEventLike {\n key: string\n ctrlKey: boolean\n metaKey: boolean\n altKey: boolean\n shiftKey: boolean\n}\n\nexport const matchShortcut = (\n keystroke: KeyboardEventLike,\n shortcut: string\n): boolean => {\n shortcut = shortcut.toLocaleLowerCase()\n const ctrlKey = !!shortcut.match(/\\^|ctrl/)\n const metaKey = !!shortcut.match(/⌘|meta/)\n const altKey = !!shortcut.match(/⌥|⎇|alt|option/)\n const shiftKey = !!shortcut.match(/⇧|shift/)\n const baseKey = shortcut.slice(-1)\n\n return (\n keystroke.key === baseKey &&\n keystroke.metaKey === metaKey &&\n keystroke.ctrlKey === ctrlKey &&\n keystroke.altKey === altKey &&\n keystroke.shiftKey === shiftKey\n )\n}\n",
23
- "/*#\n# drag & drop\n\nA lightweight library that leverages HTML5 drag and drop behavior.\n\nTo use it, simply call `dragAndDrop.init()` (it only needs to be called once,\nbut calling it again is harmless).\n\n```\nimport { dragAndDrop } from 'tosijs-ui'\n\ndragAndDrop.init()\n```\n\nThis module sets up some global event handlers and *just works*&trade; (arguably, it merely does things\nthat the browser should do, such as add a CSS selector for drop zones that are compatible\nwith what's being dragged).\n\nYou can use `dragAndDrop.draggedElement()` to get the element being dragged (if it's\nactually from the page you're in).\n\n> ### The beauty of HTML5 drag-and-drop\n>\n> The nice thing about HTML5 drag-and-drop is that it leverages the OS's drag and\n> drop support. This means you can drag from one window to another, from the desktop\n> to your app and vice versa. It's all a matter of configuring the DOM elements.\n\nThis module uses but *does not define* the following class selectors:\n\n- `.drag-source` an element being dragged\n- `.drag-target` an element on which the dragged object may be dropped\n- `.drag-over` a `.drag-target` which the object is currently over\n\nYou may also wish to create style rules for:\n\n- `[draggable=\"true\"]` anything other than a `<a>` (and perhaps an `<img>`) that can be dragged\n- `[data-drag]` indicates *types* of draggable things that can be dropped on them.\n- `[data-drop]` indicates potential *drop zones*.\n\n> **Note** `draggable` is has to be set to \"true\", [see documentation on draggable](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/draggable).\n\n## Draggable Objects\n\nTo create a draggable element, add `draggable=\"true\"`.\n\n <div draggable=\"true\">Drag Me</div>\n\nTo specify the type(s) of content that will be dragged, use the `data-drag` attribute:\n\n <div draggable=\"true\" data-drag=\"text/plain\">Drag Me</div>\n\nTo specify the content dragged, use a `data-drag-content` attribute.\n\n <div\n draggable=\"true\"\n data-drag=\"text/plain\"\n data-drag-content=\"Surprise!\"\n >Drag Me</div>\n\n## Drop Zones\n\nTo create a drop zone, use the data-drop attribute set to a semicolon-delimited list\nof mime types:\n\n <div data-drop=\"text/plain\">\n Drop plain text here\n </div>\n <div data-drop=\"text/plain;text/html\">\n Drop html or plain text here\n </div>\n\nFinally, you can override default drop behavior (which is to copy the dragged node into\nthe drop zone node) simply using data-event=\"drop:path.to.drop_handler\" as usual.\n\n <div\n data-drop=\"custom\"\n data-event=\"drop:path.to.drop_handler\"\n >\n Drop some custom thing here\n </div>\n\n### Typed Drop Zones Example\n\n```html\n<div style=\"display: grid; grid-template-columns: 50% 50%\">\n <div>\n <h4>Draggable</h4>\n <a class=\"drag\" href=\"javascript: alert('I don't do anything)\">Links are draggable by default</a>\n <p draggable=\"true\">\n Just adding the <code>draggable=\"true\"</code>\n makes this paragraph draggable (as text/html by default)\n </p>\n <p draggable=\"true\" data-drag=\"text/html\">\n Draggable as <i>text/html</i>\n </p>\n <p draggable=\"true\" data-drag=\"text/plain\" data-drag-content=\"Surprise!\">\n Draggable as <i>text/plain</i>, with <b>custom content</b>\n </p>\n <p draggable=\"true\" data-drag=\"text/html;text/plain\">\n Draggable as <i>text/html</i> or <i>text/plain</i>\n </p>\n <p draggable=\"true\" data-drag=\"text/plain\">\n Draggable as <i>text/plain</i>\n </p>\n </div>\n <div>\n <h4>Drop Targets</h4>\n <div data-drop=\"text/html\">\n You can drop stuff here\n </div>\n <div data-drop=\"text/html\">\n You can drop HTML here\n </div>\n <div data-drop=\"text/*\">\n You can drop any text\n </div>\n <div data-drop=\"text/html;url\">\n You can drop HTML or urls here\n </div>\n <div\n data-drop=\"special/any\"\n data-event=\"drop:_component_.drop\"\n >\n I accept anything and have special drop handling\n </div>\n </div>\n</div>\n```\n```css\n.drag-source {\n box-shadow: 0 0 2px 2px orange;\n opacity: 0.5;\n}\n.drag-target {\n min-height: 10px;\n background: rgba(0,0,255,0.25);\n}\n.drag-target.drag-over {\n background: rgba(0,0,255,0.5);\n}\n:not([data-drop]) > .drag,\n[draggable=\"true\"] {\n border: 1px solid rgba(255,192,0,0.5);\n cursor: pointer;\n display: block;\n}\n\n:not([data-drop]) > .drag,\n[data-drop],\n[draggable=\"true\"] {\n padding: 4px;\n margin: 4px;\n border-radius: 5px;\n}\n```\n```js\nimport { dragAndDrop } from 'tosijs-ui'\n\ndragAndDrop.init()\n```\n\n> Note that you can drag between two browser tabs containing this\n> example (or between two different browsers) and it will work.\n\n### Reorderable List Example\n\n```js\nimport { elements, tosi, getListItem } from 'tosijs'\nimport { dragAndDrop, TosiDialog } from 'tosijs-ui'\n\ndragAndDrop.init()\n\nconst shuffle = (deck) => {\n var shuffled = [];\n for( const card of deck ){\n shuffled.splice( Math.floor( Math.random() * (1 + shuffled.length) ), 0, card );\n }\n return shuffled;\n}\n\nconst colors = [\n 'red',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'indigo',\n 'violet',\n]\n\nlet spectrum\n\nconst start = () => {\n ({ spectrum } = tosi({\n spectrum: shuffle(colors).map(color => ({color}))\n }))\n}\n\nstart()\n\nlet dragged = null\n\nconst dropColor = (event) => {\n const dropped = getListItem(event.target)\n const draggedIndex = spectrum.indexOf(dragged)\n const droppedIndex = spectrum.indexOf(dropped)\n spectrum.splice(draggedIndex, 1)\n spectrum.splice(droppedIndex, 0, dragged)\n\n if (JSON.stringify(spectrum.map(c => c.color)) === JSON.stringify(colors)) {\n TosiDialog.alert('You win!').then(start)\n }\n\n console.log({dragged, draggedIndex, dropped, droppedIndex})\n\n event.preventDefault()\n event.stopPropagation()\n}\n\nconst dragId = 'spectrum/' + Math.floor(Math.random() * 1e9)\n\nconst { div, button, template } = elements\n\npreview.append(\n div(\n {\n bindList: { value: spectrum, idPath: 'color' }\n },\n template(\n div({\n class: 'spectrum',\n bindText: '^.color',\n draggable: 'true',\n dataDrag: dragId,\n dataDrop: dragId,\n onDrop: dropColor,\n bind: {\n value: '^.color',\n binding(element, value) {\n element.style.backgroundColor = value\n }\n },\n onDragstart(event) {\n dragged = getListItem(event.target)\n }\n })\n )\n ),\n)\n```\n```css\n.spectrum {\n height: 36px;\n color: white;\n font-weight: 700;\n text-shadow: 1px 2px 0 black;\n padding-left: 10px;\n}\n\n.spectrum.drag-over {\n box-shadow: 0 0 0 4px blue;\n}\n```\n\n> To prevent this example from allowing drags between windows (which\n> wouldn't make sense) a random dragId is assigned to `data-drag` and\n> `data-drop` in this example.\n)\n*/\n\nconst dragInProgress = () => !!document.querySelector('.drag-source')\n\nconst isTypeAllowed = (\n allowedTypes: readonly string[] | undefined,\n type: string\n) => {\n if (!allowedTypes) {\n return false\n }\n for (const allowedType of allowedTypes) {\n if (allowedType === 'special/any') {\n return true\n } else if (allowedType.indexOf('*') > -1) {\n const [A, B] = allowedType.split('/')\n const [a, b] = type.split('/')\n if ((A === '*' || A === a) && (B === '*' || B === b)) {\n return true\n }\n } else {\n if (allowedType === type) {\n return true\n }\n }\n }\n}\n\nconst removeClass = (className: string) => {\n for (const elt of [...document.querySelectorAll(`.${className}`)]) {\n elt.classList.remove(className)\n }\n}\nconst end = () => {\n removeClass('drag-over')\n removeClass('drag-source')\n removeClass('drag-target')\n}\n\nconst stringToTypes = (s: string | undefined, delimiter = ';'): string[] => {\n return (s || '')\n .split(delimiter)\n .map((t) => t.trim())\n .filter((i) => i !== '')\n}\n\nconst markDroppable = (types: readonly string[] | undefined) => {\n if (!types) types = []\n const elements = [\n ...document.querySelectorAll('[data-drop]'),\n ] as HTMLElement[]\n for (const element of elements) {\n const dropTypes = stringToTypes(element.dataset.drop)\n if (types.find((type) => isTypeAllowed(dropTypes, type))) {\n element.classList.add('drag-target')\n } else {\n element.classList.remove('drag-target')\n }\n }\n}\n\nfunction start(evt: DragEvent) {\n const target = (evt.target as HTMLElement)?.closest(\n '[draggable=\"true\"],a[href]'\n ) as HTMLElement | null\n if (!target) {\n return\n }\n target.classList.add('drag-source')\n const types = target.matches('[draggable=\"true\"]')\n ? stringToTypes(target.dataset.drag || 'text/html')\n : stringToTypes(target.dataset.drag || 'url')\n for (const type of types) {\n const content =\n target.dataset.dragContent ||\n (type === 'text/html' ? target.innerHTML : target.textContent)\n evt.dataTransfer?.setData(type, content || '')\n }\n markDroppable(evt.dataTransfer?.types)\n evt.stopPropagation()\n}\n\nfunction drag(evt: DragEvent) {\n if (!dragInProgress()) {\n markDroppable(evt.dataTransfer?.types)\n }\n const target = (evt.target as HTMLElement).closest('.drag-target')\n if (target && evt.dataTransfer) {\n target.classList.add('drag-over')\n evt.dataTransfer.dropEffect = 'copy'\n } else {\n evt.preventDefault()\n evt.stopPropagation()\n }\n}\n\nfunction leave() {\n removeClass('drag-over')\n}\n\nfunction drop(evt: DragEvent) {\n const target = (evt.target as HTMLElement).closest(\n '.drag-target'\n ) as HTMLElement | null\n if (target) {\n const dropTypes = (target.dataset?.drop || '').split(';')\n for (const type of dropTypes) {\n if (isTypeAllowed(evt.dataTransfer?.types, type)) {\n if (type === 'text/html') {\n target.innerHTML = evt.dataTransfer?.getData(type) || ''\n } else {\n target.textContent = evt.dataTransfer?.getData(type) || ''\n }\n }\n }\n }\n end()\n}\n\nexport const draggedElement = () => document.querySelector('.drag-source')\n\nlet isInitialized = false\n\nexport const init = () => {\n if (isInitialized) {\n return\n }\n\n document.body.addEventListener('dragstart', start)\n document.body.addEventListener('dragenter', drag)\n document.body.addEventListener('dragover', drag)\n document.body.addEventListener('drop', drop)\n document.body.addEventListener('dragleave', leave)\n document.body.addEventListener('dragend', end)\n\n // stop dragged items from reloading the window\n window.addEventListener('dragover', (evt) => evt.preventDefault())\n window.addEventListener('drop', (evt) => evt.preventDefault())\n\n isInitialized = true\n}\n",
23
+ "/*#\n# drag & drop\n\nA lightweight library that leverages HTML5 drag and drop behavior.\n\nTo use it, simply call `dragAndDrop.init()` (it only needs to be called once,\nbut calling it again is harmless).\n\n```\nimport { dragAndDrop } from 'tosijs-ui'\n\ndragAndDrop.init()\n```\n\nThis module sets up some global event handlers and *just works*&trade; (arguably, it merely does things\nthat the browser should do, such as add a CSS selector for drop zones that are compatible\nwith what's being dragged).\n\nYou can use `dragAndDrop.draggedElement()` to get the element being dragged (if it's\nactually from the page you're in).\n\n> ### The beauty of HTML5 drag-and-drop\n>\n> The nice thing about HTML5 drag-and-drop is that it leverages the OS's drag and\n> drop support. This means you can drag from one window to another, from the desktop\n> to your app and vice versa. It's all a matter of configuring the DOM elements.\n\nThis module uses but *does not define* the following class selectors:\n\n- `.drag-source` an element being dragged\n- `.drag-target` an element on which the dragged object may be dropped\n- `.drag-over` a `.drag-target` which the object is currently over\n\nYou may also wish to create style rules for:\n\n- `[draggable=\"true\"]` anything other than a `<a>` (and perhaps an `<img>`) that can be dragged\n- `[data-drag]` indicates *types* of draggable things that can be dropped on them.\n- `[data-drop]` indicates potential *drop zones*.\n\n> **Note** `draggable` is has to be set to \"true\", [see documentation on draggable](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/draggable).\n\n## Draggable Objects\n\nTo create a draggable element, add `draggable=\"true\"`.\n\n <div draggable=\"true\">Drag Me</div>\n\nTo specify the type(s) of content that will be dragged, use the `data-drag` attribute:\n\n <div draggable=\"true\" data-drag=\"text/plain\">Drag Me</div>\n\nTo specify the content dragged, use a `data-drag-content` attribute.\n\n <div\n draggable=\"true\"\n data-drag=\"text/plain\"\n data-drag-content=\"Surprise!\"\n >Drag Me</div>\n\n## Drop Zones\n\nTo create a drop zone, use the data-drop attribute set to a semicolon-delimited list\nof mime types:\n\n <div data-drop=\"text/plain\">\n Drop plain text here\n </div>\n <div data-drop=\"text/plain;text/html\">\n Drop html or plain text here\n </div>\n\nFinally, you can override default drop behavior (which is to copy the dragged node into\nthe drop zone node) by adding your own `drop` event handler.\n\nE.g.\n\n element.addEventListener('drop', (event) => {\n // event.target is the dragged element\n ...\n\n event.stopPropagation()\n event.preventDefault()\n })\n\nAnd of course `elementCreator()`s provide syntax sugar for this:\n\n elements.div({\n onDrop(event) {\n // ...\n }\n })\n\n### Typed Drop Zones Example\n\nIn this example, the types are set using `data-drag` attributes and the drop zones are\nset using `data-drop` attributes, but everything else is default behavior. You can also\ndrop the draggable objects to another window or the desktop, and similarly you can drag\nappropriate stuff into the drop zones. (You can test this out by opening this page in\na second browser window—event a different browser.)\n\n```html\n<div style=\"display: grid; grid-template-columns: 50% 50%\">\n <div>\n <h4>Draggable</h4>\n <a class=\"drag\" href=\"javascript: alert('I don't do anything)\">Links are draggable by default</a>\n <p draggable=\"true\">\n Just adding the <code>draggable=\"true\"</code>\n makes this paragraph draggable (as text/html by default)\n </p>\n <p draggable=\"true\" data-drag=\"text/html\">\n Draggable as <i>text/html</i>\n </p>\n <p draggable=\"true\" data-drag=\"text/plain\" data-drag-content=\"Surprise!\">\n Draggable as <i>text/plain</i>, with <b>custom content</b>\n </p>\n <p draggable=\"true\" data-drag=\"text/html;text/plain\">\n Draggable as <i>text/html</i> or <i>text/plain</i>\n </p>\n <p draggable=\"true\" data-drag=\"text/plain\">\n Draggable as <i>text/plain</i>\n </p>\n </div>\n <div>\n <h4>Drop Targets</h4>\n <div data-drop=\"text/html\">\n You can drop stuff here\n </div>\n <div data-drop=\"text/html\">\n You can drop HTML here\n </div>\n <div data-drop=\"text/*\">\n You can drop any text\n </div>\n <div data-drop=\"text/html;url\">\n You can drop HTML or urls here\n </div>\n <div\n data-drop=\"special/any\"\n data-event=\"drop:_component_.drop\"\n >\n I accept anything and have special drop handling\n </div>\n </div>\n</div>\n```\n```css\n.drag-source {\n box-shadow: 0 0 2px 2px orange;\n opacity: 0.5;\n}\n.drag-target {\n min-height: 10px;\n background: rgba(0,0,255,0.25);\n}\n.drag-target.drag-over {\n background: rgba(0,0,255,0.5);\n}\n:not([data-drop]) > .drag,\n[draggable=\"true\"] {\n border: 1px solid rgba(255,192,0,0.5);\n cursor: pointer;\n display: block;\n}\n\n:not([data-drop]) > .drag,\n[data-drop],\n[draggable=\"true\"] {\n padding: 4px;\n margin: 4px;\n border-radius: 5px;\n}\n```\n```js\nimport { dragAndDrop } from 'tosijs-ui'\n\ndragAndDrop.init()\n```\n\n> Note that you can drag between two browser tabs containing this\n> example (or between two different browsers) and it will work.\n\n### Reorderable List Example\n\nThis example uses a custom `drop` event handler. When you sort the spectrum\ninto the correct order you \"win\" and then the items are reshuffled.\n\nAlso notice that the `data-drag` and `data-drop` values are set to a\nrandom dragId so you cannot drag to another window or the desktop.\n\n```js\nimport { elements, tosi, getListItem } from 'tosijs'\nimport { dragAndDrop, TosiDialog } from 'tosijs-ui'\n\ndragAndDrop.init()\n\nconst shuffle = (deck) => {\n var shuffled = [];\n for( const card of deck ){\n shuffled.splice( Math.floor( Math.random() * (1 + shuffled.length) ), 0, card );\n }\n return shuffled;\n}\n\nconst colors = [\n 'red',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'indigo',\n 'violet',\n]\n\nlet spectrum\n\nconst start = () => {\n ({ spectrum } = tosi({\n spectrum: shuffle(colors).map(color => ({color}))\n }))\n}\n\nstart()\n\nlet dragged = null\n\nconst dropColor = (event) => {\n const dropped = getListItem(event.target)\n const draggedIndex = spectrum.indexOf(dragged)\n const droppedIndex = spectrum.indexOf(dropped)\n spectrum.splice(draggedIndex, 1)\n spectrum.splice(droppedIndex, 0, dragged)\n\n if (JSON.stringify(spectrum.map(c => c.color)) === JSON.stringify(colors)) {\n TosiDialog.alert('You win!').then(start)\n }\n\n console.log({dragged, draggedIndex, dropped, droppedIndex})\n\n event.preventDefault()\n event.stopPropagation()\n}\n\nconst dragId = 'spectrum/' + Math.floor(Math.random() * 1e9)\n\nconst { div, button, template } = elements\n\npreview.append(\n div(\n {\n bindList: { value: spectrum, idPath: 'color' }\n },\n template(\n div({\n class: 'spectrum',\n bindText: '^.color',\n draggable: 'true',\n dataDrag: dragId,\n dataDrop: dragId,\n onDrop: dropColor,\n bind: {\n value: '^.color',\n binding(element, value) {\n element.style.backgroundColor = value\n }\n },\n onDragstart(event) {\n dragged = getListItem(event.target)\n }\n })\n )\n ),\n)\n```\n```css\n.spectrum {\n height: 36px;\n color: white;\n font-weight: 700;\n text-shadow: 1px 2px 0 black;\n padding-left: 10px;\n}\n\n.spectrum.drag-over {\n box-shadow: 0 0 0 4px blue;\n}\n```\n\n> To prevent this example from allowing drags between windows (which\n> wouldn't make sense) a random dragId is assigned to `data-drag` and\n> `data-drop` in this example.\n)\n*/\n\nconst dragInProgress = () => !!document.querySelector('.drag-source')\n\nconst isTypeAllowed = (\n allowedTypes: readonly string[] | undefined,\n type: string\n) => {\n if (!allowedTypes) {\n return false\n }\n for (const allowedType of allowedTypes) {\n if (allowedType === 'special/any') {\n return true\n } else if (allowedType.indexOf('*') > -1) {\n const [A, B] = allowedType.split('/')\n const [a, b] = type.split('/')\n if ((A === '*' || A === a) && (B === '*' || B === b)) {\n return true\n }\n } else {\n if (allowedType === type) {\n return true\n }\n }\n }\n}\n\nconst removeClass = (className: string) => {\n for (const elt of [...document.querySelectorAll(`.${className}`)]) {\n elt.classList.remove(className)\n }\n}\nconst end = () => {\n removeClass('drag-over')\n removeClass('drag-source')\n removeClass('drag-target')\n}\n\nconst stringToTypes = (s: string | undefined, delimiter = ';'): string[] => {\n return (s || '')\n .split(delimiter)\n .map((t) => t.trim())\n .filter((i) => i !== '')\n}\n\nconst markDroppable = (types: readonly string[] | undefined) => {\n if (!types) types = []\n const elements = [\n ...document.querySelectorAll('[data-drop]'),\n ] as HTMLElement[]\n for (const element of elements) {\n const dropTypes = stringToTypes(element.dataset.drop)\n if (types.find((type) => isTypeAllowed(dropTypes, type))) {\n element.classList.add('drag-target')\n } else {\n element.classList.remove('drag-target')\n }\n }\n}\n\nfunction start(evt: DragEvent) {\n const target = (evt.target as HTMLElement)?.closest(\n '[draggable=\"true\"],a[href]'\n ) as HTMLElement | null\n if (!target) {\n return\n }\n target.classList.add('drag-source')\n const types = target.matches('[draggable=\"true\"]')\n ? stringToTypes(target.dataset.drag || 'text/html')\n : stringToTypes(target.dataset.drag || 'url')\n for (const type of types) {\n const content =\n target.dataset.dragContent ||\n (type === 'text/html' ? target.innerHTML : target.textContent)\n evt.dataTransfer?.setData(type, content || '')\n }\n markDroppable(evt.dataTransfer?.types)\n evt.stopPropagation()\n}\n\nfunction drag(evt: DragEvent) {\n if (!dragInProgress()) {\n markDroppable(evt.dataTransfer?.types)\n }\n const target = (evt.target as HTMLElement).closest('.drag-target')\n if (target && evt.dataTransfer) {\n target.classList.add('drag-over')\n evt.dataTransfer.dropEffect = 'copy'\n } else {\n evt.preventDefault()\n evt.stopPropagation()\n }\n}\n\nfunction leave() {\n removeClass('drag-over')\n}\n\nfunction drop(evt: DragEvent) {\n const target = (evt.target as HTMLElement).closest(\n '.drag-target'\n ) as HTMLElement | null\n if (target) {\n const dropTypes = (target.dataset?.drop || '').split(';')\n for (const type of dropTypes) {\n if (isTypeAllowed(evt.dataTransfer?.types, type)) {\n if (type === 'text/html') {\n target.innerHTML = evt.dataTransfer?.getData(type) || ''\n } else {\n target.textContent = evt.dataTransfer?.getData(type) || ''\n }\n }\n }\n }\n end()\n}\n\nexport const draggedElement = () => document.querySelector('.drag-source')\n\nlet isInitialized = false\n\nexport const init = () => {\n if (isInitialized) {\n return\n }\n\n document.body.addEventListener('dragstart', start)\n document.body.addEventListener('dragenter', drag)\n document.body.addEventListener('dragover', drag)\n document.body.addEventListener('drop', drop)\n document.body.addEventListener('dragleave', leave)\n document.body.addEventListener('dragend', end)\n\n // stop dragged items from reloading the window\n window.addEventListener('dragover', (evt) => evt.preventDefault())\n window.addEventListener('drop', (evt) => evt.preventDefault())\n\n isInitialized = true\n}\n",
24
24
  "/*#\n# dialog\n\n`<tosi-dialog>` is a simple wrapper around the standard HTML `<dialog>` element designed\nto make creating dialogs as convenient as possible.\n\n```html\n<button>Show Dialog</button>\n<tosi-dialog>\n <h3 slot='header'>A Dialog</h3>\n <p>\n Here is some text\n </p>\n <button slot=\"footer\">Custom Button</button>\n</tosi-dialog>\n```\n```js\nimport { on } from 'tosijs'\nimport { postNotification } from 'tosijs-ui'\n\non(\n preview.querySelector('button'),\n 'click',\n async () => {\n const response = await preview.querySelector('tosi-dialog').showModal()\n postNotification({\n message: `user clicked ${response}`,\n duration: 2\n })\n }\n)\n```\n\n## Static Functions\n\n`TosiDialog` provides static async functions to replace the built-in dialogs provided by\nthe browser.\n\n- `alert(message: string, title = 'Alert'): Promise<undefined>`\n- `confirm(message: string, title = 'Confirm'): Promise<boolean>`\n- `prompt(message: string, title = 'Prompt', currentValue = ''): Promise<string | null> `\n\nYou can look at the code that implements them to see how to leverage `TosiDialog` to build\nmore complex, bespoke dialogs that can be used just as conveniently.\n\n```js\nimport { elements } from 'tosijs'\nimport { TosiDialog, postNotification } from 'tosijs-ui'\n\nconst { button, div } = elements\n\npreview.append(\n div(\n {\n style: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 10\n }\n },\n button(\n {\n async onClick() {\n await TosiDialog.alert('This is an alert')\n postNotification({\n message: 'alert dismissed',\n duration: 2\n })\n }\n },\n 'TosiDialog.alert',\n ),\n button(\n {\n async onClick() {\n const confirmed = await TosiDialog.confirm('Can you confirm?')\n postNotification({\n message: `user ${confirmed ? 'confirmed' : 'cancelled'}`,\n duration: 2\n })\n }\n },\n 'TosiDialog.confirm',\n ),\n button(\n {\n async onClick() {\n const text = await TosiDialog.prompt('Enter some text please')\n postNotification({\n message: text !== null ? `user entered \"${text}\"`: 'user cancelled',\n duration: 2\n })\n }\n },\n 'TosiDialog.prompt',\n ),\n ),\n)\n```\n```css\n.preview {\n padding: 10px;\n}\n```\n\n*/\nimport { Component, PartsMap, elements, on, vars, varDefault } from 'tosijs'\nimport { findHighestZ } from './track-drag'\n\nconst { dialog, button, header, footer, xinSlot, h3, p, label, input, div } =\n elements\n\ninterface DialogParts extends PartsMap {\n dialog: HTMLDialogElement\n ok: HTMLButtonElement\n}\n\nexport class TosiDialog extends Component<DialogParts> {\n static async alert(message: string, title = 'Alert'): Promise<void> {\n return new Promise((resolve) => {\n const alertDialog = tosiDialog(\n {\n removeOnClose: true,\n closeOnBackgroundClick: true,\n dialogWillClose() {\n resolve()\n },\n },\n h3({ slot: 'header' }, title),\n p(message)\n )\n document.body.append(alertDialog)\n alertDialog.showModal()\n })\n }\n\n static async confirm(message: string, title = 'Confirm'): Promise<boolean> {\n return new Promise((resolve) => {\n const confirmDialog = tosiDialog(\n {\n removeOnClose: true,\n dialogWillClose(reason?: string) {\n resolve(reason === 'confirm')\n },\n },\n h3({ slot: 'header' }, title),\n p(message),\n button(\n {\n slot: 'footer',\n onClick() {\n confirmDialog.close()\n },\n },\n 'Cancel'\n )\n )\n document.body.append(confirmDialog)\n confirmDialog.showModal()\n })\n }\n\n static async prompt(\n message: string,\n title = 'Prompt',\n currentValue = ''\n ): Promise<string | null> {\n return new Promise((resolve) => {\n const inputField = input({ value: currentValue })\n const promptDialog = tosiDialog(\n {\n removeOnClose: true,\n dialogWillClose(reason?: string) {\n resolve(reason === 'confirm' ? inputField.value : null)\n },\n initialFocus() {\n inputField.focus()\n },\n },\n h3({ slot: 'header' }, title),\n p(\n label(\n {\n style: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: 5,\n },\n },\n div(message),\n inputField\n )\n ),\n button(\n {\n slot: 'footer',\n onClick() {\n promptDialog.close()\n },\n },\n 'Cancel'\n )\n )\n document.body.append(promptDialog)\n promptDialog.showModal()\n })\n }\n\n removeOnClose = false\n closeOnBackgroundClick = false\n\n constructor() {\n super()\n\n this.initAttributes('removeOnClose', 'closeOnBackgroundClick')\n\n on(this, 'click', () => {\n if (this.closeOnBackgroundClick) {\n this.close()\n }\n })\n }\n\n dialogWillClose = (reason = 'cancel') => {\n console.log('dialog will close with', reason)\n }\n\n initialFocus() {\n this.parts.ok.focus()\n }\n\n #modalResolution = (outcome: string | null) => {}\n\n showModal = (): Promise<string | null> => {\n this.style.zIndex = String(findHighestZ())\n return new Promise((resolve) => {\n this.#modalResolution = resolve\n this.parts.dialog.showModal()\n requestAnimationFrame(() => {\n this.initialFocus()\n })\n })\n }\n\n close = (reason = 'cancel') => {\n this.dialogWillClose(reason)\n this.#modalResolution(reason)\n this.parts.dialog.close()\n if (this.removeOnClose) {\n this.remove()\n }\n }\n\n ok = () => {\n this.close('confirm')\n }\n\n content = () =>\n dialog(\n { part: 'dialog' },\n header(xinSlot({ name: 'header' })),\n xinSlot(),\n footer(\n xinSlot({ name: 'footer' }),\n button({ part: 'ok', onClick: this.ok }, 'OK')\n )\n )\n}\n\nexport const tosiDialog = TosiDialog.elementCreator({\n tag: 'tosi-dialog',\n styleSpec: {\n ':host > dialog::backdrop': {\n backdropFilter: 'blur(8px)',\n },\n ':host > dialog:not([open])': {\n display: 'none',\n },\n ':host > dialog[open]': {\n minWidth: 300,\n border: 0,\n borderRadius: 10,\n overflow: 'hidden',\n maxHeight: 'calc(100% - 20px)',\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n _dialogShadow: varDefault.menuShadow('0 5px 10px #0004'),\n _dialogBackground: varDefault.background('#fafafa'),\n _dialogColor: varDefault.textColor('#222'),\n boxShadow: vars.dialogShadow,\n background: vars.dialogBackground,\n color: vars.dialogColor,\n },\n ':host > dialog > *': {\n padding: '0 20px',\n },\n ':host > dialog > header': {\n display: 'flex',\n justifyContent: 'center',\n gap: 10,\n },\n ':host > dialog > footer': {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 10,\n paddingBottom: 20,\n },\n },\n})\n",
25
25
  "/*#\n# editable-rect\n\n`<xin-editable>` (`editableRect` is the `ElementCreator` and `EditableRect` is the class) is an element\nfor allowing the adjustment of another element's position and size. Simply insert it in a `position: absolute`\nor `position: fixed` element and you can directly adjust its CSS positioning, including rotation.\n\nClick on an element to adjust its position, dimensions, and rotation.\n\n```js\nimport { editableRect, icons } from 'tosijs-ui'\nimport { elements } from 'tosijs'\nconst { button } = elements\n\nfunction showTools(event) {\n event.stopPropagation()\n event.preventDefault()\n}\n\nconst editable = editableRect(button({class: 'more-popup', onClick: showTools}, icons.moreVertical()))\npreview.addEventListener('click', (event) => {\n const target = event.target\n if (['absolute', 'fixed'].includes(getComputedStyle(target).position)) {\n target.append(editable)\n } else {\n editable.remove()\n }\n})\npreview.addEventListener('change', event => console.log(event))\n```\n```html\n<div class=\"editable\" style=\"top: 20px; left: 20px; width: auto; height: auto; right: 20px; bottom: 20px;\">\n <div class=\"editable\" style=\"top: 20px; left: 20px; width: 200px; height: 150px;\">\n </div>\n <div class=\"editable\" style=\"bottom: 20px; top: 20px; width: 300px; height: auto; right: 20px;\">\n </div>\n</div>\n```\n```css\n.preview .editable {\n position: absolute;\n box-shadow: inset 0 0 0 1px #0ccc;\n background: #0cc1;\n}\n\n.preview button.more-popup {\n position: absolute;\n width: 44px;\n height: 44px;\n top: 2px;\n right: 2px;\n --text-color: black;\n background: transparent;\n box-shadow: none;\n}\n\n.previw button\n```\n\n## Snapping\n\nWhen `EditableRect.snapToGrid === true` or the shift-key is depresseed, position will snap to `EditableRect.gridSize` pixels (default = 8).\n\nSimilarly `EditableRect.snapAngle === true` or the shift-key will snap rotation to increments of `EditableRect.angleSize` degrees (default = 15).\n\n## Events\n\nAfter an element's position, size, or rotation are adjusted a `change` event is triggered on the element.\n*/\n\nimport { Component, elements, vars } from 'tosijs'\nimport { icons } from './icons'\nimport { trackDrag } from './track-drag'\n\nconst { div, slot } = elements\n\ninterface Locks {\n left: boolean\n right: boolean\n top: boolean\n bottom: boolean\n}\n\ntype Side = keyof Locks\n\nexport class EditableRect extends Component {\n static angleSize = 15\n static gridSize = 8\n static snapAngle = false\n static snapToGrid = false\n\n static styleSpec = {\n ':host': {\n '--handle-bg': '#fff4',\n '--handle-color': '#2228',\n '--handle-hover-bg': '#8ff8',\n '--handle-hover-color': '#222',\n '--handle-size': '20px',\n '--handle-padding': '2px',\n },\n ':host ::slotted(*)': {\n position: 'absolute',\n },\n ':host > :not(style,slot)': {\n boxSizing: 'border-box',\n content: '\" \"',\n position: 'absolute',\n display: 'flex',\n height: vars.handleSize,\n width: vars.handleSize,\n padding: vars.handlePadding,\n '--text-color': vars.handleColor,\n background: vars.handleBg,\n },\n ':host > .drag-size': {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n height: 'auto',\n width: 'auto',\n background: 'transparent',\n cursor: 'ew-resize',\n },\n ':host > [part=\"rotate\"]': {\n transform: `translateY(${vars.handleSize_50})`,\n },\n ':host > [locked] > svg:first-child, :host > :not([locked]) > svg+svg': {\n display: 'none',\n },\n ':host .icon-unlock': {\n opacity: 0.5,\n },\n ':host svg': {\n pointerEvents: 'none',\n },\n ':host > *:hover': {\n '--text-color': vars.handleHoverColor,\n background: vars.handleHoverBg,\n },\n }\n\n static snappedCoords(event: PointerEvent, coords: number[]): number[] {\n const { gridSize } = EditableRect\n return EditableRect.snapToGrid || event.shiftKey\n ? coords.map((v) => Math.round(v / gridSize) * gridSize)\n : coords\n }\n\n static snappedAngle(event: PointerEvent, a: number): number {\n const { angleSize } = EditableRect\n return EditableRect.snapAngle || event.shiftKey\n ? Math.round(a / angleSize) * angleSize\n : a\n }\n\n get locked(): Locks {\n const element = this.parentElement!\n if (element.style.inset) {\n return { left: true, top: true, bottom: true, right: true }\n }\n const right = element.style.right.match(/\\d/) !== null\n const left = !right || element.style.left.match(/\\d/) !== null\n const bottom = element.style.bottom.match(/\\d/) !== null\n const top = !bottom || element.style.top.match(/\\d/) !== null\n return { left, top, bottom, right }\n }\n\n set locked(locks: Locks) {\n const { bottom, right } = locks\n let { left, top } = locks\n const element = this.parentElement!\n const l = element.offsetLeft\n const t = element.offsetTop\n const w = element.offsetWidth\n const h = element.offsetHeight\n const r = (element.offsetParent as HTMLElement).offsetWidth - l - w\n const b = (element.offsetParent as HTMLElement).offsetHeight - t - h\n Object.assign(element.style, {\n left: '',\n right: '',\n top: '',\n bottom: '',\n width: '',\n height: '',\n })\n if (!right) left = true\n if (!bottom) top = true\n if (left) element.style.left = l + 'px'\n if (right) element.style.right = r + 'px'\n if (left && right) {\n element.style.width = 'auto'\n } else {\n element.style.width = w + 'px'\n }\n if (top) element.style.top = t + 'px'\n if (bottom) element.style.bottom = b + 'px'\n if (top && bottom) {\n element.style.height = 'auto'\n } else {\n element.style.height = h + 'px'\n }\n this.queueRender()\n }\n\n get coords(): { top: number; left: number; bottom: number; right: number } {\n const { top, left, right, bottom } = this.parentElement!.style\n return {\n top: parseFloat(top),\n left: parseFloat(left),\n right: parseFloat(right),\n bottom: parseFloat(bottom),\n }\n }\n\n get left(): number {\n return this.parentElement!.offsetLeft\n }\n\n get width(): number {\n return this.parentElement!.offsetWidth\n }\n\n get right(): number {\n return (\n (this.parentElement!.offsetParent as HTMLElement).offsetWidth -\n (this.left + this.width)\n )\n }\n\n get top(): number {\n return this.parentElement!.offsetTop\n }\n\n get height(): number {\n return this.parentElement!.offsetHeight\n }\n\n get bottom(): number {\n return (\n (this.parentElement!.offsetParent as HTMLElement).offsetHeight -\n (this.top + this.height)\n )\n }\n\n triggerChange = () => {\n this.parentElement!.dispatchEvent(\n new Event('change', {\n bubbles: true,\n composed: true,\n })\n )\n }\n\n adjustPosition = (event: Event) => {\n // this means there will be some positioning coordinate set!\n const { locked } = this\n this.locked = locked\n const target = this.parentElement!\n const { top, left, bottom, right } = this.coords\n trackDrag(event as PointerEvent, (dx, dy, dragEvent) => {\n ;[dx, dy] = EditableRect.snappedCoords(dragEvent, [dx, dy])\n if (!isNaN(top)) {\n target.style.top = top + dy + 'px'\n }\n if (!isNaN(bottom)) {\n target.style.bottom = bottom - dy + 'px'\n }\n if (!isNaN(left)) {\n target.style.left = left + dx + 'px'\n }\n if (!isNaN(right)) {\n target.style.right = right - dx + 'px'\n }\n if (dragEvent.type === 'mouseup') {\n this.triggerChange()\n return true\n }\n })\n }\n\n resize = (event: Event) => {\n const target = this.parentElement!\n const { locked } = this\n this.locked = Object.assign({\n left: true,\n top: true,\n right: true,\n bottom: true,\n })\n const [right, bottom] = [this.right, this.bottom]\n\n trackDrag(event as PointerEvent, (dx, dy, dragEvent) => {\n let r = right - dx\n let b = bottom - dy\n ;[r, b] = EditableRect.snappedCoords(dragEvent as PointerEvent, [r, b])\n target.style.right = r + 'px'\n target.style.bottom = b + 'px'\n if (dragEvent.type === 'mouseup') {\n this.locked = locked\n this.triggerChange()\n return true\n }\n })\n }\n\n adjustSize = (event: Event) => {\n const target = this.parentElement!\n const { locked } = this\n const dimension = (event.target as HTMLElement).getAttribute('part') as Side\n this.locked = Object.assign({\n left: true,\n right: true,\n top: true,\n bottom: true,\n })\n const original = this[dimension]\n\n trackDrag(event as PointerEvent, (dx, dy, dragEvent) => {\n const [adjusted] = EditableRect.snappedCoords(dragEvent, [\n original +\n (['left', 'right'].includes(dimension) ? dx : dy) *\n (['right', 'bottom'].includes(dimension) ? -1 : 1),\n ])\n target.style[dimension] = adjusted + 'px'\n if (dragEvent.type === 'mouseup') {\n this.locked = locked\n this.triggerChange()\n return true\n }\n })\n }\n\n get rect(): DOMRect {\n return this.parentElement!.getBoundingClientRect()\n }\n\n get center(): { x: number; y: number } {\n const rect = this.parentElement!.getBoundingClientRect()\n return {\n x: rect.x + rect.width * 0.5,\n y: rect.y + rect.height * 0.5,\n }\n }\n\n get element(): HTMLElement {\n return this.parentElement as HTMLElement\n }\n\n adjustRotation = (event: Event) => {\n const { center } = this\n const { transformOrigin } = this.element.style\n if (!transformOrigin) {\n this.element.style.transformOrigin = '50% 50%'\n }\n trackDrag(event as PointerEvent, (_dx, _dy, dragEvent: PointerEvent) => {\n const { clientX, clientY } = dragEvent\n const x = clientX - center.x\n const y = clientY - center.y\n let alpha = y > 0 ? 90 : -90\n if (x !== 0) {\n alpha = (Math.atan2(y, x) * 180) / Math.PI\n }\n alpha = EditableRect.snappedAngle(dragEvent, alpha)\n if (alpha === 0) {\n this.element.style.transformOrigin = ''\n this.element.style.transform = ''\n } else {\n this.element.style.transform = `rotate(${alpha}deg)`\n }\n this.triggerChange()\n return dragEvent.type === 'mouseup'\n })\n }\n\n toggleLock = (event: Event) => {\n const { locked } = this\n const which = (event.target as HTMLElement).title.split(' ')[1] as Side\n locked[which] = !locked[which]\n this.locked = locked\n this.queueRender()\n event.stopPropagation()\n event.preventDefault()\n }\n\n content = () => [\n div(\n {\n part: 'move',\n style: { top: '50%', left: '50%', transform: 'translate(-50%,-50%)' },\n },\n icons.move()\n ),\n div({\n part: 'left',\n title: 'resize left',\n class: 'drag-size',\n style: { left: '-6px', width: '8px' },\n }),\n div({\n part: 'right',\n title: 'resize right',\n class: 'drag-size',\n style: { left: 'calc(100% - 2px)', width: '8px' },\n }),\n div({\n part: 'top',\n title: 'resize top',\n class: 'drag-size',\n style: { top: '-6px', height: '8px', cursor: 'ns-resize' },\n }),\n div({\n part: 'bottom',\n title: 'resize bottom',\n class: 'drag-size',\n style: { top: 'calc(100% - 2px)', height: '8px', cursor: 'ns-resize' },\n }),\n div(\n {\n part: 'resize',\n style: { top: '100%', left: '100%' },\n },\n icons.resize()\n ),\n div(\n {\n part: 'rotate',\n style: { top: '50%', right: '0' },\n },\n icons.refreshCw()\n ),\n div(\n {\n part: 'lockLeft',\n title: 'lock left',\n style: { top: '50%', left: 0, transform: 'translate(-100%, -50%)' },\n },\n icons.unlock(),\n icons.lock()\n ),\n div(\n {\n part: 'lockRight',\n title: 'lock right',\n style: { top: '50%', left: '100%', transform: 'translate(0%, -50%)' },\n },\n icons.unlock(),\n icons.lock()\n ),\n div(\n {\n part: 'lockTop',\n title: 'lock top',\n style: { top: 0, left: '50%', transform: 'translate(-50%, -100%)' },\n },\n icons.unlock(),\n icons.lock()\n ),\n div(\n {\n part: 'lockBottom',\n title: 'lock bottom',\n style: { top: '100%', left: '50%', transform: 'translate(-50%, 0%)' },\n },\n icons.unlock(),\n icons.lock()\n ),\n slot(),\n ]\n\n constructor() {\n super()\n\n this.initAttributes('rotationSnap', 'positionSnap')\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n const {\n left,\n right,\n top,\n bottom,\n lockLeft,\n lockRight,\n lockTop,\n lockBottom,\n move,\n resize,\n rotate,\n } = this.parts\n\n const PASSIVE = { passive: true }\n ;[left, right, top, bottom].forEach((elt) => {\n elt.addEventListener('mousedown', this.adjustSize, PASSIVE)\n elt.addEventListener('touchstart', this.adjustSize, PASSIVE)\n })\n ;[lockLeft, lockRight, lockTop, lockBottom].forEach((elt) => {\n elt.addEventListener('click', this.toggleLock)\n })\n resize.addEventListener('mousedown', this.resize, PASSIVE)\n move.addEventListener('mousedown', this.adjustPosition, PASSIVE)\n rotate.addEventListener('mousedown', this.adjustRotation, PASSIVE)\n resize.addEventListener('touchstart', this.resize, PASSIVE)\n move.addEventListener('touchstart', this.adjustPosition, PASSIVE)\n rotate.addEventListener('touchstart', this.adjustRotation, PASSIVE)\n }\n\n render() {\n super.render()\n\n if (!this.parentElement) {\n return\n }\n\n const { lockLeft, lockRight, lockTop, lockBottom } = this.parts\n const { left, right, top, bottom } = this.locked\n\n lockLeft.toggleAttribute('locked', left)\n lockRight.toggleAttribute('locked', right)\n lockTop.toggleAttribute('locked', top)\n lockBottom.toggleAttribute('locked', bottom)\n }\n}\n\nexport const editableRect = EditableRect.elementCreator({\n tag: 'xin-editable',\n})\n",
26
26
  "/*#\n# filter\n\nAutomatically creates `ArrayFilter` functions `(a: any[]) => any[]` based on the query you build using its\nmacOS Finder-inspired interface, using an easily customizable / extensible collection of `Filter` objects.\n\n```js\nimport { elements } from 'tosijs'\nimport { dataTable, filterBuilder, availableFilters } from 'tosijs-ui'\n\nconst sourceWords = ['acorn', 'bubblegum', 'copper', 'daisy', 'ellipse', 'fabulous', 'gerund', 'hopscotch', 'idiom', 'joke']\nfunction randomWords () {\n let numWords = Math.random() * 4\n const words = []\n while (numWords > 0) {\n numWords -= 1\n words.push(sourceWords[Math.floor(Math.random() * 10)])\n }\n return [...new Set(words)]\n}\n\nconst array = []\nfor(let i = 0; i < 1000; i++) {\n array.push({\n date: new Date(Math.random() * Date.now()).toISOString().split('T')[0],\n isLucky: Math.random() < 0.1,\n number: Math.floor(Math.random() * 200 - 100),\n string: randomWords().join(' '),\n tags: randomWords()\n })\n}\n\nconst { span } = elements\nconst tagsBinding = {\n value: '^.tags',\n binding: {\n toDOM(element, value) {\n element.classList.add('tag-list')\n element.textContent = ''\n element.append(...value.map(tag => span(tag, {class: 'tag'})))\n }\n }\n}\n\nconst columns = [\n {\n prop: 'date',\n width: 120\n },\n {\n prop: 'isLucky',\n type: 'boolean',\n width: 90\n },\n {\n prop: 'number',\n align: 'right',\n width: 90\n },\n {\n prop: 'string',\n width: 200\n },\n {\n prop: 'tags',\n width: 200,\n dataCell() {\n return elements.div({ bind: tagsBinding })\n }\n },\n]\n\nconst table = dataTable({ array, columns })\nconst filter = filterBuilder({\n fields: columns,\n onChange(event) {\n table.filter = filter.filter\n }\n})\npreview.append(filter, table)\n```\n```css\n.preview {\n display: flex;\n flex-direction: column;\n}\n\n.preview xin-table {\n flex: 1 1 auto;\n}\n\n.preview .tag-list {\n display: flex;\n font-size: 80%;\n align-items: center;\n gap: 2px;\n}\n\n.preview .tag {\n display: inline-block;\n border-radius: 4px;\n padding: 0 5px;\n line-height: 20px;\n height: 20px;\n color: var(--brand-text-color);\n background: var(--brand-color);\n}\n```\n\n## serialization\n\nThe current state of a `<xin-filter>` can be serialized as, and restored from, a Javascript object (which itself\ncan easily be converted into JSON or a URL component) via its `state` property. Obviously, a `<xin-filter>` can\nonly restore state if it has the necessary constituent `filters`.\n\n## availableFilters\n\n`<xin-filter>` has a default set of `FilterMaker` objects which it uses to construct filter function.\nIn the example above, the default collection of filters is reduced to `contains`, `equals`, `after`, and `isTrue`.\n\nThe full collection includes:\n\n- **contains** * looks for fields containing a string (ignoring case)\n- **equals** * looks for fields containing equivalent values (ignoring case)\n- **after** * looks for fields with a date after a provided value\n- **greaterThan** * looks for fields with a value greater than a provided value\n- **truthy** * looks for fields that are true / non-zero / non-empty\n- **true** looks for fields that are `true`\n- **false** looks for fields that are `false`\n- **hasTags** looks for fields that are arrays containing all the (space/comma) delimited strings\n- **doesNotHaveTags** looks for fields that are arrays containing *none* of the strings\n\n**Note**: the filters marked with an * have negative version (e.g. does not contain).\n\n```\ntype ObjectTest (obj: any) => boolean\n\ninterface FilterMaker {\n caption: string // describes the test condition\n negative?: string // describes the negative test condition\n needsValue?: boolean // if false, the filterMaker doesn't need a needle value\n filterMaker(needle: any) => ObjectTest // builds an ObjectTest\n}\n```\n*/\n\nimport { Component as WebComponent, ElementCreator, elements, PartsMap } from 'tosijs'\nimport { icons } from './icons'\nimport { xinSelect, XinSelect, SelectOption } from './select'\n\nconst { div, input, button, span } = elements\n\ntype ObjectTest = (obj: any) => boolean\ntype ArrayFilter = (array: any[]) => any[]\n\nconst passThru = (array: any[]) => array\nconst NULL_FILTER_DESCRIPTION = 'null filter, everything matches'\n\ninterface FilterMaker {\n caption: string\n negative?: string\n needsValue?: boolean // default true\n makeTest: (value: any) => ObjectTest\n}\n\nexport const availableFilters: { [key: string]: FilterMaker } = {\n contains: {\n caption: 'contains',\n negative: 'does not contain',\n makeTest: (value: string) => {\n value = value.toLocaleLowerCase()\n return (obj: any) => String(obj).toLocaleLowerCase().includes(value)\n },\n },\n hasTags: {\n caption: 'has tags',\n makeTest: (value: string) => {\n const tags = value\n .split(/[\\s,]/)\n .map((tag) => tag.trim().toLocaleLowerCase())\n .filter((tag) => tag !== '')\n return (obj: any) =>\n Array.isArray(obj) &&\n tags.find((tag) => !obj.includes(tag)) === undefined\n },\n },\n doesNotHaveTags: {\n caption: 'does not have tags',\n makeTest: (value: string) => {\n const tags = value\n .split(/[\\s,]/)\n .map((tag) => tag.trim().toLocaleLowerCase())\n .filter((tag) => tag !== '')\n return (obj: any) =>\n Array.isArray(obj) &&\n tags.find((tag) => obj.includes(tag)) === undefined\n },\n },\n equals: {\n caption: '=',\n negative: '≠',\n makeTest: (value: string) => {\n if (isNaN(Number(value))) {\n value = String(value).toLocaleLowerCase()\n return (obj: any) => String(obj).toLocaleLowerCase() === value\n }\n const num = Number(value)\n return (obj: any) => Number(obj) === num\n },\n },\n after: {\n caption: 'is after',\n negative: 'is before',\n makeTest: (value: any) => {\n const date = new Date(value)\n return (obj: any) => new Date(obj) > date\n },\n },\n greaterThan: {\n caption: '>',\n negative: '≤',\n makeTest: (value: any) => {\n if (!isNaN(Number(value))) {\n const num = Number(value)\n return (obj: any) => Number(obj) > num\n }\n value = value.toLocaleLowerCase()\n return (obj: any) => String(obj).toLocaleLowerCase() > value\n },\n },\n truthy: {\n caption: 'is true/non-empty/non-zero',\n negative: 'is false/empty/zero',\n needsValue: false,\n makeTest: () => (obj: any) => !!obj,\n },\n isTrue: {\n caption: '= true',\n needsValue: false,\n makeTest: () => (obj: any) => obj === true,\n },\n isFalse: {\n caption: '= false',\n needsValue: false,\n makeTest: () => (obj: any) => obj === false,\n },\n}\n\ninterface Filter {\n description: string\n test: ObjectTest\n}\n\nconst passAnything = {\n description: 'anything',\n test: () => true,\n}\n\nfunction getSelectText(select: XinSelect): string {\n return (select.options[select.selectedIndex] as SelectOption)?.caption || ''\n}\n\ntype Fields = Array<{ name?: string; prop: string }>\n\nexport interface FilterPartState {\n haystack: string\n condition: string\n needle: string\n}\n\ninterface FilterPartParts extends PartsMap {\n haystack: XinSelect\n condition: XinSelect\n needle: HTMLInputElement\n remove: HTMLButtonElement\n}\n\nexport class FilterPart extends WebComponent<FilterPartParts> {\n fields: Fields = []\n filters = availableFilters\n haystack = '*'\n condition = 'contains'\n needle = ''\n\n content = () => [\n xinSelect({ part: 'haystack' }),\n xinSelect({ part: 'condition' }),\n input({ part: 'needle', type: 'search' }),\n span({ part: 'padding' }),\n button({ part: 'remove', title: 'delete' }, icons.trash()),\n ]\n\n filter: Filter = passAnything\n\n constructor() {\n super()\n this.initAttributes('haystack', 'condition', 'needle')\n }\n\n get state(): FilterPartState {\n const { haystack, needle, condition } = this.parts\n return {\n haystack: haystack.value,\n needle: needle.value,\n condition: condition.value,\n }\n }\n\n set state(newState: FilterPartState) {\n Object.assign(this, newState)\n }\n\n buildFilter = (/* event: Event */) => {\n const { haystack, condition, needle } = this.parts\n\n const negative = condition.value.startsWith('~')\n const key = negative ? condition.value.slice(1) : condition.value\n const filter = this.filters[key] as FilterMaker\n needle.hidden = filter.needsValue === false\n\n const baseTest =\n filter.needsValue === false\n ? filter.makeTest(undefined)\n : filter.makeTest(needle.value)\n const field = haystack.value\n let test\n\n if (field !== '*') {\n test = negative\n ? (obj: any) => !baseTest(obj[field])\n : (obj: any) => baseTest(obj[field])\n } else {\n test = negative\n ? (obj: any) =>\n Object.values(obj).find((v) => !baseTest(v)) !== undefined\n : (obj: any) =>\n Object.values(obj).find((v) => baseTest(v)) !== undefined\n }\n\n const matchValue = filter.needsValue !== false ? ` \"${needle.value}\"` : ''\n const description = `${getSelectText(haystack)} ${getSelectText(\n condition\n )}${matchValue}`\n\n this.filter = {\n description,\n test,\n }\n\n this.parentElement?.dispatchEvent(new Event('change'))\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n const { haystack, condition, needle, remove } = this.parts\n\n haystack.addEventListener('change', this.buildFilter)\n condition.addEventListener('change', this.buildFilter)\n needle.addEventListener('input', this.buildFilter)\n haystack.value = this.haystack\n condition.value = this.condition\n needle.value = this.needle\n\n remove.addEventListener('click', () => {\n const { parentElement } = this\n this.remove()\n parentElement?.dispatchEvent(new Event('change'))\n })\n }\n\n render() {\n super.render()\n\n const { haystack, condition, needle } = this.parts\n\n haystack.options = [\n {\n caption: 'any field', \n value: '*'\n },\n ...this.fields.map((field) => field.prop)\n ]\n \n condition.options = Object.keys(this.filters).map((key) => {\n const filter = this.filters[key]\n return filter.negative !== undefined\n ? [\n { caption: filter.caption, value: key },\n { caption: filter.negative, value: '~' + key },\n ]\n : { caption: filter.caption, value: key }\n })\n .flat() as SelectOption[]\n\n if (this.haystack !== '') {\n haystack.value = this.haystack\n }\n if (this.condition !== '') {\n condition.value = this.condition\n }\n if (this.needle !== '') {\n needle.value = this.needle\n }\n this.buildFilter()\n }\n}\n\nexport const filterPart = FilterPart.elementCreator({\n tag: 'xin-filter-part',\n styleSpec: {\n ':host': {\n display: 'flex',\n },\n\n ':host .xin-icon:': {\n verticalAlign: 'middle',\n pointerEvents: 'none',\n },\n\n ':host [part=\"haystack\"], :host [part=\"condition\"]': {\n flex: '1',\n },\n\n ':host [part=\"needle\"]': {\n flex: 2,\n },\n\n ':host [hidden]+[part=\"padding\"]': {\n display: 'block',\n content: ' ',\n flex: '1 1 auto',\n },\n },\n}) as ElementCreator<FilterPart>\n\nexport type FilterState = FilterPartState[]\n\nexport interface FilterBuilderParts extends PartsMap {\n add: HTMLButtonElement\n resent: HTMLButtonElement\n}\n\nexport class FilterBuilder extends WebComponent<FilterBuilderParts> {\n private _fields: Fields = []\n\n get fields(): Fields {\n return this._fields\n }\n\n set fields(_fields: Fields) {\n this._fields = _fields\n this.queueRender()\n }\n\n get state(): FilterState {\n const { filterContainer } = this.parts\n return ([...filterContainer.children] as FilterPart[]).map(\n (part) => part.state\n )\n }\n\n set state(parts: FilterState) {\n const { fields, filters } = this\n const { filterContainer } = this.parts\n filterContainer.textContent = ''\n for (const state of parts) {\n filterContainer.append(filterPart({ fields, filters, ...state }))\n }\n }\n\n filter: ArrayFilter = passThru\n description = NULL_FILTER_DESCRIPTION\n\n addFilter = () => {\n const { fields, filters } = this\n const { filterContainer } = this.parts\n filterContainer.append(filterPart({ fields, filters }))\n }\n\n content = () => [\n button(\n {\n part: 'add',\n title: 'add filter condition',\n onClick: this.addFilter,\n class: 'round',\n },\n icons.plus()\n ),\n div({ part: 'filterContainer' }),\n button(\n { part: 'reset', title: 'reset filter', onClick: this.reset },\n icons.x()\n ),\n ]\n\n filters = availableFilters\n\n reset = () => {\n const { fields, filters } = this\n const { filterContainer } = this.parts\n this.description = NULL_FILTER_DESCRIPTION\n this.filter = passThru\n filterContainer.textContent = ''\n filterContainer.append(filterPart({ fields, filters }))\n this.dispatchEvent(new Event('change'))\n }\n\n buildFilter = (/* event: Event */) => {\n const { filterContainer } = this.parts\n if (filterContainer.children.length === 0) {\n this.reset()\n return\n }\n const filters = ([...filterContainer.children] as FilterPart[]).map(\n (filterPart) => filterPart.filter\n ) as Filter[]\n const tests = filters.map((filter) => filter.test) as ObjectTest[]\n this.description = filters.map((filter) => filter.description).join(', ')\n this.filter = (array: any[]) =>\n array.filter(\n (obj: any) => tests.find((f) => f(obj) === false) === undefined\n )\n this.dispatchEvent(new Event('change'))\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n const { filterContainer } = this.parts\n filterContainer.addEventListener('change', this.buildFilter)\n\n this.reset()\n }\n\n render() {\n super.render()\n }\n}\n\nexport const filterBuilder = FilterBuilder.elementCreator({\n tag: 'xin-filter',\n styleSpec: {\n ':host': {\n height: 'auto',\n display: 'grid',\n gridTemplateColumns: '32px calc(100% - 64px) 32px',\n alignItems: 'center',\n },\n\n ':host [part=\"filterContainer\"]': {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n flex: '1 1 auto',\n },\n \n ':host [part=\"haystack\"]': {\n _fieldWidth: '100px'\n },\n \n ':host [part=\"condition\"]': {\n _fieldWidth: '60px'\n },\n \n ':host [part=\"needle\"]': {\n _fieldWidth: '80px'\n },\n\n ':host [part=\"add\"], :host [part=\"reset\"]': {\n '--button-size': 'var(--touch-size, 32px)',\n borderRadius: '999px',\n height: 'var(--button-size)',\n lineHeight: 'var(--button-size)',\n margin: '0',\n padding: '0',\n textAlign: 'center',\n width: 'var(--button-size)',\n flex: '0 0 var(--button-size)',\n },\n },\n}) as ElementCreator<FilterBuilder>\n",
@@ -29,7 +29,7 @@
29
29
  "/*#\n# example\n\n`<xin-example>` makes it easy to insert interactive code examples in a web page. It\nstarted life as a super lightweight, easier-to-embed implementation of\n[b8rjs's fiddle component](https://b8rjs.com)—which I dearly missed—but now the student\nis, by far, the master. And it's still super lightweight.\n\n*You're probably looking at it right now.*\n\n```js\n// this code executes in an async function body\n// it has tosijs, tosijsui, and preview (the preview div) available as local variables\nimport { div } from 'tosijs'.elements\npreview.append(div({class: 'example'}, 'fiddle de dee!'))\npreview.append('Try editing some code and hitting refresh…')\n```\n```html\n<h2>Example</h2>\n```\n```css\n.preview {\n padding: 0 var(--spacing);\n}\n\n.example {\n animation: throb ease-in-out 1s infinite alternate;\n}\n\n@keyframes throb {\n from { color: blue }\n to { color: red }\n}\n```\n\nYou can also use Typescript. It will be stripped down to\nJavascript using [sucrase](https://github.com/alangpierce/sucrase).\n\n```js\nfunction makeElement(tag: string, ...children: Array<string | HTMLElement>): HTMLElement {\n const element = document.createElement(tag)\n element.append(...children)\n return element\n}\n\npreview.append(\n makeElement('h2', 'hello typescript')\n)\n```\n\nYou can also create a live-example from HTML. And if you add the `persist-to-dom`\nattribute, it will persist your code to the DOM.\n\n<xin-example persist-to-dom>\n <pre class=\"language-html\">\n <h1 class=\"make-it-red\">Pure HTML!</h1>\n <button>Click Me!</button>\n </pre>\n <pre class=\"language-js\">\n preview.querySelector('button').addEventListener('click', () => {\n alert('you clicked?')\n })\n </pre>\n <pre class=\"language-css\">\n .make-it-red {\n color: red;\n }\n </pre>\n</xin-example>\n\nYou can simply wrap it around a sequence of code blocks in the DOM with the\nlanguages (js, html, css) as annotations or you can directly set the `js`, `html`,\nand `css` properties.\n\n## Code-Editor\n\nThe **code-editor** is actually the same component spawned in a new window using\na couple of clever tricks, the most important of which is leveraging\n[StorageEvent](https://developer.mozilla.org/en-US/docs/Web/API/StorageEvent).\n\nThis functionality was originally added to make working in XR easier, but it turned\nout that it's just better than the earlier way of doing things.\n\nIt actually uses just one `localStorage` item to handle any number of code-editors,\nand cleans up after itself when you close the example (including closing stray\nwindows.\n\n> **To Do** a little refactoring and tweaking to split the the editor off as a\ncompletely separate component that can be used for other things, and make the\nexample itself lighter-weight.\n\n## `context`\n\n```html\n<p>testing</p>\n```\n```js\nimport { elements } from 'tosijs'\nimport { svgIcon } from 'tosijs-ui'\n\npreview.querySelector('p').style.color = 'red'\npreview.append(\n elements.p('another paragraph'),\n svgIcon({icon: 'tosiPlatform', size: 64})\n)\n```\n\nA `<xin-example>` is given a `context` object {[key: string]: any}, which is the\nset of values available in the javascript's execution context (it is wrapped in an\nasync function and passed those values). The context always includes `preview`\nwhich is the element containing the HTML for the example.\n\nIf the context keys have hyphens in them, these are removed to allow the examples\nto `import` libraries:\n\nSo we provide context like this:\n\n```\nimport * as tosijs from 'tosjs'\nimport * as tosijsui from 'tosijs-ui'\n\n...\n\ncontext = {\n tosijs,\n 'tosijs-ui': tosijsui\n}\n```\n\n```\nimport { elements, tosi } from 'tosijs'\nimport { icons } from 'tosijs-ui'\n```\n\nis rewritten as:\n\n```\nimport { elements, tosi } from 'tosijs'\nimport { icons } from 'tosijs-ui'\n```\n\nThe `LiveExample` class provides the static `insertExamples(element: HTMLElement)`\nfunction that will replace any sequence of\n`pre code[class=\"language-html\"],pre code[class=\"language-js\"],pre code[class=\"language-css\"]`\nelements with a `<xin-example>` instance.\n*/\n\nimport { Component, ElementCreator, PartsMap, elements } from 'tosijs'\nimport { codeEditor, CodeEditor } from './code-editor'\nimport { tabSelector, TabSelector } from './tab-selector'\nimport { icons } from './icons'\nimport { popMenu } from './menu'\n\nconst { div, xinSlot, style, button, h4, pre, code } = elements\n\nconst sucraseSrc = () => 'https://cdn.jsdelivr.net/npm/sucrase@3.35.0/+esm'\n\nconst AsyncFunction = (async () => {\n /* do not care */\n}).constructor\n\ninterface ExampleContext {\n [key: string]: any\n}\n\ninterface ExampleParts extends PartsMap {\n codeEditors: HTMLElement\n undo: HTMLButtonElement\n redo: HTMLButtonElement\n exampleWidgets: HTMLButtonElement\n editors: TabSelector\n code: HTMLElement\n sources: HTMLElement\n style: HTMLStyleElement\n example: HTMLElement\n}\n\nexport class LiveExample extends Component<ExampleParts> {\n persistToDom = false\n prettier = false\n prefix = 'lx'\n storageKey = 'live-example-payload'\n context: ExampleContext = {}\n uuid: string = crypto.randomUUID()\n remoteId = ''\n\n // FIXME workarounds for StorageEvent issue on Quest\n lastUpdate = 0\n interval?: any\n\n static insertExamples(\n element: HTMLElement,\n context: ExampleContext = {}\n ): void {\n const sources = [\n ...element.querySelectorAll('.language-html,.language-js,.language-css'),\n ]\n .filter((element) => !element.closest(LiveExample.tagName as string))\n .map((code) => ({\n block: code.parentElement as HTMLPreElement,\n language: code.classList[0].split('-').pop(),\n code: (code as HTMLElement).innerText,\n }))\n for (let index = 0; index < sources.length; index += 1) {\n const exampleSources = [sources[index]]\n while (\n index < sources.length - 1 &&\n sources[index].block.nextElementSibling === sources[index + 1].block\n ) {\n exampleSources.push(sources[index + 1])\n index += 1\n }\n const example = liveExample({ context })\n ;(exampleSources[0].block.parentElement as HTMLElement).insertBefore(\n example,\n exampleSources[0].block\n )\n exampleSources.forEach((source) => {\n switch (source.language) {\n case 'js':\n example.js = source.code\n break\n case 'html':\n example.html = source.code\n break\n case 'css':\n example.css = source.code\n break\n }\n source.block.remove()\n })\n example.showDefaultTab()\n }\n }\n\n constructor() {\n super()\n\n this.initAttributes('persistToDom', 'prettier')\n }\n\n get activeTab(): Element | undefined {\n const { editors } = this.parts\n return [...editors.children].find(\n (elt) => elt.getAttribute('hidden') === null\n )\n }\n\n private getEditorValue(which: string): string {\n return (this.parts[which] as CodeEditor).value\n }\n\n private setEditorValue(which: string, code: string): void {\n const codeEditor = this.parts[which] as CodeEditor\n codeEditor.value = code\n }\n\n get css(): string {\n return this.getEditorValue('css')\n }\n\n set css(code: string) {\n this.setEditorValue('css', code)\n }\n\n get html(): string {\n return this.getEditorValue('html')\n }\n\n set html(code: string) {\n this.setEditorValue('html', code)\n }\n\n get js(): string {\n return this.getEditorValue('js')\n }\n\n set js(code: string) {\n this.setEditorValue('js', code)\n }\n\n updateUndo = () => {\n const { activeTab } = this\n const { undo, redo } = this.parts\n if (activeTab instanceof CodeEditor && activeTab.editor !== undefined) {\n const undoManager = activeTab.editor.session.getUndoManager()\n undo.disabled = !undoManager.hasUndo()\n redo.disabled = !undoManager.hasRedo()\n } else {\n undo.disabled = true\n redo.disabled = true\n }\n }\n\n undo = () => {\n const { activeTab } = this\n if (activeTab instanceof CodeEditor) {\n activeTab.editor.undo()\n }\n }\n\n redo = () => {\n const { activeTab } = this\n if (activeTab instanceof CodeEditor) {\n activeTab.editor.redo()\n }\n }\n\n get isMaximized(): boolean {\n return this.classList.contains('-maximize')\n }\n\n flipLayout = () => {\n this.classList.toggle('-vertical')\n }\n\n exampleMenu = () => {\n popMenu({\n target: this.parts.exampleWidgets,\n width: 'auto',\n menuItems: [\n {\n icon: 'edit2',\n caption: 'view/edit code',\n action: this.showCode,\n },\n {\n icon: 'edit',\n caption: 'view/edit code in a new window',\n action: this.openEditorWindow,\n },\n null,\n {\n icon: this.isMaximized ? 'minimize' : 'maximize',\n caption: this.isMaximized ? 'restore preview' : 'maximize preview',\n action: this.toggleMaximize,\n },\n ],\n })\n }\n\n handleShortcuts = (event: KeyboardEvent) => {\n if (event.metaKey || event.ctrlKey) {\n let block = false\n switch (event.key) {\n case 's':\n case 'r':\n this.refresh()\n block = true\n break\n case '/':\n this.flipLayout()\n break\n case 'c':\n if (event.shiftKey) {\n this.copy()\n block = true\n }\n break\n }\n if (block) {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n }\n\n content = () => [\n div(\n { part: 'example' },\n style({ part: 'style' }),\n button(\n {\n title: 'example menu',\n part: 'exampleWidgets',\n onClick: this.exampleMenu,\n },\n icons.code()\n )\n ),\n div(\n {\n class: 'code-editors',\n part: 'codeEditors',\n onKeydown: this.handleShortcuts,\n hidden: true,\n },\n tabSelector(\n {\n part: 'editors',\n onChange: this.updateUndo,\n },\n codeEditor({\n name: 'js',\n mode: 'javascript',\n part: 'js',\n }),\n codeEditor({ name: 'html', mode: 'html', part: 'html' }),\n codeEditor({ name: 'css', mode: 'css', part: 'css' }),\n div(\n {\n slot: 'after-tabs',\n class: 'row',\n },\n button(\n {\n title: 'undo',\n part: 'undo',\n class: 'transparent',\n onClick: this.undo,\n },\n icons.cornerUpLeft()\n ),\n button(\n {\n title: 'redo',\n part: 'redo',\n class: 'transparent',\n onClick: this.redo,\n },\n icons.cornerUpRight()\n ),\n button(\n {\n title: 'flip direction (⌘/ | ^/)',\n class: 'transparent',\n onClick: this.flipLayout,\n },\n icons.columns({ class: 'layout-indicator' })\n ),\n button(\n {\n title: 'copy as markdown (⌘⇧C | ^⇧C)',\n class: 'transparent',\n onClick: this.copy,\n },\n icons.copy()\n ),\n button(\n {\n title: 'reload (⌘R | ^R)',\n class: 'transparent',\n onClick: this.refreshRemote,\n },\n icons.refreshCw()\n ),\n button(\n {\n title: 'close code',\n class: 'transparent',\n onClick: this.closeCode,\n },\n icons.x()\n )\n )\n )\n ),\n xinSlot({ part: 'sources', hidden: true }),\n ]\n\n connectedCallback(): void {\n super.connectedCallback()\n const { sources } = this.parts\n\n this.initFromElements([...sources.children] as HTMLElement[])\n addEventListener('storage', this.remoteChange)\n\n // FIXME workaround for Quest 3\n this.interval = setInterval(this.remoteChange, 500)\n this.undoInterval = setInterval(this.updateUndo, 250)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n\n const { storageKey, remoteKey } = this\n\n // FIXME workaround for Quest 3\n clearInterval(this.interval)\n clearInterval(this.undoInterval)\n\n localStorage.setItem(\n storageKey,\n JSON.stringify({\n remoteKey,\n sentAt: Date.now(),\n close: true,\n })\n )\n }\n\n copy = () => {\n const js = this.js !== '' ? '```js\\n' + this.js.trim() + '\\n```\\n' : ''\n const html =\n this.html !== '' ? '```html\\n' + this.html.trim() + '\\n```\\n' : ''\n const css = this.css !== '' ? '```css\\n' + this.css.trim() + '\\n```\\n' : ''\n\n navigator.clipboard.writeText(js + html + css)\n }\n\n toggleMaximize = () => {\n this.classList.toggle('-maximize')\n }\n\n get remoteKey(): string {\n return this.remoteId !== ''\n ? this.prefix + '-' + this.remoteId\n : this.prefix + '-' + this.uuid\n }\n\n remoteChange = (event?: StorageEvent) => {\n const data = localStorage.getItem(this.storageKey)\n if (event instanceof StorageEvent && event.key !== this.storageKey) {\n return\n }\n if (data === null) {\n return\n }\n const { remoteKey, sentAt, css, html, js, close } = JSON.parse(data)\n // FIXME workaround for Quest\n if (sentAt <= this.lastUpdate) {\n return\n }\n if (remoteKey !== this.remoteKey) {\n return\n }\n if (close === true) {\n window.close()\n }\n console.log('received new code', sentAt, this.lastUpdate)\n this.lastUpdate = sentAt\n this.css = css\n this.html = html\n this.js = js\n this.refresh()\n }\n\n showCode = () => {\n this.classList.add('-maximize')\n this.classList.toggle('-vertical', this.offsetHeight > this.offsetWidth)\n this.parts.codeEditors.hidden = false\n }\n\n closeCode = () => {\n if (this.remoteId !== '') {\n window.close()\n } else {\n this.classList.remove('-maximize')\n this.parts.codeEditors.hidden = true\n }\n }\n\n openEditorWindow = () => {\n const { storageKey, remoteKey, css, html, js, uuid, prefix } = this\n const href = location.href.split('?')[0] + `?${prefix}=${uuid}`\n localStorage.setItem(\n storageKey,\n JSON.stringify({\n remoteKey,\n sentAt: Date.now(),\n css,\n html,\n js,\n })\n )\n window.open(href)\n }\n\n refreshRemote = () => {\n const { remoteKey, css, html, js } = this\n localStorage.setItem(\n this.storageKey,\n JSON.stringify({ remoteKey, sentAt: Date.now(), css, html, js })\n )\n }\n\n updateSources = () => {\n if (this.persistToDom) {\n const { sources } = this.parts\n sources.innerText = ''\n for (const language of ['js', 'css', 'html']) {\n if (this[language]) {\n sources.append(\n pre({ class: `language-${language}`, innerHTML: this[language] })\n )\n }\n }\n }\n }\n\n refresh = async () => {\n if (this.remoteId !== '') {\n return\n }\n\n const { transform } = await import(sucraseSrc())\n\n const { example, style } = this.parts\n\n const preview = div({ class: 'preview' })\n preview.innerHTML = this.html\n style.innerText = this.css\n const oldPreview = example.querySelector('.preview')\n if (oldPreview) {\n oldPreview.replaceWith(preview)\n } else {\n example.insertBefore(preview, this.parts.exampleWidgets)\n }\n\n const context = { preview, ...this.context }\n try {\n let code = this.js\n for (const moduleName of Object.keys(this.context)) {\n code = code.replace(\n new RegExp(`import \\\\{(.*)\\\\} from '${moduleName}'`, 'g'),\n `const {$1} = ${moduleName.replace(/-/g, '')}`\n )\n }\n // @ts-expect-error ts is wrong and it makes me so mad\n const func = new AsyncFunction(\n ...Object.keys(context).map((key: string) => key.replace(/-/g, '')),\n transform(code, { transforms: ['typescript'] }).code\n )\n func(...Object.values(context)).catch((err: Error) => console.error(err))\n if (this.persistToDom) {\n this.updateSources()\n }\n } catch (e) {\n console.error(e)\n window.alert(`Error: ${e}, the console may have more information…`)\n }\n }\n\n initFromElements(elements: HTMLElement[]) {\n for (const element of elements) {\n element.hidden = true\n const [mode, ...lines] = element.innerHTML.split('\\n') as string[]\n if (['js', 'html', 'css'].includes(mode)) {\n const minIndex = lines\n .filter((line) => line.trim() !== '')\n .map((line) => (line.match(/^\\s*/) as string[])[0].length)\n .sort()[0]\n const source = (\n minIndex > 0 ? lines.map((line) => line.substring(minIndex)) : lines\n ).join('\\n')\n ;(this.parts[mode] as CodeEditor).value = source\n } else {\n const language = ['js', 'html', 'css'].find((language: string) =>\n element.matches(`.language-${language}`)\n )\n if (language) {\n ;(this.parts[language] as CodeEditor).value =\n language === 'html' ? element.innerHTML : element.innerText\n }\n }\n }\n }\n\n showDefaultTab() {\n const { editors } = this.parts\n if (this.js !== '') {\n editors.value = 0\n } else if (this.html !== '') {\n editors.value = 1\n } else if (this.css !== '') {\n editors.value = 2\n }\n }\n\n render(): void {\n super.render()\n\n if (this.remoteId !== '') {\n const data = localStorage.getItem(this.storageKey)\n if (data !== null) {\n const { remoteKey, sentAt, css, html, js } = JSON.parse(data)\n if (this.remoteKey !== remoteKey) {\n return\n }\n this.lastUpdate = sentAt\n this.css = css\n this.html = html\n this.js = js\n this.parts.example.hidden = true\n this.parts.codeEditors.hidden = false\n this.classList.add('-maximize')\n this.updateUndo()\n }\n } else {\n this.refresh()\n }\n }\n}\n\nexport const liveExample = LiveExample.elementCreator({\n tag: 'xin-example',\n styleSpec: {\n ':host': {\n '--xin-example-height': '320px',\n '--code-editors-bar-bg': '#777',\n '--code-editors-bar-color': '#fff',\n '--widget-bg': '#fff8',\n '--widget-color': '#000',\n position: 'relative',\n display: 'flex',\n height: 'var(--xin-example-height)',\n background: 'var(--background)',\n boxSizing: 'border-box',\n },\n\n ':host.-maximize': {\n position: 'fixed',\n left: '0',\n top: '0',\n height: '100vh',\n width: '100vw',\n margin: '0 !important',\n },\n\n '.-maximize': {\n zIndex: 101,\n },\n\n ':host.-vertical': {\n flexDirection: 'column',\n },\n\n ':host .layout-indicator': {\n transition: '0.5s ease-out',\n transform: 'rotateZ(270deg)',\n },\n\n ':host.-vertical .layout-indicator': {\n transform: 'rotateZ(180deg)',\n },\n\n ':host.-maximize .hide-if-maximized, :host:not(.-maximize) .show-if-maximized':\n {\n display: 'none',\n },\n\n ':host [part=\"example\"]': {\n flex: '1 1 50%',\n height: '100%',\n position: 'relative',\n overflowX: 'auto',\n },\n\n ':host .preview': {\n height: '100%',\n position: 'relative',\n overflow: 'hidden',\n boxShadow: 'inset 0 0 0 2px #8883',\n },\n\n ':host [part=\"editors\"]': {\n flex: '1 1 200px',\n height: '100%',\n position: 'relative',\n },\n\n ':host [part=\"exampleWidgets\"]': {\n position: 'absolute',\n left: '5px',\n bottom: '5px',\n '--widget-color': 'var(--brand-color)',\n borderRadius: '5px',\n width: '44px',\n height: '44px',\n lineHeight: '44px',\n zIndex: '100',\n },\n\n ':host [part=\"exampleWidgets\"] svg': {\n stroke: 'var(--widget-color)',\n },\n\n ':host .code-editors': {\n overflow: 'hidden',\n background: 'white',\n position: 'relative',\n top: '0',\n right: '0',\n flex: '1 1 50%',\n height: '100%',\n flexDirection: 'column',\n zIndex: '10',\n },\n\n ':host .code-editors:not([hidden])': {\n display: 'flex',\n },\n\n ':host .code-editors > h4': {\n padding: '5px',\n margin: '0',\n textAlign: 'center',\n background: 'var(--code-editors-bar-bg)',\n color: 'var(--code-editors-bar-color)',\n cursor: 'move',\n },\n\n ':host button.transparent, :host .sizer': {\n width: '32px',\n height: '32px',\n lineHeight: '32px',\n textAlign: 'center',\n padding: '0',\n margin: '0',\n },\n\n ':host .sizer': {\n cursor: 'nwse-resize',\n },\n },\n}) as ElementCreator<LiveExample>\n\nconst params = new URL(window.location.href).searchParams\nconst remoteId = params.get('lx')\nif (remoteId) {\n document.title += ' [code editor]'\n document.body.textContent = ''\n document.body.append(liveExample({ remoteId }))\n}\n",
30
30
  "/*#\n# tabs\n\n`<xin-tabs>` creates a `tabpanel` for its children, creating a `tab` for each based on its\n`name` attribute.\n\n```js\n[...preview.querySelectorAll('div[name]')].forEach(div => {\n div.style.color = `hsl(${(Math.random() * 360).toFixed(0)} 50% 50%)`\n})\n\nimport { div, button } from 'tosijs'.elements\nconst tabSelector = preview.querySelector('xin-tabs')\n\ntabSelector.onCloseTab = body => {\n if (!confirm(`Are you sure you want to close the ${body.getAttribute('name')} tab?`)) {\n return false\n }\n}\n\nlet bodycount = 0\npreview.querySelector('.add').addEventListener('click', () => {\n const name = `new tab ${++bodycount}`\n const body = div(\n {name, dataClose: true},\n name,\n )\n tabSelector.addTabBody(body, true)\n})\n```\n```html\n<xin-tabs>\n <div name=\"first\">first body</div>\n <div name=\"second\" data-close>\n <template role=\"tab\">\n <xin-icon\n style=\"\n display: inline-block;\n width: 16px;\n height: 16px;\n transform: translateY(2px);\n margin-right: 4px;\n stroke: var(--brand-color);\n \"\n icon=\"eye\"\n ></xin-icon>\n <span>Ooooh!!!</span>\n </template>\n look at the html…\n </div>\n <div name=\"third\">third body</div>\n <button class=\"add\" slot=\"after-tabs\">\n <xin-icon icon=\"plus\"></xin-icon>\n </button>\n</xin-tabs>\n```\n```css\n .preview xin-tabs {\n height: 100%;\n }\n\n .preview div[name] {\n padding: 20px;\n text-align: center;\n height: 100%;\n font-size: 200%;\n }\n\n .preview .add {\n width: 38px;\n line-height: 38px;\n height: 38px;\n padding: 0;\n }\n```\n\nThe `<xin-tabs>`s `value` is the index of its active body.\n\nA `<xin-tabs>` has `addTabBody(body: HTMLElement, select?: boolean)` and\n`removeTabBody(body: number | HTMLElement)` methods for updating its content.\n\nYou can also just insert or remove tab bodies directly and call `setupTabs()`.\n\n## Closeable Tabs\n\nAdding the `data-close` attribute to a tab will make it closeable.\n\nWhen a tab is closed, the `<xin-tabs>` element's `onCloseTab: (tabBody: Element) => boolean | undefined | void`\nwill be called. If you override this method and return `false`, the tab will\nnot be closed (e.g. if you want to implement save/cancel behavior).\n\n## Custom Tab Content\n\nYou can specify the exact content of the tab for a given body by\nadding a `<template role=\"tab\">` to that body. The contents of that\ntemplate will be cloned into the tab.\n\n## Localized Support\n\n```html\n<xin-tabs localized>\n <div name=\"localize\"><h2>localize!</h2></div>\n <div name=\"tabs\"><h2>tabs</h2></div>\n</xin-tabs>\n```\n\n`<xin-tabs>` supports the `localized` attribute. It will automatically localize\ntab names (but it won't override custom tab content, so localizing that is on you).\n*/\n\nimport {\n Component as WebComponent,\n ElementCreator,\n elements,\n vars,\n PartsMap,\n} from 'tosijs'\n\nimport { xinLocalized, XinLocalized } from './localize'\n\nimport { icons } from '../src'\n\nconst { div, slot, span, button } = elements\n\ntype TabCloseHandler = (tabBody: Element) => boolean | undefined | void\n\ninterface TabsParts extends PartsMap {\n tabs: HTMLElement\n selected: HTMLElement\n}\n\nexport class TabSelector extends WebComponent {\n value = 0\n localized = false\n\n makeTab(\n tabs: TabSelector,\n tabBody: HTMLElement,\n bodyId: string\n ): HTMLElement {\n const tabName = tabBody.getAttribute('name') as string\n const tabContent =\n (\n tabBody.querySelector('template[role=\"tab\"]') as HTMLTemplateElement\n )?.content.cloneNode(true) ||\n (this.localized ? xinLocalized(tabName) : span(tabName))\n const tab = div(\n tabContent,\n {\n part: 'tab',\n tabindex: 0,\n role: 'tab',\n ariaControls: bodyId,\n },\n tabBody.hasAttribute('data-close')\n ? button(\n {\n title: 'close',\n class: 'close',\n },\n icons.x()\n )\n : {}\n )\n return tab\n }\n\n static styleSpec = {\n ':host': {\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n overflow: 'hidden',\n boxShadow: 'none !important',\n },\n slot: {\n position: 'relative',\n display: 'block',\n flex: '1',\n overflow: 'hidden',\n overflowY: 'auto',\n },\n 'slot[name=\"after-tabs\"]': {\n flex: '0 0 auto',\n },\n '::slotted([hidden])': {\n display: 'none !important',\n },\n ':host::part(tabpanel)': {\n display: 'flex',\n flexDirection: 'column',\n overflowX: 'auto',\n },\n ':host::part(tabrow)': {\n display: 'flex',\n },\n ':host .tabs': {\n display: 'flex',\n userSelect: 'none',\n whiteSpace: 'nowrap',\n },\n ':host .tabs > div': {\n padding: `${vars.spacing50} ${vars.spacing}`,\n cursor: 'default',\n display: 'flex',\n alignItems: 'baseline',\n },\n ':host .tabs > [aria-selected=\"true\"]': {\n '--text-color': vars.xinTabsSelectedColor,\n color: vars.textColor,\n },\n ':host .elastic': {\n flex: '1',\n },\n ':host .border': {\n background: 'var(--xin-tabs-bar-color, #ccc)',\n },\n ':host .border > .selected': {\n content: ' ',\n width: 0,\n height: 'var(--xin-tabs-bar-height, 2px)',\n background: vars.xinTabsSelectedColor,\n transition: 'ease-out 0.2s',\n },\n ':host button.close': {\n border: 0,\n background: 'transparent',\n textAlign: 'center',\n marginLeft: vars.spacing50,\n padding: 0,\n },\n ':host button.close > svg': {\n height: '12px',\n },\n }\n\n onCloseTab: TabCloseHandler | null = null\n\n content = [\n div(\n { role: 'tabpanel', part: 'tabpanel' },\n div(\n { part: 'tabrow' },\n div({ class: 'tabs', part: 'tabs' }),\n div({ class: 'elastic' }),\n slot({ name: 'after-tabs' })\n ),\n div({ class: 'border' }, div({ class: 'selected', part: 'selected' }))\n ),\n slot(),\n ]\n\n constructor() {\n super()\n this.initAttributes('localized')\n }\n\n addTabBody(body: HTMLElement, selectTab = false): void {\n if (!body.hasAttribute('name')) {\n console.error('element has no name attribute', body)\n throw new Error('element has no name attribute')\n }\n this.append(body)\n this.setupTabs()\n if (selectTab) {\n this.value = this.bodies.length - 1\n }\n this.queueRender()\n }\n\n removeTabBody(body: HTMLElement): void {\n body.remove()\n this.setupTabs()\n this.queueRender()\n }\n\n keyTab = (event: Event): void => {\n const { tabs } = this.parts\n const tabIndex = [...tabs.children].indexOf(event.target as HTMLElement)\n switch ((event as KeyboardEvent).key) {\n case 'ArrowLeft':\n this.value =\n (tabIndex + Number(tabs.children.length) - 1) % tabs.children.length\n ;(tabs.children[this.value] as HTMLElement).focus()\n event.preventDefault()\n break\n case 'ArrowRight':\n this.value = (tabIndex + 1) % tabs.children.length\n ;(tabs.children[this.value] as HTMLElement).focus()\n event.preventDefault()\n break\n case ' ':\n this.pickTab(event)\n event.preventDefault()\n break\n default:\n // console.log(event.key)\n }\n }\n\n get bodies(): Element[] {\n return [...this.children].filter((elt) => elt.hasAttribute('name'))\n }\n\n pickTab = (event: Event): void => {\n const { tabs } = this.parts\n const target = event.target as HTMLElement\n const isCloseEvent = target.closest('button.close') !== null\n const tab = target.closest('.tabs > div') as HTMLElement\n const tabIndex = [...tabs.children].indexOf(tab)\n if (isCloseEvent) {\n const body = this.bodies[tabIndex]\n if (!this.onCloseTab || this.onCloseTab(body) !== false) {\n this.removeTabBody(this.bodies[tabIndex] as HTMLElement)\n }\n } else {\n if (tabIndex > -1) {\n this.value = tabIndex\n }\n }\n }\n\n setupTabs = (): void => {\n const { tabs } = this.parts\n const tabBodies = [...this.children].filter(\n (child) => !child.hasAttribute('slot') && child.hasAttribute('name')\n )\n tabs.textContent = ''\n if (this.value >= tabBodies.length) {\n this.value = tabBodies.length - 1\n }\n for (const index in tabBodies) {\n const tabBody = tabBodies[index] as HTMLElement\n const bodyId = `${this.instanceId}-${index}`\n tabBody.id = bodyId\n const tab = this.makeTab(this, tabBody, bodyId)\n tabs.append(tab)\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n const { tabs } = this.parts\n tabs.addEventListener('click', this.pickTab)\n tabs.addEventListener('keydown', this.keyTab)\n this.setupTabs()\n XinLocalized.allInstances.add(this)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n XinLocalized.allInstances.delete(this)\n }\n\n localeChanged = () => {\n this.queueRender()\n }\n\n onResize(): void {\n this.queueRender()\n }\n\n render(): void {\n const { tabs, selected } = this.parts as TabsParts\n const tabBodies = this.bodies\n for (let i = 0; i < tabBodies.length; i++) {\n const tabBody = tabBodies[i]\n const tab = tabs.children[i] as HTMLElement\n if (this.value === Number(i)) {\n tab.setAttribute('aria-selected', 'true')\n selected.style!.marginLeft = `${tab.offsetLeft - tabs.offsetLeft}px`\n selected.style!.width = `${tab.offsetWidth}px`\n tabBody.toggleAttribute('hidden', false)\n } else {\n tab.toggleAttribute('aria-selected', false)\n tabBody.toggleAttribute('hidden', true)\n }\n }\n }\n}\n\nexport const tabSelector = TabSelector.elementCreator({\n tag: 'xin-tabs',\n}) as ElementCreator<TabSelector>\n",
31
31
  "/*#\n# map\n\nA [mapboxgl](https://docs.mapbox.com/mapbox-gl-js/api/) wrapper.\n\n```js\nconst pickStyle = preview.querySelector('select')\nconst mapbox = preview.querySelector('xin-map')\nconst here = preview.querySelector('button')\n\npickStyle.addEventListener('change', () => {\n mapbox.mapStyle = pickStyle.value\n})\n\nfunction getUserGPSCoordinates() {\n return new Promise((resolve) => {\n // Check if geolocation is supported\n if (!navigator.geolocation) {\n console.log(\"Geolocation is not supported by this browser.\");\n resolve(null);\n return;\n }\n\n // Request position with options\n navigator.geolocation.getCurrentPosition(\n // Success callback\n (position) => {\n resolve({\n latitude: position.coords.latitude,\n longitude: position.coords.longitude\n });\n },\n // Error callback\n (error) => {\n console.log(`Error getting location: ${error.message}`);\n resolve(null);\n },\n // Options\n {\n enableHighAccuracy: true, // Request high accuracy if available\n timeout: 10000, // Time to wait for position (10 seconds)\n maximumAge: 0 // Don't use cached position\n }\n );\n });\n}\n\nhere.addEventListener('click', async () => {\n const location = await getUserGPSCoordinates()\n if (location) {\n mapbox.coords = `${location.latitude},${location.longitude},12`\n }\n})\n```\n```html\n<!-- please don't abuse my mapbox token -->\n<xin-map\n style=\"width: 100%; height: 100%\"\n coords=\"14.0093606,120.995083,17\"\n token=\"pk.eyJ1IjoicG9kcGVyc29uIiwiYSI6ImNqc2JlbWU0bjA1ZmY0YW5ycHZod3VhbWcifQ.arvqfpOqMgFYkKgQ35UScA\"\n map-style=\"mapbox://styles/mapbox/streets-v12\"\n></xin-map>\n<select>\n <option selected value=\"mapbox://styles/mapbox/streets-v12\">Streets</option>\n <option value=\"mapbox://styles/mapbox/satellite-v9\">Satellite</option>\n <option value=\"mapbox://styles/mapbox/light-v11\">Light</option>\n <option value=\"mapbox://styles/mapbox/dark-v11\">Dark</option>\n <option value=\"mapbox://styles/mapbox/outdoors-v12\">Outdoors</option>\n</select>\n<button>\n <xin-icon icon=\"mapPin\"></xin-icon>\n <span>Your Location</span>\n</button>\n```\n```css\n.preview button {\n position: absolute;\n right: 10px;\n top: 10px;\n display: flex;\n align-items: center;\n gap: 5px;\n}\n\n.preview select {\n position: absolute;\n bottom: 10px;\n right: 10px;\n}\n```\n\nThere's no need to learn new APIs or write wrappers, just access the element's `map` property\nand [use the standard mapbox APIs directly](https://docs.mapbox.com/api/maps/styles/).\n*/\n\nimport { Component as WebComponent, ElementCreator, elements } from 'tosijs'\nimport { styleSheet, scriptTag } from './via-tag'\n\nconst { div } = elements\n\nexport class MapBox extends WebComponent {\n coords = '65.01715565258993,25.48081004203459,12'\n content = div({ style: { width: '100%', height: '100%' } })\n get map(): any {\n return this._map\n }\n mapStyle = 'mapbox://styles/mapbox/streets-v12'\n token = ''\n\n static mapboxCSSAvailable: Promise<void>\n static mapboxAvailable?: Promise<any>\n\n private _map: any\n\n static styleSpec = {\n ':host': {\n display: 'inline-block',\n position: 'relative',\n width: '400px',\n height: '400px',\n textAlign: 'left',\n },\n }\n\n constructor() {\n super()\n this.initAttributes('coords', 'token', 'mapStyle')\n\n if (MapBox.mapboxCSSAvailable === undefined) {\n MapBox.mapboxCSSAvailable = styleSheet(\n 'https://api.mapbox.com/mapbox-gl-js/v1.4.1/mapbox-gl.css'\n ).catch((e) => {\n console.error('failed to load mapbox-gl.css', e)\n })\n MapBox.mapboxAvailable = scriptTag(\n 'https://api.mapbox.com/mapbox-gl-js/v1.4.1/mapbox-gl.js'\n ).catch((e) => {\n console.error('failed to load mapbox-gl.js', e)\n })\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n if (!this.token) {\n console.error(\n 'mapbox requires an access token which you can provide via the token attribute'\n )\n }\n }\n\n render(): void {\n super.render()\n\n if (!this.token) {\n return\n }\n\n const { div } = this.parts\n\n const [long, lat, zoom] = this.coords.split(',').map((x) => Number(x))\n\n if (this.map) {\n this.map.remove()\n }\n\n MapBox.mapboxAvailable!.then(({ mapboxgl }: { mapboxgl: any }) => {\n console.log(\n \"%cmapbox may complain about missing css -- don't panic!\",\n 'background: orange; color: black; padding: 0 5px;'\n )\n mapboxgl.accessToken = this.token\n this._map = new mapboxgl.Map({\n container: div,\n style: this.mapStyle,\n zoom,\n center: [lat, long],\n })\n\n this._map.on('render', () => this._map.resize())\n })\n }\n}\n\nexport const mapBox = MapBox.elementCreator({\n tag: 'xin-map',\n}) as ElementCreator<MapBox>\n",
32
- "import { Component, ElementCreator, xin } from 'tosijs'\nimport { marked, MarkedOptions } from 'marked'\n\n/*#\n# markdown\n\n`<xin-md>` renders markdown using [marked](https://www.npmjs.com/package/marked).\n\n`<xin-md>` renders [markdown](https://www.markdownguide.org/) anywhere, either using the\n`src` attribute to load the file asynchronously, or rendering the text inside it.\n\n```html\n<xin-md>\n## hello\nworld\n</xin-md>\n```\n```css\nxin-md {\n display: block;\n padding: var(--spacing);\n}\n```\n\nNote that, by default, `<xin-md>` will use its `textContent` (not its `innerHTML`) as its source.\n\n## rendering markdown from a url\n\nAgain, like an `<img>` tag, you can simply set a `<xin-md>`'s `src` attribute to a URL pointing\nto markdown source and it will load it asynchronously and render it.\n\n```\n<xin-md src=\"/path/to/file.md\">\n```\n\n## setting its `value`\n\nOr, just set the element's `value` and it will render it for you. You can try\nthis in the console, e.g.\n\n```\n$('.preview xin-md').value = 'testing\\n\\n## this is a test'\n```\n\n## elements\n\n`<xin-md>` also (optionally) allows the embedding of inline HTML elements without blocking markdown\nrendering, so that you can embed specific elements while retaining markdown. You need to explicitly set\nthe `elements` property, and for markdown rendering not to be blocked, the html elements need to\nstart on a new line and not be indented. E.g.\n\n```html\n<xin-md elements>\n<form>\n### this is a form\n<label>\nfill in this field.\n**It's important!**\n<input>\n</label>\n</form>\n</xin-md>\n```\n\nIn this case `<xin-md>` uses its `innerHTML` and not its `textContent`.\n\n## context and template variables\n\n`<xin-md>` also supports **template** values. You need to provide data to the element in the form\nof `context` (an arbitrary object, or a JSON string), and then embed the template text using\nhandlebars-style doubled curly braces, e.g. `{{path.to.value}}`.\n\nIf no value is found, the original text is passed through.\n\nFinally, note that template substitution occurs *before* markdown transformation, which means you can\npass context data through to HTML elements.\n\n```html\n<xin-md\n elements\n context='{\"title\": \"template example\", \"foo\": {\"bar\": 17}, \"nested\": \"*work*: {{foo.bar}}\"}'\n>\n## {{title}}\n\nThe magic number is <input type=\"number\" value={{foo.bar}}>\n\nOh, and nested templates {{nested}}.\n</xin-md>\n```\n*/\n\nfunction populate(basePath: string, source?: any): string {\n if (source == null) {\n source = ''\n } else if (typeof source !== 'string') {\n source = String(source)\n }\n return source.replace(\n /\\{\\{([^}]+)\\}\\}/g,\n (original: string, prop: string) => {\n const value = (xin as any)[\n `${basePath}${prop.startsWith('[') ? prop : '.' + prop}`\n ]\n return value === undefined ? original : populate(basePath, String(value))\n }\n )\n}\n\nexport class MarkdownViewer extends Component {\n src = ''\n value = ''\n content = null\n elements = false\n context: { [key: string]: any } = {}\n options = {} as MarkedOptions \n\n constructor() {\n super()\n this.initAttributes('src', 'elements', 'context')\n }\n connectedCallback(): void {\n super.connectedCallback()\n if (this.src !== '') {\n ;(async () => {\n const request = await fetch(this.src)\n this.value = await request.text()\n })()\n } else if (this.value === '') {\n if (this.elements) {\n this.value = this.innerHTML\n } else {\n this.value = this.textContent != null ? this.textContent : ''\n }\n }\n }\n didRender: (() => void) | (() => Promise<void>) = (): void => {\n /* do not care */\n }\n render() {\n super.render()\n\n xin[this.instanceId] =\n typeof this.context === 'string' ? JSON.parse(this.context) : this.context\n\n const source = populate(this.instanceId, this.value)\n if (this.elements) {\n const chunks = source\n .split('\\n')\n .reduce((chunks: string[], line: string) => {\n if (line.startsWith('<') || chunks.length === 0) {\n chunks.push(line)\n } else {\n const lastChunk = chunks[chunks.length - 1]\n if (!lastChunk.startsWith('<') || !lastChunk.endsWith('>')) {\n chunks[chunks.length - 1] += '\\n' + line\n } else {\n chunks.push(line)\n }\n }\n return chunks\n }, [] as string[])\n this.innerHTML = chunks\n .map((chunk) =>\n chunk.startsWith('<') && chunk.endsWith('>')\n ? chunk\n : marked(chunk, this.options)\n )\n .join('')\n } else {\n this.innerHTML = marked(source, this.options) as string\n }\n this.didRender()\n }\n}\n\nexport const markdownViewer = MarkdownViewer.elementCreator({\n tag: 'xin-md',\n}) as ElementCreator<MarkdownViewer>\n",
32
+ "import { Component, ElementCreator, xin } from 'tosijs'\nimport { marked, MarkedOptions } from 'marked'\n\n/*#\n# markdown\n\n`<xin-md>` renders markdown using [marked](https://www.npmjs.com/package/marked).\n\n`<xin-md>` renders [markdown](https://www.markdownguide.org/) anywhere, either using the\n`src` attribute to load the file asynchronously, or rendering the text inside it.\n\n```html\n<xin-md>\n## hello\nworld\n\n![favicon](/favicon.svg)\n\n| this | is | a | table |\n|-------|------|-------|-------|\n| one | two | three | four |\n| five | six | seven | eight |\n</xin-md>\n```\n```css\nxin-md {\n display: block;\n padding: var(--spacing);\n}\n```\n\nNote that, by default, `<xin-md>` will use its `textContent` (not its `innerHTML`) as its source.\n\n## rendering markdown from a url\n\nAgain, like an `<img>` tag, you can simply set a `<xin-md>`'s `src` attribute to a URL pointing\nto markdown source and it will load it asynchronously and render it.\n\n```\n<xin-md src=\"/path/to/file.md\">\n```\n\n## setting its `value`\n\nOr, just set the element's `value` and it will render it for you. You can try\nthis in the console, e.g.\n\n```\n$('.preview xin-md').value = 'testing\\n\\n## this is a test'\n```\n\n## elements\n\n`<xin-md>` also (optionally) allows the embedding of inline HTML elements without blocking markdown\nrendering, so that you can embed specific elements while retaining markdown. You need to explicitly set\nthe `elements` property, and for markdown rendering not to be blocked, the html elements need to\nstart on a new line and not be indented. E.g.\n\n```html\n<xin-md elements>\n<form>\n### this is a form\n<label>\nfill in this field.\n**It's important!**\n<input>\n</label>\n</form>\n</xin-md>\n```\n\nIn this case `<xin-md>` uses its `innerHTML` and not its `textContent`.\n\n## context and template variables\n\n`<xin-md>` also supports **template** values. You need to provide data to the element in the form\nof `context` (an arbitrary object, or a JSON string), and then embed the template text using\nhandlebars-style doubled curly braces, e.g. `{{path.to.value}}`.\n\nIf no value is found, the original text is passed through.\n\nFinally, note that template substitution occurs *before* markdown transformation, which means you can\npass context data through to HTML elements.\n\n```html\n<xin-md\n elements\n context='{\"title\": \"template example\", \"foo\": {\"bar\": 17}, \"nested\": \"*work*: {{foo.bar}}\"}'\n>\n## {{title}}\n\nThe magic number is <input type=\"number\" value={{foo.bar}}>\n\nOh, and nested templates {{nested}}.\n</xin-md>\n```\n*/\n\nfunction populate(basePath: string, source?: any): string {\n if (source == null) {\n source = ''\n } else if (typeof source !== 'string') {\n source = String(source)\n }\n return source.replace(\n /\\{\\{([^}]+)\\}\\}/g,\n (original: string, prop: string) => {\n const value = (xin as any)[\n `${basePath}${prop.startsWith('[') ? prop : '.' + prop}`\n ]\n return value === undefined ? original : populate(basePath, String(value))\n }\n )\n}\n\nexport class MarkdownViewer extends Component {\n src = ''\n value = ''\n content = null\n elements = false\n context: { [key: string]: any } = {}\n options = {} as MarkedOptions\n\n constructor() {\n super()\n this.initAttributes('src', 'elements', 'context')\n }\n connectedCallback(): void {\n super.connectedCallback()\n if (this.src !== '') {\n ;(async () => {\n const request = await fetch(this.src)\n this.value = await request.text()\n })()\n } else if (this.value === '') {\n if (this.elements) {\n this.value = this.innerHTML\n } else {\n this.value = this.textContent != null ? this.textContent : ''\n }\n }\n }\n didRender: (() => void) | (() => Promise<void>) = (): void => {\n /* do not care */\n }\n render() {\n super.render()\n\n xin[this.instanceId] =\n typeof this.context === 'string' ? JSON.parse(this.context) : this.context\n\n const source = populate(this.instanceId, this.value)\n if (this.elements) {\n const chunks = source\n .split('\\n')\n .reduce((chunks: string[], line: string) => {\n if (line.startsWith('<') || chunks.length === 0) {\n chunks.push(line)\n } else {\n const lastChunk = chunks[chunks.length - 1]\n if (!lastChunk.startsWith('<') || !lastChunk.endsWith('>')) {\n chunks[chunks.length - 1] += '\\n' + line\n } else {\n chunks.push(line)\n }\n }\n return chunks\n }, [] as string[])\n this.innerHTML = chunks\n .map((chunk) =>\n chunk.startsWith('<') && chunk.endsWith('>')\n ? chunk\n : marked(chunk, this.options)\n )\n .join('')\n } else {\n this.innerHTML = marked(source, this.options) as string\n }\n this.didRender()\n }\n}\n\nexport const markdownViewer = MarkdownViewer.elementCreator({\n tag: 'xin-md',\n}) as ElementCreator<MarkdownViewer>\n",
33
33
  "/*#\n# month\n\nThis is a component for displaying a month and selecting days within that month.\n\nIf the user changes the `month` or `year` the component's `monthChanged(year, month)`\nmethod will be called.\n\nThe current date is `[part=\"today\"]` and can easily be targeted for styling.\n\n```js\nimport { tosiMonth, postNotification } from 'tosijs-ui'\n\npreview.append(tosiMonth({\n monthChanged(year, month) {\n postNotification({\n icon: 'calendar',\n message: `Month changed to ${year}-${month}`,\n color: 'hotpink',\n duration: 2,\n })\n }\n}))\n```\n```css\n.preview tosi-month {\n margin: 10px;\n border-radius: 5px;\n box-shadow: 0 0 0 2px hotpink;\n}\n```\n\n## `selectable`\n\nSetting `selectable` allows the user to pick individual dates. It's just a friendlier date picker.\n\nThe value of the component is an ISO date string, as per `<input type=\"date\">`.\n\n`week-start` defaults to `0` (Sunday). You can set it to `1` (Monday) or some other value\nif you want.\n\n> There is a proposed API to obtain the first day of the week for the user's locale from\n> [Intl.Locale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo)\n> but it is not yet widely supported.\n\n```html\n<tosi-month week-start=1 selectable></tosi-month>\n```\n```js\nconst month = preview.querySelector('tosi-month')\nmonth.addEventListener('change', event => console.log('date picked', event.target.value))\n```\n\n## `range`\n\nSetting `range` allows the user to select date ranges.\n\n```html\n<tosi-month range></tosi-month>\n```\n```js\nconst month = preview.querySelector('tosi-month')\nmonth.addEventListener('change', event => console.log('date range', event.target.value))\n```\n\n## `multiple`\n\nThis allows the user to pick multiple individual dates\n\n```html\n<tosi-month multiple></tosi-month>\n```\n```js\nconst month = preview.querySelector('tosi-month')\nmonth.addEventListener('change', event => console.log('multple dates', event.target.value))\n```\n\n## `readonly` and `disabled`\n\nThese prevent the user from changing the displayed month. This example is `readonly`.\n\n```html\n<tosi-month readonly value=\"1976-04-01\"></tosi-month>\n```\n\n*/\n\nimport { Component, PartsMap, elements, varDefault } from 'tosijs'\nimport { xinSelect, XinSelect } from './select'\nimport { icons } from './icons'\nimport { popMenu, MenuItem } from './menu'\n\nconst { div, span, button } = elements\n\nconst DAY_MS = 24 * 3600 * 1000\nconst WEEK = [0, 1, 2, 3, 4, 5, 6]\nconst MONTHS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]\n\n// Note this is because Safari is super strict about leading zeros\nconst padLeft = (value: string | number, length = 2, padding = '0'): string =>\n String(value).padStart(length, padding)\nconst dateFromYMD = (year: number, month: number, date: number): Date =>\n new Date(`${year}-${padLeft(month)}-${padLeft(date)}`)\n\ninterface MonthParts extends PartsMap {\n jump: HTMLButtonElement\n month: XinSelect\n year: XinSelect\n previous: HTMLButtonElement\n next: HTMLButtonElement\n}\n\nexport class TosiMonth extends Component<MonthParts> {\n month = NaN\n year = NaN\n minDate = dateFromYMD(new Date().getFullYear() - 100, 1, 1)\n .toISOString()\n .split('T')[0]\n maxDate = dateFromYMD(new Date().getFullYear() + 10, 12, 31)\n .toISOString()\n .split('T')[0]\n weekStart = 0 // Sunday, 1 = Monday\n selectable = false\n multiple = false\n range = false\n disabled = false\n readonly = false\n selectedDays = [] as string[]\n value = ''\n\n get endDay(): number {\n return 1 - this.weekStart\n }\n get months(): { caption: string; value: string }[] {\n return MONTHS.map((value) => ({\n caption: dateFromYMD(2025, value, 1).toString().split(' ')[1],\n value: String(value),\n }))\n }\n get years(): string[] {\n const startYear = Number(this.minDate.split('-')[0])\n const endYear = Number(this.maxDate.split('-')[0])\n const years = [] as string[]\n for (let year = startYear; year <= endYear; year++) {\n years.push(String(year))\n }\n return years\n }\n\n monthChanged = (year: number, month: number) => {}\n\n gotoMonth(year: number, month: number) {\n if (this.month !== month || this.year !== year) {\n this.month = month\n this.year = year\n this.monthChanged(year, month)\n }\n }\n\n setMonth = () => {\n this.gotoMonth(\n Number(this.parts.year.value),\n Number(this.parts.month.value)\n )\n }\n\n get to(): string {\n return this.selectedDays[1] || ''\n }\n\n set to(dateString: string) {\n this.selectedDays[1] = dateString\n this.selectedDays.splice(2)\n }\n\n get from(): string {\n return this.selectedDays[0] || ''\n }\n\n set from(dateString: string) {\n this.selectedDays[0] = dateString\n this.selectedDays.splice(2)\n }\n\n clickDate = (event: Event) => {\n const dateString = (event.target as HTMLElement).getAttribute(\n 'title'\n ) as string\n this.selectDate(dateString)\n }\n\n keyDate = (event: KeyboardEvent) => {\n let stopEvent = false\n switch (event.code) {\n case 'Space':\n const dateString = (event.target as HTMLElement).getAttribute(\n 'title'\n ) as string\n this.selectDate(dateString)\n stopEvent = true\n break\n case 'Tab':\n break\n default:\n console.log(event)\n }\n if (stopEvent) {\n event.preventDefault()\n event.stopPropagation()\n }\n }\n\n #focusDate = ''\n selectDate = (dateString: string) => {\n this.#focusDate = dateString\n if (this.range) {\n if (!this.to) {\n this.selectedDays = [dateString, dateString]\n } else if (this.from === dateString && this.to === dateString) {\n this.selectedDays = []\n } else if (this.from === dateString) {\n this.from = this.to\n } else if (this.to === dateString) {\n this.to = this.from\n } else if (dateString < this.from) {\n this.from = dateString\n } else if (dateString > this.to) {\n this.to = dateString\n } else if (dateString < this.from) {\n this.from = dateString\n } else {\n this.to = dateString\n }\n this.value = `${this.from},${this.to}`\n } else if (this.multiple) {\n if (this.selectedDays.includes(dateString)) {\n this.selectedDays.splice(this.selectedDays.indexOf(dateString), 1)\n } else {\n this.selectedDays.push(dateString)\n this.selectedDays.sort()\n }\n this.value = this.selectedDays.join(',')\n } else if (this.selectable) {\n if (this.selectedDays.includes(dateString)) {\n this.value = ''\n this.selectedDays = []\n } else {\n this.value = dateString\n this.selectedDays = [dateString]\n }\n }\n }\n\n nextMonth = () => {\n if (this.month < 12) {\n this.gotoMonth(this.year, this.month + 1)\n } else {\n this.gotoMonth(this.year + 1, 1)\n }\n }\n\n previousMonth = () => {\n if (this.month > 1) {\n this.gotoMonth(this.year, this.month - 1)\n } else {\n this.gotoMonth(this.year - 1, 12)\n }\n }\n\n checkDay = (dateString: string) => {\n if (!this.range) {\n return this.selectedDays.includes(dateString)\n } else if (this.range) {\n return this.from && dateString >= this.from && dateString <= this.to\n }\n return false\n }\n\n dateMenuItem = (dateString: string, caption = ''): MenuItem => {\n dateString = dateString.split('T')[0]\n return {\n caption: caption || dateString,\n enabled: () =>\n !dateString.startsWith(`${this.year}-${padLeft(this.month)}-`),\n action: () => {\n this.gotoDate(dateString)\n },\n }\n }\n\n jumpMenu = () => {\n popMenu({\n target: this.parts.jump,\n menuItems: [\n this.dateMenuItem(new Date().toISOString(), 'This Month'),\n ...(this.selectedDays.length === 0 ? [] : [null]),\n ...this.selectedDays.map((date) => this.dateMenuItem(date)),\n ],\n })\n }\n\n content = () => [\n div(\n { part: 'header' },\n button(\n {\n part: 'previous',\n onClick: this.previousMonth,\n },\n icons.chevronLeft()\n ),\n span({ style: { flex: '1' } }),\n button(\n {\n part: 'jump',\n onClick: this.jumpMenu,\n },\n icons.calendar()\n ),\n xinSelect({\n part: 'month',\n options: this.months,\n onChange: this.setMonth,\n }),\n xinSelect({\n part: 'year',\n options: [this.year],\n onChange: this.setMonth,\n }),\n span({ style: { flex: '1' } }),\n button(\n {\n part: 'next',\n onClick: this.nextMonth,\n },\n icons.chevronRight()\n )\n ),\n div({ part: 'week' }),\n div({ part: 'days' }),\n ]\n\n gotoDate(dateString: string) {\n const date = new Date(dateString)\n this.gotoMonth(date.getFullYear(), date.getMonth() + 1)\n }\n\n constructor() {\n super()\n this.initAttributes(\n 'month',\n 'year',\n 'weekStart',\n 'minDate',\n 'maxDate',\n 'selectable',\n 'multiple',\n 'range',\n 'disabled',\n 'readonly'\n )\n }\n\n connectedCallback() {\n super.connectedCallback()\n const date = new Date(this.value.split(',').pop() || Date.now())\n if (isNaN(this.month)) {\n this.month = date.getMonth() + 1\n }\n if (isNaN(this.year)) {\n this.year = date.getFullYear()\n }\n }\n days = [] as Array<{\n date: Date\n selected: boolean\n inRange: boolean\n inMonth: boolean\n isWeekend: boolean\n isToday: boolean\n }>\n render() {\n const { week, days, jump, month, year, previous, next } = this.parts\n this.selectedDays = this.value ? this.value.split(',') : []\n const firstOfMonth = dateFromYMD(this.year, this.month, 1)\n const weekStart = new Date(\n firstOfMonth.valueOf() -\n ((7 + firstOfMonth.getDay() - this.weekStart) % 7) * DAY_MS\n )\n const nextMonth = this.month === 12 ? 1 : this.month + 1\n const lastOfMonth = new Date(\n dateFromYMD(\n this.year + (this.month === 12 ? 1 : 0),\n nextMonth,\n 1\n ).valueOf() - DAY_MS\n )\n const endDay = new Date(\n lastOfMonth.valueOf() +\n ((this.weekStart * 2 + 5 + this.endDay - lastOfMonth.getDay()) % 7) *\n DAY_MS\n )\n\n const weekDays = WEEK.map(\n (day: number) =>\n new Date(weekStart.valueOf() + day * DAY_MS).toString().split(' ')[0]\n )\n this.days = []\n const today = new Date().toISOString().split('T')[0]\n for (\n let day = weekStart.valueOf();\n day <= endDay.valueOf();\n day += DAY_MS\n ) {\n const date = new Date(day)\n const dateString = date.toISOString().split('T')[0]\n this.days.push({\n date,\n selected: false,\n inMonth: date.getMonth() + 1 === this.month,\n isToday: dateString === today,\n isWeekend: date.getDay() % 6 === 0,\n inRange: !!(\n this.from &&\n dateString >= this.from &&\n dateString <= this.to\n ),\n })\n }\n\n month.value = String(this.month)\n year.value = String(this.year)\n const isDisabled =\n (month.disabled =\n year.disabled =\n jump.disabled =\n previous.disabled =\n next.disabled =\n this.disabled || this.readonly)\n const dateSelectDisabled =\n isDisabled || (!this.selectable && !this.range && !this.multiple)\n year.options = this.years\n week.textContent = ''\n week.append(...weekDays.map((day) => span({ class: 'day' }, day)))\n days.textContent = ''\n let focusElement: HTMLElement | null = null\n const { to, from } = this\n days.append(\n ...this.days.map((day) => {\n const classes = ['date']\n if (day.inMonth) {\n classes.push('in-month')\n }\n if (day.isToday) {\n classes.push('today')\n }\n const dateString = day.date.toISOString().split('T')[0]\n if (this.checkDay(dateString)) {\n classes.push('checked')\n }\n classes.push(day.isWeekend ? 'weekend' : 'weekday')\n if (this.range) {\n if (to === dateString) {\n classes.push('range-end')\n }\n if (from === dateString) {\n classes.push('range-start')\n }\n }\n const element = span(\n {\n class: classes.join(' '),\n title: dateString,\n onClick: this.clickDate,\n onKeydown: this.keyDate,\n tabindex: '0',\n },\n day.date.getDate()\n )\n if (dateString === this.#focusDate) {\n focusElement = element\n }\n return element\n })\n )\n // @ts-ignore-error tsc is too stupid to realize it gets assigned\n if (focusElement) focusElement.focus()\n }\n}\n\nexport const tosiMonth = TosiMonth.elementCreator({\n tag: 'tosi-month',\n styleSpec: {\n ':host': {\n display: 'block',\n },\n ':host [part=header]': {\n display: 'flex',\n alignItems: 'stretch',\n justifyContent: 'stretch',\n },\n ':host[disabled]': {\n pointerEvents: 'none',\n opacity: varDefault.disabledOpacity(0.6),\n },\n ':host [part=\"month\"], :host [part=\"year\"]': {\n _fieldWidth: '4em',\n flex: '1',\n },\n ':host [part=week], :host [part=days]': {\n display: 'grid',\n gridTemplateColumns: 'auto auto auto auto auto auto auto',\n justifyItems: 'stretch',\n },\n ':host .today': {\n background: varDefault.monthTodayBackground('transparent'),\n boxShadow: varDefault.monthTodayShadow(`none`),\n backdropFilter: varDefault.monthTodayBackdropFilter('brightness(0.9)'),\n fontWeight: varDefault.monthTodayFontWeight('800'),\n },\n ':host .day, :host .date': {\n padding: 5,\n display: 'flex',\n justifyContent: 'center',\n userSelect: 'none',\n },\n ':host .day': {\n color: varDefault.monthDayColor('hotpink'),\n background: varDefault.monthDayBackground('white'),\n fontWeight: varDefault.monthDayFontWeight('800'),\n },\n ':host .date': {\n cursor: 'default',\n },\n ':host .weekend': {\n background: varDefault.monthWeekendBackground('#eee'),\n },\n ':host .date:not(.in-month)': {\n opacity: 0.5,\n },\n ':host .date.checked': {\n color: varDefault.monthDateCheckedColor('white'),\n background: varDefault.monthDateCheckedBackground('hotpink'),\n },\n ':host:not([range]) .date.checked': {\n borderRadius: varDefault.monthDateCheckedBorderRadius('10px'),\n },\n ':host .range-start': {\n borderTopLeftRadius: varDefault.monthDateCheckedBorderRadius('10px'),\n borderBottomLeftRadius: varDefault.monthDateCheckedBorderRadius('10px'),\n },\n ':host .range-end': {\n borderTopRightRadius: varDefault.monthDateCheckedBorderRadius('10px'),\n borderBottomRightRadius: varDefault.monthDateCheckedBorderRadius('10px'),\n },\n },\n})\n",
34
34
  "/*#\n\n# notifications\n\n`XinNotification` provides a singleton custom `<xin-notification>` element that manages\na list of notifications.\n\nThe notifications are displayed most-recent first. If the notifications would take more than\nhalf the height of the display, they are scrolled.\n\nYou can post a notification simply with `XinNotification.post()` or `postNotification()`.\n\n```\ninterface NotificationSpec {\n message: string\n type?: 'success' | 'info' | 'log' | 'warn' | 'error' | 'progress' // default 'info'\n icon?: SVGElement | string // defaults to an info icon\n duration?: number\n progress?: () => number // return percentage completion\n close?: () => void\n color?: string // specify color\n}\n```\n\nIf you provide a `progress` callback (which is assumed to return a number from `0-100`, with\n100+ indicating completion) then `XinNotification` will poll it every second until the\ntask completes or the notification is closed. Returning 100 or more will automatically close\nthe notification.\n\nIf you configure a notification's `type = \"progress\"` but don't provide a `progress` callback\nthen an indefinite `<progress>` element will be displayed.\n\nIf you provide a `close` callback, it will be fired if the user closes the notification.\n\n`postNotification` returns a callback function that closes the note programmatically (e.g.\nwhen an operation completes). This will *also* call any `close` callback function you\nprovided. (The progress demos in the example exercise this functionality.)\n\n```js\nimport { postNotification, icons } from 'tosijs-ui'\n\nconst form = preview.querySelector('xin-form')\nconst submit = preview.querySelector('.submit')\nconst closeButton = preview.querySelector('.close')\n\nlet close\n\nform.submitCallback = (value, isValid) => {\n if (!isValid) return\n if (value.type.startsWith('progress')) {\n startTime = Date.now()\n const { message, duration, icon } = value\n close = postNotification({\n message,\n type: 'progress',\n icon,\n progress: value.type === 'progress' ? () => (Date.now() - startTime) / (10 * duration) : undefined,\n close: () => { postNotification(`${value.message} cancelled`) },\n })\n } else {\n close = postNotification(value)\n }\n console.log(close)\n closeButton.disabled = false\n}\n\nsubmit.addEventListener('click', form.submit)\ncloseButton.addEventListener('click', () => {\n if (close) {\n close()\n }\n})\n\npostNotification({\n message: 'Welcome to tosijs-ui notifications, this message will disappear in 2s',\n duration: 2\n})\n```\n```html\n<xin-form>\n <h3 slot=\"header\">Notification Test</h3>\n <xin-field caption=\"Message\" key=\"message\" type=\"string\" value=\"This is a test…\"></xin-field>\n <xin-field caption=\"Type\" key=\"type\" value=\"info\">\n <xin-select slot=\"input\"\n options=\"error,warn,info,success,log,,progress,progress (indefinite)\"\n ></xin-select>\n </xin-field>\n <xin-field caption=\"Icon\" key=\"icon\" value=\"info\">\n <xin-select slot=\"input\"\n options=\"info,bug,thumbsUp,thumbsDown,message\"\n ></xin-select>\n </xin-field>\n <xin-field caption=\"Duration\" key=\"duration\" type=\"number\" value=\"2\"></xin-field>\n <button slot=\"footer\" class=\"close\" disabled>Close Last Notification</button>\n <span slot=\"footer\" class=\"elastic\"></span>\n <button slot=\"footer\" class=\"submit\">Post Notification</button>\n</xin-form>\n```\n```css\nxin-form {\n height: 100%;\n}\n\nxin-form::part(content) {\n display: flex;\n flex-direction: column;\n padding: 10px;\n gap: 10px;\n background: var(--background);\n}\n\nxin-form::part(header),\nxin-form::part(footer) {\n background: #eee;\n justify-content: center;\n padding: 10px;\n}\n\nxin-form h3 {\n margin: 0;\n}\n\nxin-form label {\n display: grid;\n grid-template-columns: 120px 1fr;\n}\n```\n\n## `postNotification(spec: NotificationSpec | string)`\n\nThis is simply a wrapper for `XinNotification.post()`.\n*/\n\nimport { Component, elements, vars, ElementCreator } from 'tosijs'\nimport { icons } from './icons'\nimport { findHighestZ } from './track-drag'\nconst { div, button } = elements\n\ninterface NotificationSpec {\n message: string\n type?: 'success' | 'info' | 'log' | 'warn' | 'error' | 'progress' // default 'info'\n icon?: SVGElement | string\n duration?: number\n progress?: () => number\n close?: () => void\n color?: string\n}\n\nconst COLOR_MAP = {\n error: 'red',\n warn: 'orange',\n info: 'royalblue',\n log: 'gray',\n success: 'green',\n progress: 'royalblue',\n}\n\ntype callback = () => void\n\nexport class XinNotification extends Component {\n private static singleton?: XinNotification\n\n static styleSpec = {\n ':host': {\n _notificationSpacing: 8,\n _notificationWidth: 360,\n _notificationPadding: `${vars.notificationSpacing} ${vars.notificationSpacing50} ${vars.notificationSpacing} ${vars.notificationSpacing200}`,\n _notificationBg: '#fafafa',\n _notificationAccentColor: '#aaa',\n _notificationTextColor: '#444',\n _notificationIconSize: vars.notificationSpacing300,\n _notificationButtonSize: 48,\n _notificationBorderWidth: '3px 0 0',\n _notificationBorderRadius: vars.notificationSpacing50,\n position: 'fixed',\n left: 0,\n right: 0,\n bottom: 0,\n paddingBottom: vars.notificationSpacing,\n width: vars.notificationWidth,\n display: 'flex',\n flexDirection: 'column-reverse',\n margin: '0 auto',\n gap: vars.notificationSpacing,\n maxHeight: '50vh',\n overflow: 'hidden auto',\n boxShadow: 'none !important',\n },\n ':host *': {\n color: vars.notificationTextColor,\n },\n ':host .note': {\n display: 'grid',\n background: vars.notificationBg,\n padding: vars.notificationPadding,\n gridTemplateColumns: `${vars.notificationIconSize} 1fr ${vars.notificationButtonSize}`,\n gap: vars.notificationSpacing,\n alignItems: 'center',\n borderRadius: vars.notificationBorderRadius,\n boxShadow: `0 2px 8px #0006, inset 0 0 0 2px ${vars.notificationAccentColor}`,\n borderColor: vars.notificationAccentColor,\n borderWidth: vars.notificationBorderWidth,\n borderStyle: 'solid',\n transition: '0.5s ease-in',\n transitionProperty: 'margin, opacity',\n zIndex: 1,\n },\n ':host .note .icon': {\n stroke: vars.notificationAccentColor,\n },\n ':host .note button': {\n display: 'flex',\n lineHeight: vars.notificationButtonSize,\n padding: 0,\n margin: 0,\n height: vars.notificationButtonSize,\n width: vars.notificationButtonSize,\n background: 'transparent',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: 'none',\n border: 'none',\n position: 'relative',\n },\n ':host .note button:hover svg': {\n stroke: vars.notificationAccentColor,\n },\n ':host .note button:active svg': {\n borderRadius: 99,\n stroke: vars.notificationBg,\n background: vars.notificationAccentColor,\n padding: vars.spacing50,\n },\n ':host .note svg': {\n height: vars.notificationIconSize,\n width: vars.notificationIconSize,\n pointerEvents: 'none',\n },\n ':host .message': {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: vars.notificationSpacing,\n },\n ':host .note.closing': {\n opacity: 0,\n zIndex: 0,\n },\n }\n\n static removeNote(note: HTMLElement) {\n note.classList.add('closing')\n note.style.marginBottom = -note.offsetHeight + 'px'\n const remove = () => {\n note.remove()\n }\n note.addEventListener('transitionend', remove)\n setTimeout(remove, 1000)\n }\n\n static post(spec: NotificationSpec | string): callback {\n const { message, duration, type, close, progress, icon, color } =\n Object.assign(\n { type: 'info', duration: -1 },\n typeof spec === 'string' ? { message: spec } : spec\n )\n\n if (!this.singleton) {\n this.singleton = xinNotification()\n }\n\n const singleton = this.singleton as HTMLElement\n\n document.body.append(singleton)\n singleton.style.zIndex = String(findHighestZ() + 1)\n\n const _notificationAccentColor = color || COLOR_MAP[type]\n const progressBar =\n progress || type === 'progress' ? elements.progress() : {}\n const closeCallback = () => {\n if (close) {\n close()\n }\n XinNotification.removeNote(note)\n }\n const iconElement: SVGElement =\n icon instanceof SVGElement\n ? icon\n : icon\n ? icons[icon]({ class: 'icon' })\n : icons.info({ class: 'icon' })\n const note = div(\n {\n class: `note ${type}`,\n style: {\n _notificationAccentColor,\n },\n },\n iconElement,\n div({ class: 'message' }, div(message), progressBar),\n button(\n {\n class: 'close',\n title: 'close',\n // we can't use onClick because this lives inside a shadowDOM\n apply(elt) {\n elt.addEventListener('click', closeCallback)\n },\n },\n icons.x()\n )\n )\n\n singleton.shadowRoot!.append(note)\n\n if (\n progressBar instanceof HTMLProgressElement &&\n progress instanceof Function\n ) {\n progressBar.setAttribute('max', String(100))\n progressBar.value = progress()\n const interval = setInterval(() => {\n if (!singleton.shadowRoot!.contains(note)) {\n clearInterval(interval)\n return\n }\n const percentage = progress()\n progressBar.value = percentage\n if (percentage >= 100) {\n XinNotification.removeNote(note)\n }\n }, 1000)\n }\n\n if (duration > 0) {\n setTimeout(() => {\n XinNotification.removeNote(note)\n }, duration * 1000)\n }\n\n note.scrollIntoView()\n\n return closeCallback\n }\n\n content = null\n}\n\nexport const xinNotification = XinNotification.elementCreator({\n tag: 'xin-notification',\n}) as ElementCreator<XinNotification>\n\nexport function postNotification(spec: NotificationSpec | string): callback {\n return XinNotification.post(spec)\n}\n",
35
35
  "/*#\n# password strength\n\nJust wrap it a `<xin-password-strength>` element around an `<input>`\nand it will gauge its content strength as a password. It will also\nlet you **securely verify** that the password hasn't been breached.\n\n```js\nimport { xinLocalized, localize } from 'tosijs-ui'\n\nconst toggle = preview.querySelector('.toggle')\nconst icon = preview.querySelector('xin-icon')\nconst input = preview.querySelector('input')\nconst breach = preview.querySelector('.breach')\nconst output = preview.querySelector('.output')\nconst passwordStrength = preview.querySelector('xin-password-strength')\n\n// Localization Example\npasswordStrength.append(xinLocalized({\n refString: 'Yes',\n localeChanged () {\n this.parentElement.strengthDescriptions = [\n 'unacceptable',\n 'very weak',\n 'weak',\n 'moderate',\n 'strong',\n 'very strong',\n ].map(localize)\n this.parentElement.queueRender()\n }\n}))\n\ntoggle.addEventListener('click', () => {\n if (icon.icon === 'eye') {\n input.type = 'text'\n icon.icon = 'eyeOff'\n } else {\n input.type = 'password'\n icon.icon = 'eye'\n }\n})\n\nbreach.addEventListener('click', async () => {\n preview.querySelector('xin-password-strength').isBreached().then(isBreached => {\n output.textContent =\n isBreached\n ? 'This password has been breached, look at console for details'\n : 'Seems OK'\n output.classList.toggle('breached', isBreached)\n })\n})\n```\n```html\n<xin-password-strength>\n <input class=\"password\" type=\"password\">\n <button class=\"toggle\">\n <xin-icon icon=\"eye\"></xin-icon>\n </button>\n</xin-password-strength>\n\n<br><br>\n<button class=\"breach\">\n <xin-localized>Check if breached</xin-localized>\n</button>\n<div class=\"output\"></div>\n```\n```css\ninput.password {\n box-shadow: inset 0 0 0 2px var(--indicator-color);\n}\n\n.breached {\n color: white;\n background: red;\n}\n```\n\n## Algorithm\n\nThe password is assessed to have a strength based on:\n\n- **length** one point for at least `goodLength` characters long.\n- **[a-z]** one point for containing a lowercase letter\n- **[A-Z]** one point for containing an uppercase letter\n- **[0-9]** one point for containing a numeric character\n- **^[a-zA-Z0-9]]** one point for containing some other kind of character\n\nA password smaller than `minLength` is an automatic `0`.\n\n## Attributes\n\n- `minLength` defaults to `8`\n- `goodLength` defaults to `12`\n- `indicatorColors` six HTML colors, separated by commas, defaults to `'#f00,#f40,#f80,#ef0,#8f0,#0d4'`\n- `descriptionColors` six HTML colors, sepeated by commans, defaults to `'#000,#000,#000,#000,#000,#fff'`\n\n## Properties\n\n- `value`, `strength` is a number from 0 to 5\n- `issues` is a structure which you can use to generate feedback\n\n```\n<xin-password-strength>.issues = {\n tooShort: boolean,\n short: boolean,\n noUpper: boolean,\n noLower: boolean,\n noNumber: boolean,\n noSpecial: boolean,\n}\n```\n\n## Customizing / Localizing Strings\n\nThe following properties control the feedback generated.\n\n```\nissueDescriptions = {\n tooShort: 'too short',\n short: 'short',\n noUpper: 'no upper case',\n noLower: 'no lower case',\n noNumber: 'no digits',\n noSpecial: 'no unusual characters',\n}\n```\n\n```\nstrengthDescriptions = [\n 'unacceptable',\n 'very weak',\n 'weak',\n 'moderate',\n 'strong',\n 'very strong',\n]\n```\n\n## `isBreached()`\n\n`<xin-password-meter>` also provides an `isBreached(): Promise<boolean>` method\nwhich uses [weakpass.com's API](https://weakpass.com/) to tell you if the password has been\nbreached.\n\n> Note that `isBreached` does not send the plain-text password anywhere. It uses **SHA-1**\nto hash the password and then sends that for lookup.\n\n## Utility Functions\n\nTwo functions used internally for querying [Weakpass,com](https://weakpass.com/) are\nprovided in case they're useful on their own.\n\n`isBreached(password: striing): Promise<boolean>` will return `true` if the password is\nfound in Weakpass's database (and spit out extra info to the console).\n\n`digest(s: string, method=\"sha-1\"): Promise<string>` is just a nice wrapper for `crypto.digest`.\n*/\n\nimport { Component, elements, vars, varDefault } from 'tosijs'\n\nexport const digest = async (s: string, method = 'SHA-1'): Promise<string> => {\n // Convert password to an ArrayBuffer\n const encoder = new TextEncoder()\n const data = encoder.encode(s)\n\n // Hash the password using SHA-1\n const hashBuffer = await crypto.subtle.digest(method, data)\n\n // Convert the hash to a hexadecimal string\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n\n return hashHex\n}\n\nexport const isBreached = async (password: string): Promise<boolean> => {\n const hashHex = await digest(password)\n\n const response = await fetch(`https://weakpass.com/api/v1/search/${hashHex}`)\n if (response.ok) {\n const result = await response.json()\n console.log('password found in weakpass database', result)\n }\n\n return response.status !== 404\n}\n\nconst { span, xinSlot } = elements\nexport class XinPasswordStrength extends Component {\n minLength = 8\n goodLength = 12\n indicatorColors = '#f00,#f40,#f80,#ef0,#8f0,#0a2'\n descriptionColors = '#000,#000,#000,#000,#000,#fff'\n issues = {\n tooShort: true,\n short: true,\n noUpper: true,\n noLower: true,\n noNumber: true,\n noSpecial: true,\n }\n issueDescriptions = {\n tooShort: 'too short',\n short: 'short',\n noUpper: 'no upper case',\n noLower: 'no lower case',\n noNumber: 'no digits',\n noSpecial: 'no unusual characters',\n }\n value = 0\n strengthDescriptions = [\n 'unacceptable',\n 'very weak',\n 'weak',\n 'moderate',\n 'strong',\n 'very strong',\n ]\n\n constructor() {\n super()\n\n this.initAttributes('minLength', 'goodLength', 'indicatorColors')\n }\n\n strength(password: string): number {\n this.issues = {\n tooShort: password.length < this.minLength,\n short: password.length < this.goodLength,\n noUpper: !password.match(/[A-Z]/),\n noLower: !password.match(/[a-z]/),\n noNumber: !password.match(/[0-9]/),\n noSpecial: !password.match(/[^a-zA-Z0-9]/),\n }\n\n return this.issues.tooShort\n ? 0\n : Object.values(this.issues).filter((v) => !v).length - 1\n }\n\n async isBreached(): Promise<boolean> {\n const password = this.querySelector('input')?.value\n\n if (!password || typeof password !== 'string') {\n return true\n }\n\n return await isBreached(password)\n }\n\n updateIndicator = (password: string) => {\n const { level, description } = this.parts as {\n level: HTMLSpanElement\n description: HTMLSpanElement\n }\n const colors = this.indicatorColors.split(',')\n const descriptionColors = this.descriptionColors.split(',')\n const strength = this.strength(password)\n if (this.value !== strength) {\n this.value = strength\n this.dispatchEvent(new Event('change'))\n }\n level.style.width = `${(strength + 1) * 16.67}%`\n this.style.setProperty('--indicator-color', colors[strength])\n this.style.setProperty('--description-color', descriptionColors[strength])\n description.textContent = this.strengthDescriptions[strength]\n }\n\n update = (event: Event) => {\n const input = (event.target as HTMLElement).closest('input')\n\n this.updateIndicator(input?.value || '')\n }\n\n content = () => [\n xinSlot({ onInput: this.update }),\n span(\n { part: 'meter' },\n span({ part: 'level' }),\n span({ part: 'description' })\n ),\n ]\n\n render() {\n super.render()\n\n const input = this.querySelector('input') as HTMLInputElement\n this.updateIndicator(input?.value)\n }\n}\n\nexport const xinPasswordStrength = XinPasswordStrength.elementCreator({\n tag: 'xin-password-strength',\n styleSpec: {\n ':host': {\n display: 'inline-flex',\n flexDirection: 'column',\n gap: vars.spacing50,\n position: 'relative',\n },\n ':host xin-slot': {\n display: 'flex',\n },\n ':host [part=\"meter\"]': {\n display: 'block',\n position: 'relative',\n height: varDefault.meterHeight('24px'),\n background: varDefault.indicatorBg('white'),\n borderRadius: varDefault.meterRadius('4px'),\n boxShadow: varDefault.meterShadow(\n `inset 0 0 0 2px ${vars.indicatorColor}`\n ),\n },\n ':host [part=\"level\"]': {\n height: varDefault.levelHeight('20px'),\n content: '\" \"',\n display: 'inline-block',\n width: 0,\n transition: '0.15s ease-out',\n background: vars.indicatorColor,\n margin: varDefault.levelMargin('2px'),\n borderRadius: varDefault.levelRadius('2px'),\n },\n ':host [part=\"description\"]': {\n position: 'absolute',\n inset: '0',\n color: vars.descriptionColor,\n height: varDefault.meterHeight('24px'),\n lineHeight: varDefault.meterHeight('24px'),\n textAlign: 'center',\n },\n },\n})\n",
@@ -40,10 +40,10 @@
40
40
  "import { Component as WebComponent, ElementCreator, elements } from 'tosijs'\n\nconst { slot } = elements\n\n/*#\n# size-break\n\nWhile we wait for enough browsers to implement [container-queries](https://www.w3.org/TR/css-contain-3/),\nand in any event when you simply want to do different things at different sizes (e.g. in the project I'm\nworking on right now, a row of buttons turns into a menu at narrow widths) there's `<xin-sizebreak>`.\n\nNote that the sizes referred to are of the `<xin-sizebreak>`'s `.offsetParent`, and it watches for\nthe window's `resize` events and its own (via `ResizeObserver`).\n\n```html\n<div class=\"container\">\n <xin-sizebreak min-width=\"300\" min-height=\"150\">\n <h1>BIG!</h1>\n <i slot=\"small\">little</i>\n </xin-sizebreak>\n <xin-sizer></xin-sizer>\n</div>\n```\n```css\n.preview {\n touch-action: none;\n}\n\n.preview xin-sizebreak {\n width: 100%;\n height: 100%;\n background: #fff8;\n border: 1px solid #aaa;\n}\n\n.preview xin-sizebreak * {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translateX(-50%) translateY(-50%);\n}\n\n.preview .container {\n position: relative;\n min-width: 100px;\n min-height: 40px;\n max-height: 100%;\n width: 400px;\n height: 100px;\n}\n\n.preview .sizer {\n position: absolute;\n width: 24px;\n height: 24px;\n line-height: 24px;\n text-align: center;\n background: #0002;\n bottom: 0;\n right: 0;\n cursor: nwse-resize;\n opacity: 0.5;\n}\n\n.preview .sizer:hover {\n opacity: 1.0;\n}\n```\n\n`<xin-sizebreak>` supports both `min-width` and/or `min-height`, and you can of course target only one\nof the slots if you like. The demo site uses them to hide the [bundlejs](https://bundlejs.com/) badge when\nspace is tight.\n*/\n\nexport class SizeBreak extends WebComponent {\n minWidth = 0\n minHeight = 0\n value: 'normal' | 'small' = 'normal'\n\n content = [slot({ part: 'normal' }), slot({ part: 'small', name: 'small' })]\n\n static styleSpec = {\n ':host': {\n display: 'inline-block',\n position: 'relative',\n },\n }\n\n constructor() {\n super()\n this.initAttributes('minWidth', 'minHeight')\n }\n\n onResize = () => {\n const { normal, small } = this.parts as { [key: string]: HTMLElement }\n const parent = this.offsetParent as HTMLElement | null\n if (!(parent instanceof HTMLElement)) {\n return\n } else if (\n parent.offsetWidth < this.minWidth ||\n parent.offsetHeight < this.minHeight\n ) {\n normal.hidden = true\n small.hidden = false\n this.value = 'small'\n } else {\n normal.hidden = false\n small.hidden = true\n this.value = 'normal'\n }\n }\n\n // TODO trigger a resize event when an ancestor element\n // is inserted or moved into the DOM.\n connectedCallback(): void {\n super.connectedCallback()\n globalThis.addEventListener('resize', this.onResize)\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback()\n globalThis.removeEventListener('resize', this.onResize)\n }\n}\n\nexport const sizeBreak = SizeBreak.elementCreator({\n tag: 'xin-sizebreak',\n}) as ElementCreator<SizeBreak>\n",
41
41
  "/*#\n# sizer\n\nThis is a super-simple component that you can put in a fixed size element allowing it to be resized\nfrom the bottom-right.\n\n```html\n<div>\n <xin-sizer></xin-sizer>\n</div>\n```\n```css\n.preview div {\n position: absolute;\n top: 10px;\n left: 10px;\n width: 200px;\n height: 100px;\n background: #ff02;\n border: 1px solid #555;\n}\n```\n\n<xin-css-var-editor element-selector=\"xin-sizer\"></xin-css-var-editor>\n*/\n\nimport { Component as XinComponent, ElementCreator, vars } from 'tosijs'\nimport { icons } from './icons'\nimport { trackDrag } from './track-drag'\n\nexport class XinSizer extends XinComponent {\n target?: HTMLElement | null = null\n\n static styleSpec = {\n ':host': {\n _resizeIconFill: '#222',\n display: 'block',\n position: 'absolute',\n bottom: -7,\n right: -7,\n padding: 14,\n width: 44,\n height: 44,\n opacity: 0.25,\n transition: 'opacity 0.25s ease-out',\n },\n ':host(:hover)': {\n opacity: 0.5,\n },\n ':host svg': {\n width: 16,\n height: 16,\n stroke: vars.resizeIconFill,\n },\n }\n\n content = icons.resize()\n\n get minSize(): { width: number; height: number } {\n const { minWidth, minHeight } = getComputedStyle(this.target!)\n return {\n width: parseFloat(minWidth) || 32,\n height: parseFloat(minHeight) || 32,\n }\n }\n\n resizeTarget = (event: Event): void => {\n const { target } = this\n if (!target) return\n const w = target.offsetWidth\n const h = target.offsetHeight\n target.style.left = target.offsetLeft + 'px'\n target.style.top = target.offsetTop + 'px'\n target.style.bottom = ''\n target.style.right = ''\n const { minSize } = this\n\n trackDrag(\n event as PointerEvent,\n (dx: number, dy: number, event: any): true | undefined => {\n target.style.width = Math.max(minSize.width, w + dx) + 'px'\n target.style.height = Math.max(minSize.height, h + dy) + 'px'\n if (event.type === 'mouseup') {\n return true\n }\n },\n 'nwse-resize'\n )\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n if (!this.target) {\n this.target = this.parentElement\n }\n\n const PASSIVE = { passive: true }\n this.addEventListener('mousedown', this.resizeTarget, PASSIVE)\n this.addEventListener('touchstart', this.resizeTarget, PASSIVE)\n }\n}\n\nexport const xinSizer = XinSizer.elementCreator({\n tag: 'xin-sizer',\n}) as ElementCreator<XinSizer>\n",
42
42
  "/*#\n# tag-list\n\nBuilding a tag-list from standard HTML elements is a bit of a nightmare.\n\n`<xin-tag-list>` allows you to display an editable or read-only tag list (represented either\nas a comma-delimited string or an array of strings).\n\n```html\n<label style=\"position: absolute; right: 10px; top: 10px; display: block\">\n <input type=\"checkbox\" class=\"disable-toggle\">\n <b>Disable All</b>\n</label>\n<label>\n <b>Display Only</b>\n <xin-tag-list\n value=\"this,that,,the-other\"\n ></xin-tag-list>\n</label>\n<xin-tag-list\n class=\"compact\"\n value=\"this,that,,the-other\"\n></xin-tag-list>\n<br>\n<label>\n <b>Editable</b>\n <xin-tag-list\n class=\"editable-tag-list\"\n value=\"belongs,also belongs,custom\"\n editable\n available-tags=\"belongs,also belongs,not initially chosen\"\n ></xin-tag-list>\n</label>\n<br>\n<b>Text-Entry</b>\n<xin-tag-list\n value=\"this,that,the-other,not,enough,space\"\n editable\n text-entry\n available-tags=\"tomasina,dick,,harriet\"\n></xin-tag-list>\n```\n```css\n.preview .compact {\n --spacing: 8px;\n --font-size: 12px;\n --line-height: 18px;\n}\n.preview label {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n}\n```\n```js\npreview.addEventListener('change', (event) => {\n if (event.target.matches('xin-tag-list')) {\n console.log(event.target, event.target.value)\n }\n}, true)\npreview.querySelector('.disable-toggle').addEventListener('change', (event) => {\n const tagLists = Array.from(preview.querySelectorAll('xin-tag-list'))\n for(const tagList of tagLists) {\n tagList.disabled = event.target.checked\n }\n})\n```\n\n## Properties\n\n### `value`: string | string[]\n\nA list of tags\n\n### `tags`: string[]\n\n## `popSelectMenu`: () => void\n\nThis is the method called when the user clicks the menu button. By default is displays a\npick list of tags, but if you wish to customize the behavior, just replace this method.\n\nA read-only property giving the value as an array.\n\n### `available-tags`: string | string[]\n\nA list of tags that will be displayed in the popup menu by default. The popup menu\nwill always display custom tags (allowing their removal).\n\n### `editable`: boolean\n\nAllows the tag list to be modified via menu and removing tags.\n\n### `text-entry`: boolean\n\nIf `editable`, an input field is provided for entering tags directly.\n\n### `placeholder`: string = 'enter tags'\n\nPlaceholder shown on input field.\n*/\n\nimport {\n Component as WebComponent,\n elements,\n vars,\n varDefault,\n ElementCreator,\n} from 'tosijs'\nimport { popMenu, MenuItem } from './menu'\nimport { icons } from './icons'\n\nconst { div, input, span, button } = elements\n\nexport class XinTag extends WebComponent {\n caption = ''\n removeable = false\n\n removeCallback: (event: Event) => void = () => {\n this.remove()\n }\n\n content = () => [\n span({ part: 'caption' }, this.caption),\n button(icons.x(), {\n part: 'remove',\n hidden: !this.removeable,\n onClick: this.removeCallback,\n }),\n ]\n\n constructor() {\n super()\n\n this.initAttributes('caption', 'removeable')\n }\n}\n\nexport const xinTag = XinTag.elementCreator({\n tag: 'xin-tag',\n styleSpec: {\n ':host': {\n '--tag-close-button-color': '#000c',\n '--tag-close-button-bg': '#fffc',\n '--tag-button-opacity': '0.5',\n '--tag-button-hover-opacity': '0.75',\n '--tag-bg': varDefault.brandColor('blue'),\n '--tag-text-color': varDefault.brandTextColor('white'),\n display: 'inline-flex',\n borderRadius: varDefault.tagRoundedRadius(vars.spacing50),\n color: vars.tagTextColor,\n background: vars.tagBg,\n padding: `0 ${vars.spacing75} 0 ${vars.spacing75}`,\n height: `calc(${vars.lineHeight} + ${vars.spacing50})`,\n lineHeight: `calc(${vars.lineHeight} + ${vars.spacing50})`,\n },\n ':host > [part=\"caption\"]': {\n position: 'relative',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n flex: '1 1 auto',\n fontSize: varDefault.fontSize('16px'),\n color: vars.tagTextColor,\n textOverflow: 'ellipsis',\n },\n ':host [part=\"remove\"]': {\n boxShadow: 'none',\n margin: `0 ${vars.spacing_50} 0 ${vars.spacing25}`,\n padding: 0,\n display: 'inline-flex',\n alignItems: 'center',\n alignSelf: 'center',\n justifyContent: 'center',\n height: vars.spacing150,\n width: vars.spacing150,\n color: vars.tagCloseButtonColor,\n background: vars.tagCloseButtonBg,\n borderRadius: varDefault.tagCloseButtonRadius('99px'),\n opacity: vars.tagButtonOpacity,\n },\n ':host [part=\"remove\"]:hover': {\n background: vars.tagCloseButtonBg,\n opacity: vars.tagButtonHoverOpacity,\n },\n },\n}) as ElementCreator<XinTag>\n\ninterface Tag {\n value: string\n caption?: string\n color?: string\n background?: string\n icon?: string | HTMLElement\n}\n\ntype TagList = (string | Tag | null)[]\n\nexport class XinTagList extends WebComponent {\n disabled = false\n name = ''\n availableTags: string | TagList = []\n value: string | string[] = []\n textEntry = false\n editable = false\n placeholder = 'enter tags'\n\n get tags(): string[] {\n return typeof this.value === 'string'\n ? this.value\n .split(',')\n .map((tag) => tag.trim())\n .filter((tag) => tag !== '')\n : this.value\n }\n\n constructor() {\n super()\n\n this.initAttributes(\n 'name',\n 'value',\n 'textEntry',\n 'availableTags',\n 'editable',\n 'placeholder',\n 'disabled'\n )\n }\n\n addTag = (tag: string) => {\n if (tag.trim() === '') {\n return\n }\n const { tags } = this\n if (!tags.includes(tag)) {\n tags.push(tag)\n }\n this.value = tags\n this.queueRender(true)\n }\n\n toggleTag = (toggled: string) => {\n if (this.tags.includes(toggled)) {\n this.value = this.tags.filter((tag) => tag !== toggled)\n } else {\n this.addTag(toggled)\n }\n this.queueRender(true)\n }\n\n enterTag = (event: KeyboardEvent) => {\n const { tagInput } = this.parts as { tagInput: HTMLInputElement }\n switch (event.key) {\n case ',':\n {\n const tag = tagInput.value.split(',')[0]\n this.addTag(tag)\n }\n break\n case 'Enter':\n {\n const tag = tagInput.value.split(',')[0]\n this.addTag(tag)\n }\n event.stopPropagation()\n event.preventDefault()\n break\n default:\n // do nothing\n }\n }\n\n popSelectMenu = () => {\n const { toggleTag } = this\n const { tagMenu } = this.parts\n const tags: TagList =\n typeof this.availableTags === 'string'\n ? this.availableTags.split(',')\n : this.availableTags\n const extraTags = this.tags.filter((tag) => !tags.includes(tag))\n if (extraTags.length) {\n tags.push(null, ...extraTags)\n }\n const menuItems: MenuItem[] = tags.map((tag) => {\n if (tag === '' || tag === null) {\n return null\n } else if (typeof tag === 'object') {\n return {\n checked: () => this.tags.includes(tag.value),\n caption: tag.caption!,\n action() {\n toggleTag(tag.value)\n },\n }\n } else {\n return {\n checked: () => this.tags.includes(tag),\n caption: tag,\n action() {\n toggleTag(tag)\n },\n }\n }\n })\n\n popMenu({\n target: tagMenu as HTMLElement,\n width: 'auto',\n menuItems,\n })\n }\n\n content = () => [\n // this button is simply here to eat click events sent via a label\n button({ style: { visibility: 'hidden' }, tabindex: -1 }),\n div({\n part: 'tagContainer',\n class: 'row',\n }),\n input({\n part: 'tagInput',\n class: 'elastic',\n onKeydown: this.enterTag,\n }),\n button(\n {\n title: 'add tag',\n part: 'tagMenu',\n onClick: this.popSelectMenu,\n },\n icons.chevronDown()\n ),\n ]\n\n removeTag = (event: Event) => {\n if (this.editable && !this.disabled) {\n const tag = (event.target as HTMLElement).closest(\n XinTag.tagName!\n ) as XinTag\n this.value = this.tags.filter((value) => value !== tag.caption)\n tag.remove()\n this.queueRender(true)\n }\n event.stopPropagation()\n event.preventDefault()\n }\n\n render(): void {\n super.render()\n const { tagContainer, tagMenu, tagInput } = this.parts as {\n tagContainer: HTMLDivElement\n tagMenu: HTMLButtonElement\n tagInput: HTMLInputElement\n }\n\n tagMenu.disabled = this.disabled\n tagInput.value = ''\n tagInput.setAttribute('placeholder', this.placeholder)\n if (this.editable && !this.disabled) {\n tagMenu.toggleAttribute('hidden', false)\n tagInput.toggleAttribute('hidden', !this.textEntry)\n } else {\n tagMenu.toggleAttribute('hidden', true)\n tagInput.toggleAttribute('hidden', true)\n }\n\n tagContainer.textContent = ''\n const { tags } = this\n for (const tag of tags) {\n tagContainer.append(\n xinTag({\n caption: tag,\n removeable: this.editable && !this.disabled,\n removeCallback: this.removeTag,\n })\n )\n }\n }\n}\n\nexport const xinTagList = XinTagList.elementCreator({\n tag: 'xin-tag-list',\n styleSpec: {\n ':host': {\n '--tag-list-bg': '#f8f8f8',\n '--touch-size': '44px',\n '--spacing': '16px',\n display: 'grid',\n gridTemplateColumns: 'auto',\n alignItems: 'center',\n background: vars.tagListBg,\n gap: vars.spacing25,\n borderRadius: varDefault.taglistRoundedRadius(vars.spacing50),\n overflow: 'hidden',\n },\n ':host[editable]': {\n gridTemplateColumns: `0px auto ${vars.touchSize}`,\n },\n ':host[editable][text-entry]': {\n gridTemplateColumns: `0px 2fr 1fr ${vars.touchSize}`,\n },\n ':host [part=\"tagContainer\"]': {\n display: 'flex',\n content: '\" \"',\n alignItems: 'center',\n background: vars.inputBg,\n borderRadius: varDefault.tagContainerRadius(vars.spacing50),\n boxShadow: vars.borderShadow,\n flexWrap: 'nowrap',\n overflow: 'auto hidden',\n gap: vars.spacing25,\n minHeight: `calc(${vars.lineHeight} + ${vars.spacing})`,\n padding: vars.spacing25,\n },\n ':host [part=\"tagMenu\"]': {\n width: vars.touchSize,\n height: vars.touchSize,\n lineHeight: vars.touchSize,\n textAlign: 'center',\n padding: 0,\n margin: 0,\n },\n ':host [hidden]': {\n display: 'none !important',\n },\n ':host button[part=\"tagMenu\"]': {\n background: vars.brandColor,\n color: vars.brandTextColor,\n },\n },\n}) as ElementCreator<XinTagList>\n",
43
- "export const version = '1.0.8'",
43
+ "export const version = '1.0.9'",
44
44
  "export * from './ab-test'\nexport * from './babylon-3d'\nexport * from './bp-loader'\nexport * from './bodymovin-player'\nexport * from './carousel'\nexport * from './code-editor'\nexport * from './color-input'\nexport * from './data-table'\nexport * from './dialog'\nexport * as dragAndDrop from './drag-and-drop'\nexport * from './editable-rect'\nexport * from './filter-builder'\nexport * from './float'\nexport * from './form'\nexport * from './gamepad'\nexport * from './icons'\nexport * from './live-example'\nexport * from './localize'\nexport { makeSorter } from './make-sorter'\nexport * from './mapbox'\nexport * from './markdown-viewer'\nexport * from './menu'\nexport * from './month'\nexport * from './notifications'\nexport * from './password-strength'\nexport * from './pop-float'\nexport * from './rating'\nexport * from './rich-text'\nexport * from './segmented'\nexport * from './select'\nexport * from './side-nav'\nexport * from './size-break'\nexport * from './sizer'\nexport * from './tab-selector'\nexport * from './tag-list'\nexport { trackDrag, bringToFront, findHighestZ } from './track-drag'\nexport { version } from './version'\nexport { scriptTag, styleSheet } from './via-tag'\nexport * as tosijs from 'tosijs'\n"
45
45
  ],
46
- "mappings": "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",
47
- "debugId": "DCB95CAF65D6D20B64756E2164756E21",
46
+ "mappings": "iIA8EA,oBAAS,gBAET,IAAM,GAAmB,CAAC,EAEnB,MAAM,WAAe,EAAU,WACzB,WAAU,CAAC,EAAiC,CACrD,OAAO,OAAO,GAAkB,CAAO,EAEvC,QAAW,IAAU,CAAC,GAAG,GAAO,SAAS,EACvC,EAAO,YAAY,EAIvB,UAAY,GAEZ,IAAM,SAEC,WAAyB,IAAI,IAEpC,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,YAAa,KAAK,EAGxC,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EACxB,GAAO,UAAU,IAAI,IAAI,EAG3B,oBAAoB,EAAG,CACrB,MAAM,qBAAqB,EAC3B,GAAO,UAAU,OAAO,IAAI,EAG9B,MAAM,EAAS,CACb,GACE,KAAK,YAAc,KAClB,KAAK,IACD,GAAiB,KAAK,aAAgB,GACtC,GAAiB,KAAK,aAAgB,IAE3C,KAAK,gBAAgB,SAAU,EAAK,EAEpC,UAAK,gBAAgB,SAAU,EAAI,EAGzC,CAEO,IAAM,GAAS,GAAO,eAAe,CAAE,IAAK,QAAS,CAAC,ECkD7D,oBAAS,eAA2C,gBCxGpD,mBAAS,gBAMT,IAAM,GAA4B,CAAC,EAC5B,SAAS,CAAS,CACvB,EACA,EACc,CACd,GAAI,GAAc,KAAS,OAAW,CACpC,GAAI,IAAuB,OAAW,CAEpC,IAAM,EAAW,WAAW,GAC5B,GAAc,GAAO,QAAQ,QAAQ,EAAG,GAAqB,CAAS,CAAC,EAGzE,IAAM,EAAY,GAAS,OAAO,CAAE,KAAI,CAAC,EAEzC,SAAS,KAAK,OAAO,CAAS,EAE9B,GAAc,GAAO,IAAI,QAAQ,CAAC,IAAY,CAC5C,EAAU,OAAS,IAAM,EAAQ,UAAU,EAC5C,EAGH,OAAO,GAAc,GAGvB,IAAM,GAAgC,CAAC,EAChC,SAAS,EAAU,CAAC,EAA6B,CACtD,GAAI,GAAkB,KAAU,OAAW,CACzC,IAAM,EAAc,GAAS,KAAK,CAChC,IAAK,aACL,KAAM,WACN,MACF,CAAC,EAED,SAAS,KAAK,OAAO,CAAW,EAEhC,GAAkB,GAAQ,IAAI,QAAQ,CAAC,IAAY,CACjD,EAAY,OAAS,EACtB,EAEH,OAAO,GAAkB,GCyO3B,mBACE,kBACA,gBAIA,YAEA,iBACA,eCrWF,IAAe,IACb,MAAO,k0DACP,UAAW,imHACX,OAAQ,yrFACR,IAAK,s5DACL,IAAK,s5DACL,QAAS,kuJACT,OAAQ,iwGACR,YAAa,okEACb,aAAc,8tGACd,KAAM,8zFACN,eAAgB,kQAChB,QAAS,6JACT,UAAW,oJACX,KAAM,8OACN,SAAU,4JACV,OAAQ,4IACR,QAAS,6LACT,cAAe,oLACf,YAAa,kLACb,YAAa,2KACb,UAAW,6IACX,MAAO,kYACP,cAAe,wIACf,cAAe,8IACf,KAAM,4TACN,aAAc,8IACd,KAAM,gKACN,cAAe,2IACf,OAAQ,wKACR,SAAU,kRACV,UAAW,wOACX,WAAY,4IACZ,UAAW,0QACX,QAAS,iMACT,SAAU,2OACV,OAAQ,gOACR,MAAO,mJACP,QAAS,8JACT,QAAS,oaACT,YAAa,uJACb,SAAU,wHACV,KAAM,mJACN,UAAW,uNACX,QAAS,gLACT,OAAQ,0FACR,YAAa,ubACb,MAAO,yHACP,aAAc,wIACd,KAAM,sKACN,OAAQ,kUACR,MAAO,gKACP,WAAY,gKACZ,eAAgB,sKAChB,QAAS,0bACT,YAAa,yIACb,YAAa,+FACb,QAAS,6LACT,OAAQ,uWACR,KAAM,gJACN,IAAK,8LACL,UAAW,4KACX,SAAU,sJACV,IAAK,gNACL,MAAO,8OACP,aAAc,gOACd,WAAY,wMACZ,MAAO,6IACP,SAAU,0MACV,UAAW,qNACX,WAAY,sJACZ,KAAM,2KACN,cAAe,4PACf,UAAW,2LACX,SAAU,4IACV,KAAM,gUACN,SAAU,iKACV,UAAW,gGACX,cAAe,0IACf,SAAU,8SACV,QAAS,yGACT,OAAQ,wQACR,EAAG,wIACH,SAAU,sLACV,KAAM,2JACN,MAAO,wMACP,YAAa,sMACb,OAAQ,2KACR,aAAc,8XACd,UAAW,oOACX,aAAc,+FACd,UAAW,wMACX,QAAS,4VACT,UAAW,qOACX,KAAM,6MACN,SAAU,gNACV,IAAK,uLACL,IAAK,gOACL,gBAAiB,2IACjB,WAAY,6IACZ,SAAU,8YACV,WAAY,wIACZ,OAAQ,sMACR,gBAAiB,oLACjB,UAAW,sLACX,eAAgB,iNAChB,SAAU,iKACV,YAAa,4JACb,SAAU,y0BACV,UAAW,gZACX,WAAY,yMACZ,KAAM,0LACN,QAAS,gMACT,cAAe,ybACf,OAAQ,8LACR,KAAM,4LACN,OAAQ,+GACR,SAAU,wMACV,eAAgB,ybAChB,gBAAiB,2IACjB,SAAU,wKACV,aAAc,oPACd,OAAQ,uQACR,GAAI,4JACJ,YAAa,6IACb,OAAQ,gHACR,SAAU,6OACV,gBAAiB,yPACjB,OAAQ,qMACR,MAAO,iJACP,MAAO,8NACP,KAAM,mLACN,UAAW,iMACX,KAAM,2JACN,UAAW,6MACX,OAAQ,uRACR,KAAM,6IACN,YAAa,4HACb,KAAM,6NACN,KAAM,wKACN,OAAQ,mSACR,QAAS,6JACT,KAAM,iIACN,MAAO,+NACP,KAAM,4NACN,IAAK,sfACL,KAAM,iKACN,KAAM,+NACN,OAAQ,oRACR,KAAM,0IACN,MAAO,+FACP,UAAW,iJACX,UAAW,wTACX,UAAW,+HACX,SAAU,gJACV,WAAY,+NACZ,IAAK,qKACL,KAAM,2OACN,aAAc,wIACd,MAAO,uSACP,KAAM,qLACN,MAAO,4OACP,OAAQ,8bACR,WAAY,mOACZ,WAAY,wOACZ,SAAU,qKACV,IAAK,6PACL,KAAM,yLACN,OAAQ,oOACR,iBAAkB,qLAClB,WAAY,gOACZ,MAAO,0MACP,UAAW,oOACX,YAAa,0JACb,OAAQ,oaACR,KAAM,kOACN,MAAO,6NACP,WAAY,yGACZ,eAAgB,wKAChB,UAAW,qLACX,YAAa,qJACb,QAAS,sMACT,MAAO,8JACP,QAAS,wLACT,IAAK,ySACL,SAAU,uLACV,QAAS,qLACT,QAAS,0JACT,OAAQ,gHACR,KAAM,iGACN,UAAW,0LACX,MAAO,6KACP,KAAM,oJACN,UAAW,oZACX,QAAS,qMACT,SAAU,2SACV,YAAa,idACb,OAAQ,4LACR,MAAO,2LACP,QAAS,8OACT,YAAa,2LACb,aAAc,0IACd,MAAO,wPACP,SAAU,oZACV,QAAS,2NACT,OAAQ,yJACR,QAAS,4MACT,MAAO,6LACP,QAAS,+YACT,eAAgB,2IAChB,WAAY,iKACZ,KAAM,6KACN,SAAU,wMACV,IAAK,qeACL,cAAe,iIACf,KAAM,qMACN,OAAQ,iLACR,YAAa,sLACb,WAAY,+IACZ,YAAa,iQACb,OAAQ,6GACR,QAAS,gjBACT,OAAQ,0JACR,QAAS,6KACT,WAAY,kLACZ,WAAY,4JACZ,UAAW,yPACX,OAAQ,uRACR,SAAU,8IACV,SAAU,oQACV,OAAQ,8MACR,QAAS,4PACT,MAAO,yIACP,QAAS,qJACT,MAAO,iWACP,IAAK,uJACL,SAAU,oaACV,QAAS,6TACT,SAAU,8PACV,KAAM,2TACN,aAAc,qNACd,IAAK,qHACL,OAAQ,6MACR,aAAc,sKACd,OAAQ,qUACR,MAAO,qMACP,QAAS,4IACT,QAAS,kSACT,SAAU,sOACV,MAAO,kKACP,aAAc,8NACd,SAAU,gHACV,QAAS,+OACT,OAAQ,yJACR,OAAQ,0HACR,cAAe,ybACf,OAAQ,oLACR,aAAc,+IACd,SAAU,gPACV,MAAO,kPACP,UAAW,4IACX,YAAa,gOACb,YAAa,sIACb,eAAgB,2IAChB,OAAQ,8GACR,QAAS,wMACT,MAAO,g0BACP,MAAO,iHACP,cAAe,mNACf,QAAS,gRACT,OAAQ,uJACR,OAAQ,qMACR,aAAc,4JACd,MAAO,iJACP,gBAAiB,qLACjB,SAAU,qHACV,cAAe,wPACf,UAAW,mMACX,OAAQ,gKACR,aAAc,iPACd,KAAM,oLACN,OAAQ,wRACR,aAAc,gNACd,OAAQ,+IACR,MAAO,yOACP,eAAgB,wIAChB,QAAS,yMACT,MAAO,8FACP,WAAY,gMACZ,YAAa,yGACb,YAAa,gGACb,KAAM,oaACN,KAAM,mHACN,UAAW,yOACX,OAAQ,oMACR,aAAc,wIACd,UAAW,gOACX,MAAO,4MACP,WAAY,2JACZ,WAAY,qkBACZ,OAAQ,4SACR,SAAU,8qBACV,WAAY,kQACZ,cAAe,6QACf,QAAS,4SACT,WAAY,yxBACZ,OAAQ,qLACR,IAAK,2pBACL,KAAM,mrBACN,cAAe,kQACf,IAAK,8JACL,KAAM,0fACN,OAAQ,mcACR,QAAS,wmCACX,EDmDO,IAAM,GAAc,CAAC,IAA8C,CACxE,OAAO,OAAO,GAAU,CAAQ,GAGrB,GAAc,CACzB,EACA,EACA,EACA,IACW,CACX,EAAI,aAAa,QAAS,4BAA4B,EACtD,QAAW,IAAQ,CACjB,GAAG,EAAI,iBACL,sDACF,CACF,EAAG,CACD,GAAI,IAAS,OACX,EAAK,aAAa,OAAQ,CAAI,EAEhC,GAAI,IAAW,OACb,EAAK,aAAa,SAAU,CAAM,EAEpC,GAAI,IAAgB,OAClB,EAAK,aAAa,eAAgB,OAAO,CAAW,CAAC,EAIzD,IAAM,EAAS,EAAI,iBAAiB,SAAS,EAC7C,EAAI,gBAAgB,OAAO,EAC3B,QAAW,IAAQ,CAAC,GAAG,CAAM,EAAoB,CAC/C,IAAQ,OAAM,SAAQ,cAAa,gBAAe,kBAChD,EAAK,MACP,GAAI,EAAM,EAAK,aAAa,OAAQ,GAAM,QAAQ,CAAI,EAAE,IAAI,EAC5D,GAAI,EAAQ,EAAK,aAAa,SAAU,GAAM,QAAQ,CAAM,EAAE,IAAI,EAClE,GAAI,EAAa,EAAK,aAAa,cAAe,CAAW,EAC7D,GAAI,EAAe,EAAK,aAAa,gBAAiB,CAAa,EACnE,GAAI,EAAgB,EAAK,aAAa,iBAAkB,CAAc,EACtE,EAAK,gBAAgB,OAAO,EAI9B,MAAO,wCADM,mBAAmB,EAAI,SAAS,MAIlC,EAAQ,IAAI,MAAM,GAAU,CACvC,GAAG,CAAC,EAAQ,EAA8B,CACxC,IAAI,EAAW,GAAS,GACxB,GAAI,GAAQ,CAAC,EACX,QAAQ,KAAK,QAAQ,kBAAqB,EAE5C,GAAI,CAAC,EACH,EAAW,GAAS,OAEtB,MAAO,IAAI,IAAyB,CAClC,IAAM,EAAM,GAAS,IAAI,EACzB,EAAI,UAAY,EAChB,IAAM,EAAY,EAAI,cAAc,KAAK,EACnC,EAAU,IAAI,IAAI,EAAU,SAAS,EAC3C,EAAQ,IAAI,UAAU,EACtB,IAAM,EAAM,GAAY,IACtB,CACE,MAAO,MAAM,KAAK,CAAO,EAAE,KAAK,GAAG,EACnC,QAAS,EAAU,aAAa,SAAS,CAC3C,EACA,GAAG,EACH,GAAG,EAAU,QACf,EASA,OARA,EAAI,MAAM,YAAc,EAAW,mBAAmB,KAAK,EAC3D,EAAI,MAAM,OAAS,EAAW,cAC5B,EAAQ,IAAI,QAAQ,EAAI,OAAS,cACnC,EACA,EAAI,MAAM,KAAO,EAAW,YAC1B,EAAQ,IAAI,SAAS,EAAI,OAAS,cACpC,EACA,EAAI,MAAM,OAAS,EAAW,YAAY,MAAM,EACzC,GAGb,CAAC,EAEM,MAAM,WAAgB,EAAa,CACxC,KAAO,GACP,KAAO,EACP,KAAO,GACP,OAAS,GACT,YAAc,EAEd,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,OAAQ,OAAQ,OAAQ,SAAU,aAAa,EAGrE,MAAM,EAAS,CACb,MAAM,OAAO,EACb,KAAK,YAAc,GACnB,IAAM,EAAsB,CAAC,EAC7B,GAAI,KAAK,KACP,EAAM,OAAS,KAAK,KAAO,KAC3B,KAAK,MAAM,YAAY,kBAAmB,GAAG,KAAK,QAAQ,EAE5D,GAAI,KAAK,OACP,EAAM,OAAS,KAAK,OACpB,EAAM,YAAc,KAAK,YAE3B,EAAM,KAAO,KAAK,KAClB,KAAK,OAAO,EAAM,KAAK,MAAM,CAAE,OAAM,CAAC,CAAC,EAE3C,CAEO,IAAM,GAAU,GAAQ,eAAe,CAC5C,IAAK,WACL,UAAW,CACT,QAAS,CACP,QAAS,cACT,OAAQ,eACR,YAAa,EAAW,gBAAgB,KAAK,EAC7C,eAAgB,EAAW,mBAAmB,OAAO,EACrD,cAAe,EAAW,kBAAkB,OAAO,EACnD,KAAM,EAAW,SAAS,MAAM,CAClC,EACA,mBAAoB,CAClB,OAAQ,EAAW,YAAY,MAAM,CACvC,CACF,CACF,CAAC,EF3SD,IAAM,GAAO,IAAM,GAIZ,MAAM,WAAY,EAAa,CACpC,aACA,cAEO,WAAY,CACjB,QAAS,CACP,QAAS,QACT,SAAU,UACZ,EACA,eAAgB,CACd,MAAO,OACP,OAAQ,MACV,EACA,uBAAwB,CACtB,OAAQ,GACR,MAAO,GACP,gBAAiB,cACjB,OAAQ,6BACR,gBAAiB,GAAY,EAAM,QAAQ,CAAC,EAC5C,mBAAoB,SACpB,iBAAkB,YAClB,OAAQ,OACR,aAAc,EACd,YAAa,OACb,QAAS,OACT,WAAY,2BACd,EACA,6BAA8B,CAC5B,UAAW,YACb,CACF,EAEA,QAAU,GAAS,OAAO,CAAE,KAAM,QAAS,CAAC,EAE5C,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,cAAgB,SAAY,CAC/B,IAAQ,WAAY,MAAM,EACxB,uCACA,SACF,EACA,OAAO,IACN,EAGL,MACA,OAEA,aAA4B,GAC5B,OAAsB,GAEd,QAAU,IAAM,CACtB,GAAI,KAAK,MAAO,CACd,GAAI,KAAK,SAAW,OAClB,KAAK,OAAO,KAAM,KAAK,OAAO,EAEhC,GAAI,KAAK,MAAM,eAAiB,OAC9B,KAAK,MAAM,OAAO,IAKxB,QAAQ,EAAG,CACT,GAAI,KAAK,OACP,KAAK,OAAO,OAAO,EAIvB,UAAY,MACV,EACA,EACA,IACkB,CAClB,IAAQ,WAAY,MAAM,EACxB,6DACA,SACF,EAEA,EAAQ,YAAY,OAAO,EAAM,EAAM,KAAK,MAAO,CAAe,GAGpE,OAAS,MAAO,IAAwC,CACtD,IAAQ,WAAY,MAAM,EACxB,mDACA,SACF,EACM,EACJ,EAAQ,IAAI,uBAAuB,mBACjC,MACA,GACA,KAAK,KACP,GACM,YAAW,UAAS,OAAM,QAAS,EAC3C,GAAI,EACF,EAAgB,WAAa,EAC7B,EAAgB,kBAAoB,GAItC,IAAI,EACJ,GAAI,EACF,EAAM,MAAM,EAAgB,sBAAsB,CAAS,EACtD,QAAI,EACT,EAAM,MAAM,EAAgB,kBAAkB,CAAO,EAChD,QAAI,EACT,EAAM,EAAgB,aAAa,CAAI,EAEvC,YAAO,KAGT,IAAM,EAAO,EAAgB,YAAY,EAAE,GACrC,EAAU,EAAK,SAAS,OAC5B,CAAC,EAA6B,IAAgB,CAE5C,OADA,EAAI,EAAO,MAAQ,EACZ,GAET,CAAC,CACH,EAEA,MAAO,CAAE,kBAAiB,MAAK,OAAM,SAAQ,GAG/C,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EAExB,IAAQ,UAAW,KAAK,MAExB,KAAK,aAAa,KAAK,MAAO,IAAY,CAIxC,GAHA,KAAK,QAAU,EACf,KAAK,OAAS,IAAI,EAAQ,OAAO,EAAQ,EAAI,EAC7C,KAAK,MAAQ,IAAI,EAAQ,MAAM,KAAK,MAAM,EACtC,KAAK,aACP,MAAM,KAAK,aAAa,KAAM,CAAO,EAEvC,GAAI,KAAK,MAAM,eAAiB,OACf,IAAI,EAAQ,gBACzB,iBACA,CAAC,KAAK,GAAK,EACX,KAAK,GAAK,IACV,EACA,IAAI,EAAQ,QAAQ,EAAG,EAAG,CAAC,CAC7B,EACO,cAAc,KAAK,MAAM,OAAQ,EAAI,EAE9C,KAAK,OAAO,cAAc,KAAK,OAAO,EACvC,EAEL,CAEO,IAAM,GAAM,GAAI,eAAe,CAAE,IAAK,QAAS,CAAC,EIpPvD,oBAAS,gBAaF,MAAM,WAAwB,EAAa,CAChD,QAAU,KACV,IAAM,GACN,KAAO,GACP,OAAuB,CACrB,SAAU,MACV,KAAM,GACN,SAAU,EACZ,QAEO,oBAEP,gBAEO,WAAY,CACjB,QAAS,CACP,MAAO,IACP,OAAQ,IACR,QAAS,cACX,CACF,EAEQ,SAAW,MAEf,QAAO,EAAY,CACrB,OAAO,KAAK,SAGd,WAAW,EAAG,CACZ,MAAM,EAEN,GADA,KAAK,eAAe,MAAO,MAAM,EAC7B,GAAgB,qBAAuB,OACzC,GAAgB,mBAAqB,EACnC,wEACA,WACF,EAIa,YAAc,IAAY,CACzC,KAAK,SAAW,IAGD,KAAO,EAAG,eAA0C,CAKnE,GAJA,KAAK,SAAW,GAEhB,KAAK,OAAO,UACV,KAAK,aAAe,KAAO,KAAK,WAAa,OAC3C,KAAK,OAAS,GAChB,KAAK,OAAO,cAAgB,KAAK,KACjC,OAAO,KAAK,OAAO,KACd,QAAI,KAAK,MAAQ,GACtB,OAAO,KAAK,OAAO,cACnB,KAAK,OAAO,KAAO,KAAK,IAExB,aAAQ,IACN,iGACA,gDACA,iBACA,gDACA,iBACA,gDACA,gBACF,EAGF,GAAI,KAAK,UAAW,CAClB,KAAK,UAAU,QAAQ,EACvB,IAAM,EAAO,KAAK,WAClB,GAAI,IAAS,KACX,EAAK,cAAc,KAAK,GAAG,OAAO,EAGtC,KAAK,UAAY,EAAU,cAAc,KAAK,MAAM,EACpD,KAAK,UAAU,iBAAiB,YAAa,KAAK,WAAW,GAG/D,MAAM,EAAS,CACb,MAAM,OAAO,EAEb,GAAgB,mBAAoB,KAAK,KAAK,IAAI,EAAE,MAClD,CAAC,IAAoB,CACnB,QAAQ,MAAM,CAAC,EAEnB,EAEJ,CAEO,IAAM,GAAkB,GAAgB,eAAe,CAC5D,IAAK,YACP,CAAC,ECpJD,oBACE,eAEA,WACA,eAIF,IAAQ,UAAQ,QAAM,QAAQ,GAQvB,MAAM,WAAoB,EAAa,CAC5C,OAAS,GACT,KAAO,GACP,KAAO,GACP,gBAAkB,EAClB,UAAY,IACZ,aAAe,KACf,KAAO,EAEC,gBAAkB,KAAK,IAAI,EAC3B,SAEA,YAAc,IAAM,CAC1B,GAAI,KAAK,KAAO,GAAK,KAAK,KAAO,KAAO,KAAK,IAAI,EAAI,KAAK,gBACxD,KAAK,QAAQ,GAIT,MAAQ,KAEZ,KAAI,EAAW,CACjB,OAAO,KAAK,SAGV,KAAI,CAAC,EAAW,CAClB,IAAQ,WAAU,OAAM,WAAY,KAAK,MACzC,GAAI,KAAK,UAAY,EACnB,EAAQ,SAAW,EAAK,SAAW,GACnC,EAAI,EAEJ,OAAI,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,SAAU,CAAC,CAAC,EAC1C,EAAI,MAAM,CAAC,EAAI,EAAI,EAErB,GAAI,KAAK,QAAU,EACjB,KAAK,MAAQ,MAAM,CAAC,EAAI,EAAI,EAC5B,KAAK,cAAc,KAAK,MAAQ,EAAS,WAAW,EACpD,EAAK,SAAW,KAAK,MAAQ,GAAK,CAAC,KAAK,KACxC,EAAQ,SAAW,KAAK,MAAQ,KAAK,UAAY,CAAC,KAAK,QAIvD,aAAY,EAAkB,CAChC,MAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,OACxB,CAAC,IAAY,iBAAiB,CAAO,EAAE,UAAY,MACrD,KAGE,SAAQ,EAAW,CACrB,OAAO,KAAK,IACV,KAAK,KAAK,KAAK,aAAa,QAAU,KAAK,iBAAmB,EAAE,EAAI,EACpE,CACF,QAGK,WAAY,CACjB,QAAS,CACP,QAAS,OACT,cAAe,SACf,SAAU,UACZ,EACA,YAAa,CACX,OAAQ,EAAK,gBACf,EACA,eAAgB,CACd,QAAS,OACT,OAAQ,OACR,UAAW,OACX,WAAY,cACZ,MAAO,EAAK,oBACZ,QAAS,CACX,EACA,0CAA2C,CACzC,SAAU,WACV,IAAK,EACL,OAAQ,EACR,MAAO,EAAK,mBACZ,OAAQ,CACV,EACA,oBAAqB,CACnB,KAAM,CACR,EACA,uBAAwB,CACtB,MAAO,CACT,EACA,wBAAyB,CACvB,QAAS,IACT,cAAe,MACjB,EACA,qBAAsB,CACpB,MAAO,EAAK,wBACd,EACA,sBAAuB,CACrB,MAAO,EAAK,yBACd,EACA,qBAAsB,CACpB,SAAU,UACZ,EACA,wBAAyB,CACvB,SAAU,cACV,SAAU,UACZ,EACA,oBAAqB,CACnB,QAAS,OACT,aAAc,QAChB,EACA,yDAA0D,CACxD,QAAS,MACX,EACA,aAAc,CACZ,WAAY,EAAK,oBACjB,aAAc,EAAK,gBACnB,OAAQ,EAAK,gBACb,MAAO,EAAK,gBACZ,WAAY,EAAK,qBACnB,EACA,iCAAkC,CAChC,WAAY,EAAK,yBACjB,OAAQ,EAAK,mBACb,MAAO,EAAK,mBACZ,OAAQ,EAAK,kBACf,EACA,kCAAmC,CACjC,WAAY,EAAK,yBACnB,EACA,qBAAsB,CACpB,WAAY,EAAK,uBACnB,EACA,wBAAyB,CACvB,QAAS,OACT,IAAK,EAAK,mBACV,eAAgB,SAChB,QAAS,EAAK,uBAChB,CACF,EAEA,OAAS,CAAC,IAAc,CACtB,OAAO,KAAK,IAAI,EAAI,KAAK,GAAK,GAAG,GAGnC,gBAAkB,IAAM,CACtB,IAAQ,WAAU,YAAa,KAAK,MAC9B,EAAO,EAAS,WAAa,EAAS,YAC3C,CAAC,GAAG,EAAS,QAAQ,EAAE,QAAQ,CAAC,EAAK,IAAU,CAC9C,EAAI,UAAU,OACZ,UACA,KAAK,MAAM,EAAQ,KAAK,gBAAkB,CAAI,IAAM,CACtD,EACD,EACD,KAAK,gBAAkB,KAAK,IAAI,EAChC,aAAa,KAAK,SAAS,EAC3B,KAAK,UAAY,WAAW,KAAK,aAAc,KAAK,UAAY,IAAI,GAGtE,aAAe,IAAM,CACnB,IAAQ,YAAa,KAAK,MACpB,EAAkB,KAAK,MAC3B,EAAS,WAAa,EAAS,WACjC,EACA,GAAI,IAAoB,KAAK,KAC3B,KAAK,KACH,EAAkB,KAAK,KACnB,KAAK,KAAK,CAAe,EACzB,KAAK,MAAM,CAAe,EAElC,KAAK,gBAAkB,KAAK,IAAI,GAGlC,KAAO,IAAM,CACX,KAAK,KAAO,KAAK,KAAO,EAAI,KAAK,KAAO,EAAI,KAAK,UAGnD,QAAU,IAAM,CACd,KAAK,KAAO,KAAK,KAAO,KAAK,SAAW,KAAK,KAAO,EAAI,GAG1D,eAAiB,CAAC,IAAiB,CACjC,IAAQ,YAAa,KAAK,MACpB,EAAQ,CAAC,GAAG,EAAS,QAAQ,EAAE,QAAQ,EAAM,MAAqB,EACxE,GAAI,EAAQ,GACV,KAAK,KAAO,KAAK,MAAM,EAAQ,KAAK,eAAe,GAI/C,UACA,eACR,aAAa,CAAC,EAAkB,EAAmB,GAAI,EAAY,EAAG,CACpE,qBAAqB,KAAK,cAAc,EACxC,IAAQ,YAAa,KAAK,MAC1B,GAAI,IAAqB,GAAI,CAC3B,EAAmB,EAAS,WAC5B,EAAY,KAAK,IAAI,EACrB,KAAK,eAAiB,sBAAsB,IAAM,CAChD,KAAK,cAAc,EAAU,EAAkB,CAAS,EACzD,EACD,OAEF,IAAM,GAAW,KAAK,IAAI,EAAI,GAAa,KAC3C,GACE,GAAW,KAAK,cAChB,KAAK,IAAI,EAAS,WAAa,CAAQ,EAAI,EAE3C,EAAS,WAAa,EACtB,KAAK,eAAiB,KAEtB,OAAS,WACP,EACA,KAAK,OAAO,EAAU,KAAK,YAAY,GAAK,EAAW,GACzD,KAAK,eAAiB,sBAAsB,IAAM,CAChD,KAAK,cAAc,EAAU,EAAkB,CAAS,EACzD,EAIL,QAAU,IAAM,CACd,GACE,CAAE,KAAM,OAAQ,EAChB,GAAO,CAAE,MAAO,iBAAkB,KAAM,MAAO,EAAG,EAAM,YAAY,CAAC,EACrE,GACE,CAAE,MAAO,SAAU,KAAM,QAAS,KAAM,UAAW,EACnD,GAAI,CAAE,KAAM,MAAO,EAAG,GAAK,CAAC,CAC9B,EACA,GAAO,CAAE,MAAO,aAAc,KAAM,SAAU,EAAG,EAAM,aAAa,CAAC,CACvE,EACA,GAAI,CAAE,MAAO,0BAA2B,KAAM,QAAS,KAAM,UAAW,CAAC,CAC3E,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eACH,OACA,SACA,kBACA,eACA,OACA,MACF,EAGF,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EAExB,KAAK,oBAAsB,WAC3B,KAAK,gBAAkB,aACvB,KAAK,aAAe,OAEpB,IAAQ,OAAM,UAAS,WAAU,YAAa,KAAK,MACnD,EAAK,iBAAiB,QAAS,KAAK,IAAI,EACxC,EAAQ,iBAAiB,QAAS,KAAK,OAAO,EAC9C,EAAS,iBAAiB,SAAU,KAAK,eAAe,EACxD,EAAS,iBAAiB,QAAS,KAAK,cAAc,EAEtD,KAAK,gBAAkB,KAAK,IAAI,EAChC,KAAK,SAAW,YAAY,KAAK,YAAa,GAAG,EAGnD,oBAAoB,EAAG,CACrB,cAAc,KAAK,QAAQ,EAG7B,MAAM,EAAG,CACP,MAAM,OAAO,EAEb,IAAQ,OAAM,SAAQ,eAAc,YAAa,MACzC,WAAU,OAAM,UAAS,QAAS,KAAK,MAE/C,EAAa,QAAQ,CAAC,IAAS,CAC7B,EAAK,KAAO,QACb,EACD,EAAK,MAAM,oBAAsB,GAC/B,IAAM,KAAK,iBAAmB,EAAI,KAAK,cAEtC,OAAO,EAAa,MAAM,EAC1B,KAAK,EACR,EAAK,MAAM,OAAS,EAAI,KAAK,UAAY,IAAM,IAC/C,EAAS,YAAc,GACvB,EAAS,OACP,GAAG,EAAa,IAAI,CAAC,EAAG,IACtB,GAAO,CAAE,MAAO,QAAQ,EAAQ,IAAK,MAAO,KAAM,CAAC,CACrD,CACF,EAEA,KAAK,gBAAgB,EACrB,EAAS,MAAM,QAAU,GAAQ,EAAW,EAAI,GAAK,OACrD,EAAK,OAAS,EAAQ,OAAS,EAAE,GAAU,EAAW,GAE1D,CAEO,IAAM,GAAc,GAAY,eAAe,CACpD,IAAK,eACL,UAAW,CACT,QAAS,CACP,kBAAmB,GACnB,qBAAsB,QACtB,0BAA2B,QAC3B,2BAA4B,QAC5B,oBAAqB,GACrB,yBAA0B,QAC1B,iBAAkB,EAClB,oBAAqB,EAAK,gBAC1B,yBAA0B,GAC1B,uBAAwB,oBAC1B,EACA,cAAe,CACb,QAAS,OACT,UAAW,MACb,CACF,CACF,CAAC,ECvWD,oBAAS,gBAGT,IAAM,GAAe,qDACf,GAAgB,qBAEhB,GAAS,SAA0B,CACvC,IAAQ,OAAQ,MAAM,EAAU,GAAG,cAAwB,EAC3D,OAAO,GAGH,GAAiB,MACrB,EACA,EAAO,OACP,EAAU,CAAC,EACX,EAAQ,KACL,CACH,IAAM,EAAM,MAAM,GAAO,EACzB,EAAI,OAAO,IAAI,WAAY,EAAY,EACvC,IAAM,EAAS,EAAI,KAAK,EAAa,CACnC,KAAM,YAAY,IAClB,QAAS,EACT,YAAa,GACb,UAAW,MACR,CACL,CAAC,EAED,OADA,EAAO,SAAS,CAAK,EACd,CAAE,MAAK,QAAO,GAGhB,MAAM,UAAmB,EAAa,CACnC,OAAS,MAEb,MAAK,EAAW,CAClB,OAAO,KAAK,SAAW,OAAY,KAAK,OAAS,KAAK,OAAO,SAAS,KAGpE,MAAK,CAAC,EAAc,CACtB,GAAI,KAAK,SAAW,OAClB,KAAK,OAAS,EAEd,UAAK,OAAO,SAAS,CAAI,EACzB,KAAK,OAAO,eAAe,EAC3B,KAAK,OAAO,QAAQ,eAAe,EAAE,MAAM,EAI/C,KAAO,aACP,SAAW,GACX,KAAO,cAEC,KACA,QACA,eACR,QAAe,CAAC,EAChB,MAAQ,MAEJ,IAAG,EAAQ,CACb,OAAO,KAAK,QAGV,OAAM,EAAQ,CAChB,OAAO,KAAK,cAGP,WAAY,CACjB,QAAS,CACP,QAAS,QACT,SAAU,WACV,MAAO,OACP,OAAQ,MACV,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,OAAQ,QAAS,UAAU,EAGjD,QAAQ,EAAG,CACT,GAAI,KAAK,SAAW,OAClB,KAAK,OAAO,OAAO,EAAI,EAI3B,iBAAiB,EAAG,CAGlB,GAFA,MAAM,kBAAkB,EAEpB,KAAK,SAAW,GAClB,KAAK,MAAQ,KAAK,cAAgB,KAAO,KAAK,YAAY,KAAK,EAAI,GAGrE,GAAI,KAAK,iBAAmB,OAC1B,KAAK,eAAiB,GACpB,KACA,KAAK,KACL,KAAK,QACL,KAAK,KACP,EACA,KAAK,eAAe,KAAK,EAAG,MAAK,YAAa,CAC5C,KAAK,KAAO,EACZ,KAAK,QAAU,EACf,EAAO,SAAS,KAAK,OAAQ,CAAC,EAC9B,EAAO,eAAe,EACtB,EAAO,QAAQ,eAAe,EAAE,MAAM,EACvC,EAIL,MAAM,EAAS,CAGb,GAFA,MAAM,OAAO,EAET,KAAK,iBAAmB,OAC1B,KAAK,eAAe,KAAK,EAAG,YAC1B,EAAO,YAAY,KAAK,QAAQ,CAClC,EAGN,CAEO,IAAM,GAAa,EAAW,eAAe,CAClD,IAAK,UACP,CAAC,ECpHD,oBACE,eAEA,YACA,WACA,gBAIF,IAAQ,UAAU,GAEZ,GAAe,GAAM,QAAQ,OAAO,EAQ1C,MAAM,WAAmB,EAAsB,CAC7C,MAAQ,GAAa,KACrB,MAAQ,SAED,WAAY,CACjB,QAAS,CACP,KAAM,EACN,YAAa,GACb,UAAW,GACX,YAAa,GACb,QAAS,cACT,IAAK,GAAK,IACV,WAAY,QACd,EACA,4BAA6B,CAC3B,OAAQ,EACR,MAAO,GAAK,WACZ,OAAQ,GAAK,WACb,WAAY,aACd,EACA,qBAAsB,CACpB,MAAO,GAAK,UACd,EACA,mBAAoB,CAClB,MAAO,GAAK,SACZ,WAAY,WACd,CACF,EAEA,QAAU,CACR,GAAM,CAAE,MAAO,aAAc,KAAM,QAAS,KAAM,KAAM,CAAC,EACzD,GAAM,CACJ,KAAM,QACN,MAAO,UACP,KAAM,QACN,IAAK,EACL,IAAK,EACL,KAAM,IACR,CAAC,EACD,GAAM,CAAE,MAAO,iBAAkB,KAAM,KAAM,CAAC,CAChD,EAEQ,aAAe,GACvB,OAAS,CAAC,IAAiB,CACzB,IAAQ,MAAK,QAAO,OAAQ,KAAK,MACjC,GAAI,EAAM,OAAS,QACjB,KAAK,MAAQ,GAAM,QAAQ,EAAI,KAAK,EACpC,KAAK,MAAM,EAAI,OAAO,EAAM,KAAK,EACjC,EAAI,MAAQ,KAAK,MAAM,KAEvB,UAAK,MAAQ,GAAM,QAAQ,EAAI,KAAK,EACpC,EAAI,MAAQ,KAAK,MAAM,KAAK,UAAU,EAAG,CAAC,EAC1C,EAAM,MAAQ,OAAO,KAAK,MAAM,CAAC,EAEnC,EAAI,MAAM,QAAU,OAAO,KAAK,MAAM,CAAC,EACvC,KAAK,MAAQ,KAAK,MAAM,KACxB,KAAK,aAAe,IAGtB,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EAExB,IAAQ,MAAK,QAAO,OAAQ,KAAK,MACjC,EAAI,iBAAiB,QAAS,KAAK,MAAM,EACzC,EAAM,iBAAiB,QAAS,KAAK,MAAM,EAC3C,EAAI,iBAAiB,SAAU,KAAK,MAAM,EAG5C,MAAM,EAAG,CACP,GAAI,KAAK,aAAc,CACrB,KAAK,aAAe,GACpB,OAEF,IAAQ,MAAK,QAAO,OAAQ,KAAK,MACjC,KAAK,MAAQ,GAAM,QAAQ,KAAK,KAAK,EAErC,EAAI,MAAQ,KAAK,MAAM,KAAK,UAAU,EAAG,CAAC,EAC1C,EAAI,MAAM,QAAU,OAAO,KAAK,MAAM,CAAC,EACvC,EAAM,MAAQ,OAAO,KAAK,MAAM,CAAC,EACjC,EAAI,MAAQ,KAAK,MAAM,KAE3B,CAEO,IAAM,GAAa,GAAW,eAAe,CAClD,IAAK,WACP,CAAC,EC6CD,oBACE,eAEA,WACA,gBACA,eACA,kBACA,WACA,gBC3LF,mBAAS,gBAoFT,IAAM,EAAU,GAAS,IAAI,CAC3B,MAAO,CACL,QAAS,IACT,SAAU,QACV,IAAK,EACL,KAAM,EACN,MAAO,EACP,OAAQ,CACV,CACF,CAAC,EAEK,GAAU,CAAE,QAAS,EAAK,EAEnB,EAAY,CACvB,EACA,EACA,EAAS,SACA,CAGT,GAAI,CAFiB,EAAM,KAAK,WAAW,OAAO,EAE/B,CACjB,IAAoB,QAAd,EACc,QAAd,GAAQ,EAEd,EAAQ,MAAM,OAAS,EACvB,EAAa,CAAO,EACpB,SAAS,KAAK,OAAO,CAAO,EAE5B,IAAM,EAAkB,CAAC,IAAe,CACtC,IAAM,EAAK,EAAM,QAAU,EACrB,EAAK,EAAM,QAAU,EAC3B,GAAI,EAAS,EAAI,EAAI,CAAK,IAAM,GAC9B,EAAQ,oBAAoB,YAAa,CAAe,EACxD,EAAQ,oBAAoB,UAAW,CAAe,EACtD,EAAQ,OAAO,GAInB,EAAQ,iBAAiB,YAAa,EAAiB,EAAO,EAC9D,EAAQ,iBAAiB,UAAW,EAAiB,EAAO,EACvD,QAAI,aAAiB,WAAY,CACtC,IAAM,EAAQ,EAAM,eAAe,GAC7B,EAAU,EAAM,WAChB,EAAQ,EAAM,QACd,EAAQ,EAAM,QACd,EAAc,EAAM,OAEtB,EAAK,EACL,EAAK,EACH,EAAkB,CAAC,IAAe,CACtC,IAAM,EAAQ,CAAC,GAAG,EAAM,OAAO,EAAE,KAC/B,CAAC,IAAU,EAAM,aAAe,CAClC,EACA,GAAI,IAAU,OACZ,EAAK,EAAM,QAAU,EACrB,EAAK,EAAM,QAAU,EAEvB,GAAI,EAAM,OAAS,YACjB,EAAM,gBAAgB,EACtB,EAAM,eAAe,EAEvB,GAAI,EAAS,EAAI,EAAI,CAAK,IAAM,IAAQ,IAAU,OAChD,EAAO,oBAAoB,YAAa,CAAe,EACvD,EAAO,oBAAoB,WAAY,CAAe,EACtD,EAAO,oBAAoB,cAAe,CAAe,GAI7D,EAAO,iBAAiB,YAAa,CAAe,EACpD,EAAO,iBAAiB,WAAY,EAAiB,EAAO,EAC5D,EAAO,iBAAiB,cAAe,EAAiB,EAAO,IAItD,EAAe,CAAC,EAAW,WACtC,CAAC,GAAG,SAAS,iBAAiB,CAAQ,CAAC,EACpC,IAAI,CAAC,IAAQ,WAAW,iBAAiB,CAAG,EAAE,MAAM,CAAC,EACrD,OACC,CAAC,EAAG,IAAa,MAAM,CAAC,GAAK,OAAO,CAAC,EAAI,EAAU,EAAU,OAAO,CAAC,EACrE,CACF,EAES,EAAe,CAC1B,EACA,EAAW,WACF,CACT,EAAQ,MAAM,OAAS,OAAO,EAAa,CAAQ,EAAI,CAAC,GCoK1D,mBACE,iBACA,UACA,iBACA,gBACA,gBCxPF,oBAAS,eAA2B,gBAGpC,IAAQ,SAAS,GAEV,MAAM,UAAiB,EAAa,OAClC,QAAwB,IAAI,IAEnC,KAAO,GACP,eAA+C,SAC/C,eAA+C,SAE/C,QAAU,GAAK,QAER,WAAY,CACjB,QAAS,CACP,SAAU,OACZ,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,OAAQ,iBAAkB,gBAAgB,EAGhE,WAAa,CAAC,IAAiB,CAE7B,GADe,EAAM,QACT,QAAQ,UAAU,EAC5B,OAEF,GAAI,KAAK,KAAM,CACb,EAAa,IAAI,EACjB,IAAM,EAAI,KAAK,WACT,EAAI,KAAK,UAEf,EACE,EACA,CACE,EACA,EACA,IACqB,CAKrB,GAJA,KAAK,MAAM,KAAO,GAAG,EAAI,MACzB,KAAK,MAAM,IAAM,GAAG,EAAI,MACxB,KAAK,MAAM,MAAQ,OACnB,KAAK,MAAM,OAAS,OAChB,EAAa,OAAS,UACxB,MAAO,GAGb,IAIJ,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EAExB,EAAS,OAAO,IAAI,IAAI,EACxB,IAAM,EAAU,CAAE,QAAS,EAAK,EAChC,KAAK,iBAAiB,aAAc,KAAK,WAAY,CAAO,EAC5D,KAAK,iBAAiB,YAAa,KAAK,WAAY,CAAO,EAC3D,EAAa,IAAI,EAGnB,oBAAoB,EAAS,CAC3B,MAAM,qBAAqB,EAE3B,EAAS,OAAO,OAAO,IAAI,EAE/B,CAEO,IAAM,GAAW,EAAS,eAAe,CAC9C,IAAK,WACP,CAAC,EAED,OAAO,iBACL,SACA,IAAM,CACJ,MAAM,KAAK,EAAS,MAAM,EAAE,QAAQ,CAAC,IAAoB,CACvD,GAAI,EAAM,iBAAmB,OAC3B,EAAM,OAAS,GACV,QAAI,EAAM,iBAAmB,SAClC,EAAM,OAAO,EAEhB,GAEH,CAAE,QAAS,EAAK,CAClB,EAEA,SAAS,iBACP,SACA,CAAC,IAAiB,CAChB,GACE,EAAM,kBAAkB,aACxB,EAAM,OAAO,QAAQ,EAAS,OAAiB,EAE/C,OAEF,MAAM,KAAK,EAAS,MAAM,EAAE,QAAQ,CAAC,IAAoB,CACvD,GAAI,EAAM,iBAAmB,OAC3B,EAAM,OAAS,GACV,QAAI,EAAM,iBAAmB,SAClC,EAAM,OAAO,EAEhB,GAEH,CAAE,QAAS,GAAM,QAAS,EAAK,CACjC,EC4EO,IAAM,GAAW,CAAC,IAAuC,CAC9D,IACE,UACA,SACA,WACA,iBACA,iBACA,aACE,EACE,EAAQ,MAAM,QAAQ,CAAO,EAC/B,GAAS,GAAG,CAAO,EACnB,GAAS,CAAO,EAUpB,GARA,GACE,EACA,EACA,EACA,EACA,EACA,CACF,EACI,EAAQ,MACV,EAAM,aAAa,QAAS,EAAQ,KAAK,EAG3C,OADA,SAAS,KAAK,OAAO,CAAK,EACnB,GAGI,GAAgB,CAC3B,EACA,EACA,EACA,EACA,EACA,EAAY,KACH,CACT,CACE,IAAQ,YAAa,iBAAiB,CAAO,EAC7C,GAAI,IAAa,QACf,EAAQ,MAAM,SAAW,QAE3B,GAAI,EAAgB,EAAQ,eAAiB,EAC7C,GAAI,EAAgB,EAAQ,eAAiB,EAC7C,EAAa,CAAO,CACtB,CACA,EAAQ,KAAO,EACf,IAAQ,OAAM,MAAK,QAAO,UAAW,EAAO,sBAAsB,EAC5D,EAAK,EAAO,EAAQ,IACpB,EAAK,EAAM,EAAS,IACpB,EAAI,OAAO,WACX,EAAI,OAAO,YACjB,GAAI,IAAa,OACf,GAAa,EAAK,EAAI,IAAM,IAAM,MAC/B,EAAK,EAAI,IAAM,IAAM,KACnB,QAAI,IAAa,QAAU,IAAa,OAC7C,GAAa,EAAK,EAAI,IAAM,IAAM,MAC/B,EAAK,EAAI,IAAM,IAAM,KAQ1B,GANA,EAAQ,MAAM,IACZ,EAAQ,MAAM,KACd,EAAQ,MAAM,MACd,EAAQ,MAAM,OACd,EAAQ,MAAM,UACZ,GACA,EAAS,SAAW,EAAG,CACzB,IAAO,EAAO,IAAU,EACxB,OAAQ,OACD,IACH,EAAQ,MAAM,QAAU,EAAI,GAAK,QAAQ,CAAC,EAAI,KAC9C,UACG,IACH,EAAQ,MAAM,MAAQ,EAAO,GAAO,QAAQ,CAAC,EAAI,KACjD,UACG,IACH,EAAQ,MAAM,KAAO,EAAM,GAAQ,QAAQ,CAAC,EAAI,KAChD,UACG,IACH,EAAQ,MAAM,OAAS,EAAI,GAAM,QAAQ,CAAC,EAAI,KAC9C,MAGJ,OAAQ,QACD,IACH,EAAQ,MAAM,QAAU,EAAI,EAAM,GAAQ,QAAQ,CAAC,EAAI,KACvD,UACG,IACH,EAAQ,MAAM,KAAO,EAAK,QAAQ,CAAC,EAAI,KACvC,UACG,IACH,EAAQ,MAAM,IAAM,EAAI,QAAQ,CAAC,EAAI,KACrC,UACG,IACH,EAAQ,MAAM,OAAS,EAAI,EAAO,GAAO,QAAQ,CAAC,EAAI,KACtD,MAEJ,EAAQ,MAAM,UAAY,GACrB,QAAI,IAAa,IACtB,EAAQ,MAAM,QAAU,EAAI,GAAK,QAAQ,CAAC,EAAI,KAC9C,EAAQ,MAAM,KAAO,EAAG,QAAQ,CAAC,EAAI,KACrC,EAAQ,MAAM,UAAY,mBACrB,QAAI,IAAa,IACtB,EAAQ,MAAM,KAAO,EAAM,GAAQ,QAAQ,CAAC,EAAI,KAChD,EAAQ,MAAM,KAAO,EAAG,QAAQ,CAAC,EAAI,KACrC,EAAQ,MAAM,UAAY,mBACrB,QAAI,IAAa,IACtB,EAAQ,MAAM,MAAQ,EAAO,GAAO,QAAQ,CAAC,EAAI,KACjD,EAAQ,MAAM,IAAM,EAAG,QAAQ,CAAC,EAAI,KACpC,EAAQ,MAAM,UAAY,mBACrB,QAAI,IAAa,IACtB,EAAQ,MAAM,OAAS,EAAI,GAAM,QAAQ,CAAC,EAAI,KAC9C,EAAQ,MAAM,IAAM,EAAG,QAAQ,CAAC,EAAI,KACpC,EAAQ,MAAM,UAAY,mBAE5B,EAAQ,MAAM,YACZ,eACA,gBAAgB,EAAQ,MAAM,KAAO,EAAQ,MAAM,SACrD,EACA,EAAQ,MAAM,YACZ,cACA,gBAAgB,EAAQ,MAAM,MAAQ,EAAQ,MAAM,QACtD,GCjKF,oBACE,WACA,eACA,eACA,cACA,gBCvIK,SAAS,EAAa,CAC3B,EACA,EAAiC,GAChB,CACjB,MAAO,CAAC,EAAQ,IAAW,CACzB,IAAM,EAAQ,EAAa,CAAC,EACtB,EAAQ,EAAa,CAAC,EAC5B,QAAW,KAAK,EACd,GAAI,EAAM,KAAO,EAAM,GAIrB,OAHoB,MAAM,QAAQ,CAAS,EACvC,EAAU,KAAO,GACjB,GAEA,EAAM,GAAK,EAAM,GACf,EACA,GACF,EAAM,GAAK,EAAM,GACjB,GACA,EAGR,MAAO,ICwCX,oBACE,eAGA,WACA,cACA,gBAMF,IAAQ,UAAQ,QAAM,UAAU,GAoB1B,GAAW,CAAC,EAAwB,IAA2B,CACnE,MAAO,CAAC,CAAC,EAAQ,KAAK,CAAC,IAAW,CAChC,GAAI,IAAW,MAAQ,GAAS,KAC9B,MAAO,GACF,QAAI,MAAM,QAAQ,CAAM,EAC7B,OAAO,GAAS,EAAQ,CAAK,EACxB,QAAK,EAAwB,QAAU,GAAS,IAAW,EAChE,MAAO,GAEV,GAQI,MAAM,UAAkB,EAAuB,CACpD,SAAW,GACX,SAAW,GACX,YAAc,GACd,QAAkC,GAClC,MAAQ,GACR,YAAc,GACd,OAAS,GACT,UAAY,GACZ,SAAW,GAEH,SAAW,CAAC,EAAe,EAAgB,KAAU,CAC3D,GAAI,KAAK,QAAU,EACjB,KAAK,MAAQ,EAEf,GAAI,EACF,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,GAIlC,SAAW,IAAM,KAAK,SAE1B,cAAa,EAAkB,CACjC,OAAO,OAAO,KAAK,UAAY,SAC3B,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,IAAW,EAAO,KAAK,GAAK,IAAI,EAC7D,KAAK,QAGH,oBAAsB,CAC5B,IACa,CACb,GAAI,IAAW,KACb,OAAO,KAET,IAAQ,WAAU,YAAa,KAC3B,EACA,EACA,EACJ,GAAI,OAAO,IAAW,SACpB,EAAU,EAAQ,EAEjB,KAAC,CAAE,OAAM,UAAS,OAAM,EAAI,GAE/B,GAAI,KAAK,UACP,EAAU,EAAS,CAAO,EAE5B,IAAQ,WAAY,EACpB,GAAI,EACF,MAAO,CACL,OACA,UACA,QAAS,IAAM,GAAS,EAAS,EAAS,CAAC,EAC3C,UAAW,EAAQ,IAAI,KAAK,mBAAmB,CACjD,EAEF,MAAO,CACL,OACA,UACA,QAAS,IAAM,EAAS,IAAM,EAC9B,OACE,OAAO,IAAU,WACb,SAAY,CACV,IAAM,EAAW,MAAO,EAAwB,EAChD,GAAI,IAAa,OACf,EAAS,EAAU,EAAI,GAG3B,IAAM,CACJ,GAAI,OAAO,IAAU,SACnB,EAAS,EAAO,EAAI,EAGhC,MAGE,YAAW,EAAe,CAC5B,IAAM,EAAU,KAAK,cAAc,IAAI,KAAK,mBAAmB,EAC/D,GAAI,KAAK,SAAW,GAClB,OAAO,EAET,IAAM,EAAa,CAAC,IAAqB,CACvC,GAAI,IAAW,KACb,MAAO,GACF,QAAK,EAAmB,UAI7B,OAHE,EAAmB,UAAa,EAAmB,UAAU,OAC7D,CACF,EACQ,EAAmB,UAAU,OAAS,EAE9C,YAAO,EAAO,QAAQ,kBAAkB,EAAE,SAAS,KAAK,MAAM,GAGlE,OAAO,EAAQ,OAAO,CAAU,EAGlC,aAAe,CAAC,IAAiB,CAC/B,IAAQ,SAAU,KAAK,MACjB,EAAW,EAAM,OAAS,GAChC,GAAI,KAAK,QAAU,OAAO,CAAQ,EAChC,KAAK,MAAQ,EACb,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,EAExC,KAAK,OAAS,GACd,EAAM,gBAAgB,EACtB,EAAM,eAAe,GAGvB,UAAY,CAAC,IAAyB,CACpC,GAAI,EAAM,MAAQ,QAChB,EAAM,eAAe,GAIzB,WAAa,GAAS,IAAM,CAC1B,KAAK,OACH,KAAK,MAAM,MACX,MAAM,kBAAkB,EAC1B,EAAe,CAAC,EAChB,KAAK,WAAW,EACjB,EAED,WAAa,CAAC,IAAkB,CAC9B,GAAI,GAAS,EAAM,OAAS,QAC1B,KAAK,OAAS,GAEhB,KAAK,cAAgB,KAAK,YAC1B,EAAQ,CACN,OAAQ,KACR,UAAW,KAAK,cAChB,YAAa,EACf,CAAC,GAEH,QAAU,IAAM,CACd,GACE,CACE,KAAM,SACN,QAAS,KAAK,UAChB,EACA,GAAK,EACL,GAAM,CACJ,KAAM,QACN,MAAO,KAAK,MACZ,SAAU,EACV,UAAW,KAAK,UAChB,QAAS,KAAK,WACd,SAAU,KAAK,YACjB,CAAC,EACD,EAAM,YAAY,CACpB,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eACH,UACA,WACA,cACA,WACA,cACA,YACA,UACF,KAGE,WAAU,EAAmB,CAC/B,IAAM,EAAsB,CAAC,EAE7B,SAAS,CAAO,CAAC,EAA2B,CAC1C,QAAW,KAAU,EACnB,GAAI,OAAO,IAAW,SACpB,EAAI,KAAK,CAAE,QAAS,EAAQ,MAAO,CAAO,CAAC,EACtC,QAAK,GAAyB,MACnC,EAAI,KAAK,CAAsB,EAC1B,QAAK,GAAgC,QAC1C,EAAS,EAA+B,OAAO,EAMrD,OADA,EAAQ,KAAK,aAAa,EACnB,EAET,UAAU,EAAiB,CAEzB,OADc,KAAK,WAAW,KAAK,CAAC,IAAW,EAAO,QAAU,KAAK,KAAK,GAC1D,CAAE,QAAS,KAAK,MAAO,MAAO,KAAK,KAAM,EAG3D,cAAgB,IAAM,CACpB,KAAK,YAAY,GAGnB,iBAAiB,EAAG,CAGlB,GAFA,MAAM,kBAAkB,EAEpB,KAAK,UACP,EAAa,aAAa,IAAI,IAAI,EAItC,oBAAoB,EAAG,CAGrB,GAFA,MAAM,qBAAqB,EAEvB,KAAK,UACP,EAAa,aAAa,OAAO,IAAI,EAIzC,MAAM,EAAS,CACb,MAAM,OAAO,EAEb,IAAQ,QAAO,UAAW,KAAK,MAC/B,EAAO,SAAW,KAAK,SACvB,IAAM,EAAO,EAAM,uBAEb,EAAS,KAAK,WAAW,EAC3B,EAAmB,GAAK,EAE5B,GADA,EAAM,MAAQ,KAAK,UAAY,EAAS,EAAO,OAAO,EAAI,EAAO,QAC7D,EAAO,KACT,GAAI,EAAO,gBAAgB,YACzB,EAAU,EAAO,KAAK,UAAU,EAAI,EAEpC,OAAU,EAAM,EAAO,MAAM,EAGjC,EAAK,YAAY,CAAO,EACxB,EAAM,aACJ,cACA,KAAK,UAAY,EAAS,KAAK,WAAW,EAAI,KAAK,WACrD,EACA,EAAM,MAAM,cAAgB,KAAK,SAAW,GAAK,OACjD,EAAM,SAAW,CAAC,KAAK,SAE3B,CAEO,IAAM,EAAY,EAAU,eAAe,CAChD,IAAK,aACL,UAAW,CACT,QAAS,CACP,QAAS,MACT,eAAgB,OAChB,YAAa,QACb,kBAAmB,QACnB,eAAgB,OAChB,eAAgB,QAChB,QAAS,cACT,SAAU,UACZ,EACA,eAAgB,CACd,QAAS,OACT,WAAY,SACZ,aAAc,SACd,IAAK,EAAK,IACV,UAAW,OACX,OAAQ,EAAK,UACb,QAAS,EAAK,QACd,SAAU,WACV,MAAO,MACT,EACA,+CAAgD,CAC9C,QAAS,MACX,EACA,6CAA8C,CAC5C,QAAS,MACX,EACA,uBAAwB,CACtB,MAAO,EAAK,WACZ,QAAS,EAAK,aACd,OAAQ,EAAK,UACb,WAAY,EAAK,UACjB,UAAW,OACX,WAAY,SACZ,QAAS,OACT,WAAY,cACZ,KAAM,GACR,EACA,mCAAoC,CAClC,SAAU,SACV,aAAc,WACd,WAAY,aACd,CACF,CACF,CAAC,EF1OD,IAAQ,SAAS,IAEF,QAAS,GAAK,CAC3B,KAAM,CACJ,OAAQ,OAAO,UAAU,SACzB,QAAS,CAAC,OAAO,UAAU,QAAQ,EACnC,UAAW,CAAC,OAAO,UAAU,QAAQ,EACrC,MAAO,CAAC,EAAE,EACV,UAAW,CAAC,EACZ,cAAe,CACb,CACE,KAAM,GAAK,EACX,QAAS,OAAO,UAAU,SAC1B,MAAO,OAAO,UAAU,QAC1B,CACF,CACF,CACF,CAAC,EAED,GAAS,cAAgB,CACvB,KAAK,CAAC,EAAQ,EAAS,CACrB,GAAI,aAAkB,EACpB,EAAO,QAAU,EAGvB,EAEO,IAAM,GAAY,CAAC,IAAqB,CAC7C,GAAI,EAAK,QAAQ,SAAS,SAAS,CAAQ,EACzC,EAAK,OAAO,SAAW,EAEvB,aAAQ,MAAM,YAAY,oBAA2B,GAI5C,GAAkB,IAAM,CACnC,IAAM,EAAa,MAAM,KAAK,EAAa,YAAY,EACvD,QAAW,KAAa,EACtB,EAAU,cAAc,GAK5B,GAAQ,EAAK,OAAO,QAAS,EAAe,EAE5C,IAAM,GAAc,GAAW,CAAC,IAAgC,CAC9D,EAAO,QAAQ,kBAAkB,CACnC,CAAC,EAEM,SAAS,EAAgB,CAAC,EAA0B,CACzD,IAAO,GAAW,EAAW,KAAU,GAAW,EAC/C,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,IAAS,EAAK,MAAM,IAAI,CAAC,EACjC,GAAI,GAAW,GAAa,GAAS,EAAS,CAoB5C,GAnBA,EAAK,QAAQ,SAAW,EACxB,EAAK,UAAU,SAAW,EAC1B,EAAK,MAAM,SAAW,EACtB,EAAK,UAAU,SAAW,EAAQ,OAChC,CAAC,EAAqB,IAAsB,CAE1C,OADA,EAAI,EAAQ,GAAG,kBAAkB,GAAK,EAC/B,GAET,CAAC,CACH,EACA,EAAK,cAAc,SAAW,EAC3B,IAAI,CAAC,EAAQ,KAAW,CACvB,KAAM,GAAK,CAAE,MAAO,EAAQ,EAAO,EAAG,EAAM,EAAM,EAClD,QAAS,EAAU,GACnB,MAAO,CACT,EAAE,EACD,KAAK,EAAW,EAGf,CAAC,EAAK,QAAQ,SAAS,SAAS,EAAK,OAAO,QAAQ,EAAG,CACzD,IAAM,EAAW,EAAK,OAAO,UAAU,EAAG,CAAC,EAC3C,EAAK,OAAO,SACV,EAAK,QAAQ,SAAS,KACpB,CAAC,IAAmB,EAAO,UAAU,EAAG,CAAC,IAAM,CACjD,GAAK,EAAK,QAAQ,SAAS,GAE/B,GAAgB,GAIb,SAAS,CAAQ,CAAC,EAAqB,CAC5C,GAAI,EAAI,SAAS,GAAE,EACjB,OAAO,EAAS,EAAI,UAAU,EAAG,EAAI,OAAS,CAAC,CAAC,EAAI,IAEtD,IAAM,EAAQ,EAAK,QAAQ,SAAS,QAAQ,EAAK,OAAO,QAAQ,EAChE,GAAI,EAAQ,GAAI,CACd,IAAM,EAAM,EAAK,UAAU,EAAI,kBAAkB,GAC3C,EAAY,EAAI,UAAY,EAAI,GACtC,GAAI,EACF,EACE,EAAI,kBAAkB,IAAM,EACxB,EAAU,kBAAkB,EAC5B,EAAU,UAGpB,OAAO,EAGF,MAAM,WAAqB,EAAU,CAC1C,YAAc,GAEd,QAAU,IAAM,CACd,OAAO,EAAU,CACf,KAAM,SACN,SAAU,GACV,MAAO,EAAS,UAAU,EAC1B,UAAW,EAAK,OAChB,kBAAmB,EAAK,aAC1B,CAAC,GAGH,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,aAAa,EAGnC,MAAM,EAAS,CACb,MAAM,OAAO,EAEb,KAAK,MAAM,OAAO,gBAAgB,eAAgB,KAAK,WAAW,EAEtE,CAEO,IAAM,GAAe,GAAa,eAAe,CACtD,IAAK,mBACP,CAAC,EAQM,MAAM,UAAqB,EAAU,OACnC,cAAe,IAAI,IAE1B,SAAW,IAAM,GAAS,QAAQ,EAElC,UAAY,GAEZ,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,WAAW,EAGjC,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EAExB,EAAa,aAAa,IAAI,IAAoC,EAGpE,oBAAoB,EAAS,CAC3B,MAAM,qBAAqB,EAE3B,EAAa,aAAa,OAAO,IAAoC,EAGvE,aAAa,EAAG,CACd,GAAI,CAAC,KAAK,UACR,KAAK,UAAY,KAAK,aAAe,GAEvC,KAAK,YAAc,KAAK,UAAY,EAAS,KAAK,SAAS,EAAI,GAGjE,MAAM,EAAG,CACP,MAAM,OAAO,EAEb,KAAK,cAAc,EAEvB,CAEO,IAAM,EAAe,EAAa,eAAe,CACtD,IAAK,gBACL,UAAW,CACT,QAAS,CACP,cAAe,MACjB,CACF,CACF,CAAC,EGrbM,IAAM,GAAgB,CAC3B,EACA,IACY,CACZ,EAAW,EAAS,kBAAkB,EACtC,IAAM,EAAU,CAAC,CAAC,EAAS,MAAM,SAAS,EACpC,EAAU,CAAC,CAAC,EAAS,MAAM,QAAO,EAClC,EAAS,CAAC,CAAC,EAAS,MAAM,gBAAe,EACzC,EAAW,CAAC,CAAC,EAAS,MAAM,SAAQ,EACpC,EAAU,EAAS,MAAM,EAAE,EAEjC,OACE,EAAU,MAAQ,GAClB,EAAU,UAAY,GACtB,EAAU,UAAY,GACtB,EAAU,SAAW,GACrB,EAAU,WAAa,GN0V3B,IAAQ,OAAK,UAAQ,OAAM,KAAG,YAAY,GAE1C,GAAW,kBAAmB,CAC5B,YAAa,CACX,SAAU,cACV,UAAW,QAAQ,GAAK,eAAe,EAAW,UAAU,KAAK,KACjE,aAAc,GAAK,UACnB,WAAY,EAAW,OAAO,SAAS,EACvC,UAAW,EAAW,WACpB,GAAG,GAAK,aAAa,GAAK,aAAa,GAAK,eAC9C,CACF,EACA,kBAAmB,CACjB,MAAO,EAAW,UAAU,MAAM,CACpC,EACA,oBAAqB,CACnB,YAAa,EACb,aAAc,EACd,SAAU,EAAW,UAAU,MAAM,CACvC,EACA,sBAAuB,CACrB,QAAS,eACT,QAAS,IACT,OAAQ,MACR,MAAO,OACP,WAAY,EAAW,mBAAmB,OAAO,EACjD,OAAQ,EAAW,oBAAoB,OAAO,CAChD,EACA,iBAAkB,CAChB,UAAW,OACX,OAAQ,kBACR,QAAS,OACT,WAAY,SACZ,eAAgB,aAChB,eAAgB,OAChB,oBAAqB,eACrB,MAAO,OACP,IAAK,EACL,WAAY,cACZ,QAAS,EAAW,gBAAgB,QAAQ,EAC5C,OAAQ,EAAW,eAAe,MAAM,EACxC,WAAY,EAAW,eAAe,MAAM,EAC5C,UAAW,MACb,EACA,wCAAyC,CACvC,MAAO,EAAW,cAAc,MAAM,CACxC,EACA,sCAAuC,CACrC,oBAAqB,eACvB,EACA,qBAAsB,CACpB,OAAQ,EAAW,kBAAkB,MAAM,CAC7C,EACA,uCAAwC,CACtC,WAAY,EAAW,gBAAgB,MAAM,CAC/C,EACA,qCAAsC,CACpC,WAAY,SACZ,SAAU,SACV,aAAc,WACd,UAAW,MACb,EACA,uBAAwB,CAEtB,UAAW,kBACX,WAAY,EAAW,gBAAgB,MAAM,CAC/C,EACA,wBAAyB,CAEvB,UAAW,kBACX,WAAY,EAAW,iBAAiB,MAAM,EAC9C,MAAO,EAAW,oBAAoB,MAAM,CAC9C,EACA,4BAA6B,CAC3B,OAAQ,EAAW,wBAAwB,MAAM,CACnD,CACF,CAAC,EAEM,IAAM,GAAmB,CAC9B,EACA,IACgB,CAChB,IAAM,EAAW,EAAK,SAAW,EAAK,QAAQ,GAAK,SAAY,GAC3D,EAAO,GAAM,MAAQ,GAAW,EAAK,GAAG,EAC5C,GAAI,OAAO,IAAS,SAClB,EAAO,EAAM,GAAM,EAErB,IAAI,EACJ,GAAI,OAAO,GAAM,SAAW,SAC1B,EAAW,GACT,CACE,MAAO,gBACP,KAAM,EAAK,MACb,EACA,EACA,EAAQ,UAAY,EAAK,EAAS,EAAK,OAAO,CAAC,EAAI,EAAK,EAAK,OAAO,EACpE,EAAK,EAAK,UAAY,GAAG,CAC3B,EAEA,OAAW,GACT,CACE,MAAO,gBACP,QAAS,EAAK,MAChB,EACA,EACA,EAAQ,UAAY,EAAK,EAAS,EAAK,OAAO,CAAC,EAAI,EAAK,EAAK,OAAO,EACpE,EAAK,EAAK,UAAY,GAAG,CAC3B,EAGF,GADA,EAAS,UAAU,OAAO,wBAAyB,IAAY,EAAK,EAChE,GAAM,SAAW,CAAC,EAAK,QAAQ,EACjC,EAAS,aAAa,WAAY,EAAE,EAEtC,OAAO,GAGI,GAAgB,CAC3B,EACA,IACgB,CAChB,IAAM,EAAW,EAAK,SAAW,EAAK,QAAQ,GAAK,SAAY,GAC3D,EAAO,GAAM,MAAQ,GAAW,EAAK,GAAG,EAC5C,GAAI,OAAO,IAAS,SAClB,EAAO,EAAM,GAAM,EAErB,IAAM,EAAc,GAClB,CACE,MAAO,gBACP,SAAU,EAAE,CAAC,EAAK,SAAW,EAAK,QAAQ,GAC1C,OAAO,CAAC,EAAc,CACpB,EACE,OAAO,OAAO,CAAC,EAAG,EAAS,CACzB,UAAW,EAAK,UAChB,OAAQ,EACR,cAAe,EAAQ,cAAgB,GAAK,EAC5C,SAAU,MACZ,CAAC,CACH,EACA,EAAM,gBAAgB,EACtB,EAAM,eAAe,EAEzB,EACA,EACA,EAAQ,UAAY,EAAK,EAAS,EAAK,OAAO,CAAC,EAAI,EAAK,EAAK,OAAO,EACpE,EAAM,aAAa,CAAE,MAAO,CAAE,YAAa,UAAW,CAAE,CAAC,CAC3D,EACA,OAAO,GAGI,GAAiB,CAC5B,EACA,IACgB,CAChB,GAAI,IAAS,KACX,OAAO,EAAK,CAAE,MAAO,oBAAqB,CAAC,EACtC,KACL,IAAM,EAAe,GAAqB,OACtC,GAAiB,EAAoB,CAAO,EAC5C,GAAc,EAAiB,CAAO,EAC1C,GAAI,EAAQ,aAAe,EAAK,SAAW,EAAK,QAAQ,EACtD,sBAAsB,IAAM,CAC1B,EAAY,eAAe,CAAE,MAAO,QAAS,CAAC,EAC/C,EAEH,OAAO,IAIE,GAAO,CAAC,IAA4C,CAC/D,IAAQ,SAAQ,QAAO,aAAc,EAC/B,EAAW,EAAU,KACzB,CAAC,IAAS,GAAM,MAAS,GAAqB,OAChD,EACA,OAAO,GACL,CACE,MAAO,EAAW,+BAAiC,WACnD,OAAO,EAAG,CACR,EAAe,CAAC,EAEpB,EACA,GACE,CACE,MAAO,CACL,SAAU,EAAO,YAAc,KAC/B,MAAO,OAAO,IAAU,SAAW,GAAG,MAAY,CACpD,EACA,WAAW,CAAC,EAAc,CACxB,EAAM,eAAe,EACrB,EAAM,gBAAgB,EAE1B,EACA,GAAG,EAAU,IAAI,CAAC,IAAS,GAAe,EAAM,CAAO,CAAC,CAC1D,CACF,GAOE,GACE,EAA4B,CAAC,EAEtB,EAAiB,CAAC,EAAQ,IAA8B,CACnE,IAAM,EAAc,EAAY,OAAO,CAAK,EAC5C,QAAW,KAAU,EACnB,EAAO,KAAK,OAAO,EAGrB,OADA,GAAa,EAAY,GAClB,EAAQ,EAAI,EAAY,EAAQ,GAAK,QAc9C,SAAS,KAAK,iBAAiB,YAAa,CAAC,IAAiB,CAC5D,GACE,EAAM,QACN,CAAC,EAAY,KAAK,CAAC,IAAW,EAAO,OAAO,SAAS,EAAM,MAAc,CAAC,EAE1E,EAAe,CAAC,EAEnB,EACD,SAAS,KAAK,iBAAiB,UAAW,CAAC,IAAyB,CAClE,GAAI,EAAM,MAAQ,SAChB,EAAe,CAAC,EAEnB,EAEM,IAAM,EAAU,CAAC,IAAkC,CACxD,EAAU,OAAO,OAAO,CAAE,aAAc,CAAE,EAAG,CAAO,EACpD,IAAQ,SAAQ,WAAU,gBAAiB,EAC3C,GAAI,IAAc,CAAC,SAAS,KAAK,SAAS,IAAY,IAAI,EACxD,GAAa,OAEf,GAAI,EAAY,QAAU,CAAC,SAAS,KAAK,SAAS,EAAY,GAAG,IAAI,EACnE,EAAY,OAAO,CAAC,EAEtB,GAAI,IAAiB,GAAK,IAAY,SAAW,EAAQ,OACzD,IAAM,EAAS,EAAe,CAAY,EAC1C,GAAI,IAAY,SAAW,EAAQ,OACnC,GAAI,GAAU,EAAO,SAAW,EAAQ,CACtC,EAAe,EACf,OAGF,GAAI,CAAC,EAAQ,WAAW,OACtB,OAEF,IAAM,EAAU,GAAK,CAAO,EACtB,EAAQ,GAAS,CACrB,UACA,SACA,UACF,CAAC,EACD,EAAM,eAAiB,SACvB,EAAY,KAAK,CACf,SACA,KAAM,CACR,CAAC,GAGH,SAAS,EAAkB,CACzB,EACA,EACwB,CACxB,QAAW,KAAQ,EAAO,CACxB,GAAI,CAAC,EAAM,SACX,IAAQ,YAAa,GACb,aAAc,EAEtB,GAAI,GACF,GAAI,GAAc,EAAO,CAAQ,EAC/B,OAAO,EAEJ,QAAI,EAAW,CACpB,IAAM,EAAc,GAAmB,EAAW,CAAK,EACvD,GAAI,EACF,OAAO,GAIb,OAQK,MAAM,WAAgB,EAAwB,CACnD,UAAwB,CAAC,EACzB,UAAY,OACZ,UAAY,GAEZ,SAAW,CAAC,IAAiB,CAC3B,GAAI,EAAM,OAAS,SAAY,EAAwB,OAAS,QAC9D,EAAQ,CACN,OAAQ,KAAK,MAAM,QACnB,MAAO,KAAK,UACZ,UAAW,KAAK,UAChB,UAAW,KAAK,SAClB,CAAC,EACD,EAAM,gBAAgB,EACtB,EAAM,eAAe,GAIzB,QAAU,IACR,GAAO,CAAE,SAAU,EAAG,KAAM,UAAW,QAAS,KAAK,QAAS,EAAG,GAAQ,CAAC,EAE5E,eAAiB,MAAO,IAAyB,CAC/C,IAAM,EAAa,GAAmB,KAAK,UAAW,CAAK,EAC3D,GAAI,GACF,GAAI,EAAW,kBAAkB,SAC/B,EAAW,OAAO,IAKxB,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,YAAa,YAAa,MAAM,EAEpD,KAAK,iBAAiB,UAAW,KAAK,QAAQ,EAGhD,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EACxB,SAAS,iBAAiB,UAAW,KAAK,eAAgB,EAAI,EAGhE,oBAAoB,EAAS,CAC3B,MAAM,qBAAqB,EAE3B,SAAS,oBAAoB,UAAW,KAAK,cAAc,EAE/D,CAEO,IAAM,GAAU,GAAQ,eAAe,CAC5C,IAAK,WACL,UAAW,CACT,QAAS,CACP,QAAS,cACX,EACA,0BAA2B,CACzB,QAAS,OACT,WAAY,SACZ,IAAK,EAAW,kBAAkB,MAAM,CAC1C,CACF,CACF,CAAC,uDOrbD,IAAM,GAAiB,IAAM,CAAC,CAAC,SAAS,cAAc,cAAc,EAE9D,GAAgB,CACpB,EACA,IACG,CACH,GAAI,CAAC,EACH,MAAO,GAET,QAAW,KAAe,EACxB,GAAI,IAAgB,cAClB,MAAO,GACF,QAAI,EAAY,QAAQ,GAAG,EAAI,GAAI,CACxC,IAAO,EAAG,GAAK,EAAY,MAAM,GAAG,GAC7B,EAAG,GAAK,EAAK,MAAM,GAAG,EAC7B,IAAK,IAAM,KAAO,IAAM,KAAO,IAAM,KAAO,IAAM,GAChD,MAAO,GAGT,QAAI,IAAgB,EAClB,MAAO,IAMT,GAAc,CAAC,IAAsB,CACzC,QAAW,IAAO,CAAC,GAAG,SAAS,iBAAiB,IAAI,GAAW,CAAC,EAC9D,EAAI,UAAU,OAAO,CAAS,GAG5B,GAAM,IAAM,CAChB,GAAY,WAAW,EACvB,GAAY,aAAa,EACzB,GAAY,aAAa,GAGrB,GAAgB,CAAC,EAAuB,EAAY,MAAkB,CAC1E,OAAQ,GAAK,IACV,MAAM,CAAS,EACf,IAAI,CAAC,IAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,IAAM,IAAM,EAAE,GAGrB,GAAgB,CAAC,IAAyC,CAC9D,GAAI,CAAC,EAAO,EAAQ,CAAC,EACrB,IAAM,EAAW,CACf,GAAG,SAAS,iBAAiB,aAAa,CAC5C,EACA,QAAW,KAAW,EAAU,CAC9B,IAAM,EAAY,GAAc,EAAQ,QAAQ,IAAI,EACpD,GAAI,EAAM,KAAK,CAAC,IAAS,GAAc,EAAW,CAAI,CAAC,EACrD,EAAQ,UAAU,IAAI,aAAa,EAEnC,OAAQ,UAAU,OAAO,aAAa,IAK5C,SAAS,EAAK,CAAC,EAAgB,CAC7B,IAAM,EAAU,EAAI,QAAwB,QAC1C,4BACF,EACA,GAAI,CAAC,EACH,OAEF,EAAO,UAAU,IAAI,aAAa,EAClC,IAAM,EAAQ,EAAO,QAAQ,oBAAoB,EAC7C,GAAc,EAAO,QAAQ,MAAQ,WAAW,EAChD,GAAc,EAAO,QAAQ,MAAQ,KAAK,EAC9C,QAAW,KAAQ,EAAO,CACxB,IAAM,EACJ,EAAO,QAAQ,cACd,IAAS,YAAc,EAAO,UAAY,EAAO,aACpD,EAAI,cAAc,QAAQ,EAAM,GAAW,EAAE,EAE/C,GAAc,EAAI,cAAc,KAAK,EACrC,EAAI,gBAAgB,EAGtB,SAAS,EAAI,CAAC,EAAgB,CAC5B,GAAI,CAAC,GAAe,EAClB,GAAc,EAAI,cAAc,KAAK,EAEvC,IAAM,EAAU,EAAI,OAAuB,QAAQ,cAAc,EACjE,GAAI,GAAU,EAAI,aAChB,EAAO,UAAU,IAAI,WAAW,EAChC,EAAI,aAAa,WAAa,OAE9B,OAAI,eAAe,EACnB,EAAI,gBAAgB,EAIxB,SAAS,EAAK,EAAG,CACf,GAAY,WAAW,EAGzB,SAAS,EAAI,CAAC,EAAgB,CAC5B,IAAM,EAAU,EAAI,OAAuB,QACzC,cACF,EACA,GAAI,EAAQ,CACV,IAAM,GAAa,EAAO,SAAS,MAAQ,IAAI,MAAM,GAAG,EACxD,QAAW,KAAQ,EACjB,GAAI,GAAc,EAAI,cAAc,MAAO,CAAI,EAC7C,GAAI,IAAS,YACX,EAAO,UAAY,EAAI,cAAc,QAAQ,CAAI,GAAK,GAEtD,OAAO,YAAc,EAAI,cAAc,QAAQ,CAAI,GAAK,GAKhE,GAAI,EAGC,IAAM,GAAiB,IAAM,SAAS,cAAc,cAAc,EAErE,GAAgB,GAEP,GAAO,IAAM,CACxB,GAAI,GACF,OAGF,SAAS,KAAK,iBAAiB,YAAa,EAAK,EACjD,SAAS,KAAK,iBAAiB,YAAa,EAAI,EAChD,SAAS,KAAK,iBAAiB,WAAY,EAAI,EAC/C,SAAS,KAAK,iBAAiB,OAAQ,EAAI,EAC3C,SAAS,KAAK,iBAAiB,YAAa,EAAK,EACjD,SAAS,KAAK,iBAAiB,UAAW,EAAG,EAG7C,OAAO,iBAAiB,WAAY,CAAC,IAAQ,EAAI,eAAe,CAAC,EACjE,OAAO,iBAAiB,OAAQ,CAAC,IAAQ,EAAI,eAAe,CAAC,EAE7D,GAAgB,ITzOlB,SAAS,EAAY,CACnB,EACA,EACA,EACkB,CAClB,IAAM,EAAU,EAAM,KACpB,CAAC,IAAS,EAAK,KAAU,QAAa,EAAK,KAAU,IACvD,EACA,GAAI,IAAY,OAAW,CACzB,IAAM,EAAQ,EAAQ,GACtB,OAAQ,OAAO,OACR,SACH,GAAI,EAAM,MAAM,eAAe,EAC7B,MAAO,GAAI,EACN,QAAI,EAAM,SAAS,GAAG,EAC3B,MAAO,IAAK,EAEZ,WAAO,IAAK,MAEX,SACH,MAAO,GAAI,MACR,UACH,MAAO,GAAI,MACR,SACH,MAAO,WAEP,MAAO,GAAI,GAGjB,MAAO,GAGT,IAAQ,OAAK,QAAM,UAAQ,aAAa,GAqBlC,GAAW,CAAC,IAAiB,EAI5B,MAAM,WAAkB,EAAa,CAC1C,OAAS,GACT,SAAW,GACX,OAAS,GACT,OAAS,GACT,UAAY,GACZ,iBAAmC,IAAM,GAGzC,UAAY,GAEJ,YAAc,OAAO,UAAU,EAC/B,cAAgB,CAAC,EAAc,IAAa,CAClD,EAAI,gBAAgB,gBAAiB,EAAI,KAAK,eAAiB,EAAI,GAGrE,UAAY,EACZ,aAAe,EACf,eAAiB,OAEb,MAAK,EAAc,CACrB,MAAO,CACL,MAAO,KAAK,MACZ,OAAQ,KAAK,OACb,QAAS,KAAK,OAChB,KAGE,MAAK,CAAC,EAAiB,CACzB,IAAQ,QAAO,UAAS,UAAW,GAAS,CAAI,EAChD,GACE,KAAK,SAAW,GAChB,KAAK,WAAa,GAClB,KAAK,UAAY,EAEjB,KAAK,YAAY,EAEnB,KAAK,OAAS,GAAS,CAAC,EACxB,KAAK,SAAW,GAAW,KAC3B,KAAK,QAAU,GAAU,GAGnB,QAAU,CAChB,QAAS,CAAC,EACV,UAAW,CAAC,EACZ,aAAc,CAAC,CACjB,EAEQ,OAAgB,CAAC,EACjB,SAAmC,KACnC,QAAuB,GAC/B,UAAY,GACZ,UAAY,GACZ,eAAiB,MAEb,QAAO,EAAmC,CAC5C,OAAO,KAAK,UAAY,EAAI,CAAE,OAAQ,KAAK,SAAU,EAAI,OAG3D,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,QAAU,GAAK,EACjB,KAAK,YAAa,KAAK,OAC1B,CAAC,EAAE,KAAK,YAER,KAAK,eACH,YACA,YACA,iBACA,SACA,WACA,YACA,eACA,SACA,SACA,YACA,WACF,KAGE,MAAK,EAAU,CACjB,OAAO,KAAK,UAGV,MAAK,CAAC,EAAiB,CACzB,KAAK,OAAS,GAAS,CAAQ,EAC/B,KAAK,YAAY,KAGf,OAAM,EAAgB,CACxB,OAAO,KAAK,WAGV,OAAM,CAAC,EAAyB,CAClC,GAAI,KAAK,UAAY,EACnB,KAAK,QAAU,EACf,KAAK,YAAY,KAIjB,KAAI,EAA6B,CACnC,GAAI,KAAK,MACP,OAAO,KAAK,MAEd,IAAM,EAAa,KAAK,UAAU,KAChC,CAAC,IAAM,EAAE,OAAS,aAAe,EAAE,OAAS,YAC9C,EACA,GAAI,CAAC,EACH,OAEF,IAAQ,QAAS,EAEjB,OAAO,EAAW,OAAS,YACvB,CAAC,EAAQ,IAAY,EAAE,GAAQ,EAAE,GAAQ,EAAI,GAC7C,CAAC,EAAQ,IAAY,EAAE,GAAQ,EAAE,GAAQ,GAAK,KAGhD,KAAI,CAAC,EAAuB,CAC9B,GAAI,KAAK,QAAU,EACjB,KAAK,MAAQ,EACb,KAAK,YAAY,KAIjB,QAAO,EAAoB,CAC7B,GAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,EAAG,CACjC,IAAQ,UAAW,KACnB,KAAK,SAAW,OAAO,KAAK,EAAO,IAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAiB,CACjE,IAAM,EAAQ,GAAa,EAAQ,EAAM,KAAK,SAAS,EACvD,MAAO,CACL,KAAM,EAAK,QAAQ,kBAAmB,OAAO,EAAE,kBAAkB,EACjE,OACA,MACE,OAAO,EAAO,GAAG,KAAU,UAC1B,EAAO,GAAG,KAAU,IAAM,CAAC,MAAM,EAAO,GAAG,EAAK,EAC7C,QACA,OACN,QAAS,IAAU,GACnB,MAAO,EAAQ,EAAQ,CACzB,EACD,EAEH,OAAO,KAAK,YAGV,QAAO,CAAC,EAA6B,CACvC,KAAK,SAAW,EAChB,KAAK,YAAY,KAGf,eAAc,EAAoB,CACpC,OAAO,KAAK,QAAQ,OAAO,CAAC,IAAM,EAAE,UAAY,EAAK,EAGvD,QAAU,KAEV,SAAS,CAAC,EAAuC,CAC/C,IAAM,GACH,EAAM,UAAY,OAAY,EAAM,QAAQ,GAAG,QAAU,EAAM,SAChE,KAAK,sBAAsB,EAAE,EACzB,EAAU,EAAM,UAAY,OAAY,GAAK,EAC/C,EAAY,EACV,EAAa,CAAC,EAQpB,OAPe,KAAK,eAAe,KAAK,CAAC,IAA2B,CAClE,GAAI,EAAQ,UAAY,GAGtB,OAFA,GAAa,EAAQ,MACrB,EAAI,KAAK,CAAS,EACX,KAAK,IAAI,EAAI,CAAS,EAAI,EAEpC,EAIK,UAAY,CAAC,IAAiB,CAEpC,GADe,KAAK,UAAU,CAAK,IACpB,OACb,KAAK,MAAM,OAAS,aAEpB,UAAK,MAAM,OAAS,IAIhB,aAAe,CAAC,IAAe,CACrC,IAAM,EAAS,KAAK,UAAU,CAAK,EACnC,GAAI,IAAW,OAAW,CACxB,IAAM,EAAY,OAAO,EAAO,KAAK,EAC/B,EAAe,EAAM,UAAY,OACjC,EAAkB,EACpB,EAAM,QAAQ,GAAG,WACjB,OACJ,EACE,EACA,CAAC,EAAI,EAAK,IAAe,CAMvB,IALc,EACV,CAAC,GAAG,EAAM,OAAO,EAAE,KACjB,CAAC,IAAe,EAAM,aAAe,CACvC,EACA,MACU,OACZ,MAAO,GAET,IAAM,EAAQ,EAAY,EAI1B,GAHA,EAAO,MACL,EAAQ,KAAK,eAAiB,EAAQ,KAAK,eAC7C,KAAK,gBAAgB,EACjB,EAAM,OAAS,UACjB,MAAO,IAGX,YACF,IAIJ,SAAS,CAAC,EAAU,EAAS,GAAM,CACjC,GAAI,EACF,EAAI,KAAK,aAAe,GAExB,YAAO,EAAI,KAAK,aAIpB,UAAU,CAAC,EAAc,EAAS,GAAM,CACtC,QAAW,KAAO,GAAQ,KAAK,MAC7B,KAAK,UAAU,EAAK,CAAM,EAI9B,QAAQ,CAAC,EAAc,CACrB,KAAK,WAAW,EAAM,EAAK,EAIrB,WACA,gBAAkB,CAAC,IAAiB,CAC1C,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,SACxB,OAEF,IAAQ,UAAW,EACnB,GAAI,EAAE,aAAkB,aACtB,OAEF,IAAM,EAAK,EAAO,QAAQ,KAAK,EAC/B,GAAI,EAAE,aAAc,aAClB,OAEF,IAAM,EAAa,GAAY,CAAE,EACjC,GAAI,IAAe,GACjB,OAEF,IAAM,EAAa,EAEb,EAAY,OAAO,aAAa,EACtC,GAAI,IAAc,KAChB,EAAU,gBAAgB,EAE5B,IAAM,EAAO,KAAK,YAClB,GACE,KAAK,UACL,EAAW,UACX,EAAK,OAAS,GACd,KAAK,aAAe,EACpB,CACA,IAAM,EACJ,KAAK,aAAe,QACpB,KAAK,WAAW,KAAK,eAAiB,IACjC,EAAO,GAAU,CACtB,KAAK,aAAe,OAAY,EAAK,QAAQ,KAAK,UAAU,EAAI,EAChE,EAAK,QAAQ,CAAU,CACzB,EAAE,KAAK,CAAC,EAAG,IAAM,EAAI,CAAC,EAGtB,GAAI,EAAQ,GACV,QAAS,EAAM,EAAO,GAAO,EAAQ,IAAO,CAC1C,IAAM,EAAM,EAAK,GACjB,KAAK,UAAU,EAAK,CAAI,GAGvB,QAAI,KAAK,UAAY,EAAW,QAAS,CAC9C,KAAK,UAAU,EAAY,CAAC,EAAW,KAAK,YAAY,EACxD,IAAM,EAAc,EAAK,QAAQ,CAAU,EACrC,EAAW,EAAK,EAAc,GAC9B,EAAe,EAAc,EAAI,EAAK,EAAc,GAAK,OAC/D,GAAI,IAAa,QAAa,EAAS,KAAK,eAAiB,GAC3D,KAAK,WAAa,EACb,QACL,IAAiB,QACjB,EAAa,KAAK,eAAiB,GAEnC,KAAK,WAAa,EAElB,UAAK,WAAa,OAGpB,UAAK,WAAa,EAClB,KAAK,SAAS,EACd,KAAK,UAAU,EAAY,EAAI,EAEjC,KAAK,iBAAiB,KAAK,mBAAmB,EAC9C,QAAW,KAAO,MAAM,KAAK,KAAK,iBAAiB,KAAK,CAAC,EAAG,CAC1D,IAAM,EAAO,GAAY,CAAG,EAC5B,KAAK,cAAc,EAAK,CAAI,IAIhC,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EAExB,KAAK,iBAAiB,YAAa,KAAK,SAAS,EACjD,KAAK,iBAAiB,YAAa,KAAK,YAAY,EACpD,KAAK,iBAAiB,aAAc,KAAK,aAAc,CAAE,QAAS,EAAK,CAAC,EACxE,KAAK,iBAAiB,UAAW,KAAK,eAAe,EACrD,KAAK,iBAAiB,WAAY,KAAK,eAAe,EAGxD,eAAe,EAAG,CAChB,KAAK,MAAM,YACT,iBACA,KAAK,eAAe,IAAI,CAAC,IAAM,EAAE,MAAQ,IAAI,EAAE,KAAK,GAAG,CACzD,EACA,KAAK,MAAM,YACT,mBACA,KAAK,eAAe,OAAO,CAAC,EAAG,IAAM,EAAI,EAAE,MAAO,CAAC,EAAI,IACzD,EAGF,aAAe,CACb,EACA,EAAiD,SAC9C,CACH,QAAW,KAAU,KAAK,QAAQ,OAChC,CAAC,IAAM,GAAS,EAAE,IAAI,IAAM,EAC9B,EACE,GAAI,GAAS,CAAM,IAAM,EAAe,CACtC,GAAI,IAAc,OAChB,EAAO,KAAO,EAAO,OAAS,YAAc,aAAe,YAE3D,OAAO,KAAO,EAEhB,KAAK,YAAY,EAEjB,YAAO,EAAO,MAKpB,cAAgB,CAAC,EAAqB,IAA2B,CAC/D,IAAQ,gBAAiB,KACnB,EAAgB,KAAK,QAAQ,OACjC,CAAC,IAAW,EAAO,UAAY,EACjC,EACM,EAAc,KAAK,YAAY,KAAK,IAAI,EACxC,EAAmB,CAAC,EAC1B,GAAI,CAAC,KAAK,QAAU,EAAQ,OAAS,GACnC,EAAK,KACH,CACE,QAAS,KAAK,UACV,GAAG,EAAS,MAAM,KAAK,EAAS,WAAW,IAC3C,iBACJ,KAAM,gBACN,MAAM,EAAG,CACP,EAAa,CAAO,EAExB,EACA,CACE,QAAS,KAAK,UACV,GAAG,EAAS,MAAM,KAAK,EAAS,YAAY,IAC5C,kBACJ,KAAM,iBACN,MAAM,EAAG,CACP,EAAa,EAAS,YAAY,EAEtC,CACF,EAEF,GAAI,CAAC,KAAK,OAAQ,CAChB,GAAI,EAAK,OACP,EAAK,KAAK,IAAI,EAEhB,EAAK,KACH,CACE,QAAS,KAAK,UACV,GAAG,EAAS,MAAM,KAAK,EAAS,QAAQ,IACxC,cACJ,KAAM,SACN,QAAS,IAAM,EAAQ,UAAY,GACnC,MAAM,EAAG,CACP,EAAQ,QAAU,GAClB,EAAY,EAEhB,EACA,CACE,QAAS,KAAK,UACV,GAAG,EAAS,MAAM,KAAK,EAAS,QAAQ,IACxC,cACJ,KAAM,MACN,QAAS,IAAM,EAAc,OAAS,EACtC,UAAW,EAAc,IAAI,CAAC,IAAW,CACvC,MAAO,CACL,QAAS,EAAO,MAAQ,EAAO,KAC/B,MAAM,EAAG,CACP,OAAO,EAAO,QACd,EAAY,EAEhB,EACD,CACH,CACF,EAGF,EAAQ,CACN,SACA,UAAW,KAAK,UAChB,UAAW,CACb,CAAC,MAGC,YAAW,EAAmB,CAChC,OAAO,KAAK,UAAY,EAAe,GAGzC,WAAa,CAAC,IAA2B,CACvC,IAAQ,iBAAkB,KACtB,EAAW,OACX,EACJ,OAAQ,EAAQ,UACT,YACH,EAAW,EAAM,cAAc,EAC/B,EAAW,aACX,UACG,GACH,cAEA,UACG,aACH,EAAW,YACX,EAAW,EAAM,eAAe,EAGpC,IAAM,EAAa,EAAE,KAAK,QAAU,KAAK,QACrC,GACE,CACE,MAAO,eACP,OAAO,CAAC,EAAc,CACpB,EAAc,EAAM,OAAuB,CAAO,EAClD,EAAM,gBAAgB,EAE1B,EACA,GAAY,EAAM,aAAa,CACjC,EACA,CAAC,EAEL,OAAO,EAAQ,aAAe,OAC1B,EAAQ,WAAW,CAAO,EAC1B,GACE,CACE,MAAO,KACP,KAAM,eACN,WACA,MAAO,IACF,KAAK,UACR,eAAgB,EAAQ,OAAS,MACnC,CACF,EACA,KAAK,YACH,CAAE,MAAO,CAAE,KAAM,GAAI,CAAE,EACvB,OAAO,EAAQ,OAAS,SAAW,EAAQ,KAAO,EAAQ,IAC5D,EACA,CACF,GAGN,SAAW,CAAC,IAA2B,CACrC,GAAI,EAAQ,WAAa,OACvB,OAAO,EAAQ,SAAS,CAAO,EAEjC,OAAO,GAAK,CACV,MAAO,KACP,KAAM,OACN,MAAO,IACF,KAAK,UACR,eAAgB,EAAQ,OAAS,MACnC,EACA,SAAU,KAAK,EAAQ,MACzB,CAAC,MAGC,YAAW,EAAU,CACvB,OAAO,GAAS,KAAK,QAAQ,OAAO,KAGlC,oBAAmB,EAAU,CAC/B,OAAO,KAAK,YAAY,OAAO,CAAC,IAAQ,EAAI,KAAK,YAAY,KAG3D,aAAY,EAAU,CACxB,OAAO,KAAK,MAAM,OAAO,CAAC,IAAQ,EAAI,KAAK,YAAY,EAGzD,WAAW,CAAC,EAA+C,CACzD,OAAO,GACL,GACE,CACE,MAAO,KACP,KAAM,MACN,KAAM,CACJ,MAAO,IACP,QAAS,CAAE,MAAO,KAAK,aAAc,CACvC,CACF,EACA,GAAG,EAAQ,IAAI,KAAK,QAAQ,CAC9B,CACF,EAGM,cAEA,WAAa,CAAC,IAAiB,CACrC,IAAM,EAAU,EAAM,OAAuB,QAC3C,YACF,EACM,EAAc,MAAM,KAAK,EAAO,cAAe,QAAQ,EAAE,QAC7D,CACF,EACM,EAAU,KAAK,eAAe,GAC9B,EAAe,KAAK,QAAQ,QAAQ,KAAK,aAAc,EACvD,EAAe,KAAK,QAAQ,QAAQ,CAAO,EACjD,KAAK,QAAQ,OAAO,EAAc,CAAC,EACnC,KAAK,QAAQ,OAAO,EAAc,EAAG,KAAK,aAAc,EACxD,QAAQ,IAAI,CAAE,QAAO,SAAQ,cAAa,eAAc,cAAa,CAAC,EACtE,KAAK,YAAY,EAEjB,EAAM,eAAe,EACrB,EAAM,gBAAgB,GAGxB,MAAM,EAAG,CACP,MAAM,OAAO,EAEb,KAAK,QAAQ,UACX,KAAK,UAAY,EAAI,KAAK,OAAO,MAAM,EAAG,KAAK,SAAS,EAAI,CAAC,EAC/D,KAAK,QAAQ,aACX,KAAK,aAAe,EAChB,KAAK,OAAO,MAAM,KAAK,OAAO,OAAS,KAAK,YAAY,EACxD,CAAC,EACP,KAAK,QAAQ,QAAU,KAAK,OAC1B,KAAK,OAAO,MACV,KAAK,UACL,KAAK,IACH,KAAK,eACL,KAAK,OAAO,OAAS,KAAK,UAAY,KAAK,YAC7C,CACF,CACF,EAEA,IAAQ,QAAS,KACjB,GAAI,EACF,KAAK,QAAQ,QAAQ,KAAK,CAAI,EAGhC,KAAK,YAAc,GAEnB,KAAK,MAAM,QAAU,OACrB,KAAK,MAAM,cAAgB,SAC3B,IAAQ,kBAAmB,KAI3B,GAHA,KAAK,MAAM,YAAY,eAAgB,GAAG,KAAK,aAAa,EAC5D,KAAK,gBAAgB,EAEjB,CAAC,KAAK,UACI,GAAK,EAEnB,IAAM,EAAS,KAAK,WAAa,iBAC3B,EAAgB,EAAe,IAAI,CAAC,IAAW,CACnD,IAAM,EAAS,KAAK,WAAW,CAAM,EACrC,GAAI,CAAC,KAAK,WAAa,EAAO,SAAS,GAAI,CACzC,IAAM,EAAU,EAAO,SAAS,GAChC,EAAQ,aAAa,YAAa,MAAM,EACxC,EAAQ,MAAM,cAAgB,MAC9B,EAAQ,QAAQ,KAAO,EACvB,EAAO,QAAQ,KAAO,EACtB,EAAQ,iBAAiB,YAAa,IAAM,CAC1C,KAAK,cAAgB,EACtB,EACD,EAAO,iBAAiB,OAAQ,KAAK,UAAU,EAEjD,OAAO,EACR,EAaD,GAZA,KAAK,OACH,GACE,CAAE,MAAO,QAAS,KAAM,WAAY,MAAO,CAAE,YAAa,MAAO,CAAE,EACnE,GACE,CACE,MAAO,KACP,KAAM,KACR,EACA,GAAG,CACL,CACF,CACF,EACI,KAAK,UAAY,EACnB,KAAK,OACH,GACE,CACE,KAAM,gBACN,MAAO,QACP,KAAM,WACN,MAAO,CACL,KAAM,WACN,SAAU,SACV,OAAQ,GAAG,KAAK,UAAY,KAAK,aACnC,EACA,SAAU,CACR,MAAO,KAAK,QAAQ,UACpB,QAAS,KAAK,OAChB,CACF,EACA,KAAK,YAAY,CAAc,CACjC,CACF,EAsBF,GApBA,KAAK,OACH,GACE,CACE,KAAM,cACN,MAAO,QACP,KAAM,WACN,MAAO,CACL,QAAS,IACT,UAAW,QACX,KAAM,YACN,SAAU,aACZ,EACA,SAAU,CACR,MAAO,KAAK,QAAQ,QACpB,QAAS,KAAK,OAChB,CACF,EACA,KAAK,YAAY,CAAc,CACjC,CACF,EACI,KAAK,aAAe,EACtB,KAAK,OACH,GACE,CACE,KAAM,mBACN,MAAO,QACP,KAAM,WACN,MAAO,CACL,KAAM,WACN,SAAU,SACV,OAAQ,GAAG,KAAK,UAAY,KAAK,gBACnC,EACA,SAAU,CACR,MAAO,KAAK,QAAQ,aACpB,QAAS,KAAK,OAChB,CACF,EACA,KAAK,YAAY,CAAc,CACjC,CACF,EAGN,CAEO,IAAM,GAAY,GAAU,eAAe,CAChD,IAAK,YACL,UAAW,CACT,QAAS,CACP,SAAU,aACZ,EACA,6BAA8B,CAC5B,MAAO,EAAK,YACd,EACA,YAAa,CACX,QAAS,OACT,oBAAqB,EAAK,YAC1B,OAAQ,EAAK,UACb,WAAY,EAAK,SACnB,EACA,uBAAwB,CACtB,SAAU,SACV,WAAY,SACZ,aAAc,WACd,QAAS,OACT,WAAY,QACd,EACA,0BAA2B,CACzB,MAAO,eACP,WAAY,OACZ,QAAS,EACT,WAAY,EAAK,UACjB,OAAQ,EAAK,UACb,MAAO,EAAK,SACd,EACA,2BAA4B,CAC1B,OAAQ,WACV,EACA,kCAAmC,CACjC,WAAY,GAAW,gBAAgB,OAAO,EAC9C,MAAO,GAAW,mBAAmB,MAAM,CAC7C,EACA,mBAAoB,CAClB,WAAY,GAAW,aAAa,OAAO,CAC7C,CACF,CACF,CAAC,EUr1BD,oBAAS,eAAqB,SAAU,WAAI,iBAAM,gBAGlD,IAAQ,UAAQ,UAAQ,UAAQ,UAAQ,WAAS,MAAI,KAAG,SAAO,SAAO,QACpE,GAOK,MAAM,WAAmB,EAAuB,aACxC,MAAK,CAAC,EAAiB,EAAQ,QAAwB,CAClE,OAAO,IAAI,QAAQ,CAAC,IAAY,CAC9B,IAAM,EAAc,GAClB,CACE,cAAe,GACf,uBAAwB,GACxB,eAAe,EAAG,CAChB,EAAQ,EAEZ,EACA,GAAG,CAAE,KAAM,QAAS,EAAG,CAAK,EAC5B,GAAE,CAAO,CACX,EACA,SAAS,KAAK,OAAO,CAAW,EAChC,EAAY,UAAU,EACvB,cAGU,QAAO,CAAC,EAAiB,EAAQ,UAA6B,CACzE,OAAO,IAAI,QAAQ,CAAC,IAAY,CAC9B,IAAM,EAAgB,GACpB,CACE,cAAe,GACf,eAAe,CAAC,EAAiB,CAC/B,EAAQ,IAAW,SAAS,EAEhC,EACA,GAAG,CAAE,KAAM,QAAS,EAAG,CAAK,EAC5B,GAAE,CAAO,EACT,GACE,CACE,KAAM,SACN,OAAO,EAAG,CACR,EAAc,MAAM,EAExB,EACA,QACF,CACF,EACA,SAAS,KAAK,OAAO,CAAa,EAClC,EAAc,UAAU,EACzB,cAGU,OAAM,CACjB,EACA,EAAQ,SACR,EAAe,GACS,CACxB,OAAO,IAAI,QAAQ,CAAC,IAAY,CAC9B,IAAM,EAAa,GAAM,CAAE,MAAO,CAAa,CAAC,EAC1C,EAAe,GACnB,CACE,cAAe,GACf,eAAe,CAAC,EAAiB,CAC/B,EAAQ,IAAW,UAAY,EAAW,MAAQ,IAAI,GAExD,YAAY,EAAG,CACb,EAAW,MAAM,EAErB,EACA,GAAG,CAAE,KAAM,QAAS,EAAG,CAAK,EAC5B,GACE,GACE,CACE,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,UACZ,IAAK,CACP,CACF,EACA,GAAI,CAAO,EACX,CACF,CACF,EACA,GACE,CACE,KAAM,SACN,OAAO,EAAG,CACR,EAAa,MAAM,EAEvB,EACA,QACF,CACF,EACA,SAAS,KAAK,OAAO,CAAY,EACjC,EAAa,UAAU,EACxB,EAGH,cAAgB,GAChB,uBAAyB,GAEzB,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,gBAAiB,wBAAwB,EAE7D,GAAG,KAAM,QAAS,IAAM,CACtB,GAAI,KAAK,uBACP,KAAK,MAAM,EAEd,EAGH,gBAAkB,CAAC,EAAS,WAAa,CACvC,QAAQ,IAAI,yBAA0B,CAAM,GAG9C,YAAY,EAAG,CACb,KAAK,MAAM,GAAG,MAAM,EAGtB,GAAmB,CAAC,IAA2B,GAE/C,UAAY,IAA8B,CAExC,OADA,KAAK,MAAM,OAAS,OAAO,EAAa,CAAC,EAClC,IAAI,QAAQ,CAAC,IAAY,CAC9B,KAAK,GAAmB,EACxB,KAAK,MAAM,OAAO,UAAU,EAC5B,sBAAsB,IAAM,CAC1B,KAAK,aAAa,EACnB,EACF,GAGH,MAAQ,CAAC,EAAS,WAAa,CAI7B,GAHA,KAAK,gBAAgB,CAAM,EAC3B,KAAK,GAAiB,CAAM,EAC5B,KAAK,MAAM,OAAO,MAAM,EACpB,KAAK,cACP,KAAK,OAAO,GAIhB,GAAK,IAAM,CACT,KAAK,MAAM,SAAS,GAGtB,QAAU,IACR,GACE,CAAE,KAAM,QAAS,EACjB,GAAO,GAAQ,CAAE,KAAM,QAAS,CAAC,CAAC,EAClC,GAAQ,EACR,GACE,GAAQ,CAAE,KAAM,QAAS,CAAC,EAC1B,GAAO,CAAE,KAAM,KAAM,QAAS,KAAK,EAAG,EAAG,IAAI,CAC/C,CACF,CACJ,CAEO,IAAM,GAAa,GAAW,eAAe,CAClD,IAAK,cACL,UAAW,CACT,2BAA4B,CAC1B,eAAgB,WAClB,EACA,6BAA8B,CAC5B,QAAS,MACX,EACA,uBAAwB,CACtB,SAAU,IACV,OAAQ,EACR,aAAc,GACd,SAAU,SACV,UAAW,oBACX,QAAS,EACT,QAAS,OACT,cAAe,SACf,IAAK,EACL,cAAe,GAAW,WAAW,kBAAkB,EACvD,kBAAmB,GAAW,WAAW,SAAS,EAClD,aAAc,GAAW,UAAU,MAAM,EACzC,UAAW,GAAK,aAChB,WAAY,GAAK,iBACjB,MAAO,GAAK,WACd,EACA,qBAAsB,CACpB,QAAS,QACX,EACA,0BAA2B,CACzB,QAAS,OACT,eAAgB,SAChB,IAAK,EACP,EACA,0BAA2B,CACzB,QAAS,OACT,eAAgB,WAChB,IAAK,GACL,cAAe,EACjB,CACF,CACF,CAAC,EClPD,oBAAS,eAAW,WAAU,eAI9B,IAAQ,MAAK,SAAS,GAWf,MAAM,UAAqB,EAAU,OACnC,WAAY,SACZ,UAAW,QACX,WAAY,SACZ,YAAa,SAEb,WAAY,CACjB,QAAS,CACP,cAAe,QACf,iBAAkB,QAClB,oBAAqB,QACrB,uBAAwB,OACxB,gBAAiB,OACjB,mBAAoB,KACtB,EACA,qBAAsB,CACpB,SAAU,UACZ,EACA,2BAA4B,CAC1B,UAAW,aACX,QAAS,MACT,SAAU,WACV,QAAS,OACT,OAAQ,EAAK,WACb,MAAO,EAAK,WACZ,QAAS,EAAK,cACd,eAAgB,EAAK,YACrB,WAAY,EAAK,QACnB,EACA,qBAAsB,CACpB,IAAK,EACL,OAAQ,EACR,KAAM,EACN,MAAO,EACP,OAAQ,OACR,MAAO,OACP,WAAY,cACZ,OAAQ,WACV,EACA,0BAA2B,CACzB,UAAW,cAAc,EAAK,gBAChC,EACA,uEAAwE,CACtE,QAAS,MACX,EACA,qBAAsB,CACpB,QAAS,GACX,EACA,YAAa,CACX,cAAe,MACjB,EACA,kBAAmB,CACjB,eAAgB,EAAK,iBACrB,WAAY,EAAK,aACnB,CACF,QAEO,cAAa,CAAC,EAAqB,EAA4B,CACpE,IAAQ,YAAa,EACrB,OAAO,EAAa,YAAc,EAAM,SACpC,EAAO,IAAI,CAAC,IAAM,KAAK,MAAM,EAAI,CAAQ,EAAI,CAAQ,EACrD,QAGC,aAAY,CAAC,EAAqB,EAAmB,CAC1D,IAAQ,aAAc,EACtB,OAAO,EAAa,WAAa,EAAM,SACnC,KAAK,MAAM,EAAI,CAAS,EAAI,EAC5B,KAGF,OAAM,EAAU,CAClB,IAAM,EAAU,KAAK,cACrB,GAAI,EAAQ,MAAM,MAChB,MAAO,CAAE,KAAM,GAAM,IAAK,GAAM,OAAQ,GAAM,MAAO,EAAK,EAE5D,IAAM,EAAQ,EAAQ,MAAM,MAAM,MAAM,IAAI,IAAM,KAC5C,EAAO,CAAC,GAAS,EAAQ,MAAM,KAAK,MAAM,IAAI,IAAM,KACpD,EAAS,EAAQ,MAAM,OAAO,MAAM,IAAI,IAAM,KAC9C,EAAM,CAAC,GAAU,EAAQ,MAAM,IAAI,MAAM,IAAI,IAAM,KACzD,MAAO,CAAE,OAAM,MAAK,SAAQ,OAAM,KAGhC,OAAM,CAAC,EAAc,CACvB,IAAQ,SAAQ,SAAU,GACpB,OAAM,OAAQ,EACd,EAAU,KAAK,cACf,EAAI,EAAQ,WACZ,EAAI,EAAQ,UACZ,EAAI,EAAQ,YACZ,EAAI,EAAQ,aACZ,EAAK,EAAQ,aAA6B,YAAc,EAAI,EAC5D,EAAK,EAAQ,aAA6B,aAAe,EAAI,EASnE,GARA,OAAO,OAAO,EAAQ,MAAO,CAC3B,KAAM,GACN,MAAO,GACP,IAAK,GACL,OAAQ,GACR,MAAO,GACP,OAAQ,EACV,CAAC,EACG,CAAC,EAAO,EAAO,GACnB,GAAI,CAAC,EAAQ,EAAM,GACnB,GAAI,EAAM,EAAQ,MAAM,KAAO,EAAI,KACnC,GAAI,EAAO,EAAQ,MAAM,MAAQ,EAAI,KACrC,GAAI,GAAQ,EACV,EAAQ,MAAM,MAAQ,OAEtB,OAAQ,MAAM,MAAQ,EAAI,KAE5B,GAAI,EAAK,EAAQ,MAAM,IAAM,EAAI,KACjC,GAAI,EAAQ,EAAQ,MAAM,OAAS,EAAI,KACvC,GAAI,GAAO,EACT,EAAQ,MAAM,OAAS,OAEvB,OAAQ,MAAM,OAAS,EAAI,KAE7B,KAAK,YAAY,KAGf,OAAM,EAAiE,CACzE,IAAQ,MAAK,OAAM,QAAO,UAAW,KAAK,cAAe,MACzD,MAAO,CACL,IAAK,WAAW,CAAG,EACnB,KAAM,WAAW,CAAI,EACrB,MAAO,WAAW,CAAK,EACvB,OAAQ,WAAW,CAAM,CAC3B,KAGE,KAAI,EAAW,CACjB,OAAO,KAAK,cAAe,cAGzB,MAAK,EAAW,CAClB,OAAO,KAAK,cAAe,eAGzB,MAAK,EAAW,CAClB,OACG,KAAK,cAAe,aAA6B,aACjD,KAAK,KAAO,KAAK,UAIlB,IAAG,EAAW,CAChB,OAAO,KAAK,cAAe,aAGzB,OAAM,EAAW,CACnB,OAAO,KAAK,cAAe,gBAGzB,OAAM,EAAW,CACnB,OACG,KAAK,cAAe,aAA6B,cACjD,KAAK,IAAM,KAAK,QAIrB,cAAgB,IAAM,CACpB,KAAK,cAAe,cAClB,IAAI,MAAM,SAAU,CAClB,QAAS,GACT,SAAU,EACZ,CAAC,CACH,GAGF,eAAiB,CAAC,IAAiB,CAEjC,IAAQ,UAAW,KACnB,KAAK,OAAS,EACd,IAAM,EAAS,KAAK,eACZ,MAAK,OAAM,SAAQ,SAAU,KAAK,OAC1C,EAAU,EAAuB,CAAC,EAAI,EAAI,IAAc,CAEtD,GADC,CAAC,EAAI,CAAE,EAAI,EAAa,cAAc,EAAW,CAAC,EAAI,CAAE,CAAC,EACtD,CAAC,MAAM,CAAG,EACZ,EAAO,MAAM,IAAM,EAAM,EAAK,KAEhC,GAAI,CAAC,MAAM,CAAM,EACf,EAAO,MAAM,OAAS,EAAS,EAAK,KAEtC,GAAI,CAAC,MAAM,CAAI,EACb,EAAO,MAAM,KAAO,EAAO,EAAK,KAElC,GAAI,CAAC,MAAM,CAAK,EACd,EAAO,MAAM,MAAQ,EAAQ,EAAK,KAEpC,GAAI,EAAU,OAAS,UAErB,OADA,KAAK,cAAc,EACZ,GAEV,GAGH,OAAS,CAAC,IAAiB,CACzB,IAAM,EAAS,KAAK,eACZ,UAAW,KACnB,KAAK,OAAS,OAAO,OAAO,CAC1B,KAAM,GACN,IAAK,GACL,MAAO,GACP,OAAQ,EACV,CAAC,EACD,IAAO,EAAO,GAAU,CAAC,KAAK,MAAO,KAAK,MAAM,EAEhD,EAAU,EAAuB,CAAC,EAAI,EAAI,IAAc,CACtD,IAAI,EAAI,EAAQ,EACZ,EAAI,EAAS,EAIjB,GAHC,CAAC,EAAG,CAAC,EAAI,EAAa,cAAc,EAA2B,CAAC,EAAG,CAAC,CAAC,EACtE,EAAO,MAAM,MAAQ,EAAI,KACzB,EAAO,MAAM,OAAS,EAAI,KACtB,EAAU,OAAS,UAGrB,OAFA,KAAK,OAAS,EACd,KAAK,cAAc,EACZ,GAEV,GAGH,WAAa,CAAC,IAAiB,CAC7B,IAAM,EAAS,KAAK,eACZ,UAAW,KACb,EAAa,EAAM,OAAuB,aAAa,MAAM,EACnE,KAAK,OAAS,OAAO,OAAO,CAC1B,KAAM,GACN,MAAO,GACP,IAAK,GACL,OAAQ,EACV,CAAC,EACD,IAAM,EAAW,KAAK,GAEtB,EAAU,EAAuB,CAAC,EAAI,EAAI,IAAc,CACtD,IAAO,GAAY,EAAa,cAAc,EAAW,CACvD,GACG,CAAC,OAAQ,OAAO,EAAE,SAAS,CAAS,EAAI,EAAK,IAC3C,CAAC,QAAS,QAAQ,EAAE,SAAS,CAAS,EAAI,GAAK,EACtD,CAAC,EAED,GADA,EAAO,MAAM,GAAa,EAAW,KACjC,EAAU,OAAS,UAGrB,OAFA,KAAK,OAAS,EACd,KAAK,cAAc,EACZ,GAEV,MAGC,KAAI,EAAY,CAClB,OAAO,KAAK,cAAe,sBAAsB,KAG/C,OAAM,EAA6B,CACrC,IAAM,EAAO,KAAK,cAAe,sBAAsB,EACvD,MAAO,CACL,EAAG,EAAK,EAAI,EAAK,MAAQ,IACzB,EAAG,EAAK,EAAI,EAAK,OAAS,GAC5B,KAGE,QAAO,EAAgB,CACzB,OAAO,KAAK,cAGd,eAAiB,CAAC,IAAiB,CACjC,IAAQ,UAAW,MACX,mBAAoB,KAAK,QAAQ,MACzC,GAAI,CAAC,EACH,KAAK,QAAQ,MAAM,gBAAkB,UAEvC,EAAU,EAAuB,CAAC,EAAK,EAAK,IAA4B,CACtE,IAAQ,UAAS,WAAY,EACvB,EAAI,EAAU,EAAO,EACrB,EAAI,EAAU,EAAO,EACvB,EAAQ,EAAI,EAAI,GAAK,IACzB,GAAI,IAAM,EACR,EAAS,KAAK,MAAM,EAAG,CAAC,EAAI,IAAO,KAAK,GAG1C,GADA,EAAQ,EAAa,aAAa,EAAW,CAAK,EAC9C,IAAU,EACZ,KAAK,QAAQ,MAAM,gBAAkB,GACrC,KAAK,QAAQ,MAAM,UAAY,GAE/B,UAAK,QAAQ,MAAM,UAAY,UAAU,QAG3C,OADA,KAAK,cAAc,EACZ,EAAU,OAAS,UAC3B,GAGH,WAAa,CAAC,IAAiB,CAC7B,IAAQ,UAAW,KACb,EAAS,EAAM,OAAuB,MAAM,MAAM,GAAG,EAAE,GAC7D,EAAO,GAAS,CAAC,EAAO,GACxB,KAAK,OAAS,EACd,KAAK,YAAY,EACjB,EAAM,gBAAgB,EACtB,EAAM,eAAe,GAGvB,QAAU,IAAM,CACd,EACE,CACE,KAAM,OACN,MAAO,CAAE,IAAK,MAAO,KAAM,MAAO,UAAW,sBAAuB,CACtE,EACA,EAAM,KAAK,CACb,EACA,EAAI,CACF,KAAM,OACN,MAAO,cACP,MAAO,YACP,MAAO,CAAE,KAAM,OAAQ,MAAO,KAAM,CACtC,CAAC,EACD,EAAI,CACF,KAAM,QACN,MAAO,eACP,MAAO,YACP,MAAO,CAAE,KAAM,mBAAoB,MAAO,KAAM,CAClD,CAAC,EACD,EAAI,CACF,KAAM,MACN,MAAO,aACP,MAAO,YACP,MAAO,CAAE,IAAK,OAAQ,OAAQ,MAAO,OAAQ,WAAY,CAC3D,CAAC,EACD,EAAI,CACF,KAAM,SACN,MAAO,gBACP,MAAO,YACP,MAAO,CAAE,IAAK,mBAAoB,OAAQ,MAAO,OAAQ,WAAY,CACvE,CAAC,EACD,EACE,CACE,KAAM,SACN,MAAO,CAAE,IAAK,OAAQ,KAAM,MAAO,CACrC,EACA,EAAM,OAAO,CACf,EACA,EACE,CACE,KAAM,SACN,MAAO,CAAE,IAAK,MAAO,MAAO,GAAI,CAClC,EACA,EAAM,UAAU,CAClB,EACA,EACE,CACE,KAAM,WACN,MAAO,YACP,MAAO,CAAE,IAAK,MAAO,KAAM,EAAG,UAAW,wBAAyB,CACpE,EACA,EAAM,OAAO,EACb,EAAM,KAAK,CACb,EACA,EACE,CACE,KAAM,YACN,MAAO,aACP,MAAO,CAAE,IAAK,MAAO,KAAM,OAAQ,UAAW,qBAAsB,CACtE,EACA,EAAM,OAAO,EACb,EAAM,KAAK,CACb,EACA,EACE,CACE,KAAM,UACN,MAAO,WACP,MAAO,CAAE,IAAK,EAAG,KAAM,MAAO,UAAW,wBAAyB,CACpE,EACA,EAAM,OAAO,EACb,EAAM,KAAK,CACb,EACA,EACE,CACE,KAAM,aACN,MAAO,cACP,MAAO,CAAE,IAAK,OAAQ,KAAM,MAAO,UAAW,qBAAsB,CACtE,EACA,EAAM,OAAO,EACb,EAAM,KAAK,CACb,EACA,GAAK,CACP,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,eAAgB,cAAc,EAGpD,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EAExB,IACE,OACA,QACA,MACA,SACA,WACA,YACA,UACA,aACA,OACA,SACA,UACE,KAAK,MAEH,EAAU,CAAE,QAAS,EAAK,EAC/B,CAAC,EAAM,EAAO,EAAK,CAAM,EAAE,QAAQ,CAAC,IAAQ,CAC3C,EAAI,iBAAiB,YAAa,KAAK,WAAY,CAAO,EAC1D,EAAI,iBAAiB,aAAc,KAAK,WAAY,CAAO,EAC5D,EACA,CAAC,EAAU,EAAW,EAAS,CAAU,EAAE,QAAQ,CAAC,IAAQ,CAC3D,EAAI,iBAAiB,QAAS,KAAK,UAAU,EAC9C,EACD,EAAO,iBAAiB,YAAa,KAAK,OAAQ,CAAO,EACzD,EAAK,iBAAiB,YAAa,KAAK,eAAgB,CAAO,EAC/D,EAAO,iBAAiB,YAAa,KAAK,eAAgB,CAAO,EACjE,EAAO,iBAAiB,aAAc,KAAK,OAAQ,CAAO,EAC1D,EAAK,iBAAiB,aAAc,KAAK,eAAgB,CAAO,EAChE,EAAO,iBAAiB,aAAc,KAAK,eAAgB,CAAO,EAGpE,MAAM,EAAG,CAGP,GAFA,MAAM,OAAO,EAET,CAAC,KAAK,cACR,OAGF,IAAQ,WAAU,YAAW,UAAS,cAAe,KAAK,OAClD,OAAM,QAAO,MAAK,UAAW,KAAK,OAE1C,EAAS,gBAAgB,SAAU,CAAI,EACvC,EAAU,gBAAgB,SAAU,CAAK,EACzC,EAAQ,gBAAgB,SAAU,CAAG,EACrC,EAAW,gBAAgB,SAAU,CAAM,EAE/C,CAEO,IAAM,GAAe,EAAa,eAAe,CACtD,IAAK,cACP,CAAC,EC9XD,oBAAS,eAA2C,gBAIpD,IAAQ,OAAK,SAAO,UAAQ,SAAS,GAK/B,GAAW,CAAC,IAAiB,EAC7B,GAA0B,kCASnB,GAAmD,CAC9D,SAAU,CACR,QAAS,WACT,SAAU,mBACV,SAAU,CAAC,IAAkB,CAE3B,OADA,EAAQ,EAAM,kBAAkB,EACzB,CAAC,IAAa,OAAO,CAAG,EAAE,kBAAkB,EAAE,SAAS,CAAK,EAEvE,EACA,QAAS,CACP,QAAS,WACT,SAAU,CAAC,IAAkB,CAC3B,IAAM,EAAO,EACV,MAAM,OAAO,EACb,IAAI,CAAC,IAAQ,EAAI,KAAK,EAAE,kBAAkB,CAAC,EAC3C,OAAO,CAAC,IAAQ,IAAQ,EAAE,EAC7B,MAAO,CAAC,IACN,MAAM,QAAQ,CAAG,GACjB,EAAK,KAAK,CAAC,IAAQ,CAAC,EAAI,SAAS,CAAG,CAAC,IAAM,OAEjD,EACA,gBAAiB,CACf,QAAS,qBACT,SAAU,CAAC,IAAkB,CAC3B,IAAM,EAAO,EACV,MAAM,OAAO,EACb,IAAI,CAAC,IAAQ,EAAI,KAAK,EAAE,kBAAkB,CAAC,EAC3C,OAAO,CAAC,IAAQ,IAAQ,EAAE,EAC7B,MAAO,CAAC,IACN,MAAM,QAAQ,CAAG,GACjB,EAAK,KAAK,CAAC,IAAQ,EAAI,SAAS,CAAG,CAAC,IAAM,OAEhD,EACA,OAAQ,CACN,QAAS,IACT,SAAU,IACV,SAAU,CAAC,IAAkB,CAC3B,GAAI,MAAM,OAAO,CAAK,CAAC,EAErB,OADA,EAAQ,OAAO,CAAK,EAAE,kBAAkB,EACjC,CAAC,IAAa,OAAO,CAAG,EAAE,kBAAkB,IAAM,EAE3D,IAAM,EAAM,OAAO,CAAK,EACxB,MAAO,CAAC,IAAa,OAAO,CAAG,IAAM,EAEzC,EACA,MAAO,CACL,QAAS,WACT,SAAU,YACV,SAAU,CAAC,IAAe,CACxB,IAAM,EAAO,IAAI,KAAK,CAAK,EAC3B,MAAO,CAAC,IAAa,IAAI,KAAK,CAAG,EAAI,EAEzC,EACA,YAAa,CACX,QAAS,IACT,SAAU,IACV,SAAU,CAAC,IAAe,CACxB,GAAI,CAAC,MAAM,OAAO,CAAK,CAAC,EAAG,CACzB,IAAM,EAAM,OAAO,CAAK,EACxB,MAAO,CAAC,IAAa,OAAO,CAAG,EAAI,EAGrC,OADA,EAAQ,EAAM,kBAAkB,EACzB,CAAC,IAAa,OAAO,CAAG,EAAE,kBAAkB,EAAI,EAE3D,EACA,OAAQ,CACN,QAAS,6BACT,SAAU,sBACV,WAAY,GACZ,SAAU,IAAM,CAAC,IAAa,CAAC,CAAC,CAClC,EACA,OAAQ,CACN,QAAS,SACT,WAAY,GACZ,SAAU,IAAM,CAAC,IAAa,IAAQ,EACxC,EACA,QAAS,CACP,QAAS,UACT,WAAY,GACZ,SAAU,IAAM,CAAC,IAAa,IAAQ,EACxC,CACF,EAOM,GAAe,CACnB,YAAa,WACb,KAAM,IAAM,EACd,EAEA,SAAS,EAAa,CAAC,EAA2B,CAChD,OAAQ,EAAO,QAAQ,EAAO,gBAAiC,SAAW,GAkBrE,MAAM,WAAmB,EAA8B,CAC5D,OAAiB,CAAC,EAClB,QAAU,GACV,SAAW,IACX,UAAY,WACZ,OAAS,GAET,QAAU,IAAM,CACd,EAAU,CAAE,KAAM,UAAW,CAAC,EAC9B,EAAU,CAAE,KAAM,WAAY,CAAC,EAC/B,GAAM,CAAE,KAAM,SAAU,KAAM,QAAS,CAAC,EACxC,GAAK,CAAE,KAAM,SAAU,CAAC,EACxB,GAAO,CAAE,KAAM,SAAU,MAAO,QAAS,EAAG,EAAM,MAAM,CAAC,CAC3D,EAEA,OAAiB,GAEjB,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,WAAY,YAAa,QAAQ,KAGnD,MAAK,EAAoB,CAC3B,IAAQ,WAAU,SAAQ,aAAc,KAAK,MAC7C,MAAO,CACL,SAAU,EAAS,MACnB,OAAQ,EAAO,MACf,UAAW,EAAU,KACvB,KAGE,MAAK,CAAC,EAA2B,CACnC,OAAO,OAAO,KAAM,CAAQ,EAG9B,YAAc,IAAwB,CACpC,IAAQ,WAAU,YAAW,UAAW,KAAK,MAEvC,EAAW,EAAU,MAAM,WAAW,GAAG,EACzC,EAAM,EAAW,EAAU,MAAM,MAAM,CAAC,EAAI,EAAU,MACtD,EAAS,KAAK,QAAQ,GAC5B,EAAO,OAAS,EAAO,aAAe,GAEtC,IAAM,EACJ,EAAO,aAAe,GAClB,EAAO,SAAS,MAAS,EACzB,EAAO,SAAS,EAAO,KAAK,EAC5B,EAAQ,EAAS,MACnB,EAEJ,GAAI,IAAU,IACZ,EAAO,EACH,CAAC,IAAa,CAAC,EAAS,EAAI,EAAM,EAClC,CAAC,IAAa,EAAS,EAAI,EAAM,EAErC,OAAO,EACH,CAAC,IACC,OAAO,OAAO,CAAG,EAAE,KAAK,CAAC,IAAM,CAAC,EAAS,CAAC,CAAC,IAAM,OACnD,CAAC,IACC,OAAO,OAAO,CAAG,EAAE,KAAK,CAAC,IAAM,EAAS,CAAC,CAAC,IAAM,OAGxD,IAAM,EAAa,EAAO,aAAe,GAAQ,KAAK,EAAO,SAAW,GAClE,EAAc,GAAG,GAAc,CAAQ,KAAK,GAChD,CACF,IAAI,IAEJ,KAAK,OAAS,CACZ,cACA,MACF,EAEA,KAAK,eAAe,cAAc,IAAI,MAAM,QAAQ,CAAC,GAGvD,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EAExB,IAAQ,WAAU,YAAW,SAAQ,UAAW,KAAK,MAErD,EAAS,iBAAiB,SAAU,KAAK,WAAW,EACpD,EAAU,iBAAiB,SAAU,KAAK,WAAW,EACrD,EAAO,iBAAiB,QAAS,KAAK,WAAW,EACjD,EAAS,MAAQ,KAAK,SACtB,EAAU,MAAQ,KAAK,UACvB,EAAO,MAAQ,KAAK,OAEpB,EAAO,iBAAiB,QAAS,IAAM,CACrC,IAAQ,iBAAkB,KAC1B,KAAK,OAAO,EACZ,GAAe,cAAc,IAAI,MAAM,QAAQ,CAAC,EACjD,EAGH,MAAM,EAAG,CACP,MAAM,OAAO,EAEb,IAAQ,WAAU,YAAW,UAAW,KAAK,MAqB7C,GAnBA,EAAS,QAAU,CACjB,CACE,QAAS,YACT,MAAO,GACT,EACA,GAAG,KAAK,OAAO,IAAI,CAAC,IAAU,EAAM,IAAI,CAC1C,EAEA,EAAU,QAAU,OAAO,KAAK,KAAK,OAAO,EAAE,IAAI,CAAC,IAAQ,CACvD,IAAM,EAAS,KAAK,QAAQ,GAC5B,OAAO,EAAO,WAAa,OACvB,CACE,CAAE,QAAS,EAAO,QAAS,MAAO,CAAI,EACtC,CAAE,QAAS,EAAO,SAAU,MAAO,IAAM,CAAI,CAC/C,EACA,CAAE,QAAS,EAAO,QAAS,MAAO,CAAI,EAC3C,EACA,KAAK,EAEJ,KAAK,WAAa,GACpB,EAAS,MAAQ,KAAK,SAExB,GAAI,KAAK,YAAc,GACrB,EAAU,MAAQ,KAAK,UAEzB,GAAI,KAAK,SAAW,GAClB,EAAO,MAAQ,KAAK,OAEtB,KAAK,YAAY,EAErB,CAEO,IAAM,GAAa,GAAW,eAAe,CAClD,IAAK,kBACL,UAAW,CACT,QAAS,CACP,QAAS,MACX,EAEA,mBAAoB,CAClB,cAAe,SACf,cAAe,MACjB,EAEA,oDAAqD,CACnD,KAAM,GACR,EAEA,wBAAyB,CACvB,KAAM,CACR,EAEA,kCAAmC,CACjC,QAAS,QACT,QAAS,IACT,KAAM,UACR,CACF,CACF,CAAC,EASM,MAAM,WAAsB,EAAiC,CAC1D,QAAkB,CAAC,KAEvB,OAAM,EAAW,CACnB,OAAO,KAAK,WAGV,OAAM,CAAC,EAAiB,CAC1B,KAAK,QAAU,EACf,KAAK,YAAY,KAGf,MAAK,EAAgB,CACvB,IAAQ,mBAAoB,KAAK,MACjC,MAAQ,CAAC,GAAG,EAAgB,QAAQ,EAAmB,IACrD,CAAC,IAAS,EAAK,KACjB,KAGE,MAAK,CAAC,EAAoB,CAC5B,IAAQ,SAAQ,WAAY,MACpB,mBAAoB,KAAK,MACjC,EAAgB,YAAc,GAC9B,QAAW,KAAS,EAClB,EAAgB,OAAO,GAAW,CAAE,SAAQ,aAAY,CAAM,CAAC,CAAC,EAIpE,OAAsB,GACtB,YAAc,GAEd,UAAY,IAAM,CAChB,IAAQ,SAAQ,WAAY,MACpB,mBAAoB,KAAK,MACjC,EAAgB,OAAO,GAAW,CAAE,SAAQ,SAAQ,CAAC,CAAC,GAGxD,QAAU,IAAM,CACd,GACE,CACE,KAAM,MACN,MAAO,uBACP,QAAS,KAAK,UACd,MAAO,OACT,EACA,EAAM,KAAK,CACb,EACA,GAAI,CAAE,KAAM,iBAAkB,CAAC,EAC/B,GACE,CAAE,KAAM,QAAS,MAAO,eAAgB,QAAS,KAAK,KAAM,EAC5D,EAAM,EAAE,CACV,CACF,EAEA,QAAU,GAEV,MAAQ,IAAM,CACZ,IAAQ,SAAQ,WAAY,MACpB,mBAAoB,KAAK,MACjC,KAAK,YAAc,GACnB,KAAK,OAAS,GACd,EAAgB,YAAc,GAC9B,EAAgB,OAAO,GAAW,CAAE,SAAQ,SAAQ,CAAC,CAAC,EACtD,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,GAGxC,YAAc,IAAwB,CACpC,IAAQ,mBAAoB,KAAK,MACjC,GAAI,EAAgB,SAAS,SAAW,EAAG,CACzC,KAAK,MAAM,EACX,OAEF,IAAM,EAAW,CAAC,GAAG,EAAgB,QAAQ,EAAmB,IAC9D,CAAC,IAAe,EAAW,MAC7B,EACM,EAAQ,EAAQ,IAAI,CAAC,IAAW,EAAO,IAAI,EACjD,KAAK,YAAc,EAAQ,IAAI,CAAC,IAAW,EAAO,WAAW,EAAE,KAAK,IAAI,EACxE,KAAK,OAAS,CAAC,IACb,EAAM,OACJ,CAAC,IAAa,EAAM,KAAK,CAAC,IAAM,EAAE,CAAG,IAAM,EAAK,IAAM,MACxD,EACF,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,GAGxC,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EAExB,IAAQ,mBAAoB,KAAK,MACjC,EAAgB,iBAAiB,SAAU,KAAK,WAAW,EAE3D,KAAK,MAAM,EAGb,MAAM,EAAG,CACP,MAAM,OAAO,EAEjB,CAEO,IAAM,GAAgB,GAAc,eAAe,CACxD,IAAK,aACL,UAAW,CACT,QAAS,CACP,OAAQ,OACR,QAAS,OACT,oBAAqB,8BACrB,WAAY,QACd,EAEA,iCAAkC,CAChC,QAAS,OACT,cAAe,SACf,WAAY,UACZ,KAAM,UACR,EAEA,0BAA2B,CACzB,YAAa,OACf,EAEA,2BAA4B,CAC1B,YAAa,MACf,EAEA,wBAAyB,CACvB,YAAa,MACf,EAEA,2CAA4C,CAC1C,gBAAiB,0BACjB,aAAc,QACd,OAAQ,qBACR,WAAY,qBACZ,OAAQ,IACR,QAAS,IACT,UAAW,SACX,MAAO,qBACP,KAAM,wBACR,CACF,CACF,CAAC,ECvZD,oBACE,eAEA,iBACA,gBAKF,IAAQ,QAAM,QAAM,WAAS,SAAO,SAAO,SAAS,GAEpD,SAAS,CAAI,CAAC,EAAsB,EAAc,EAAkB,CAClE,GAAI,IAAU,IAAM,IAAU,GAC5B,EAAQ,aAAa,EAAM,CAAK,EAEhC,OAAQ,gBAAgB,CAAI,EAIhC,SAAS,EAAa,CAAC,EAA8B,CACnD,OAAQ,EAAM,UACP,WACH,OAAO,EAAM,YACV,QAAS,CACZ,IAAM,EAAS,EAAM,eAAe,cAClC,6BAA6B,EAAM,gBACrC,EACA,OAAO,EAAS,EAAO,MAAQ,IACjC,KACK,YACA,SACH,OAAO,OAAO,EAAM,KAAK,UAEzB,OAAO,MAAM,QAAQ,EAAM,KAAK,GAAK,EAAM,MAAM,SAAW,EACxD,KACA,EAAM,OAIhB,SAAS,EAAe,CAAC,EAAuC,EAAY,CAC1E,GAAI,EAAE,aAAiB,aAAc,CAE9B,QAAI,aAAiB,iBAC1B,OAAQ,EAAM,UACP,WACH,EAAM,QAAU,EAChB,UACG,QACH,EAAM,QAAU,IAAU,EAAM,MAChC,cAEA,EAAM,MAAQ,OAAO,GAAS,EAAE,EAGpC,QAAI,GAAS,MAAS,EAA2B,OAAS,KACtD,EAA2B,MAAQ,OAAO,GAAS,EAAE,EAKtD,MAAM,WAAiB,EAAa,CACzC,QAAU,GACV,IAAM,GACN,KAAyE,GACzE,SAAW,GACX,QAAU,GACV,YAAc,GACd,IAAM,GACN,IAAM,GACN,KAAO,GACP,eAAiB,GACjB,MAAa,KAEb,QAAU,GACR,GAAQ,CAAE,KAAM,SAAU,CAAC,EAC3B,GACE,CAAE,KAAM,OAAQ,EAChB,GAAQ,CAAE,KAAM,QAAS,KAAM,OAAQ,CAAC,EACxC,GAAM,CAAE,KAAM,aAAc,CAAC,CAC/B,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eACH,UACA,MACA,OACA,WACA,UACA,cACA,MACA,MACA,OACA,iBACA,SACA,QACF,EAGM,aAAe,GACvB,aAAe,IAAM,CACnB,IAAQ,QAAO,eAAgB,KAAK,MAI9B,EAAgB,EAAM,SAAS,IAAM,EAC3C,GAAI,IAAiB,EACnB,EAAY,MAAQ,EAAa,MAEnC,KAAK,MAAQ,GAAc,CAAY,EACvC,KAAK,aAAe,GACpB,IAAM,EAAO,KAAK,QAAQ,UAAU,EACpC,GAAI,GAAQ,KAAK,MAAQ,GACvB,OAAQ,KAAK,UACN,WACH,EAAK,OAAO,KAAK,KAAO,EAAa,QACrC,UACG,aACA,QACH,GAAI,KAAK,eAAiB,GACxB,EAAa,MAAQ,OAAO,EAAa,KAAK,EAAE,QAC9C,KAAK,cACP,EACA,EAAK,OAAO,KAAK,KAAO,OAAO,EAAa,KAAK,EAEjD,OAAK,OAAO,KAAK,KAAO,OAAO,EAAa,KAAK,EAEnD,cAEA,EAAK,OAAO,KAAK,KAAO,EAAa,QAK7C,UAAU,CAAC,EAAe,CACxB,IAAM,EACJ,EAAK,OAAO,KAAK,OAAS,OAAY,EAAK,OAAO,KAAK,KAAO,KAAK,MAErE,GAAI,GAAgB,MAAQ,IAAiB,GAAI,CAC/C,GAAI,EAAK,OAAO,KAAK,MAAQ,KAAM,EAAK,OAAO,KAAK,KAAO,EAC3D,KAAK,MAAQ,GAIjB,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EACxB,IAAQ,QAAO,eAAgB,KAAK,MAK9B,EAAO,KAAK,QAAQ,GAAQ,OAAQ,EAC1C,GAAI,aAAgB,GAClB,KAAK,WAAW,CAAI,EAGtB,EAAY,iBAAiB,SAAU,KAAK,YAAY,EACxD,EAAM,iBAAiB,SAAU,KAAK,aAAc,EAAI,EAG1D,MAAM,EAAG,CACP,GAAI,KAAK,aAAc,CACrB,KAAK,aAAe,GACpB,OAEF,IAAQ,QAAO,UAAS,cAAa,SAAU,KAAK,MAMpD,GAAI,EAAQ,aAAa,KAAK,IAAM,GAClC,EAAQ,OAAO,KAAK,UAAY,GAAK,KAAK,QAAU,KAAK,GAAG,EAE9D,GAAI,KAAK,OAAS,OAAQ,CACxB,EAAM,YAAc,GACpB,IAAM,EAAW,GAAS,SAAS,CAAE,MAAO,KAAK,KAAM,CAAC,EACxD,GAAI,KAAK,YACP,EAAS,aAAa,cAAe,KAAK,WAAW,EAEvD,EAAM,OAAO,CAAQ,EAChB,QAAI,KAAK,OAAS,QACvB,EAAM,YAAc,GACpB,EAAM,OAAO,GAAW,CAAE,MAAO,KAAK,KAAM,CAAC,CAAC,EACzC,QAAI,EAAM,SAAS,SAAW,GAMnC,GALA,EAAK,EAAa,cAAe,KAAK,WAAW,EACjD,EAAK,EAAa,OAAQ,KAAK,IAAI,EACnC,EAAK,EAAa,UAAW,KAAK,OAAO,EACzC,EAAK,EAAa,MAAO,KAAK,GAAG,EACjC,EAAK,EAAa,MAAO,KAAK,GAAG,EAC7B,KAAK,KACP,EAAK,EAAa,OAAQ,KAAK,IAAI,EAC9B,QAAI,KAAK,eAAiB,GAAK,KAAK,OAAS,SAClD,EAAK,EAAa,OAAQ,KAAK,IAAI,GAAI,CAAE,KAAK,cAAc,CAAC,EAcjE,GAXA,GAAgB,EAAa,KAAK,KAAK,EACvC,GAAgB,EAAM,SAAS,GAAmB,KAAK,KAAK,EAE5D,KAAK,OACD,EAAM,aAAa,SAAU,KAAK,MAAM,EACxC,EAAM,gBAAgB,QAAQ,EAClC,KAAK,OACD,EAAM,aAAa,SAAU,KAAK,MAAM,EACxC,EAAM,gBAAgB,QAAQ,EAElC,EAAY,UAAU,OAAO,SAAU,EAAM,SAAS,OAAS,CAAC,EAC5D,EAAM,SAAS,OAAS,EAC1B,EAAY,aAAa,WAAY,IAAI,EAEzC,OAAY,gBAAgB,UAAU,EAExC,EAAM,MAAM,QAAU,EAAM,SAAS,SAAW,EAAI,OAAS,GAC7D,EAAK,EAAa,WAAY,CAAC,KAAK,QAAQ,EAEhD,CAEO,MAAM,WAAgB,EAAa,CACxC,QAAU,CAAC,EACX,MAAQ,CAAC,KACL,QAAO,EAAY,CAIrB,MAFE,CAAC,GAAG,KAAK,iBAAiB,GAAG,CAAC,EAC9B,OAAO,CAAC,IAAW,EAAO,WAAa,MAAS,EACnC,KAAK,CAAC,IAAW,CAAC,EAAO,eAAe,CAAC,IAAM,aAGzD,WAAY,CACjB,QAAS,CACP,QAAS,OACT,cAAe,QACjB,EACA,2CAA4C,CAC1C,QAAS,MACX,EACA,uBAAwB,CACtB,QAAS,OACT,cAAe,SACf,SAAU,cACV,OAAQ,OACR,MAAO,OACP,SAAU,WACV,UAAW,YACb,EACA,aAAc,CACZ,QAAS,OACT,KAAM,WACN,SAAU,WACV,SAAU,QACZ,CACF,EAEA,QAAU,CACR,GAAK,CAAE,KAAM,SAAU,KAAM,QAAS,CAAC,EACvC,GAAK,CAAE,KAAM,MAAO,EAAG,GAAK,CAAE,KAAM,SAAU,CAAC,CAAC,EAChD,GAAK,CAAE,KAAM,SAAU,KAAM,QAAS,CAAC,CACzC,EAEA,SAAW,CAAC,IAAiC,CAC3C,OAAO,KAAK,cAAc,kBAAkB,KAAO,MAGjD,OAAM,EAAQ,CAChB,GAAI,OAAO,KAAK,QAAU,SACxB,GAAI,CACF,KAAK,MAAQ,KAAK,MAAM,KAAK,KAAK,EAClC,MAAO,EAAG,CACV,QAAQ,IAAI,wDAAwD,EACpE,KAAK,MAAQ,CAAC,EAGlB,IAAQ,YAAa,KACf,EAAW,KAAK,cAAc,KAAK,IAAI,EAC7C,OAAO,IAAI,MAAM,KAAK,MAAO,CAC3B,GAAG,CAAC,EAAQ,EAAmB,CAC7B,OAAO,EAAO,IAGhB,GAAG,CAAC,EAAQ,EAAc,EAAwB,CAChD,GAAI,EAAO,KAAU,EAAU,CAC7B,EAAO,GAAQ,EACf,IAAM,EAAQ,EAAS,CAAI,EAC3B,GAAI,EACF,EAAM,MAAQ,EAEhB,EAAS,IAAI,MAAM,QAAQ,CAAC,EAE9B,MAAO,GAEX,CAAC,KAGC,OAAM,CAAC,EAAgC,CACzC,IAAM,EAAS,CAAC,GAAG,KAAK,iBAAiB,GAAS,OAAQ,CAAC,EAC3D,QAAW,KAAS,EAClB,EAAM,MAAQ,EAAO,EAAM,KAI/B,OAAS,IAAM,CACb,KAAK,MAAM,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,GAGnD,aAAe,CAAC,IAAuB,CACrC,EAAM,eAAe,EACrB,EAAM,gBAAgB,EACtB,KAAK,eAAe,KAAK,MAAO,KAAK,OAAO,GAG9C,eAAiB,CAAC,EAA+B,IAA2B,CAC1E,QAAQ,IAAI,8CAA+C,CACzD,QACA,SACF,CAAC,GAGH,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EACxB,IAAQ,QAAS,KAAK,MACtB,EAAK,iBAAiB,SAAU,KAAK,YAAY,EAErD,CAEO,IAAM,GAAW,GAAS,eAAe,CAC9C,IAAK,YACL,UAAW,CACT,uBAAwB,CACtB,SAAU,WACV,QAAS,OACT,WAAY,SACZ,IAAK,GAAW,gBAAgB,KAAK,CACvC,EACA,uCAAwC,CACtC,QAAS,cACX,EACA,sCAAuC,CACrC,QAAS,cACX,EACA,qDAAsD,CACpD,MAAO,MACT,EACA,iBAAkB,CAChB,OAAQ,MACV,EACA,+BAAgC,CAC9B,MAAO,aACT,EACA,gBAAiB,CACf,SAAU,WACV,cAAe,OACf,QAAS,CACX,CACF,CACF,CAAC,EAEY,GAAU,GAAQ,eAAe,CAC5C,IAAK,UACP,CAAC,ECreM,SAAS,EAAY,EAAG,CAK7B,OAJ4B,UACzB,YAAY,EACZ,OAAO,CAAC,IAAM,IAAM,IAAI,EAEX,IAAI,CAAC,IAAM,CACzB,IAAQ,KAAI,OAAM,WAAY,EAC9B,MAAO,CACL,KACA,OACA,QAAS,EACN,IAAI,CAAC,EAAQ,IAAU,CACtB,IAAQ,UAAS,SAAU,EAC3B,MAAO,CACL,QACA,UACA,OACF,EACD,EACA,OAAO,CAAC,IAAM,EAAE,SAAW,EAAE,QAAU,CAAC,EACxC,OAAO,CAAC,EAAgC,IAAW,CAElD,OADA,EAAI,EAAO,OAAS,EAAO,MACpB,GACN,CAAC,CAAC,CACT,EACD,EAGI,SAAS,EAAW,EAAG,CAC5B,IAAM,EAAQ,GAAa,EAC3B,OAAO,EAAM,SAAW,EACpB,qBACA,EACG,IAAI,EAAG,KAAI,OAAM,aAAc,CAC9B,IAAM,EAAW,EAAK,IAAI,CAAC,IAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,EACjD,EAAa,OAAO,KAAK,CAAO,EACnC,IAAI,CAAC,IAAQ,IAAI,MAAQ,EAAQ,OAAO,CAAG,GAAG,QAAQ,CAAC,IAAI,EAC3D,KAAK,GAAG,EACX,MAAO,GAAG;AAAA,EAAO;AAAA,EAAa,IAC/B,EACA,KAAK;AAAA,CAAI,EAgBX,SAAS,EAAa,CAAC,EAAe,CAC3C,IAAM,EAAc,CAAC,EAsBrB,OArBA,EAAS,MAAM,4BAA4B,IAAI,CAAC,IAAoB,CAClE,EAAW,iCAAiC,IAAI,CAAC,IAAY,CAC3D,IAAM,EAAQ,CAAC,EACM,EAAG,gBAAgB,EAC3B,QAAQ,CAAC,IAAgB,CACpC,IAAM,EAAY,EAAG,aAAa,CAAW,EAM7C,GALA,EAAM,GAAe,CAAE,QAAS,EAAU,OAAmB,EAC7D,EAAU,+BAA+B,IAAI,IAAM,CACjD,EAAM,GAAa,QAAU,EAAU,QACxC,EAEG,EAAU,6BACZ,EAAM,GAAa,KAAO,CAAC,EAC3B,EAAU,6BAA6B,IAAI,CAAC,IAAmB,CAC7D,EAAM,GAAa,KAAO,EAC3B,EAEJ,EACD,EAAY,EAAG,YAAc,EAC9B,EACF,EACM,EAGF,SAAS,EAAiB,CAAC,EAAkC,CAClE,GAAI,IAAgB,QAAa,OAAO,KAAK,CAAW,EAAE,SAAW,EACnE,MAAO,eAGT,OAAO,OAAO,KAAK,CAAW,EAC3B,IAAI,CAAC,IAAiB,CACrB,IAAM,EAAQ,EAAY,GACpB,EAAa,OAAO,KAAK,CAAK,EACjC,OAAO,CAAC,IAAgB,EAAM,GAAa,OAAO,EAClD,KAAK,GAAG,EACX,MAAO,GAAG;AAAA,EAAiB,IAC5B,EACA,KAAK;AAAA,CAAI,ECId,oBAAS,eAAqC,gBCrC9C,oBACE,eAEA,WACA,gBAQF,IAAQ,MAAK,QAAM,QAAM,WAAW,GAS7B,MAAM,WAAoB,EAAa,CAC5C,MAAQ,EACR,UAAY,GAEZ,OAAO,CACL,EACA,EACA,EACa,CACb,IAAM,EAAU,EAAQ,aAAa,MAAM,EACrC,EAEF,EAAQ,cAAc,sBAAsB,GAC3C,QAAQ,UAAU,EAAI,IACxB,KAAK,UAAY,EAAa,CAAO,EAAI,GAAK,CAAO,GAmBxD,OAlBY,EACV,EACA,CACE,KAAM,MACN,SAAU,EACV,KAAM,MACN,aAAc,CAChB,EACA,EAAQ,aAAa,YAAY,EAC7B,GACE,CACE,MAAO,QACP,MAAO,OACT,EACA,EAAM,EAAE,CACV,EACA,CAAC,CACP,QAIK,WAAY,CACjB,QAAS,CACP,QAAS,OACT,cAAe,SACf,SAAU,WACV,SAAU,SACV,UAAW,iBACb,EACA,KAAM,CACJ,SAAU,WACV,QAAS,QACT,KAAM,IACN,SAAU,SACV,UAAW,MACb,EACA,0BAA2B,CACzB,KAAM,UACR,EACA,sBAAuB,CACrB,QAAS,iBACX,EACA,wBAAyB,CACvB,QAAS,OACT,cAAe,SACf,UAAW,MACb,EACA,sBAAuB,CACrB,QAAS,MACX,EACA,cAAe,CACb,QAAS,OACT,WAAY,OACZ,WAAY,QACd,EACA,oBAAqB,CACnB,QAAS,GAAG,GAAK,aAAa,GAAK,UACnC,OAAQ,UACR,QAAS,OACT,WAAY,UACd,EACA,uCAAwC,CACtC,eAAgB,GAAK,qBACrB,MAAO,GAAK,SACd,EACA,iBAAkB,CAChB,KAAM,GACR,EACA,gBAAiB,CACf,WAAY,iCACd,EACA,4BAA6B,CAC3B,QAAS,IACT,MAAO,EACP,OAAQ,kCACR,WAAY,GAAK,qBACjB,WAAY,eACd,EACA,qBAAsB,CACpB,OAAQ,EACR,WAAY,cACZ,UAAW,SACX,WAAY,GAAK,UACjB,QAAS,CACX,EACA,2BAA4B,CAC1B,OAAQ,MACV,CACF,EAEA,WAAqC,KAErC,QAAU,CACR,EACE,CAAE,KAAM,WAAY,KAAM,UAAW,EACrC,EACE,CAAE,KAAM,QAAS,EACjB,EAAI,CAAE,MAAO,OAAQ,KAAM,MAAO,CAAC,EACnC,EAAI,CAAE,MAAO,SAAU,CAAC,EACxB,GAAK,CAAE,KAAM,YAAa,CAAC,CAC7B,EACA,EAAI,CAAE,MAAO,QAAS,EAAG,EAAI,CAAE,MAAO,WAAY,KAAM,UAAW,CAAC,CAAC,CACvE,EACA,GAAK,CACP,EAEA,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,WAAW,EAGjC,UAAU,CAAC,EAAmB,EAAY,GAAa,CACrD,GAAI,CAAC,EAAK,aAAa,MAAM,EAE3B,MADA,QAAQ,MAAM,gCAAiC,CAAI,EACzC,MAAM,+BAA+B,EAIjD,GAFA,KAAK,OAAO,CAAI,EAChB,KAAK,UAAU,EACX,EACF,KAAK,MAAQ,KAAK,OAAO,OAAS,EAEpC,KAAK,YAAY,EAGnB,aAAa,CAAC,EAAyB,CACrC,EAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,YAAY,EAGnB,OAAS,CAAC,IAAuB,CAC/B,IAAQ,QAAS,KAAK,MAChB,EAAW,CAAC,GAAG,EAAK,QAAQ,EAAE,QAAQ,EAAM,MAAqB,EACvE,OAAS,EAAwB,SAC1B,YACH,KAAK,OACF,EAAW,OAAO,EAAK,SAAS,MAAM,EAAI,GAAK,EAAK,SAAS,OAC9D,EAAK,SAAS,KAAK,OAAuB,MAAM,EAClD,EAAM,eAAe,EACrB,UACG,aACH,KAAK,OAAS,EAAW,GAAK,EAAK,SAAS,OAC1C,EAAK,SAAS,KAAK,OAAuB,MAAM,EAClD,EAAM,eAAe,EACrB,UACG,IACH,KAAK,QAAQ,CAAK,EAClB,EAAM,eAAe,EACrB,oBAMF,OAAM,EAAc,CACtB,MAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,OAAO,CAAC,IAAQ,EAAI,aAAa,MAAM,CAAC,EAGpE,QAAU,CAAC,IAAuB,CAChC,IAAQ,QAAS,KAAK,MAChB,EAAS,EAAM,OACf,EAAe,EAAO,QAAQ,cAAc,IAAM,KAClD,EAAM,EAAO,QAAQ,aAAa,EAClC,EAAW,CAAC,GAAG,EAAK,QAAQ,EAAE,QAAQ,CAAG,EAC/C,GAAI,EAAc,CAChB,IAAM,EAAO,KAAK,OAAO,GACzB,GAAI,CAAC,KAAK,YAAc,KAAK,WAAW,CAAI,IAAM,GAChD,KAAK,cAAc,KAAK,OAAO,EAAwB,EAGzD,QAAI,EAAW,GACb,KAAK,MAAQ,GAKnB,UAAY,IAAY,CACtB,IAAQ,QAAS,KAAK,MAChB,EAAY,CAAC,GAAG,KAAK,QAAQ,EAAE,OACnC,CAAC,IAAU,CAAC,EAAM,aAAa,MAAM,GAAK,EAAM,aAAa,MAAM,CACrE,EAEA,GADA,EAAK,YAAc,GACf,KAAK,OAAS,EAAU,OAC1B,KAAK,MAAQ,EAAU,OAAS,EAElC,QAAW,KAAS,EAAW,CAC7B,IAAM,EAAU,EAAU,GACpB,EAAS,GAAG,KAAK,cAAc,IACrC,EAAQ,GAAK,EACb,IAAM,EAAM,KAAK,QAAQ,KAAM,EAAS,CAAM,EAC9C,EAAK,OAAO,CAAG,IAInB,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EACxB,IAAQ,QAAS,KAAK,MACtB,EAAK,iBAAiB,QAAS,KAAK,OAAO,EAC3C,EAAK,iBAAiB,UAAW,KAAK,MAAM,EAC5C,KAAK,UAAU,EACf,EAAa,aAAa,IAAI,IAAI,EAGpC,oBAAoB,EAAS,CAC3B,MAAM,qBAAqB,EAC3B,EAAa,aAAa,OAAO,IAAI,EAGvC,cAAgB,IAAM,CACpB,KAAK,YAAY,GAGnB,QAAQ,EAAS,CACf,KAAK,YAAY,EAGnB,MAAM,EAAS,CACb,IAAQ,OAAM,YAAa,KAAK,MAC1B,EAAY,KAAK,OACvB,QAAS,EAAI,EAAG,EAAI,EAAU,OAAQ,IAAK,CACzC,IAAM,EAAU,EAAU,GACpB,EAAM,EAAK,SAAS,GAC1B,GAAI,KAAK,QAAU,OAAO,CAAC,EACzB,EAAI,aAAa,gBAAiB,MAAM,EACxC,EAAS,MAAO,WAAa,GAAG,EAAI,WAAa,EAAK,eACtD,EAAS,MAAO,MAAQ,GAAG,EAAI,gBAC/B,EAAQ,gBAAgB,SAAU,EAAK,EAEvC,OAAI,gBAAgB,gBAAiB,EAAK,EAC1C,EAAQ,gBAAgB,SAAU,EAAI,GAI9C,CAEO,IAAM,GAAc,GAAY,eAAe,CACpD,IAAK,UACP,CAAC,EDtOD,IAAQ,OAAK,WAAS,SAAO,SAAQ,MAAI,OAAK,SAAS,GAEjD,GAAa,IAAM,mDAEnB,IAAiB,SAAY,IAEhC,YAkBI,MAAM,WAAoB,EAAwB,CACvD,aAAe,GACf,SAAW,GACX,OAAS,KACT,WAAa,uBACb,QAA0B,CAAC,EAC3B,KAAe,OAAO,WAAW,EACjC,SAAW,GAGX,WAAa,EACb,eAEO,eAAc,CACnB,EACA,EAA0B,CAAC,EACrB,CACN,IAAM,EAAU,CACd,GAAG,EAAQ,iBAAiB,2CAA2C,CACzE,EACG,OAAO,CAAC,IAAY,CAAC,EAAQ,QAAQ,GAAY,OAAiB,CAAC,EACnE,IAAI,CAAC,KAAU,CACd,MAAO,EAAK,cACZ,SAAU,EAAK,UAAU,GAAG,MAAM,GAAG,EAAE,IAAI,EAC3C,KAAO,EAAqB,SAC9B,EAAE,EACJ,QAAS,EAAQ,EAAG,EAAQ,EAAQ,OAAQ,GAAS,EAAG,CACtD,IAAM,EAAiB,CAAC,EAAQ,EAAM,EACtC,MACE,EAAQ,EAAQ,OAAS,GACzB,EAAQ,GAAO,MAAM,qBAAuB,EAAQ,EAAQ,GAAG,MAE/D,EAAe,KAAK,EAAQ,EAAQ,EAAE,EACtC,GAAS,EAEX,IAAM,EAAU,GAAY,CAAE,SAAQ,CAAC,EACrC,EAAe,GAAG,MAAM,cAA8B,aACtD,EACA,EAAe,GAAG,KACpB,EACA,EAAe,QAAQ,CAAC,IAAW,CACjC,OAAQ,EAAO,cACR,KACH,EAAQ,GAAK,EAAO,KACpB,UACG,OACH,EAAQ,KAAO,EAAO,KACtB,UACG,MACH,EAAQ,IAAM,EAAO,KACrB,MAEJ,EAAO,MAAM,OAAO,EACrB,EACD,EAAQ,eAAe,GAI3B,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,eAAgB,UAAU,KAG5C,UAAS,EAAwB,CACnC,IAAQ,WAAY,KAAK,MACzB,MAAO,CAAC,GAAG,EAAQ,QAAQ,EAAE,KAC3B,CAAC,IAAQ,EAAI,aAAa,QAAQ,IAAM,IAC1C,EAGM,cAAc,CAAC,EAAuB,CAC5C,OAAQ,KAAK,MAAM,GAAsB,MAGnC,cAAc,CAAC,EAAe,EAAoB,CACxD,IAAM,EAAa,KAAK,MAAM,GAC9B,EAAW,MAAQ,KAGjB,IAAG,EAAW,CAChB,OAAO,KAAK,eAAe,KAAK,KAG9B,IAAG,CAAC,EAAc,CACpB,KAAK,eAAe,MAAO,CAAI,KAG7B,KAAI,EAAW,CACjB,OAAO,KAAK,eAAe,MAAM,KAG/B,KAAI,CAAC,EAAc,CACrB,KAAK,eAAe,OAAQ,CAAI,KAG9B,GAAE,EAAW,CACf,OAAO,KAAK,eAAe,IAAI,KAG7B,GAAE,CAAC,EAAc,CACnB,KAAK,eAAe,KAAM,CAAI,EAGhC,WAAa,IAAM,CACjB,IAAQ,aAAc,MACd,OAAM,QAAS,KAAK,MAC5B,GAAI,aAAqB,GAAc,EAAU,SAAW,OAAW,CACrE,IAAM,EAAc,EAAU,OAAO,QAAQ,eAAe,EAC5D,EAAK,SAAW,CAAC,EAAY,QAAQ,EACrC,EAAK,SAAW,CAAC,EAAY,QAAQ,EAErC,OAAK,SAAW,GAChB,EAAK,SAAW,IAIpB,KAAO,IAAM,CACX,IAAQ,aAAc,KACtB,GAAI,aAAqB,EACvB,EAAU,OAAO,KAAK,GAI1B,KAAO,IAAM,CACX,IAAQ,aAAc,KACtB,GAAI,aAAqB,EACvB,EAAU,OAAO,KAAK,MAItB,YAAW,EAAY,CACzB,OAAO,KAAK,UAAU,SAAS,WAAW,EAG5C,WAAa,IAAM,CACjB,KAAK,UAAU,OAAO,WAAW,GAGnC,YAAc,IAAM,CAClB,EAAQ,CACN,OAAQ,KAAK,MAAM,eACnB,MAAO,OACP,UAAW,CACT,CACE,KAAM,QACN,QAAS,iBACT,OAAQ,KAAK,QACf,EACA,CACE,KAAM,OACN,QAAS,iCACT,OAAQ,KAAK,gBACf,EACA,KACA,CACE,KAAM,KAAK,YAAc,WAAa,WACtC,QAAS,KAAK,YAAc,kBAAoB,mBAChD,OAAQ,KAAK,cACf,CACF,CACF,CAAC,GAGH,gBAAkB,CAAC,IAAyB,CAC1C,GAAI,EAAM,SAAW,EAAM,QAAS,CAClC,IAAI,EAAQ,GACZ,OAAQ,EAAM,SACP,QACA,IACH,KAAK,QAAQ,EACb,EAAQ,GACR,UACG,IACH,KAAK,WAAW,EAChB,UACG,IACH,GAAI,EAAM,SACR,KAAK,KAAK,EACV,EAAQ,GAEV,MAEJ,GAAI,EACF,EAAM,eAAe,EACrB,EAAM,gBAAgB,IAK5B,QAAU,IAAM,CACd,GACE,CAAE,KAAM,SAAU,EAClB,GAAM,CAAE,KAAM,OAAQ,CAAC,EACvB,EACE,CACE,MAAO,eACP,KAAM,iBACN,QAAS,KAAK,WAChB,EACA,EAAM,KAAK,CACb,CACF,EACA,GACE,CACE,MAAO,eACP,KAAM,cACN,UAAW,KAAK,gBAChB,OAAQ,EACV,EACA,GACE,CACE,KAAM,UACN,SAAU,KAAK,UACjB,EACA,GAAW,CACT,KAAM,KACN,KAAM,aACN,KAAM,IACR,CAAC,EACD,GAAW,CAAE,KAAM,OAAQ,KAAM,OAAQ,KAAM,MAAO,CAAC,EACvD,GAAW,CAAE,KAAM,MAAO,KAAM,MAAO,KAAM,KAAM,CAAC,EACpD,GACE,CACE,KAAM,aACN,MAAO,KACT,EACA,EACE,CACE,MAAO,OACP,KAAM,OACN,MAAO,cACP,QAAS,KAAK,IAChB,EACA,EAAM,aAAa,CACrB,EACA,EACE,CACE,MAAO,OACP,KAAM,OACN,MAAO,cACP,QAAS,KAAK,IAChB,EACA,EAAM,cAAc,CACtB,EACA,EACE,CACE,MAAO,2BACP,MAAO,cACP,QAAS,KAAK,UAChB,EACA,EAAM,QAAQ,CAAE,MAAO,kBAAmB,CAAC,CAC7C,EACA,EACE,CACE,MAAO,+BACP,MAAO,cACP,QAAS,KAAK,IAChB,EACA,EAAM,KAAK,CACb,EACA,EACE,CACE,MAAO,mBACP,MAAO,cACP,QAAS,KAAK,aAChB,EACA,EAAM,UAAU,CAClB,EACA,EACE,CACE,MAAO,aACP,MAAO,cACP,QAAS,KAAK,SAChB,EACA,EAAM,EAAE,CACV,CACF,CACF,CACF,EACA,GAAQ,CAAE,KAAM,UAAW,OAAQ,EAAK,CAAC,CAC3C,EAEA,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EACxB,IAAQ,WAAY,KAAK,MAEzB,KAAK,iBAAiB,CAAC,GAAG,EAAQ,QAAQ,CAAkB,EAC5D,iBAAiB,UAAW,KAAK,YAAY,EAG7C,KAAK,SAAW,YAAY,KAAK,aAAc,GAAG,EAClD,KAAK,aAAe,YAAY,KAAK,WAAY,GAAG,EAGtD,oBAAoB,EAAS,CAC3B,MAAM,qBAAqB,EAE3B,IAAQ,aAAY,aAAc,KAGlC,cAAc,KAAK,QAAQ,EAC3B,cAAc,KAAK,YAAY,EAE/B,aAAa,QACX,EACA,KAAK,UAAU,CACb,YACA,OAAQ,KAAK,IAAI,EACjB,MAAO,EACT,CAAC,CACH,EAGF,KAAO,IAAM,CACX,IAAM,EAAK,KAAK,KAAO,GAAK,UAAY,KAAK,GAAG,KAAK,EAAI,UAAY,GAC/D,EACJ,KAAK,OAAS,GAAK,YAAc,KAAK,KAAK,KAAK,EAAI,UAAY,GAC5D,EAAM,KAAK,MAAQ,GAAK,WAAa,KAAK,IAAI,KAAK,EAAI,UAAY,GAEzE,UAAU,UAAU,UAAU,EAAK,EAAO,CAAG,GAG/C,eAAiB,IAAM,CACrB,KAAK,UAAU,OAAO,WAAW,MAG/B,UAAS,EAAW,CACtB,OAAO,KAAK,WAAa,GACrB,KAAK,OAAS,IAAM,KAAK,SACzB,KAAK,OAAS,IAAM,KAAK,KAG/B,aAAe,CAAC,IAAyB,CACvC,IAAM,EAAO,aAAa,QAAQ,KAAK,UAAU,EACjD,GAAI,aAAiB,cAAgB,EAAM,MAAQ,KAAK,WACtD,OAEF,GAAI,IAAS,KACX,OAEF,IAAQ,YAAW,SAAQ,MAAK,OAAM,KAAI,SAAU,KAAK,MAAM,CAAI,EAEnE,GAAI,GAAU,KAAK,WACjB,OAEF,GAAI,IAAc,KAAK,UACrB,OAEF,GAAI,IAAU,GACZ,OAAO,MAAM,EAEf,QAAQ,IAAI,oBAAqB,EAAQ,KAAK,UAAU,EACxD,KAAK,WAAa,EAClB,KAAK,IAAM,EACX,KAAK,KAAO,EACZ,KAAK,GAAK,EACV,KAAK,QAAQ,GAGf,SAAW,IAAM,CACf,KAAK,UAAU,IAAI,WAAW,EAC9B,KAAK,UAAU,OAAO,YAAa,KAAK,aAAe,KAAK,WAAW,EACvE,KAAK,MAAM,YAAY,OAAS,IAGlC,UAAY,IAAM,CAChB,GAAI,KAAK,WAAa,GACpB,OAAO,MAAM,EAEb,UAAK,UAAU,OAAO,WAAW,EACjC,KAAK,MAAM,YAAY,OAAS,IAIpC,iBAAmB,IAAM,CACvB,IAAQ,aAAY,YAAW,MAAK,OAAM,KAAI,OAAM,UAAW,KACzD,EAAO,SAAS,KAAK,MAAM,GAAG,EAAE,GAAK,IAAI,KAAU,IACzD,aAAa,QACX,EACA,KAAK,UAAU,CACb,YACA,OAAQ,KAAK,IAAI,EACjB,MACA,OACA,IACF,CAAC,CACH,EACA,OAAO,KAAK,CAAI,GAGlB,cAAgB,IAAM,CACpB,IAAQ,YAAW,MAAK,OAAM,MAAO,KACrC,aAAa,QACX,KAAK,WACL,KAAK,UAAU,CAAE,YAAW,OAAQ,KAAK,IAAI,EAAG,MAAK,OAAM,IAAG,CAAC,CACjE,GAGF,cAAgB,IAAM,CACpB,GAAI,KAAK,aAAc,CACrB,IAAQ,WAAY,KAAK,MACzB,EAAQ,UAAY,GACpB,QAAW,IAAY,CAAC,KAAM,MAAO,MAAM,EACzC,GAAI,KAAK,GACP,EAAQ,OACN,GAAI,CAAE,MAAO,YAAY,IAAY,UAAW,KAAK,EAAU,CAAC,CAClE,IAMR,QAAU,SAAY,CACpB,GAAI,KAAK,WAAa,GACpB,OAGF,IAAQ,aAAc,MAAa,UAAW,IAEtC,UAAS,SAAU,KAAK,MAE1B,EAAU,GAAI,CAAE,MAAO,SAAU,CAAC,EACxC,EAAQ,UAAY,KAAK,KACzB,EAAM,UAAY,KAAK,IACvB,IAAM,EAAa,EAAQ,cAAc,UAAU,EACnD,GAAI,EACF,EAAW,YAAY,CAAO,EAE9B,OAAQ,aAAa,EAAS,KAAK,MAAM,cAAc,EAGzD,IAAM,EAAU,CAAE,aAAY,KAAK,OAAQ,EAC3C,GAAI,CACF,IAAI,EAAO,KAAK,GAChB,QAAW,KAAc,OAAO,KAAK,KAAK,OAAO,EAC/C,EAAO,EAAK,QACV,IAAI,OAAO,2BAA2B,KAAe,GAAG,EACxD,gBAAgB,EAAW,QAAQ,KAAM,EAAE,GAC7C,EAQF,GALa,IAAI,GACf,GAAG,OAAO,KAAK,CAAO,EAAE,IAAI,CAAC,IAAgB,EAAI,QAAQ,KAAM,EAAE,CAAC,EAClE,EAAU,EAAM,CAAE,WAAY,CAAC,YAAY,CAAE,CAAC,EAAE,IAClD,EACK,GAAG,OAAO,OAAO,CAAO,CAAC,EAAE,MAAM,CAAC,IAAe,QAAQ,MAAM,CAAG,CAAC,EACpE,KAAK,aACP,KAAK,cAAc,EAErB,MAAO,EAAG,CACV,QAAQ,MAAM,CAAC,EACf,OAAO,MAAM,UAAU,2CAA0C,IAIrE,gBAAgB,CAAC,EAAyB,CACxC,QAAW,KAAW,EAAU,CAC9B,EAAQ,OAAS,GACjB,IAAO,KAAS,GAAS,EAAQ,UAAU,MAAM;AAAA,CAAI,EACrD,GAAI,CAAC,KAAM,OAAQ,KAAK,EAAE,SAAS,CAAI,EAAG,CACxC,IAAM,EAAW,EACd,OAAO,CAAC,IAAS,EAAK,KAAK,IAAM,EAAE,EACnC,IAAI,CAAC,IAAU,EAAK,MAAM,MAAM,EAAe,GAAG,MAAM,EACxD,KAAK,EAAE,GACJ,GACJ,EAAW,EAAI,EAAM,IAAI,CAAC,IAAS,EAAK,UAAU,CAAQ,CAAC,EAAI,GAC/D,KAAK;AAAA,CAAI,EACT,KAAK,MAAM,GAAqB,MAAQ,EACrC,KACL,IAAM,EAAW,CAAC,KAAM,OAAQ,KAAK,EAAE,KAAK,CAAC,IAC3C,EAAQ,QAAQ,aAAa,GAAU,CACzC,EACA,GAAI,EACA,KAAK,MAAM,GAAyB,MACpC,IAAa,OAAS,EAAQ,UAAY,EAAQ,YAM5D,cAAc,EAAG,CACf,IAAQ,WAAY,KAAK,MACzB,GAAI,KAAK,KAAO,GACd,EAAQ,MAAQ,EACX,QAAI,KAAK,OAAS,GACvB,EAAQ,MAAQ,EACX,QAAI,KAAK,MAAQ,GACtB,EAAQ,MAAQ,EAIpB,MAAM,EAAS,CAGb,GAFA,MAAM,OAAO,EAET,KAAK,WAAa,GAAI,CACxB,IAAM,EAAO,aAAa,QAAQ,KAAK,UAAU,EACjD,GAAI,IAAS,KAAM,CACjB,IAAQ,YAAW,SAAQ,MAAK,OAAM,MAAO,KAAK,MAAM,CAAI,EAC5D,GAAI,KAAK,YAAc,EACrB,OAEF,KAAK,WAAa,EAClB,KAAK,IAAM,EACX,KAAK,KAAO,EACZ,KAAK,GAAK,EACV,KAAK,MAAM,QAAQ,OAAS,GAC5B,KAAK,MAAM,YAAY,OAAS,GAChC,KAAK,UAAU,IAAI,WAAW,EAC9B,KAAK,WAAW,GAGlB,UAAK,QAAQ,EAGnB,CAEO,IAAM,GAAc,GAAY,eAAe,CACpD,IAAK,cACL,UAAW,CACT,QAAS,CACP,uBAAwB,QACxB,wBAAyB,OACzB,2BAA4B,OAC5B,cAAe,QACf,iBAAkB,OAClB,SAAU,WACV,QAAS,OACT,OAAQ,4BACR,WAAY,oBACZ,UAAW,YACb,EAEA,kBAAmB,CACjB,SAAU,QACV,KAAM,IACN,IAAK,IACL,OAAQ,QACR,MAAO,QACP,OAAQ,cACV,EAEA,aAAc,CACZ,OAAQ,GACV,EAEA,kBAAmB,CACjB,cAAe,QACjB,EAEA,0BAA2B,CACzB,WAAY,gBACZ,UAAW,iBACb,EAEA,oCAAqC,CACnC,UAAW,iBACb,EAEA,+EACE,CACE,QAAS,MACX,EAEF,yBAA0B,CACxB,KAAM,UACN,OAAQ,OACR,SAAU,WACV,UAAW,MACb,EAEA,iBAAkB,CAChB,OAAQ,OACR,SAAU,WACV,SAAU,SACV,UAAW,uBACb,EAEA,yBAA0B,CACxB,KAAM,YACN,OAAQ,OACR,SAAU,UACZ,EAEA,gCAAiC,CAC/B,SAAU,WACV,KAAM,MACN,OAAQ,MACR,iBAAkB,qBAClB,aAAc,MACd,MAAO,OACP,OAAQ,OACR,WAAY,OACZ,OAAQ,KACV,EAEA,oCAAqC,CACnC,OAAQ,qBACV,EAEA,sBAAuB,CACrB,SAAU,SACV,WAAY,QACZ,SAAU,WACV,IAAK,IACL,MAAO,IACP,KAAM,UACN,OAAQ,OACR,cAAe,SACf,OAAQ,IACV,EAEA,oCAAqC,CACnC,QAAS,MACX,EAEA,2BAA4B,CAC1B,QAAS,MACT,OAAQ,IACR,UAAW,SACX,WAAY,6BACZ,MAAO,gCACP,OAAQ,MACV,EAEA,yCAA0C,CACxC,MAAO,OACP,OAAQ,OACR,WAAY,OACZ,UAAW,SACX,QAAS,IACT,OAAQ,GACV,EAEA,eAAgB,CACd,OAAQ,aACV,CACF,CACF,CAAC,EAEK,GAAS,IAAI,IAAI,OAAO,SAAS,IAAI,EAAE,aACvC,GAAW,GAAO,IAAI,IAAI,EAChC,GAAI,GACF,SAAS,OAAS,iBAClB,SAAS,KAAK,YAAc,GAC5B,SAAS,KAAK,OAAO,GAAY,CAAE,WAAS,CAAC,CAAC,EEvtBhD,oBAAS,eAA2C,gBAGpD,IAAQ,QAAQ,GAET,MAAM,WAAe,EAAa,CACvC,OAAS,yCACT,QAAU,GAAI,CAAE,MAAO,CAAE,MAAO,OAAQ,OAAQ,MAAO,CAAE,CAAC,KACtD,IAAG,EAAQ,CACb,OAAO,KAAK,KAEd,SAAW,qCACX,MAAQ,SAED,0BACA,iBAEC,WAED,WAAY,CACjB,QAAS,CACP,QAAS,eACT,SAAU,WACV,MAAO,QACP,OAAQ,QACR,UAAW,MACb,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EAGN,GAFA,KAAK,eAAe,SAAU,QAAS,UAAU,EAE7C,GAAO,qBAAuB,OAChC,GAAO,mBAAqB,GAC1B,0DACF,EAAE,MAAM,CAAC,IAAM,CACb,QAAQ,MAAM,+BAAgC,CAAC,EAChD,EACD,GAAO,gBAAkB,EACvB,yDACF,EAAE,MAAM,CAAC,IAAM,CACb,QAAQ,MAAM,8BAA+B,CAAC,EAC/C,EAIL,iBAAiB,EAAS,CAExB,GADA,MAAM,kBAAkB,EACpB,CAAC,KAAK,MACR,QAAQ,MACN,+EACF,EAIJ,MAAM,EAAS,CAGb,GAFA,MAAM,OAAO,EAET,CAAC,KAAK,MACR,OAGF,IAAQ,OAAQ,KAAK,OAEd,EAAM,EAAK,GAAQ,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,IAAM,OAAO,CAAC,CAAC,EAErE,GAAI,KAAK,IACP,KAAK,IAAI,OAAO,EAGlB,GAAO,gBAAiB,KAAK,EAAG,cAAkC,CAChE,QAAQ,IACN,0DACA,mDACF,EACA,EAAS,YAAc,KAAK,MAC5B,KAAK,KAAO,IAAI,EAAS,IAAI,CAC3B,UAAW,EACX,MAAO,KAAK,SACZ,OACA,OAAQ,CAAC,EAAK,CAAI,CACpB,CAAC,EAED,KAAK,KAAK,GAAG,SAAU,IAAM,KAAK,KAAK,OAAO,CAAC,EAChD,EAEL,CAEO,IAAM,GAAS,GAAO,eAAe,CAC1C,IAAK,SACP,CAAC,EC1LD,oBAAS,UAA2B,gBACpC,iBAAS,gBAiGT,SAAS,EAAQ,CAAC,EAAkB,EAAsB,CACxD,GAAI,GAAU,KACZ,EAAS,GACJ,QAAI,OAAO,IAAW,SAC3B,EAAS,OAAO,CAAM,EAExB,OAAO,EAAO,QACZ,mBACA,CAAC,EAAkB,IAAiB,CAClC,IAAM,EAAS,GACb,GAAG,IAAW,EAAK,WAAW,GAAG,EAAI,EAAO,IAAM,KAEpD,OAAO,IAAU,OAAY,EAAW,GAAS,EAAU,OAAO,CAAK,CAAC,EAE5E,EAGK,MAAM,WAAuB,EAAU,CAC5C,IAAM,GACN,MAAQ,GACR,QAAU,KACV,SAAW,GACX,QAAkC,CAAC,EACnC,QAAU,CAAC,EAEX,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,MAAO,WAAY,SAAS,EAElD,iBAAiB,EAAS,CAExB,GADA,MAAM,kBAAkB,EACpB,KAAK,MAAQ,IACb,SAAY,CACZ,IAAM,EAAU,MAAM,MAAM,KAAK,GAAG,EACpC,KAAK,MAAQ,MAAM,EAAQ,KAAK,IAC/B,EACE,QAAI,KAAK,QAAU,GACxB,GAAI,KAAK,SACP,KAAK,MAAQ,KAAK,UAElB,UAAK,MAAQ,KAAK,aAAe,KAAO,KAAK,YAAc,GAIjE,UAAkD,IAAY,GAG9D,MAAM,EAAG,CACP,MAAM,OAAO,EAEb,GAAI,KAAK,YACP,OAAO,KAAK,UAAY,SAAW,KAAK,MAAM,KAAK,OAAO,EAAI,KAAK,QAErE,IAAM,EAAS,GAAS,KAAK,WAAY,KAAK,KAAK,EACnD,GAAI,KAAK,SAAU,CACjB,IAAM,EAAS,EACZ,MAAM;AAAA,CAAI,EACV,OAAO,CAAC,EAAkB,IAAiB,CAC1C,GAAI,EAAK,WAAW,GAAG,GAAK,EAAO,SAAW,EAC5C,EAAO,KAAK,CAAI,EACX,KACL,IAAM,EAAY,EAAO,EAAO,OAAS,GACzC,GAAI,CAAC,EAAU,WAAW,GAAG,GAAK,CAAC,EAAU,SAAS,GAAG,EACvD,EAAO,EAAO,OAAS,IAAM;AAAA,EAAO,EAEpC,OAAO,KAAK,CAAI,EAGpB,OAAO,GACN,CAAC,CAAa,EACnB,KAAK,UAAY,EACd,IAAI,CAAC,IACJ,EAAM,WAAW,GAAG,GAAK,EAAM,SAAS,GAAG,EACvC,EACA,GAAO,EAAO,KAAK,OAAO,CAChC,EACC,KAAK,EAAE,EAEV,UAAK,UAAY,GAAO,EAAQ,KAAK,OAAO,EAE9C,KAAK,UAAU,EAEnB,CAEO,IAAM,GAAiB,GAAe,eAAe,CAC1D,IAAK,QACP,CAAC,ECjGD,oBAAS,eAAqB,iBAAU,eAKxC,IAAQ,OAAK,QAAM,WAAW,GAExB,GAAS,SACT,GAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC3B,GAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAE,EAG/C,GAAU,CAAC,EAAwB,EAAS,EAAG,EAAU,MAC7D,OAAO,CAAK,EAAE,SAAS,EAAQ,CAAO,EAClC,GAAc,CAAC,EAAc,EAAe,IAChD,IAAI,KAAK,GAAG,KAAQ,GAAQ,CAAK,KAAK,GAAQ,CAAI,GAAG,EAUhD,MAAM,WAAkB,EAAsB,CACnD,MAAQ,IACR,KAAO,IACP,QAAU,GAAY,IAAI,KAAK,EAAE,YAAY,EAAI,IAAK,EAAG,CAAC,EACvD,YAAY,EACZ,MAAM,GAAG,EAAE,GACd,QAAU,GAAY,IAAI,KAAK,EAAE,YAAY,EAAI,GAAI,GAAI,EAAE,EACxD,YAAY,EACZ,MAAM,GAAG,EAAE,GACd,UAAY,EACZ,WAAa,GACb,SAAW,GACX,MAAQ,GACR,SAAW,GACX,SAAW,GACX,aAAe,CAAC,EAChB,MAAQ,MAEJ,OAAM,EAAW,CACnB,MAAO,GAAI,KAAK,aAEd,OAAM,EAAyC,CACjD,OAAO,GAAO,IAAI,CAAC,KAAW,CAC5B,QAAS,GAAY,KAAM,EAAO,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,EAAE,GAC3D,MAAO,OAAO,CAAK,CACrB,EAAE,KAEA,MAAK,EAAa,CACpB,IAAM,EAAY,OAAO,KAAK,QAAQ,MAAM,GAAG,EAAE,EAAE,EAC7C,EAAU,OAAO,KAAK,QAAQ,MAAM,GAAG,EAAE,EAAE,EAC3C,EAAQ,CAAC,EACf,QAAS,EAAO,EAAW,GAAQ,EAAS,IAC1C,EAAM,KAAK,OAAO,CAAI,CAAC,EAEzB,OAAO,EAGT,aAAe,CAAC,EAAc,IAAkB,GAEhD,SAAS,CAAC,EAAc,EAAe,CACrC,GAAI,KAAK,QAAU,GAAS,KAAK,OAAS,EACxC,KAAK,MAAQ,EACb,KAAK,KAAO,EACZ,KAAK,aAAa,EAAM,CAAK,EAIjC,SAAW,IAAM,CACf,KAAK,UACH,OAAO,KAAK,MAAM,KAAK,KAAK,EAC5B,OAAO,KAAK,MAAM,MAAM,KAAK,CAC/B,MAGE,GAAE,EAAW,CACf,OAAO,KAAK,aAAa,IAAM,MAG7B,GAAE,CAAC,EAAoB,CACzB,KAAK,aAAa,GAAK,EACvB,KAAK,aAAa,OAAO,CAAC,KAGxB,KAAI,EAAW,CACjB,OAAO,KAAK,aAAa,IAAM,MAG7B,KAAI,CAAC,EAAoB,CAC3B,KAAK,aAAa,GAAK,EACvB,KAAK,aAAa,OAAO,CAAC,EAG5B,UAAY,CAAC,IAAiB,CAC5B,IAAM,EAAc,EAAM,OAAuB,aAC/C,OACF,EACA,KAAK,WAAW,CAAU,GAG5B,QAAU,CAAC,IAAyB,CAClC,IAAI,EAAY,GAChB,OAAQ,EAAM,UACP,QACH,IAAM,EAAc,EAAM,OAAuB,aAC/C,OACF,EACA,KAAK,WAAW,CAAU,EAC1B,EAAY,GACZ,UACG,MACH,cAEA,QAAQ,IAAI,CAAK,EAErB,GAAI,EACF,EAAM,eAAe,EACrB,EAAM,gBAAgB,GAI1B,GAAa,GACb,WAAa,CAAC,IAAuB,CAEnC,GADA,KAAK,GAAa,EACd,KAAK,MAAO,CACd,GAAI,CAAC,KAAK,GACR,KAAK,aAAe,CAAC,EAAY,CAAU,EACtC,QAAI,KAAK,OAAS,GAAc,KAAK,KAAO,EACjD,KAAK,aAAe,CAAC,EAChB,QAAI,KAAK,OAAS,EACvB,KAAK,KAAO,KAAK,GACZ,QAAI,KAAK,KAAO,EACrB,KAAK,GAAK,KAAK,KACV,QAAI,EAAa,KAAK,KAC3B,KAAK,KAAO,EACP,QAAI,EAAa,KAAK,GAC3B,KAAK,GAAK,EACL,QAAI,EAAa,KAAK,KAC3B,KAAK,KAAO,EAEZ,UAAK,GAAK,EAEZ,KAAK,MAAQ,GAAG,KAAK,QAAQ,KAAK,KAC7B,QAAI,KAAK,SAAU,CACxB,GAAI,KAAK,aAAa,SAAS,CAAU,EACvC,KAAK,aAAa,OAAO,KAAK,aAAa,QAAQ,CAAU,EAAG,CAAC,EAEjE,UAAK,aAAa,KAAK,CAAU,EACjC,KAAK,aAAa,KAAK,EAEzB,KAAK,MAAQ,KAAK,aAAa,KAAK,GAAG,EAClC,QAAI,KAAK,WACd,GAAI,KAAK,aAAa,SAAS,CAAU,EACvC,KAAK,MAAQ,GACb,KAAK,aAAe,CAAC,EAErB,UAAK,MAAQ,EACb,KAAK,aAAe,CAAC,CAAU,GAKrC,UAAY,IAAM,CAChB,GAAI,KAAK,MAAQ,GACf,KAAK,UAAU,KAAK,KAAM,KAAK,MAAQ,CAAC,EAExC,UAAK,UAAU,KAAK,KAAO,EAAG,CAAC,GAInC,cAAgB,IAAM,CACpB,GAAI,KAAK,MAAQ,EACf,KAAK,UAAU,KAAK,KAAM,KAAK,MAAQ,CAAC,EAExC,UAAK,UAAU,KAAK,KAAO,EAAG,EAAE,GAIpC,SAAW,CAAC,IAAuB,CACjC,GAAI,CAAC,KAAK,MACR,OAAO,KAAK,aAAa,SAAS,CAAU,EACvC,QAAI,KAAK,MACd,OAAO,KAAK,MAAQ,GAAc,KAAK,MAAQ,GAAc,KAAK,GAEpE,MAAO,IAGT,aAAe,CAAC,EAAoB,EAAU,KAAiB,CAE7D,OADA,EAAa,EAAW,MAAM,GAAG,EAAE,GAC5B,CACL,QAAS,GAAW,EACpB,QAAS,IACP,CAAC,EAAW,WAAW,GAAG,KAAK,QAAQ,GAAQ,KAAK,KAAK,IAAI,EAC/D,OAAQ,IAAM,CACZ,KAAK,SAAS,CAAU,EAE5B,GAGF,SAAW,IAAM,CACf,EAAQ,CACN,OAAQ,KAAK,MAAM,KACnB,UAAW,CACT,KAAK,aAAa,IAAI,KAAK,EAAE,YAAY,EAAG,YAAY,EACxD,GAAI,KAAK,aAAa,SAAW,EAAI,CAAC,EAAI,CAAC,IAAI,EAC/C,GAAG,KAAK,aAAa,IAAI,CAAC,IAAS,KAAK,aAAa,CAAI,CAAC,CAC5D,CACF,CAAC,GAGH,QAAU,IAAM,CACd,GACE,CAAE,KAAM,QAAS,EACjB,GACE,CACE,KAAM,WACN,QAAS,KAAK,aAChB,EACA,EAAM,YAAY,CACpB,EACA,GAAK,CAAE,MAAO,CAAE,KAAM,GAAI,CAAE,CAAC,EAC7B,GACE,CACE,KAAM,OACN,QAAS,KAAK,QAChB,EACA,EAAM,SAAS,CACjB,EACA,EAAU,CACR,KAAM,QACN,QAAS,KAAK,OACd,SAAU,KAAK,QACjB,CAAC,EACD,EAAU,CACR,KAAM,OACN,QAAS,CAAC,KAAK,IAAI,EACnB,SAAU,KAAK,QACjB,CAAC,EACD,GAAK,CAAE,MAAO,CAAE,KAAM,GAAI,CAAE,CAAC,EAC7B,GACE,CACE,KAAM,OACN,QAAS,KAAK,SAChB,EACA,EAAM,aAAa,CACrB,CACF,EACA,GAAI,CAAE,KAAM,MAAO,CAAC,EACpB,GAAI,CAAE,KAAM,MAAO,CAAC,CACtB,EAEA,QAAQ,CAAC,EAAoB,CAC3B,IAAM,EAAO,IAAI,KAAK,CAAU,EAChC,KAAK,UAAU,EAAK,YAAY,EAAG,EAAK,SAAS,EAAI,CAAC,EAGxD,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eACH,QACA,OACA,YACA,UACA,UACA,aACA,WACA,QACA,WACA,UACF,EAGF,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EACxB,IAAM,EAAO,IAAI,KAAK,KAAK,MAAM,MAAM,GAAG,EAAE,IAAI,GAAK,KAAK,IAAI,CAAC,EAC/D,GAAI,MAAM,KAAK,KAAK,EAClB,KAAK,MAAQ,EAAK,SAAS,EAAI,EAEjC,GAAI,MAAM,KAAK,IAAI,EACjB,KAAK,KAAO,EAAK,YAAY,EAGjC,KAAO,CAAC,EAQR,MAAM,EAAG,CACP,IAAQ,OAAM,OAAM,OAAM,QAAO,OAAM,WAAU,QAAS,KAAK,MAC/D,KAAK,aAAe,KAAK,MAAQ,KAAK,MAAM,MAAM,GAAG,EAAI,CAAC,EAC1D,IAAM,EAAe,GAAY,KAAK,KAAM,KAAK,MAAO,CAAC,EACnD,EAAY,IAAI,KACpB,EAAa,QAAQ,GACjB,EAAI,EAAa,OAAO,EAAI,KAAK,WAAa,EAAK,EACzD,EACM,EAAY,KAAK,QAAU,GAAK,EAAI,KAAK,MAAQ,EACjD,EAAc,IAAI,KACtB,GACE,KAAK,MAAQ,KAAK,QAAU,GAAK,EAAI,GACrC,EACA,CACF,EAAE,QAAQ,EAAI,EAChB,EACM,EAAS,IAAI,KACjB,EAAY,QAAQ,GAChB,KAAK,UAAY,EAAI,EAAI,KAAK,OAAS,EAAY,OAAO,GAAK,EAC/D,EACN,EAEM,EAAW,GAAK,IACpB,CAAC,IACC,IAAI,KAAK,EAAU,QAAQ,EAAI,EAAM,EAAM,EAAE,SAAS,EAAE,MAAM,GAAG,EAAE,EACvE,EACA,KAAK,KAAO,CAAC,EACb,IAAM,EAAQ,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,GAClD,QACM,EAAM,EAAU,QAAQ,EAC5B,GAAO,EAAO,QAAQ,EACtB,GAAO,GACP,CACA,IAAM,EAAO,IAAI,KAAK,CAAG,EACnB,EAAa,EAAK,YAAY,EAAE,MAAM,GAAG,EAAE,GACjD,KAAK,KAAK,KAAK,CACb,OACA,SAAU,GACV,QAAS,EAAK,SAAS,EAAI,IAAM,KAAK,MACtC,QAAS,IAAe,EACxB,UAAW,EAAK,OAAO,EAAI,IAAM,EACjC,QAAS,CAAC,EACR,KAAK,MACL,GAAc,KAAK,MACnB,GAAc,KAAK,GAEvB,CAAC,EAGH,EAAM,MAAQ,OAAO,KAAK,KAAK,EAC/B,EAAK,MAAQ,OAAO,KAAK,IAAI,EAQ7B,IAAM,IANH,EAAM,SACP,EAAK,SACL,EAAK,SACL,EAAS,SACT,EAAK,SACH,KAAK,UAAY,KAAK,WAET,CAAC,KAAK,YAAc,CAAC,KAAK,OAAS,CAAC,KAAK,SAC1D,EAAK,QAAU,KAAK,MACpB,EAAK,YAAc,GACnB,EAAK,OAAO,GAAG,EAAS,IAAI,CAAC,IAAQ,GAAK,CAAE,MAAO,KAAM,EAAG,CAAG,CAAC,CAAC,EACjE,EAAK,YAAc,GACnB,IAAI,GAAmC,MAC/B,MAAI,SAAS,KAwCrB,GAvCA,EAAK,OACH,GAAG,KAAK,KAAK,IAAI,CAAC,IAAQ,CACxB,IAAM,EAAU,CAAC,MAAM,EACvB,GAAI,EAAI,QACN,EAAQ,KAAK,UAAU,EAEzB,GAAI,EAAI,QACN,EAAQ,KAAK,OAAO,EAEtB,IAAM,EAAa,EAAI,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,GACrD,GAAI,KAAK,SAAS,CAAU,EAC1B,EAAQ,KAAK,SAAS,EAGxB,GADA,EAAQ,KAAK,EAAI,UAAY,UAAY,SAAS,EAC9C,KAAK,MAAO,CACd,GAAI,KAAO,EACT,EAAQ,KAAK,WAAW,EAE1B,GAAI,KAAS,EACX,EAAQ,KAAK,aAAa,EAG9B,IAAM,GAAU,GACd,CACE,MAAO,EAAQ,KAAK,GAAG,EACvB,MAAO,EACP,QAAS,KAAK,UACd,UAAW,KAAK,QAChB,SAAU,GACZ,EACA,EAAI,KAAK,QAAQ,CACnB,EACA,GAAI,IAAe,KAAK,GACtB,GAAe,GAEjB,OAAO,GACR,CACH,EAEI,GAAc,GAAa,MAAM,EAEzC,CAEO,IAAM,GAAY,GAAU,eAAe,CAChD,IAAK,aACL,UAAW,CACT,QAAS,CACP,QAAS,OACX,EACA,sBAAuB,CACrB,QAAS,OACT,WAAY,UACZ,eAAgB,SAClB,EACA,kBAAmB,CACjB,cAAe,OACf,QAAS,EAAW,gBAAgB,GAAG,CACzC,EACA,4CAA6C,CAC3C,YAAa,MACb,KAAM,GACR,EACA,uCAAwC,CACtC,QAAS,OACT,oBAAqB,qCACrB,aAAc,SAChB,EACA,eAAgB,CACd,WAAY,EAAW,qBAAqB,aAAa,EACzD,UAAW,EAAW,iBAAiB,MAAM,EAC7C,eAAgB,EAAW,yBAAyB,iBAAiB,EACrE,WAAY,EAAW,qBAAqB,KAAK,CACnD,EACA,0BAA2B,CACzB,QAAS,EACT,QAAS,OACT,eAAgB,SAChB,WAAY,MACd,EACA,aAAc,CACZ,MAAO,EAAW,cAAc,SAAS,EACzC,WAAY,EAAW,mBAAmB,OAAO,EACjD,WAAY,EAAW,mBAAmB,KAAK,CACjD,EACA,cAAe,CACb,OAAQ,SACV,EACA,iBAAkB,CAChB,WAAY,EAAW,uBAAuB,MAAM,CACtD,EACA,6BAA8B,CAC5B,QAAS,GACX,EACA,sBAAuB,CACrB,MAAO,EAAW,sBAAsB,OAAO,EAC/C,WAAY,EAAW,2BAA2B,SAAS,CAC7D,EACA,mCAAoC,CAClC,aAAc,EAAW,6BAA6B,MAAM,CAC9D,EACA,qBAAsB,CACpB,oBAAqB,EAAW,6BAA6B,MAAM,EACnE,uBAAwB,EAAW,6BAA6B,MAAM,CACxE,EACA,mBAAoB,CAClB,qBAAsB,EAAW,6BAA6B,MAAM,EACpE,wBAAyB,EAAW,6BAA6B,MAAM,CACzE,CACF,CACF,CAAC,ECvaD,oBAAS,eAAW,WAAU,eAG9B,IAAQ,OAAK,WAAW,GAYlB,GAAY,CAChB,MAAO,MACP,KAAM,SACN,KAAM,YACN,IAAK,OACL,QAAS,QACT,SAAU,WACZ,EAIO,MAAM,WAAwB,EAAU,OAC9B,iBAER,WAAY,CACjB,QAAS,CACP,qBAAsB,EACtB,mBAAoB,IACpB,qBAAsB,GAAG,EAAK,uBAAuB,EAAK,yBAAyB,EAAK,uBAAuB,EAAK,yBACpH,gBAAiB,UACjB,yBAA0B,OAC1B,uBAAwB,OACxB,sBAAuB,EAAK,uBAC5B,wBAAyB,GACzB,yBAA0B,UAC1B,0BAA2B,EAAK,sBAChC,SAAU,QACV,KAAM,EACN,MAAO,EACP,OAAQ,EACR,cAAe,EAAK,oBACpB,MAAO,EAAK,kBACZ,QAAS,OACT,cAAe,iBACf,OAAQ,SACR,IAAK,EAAK,oBACV,UAAW,OACX,SAAU,cACV,UAAW,iBACb,EACA,UAAW,CACT,MAAO,EAAK,qBACd,EACA,cAAe,CACb,QAAS,OACT,WAAY,EAAK,eACjB,QAAS,EAAK,oBACd,oBAAqB,GAAG,EAAK,4BAA4B,EAAK,yBAC9D,IAAK,EAAK,oBACV,WAAY,SACZ,aAAc,EAAK,yBACnB,UAAW,oCAAoC,EAAK,0BACpD,YAAa,EAAK,wBAClB,YAAa,EAAK,wBAClB,YAAa,QACb,WAAY,eACZ,mBAAoB,kBACpB,OAAQ,CACV,EACA,oBAAqB,CACnB,OAAQ,EAAK,uBACf,EACA,qBAAsB,CACpB,QAAS,OACT,WAAY,EAAK,uBACjB,QAAS,EACT,OAAQ,EACR,OAAQ,EAAK,uBACb,MAAO,EAAK,uBACZ,WAAY,cACZ,WAAY,SACZ,eAAgB,SAChB,UAAW,OACX,OAAQ,OACR,SAAU,UACZ,EACA,+BAAgC,CAC9B,OAAQ,EAAK,uBACf,EACA,gCAAiC,CAC/B,aAAc,GACd,OAAQ,EAAK,eACb,WAAY,EAAK,wBACjB,QAAS,EAAK,SAChB,EACA,kBAAmB,CACjB,OAAQ,EAAK,qBACb,MAAO,EAAK,qBACZ,cAAe,MACjB,EACA,iBAAkB,CAChB,QAAS,OACT,cAAe,SACf,WAAY,SACZ,IAAK,EAAK,mBACZ,EACA,sBAAuB,CACrB,QAAS,EACT,OAAQ,CACV,CACF,QAEO,WAAU,CAAC,EAAmB,CACnC,EAAK,UAAU,IAAI,SAAS,EAC5B,EAAK,MAAM,aAAe,CAAC,EAAK,aAAe,KAC/C,IAAM,EAAS,IAAM,CACnB,EAAK,OAAO,GAEd,EAAK,iBAAiB,gBAAiB,CAAM,EAC7C,WAAW,EAAQ,IAAI,QAGlB,KAAI,CAAC,EAA2C,CACrD,IAAQ,UAAS,WAAU,OAAM,QAAO,WAAU,OAAM,SACtD,OAAO,OACL,CAAE,KAAM,OAAQ,SAAU,EAAG,EAC7B,OAAO,IAAS,SAAW,CAAE,QAAS,CAAK,EAAI,CACjD,EAEF,GAAI,CAAC,KAAK,UACR,KAAK,UAAY,GAAgB,EAGnC,IAAM,EAAY,KAAK,UAEvB,SAAS,KAAK,OAAO,CAAS,EAC9B,EAAU,MAAM,OAAS,OAAO,EAAa,EAAI,CAAC,EAElD,IAAM,EAA2B,GAAS,GAAU,GAC9C,EACJ,GAAY,IAAS,WAAa,GAAS,SAAS,EAAI,CAAC,EACrD,EAAgB,IAAM,CAC1B,GAAI,EACF,EAAM,EAER,GAAgB,WAAW,CAAI,GAE3B,EACJ,aAAgB,WACZ,EACA,EACA,EAAM,GAAM,CAAE,MAAO,MAAO,CAAC,EAC7B,EAAM,KAAK,CAAE,MAAO,MAAO,CAAC,EAC5B,EAAO,GACX,CACE,MAAO,QAAQ,IACf,MAAO,CACL,0BACF,CACF,EACA,EACA,GAAI,CAAE,MAAO,SAAU,EAAG,GAAI,CAAO,EAAG,CAAW,EACnD,GACE,CACE,MAAO,QACP,MAAO,QAEP,KAAK,CAAC,EAAK,CACT,EAAI,iBAAiB,QAAS,CAAa,EAE/C,EACA,EAAM,EAAE,CACV,CACF,EAIA,GAFA,EAAU,WAAY,OAAO,CAAI,EAG/B,aAAuB,qBACvB,aAAoB,SACpB,CACA,EAAY,aAAa,MAAO,OAAO,GAAG,CAAC,EAC3C,EAAY,MAAQ,EAAS,EAC7B,IAAM,EAAW,YAAY,IAAM,CACjC,GAAI,CAAC,EAAU,WAAY,SAAS,CAAI,EAAG,CACzC,cAAc,CAAQ,EACtB,OAEF,IAAM,GAAa,EAAS,EAE5B,GADA,EAAY,MAAQ,GAChB,IAAc,IAChB,GAAgB,WAAW,CAAI,GAEhC,IAAI,EAGT,GAAI,EAAW,EACb,WAAW,IAAM,CACf,GAAgB,WAAW,CAAI,GAC9B,EAAW,IAAI,EAKpB,OAFA,EAAK,eAAe,EAEb,EAGT,QAAU,IACZ,CAEO,IAAM,GAAkB,GAAgB,eAAe,CAC5D,IAAK,kBACP,CAAC,EAEM,SAAS,EAAgB,CAAC,EAA2C,CAC1E,OAAO,GAAgB,KAAK,CAAI,EClMlC,oBAAS,eAAW,WAAU,iBAAM,eAE7B,IAAM,GAAS,MAAO,EAAW,EAAS,UAA6B,CAG5E,IAAM,EADU,IAAI,YAAY,EACX,OAAO,CAAC,EAGvB,EAAa,MAAM,OAAO,OAAO,OAAO,EAAQ,CAAI,EAM1D,OAHkB,MAAM,KAAK,IAAI,WAAW,CAAU,CAAC,EAC7B,IAAI,CAAC,IAAM,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,GAKlE,GAAa,MAAO,IAAuC,CACtE,IAAM,EAAU,MAAM,GAAO,CAAQ,EAE/B,EAAW,MAAM,MAAM,sCAAsC,GAAS,EAC5E,GAAI,EAAS,GAAI,CACf,IAAM,EAAS,MAAM,EAAS,KAAK,EACnC,QAAQ,IAAI,sCAAuC,CAAM,EAG3D,OAAO,EAAS,SAAW,MAGrB,QAAM,YAAY,GACnB,MAAM,WAA4B,EAAU,CACjD,UAAY,EACZ,WAAa,GACb,gBAAkB,gCAClB,kBAAoB,gCACpB,OAAS,CACP,SAAU,GACV,MAAO,GACP,QAAS,GACT,QAAS,GACT,SAAU,GACV,UAAW,EACb,EACA,kBAAoB,CAClB,SAAU,YACV,MAAO,QACP,QAAS,gBACT,QAAS,gBACT,SAAU,YACV,UAAW,uBACb,EACA,MAAQ,EACR,qBAAuB,CACrB,eACA,YACA,OACA,WACA,SACA,aACF,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,YAAa,aAAc,iBAAiB,EAGlE,QAAQ,CAAC,EAA0B,CAUjC,OATA,KAAK,OAAS,CACZ,SAAU,EAAS,OAAS,KAAK,UACjC,MAAO,EAAS,OAAS,KAAK,WAC9B,QAAS,CAAC,EAAS,MAAM,OAAO,EAChC,QAAS,CAAC,EAAS,MAAM,OAAO,EAChC,SAAU,CAAC,EAAS,MAAM,OAAO,EACjC,UAAW,CAAC,EAAS,MAAM,cAAc,CAC3C,EAEO,KAAK,OAAO,SACf,EACA,OAAO,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,IAAM,CAAC,CAAC,EAAE,OAAS,OAGtD,WAAU,EAAqB,CACnC,IAAM,EAAW,KAAK,cAAc,OAAO,GAAG,MAE9C,GAAI,CAAC,GAAY,OAAO,IAAa,SACnC,MAAO,GAGT,OAAO,MAAM,GAAW,CAAQ,EAGlC,gBAAkB,CAAC,IAAqB,CACtC,IAAQ,QAAO,eAAgB,KAAK,MAI9B,EAAS,KAAK,gBAAgB,MAAM,GAAG,EACvC,EAAoB,KAAK,kBAAkB,MAAM,GAAG,EACpD,EAAW,KAAK,SAAS,CAAQ,EACvC,GAAI,KAAK,QAAU,EACjB,KAAK,MAAQ,EACb,KAAK,cAAc,IAAI,MAAM,QAAQ,CAAC,EAExC,EAAM,MAAM,MAAQ,IAAI,EAAW,GAAK,SACxC,KAAK,MAAM,YAAY,oBAAqB,EAAO,EAAS,EAC5D,KAAK,MAAM,YAAY,sBAAuB,EAAkB,EAAS,EACzE,EAAY,YAAc,KAAK,qBAAqB,IAGtD,OAAS,CAAC,IAAiB,CACzB,IAAM,EAAS,EAAM,OAAuB,QAAQ,OAAO,EAE3D,KAAK,gBAAgB,GAAO,OAAS,EAAE,GAGzC,QAAU,IAAM,CACd,GAAQ,CAAE,QAAS,KAAK,MAAO,CAAC,EAChC,GACE,CAAE,KAAM,OAAQ,EAChB,GAAK,CAAE,KAAM,OAAQ,CAAC,EACtB,GAAK,CAAE,KAAM,aAAc,CAAC,CAC9B,CACF,EAEA,MAAM,EAAG,CACP,MAAM,OAAO,EAEb,IAAM,EAAQ,KAAK,cAAc,OAAO,EACxC,KAAK,gBAAgB,GAAO,KAAK,EAErC,CAEO,IAAM,GAAsB,GAAoB,eAAe,CACpE,IAAK,wBACL,UAAW,CACT,QAAS,CACP,QAAS,cACT,cAAe,SACf,IAAK,GAAK,UACV,SAAU,UACZ,EACA,iBAAkB,CAChB,QAAS,MACX,EACA,uBAAwB,CACtB,QAAS,QACT,SAAU,WACV,OAAQ,EAAW,YAAY,MAAM,EACrC,WAAY,EAAW,YAAY,OAAO,EAC1C,aAAc,EAAW,YAAY,KAAK,EAC1C,UAAW,EAAW,YACpB,mBAAmB,GAAK,gBAC1B,CACF,EACA,uBAAwB,CACtB,OAAQ,EAAW,YAAY,MAAM,EACrC,QAAS,MACT,QAAS,eACT,MAAO,EACP,WAAY,iBACZ,WAAY,GAAK,eACjB,OAAQ,EAAW,YAAY,KAAK,EACpC,aAAc,EAAW,YAAY,KAAK,CAC5C,EACA,6BAA8B,CAC5B,SAAU,WACV,MAAO,IACP,MAAO,GAAK,iBACZ,OAAQ,EAAW,YAAY,MAAM,EACrC,WAAY,EAAW,YAAY,MAAM,EACzC,UAAW,QACb,CACF,CACF,CAAC,EC7RD,oBAAS,eAAW,WAA0B,gBAG9C,IAAQ,SAAS,GAQV,MAAM,WAAkB,EAAU,CACvC,SAAW,GACX,IAAa,EACb,IAAM,EACN,KAAO,EACP,MAAuB,KACvB,KAAO,OACP,WAAa,OACb,aAAe,OACf,UAAY,OACZ,YAAc,OACd,SAAW,GACX,OAAS,SAEF,WAAY,CACjB,QAAS,CACP,QAAS,eACT,SAAU,WACV,MAAO,aACT,EACA,yBAA0B,CACxB,SAAU,WACV,QAAS,cACX,EACA,0CAA2C,CACzC,OAAQ,OACR,WAAY,SACZ,SAAU,QACZ,EACA,qBAAsB,CACpB,cAAe,OACf,aAAc,GAAK,UACnB,eAAgB,GAAK,WACvB,EACA,sBAAuB,CACrB,SAAU,WACV,KAAM,EACN,aAAc,GAAK,WACnB,eAAgB,GAAK,YACvB,EACA,YAAa,CACX,UAAW,aACX,cAAe,iBACf,WAAY,mBACd,EACA,kBAAmB,CACjB,UAAW,UACb,EACA,mBAAoB,CAClB,UAAW,YACb,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eACH,MACA,MACA,OACA,OACA,eACA,cACA,cACA,aACA,WACA,WACA,QACF,EAGF,QAAU,IACR,GACE,CAAE,KAAM,WAAY,EACpB,GAAK,CAAE,KAAM,OAAQ,CAAC,EACtB,GAAK,CAAE,KAAM,QAAS,CAAC,CACzB,EAEF,YAAY,CAAC,EAAsB,CACjC,IAAQ,QAAO,UAAW,KAAK,MACzB,EAAe,KAAK,OAAO,GAAS,GAAK,KAAK,IAAI,EAAI,KAAK,KACjE,EAAO,MAAM,MAAS,EAAe,KAAK,IAAO,EAAM,YAAc,KAGvE,OAAS,CAAC,IAAiB,CACzB,GAAI,KAAK,SACP,OAGF,IAAQ,SAAU,KAAK,MAEjB,EACJ,aAAiB,WACb,EAAM,MAAQ,EAAM,sBAAsB,EAAE,EAC5C,EACA,EAAQ,KAAK,IACjB,KAAK,IACH,KAAK,IACL,KAAK,MACD,EAAI,EAAM,YAAe,KAAK,IAAO,KAAK,KAAO,KAAK,KAAO,GACjE,EAAI,KAAK,IACX,EACA,KAAK,GACP,EACA,GAAI,EAAM,OAAS,QACjB,KAAK,MAAQ,EACR,QAAI,EAAM,OAAS,YACxB,KAAK,aAAa,CAAK,EAEvB,UAAK,aAAa,KAAK,OAAS,CAAC,GAIrC,UAAY,CAAC,IAAyB,CACpC,IAAI,EAAQ,OAAO,KAAK,KAAK,EAC7B,GAAI,GAAS,KACX,EAAQ,KAAK,OAAO,KAAK,IAAM,KAAK,KAAO,IAAM,KAAK,IAAI,EAAI,KAAK,KAErE,IAAI,EAAa,GACjB,OAAQ,EAAM,SACP,cACA,aACH,GAAS,KAAK,KACd,EAAa,GACb,UACG,gBACA,YACH,GAAS,KAAK,KACd,EAAa,GACb,MAGJ,GADA,KAAK,MAAQ,KAAK,IAAI,KAAK,IAAI,EAAO,KAAK,GAAG,EAAG,KAAK,GAAG,EACrD,EACF,EAAM,gBAAgB,EACtB,EAAM,eAAe,GAIzB,iBAAiB,EAAG,CAClB,MAAM,kBAAkB,EAExB,IAAQ,aAAc,KAAK,MAE3B,EAAU,SAAW,EACrB,EAAU,iBAAiB,YAAa,KAAK,OAAQ,EAAI,EACzD,EAAU,iBAAiB,aAAc,KAAK,MAAM,EACpD,EAAU,iBAAiB,OAAQ,KAAK,MAAM,EAC9C,EAAU,iBAAiB,QAAS,KAAK,MAAM,EAE/C,EAAU,iBAAiB,UAAW,KAAK,SAAS,EAG9C,cAAgB,GAExB,MAAM,EAAG,CACP,MAAM,OAAO,EAEb,IAAM,EAAS,KAAK,SAAW,KAO/B,GANA,KAAK,MAAM,YAAY,gBAAiB,KAAK,UAAU,EACvD,KAAK,MAAM,YAAY,kBAAmB,KAAK,YAAY,EAC3D,KAAK,MAAM,YAAY,eAAgB,KAAK,SAAS,EACrD,KAAK,MAAM,YAAY,iBAAkB,KAAK,WAAW,EACzD,KAAK,MAAM,YAAY,kBAAmB,CAAM,EAE5C,KAAK,SACP,KAAK,KAAO,QAEZ,UAAK,KAAO,SAEd,KAAK,UAAY,UAAU,KAAK,gBAAgB,KAAK,MACrD,KAAK,aAAe,OAAO,KAAK,GAAG,EACnC,KAAK,aAAe,OAAO,KAAK,GAAG,EACnC,KAAK,aAAe,KAAK,QAAU,KAAO,OAAO,EAAE,EAAI,OAAO,KAAK,KAAK,EAExE,IAAQ,QAAO,UAAW,KAAK,MAG/B,GAFA,EAAM,UAAU,OAAO,SAAU,KAAK,MAAM,EAExC,KAAK,gBAAkB,KAAK,KAAM,CACpC,KAAK,cAAgB,KAAK,KAC1B,QAAS,EAAI,EAAG,EAAI,KAAK,IAAK,IAC5B,EAAM,OAAO,EAAM,KAAK,MAAM,CAAC,EAC/B,EAAO,OAAO,EAAM,KAAK,MAAM,CAAC,EAIpC,KAAK,aAAa,KAAK,KAAK,EAEhC,CAEO,IAAM,GAAY,GAAU,eAAe,CAChD,IAAK,YACP,CAAC,ECzKD,oBAAS,eAAqD,gBAK9D,IAAQ,WAAS,OAAK,UAAQ,SAAS,GAEjC,GAAc,CAClB,CACE,QAAS,QACT,QAAS,IACX,EACA,CACE,QAAS,UACT,QAAS,IACX,EACA,CACE,QAAS,aACT,QAAS,IACX,EACA,CACE,QAAS,gBACT,QAAS,IACX,EACA,CACE,QAAS,OACT,QAAS,GACX,EACA,CACE,QAAS,aACT,QAAS,KACX,CACF,EAEO,SAAS,EAAU,CAAC,EAAU,GAAa,CAChD,OAAO,EAAU,CACf,MAAO,kBACP,KAAM,UACN,MAAO,cACP,QAAS,EAAQ,IAAI,EAAG,UAAS,cAAe,CAC9C,UACA,MAAO,eAAe,GACxB,EAAE,CACJ,CAAC,EAGI,SAAS,EAAM,CAAC,EAAQ,OAAQ,CACrC,OAAO,GAAK,CACV,KAAM,UACN,MAAO,CAAE,KAAM,OAAO,IAAS,QAAS,GAAI,CAC9C,CAAC,EAGI,SAAS,EAAO,CAAC,EAAQ,OAAQ,CACtC,OAAO,GAAK,CACV,KAAM,UACN,MAAO,CAAE,KAAM,OAAO,IAAS,QAAS,GAAI,CAC9C,CAAC,EAGI,SAAS,CAAa,CAC3B,EACA,EACA,EACA,CACA,OAAO,GAAO,CAAE,KAAM,UAAW,cAAa,OAAM,EAAG,CAAI,EAG7D,IAAM,GAAwB,IAAM,CAClC,EAAc,eAAgB,cAAe,EAAM,UAAU,CAAC,EAC9D,EAAc,SAAU,gBAAiB,EAAM,YAAY,CAAC,EAC5D,EAAc,gBAAiB,eAAgB,EAAM,WAAW,CAAC,EACjE,GAAO,EACP,EAAc,cAAe,sBAAuB,EAAM,WAAW,CAAC,EACtE,EAAc,gBAAiB,oBAAqB,EAAM,WAAW,CAAC,EACtE,GAAO,EACP,EAAc,SAAU,SAAU,EAAM,OAAO,CAAC,EAChD,EAAc,SAAU,UAAW,EAAM,QAAQ,CAAC,CACpD,EAEM,GAAwB,IAAM,CAClC,EAAc,OAAQ,OAAQ,EAAM,SAAS,CAAC,EAC9C,EAAc,SAAU,SAAU,EAAM,WAAW,CAAC,EACpD,EAAc,YAAa,YAAa,EAAM,cAAc,CAAC,CAC/D,EAEM,GAAiB,IAAM,CAC3B,GAAW,EACX,GAAO,EACP,GAAG,GAAsB,CAC3B,EAEa,GAAkB,IAAM,CACnC,GAAW,EACX,GAAO,EACP,GAAG,GAAsB,EACzB,GAAO,EACP,GAAG,GAAsB,CAC3B,EAQO,MAAM,WAAiB,EAA0B,CACtD,QAA0C,UAElC,cAAgB,MAEpB,MAAK,EAAW,CAClB,OAAO,KAAK,cACR,KAAK,MAAM,IAAI,UACf,KAAK,YAAc,KAAK,aAG1B,MAAK,CAAC,EAAiB,CACzB,GAAI,KAAK,cACP,KAAK,MAAM,IAAI,UAAY,EAE3B,UAAK,UAAY,EAIrB,YAAY,CAAC,EAAgC,CAC3C,IAAQ,OAAQ,KAAK,MACrB,MAAO,EAAI,gBAAkB,MAAQ,EAAI,gBAAkB,EACzD,EAAM,EAAI,cAEZ,OAAO,EAAI,gBAAkB,EAAO,EAAkB,UAGpD,eAAc,EAAU,CAC1B,IAAQ,OAAQ,KAAK,MACf,EAAY,OAAO,aAAa,EACtC,GAAI,IAAc,KAChB,MAAO,CAAC,EAEV,IAAM,EAAS,CAAC,EAChB,QAAS,EAAI,EAAG,EAAI,EAAU,WAAY,IAAK,CAC7C,IAAM,EAAQ,EAAU,WAAW,CAAC,EACpC,GAAI,CAAC,EAAI,SAAS,EAAM,uBAAuB,EAC7C,SAEF,IAAI,EAAwB,KAAK,aAC/B,EAAM,cACR,EACM,EAAY,KAAK,aAAa,EAAM,YAAY,EACtD,EAAO,KAAK,CAAK,EACjB,MAAO,IAAU,GAAa,IAAU,KACtC,EAAQ,EAAM,mBACd,EAAO,KAAK,CAAK,EAGrB,OAAO,KAGL,aAAY,EAAW,CACzB,IAAM,EAAY,OAAO,aAAa,EACtC,GAAI,IAAc,KAChB,MAAO,GAET,OAAO,KAAK,eAAe,OAAS,EAAU,SAAS,EAAI,GAG7D,gBAA4D,IAAM,GAIlE,mBAAqB,CAAC,IAAiB,CAErC,IAAM,EAAS,EAAM,OAAO,QAAQ,EAAU,OAAO,EACrD,GAAI,GAAU,KACZ,OAGF,KAAK,UAAU,EAAO,KAAK,GAG7B,kBAAoB,CAAC,IAAiB,CAEpC,IAAM,EAAS,EAAM,OAAO,QAAQ,QAAQ,EAC5C,GAAI,GAAU,KACZ,OAGF,KAAK,UAAU,EAAO,QAAQ,OAAO,GAGvC,QAAU,CACR,GAAQ,CACN,KAAM,UACN,KAAM,UACN,QAAS,KAAK,kBACd,SAAU,KAAK,kBACjB,CAAC,EACD,GAAI,CACF,KAAM,MACN,gBAAiB,GACjB,MAAO,CACL,KAAM,WACN,QAAS,MACX,CACF,CAAC,EACD,GAAQ,CACN,KAAM,SACR,CAAC,CACH,EAEA,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,SAAS,EAG/B,SAAS,CAAC,EAAkB,CAC1B,GAAI,IAAY,OACd,OAEF,IAAM,EAAO,EAAQ,MAAM,GAAG,EAE9B,QAAQ,IAAI,cAAe,EAAK,GAAI,GAAO,GAAG,EAAK,MAAM,CAAC,CAAC,EAC3D,SAAS,YAAY,EAAK,GAAI,GAAO,GAAG,EAAK,MAAM,CAAC,CAAC,EAGvD,gBAAgB,EAAG,CACjB,IAAM,EAAS,KAAK,MAAM,QAAQ,cAChC,cACF,EACA,GAAI,IAAW,KACb,OAEF,IAAI,EAAa,KAAK,eAAiC,IACrD,CAAC,IAAU,EAAM,OACnB,EACA,EAAY,CAAC,GAAG,IAAI,IAAI,CAAS,CAAC,EAClC,EAAO,MAAQ,EAAU,SAAW,EAAI,eAAe,EAAU,KAAO,GAG1E,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EAExB,IAAQ,MAAK,WAAY,KAAK,MAC9B,GAAI,EAAQ,YAAc,IAAM,EAAI,YAAc,GAChD,EAAI,UAAY,EAAQ,UACxB,EAAQ,UAAY,GAGtB,KAAK,cAAgB,GAErB,EAAQ,MAAM,QAAU,OAExB,SAAS,iBAAiB,kBAAmB,CAAC,IAAiB,CAC7D,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAAO,IAAI,EACjC,EAGH,MAAM,EAAS,CACb,IAAQ,WAAY,KAAK,MAIzB,GAFA,MAAM,OAAO,EAET,EAAQ,SAAS,SAAW,EAC9B,OAAQ,KAAK,aACN,UACH,EAAQ,OAAO,GAAG,GAAe,CAAC,EAClC,UACG,UACH,EAAQ,OAAO,GAAG,GAAgB,CAAC,EACnC,OAIV,CAEO,IAAM,GAAW,GAAS,eAAe,CAC9C,IAAK,WACL,UAAW,CACT,QAAS,CACP,QAAS,OACT,cAAe,SACf,OAAQ,MACV,EACA,yBAA0B,CACxB,QAAS,EACT,QAAS,OACT,IAAK,MACL,KAAM,WACN,SAAU,MACZ,EACA,kCAAmC,CACjC,aAAc,EAChB,CACF,CACF,CAAC,EC3QD,oBACE,eAEA,iBACA,eAKF,IAAQ,OAAK,QAAM,SAAO,QAAM,UAAU,GAanC,MAAM,WAAqB,EAAa,CAC7C,QAA6B,GAC7B,MAAQ,GACR,SAAW,GACX,KAAO,GACP,YAAc,kBACd,UAAY,GAEZ,MAAuB,QAEnB,OAAM,EAAa,CACrB,OAAQ,KAAK,OAAS,IACnB,MAAM,GAAG,EACT,IAAI,CAAC,IAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,IAAM,IAAM,EAAE,EAG3B,QAAU,IAAM,CACd,GAAK,EACL,GAAI,CAAE,KAAM,SAAU,EAAG,GAAM,CAAE,KAAM,SAAU,OAAQ,EAAK,CAAC,CAAC,CAClE,QAEO,WAAY,CACjB,QAAS,CACP,QAAS,cACT,IAAK,EAAW,mBAAmB,KAAK,EACxC,WAAY,EAAW,oBAAoB,QAAQ,CACrD,EACA,8BAA+B,CAC7B,cAAe,EAAW,mBAAmB,KAAK,CACpD,EACA,cAAe,CACb,QAAS,cACT,WAAY,SACZ,IAAK,EAAW,mBAAmB,KAAK,EACxC,oBACE,EAAW,2BAA2B,cAAc,EACtD,QAAS,EAAW,uBAAuB,UAAU,EACrD,KAAM,EAAW,oBAAoB,MAAM,CAC7C,EACA,oBAAqB,CACnB,QAAS,OACT,UAAW,EAAW,qBACpB,mBAAmB,EAAW,iCAAiC,MAAM,GACvE,EACA,aAAc,EAAW,6BAA6B,KAAK,CAC7D,EACA,4BAA6B,CAC3B,MAAO,EAAW,4BAA4B,MAAM,EACpD,WAAY,EAAW,iCAAiC,MAAM,CAChE,EACA,kCAAmC,CACjC,UAAW,EAAW,4BACpB,mBAAmB,EAAW,4BAA4B,MAAM,GAClE,CACF,EACA,YAAa,CACX,OAAQ,EAAW,sBAAsB,MAAM,EAC/C,OAAQ,EAAW,yBAAyB,cAAc,CAC5D,EACA,sBAAuB,CACrB,IAAK,EACL,oBAAqB,EAAW,2BAA2B,SAAS,CACtE,EACA,0DAA2D,CACzD,WAAY,EAAW,yBAAyB,QAAQ,CAC1D,EACA,uBAAwB,CACtB,QAAS,OACT,aAAc,EAAW,6BAA6B,KAAK,EAC3D,WAAY,EAAW,2BAA2B,MAAM,EACxD,MAAO,EAAW,qBAAqB,MAAM,EAC7C,SAAU,SACV,WAAY,EAAW,0BAA0B,SAAS,CAC5D,EACA,sBAAuB,CACrB,QAAS,EAAW,uBAAuB,UAAU,EACrD,MAAO,EAAW,4BAA4B,MAAM,EACpD,WAAY,EAAW,iCAAiC,MAAM,EAC9D,KAAM,EAAW,oBAAoB,MAAM,EAC3C,OAAQ,IACR,QAAS,MACX,EACA,mCAAoC,CAClC,MAAO,EAAW,4BAA4B,MAAM,EACpD,QAAS,EAAW,4BAA4B,IAAI,CACtD,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eACH,YACA,UACA,QACA,WACA,OACA,cACA,WACF,EAGM,aAAe,GACvB,aAAe,IAAM,CACnB,IAAQ,UAAS,UAAW,KAAK,MACjC,GAAI,KAAK,SAAU,CACjB,IAAM,EAAS,CACb,GAAG,EAAQ,iBAAiB,eAAe,CAC7C,EACA,KAAK,MAAQ,EAAO,IAAI,CAAC,IAAU,EAAM,KAAK,EAAE,KAAK,GAAG,EACnD,KACL,IAAM,EAAQ,EAAQ,cACpB,eACF,EACA,GAAI,CAAC,EACH,KAAK,MAAQ,KACR,QAAI,EAAM,MACf,EAAO,aAAa,SAAU,EAAE,EAChC,KAAK,MAAQ,EAAM,MAEnB,OAAO,gBAAgB,QAAQ,EAC/B,EAAO,MAAM,EACb,EAAO,OAAO,EACd,KAAK,MAAQ,EAAO,MAGxB,KAAK,aAAe,IAGtB,UAAY,CAAC,IAAyB,CACpC,IAAI,EAAa,GACjB,OAAQ,EAAM,UACP,QACH,GAAI,EAAM,kBAAkB,iBAC1B,EAAM,OAAO,MAAM,EACnB,EAAa,GAEf,UACG,MACH,GAAI,EAAE,EAAM,kBAAkB,kBACb,EAAM,OAAuB,QAC1C,OACF,EACM,MAAM,EAEd,UACG,gBACA,UACH,CACE,IAAM,EAAS,EAAM,OAAuB,QAC1C,OACF,EACA,GAAI,EAAM,kCAAkC,iBAC1C,EAAM,uBAAuB,MAAO,CAExC,CACA,EAAa,GACb,UACG,iBACA,YACH,CACE,IAAM,EAAS,EAAM,OAAuB,QAC1C,OACF,EACA,GAAI,EAAM,8BAA8B,iBACtC,EAAM,mBAAmB,MAAO,CAEpC,CACA,EAAa,GACb,MAEJ,GAAI,EACF,EAAM,eAAe,EACrB,EAAM,gBAAgB,GAI1B,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EACxB,IAAQ,WAAY,KAAK,MAEzB,GAAI,KAAK,OAAS,GAChB,KAAK,KAAO,KAAK,WAMnB,GAHA,EAAQ,iBAAiB,SAAU,KAAK,YAAY,EACpD,EAAQ,iBAAiB,UAAW,KAAK,SAA0B,EAE/D,KAAK,OAAS,KAAK,SACrB,QAAQ,KACN,KACA,2DACF,EACA,KAAK,MAAQ,MAIL,SAAQ,EAAa,CAC/B,IAAM,EAAoB,MAAM,QAAQ,KAAK,OAAO,EAChD,KAAK,QACL,KAAK,QACF,MAAM,GAAG,EACT,OAAO,CAAC,IAAM,EAAE,KAAK,IAAM,EAAE,EAC7B,IAAI,CAAC,IAAM,CACV,IAAO,EAAO,GAAW,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,IAAM,EAAE,KAAK,CAAC,GAClD,EAAS,IAAa,GAAW,GACrC,MAAM,GAAG,EACT,IAAI,CAAC,IAAM,EAAE,KAAK,CAAC,EAEhB,EAAO,EAAW,EAAM,GAAU,EAAI,GAE5C,MADe,CAAE,QAAO,OAAM,SAAQ,EAEvC,EAEP,GAAI,KAAK,OAAS,CAAC,KAAK,SAAU,CAChC,IAAO,EAAS,GAAQ,KAAK,MAAM,MAAM,GAAG,EAC5C,EAAQ,KAAK,CACX,MAAO,GACP,UACA,MACF,CAAC,EAGH,OAAO,KAGL,aAAY,EAAY,CAC1B,OAAO,QACL,KAAK,QAAU,IACZ,KAAK,OACJ,CAAC,KAAK,SAAS,KAAK,CAAC,IAAW,EAAO,QAAU,KAAK,KAAK,CACjE,EAGF,MAAM,EAAG,CAGP,GAFA,MAAM,OAAO,EAET,KAAK,aAAc,CACrB,KAAK,aAAe,GACpB,OAGF,IAAQ,UAAS,UAAW,KAAK,MACjC,EAAQ,YAAc,GACtB,IAAM,EAAO,KAAK,SAAW,WAAa,SAClC,SAAQ,gBAAiB,KAmBjC,GAlBA,EAAQ,OACN,GAAG,KAAK,SAAS,IAAI,CAAC,IAAW,CAC/B,OAAO,GACL,CAAE,SAAU,CAAE,EACd,GAAM,CACJ,OACA,KAAM,KAAK,KACX,MAAO,EAAO,MACd,QACE,EAAO,SAAS,EAAO,KAAK,GAC3B,EAAO,QAAU,IAAM,EAC1B,SAAU,EACZ,CAAC,EACD,EAAO,MAAQ,CAAE,MAAO,SAAU,EAClC,KAAK,UAAY,EAAa,EAAO,OAAO,EAAI,GAAK,EAAO,OAAO,CACrE,EACD,CACH,EACI,KAAK,OAAS,CAAC,KAAK,SACtB,EAAO,OAAS,CAAC,EACjB,EAAO,MAAQ,EAAgB,KAAK,MAAmB,GACvD,EAAO,YAAc,KAAK,YAC1B,EAAQ,OAAO,CAAM,EAG3B,CAEO,IAAM,GAAe,GAAa,eAAe,CACtD,IAAK,eACP,CAAC,ECzYD,oBAAS,eAA2B,iBAAU,gBAE9C,IAAQ,SAAS,GAIV,MAAM,WAAgB,EAAU,CACrC,QAAU,IACV,QAAU,IACV,QAAU,GACV,eAAiB,GACjB,MAAkB,SAElB,QAAU,CAAC,GAAK,CAAE,KAAM,MAAO,KAAM,KAAM,CAAC,EAAG,GAAK,CAAE,KAAM,SAAU,CAAC,CAAC,QAEjE,WAAY,CACjB,QAAS,CACP,QAAS,OACT,oBAAqB,GAAG,GAAW,SACjC,KACF,KAAK,GAAW,aAAa,KAAK,IAClC,iBAAkB,OAClB,SAAU,WACV,OAAQ,GAAW,OAAO,aAAa,EACvC,WAAY,GAAW,kBAAkB,gBAAgB,CAC3D,EACA,aAAc,CACZ,SAAU,UACZ,EACA,yBAA0B,CACxB,QAAS,OACX,EACA,yBAA0B,CACxB,QAAS,OACX,CACF,EAEA,SAAW,IAAM,CACf,IAAQ,WAAY,KAAK,MACnB,EAAS,KAAK,aACpB,GAAI,IAAW,KACb,OAGF,IAAI,EAAW,KAAK,MAQpB,GANA,KAAK,QAAU,EAAO,YAAc,KAAK,QAGvC,CAAC,GAAG,KAAK,UAAU,EAAE,KAAK,CAAC,IACzB,aAAgB,QAAU,EAAK,aAAa,MAAM,IAAM,MAAQ,EAClE,IAAM,OAEN,EAAW,cACX,KAAK,MAAM,YAAY,cAAe,MAAM,EAC5C,KAAK,MAAM,YAAY,kBAAmB,IAAI,EACzC,QAAI,CAAC,KAAK,QACf,EAAW,SACX,EAAQ,UAAU,IAAI,sBAAsB,EAC5C,KAAK,MAAM,YAAY,cAAe,GAAG,KAAK,WAAW,EACzD,KAAK,MAAM,YACT,kBACA,eAAe,KAAK,YACtB,EACA,KAAK,MAAM,YAAY,WAAY,GAAG,EAMtC,QAJA,EAAQ,UAAU,OAAO,sBAAsB,EAC/C,KAAK,MAAM,YAAY,cAAe,KAAK,EAC3C,KAAK,MAAM,YAAY,kBAAmB,KAAK,EAE3C,KAAK,eACP,EAAW,kBACX,KAAK,MAAM,YAAY,WAAY,aAAa,EAEhD,OAAW,cACX,KAAK,MAAM,YAAY,WAAY,aAAa,EAIpD,GAAI,KAAK,QAAU,EACjB,KAAK,MAAQ,GAIT,SACR,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EACxB,KAAK,eAAiB,KAAK,MAAM,QAAQ,WAAW,SAAW,EAC/D,WAAW,iBAAiB,SAAU,KAAK,QAAQ,EAEnD,KAAK,SAAW,IAAI,iBAAiB,KAAK,QAAQ,EAClD,KAAK,SAAS,QAAQ,KAAM,CAAE,UAAW,EAAK,CAAC,EAC/C,KAAK,MAAM,YAAY,wBAAyB,IAAI,EACpD,WAAW,IAAM,CACf,KAAK,MAAM,eAAe,uBAAuB,GAChD,GAAG,EAGR,oBAAoB,EAAG,CACrB,MAAM,qBAAqB,EAC3B,KAAK,SAAS,WAAW,EAG3B,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,UAAW,UAAW,UAAW,gBAAgB,EAGvE,MAAM,EAAS,CACb,MAAM,OAAO,EACb,KAAK,SAAS,EAElB,CAEO,IAAM,GAAU,GAAQ,eAAe,CAC5C,IAAK,aACP,CAAC,EClID,oBAAS,eAA2C,gBAEpD,IAAQ,SAAS,GAwEV,MAAM,WAAkB,EAAa,CAC1C,SAAW,EACX,UAAY,EACZ,MAA4B,SAE5B,QAAU,CAAC,GAAK,CAAE,KAAM,QAAS,CAAC,EAAG,GAAK,CAAE,KAAM,QAAS,KAAM,OAAQ,CAAC,CAAC,QAEpE,WAAY,CACjB,QAAS,CACP,QAAS,eACT,SAAU,UACZ,CACF,EAEA,WAAW,EAAG,CACZ,MAAM,EACN,KAAK,eAAe,WAAY,WAAW,EAG7C,SAAW,IAAM,CACf,IAAQ,SAAQ,SAAU,KAAK,MACzB,EAAS,KAAK,aACpB,GAAI,EAAE,aAAkB,aACtB,OACK,QACL,EAAO,YAAc,KAAK,UAC1B,EAAO,aAAe,KAAK,UAE3B,EAAO,OAAS,GAChB,EAAM,OAAS,GACf,KAAK,MAAQ,QAEb,OAAO,OAAS,GAChB,EAAM,OAAS,GACf,KAAK,MAAQ,UAMjB,iBAAiB,EAAS,CACxB,MAAM,kBAAkB,EACxB,WAAW,iBAAiB,SAAU,KAAK,QAAQ,EAGrD,oBAAoB,EAAS,CAC3B,MAAM,qBAAqB,EAC3B,WAAW,oBAAoB,SAAU,KAAK,QAAQ,EAE1D,CAEO,IAAM,GAAY,GAAU,eAAe,CAChD,IAAK,eACP,CAAC,ECrGD,oBAAS,WAA2C,gBAI7C,MAAM,WAAiB,EAAa,CACzC,OAA8B,WAEvB,WAAY,CACjB,QAAS,CACP,gBAAiB,OACjB,QAAS,QACT,SAAU,WACV,OAAQ,GACR,MAAO,GACP,QAAS,GACT,MAAO,GACP,OAAQ,GACR,QAAS,KACT,WAAY,wBACd,EACA,gBAAiB,CACf,QAAS,GACX,EACA,YAAa,CACX,MAAO,GACP,OAAQ,GACR,OAAQ,GAAK,cACf,CACF,EAEA,QAAU,EAAM,OAAO,KAEnB,QAAO,EAAsC,CAC/C,IAAQ,WAAU,aAAc,iBAAiB,KAAK,MAAO,EAC7D,MAAO,CACL,MAAO,WAAW,CAAQ,GAAK,GAC/B,OAAQ,WAAW,CAAS,GAAK,EACnC,EAGF,aAAe,CAAC,IAAuB,CACrC,IAAQ,UAAW,KACnB,GAAI,CAAC,EAAQ,OACb,IAAiB,YAAX,EACW,aAAX,GAAI,EACV,EAAO,MAAM,KAAO,EAAO,WAAa,KACxC,EAAO,MAAM,IAAM,EAAO,UAAY,KACtC,EAAO,MAAM,OAAS,GACtB,EAAO,MAAM,MAAQ,GACrB,IAAQ,WAAY,KAEpB,EACE,EACA,CAAC,EAAY,EAAY,IAAiC,CAGxD,GAFA,EAAO,MAAM,MAAQ,KAAK,IAAI,EAAQ,MAAO,EAAI,CAAE,EAAI,KACvD,EAAO,MAAM,OAAS,KAAK,IAAI,EAAQ,OAAQ,EAAI,CAAE,EAAI,KACrD,EAAM,OAAS,UACjB,MAAO,IAGX,aACF,GAGF,iBAAiB,EAAS,CAGxB,GAFA,MAAM,kBAAkB,EAEpB,CAAC,KAAK,OACR,KAAK,OAAS,KAAK,cAGrB,IAAM,EAAU,CAAE,QAAS,EAAK,EAChC,KAAK,iBAAiB,YAAa,KAAK,aAAc,CAAO,EAC7D,KAAK,iBAAiB,aAAc,KAAK,aAAc,CAAO,EAElE,CAEO,IAAM,GAAW,GAAS,eAAe,CAC9C,IAAK,WACP,CAAC,ECJD,oBACE,eACA,WACA,gBACA,eAMF,IAAQ,OAAK,SAAO,QAAM,WAAW,GAE9B,MAAM,WAAe,EAAa,CACvC,QAAU,GACV,WAAa,GAEb,eAAyC,IAAM,CAC7C,KAAK,OAAO,GAGd,QAAU,IAAM,CACd,GAAK,CAAE,KAAM,SAAU,EAAG,KAAK,OAAO,EACtC,GAAO,EAAM,EAAE,EAAG,CAChB,KAAM,SACN,OAAQ,CAAC,KAAK,WACd,QAAS,KAAK,cAChB,CAAC,CACH,EAEA,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eAAe,UAAW,YAAY,EAE/C,CAEO,IAAM,GAAS,GAAO,eAAe,CAC1C,IAAK,UACL,UAAW,CACT,QAAS,CACP,2BAA4B,QAC5B,wBAAyB,QACzB,uBAAwB,MACxB,6BAA8B,OAC9B,WAAY,EAAW,WAAW,MAAM,EACxC,mBAAoB,EAAW,eAAe,OAAO,EACrD,QAAS,cACT,aAAc,EAAW,iBAAiB,EAAK,SAAS,EACxD,MAAO,EAAK,aACZ,WAAY,EAAK,MACjB,QAAS,KAAK,EAAK,eAAe,EAAK,YACvC,OAAQ,QAAQ,EAAK,gBAAgB,EAAK,aAC1C,WAAY,QAAQ,EAAK,gBAAgB,EAAK,YAChD,EACA,2BAA4B,CAC1B,SAAU,WACV,WAAY,SACZ,SAAU,SACV,KAAM,WACN,SAAU,EAAW,SAAS,MAAM,EACpC,MAAO,EAAK,aACZ,aAAc,UAChB,EACA,wBAAyB,CACvB,UAAW,OACX,OAAQ,KAAK,EAAK,gBAAgB,EAAK,YACvC,QAAS,EACT,QAAS,cACT,WAAY,SACZ,UAAW,SACX,eAAgB,SAChB,OAAQ,EAAK,WACb,MAAO,EAAK,WACZ,MAAO,EAAK,oBACZ,WAAY,EAAK,iBACjB,aAAc,EAAW,qBAAqB,MAAM,EACpD,QAAS,EAAK,gBAChB,EACA,8BAA+B,CAC7B,WAAY,EAAK,iBACjB,QAAS,EAAK,qBAChB,CACF,CACF,CAAC,EAYM,MAAM,WAAmB,EAAa,CAC3C,SAAW,GACX,KAAO,GACP,cAAkC,CAAC,EACnC,MAA2B,CAAC,EAC5B,UAAY,GACZ,SAAW,GACX,YAAc,gBAEV,KAAI,EAAa,CACnB,OAAO,OAAO,KAAK,QAAU,SACzB,KAAK,MACF,MAAM,GAAG,EACT,IAAI,CAAC,IAAQ,EAAI,KAAK,CAAC,EACvB,OAAO,CAAC,IAAQ,IAAQ,EAAE,EAC7B,KAAK,MAGX,WAAW,EAAG,CACZ,MAAM,EAEN,KAAK,eACH,OACA,QACA,YACA,gBACA,WACA,cACA,UACF,EAGF,OAAS,CAAC,IAAgB,CACxB,GAAI,EAAI,KAAK,IAAM,GACjB,OAEF,IAAQ,QAAS,KACjB,GAAI,CAAC,EAAK,SAAS,CAAG,EACpB,EAAK,KAAK,CAAG,EAEf,KAAK,MAAQ,EACb,KAAK,YAAY,EAAI,GAGvB,UAAY,CAAC,IAAoB,CAC/B,GAAI,KAAK,KAAK,SAAS,CAAO,EAC5B,KAAK,MAAQ,KAAK,KAAK,OAAO,CAAC,IAAQ,IAAQ,CAAO,EAEtD,UAAK,OAAO,CAAO,EAErB,KAAK,YAAY,EAAI,GAGvB,SAAW,CAAC,IAAyB,CACnC,IAAQ,YAAa,KAAK,MAC1B,OAAQ,EAAM,SACP,IACH,CACE,IAAM,EAAM,EAAS,MAAM,MAAM,GAAG,EAAE,GACtC,KAAK,OAAO,CAAG,CACjB,CACA,UACG,QACH,CACE,IAAM,EAAM,EAAS,MAAM,MAAM,GAAG,EAAE,GACtC,KAAK,OAAO,CAAG,CACjB,CACA,EAAM,gBAAgB,EACtB,EAAM,eAAe,EACrB,iBAMN,cAAgB,IAAM,CACpB,IAAQ,aAAc,MACd,WAAY,KAAK,MACnB,EACJ,OAAO,KAAK,gBAAkB,SAC1B,KAAK,cAAc,MAAM,GAAG,EAC5B,KAAK,cACL,EAAY,KAAK,KAAK,OAAO,CAAC,IAAQ,CAAC,EAAK,SAAS,CAAG,CAAC,EAC/D,GAAI,EAAU,OACZ,EAAK,KAAK,KAAM,GAAG,CAAS,EAE9B,IAAM,EAAwB,EAAK,IAAI,CAAC,IAAQ,CAC9C,GAAI,IAAQ,IAAM,IAAQ,KACxB,OAAO,KACF,QAAI,OAAO,IAAQ,SACxB,MAAO,CACL,QAAS,IAAM,KAAK,KAAK,SAAS,EAAI,KAAK,EAC3C,QAAS,EAAI,QACb,MAAM,EAAG,CACP,EAAU,EAAI,KAAK,EAEvB,EAEA,WAAO,CACL,QAAS,IAAM,KAAK,KAAK,SAAS,CAAG,EACrC,QAAS,EACT,MAAM,EAAG,CACP,EAAU,CAAG,EAEjB,EAEH,EAED,EAAQ,CACN,OAAQ,EACR,MAAO,OACP,WACF,CAAC,GAGH,QAAU,IAAM,CAEd,GAAO,CAAE,MAAO,CAAE,WAAY,QAAS,EAAG,SAAU,EAAG,CAAC,EACxD,GAAI,CACF,KAAM,eACN,MAAO,KACT,CAAC,EACD,GAAM,CACJ,KAAM,WACN,MAAO,UACP,UAAW,KAAK,QAClB,CAAC,EACD,GACE,CACE,MAAO,UACP,KAAM,UACN,QAAS,KAAK,aAChB,EACA,EAAM,YAAY,CACpB,CACF,EAEA,UAAY,CAAC,IAAiB,CAC5B,GAAI,KAAK,UAAY,CAAC,KAAK,SAAU,CACnC,IAAM,EAAO,EAAM,OAAuB,QACxC,GAAO,OACT,EACA,KAAK,MAAQ,KAAK,KAAK,OAAO,CAAC,IAAU,IAAU,EAAI,OAAO,EAC9D,EAAI,OAAO,EACX,KAAK,YAAY,EAAI,EAEvB,EAAM,gBAAgB,EACtB,EAAM,eAAe,GAGvB,MAAM,EAAS,CACb,MAAM,OAAO,EACb,IAAQ,eAAc,UAAS,YAAa,KAAK,MASjD,GAHA,EAAQ,SAAW,KAAK,SACxB,EAAS,MAAQ,GACjB,EAAS,aAAa,cAAe,KAAK,WAAW,EACjD,KAAK,UAAY,CAAC,KAAK,SACzB,EAAQ,gBAAgB,SAAU,EAAK,EACvC,EAAS,gBAAgB,SAAU,CAAC,KAAK,SAAS,EAElD,OAAQ,gBAAgB,SAAU,EAAI,EACtC,EAAS,gBAAgB,SAAU,EAAI,EAGzC,EAAa,YAAc,GAC3B,IAAQ,QAAS,KACjB,QAAW,KAAO,EAChB,EAAa,OACX,GAAO,CACL,QAAS,EACT,WAAY,KAAK,UAAY,CAAC,KAAK,SACnC,eAAgB,KAAK,SACvB,CAAC,CACH,EAGN,CAEO,IAAM,GAAa,GAAW,eAAe,CAClD,IAAK,eACL,UAAW,CACT,QAAS,CACP,gBAAiB,UACjB,eAAgB,OAChB,YAAa,OACb,QAAS,OACT,oBAAqB,OACrB,WAAY,SACZ,WAAY,EAAK,UACjB,IAAK,EAAK,UACV,aAAc,EAAW,qBAAqB,EAAK,SAAS,EAC5D,SAAU,QACZ,EACA,kBAAmB,CACjB,oBAAqB,YAAY,EAAK,WACxC,EACA,8BAA+B,CAC7B,oBAAqB,eAAe,EAAK,WAC3C,EACA,8BAA+B,CAC7B,QAAS,OACT,QAAS,MACT,WAAY,SACZ,WAAY,EAAK,QACjB,aAAc,EAAW,mBAAmB,EAAK,SAAS,EAC1D,UAAW,EAAK,aAChB,SAAU,SACV,SAAU,cACV,IAAK,EAAK,UACV,UAAW,QAAQ,EAAK,gBAAgB,EAAK,WAC7C,QAAS,EAAK,SAChB,EACA,yBAA0B,CACxB,MAAO,EAAK,UACZ,OAAQ,EAAK,UACb,WAAY,EAAK,UACjB,UAAW,SACX,QAAS,EACT,OAAQ,CACV,EACA,iBAAkB,CAChB,QAAS,iBACX,EACA,+BAAgC,CAC9B,WAAY,EAAK,WACjB,MAAO,EAAK,cACd,CACF,CACF,CAAC,EC7aM,IAAM,GAAU,QCsCvB",
47
+ "debugId": "2827E910C695B38A64756E2164756E21",
48
48
  "names": []
49
49
  }