tosijs-ui 1.0.3 → 1.0.4

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
@@ -1,48 +1,49 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/ab-test.ts", "../src/babylon-3d.ts", "../src/via-tag.ts", "../src/icons.ts", "../src/icon-data.ts", "../src/bodymovin-player.ts", "../src/carousel.ts", "../src/code-editor.ts", "../src/color-input.ts", "../src/data-table.ts", "../src/track-drag.ts", "../src/menu.ts", "../src/float.ts", "../src/pop-float.ts", "../src/localize.ts", "../src/make-sorter.ts", "../src/select.ts", "../src/match-shortcut.ts", "../src/drag-and-drop.ts", "../src/editable-rect.ts", "../src/filter-builder.ts", "../src/form.ts", "../src/gamepad.ts", "../src/live-example.ts", "../src/tab-selector.ts", "../src/mapbox.ts", "../src/markdown-viewer.ts", "../src/month.ts", "../src/notifications.ts", "../src/password-strength.ts", "../src/rating.ts", "../src/rich-text.ts", "../src/segmented.ts", "../src/side-nav.ts", "../src/size-break.ts", "../src/sizer.ts", "../src/tag-list.ts", "../src/version.ts", "../src/index.ts"],
3
+ "sources": ["../src/ab-test.ts", "../src/babylon-3d.ts", "../src/via-tag.ts", "../src/icons.ts", "../src/icon-data.ts", "../src/bodymovin-player.ts", "../src/carousel.ts", "../src/code-editor.ts", "../src/color-input.ts", "../src/data-table.ts", "../src/track-drag.ts", "../src/menu.ts", "../src/float.ts", "../src/pop-float.ts", "../src/localize.ts", "../src/make-sorter.ts", "../src/select.ts", "../src/match-shortcut.ts", "../src/drag-and-drop.ts", "../src/dialog.ts", "../src/editable-rect.ts", "../src/filter-builder.ts", "../src/form.ts", "../src/gamepad.ts", "../src/live-example.ts", "../src/tab-selector.ts", "../src/mapbox.ts", "../src/markdown-viewer.ts", "../src/month.ts", "../src/notifications.ts", "../src/password-strength.ts", "../src/rating.ts", "../src/rich-text.ts", "../src/segmented.ts", "../src/side-nav.ts", "../src/size-break.ts", "../src/sizer.ts", "../src/tag-list.ts", "../src/version.ts", "../src/index.ts"],
4
4
  "sourcesContent": [
5
- "/*#\n# ab-test\n\n`<xin-ab>` provides a simple method for implementing A|B-testing.\n\n```js\nconst { AbTest } = tosijsui\n\nfunction randomize() {\n const conditions = {\n testA: Math.random() < 0.5,\n testB: Math.random() < 0.5,\n testC: Math.random() < 0.5\n }\n\n AbTest.conditions = conditions\n\n preview.querySelector('pre').innerText = JSON.stringify(conditions, null, 2)\n}\n\npreview.querySelector('.randomize-conditions').addEventListener('click', randomize)\n\nrandomize()\n```\n```html\n<div style=\"display: flex; gap: 10px; align-items: center;\">\n <div style=\"display: flex; flex-direction: column; gap: 10px;\">\n <xin-ab class=\"a\" condition=\"testA\">\n <p>testA</p>\n </xin-ab>\n <xin-ab class=\"not-a\" not condition=\"testA\">\n <p>not testA</p>\n </xin-ab>\n <xin-ab class=\"b\" condition=\"testB\">\n <p>testB</p>\n </xin-ab>\n <xin-ab class=\"not-b\" not condition=\"testB\">\n <p>not testB</p>\n </xin-ab>\n <xin-ab class=\"c\" condition=\"testC\">\n <p>testC</p>\n </xin-ab>\n <xin-ab class=\"not-c\" not condition=\"testC\">\n <p>not testC</p>\n </xin-ab>\n </div>\n <pre>\n </pre>\n</div>\n<button class=\"randomize-conditions\">Randomize</button>\n```\n```css\n.preview {\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: flex-start;\n}\n.preview p {\n background: #44c;\n color: white;\n display: block;\n border-radius: 99px;\n padding: 4px 10px;\n margin: 0;\n}\n\n.preview xin-ab[not] p {\n background: red;\n}\n```\n\n- Set `AbTest.conditions` to anything you like.\n- Use `<xin-ab>` elements to display conditional content.\n- `condition` attribute determines which value in `AbTest.conditions` controls the element\n- `not` reverses the condition (so `<xin-ab not condition=\"foo\">` will be visible if `conditions.foo` is `false`)\n*/\n\nimport { Component } from 'tosijs'\n\nconst abTestConditions = {} as { [key: string]: any }\n\nexport class AbTest extends Component {\n static set conditions(context: { [key: string]: any }) {\n Object.assign(abTestConditions, context)\n\n for (const abTest of [...AbTest.instances]) {\n abTest.queueRender()\n }\n }\n\n condition = ''\n\n not = false\n\n static instances: Set<AbTest> = new Set()\n\n constructor() {\n super()\n this.initAttributes('condition', 'not')\n }\n\n connectedCallback() {\n super.connectedCallback()\n AbTest.instances.add(this)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n AbTest.instances.delete(this)\n }\n\n render(): void {\n if (\n this.condition !== '' &&\n (this.not\n ? (abTestConditions[this.condition]) !== true\n : (abTestConditions[this.condition]) === true)\n ) {\n this.toggleAttribute('hidden', false)\n } else {\n this.toggleAttribute('hidden', true)\n }\n }\n}\n\nexport const abTest = AbTest.elementCreator({ tag: 'xin-ab' })\n",
6
- "/*#\n# 3d\n\nA [babylonjs](https://www.babylonjs.com/) wrapper.\n\nA `<xin-3d>` element is initialized with an `engine`, `canvas`, `scene`, and an update-loop.\n\nIf you view this example with an XR-enabled device, such as the\n[Meta Quest 3](https://www.meta.com/quest/quest-3/), then you should be able to view this\nas an AR scene.\n\n```js\nconst { b3d, gamepadText, xrControllers, xrControllersText } = tosijsui\n\npreview.append(b3d({\n async sceneCreated(element, BABYLON) {\n const camera = new BABYLON.FreeCamera(\n 'camera',\n new BABYLON.Vector3(0, 1, -4),\n element.scene\n )\n camera.attachControl(element.parts.canvas, true)\n\n new BABYLON.HemisphericLight('light', new BABYLON.Vector3(0.25, 1, -0.5))\n\n this.loadScene('/', 'xin3d.glb')\n\n const size = 1024\n const textTexture = new BABYLON.DynamicTexture('Text', size, element.scene)\n const textContext = textTexture.getContext()\n textTexture.update()\n\n const textMaterial = new BABYLON.StandardMaterial('Text', element.scene)\n textMaterial.diffuseTexture = textTexture\n textMaterial.emissiveTexture = textTexture\n textMaterial.backfaceCulling = false\n\n const plaque = BABYLON.MeshBuilder.CreatePlane('Plaque', {size: 1}, element.scene)\n plaque.position.x = 0\n plaque.position.y = 2\n plaque.billboardMode = BABYLON.Mesh.BILLBOARDMODE_ALL\n plaque.material = textMaterial\n\n let controllers\n if (navigator.xr) {\n const xrHelper = await element.scene.createDefaultXRExperienceAsync({\n uiOptions: {\n sessionMode: 'immersive-ar'\n }\n })\n controllers = xrControllers(xrHelper)\n }\n\n const interval = setInterval(() => {\n if (document.body.contains(element)) {\n textContext.fillStyle = '#204020'\n textContext.fillRect(0, 0, size, size)\n const text = gamepadText() + '\\n' + xrControllersText(controllers)\n const lines = text.split('\\n')\n textContext.fillStyle = '#afa'\n textContext.font = '32px monospace'\n for(let i = 0; i < lines.length; i++) {\n const line = lines[i]\n textContext.fillText(line, 40, 70 + i * 40)\n }\n textContext.fillStyle = '#bbb'\n textContext.fillText('xinjs-xr — debug info', 40, 984)\n textTexture.update()\n } else {\n clearInterval(interval)\n }\n }, 100)\n },\n}))\n```\n```css\n.preview xin-3d {\n width: 100%;\n height: 100%;\n}\n```\n\nYou can access the `scene` and `engine` properties. You can also assign `sceneCreated`\nand `update` callbacks that will be executed when the scene is first initialized and\nbefore each update, respectively. (See the example, it does both.)\n\nBoth `sceneCreated` and `update` may be `async`. The component will `await` `sceneCreated`\nbefore starting the renderLoop, but `update` is simply passed to babylon, so be careful.\n\nBy default, this component loads `babylon.js` from the [babylonjs CDN](https://doc.babylonjs.com/setup/frameworkPackages/CDN),\nbut if `BABYLON` is already defined (e.g. if you've bundled it) then it will use that instead.\n\nIf you need additional libraries, e.g. `https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js` for loading models such as `gltf` and `glb` files, you should load those in `sceneCreated`.\n\nHere's a simple example of a terrain mesh comprising 125k triangles, 50% of which is being scaled using a `profileScale` function that\ntakes an array of numbers that use a linear profile to change the landform.\n\n```js\nconst { b3d } = tosijsui\nconst { MoreMath } = tosijs\n\nconst debugCutoff = 0.5\nconst defaultProfile = [0, 1, 5, 8, 10].map(x => x/10)\n\nconst { clamp } = MoreMath\nfunction profileScale(t = 0, bypass = false, profile = defaultProfile) {\n if (bypass) {\n return t\n }\n const count = profile.length - 1\n if (count < 1) {\n throw new Error('profile must be of length ≥ 2')\n }\n\n const s = clamp(0, (t + 1) / 2, 1)\n const index = Math.floor(s * count)\n const dt = (s - index / count) * count\n const min = profile[index]\n const max = profile[index + 1]\n const p = dt * (max - min) + min\n return 2 * p - 1\n}\n\npreview.append(b3d({\n async sceneCreated(element, BABYLON) {\n const { scene } = element\n const { createNoise2D } = await import('https://cdn.jsdelivr.net/npm/simplex-noise@4.0.1/+esm')\n\n new BABYLON.HemisphericLight('light', new BABYLON.Vector3(0.25, 1, 2))\n\n const terrain = new BABYLON.Mesh('terrain', scene)\n const vertexData = new BABYLON.VertexData()\n\n const noise2D = createNoise2D()\n const positions = []\n const indices = []\n const gridSize = 100\n const gridResolution = 250\n const gridPoints = gridResolution + 1\n const noiseScale = 0.03\n const heightScale = 4.5\n terrain.position.y = -5\n const scale = t => t * gridSize / gridResolution - gridSize * 0.5\n for(let x = 0; x <= gridResolution; x++) {\n for(let z = 0; z <= gridResolution; z++) {\n const y = profileScale(noise2D(scale(x) * noiseScale, scale(z) * noiseScale), x < gridResolution * debugCutoff)\n positions.push(scale(x), y * heightScale, scale(z))\n if (x > 0 && z > 0) {\n const i = x * gridPoints + z\n indices.push(\n i, i - gridPoints - 1, i - 1,\n i, i - gridPoints, i - gridPoints - 1,\n )\n }\n }\n }\n const normals = []\n BABYLON.VertexData.ComputeNormals(positions, indices, normals);\n\n vertexData.positions = positions\n vertexData.indices = indices\n vertexData.normals = normals\n vertexData.applyToMesh(terrain)\n },\n}))\n```\n\n## loadScene\n\n`<xin-3d>.loadScene(path: string, file: string, callBack(meshes: any[]): void)` can\nbe used to load `.glb` files.\n\n## loadUI\n\n`<xin-3d>.loadUI(options: B3dUIOptions)` loads babylonjs guis, which you can create programmatically or using the [babylonjs gui tool](https://gui.babylonjs.com/).\n*/\nimport { Component as WebComponent, ElementCreator, elements } from 'tosijs'\nimport { scriptTag } from './via-tag'\nimport { icons, svg2DataUrl } from './icons'\n\ntype B3dCallback =\n | ((element: B3d, BABYLON: any) => void)\n | ((element: B3d, BABYLON: any) => Promise<void>)\n\ninterface B3dUIOptions {\n snippetId?: string\n jsonUrl?: string\n data?: any\n size?: number\n}\n\ntype MeshProcessCallback = (meshes: any[]) => void\n\nconst noop = () => {\n /* do not care */\n}\n\nexport class B3d extends WebComponent {\n babylonReady: Promise<any>\n BABYLON?: any\n\n static styleSpec = {\n ':host': {\n display: 'block',\n position: 'relative',\n },\n ':host canvas': {\n width: '100%',\n height: '100%',\n },\n ':host .babylonVRicon': {\n height: 50,\n width: 80,\n backgroundColor: 'transparent',\n filter: 'drop-shadow(0 0 4px #000c)',\n backgroundImage: svg2DataUrl(icons.xrColor()),\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n border: 'none',\n borderRadius: 5,\n borderStyle: 'none',\n outline: 'none',\n transition: 'transform 0.125s ease-out',\n },\n ':host .babylonVRicon:hover': {\n transform: 'scale(1.1)',\n },\n }\n\n content = elements.canvas({ part: 'canvas' })\n\n constructor() {\n super()\n\n this.babylonReady = (async () => {\n const { BABYLON } = await scriptTag(\n 'https://cdn.babylonjs.com/babylon.js',\n 'BABYLON'\n )\n return BABYLON\n })()\n }\n\n scene: any\n engine: any\n\n sceneCreated: B3dCallback = noop\n update: B3dCallback = noop\n\n private _update = () => {\n if (this.scene) {\n if (this.update !== undefined) {\n this.update(this, this.BABYLON)\n }\n if (this.scene.activeCamera !== undefined) {\n this.scene.render()\n }\n }\n }\n\n onResize() {\n if (this.engine) {\n this.engine.resize()\n }\n }\n\n loadScene = async (\n path: string,\n file: string,\n processCallback?: MeshProcessCallback\n ): Promise<void> => {\n const { BABYLON } = await scriptTag(\n 'https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js',\n 'BABYLON'\n )\n\n BABYLON.SceneLoader.Append(path, file, this.scene, processCallback)\n }\n\n loadUI = async (options: B3dUIOptions): Promise<any> => {\n const { BABYLON } = await scriptTag(\n 'https://cdn.babylonjs.com/gui/babylon.gui.min.js',\n 'BABYLON'\n )\n const advancedTexture =\n BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI(\n 'GUI',\n true,\n this.scene\n )\n const { snippetId, jsonUrl, data, size } = options\n if (size) {\n advancedTexture.idealWidth = size\n advancedTexture.renderAtIdealSize = true\n }\n // edit or create your own snippet here\n // https://gui.babylonjs.com/\n let gui\n if (snippetId) {\n gui = await advancedTexture.parseFromSnippetAsync(snippetId)\n } else if (jsonUrl) {\n gui = await advancedTexture.parseFromURLAsync(jsonUrl)\n } else if (data) {\n gui = advancedTexture.parseContent(data)\n } else {\n return null\n }\n\n const root = advancedTexture.getChildren()[0]\n const widgets = root.children.reduce(\n (map: { [key: string]: any }, widget: any) => {\n map[widget.name] = widget\n return map\n },\n {}\n )\n\n return { advancedTexture, gui, root, widgets }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n const { canvas } = this.parts as { canvas: HTMLCanvasElement }\n\n this.babylonReady.then(async (BABYLON) => {\n this.BABYLON = BABYLON\n this.engine = new BABYLON.Engine(canvas, true)\n this.scene = new BABYLON.Scene(this.engine)\n if (this.sceneCreated) {\n await this.sceneCreated(this, BABYLON)\n }\n if (this.scene.activeCamera === undefined) {\n const camera = new BABYLON.ArcRotateCamera(\n 'default-camera',\n -Math.PI / 2,\n Math.PI / 2.5,\n 3,\n new BABYLON.Vector3(0, 0, 0)\n )\n camera.attachControl(this.parts.canvas, true)\n }\n this.engine.runRenderLoop(this._update)\n })\n }\n}\n\nexport const b3d = B3d.elementCreator({ tag: 'xin-3d' }) as ElementCreator<B3d>\n",
7
- "/*#\n# scriptTag & styleSheet\n\n## scriptTag\n\nIf you need to load an old school (cjs) javascript or css library via cdn then use these two functions.\n\n`tosijs-ui` uses this library to implement the `<xin-code>`, `<xin-lottie>`, and `<xin-map>`\nelements.\n\n`scriptTag()` and `styleSheet()` return promises that resolve `globalThis` when the module in question\nhas loaded and otherwise behave as much like `import()` as possible.\n\nThis example uses `scriptTag` and `styleSheet` to load [quilljs](https://quilljs.com) on-the-fly.\n\n```js\nconst { elements } = tosijs\nconst { scriptTag, styleSheet } = tosijsui\n\nconst toolbarOptions = [\n [{ header: [1, 2, 3, 4, false] }],\n ['blockquote', 'code-block'],\n [{ 'align': [] }],\n ['bold', 'italic', 'strike'],\n ['link', 'image', 'video'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }, { 'list': 'check' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['clean']\n]\n\n;(async () => {\n await Promise.all([\n styleSheet('https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.core.css'),\n styleSheet('https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.snow.css'),\n ])\n\n const container = elements.div()\n const { Quill } = await scriptTag('https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.js')\n preview.append(container)\n\n const quill = new Quill(container, {\n debug: 'info',\n modules: {\n toolbar: toolbarOptions,\n },\n theme: 'snow',\n })\n})()\n```\n\nNote that `scriptTag` will resolve `globalThis` so it behaves as much like async `import()`\nas possible.\n\nAs an aside:\n\n`<xin-lottie>` is implemented in such a way that if you've preloaded the module\n(e.g. via a script tag or packaging) it won't load it again, which affords offline\nuse.\n\nThere's no point for `<xin-map>` since it won't work without connectivity anyway.\n\n## styleSheet\n\nstyleSheet creates a `<link>` tag for a specified css file.\n\nUsing `styleSheet`:\n\n styleSheet('../path/to/style.css')\n\nThis is awaitable, if you care. The stylesheet `<link>` will only be inserted _once_.\n*/\n\nimport { elements } from 'tosijs'\n\ninterface PromiseMap {\n [key: string]: Promise<any>\n}\n\nconst loadedScripts: PromiseMap = {}\nexport function scriptTag(\n src: string,\n existingSymbolName?: string\n): Promise<any> {\n if (loadedScripts[src] === undefined) {\n if (existingSymbolName !== undefined) {\n // @ts-ignore-error aaaargh\n const existing = globalThis[existingSymbolName]\n loadedScripts[src] = Promise.resolve({ [existingSymbolName]: existing })\n }\n\n const scriptElt = elements.script({ src })\n\n document.head.append(scriptElt)\n\n loadedScripts[src] = new Promise((resolve) => {\n scriptElt.onload = () => resolve(globalThis)\n })\n }\n\n return loadedScripts[src]\n}\n\nconst loadedStyleSheets: PromiseMap = {}\nexport function styleSheet(href: string): Promise<void> {\n if (loadedStyleSheets[href] === undefined) {\n const linkElement = elements.link({\n rel: 'stylesheet',\n type: 'text/css',\n href,\n })\n\n document.head.append(linkElement)\n\n loadedStyleSheets[href] = new Promise((resolve) => {\n linkElement.onload = resolve\n })\n }\n return loadedStyleSheets[href]\n}\n",
8
- "/*#\n# icons\n\n<div class=\"center\">\n <xin-icon icon=\"settings\" style=\"--xin-icon-size: 128px\"></xin-icon>\n <xin-icon icon=\"xrColor\" style=\"--xin-icon-size: 96px\"></xin-icon>\n <xin-icon icon=\"rgb\" style=\"--xin-icon-size: 128px\"></xin-icon>\n</div>\n\nA library that provides `ElementCreator` functions that produce SVG icons. It leverages `tosijs`'s\n`svgElements` proxy and is intended to address all the key use-cases for SVG icons in web\napplications along with being very easy to extend and maintain.\n\n> ### Supported Use Cases\n> - inline SVGs that can be styled by CSS (for buttons, etc.)\n> - allows both stroked and filled icons (unlike font-based systems)\n> - No build process magic needed (it's \"just javascript\")\n> - highly optimized and compressible\n> - support for color icons (without requiring multiple glyphs perfectly aligned)\n> - icons can be rendered as data urls, e.g. to insert into CSS…\n\n## icons\n\n`icons` is a proxy that generates an `ElementCreator` for a given icon on demand,\ne.g. `icons.chevronDown()` produces an `<svg>` element containing a downward-pointing chevron\nicon with the class `icon-chevron-down`.\n\n```js\nconst { tosi } = tosijs\nconst { icons, svgIcon, postNotification } = tosijsui\nconst { div } = tosijs.elements\n\nconst { iconDemo } = tosi({\n iconDemo: {\n icon: ''\n }\n})\n\npreview.append(\n div(\n {\n class: 'scroller'\n },\n ...Object.keys(icons).sort().map(iconName => div(\n { \n class: 'tile', \n onClick() {\n iconDemo.icon = iconDemo.icon != iconName ? iconName : ''\n postNotification({\n icon: iconName,\n message: `${iconName} clicked`,\n duration: 2,\n color: 'hotpink'\n })\n },\n onMouseleave() {\n iconDemo.icon = ''\n }\n },\n svgIcon({icon: iconName, size: 24}),\n div(iconName)\n )),\n ),\n svgIcon({\n class: 'icon-detail',\n size: 256,\n bind: {\n binding: {\n toDOM(element, value) {\n element.style.opacity = value ? 1 : 0\n if (value) element.icon = value\n }\n },\n value: iconDemo.icon\n }\n })\n)\n```\n```css\n.preview .scroller {\n display: grid;\n grid-template-columns: calc(33% - 5px) calc(33% - 5px) calc(33% - 5px);\n flex-wrap: wrap;\n padding: var(--spacing);\n gap: var(--spacing);\n overflow: hidden scroll !important;\n height: 100%;\n}\n\n.preview .tile {\n display: flex;\n text-align: center;\n cursor: pointer;\n background: #fff8;\n padding: 10px;\n gap: 10px;\n border-radius: 5px;\n}\n\n.preview .tile:hover {\n background: white;\n color: var(--brand-color);\n}\n\n.preview .tile > div {\n font-family: Menlo, Monaco, monospace;\n whitespace: no-wrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.preview .tile xin-icon {\n font-size: 24px;\n}\n\n.preview .icon-detail {\n position: absolute;\n display: block;\n height: 256px;\n opacity: 0;\n transition: 0.5s ease-out;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: #fffc;\n padding: 10px;\n borderRadius: 10px;\n pointerEvents: none;\n}\n```\n\nThese icons are completely unstyled and can be colored using the css `fill` property. This will\nprobably be broken out as a standalone library to allow the use of whatever icons you like\n(its source data is currently generated from an [icomoon](https://icomoon.com/app)\n`selection.json` file, but could just as easily be generated from a directory full of SVGs).\n\n## Adding and redefining icons\n\nSimply pass a map of icon names to svg source strings…\n\n```\ndefineIcons({\n someIcon: '<svg ....',\n otherIcon: '<svg ...',\n})\n```\n\n### Icon Classes\n\nIcons will be generated with the class `xin-icon`.\n\nYou can also assign the classes `filled`, `stroked`, and `color` to icons to set default\nicon styling.\n\n## `<xin-icon>`\n\n`<xin-icon>` is a simple component that lets you embed icons as HTML. Check the CSS tab to see\nhow it's styled.\n\n`<xin-icon>` supports four attributes:\n\n- `size` (defaults to 0) if non-zero sets the height of the icon in pixels\n- `icon` is the name of the icon\n- `color` is the fill color (if you don't want to style it using CSS)\n- `stroke` is the stroke color\n- `stroke-width` (defaults to 1) is the width of the stroke assuming the icon's viewBox is 1024 units tall but the\n icon is rendered at 32px (so it's multiplied by 32).\n\n> **Aside**: the tool used to build the icon library scales up the viewBox to 1024 tall and then rounds\n> all coordinates to nearest integer on the assumption that this is plenty precise enough for icons and\n> makes everything smaller and easier to compress.\n\n## SVGs as data-urls\n\n```js\nconst { elements } = tosijs\nconst { icons, svg2DataUrl } = tosijsui\n\npreview.append(\n elements.span({\n style: {\n display: 'inline-block',\n width: '120px',\n height: '24px',\n content: '\" \"',\n background: svg2DataUrl(icons.star(), 'none', '#bbb', 3)\n }\n }),\n elements.span({\n style: {\n display: 'inline-block',\n width: '120px',\n height: '24px',\n content: '\" \"',\n background: svg2DataUrl(icons.star(), 'gold', 'orange', 2)\n }\n }),\n elements.span({\n style: {\n display: 'inline-block',\n width: '100px',\n height: '200px',\n content: '\" \"',\n background: svg2DataUrl(icons.tosi())\n }\n }),\n)\n```\n\n`svg2DataUrl(svg: SVGElement, fill?: string, stroke?: string): string` is provided as a\nutility for converting SVG elements into data-urls (e.g. for incorporation into\nCSS properties. (It's used by the `<xin-3d>` component to render the XR widget.)\n\nIf you're using `SVGElement`s created using the `icons` proxy, you'll want to provide `fill` and/or\n`stroke` values, because images loaded via css properties cannot be styled.\n\n## Color Icons\n\n```html\n<xin-icon icon=\"tosiFavicon\" class=\"demo-icon\"></xin-icon>\n<xin-icon icon=\"tosiPlatform\" class=\"demo-icon recolored\"></xin-icon>\n<xin-icon icon=\"tosiXr\" class=\"demo-icon animated\"></xin-icon>\n```\n```css\n.demo-icon {\n --xin-icon-size: 160px\n}\n\n.recolored > svg {\n pointer-events: all;\n transition: 0.25s ease-out;\n transform: scale(1);\n filter: grayscale(0.5)\n}\n\n.recolored:hover > svg {\n opacity: 1;\n transform: scale(1.1);\n filter: grayscale(0);\n}\n\n.animated > svg {\n animation: 2s linear 0s infinite rainbow;\n}\n\n@keyframes rainbow {\n 0% {\n filter: hue-rotate(0deg);\n }\n 100% {\n filter: hue-rotate(360deg);\n }\n}\n```\n\nColored icons have the `color` class added to them, so you can easily create css rules\nthat, for example, treat all colored icons inside buttons the same way.\n\n> Earlier versions of this library replaced color specifications with CSS-variables in a\n> very convoluted way, but in practice this isn't terribly useful as SVG properties can't\n> be animated by CSS, so this functionality has been stripped out.\n\n## Missing Icons\n\nIf you ask for an icon that isn't defined, the `icons` proxy will print a warning to console\nand render a `square` (in fact, `icons.square()`) as a fallback.\n\n## Why?\n\nMy evolution has been:\n\n1. Using Icomoon.io, which I still think is a solid choice for managing custom icon fonts\n2. Processing Icomoon selection.json files into icon-data and then generating SVGs dynamically\n from the data\n3. Ingesting SVGs directly, with a little cleanup\n\nThe goal is always to have a single source of truth for icons, no magic or convoluted tooling, and \nbe able to quickly and easily add and replace icons, distribute them with components, and\nhave no mess or fuss.\n\n1. Works well, but…\n - color icons are flaky,\n - doesn't play well with others, \n - can't really distribute the icons with your components. \n - difficult to use icons in CSS `content`\n - impossible to use icons in CSS backgrounds\n2. This is `icons.ts` until just now! Solves all the above, but…\n - no fancy SVG effects, like gradients (goodness knows I experimented with converting CSS gradients to SVG gradients) and, most \n - **strokes** need to be converted to outlines\n - outlined strokes can't be styled the way strokes can\n - blocks use of popular icon libraries\n3. This is how everyone else works, except…\n - no build magic needed: `defineIcons({ myIcon: '<svg....>', ... })`\n - if you want build magic, `icons.js` has no dependencies, finds icons and creates an `icon-data.ts` file.\n - smaller icon files, even though I'm now including more icons (including *all the current* feathericons)\n\n## Icon Sources\n\nMany of these icons are sourced from [Feather Icons](https://github.com/feathericons/feather), but\nall the icons have been processed to have integer coordinates in a `viewBox` typically scaled to 1024 &times; 1024.\n\nThe corporate logos (Google, etc.) are from a variety of sources, in many cases ultimately from the\norganizations themselves. It's up to you to use them correctly.\n\nThe remaining icons I have created myself using the excellent but sometimes flawed\n[Amadine](https://apps.apple.com/us/app/amadine-vector-design-art/id1339198386?mt=12)\nand generally reliable [Graphic](https://apps.apple.com/us/app/graphic/id404705039?mt=12).\n\n### Feather Icons Copyright Notice\n\nThe MIT License (MIT)\n\nCopyright (c) 2013-2023 Cole Bemis\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n*/\n\nimport {\n elements,\n svgElements,\n ElementCreator,\n ElementPart,\n ElementProps,\n Component as WebComponent,\n XinStyleRule,\n Color,\n varDefault,\n StyleSheet,\n} from 'tosijs'\nimport { SVGIconMap } from './icon-types'\nimport iconData from './icon-data'\n\nconst { svg, path } = svgElements\n\nexport const defineIcons = (newIcons: { [key: string]: string }): void => {\n Object.assign(iconData, newIcons)\n}\n\nexport const svg2DataUrl = (\n svg: SVGElement,\n fill?: string | false,\n stroke?: string | false,\n strokeWidth: number | string = 1\n): string => {\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n if (fill || stroke) {\n for (const path of [...svg.querySelectorAll('path, polygon')]) {\n if (fill) {\n path.setAttribute('fill', fill)\n }\n if (stroke) {\n path.setAttribute('stroke', stroke)\n path.setAttribute('stroke-width', String(strokeWidth))\n }\n }\n }\n\n const styled = svg.querySelectorAll('[style]')\n svg.removeAttribute('style')\n for (const item of [...styled] as HTMLElement[]) {\n const { fill, stroke, strokeWidth, strokeLinecap, strokeLinejoin } =\n item.style\n if (fill) item.setAttribute('fill', Color.fromCss(fill).html)\n if (stroke) item.setAttribute('stroke', Color.fromCss(stroke).html)\n if (strokeWidth) item.setAttribute('strokeWidth', strokeWidth)\n if (strokeLinecap) item.setAttribute('strokeLinecap', strokeLinecap)\n if (strokeLinejoin) item.setAttribute('strokeLinejoin', strokeLinejoin)\n item.removeAttribute('style')\n }\n\n const text = encodeURIComponent(svg.outerHTML)\n return `url(data:image/svg+xml;charset=UTF-8,${text})`\n}\n\nexport const icons = new Proxy(iconData, {\n get(\n target,\n prop: string\n ): ElementCreator {\n let iconSpec = iconData[prop as keyof typeof iconData] as string\n if (prop && !iconSpec) {\n console.warn(`icon ${prop} does not exist`)\n }\n if (!iconSpec) {\n iconSpec = iconData.square\n }\n return (...parts: ElementPart[]) => {\n const div = elements.div()\n div.innerHTML = iconSpec\n const sourceSvg = div.querySelector('svg') as SVGElement\n const classes = new Set(sourceSvg.classList)\n classes.add('xin-icon')\n const svg = svgElements.svg(\n {\n class: Array.from(classes).join(' '),\n viewBox: sourceSvg.getAttribute('viewBox'),\n },\n ...parts,\n ...sourceSvg.children\n )\n svg.style.strokeWidth = varDefault.xinIconStrokeWidth('2px')\n svg.style.stroke = varDefault.xinIconStroke(\n classes.has('filled') ? 'none' : 'currentColor'\n )\n svg.style.fill = varDefault.xinIconFill(\n classes.has('stroked') ? 'none' : 'currentColor'\n )\n svg.style.height = varDefault.xinIconSize('16px')\n return svg\n }\n },\n}) as unknown as SVGIconMap\n\nexport class SvgIcon extends WebComponent {\n icon = ''\n size = 0\n fill = ''\n stroke = ''\n strokeWidth = 1\n\n constructor() {\n super()\n\n this.initAttributes('icon', 'size', 'fill', 'stroke', 'strokeWidth')\n }\n\n render(): void {\n this.textContent = ''\n const style: XinStyleRule = {}\n if (this.size) {\n style.height = this.size\n this.style.setProperty('--xin-icon-size', `${this.size}px`)\n }\n if (this.stroke) {\n style.stroke = this.stroke\n style.strokeWidth = this.strokeWidth\n }\n style.fill = this.fill\n this.append(icons[this.icon]({ style }))\n }\n}\n\nexport const svgIcon = SvgIcon.elementCreator({\n tag: 'xin-icon',\n styleSpec: {\n ':host': {\n display: 'inline-flex',\n stroke: 'currentColor',\n strokeWidth: varDefault.iconStrokeWidth('2px'),\n strokeLinejoin: varDefault.iconStrokeLinejoin('round'),\n strokeLinecap: varDefault.iconStrokeLinecap('round'),\n fill: varDefault.iconFill('none'),\n },\n ':host, :host svg': {\n height: varDefault.xinIconSize('16px'),\n },\n },\n})\n",
9
- "interface IconData { [key: string]: string }\n\nexport default {\n earth: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><path style=\\\"fill:#006736;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M18.40,4.79 C18.40,4.79,17,9,17,9 C17,9,17,15,17,15 C17,15,15,15,15,15 C15,15,13,11,13,11 C13,11,11,13,11,13 C11,13,11,19,11,19 C11,19,15,19,15,19 C15,19,21,23,21,23 C21,23,27,25,27,25 C27,25,27,29,27,29 C27,29,15.69,42.20,15.69,42.20 C15.46,42.09,15.23,41.98,15,41.87 C15,41.87,15,31,15,31 C15,31,9,29,9,29 C9,29,9,19,9,19 C9,19,7,15,7,15 C7,15,7,13.46,7,13.46 C9.57,9.32,13.62,6.19,18.40,4.79 z\\\"/><path style=\\\"fill:#3da8f4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M7,13.46 C5.10,16.52,4,20.13,4,24 C4,31.81,8.47,38.57,15,41.87 C15,41.87,15,31,15,31 C15,31,9,29,9,29 C9,29,9,19,9,19 C9,19,7,15,7,15 C7,15,7,13.46,7,13.46 z\\\"/><path style=\\\"fill:#3da8f4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M18.40,4.79 C20.18,4.28,22.06,4,24,4 C27.57,4,30.92,4.93,33.82,6.57 C33.82,6.57,29,13,29,13 C29,13,31,19,31,19 C31,19,37,21,37,21 C37,21,39,29,39,29 C39,29,37.35,38.89,37.35,38.89 C33.81,42.07,29.13,44,24,44 C21.03,44,18.22,43.35,15.69,42.20 C15.69,42.20,27,29,27,29 C27,29,27,25,27,25 C27,25,21,23,21,23 C21,23,15,19,15,19 C15,19,11,19,11,19 C11,19,11,13,11,13 C11,13,13,11,13,11 C13,11,15,15,15,15 C15,15,17,15,17,15 C17,15,17,9,17,9 C17,9,18.40,4.79,18.40,4.79 z\\\"/><path style=\\\"fill:#006736;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M33.82,6.57 C33.82,6.57,29,13,29,13 C29,13,31,19,31,19 C31,19,37,21,37,21 C37,21,39,29,39,29 C39,29,37.35,38.89,37.35,38.89 C41.43,35.23,44,29.91,44,24 C44,16.52,39.90,10.00,33.82,6.57 z\\\"/></g></g></svg> \",\n blueprint: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.5,14.5 C10.5,14.5,7.5,15.5,7.5,17.5 C7.5,19.5,10.5,19.5,10.5,19.5\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M18.50,14.5 C18.50,14.5,21.50,15.5,21.50,17.5 C21.50,19.5,18.50,19.5,18.50,19.5\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M7,5.09 C7,3.94,7.90,3,9,3 C9,3,20,3,20,3 C21.10,3,22,3.94,22,5.09 C22,5.09,22,12.41,22,12.41 C22,13.56,21.10,14.5,20,14.5 C20,14.5,9,14.5,9,14.5 C7.90,14.5,7,13.56,7,12.41 C7,12.41,7,5.09,7,5.09 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14.5,5.5 C14.5,5.5,14.5,11.5,14.5,11.5\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.5,7.5 C16.5,7.5,16.5,8.5,16.5,8.5\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.5,7.5 C12.5,7.5,12.5,8.5,12.5,8.5\\\"/><g/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M18.5,21.5 C18.5,21.5,17.5,20.5,17.5,20.5 C17.5,20.5,16.5,21.5,16.5,21.5\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.5,21.5 C12.5,21.5,11.5,20.5,11.5,20.5 C11.5,20.5,10.5,21.5,10.5,21.5\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.5,14.5 C10.5,14.5,18.5,14.5,18.5,14.5 C18.5,14.5,18.5,19.5,18.5,19.5 C18.5,19.5,10.5,19.5,10.5,19.5 C10.5,19.5,10.5,14.5,10.5,14.5 z\\\"/><g><g><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14,16.5 C14,16.5,16,16.5,16,16.5 C16,16.5,14.53,19.5,14.53,19.5\\\"/><path style=\\\"fill:#5e78ca;fill-rule:evenodd;stroke:none;\\\" d=\\\"M3.59,8.5 C3.59,8.5,12.59,8.5,12.59,8.5 C12.59,8.5,14.53,19.5,14.53,19.5 C14.53,19.5,5.53,19.5,5.53,19.5 C5.53,19.5,3.59,8.5,3.59,8.5 z\\\"/><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.59,8.5 C12.59,8.5,11.12,11.5,11.12,11.5 C11.12,11.5,2.12,11.5,2.12,11.5 C2.12,11.5,3.59,8.5,3.59,8.5\\\"/><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.59,8.5 C12.59,8.5,14.53,19.5,14.53,19.5\\\"/><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M4.12,11.5 C4.12,11.5,5.53,19.5,5.53,19.5\\\"/></g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M9.24,12.5 C10.75,12.5,12.20,13.73,12.46,15.24 C12.46,15.24,12.46,15.24,12.46,15.24 C12.68,16.49,11.85,17.5,10.60,17.5 C10.60,17.5,10.55,17.5,10.55,17.5 C10.17,17.5,9.92,17.81,9.98,18.19 C9.98,18.19,9.98,18.19,9.98,18.19 C10.21,19.47,9.36,20.5,8.08,20.5 C8.08,20.5,6.39,20.5,6.39,20.5 C5.10,20.5,3.87,19.45,3.64,18.16 C3.64,18.16,3.12,15.21,3.12,15.21 C2.86,13.71,3.86,12.5,5.35,12.5 C5.35,12.5,9.24,12.5,9.24,12.5 z\\\"/></g></g></svg> \",\n tosiXr: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,5.00,15.25,5.00,17.25 C5.00,19.25,8.00,19.25,8.00,19.25\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,14.25 C16.00,14.25,19.00,15.25,19.00,17.25 C19.00,19.25,16.00,19.25,16.00,19.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M4.50,4.85 C4.50,3.69,5.40,2.75,6.50,2.75 C6.50,2.75,17.50,2.75,17.50,2.75 C18.61,2.75,19.50,3.69,19.50,4.85 C19.50,4.85,19.50,12.16,19.50,12.16 C19.50,13.32,18.61,14.25,17.50,14.25 C17.50,14.25,6.50,14.25,6.50,14.25 C5.40,14.25,4.50,13.32,4.50,12.16 C4.50,12.16,4.50,4.85,4.50,4.85 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.00,5.25 C12.00,5.25,12.00,11.25,12.00,11.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14.00,7.25 C14.00,7.25,14.00,8.25,14.00,8.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,7.25 C10.00,7.25,10.00,8.25,10.00,8.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,21.25 C16.00,21.25,15.00,20.25,15.00,20.25 C15.00,20.25,14.00,21.25,14.00,21.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,21.25 C10.00,21.25,9.00,20.25,9.00,20.25 C9.00,20.25,8.00,21.25,8.00,21.25\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,16.00,14.25,16.00,14.25 C16.00,14.25,16.00,19.25,16.00,19.25 C16.00,19.25,8.00,19.25,8.00,19.25 C8.00,19.25,8.00,14.25,8.00,14.25 z\\\"/><path style=\\\"fill:#ff7bac;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.00,4.00 C12.00,4,11.99,4,11.99,4 C6.19,4,3,4.73,3,8.50 C3,11.39,4.66,13.00,7.27,13 C9.88,13.00,10.68,11.13,11.99,11.13 C11.99,11.13,12.00,11.13,12,11.13 C12.00,11.13,12.01,11.13,12.01,11.13 C13.32,11.13,14.12,13.00,16.73,13 C19.34,13.00,21,11.39,21,8.50 C21,4.73,17.81,4,12.01,4 C12.01,4,12.00,4,12.00,4.00 C12.00,4.00,12.00,4.00,12.00,4.00 z\\\"/></g></svg> \",\n cmy: \"<svg class=\\\"color filled\\\" viewBox=\\\"0 0 24 24\\\"><g><g><path style=\\\"fill:#00ff00;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C6.37,11.85,7.87,13.42,9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 z\\\"/><path style=\\\"fill:#0000ff;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C13.10,10.01,14.49,9.5,16,9.5 C16.78,9.5,17.53,9.64,18.22,9.89 C17.63,11.85,16.13,13.42,14.22,14.11 C13.83,12.81,13.04,11.69,12.00,10.88 C12.00,10.88,12.00,10.88,12.00,10.88 z\\\"/><path style=\\\"fill:#000000;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 C13.04,11.69,13.83,12.81,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#ff0000;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C9.60,14.71,9.5,15.34,9.5,16 C9.5,18.08,10.48,19.93,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#02fefe;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C5.60,9.29,5.5,8.66,5.5,8 C5.5,4.41,8.41,1.5,12,1.5 C15.59,1.5,18.5,4.41,18.5,8 C18.5,8.66,18.40,9.29,18.22,9.89 C17.53,9.64,16.78,9.5,16,9.5 C14.49,9.5,13.10,10.01,12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#fffe00;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C3.28,10.80,1.50,13.19,1.50,16 C1.50,19.59,4.41,22.5,8.00,22.5 C9.51,22.5,10.90,21.99,12.00,21.12 C10.48,19.93,9.5,18.08,9.5,16 C9.5,15.34,9.60,14.71,9.78,14.11 C7.87,13.42,6.37,11.85,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#ff00ff;fill-rule:evenodd;\\\" d=\\\"M18.22,9.89 C20.72,10.80,22.5,13.19,22.5,16 C22.5,19.59,19.59,22.5,16,22.5 C14.49,22.5,13.10,21.99,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C16.13,13.42,17.63,11.85,18.22,9.89 z\\\"/></g></g></svg> \",\n rgb: \"<svg class=\\\"color filled\\\" viewBox=\\\"0 0 24 24\\\"><g><g><path style=\\\"fill:#ff00ff;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C6.37,11.85,7.87,13.42,9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 z\\\"/><path style=\\\"fill:#ffff00;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C13.10,10.01,14.49,9.5,16,9.5 C16.78,9.5,17.53,9.64,18.22,9.89 C17.63,11.85,16.13,13.42,14.22,14.11 C13.83,12.81,13.04,11.69,12.00,10.88 C12.00,10.88,12.00,10.88,12.00,10.88 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 C13.04,11.69,13.83,12.81,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#00ffff;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C9.60,14.71,9.5,15.34,9.5,16 C9.5,18.08,10.48,19.93,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#ff0000;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C5.60,9.29,5.5,8.66,5.5,8 C5.5,4.41,8.41,1.5,12,1.5 C15.59,1.5,18.5,4.41,18.5,8 C18.5,8.66,18.40,9.29,18.22,9.89 C17.53,9.64,16.78,9.5,16,9.5 C14.49,9.5,13.10,10.01,12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#0000ff;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C3.28,10.80,1.50,13.19,1.50,16 C1.50,19.59,4.41,22.5,8.00,22.5 C9.51,22.5,10.90,21.99,12.00,21.12 C10.48,19.93,9.5,18.08,9.5,16 C9.5,15.34,9.60,14.71,9.78,14.11 C7.87,13.42,6.37,11.85,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#00ff00;fill-rule:evenodd;\\\" d=\\\"M18.22,9.89 C20.72,10.80,22.5,13.19,22.5,16 C22.5,19.59,19.59,22.5,16,22.5 C14.49,22.5,13.10,21.99,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C16.13,13.42,17.63,11.85,18.22,9.89 z\\\"/></g></g></svg> \",\n xrColor: \"<svg class=\\\"color filled\\\" viewBox=\\\"0 0 40 24\\\"><g><g><g><path style=\\\"fill:#000000;fill-rule:evenodd;\\\" d=\\\"M20.00,2.00 C19.99,2.00,19.98,2,19.98,2 C8.39,2,2,3.61,2,12.00 C2,18.41,5.32,22.00,10.54,22 C15.77,22.00,17.37,17.85,19.98,17.85 C19.98,17.85,19.99,17.85,20,17.85 C20.01,17.85,20.02,17.85,20.02,17.85 C22.63,17.85,24.23,22.00,29.46,22 C34.68,22.00,38,18.41,38,12.00 C38,3.61,31.61,2,20.02,2 C20.02,2,20.01,2.00,20.00,2.00 C20.00,2.00,20.00,2.00,20.00,2.00 z\\\"/></g><path style=\\\"fill:#fbed21;fill-rule:evenodd;\\\" d=\\\"M12.20,19.84 C15.79,19.39,17.07,16.46,19.07,16.46 C19.07,16.46,19.08,16.46,19.09,16.46 C19.09,16.46,19.10,16.46,19.11,16.46 C19.44,16.46,19.75,16.54,20.06,16.68 C20.37,16.54,20.68,16.46,21.01,16.46 C21.02,16.46,21.02,16.46,21.03,16.46 C21.04,16.46,21.04,16.46,21.05,16.46 C23.05,16.46,24.33,19.39,27.92,19.84 C31.66,19.40,33.98,16.50,33.98,11.62 C33.98,4.91,29.04,3.44,20.06,3.35 C11.07,3.44,6.14,4.91,6.14,11.62 C6.14,16.50,8.46,19.40,12.20,19.84 z\\\"/><path style=\\\"fill:#8cc63f;fill-rule:evenodd;\\\" d=\\\"M12.20,19.84 C12.52,19.87,12.86,19.89,13.21,19.89 C16.86,19.89,18.37,17.43,20.06,16.68 C19.75,16.54,19.44,16.46,19.11,16.46 C19.10,16.46,19.09,16.46,19.09,16.46 C19.08,16.46,19.07,16.46,19.07,16.46 C17.07,16.46,15.79,19.39,12.20,19.84 z\\\"/><path style=\\\"fill:#8cc63f;fill-rule:evenodd;\\\" d=\\\"M20.06,3.35 C20.37,3.35,20.69,3.35,21.01,3.35 C21.02,3.35,21.02,3.35,21.03,3.35 C21.03,3.35,21.03,3.35,21.03,3.35 C21.04,3.35,21.04,3.35,21.05,3.35 C30.64,3.35,35.92,4.68,35.92,11.62 C35.92,16.92,33.18,19.89,28.86,19.89 C28.53,19.89,28.22,19.87,27.92,19.84 C31.66,19.40,33.98,16.50,33.98,11.62 C33.98,4.91,29.04,3.44,20.06,3.35 C20.06,3.35,20.06,3.35,20.06,3.35 z\\\"/><path style=\\\"fill:#ff1c23;fill-rule:evenodd;\\\" d=\\\"M20.06,16.68 C21.74,17.43,23.25,19.89,26.91,19.89 C27.26,19.89,27.59,19.87,27.92,19.84 C24.33,19.39,23.05,16.46,21.05,16.46 C21.04,16.46,21.04,16.46,21.03,16.46 C21.02,16.46,21.02,16.46,21.01,16.46 C20.68,16.46,20.37,16.54,20.06,16.68 z\\\"/><path style=\\\"fill:#ff1c23;fill-rule:evenodd;\\\" d=\\\"M12.20,19.84 C11.90,19.87,11.59,19.89,11.26,19.89 C6.94,19.89,4.19,16.92,4.19,11.62 C4.19,4.68,9.48,3.35,19.07,3.35 C19.07,3.35,19.08,3.35,19.09,3.35 C19.09,3.35,19.09,3.35,19.09,3.35 C19.09,3.35,19.1,3.35,19.11,3.35 C19.43,3.35,19.75,3.35,20.06,3.35 C11.07,3.44,6.14,4.91,6.14,11.62 C6.14,16.50,8.46,19.40,12.20,19.84 z\\\"/></g><g><path style=\\\"fill:#8cc63e;fill-rule:nonzero;\\\" d=\\\"M22.55,8.63 C22.55,9.05,22.55,9.46,22.55,9.88 C22.54,10.25,22.85,10.56,23.20,10.55 C23.54,10.56,23.85,10.25,23.85,9.88 C23.85,9.46,23.85,9.05,23.85,8.63 C23.85,8.26,23.54,7.95,23.20,7.96 C22.85,7.95,22.54,8.26,22.55,8.63 z\\\"/><path style=\\\"fill:#8cc63e;fill-rule:nonzero;\\\" d=\\\"M17.32,8.63 C17.32,9.05,17.32,9.46,17.32,9.88 C17.31,10.25,17.62,10.56,17.97,10.55 C18.31,10.56,18.62,10.25,18.62,9.88 C18.62,9.46,18.62,9.05,18.62,8.63 C18.62,8.26,18.31,7.95,17.97,7.96 C17.62,7.95,17.31,8.26,17.32,8.63 z\\\"/><path style=\\\"fill:#8cc63e;fill-rule:nonzero;\\\" d=\\\"M19.99,4.39 C19.99,8.09,19.99,11.80,19.99,15.50 C19.99,15.87,20.30,16.18,20.64,16.17 C20.99,16.18,21.30,15.87,21.29,15.50 C21.29,11.80,21.29,8.09,21.29,4.39 C21.30,4.02,20.99,3.71,20.64,3.72 C20.30,3.71,19.99,4.02,19.99,4.39 z\\\"/><path style=\\\"fill:#fe1a22;fill-rule:nonzero;\\\" d=\\\"M21.43,8.63 C21.43,9.05,21.43,9.46,21.43,9.88 C21.42,10.25,21.73,10.56,22.08,10.55 C22.42,10.56,22.73,10.25,22.73,9.88 C22.73,9.46,22.73,9.05,22.73,8.63 C22.73,8.26,22.42,7.95,22.08,7.96 C21.73,7.95,21.42,8.26,21.43,8.63 z\\\"/><path style=\\\"fill:#fe1a22;fill-rule:nonzero;\\\" d=\\\"M16.20,8.63 C16.20,9.05,16.20,9.46,16.20,9.88 C16.19,10.25,16.50,10.56,16.85,10.55 C17.19,10.56,17.50,10.25,17.50,9.88 C17.50,9.46,17.50,9.05,17.50,8.63 C17.50,8.26,17.19,7.95,16.85,7.96 C16.50,7.95,16.19,8.26,16.20,8.63 z\\\"/><path style=\\\"fill:#fe1a22;fill-rule:nonzero;\\\" d=\\\"M18.87,4.39 C18.87,8.09,18.87,11.80,18.87,15.50 C18.87,15.87,19.18,16.18,19.52,16.17 C19.86,16.18,20.18,15.87,20.17,15.50 C20.17,11.80,20.17,8.09,20.17,4.39 C20.18,4.02,19.86,3.71,19.52,3.72 C19.18,3.71,18.87,4.02,18.87,4.39 z\\\"/><path style=\\\"fill:#000000;fill-rule:nonzero;\\\" d=\\\"M21.97,8.63 C21.97,9.05,21.97,9.46,21.97,9.88 C21.97,10.25,22.28,10.56,22.62,10.55 C22.97,10.56,23.28,10.25,23.27,9.88 C23.27,9.46,23.27,9.05,23.27,8.63 C23.28,8.26,22.97,7.95,22.62,7.96 C22.28,7.95,21.97,8.26,21.97,8.63 z\\\"/><path style=\\\"fill:#000000;fill-rule:nonzero;\\\" d=\\\"M16.74,8.63 C16.74,9.05,16.74,9.46,16.74,9.88 C16.74,10.25,17.05,10.56,17.39,10.55 C17.74,10.56,18.05,10.25,18.04,9.88 C18.04,9.46,18.04,9.05,18.04,8.63 C18.05,8.26,17.74,7.95,17.39,7.96 C17.05,7.95,16.74,8.26,16.74,8.63 z\\\"/><path style=\\\"fill:#000000;fill-rule:nonzero;\\\" d=\\\"M19.41,4.39 C19.41,8.09,19.41,11.80,19.41,15.50 C19.41,15.87,19.72,16.18,20.07,16.17 C20.41,16.18,20.72,15.87,20.72,15.50 C20.72,11.80,20.72,8.09,20.72,4.39 C20.72,4.02,20.41,3.71,20.07,3.72 C19.72,3.71,19.41,4.02,19.41,4.39 z\\\"/></g></g></svg> \",\n tosiUi: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><g><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M3,33 C3,31.90,3.90,31,5,31 C5,31,43,31,43,31 C44.10,31,45,31.90,45,33 C45,33,45,43,45,43 C45,44.10,44.10,45,43,45 C43,45,5,45,5,45 C3.90,45,3,44.10,3,43 C3,43,3,33,3,33 z\\\"/><g><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#ed247b;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M7,35 C7,35,7,36.34,7,38 C7,39.66,8.34,41,10,41 C11.66,41,13,39.66,13,38 C13,36.34,13,35,13,35\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#ed247b;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M17,35 C17,35,17,41,17,41\\\"/></g><g><path style=\\\"fill:#ed247b;fill-rule:evenodd;stroke:none;\\\" d=\\\"M38,33 C40.76,33,43,35.24,43,38 C43,40.76,40.76,43,38,43 C35.24,43,33,40.76,33,38 C33,35.24,35.24,33,38,33 z\\\"/><path style=\\\"fill:#ed247b;fill-rule:nonzero;stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M40,36 C40,36,36,40,36,40\\\"/><path style=\\\"fill:#ed247b;fill-rule:nonzero;stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M36,36 C36,36,40,40,40,40\\\"/></g></g><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M15.97,21.01 C15.97,21.01,9.97,23.01,9.97,27.01 C9.97,31.01,15.97,31.01,15.97,31.01\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M31.97,21.01 C31.97,21.01,37.97,23.01,37.97,27.01 C37.97,31.01,31.97,31.01,31.97,31.01\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M31,33 C31,33,29.49,31,29.49,31 C29.49,31,27.97,33,27.97,33\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M19.97,33 C19.97,33,17.97,31,17.97,31 C17.97,31,15.97,33,15.97,33\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M15.97,21 C15.97,21,31.97,21,31.97,21 C31.97,21,31.97,31,31.97,31 C31.97,31,15.97,31,15.97,31 C15.97,31,15.97,21,15.97,21 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M9,7.18 C9,4.87,10.79,3,13.00,3 C13.00,3,35.02,3,35.02,3 C37.23,3,39.03,4.87,39.03,7.18 C39.03,7.18,39.03,21.82,39.03,21.82 C39.03,24.13,37.23,26,35.02,26 C35.02,26,13.00,26,13.00,26 C10.79,26,9,24.13,9,21.82 C9,21.82,9,7.18,9,7.18 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M24,11 C24,11,24,23,24,23\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M28,15 C28,15,28,17,28,17\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M20,15 C20,15,20,17,20,17\\\"/></g></g></g></svg> \",\n tosiFavicon: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><path style=\\\"fill:#ed247b;fill-rule:evenodd;stroke:none;\\\" d=\\\"M1,9 C1,4.58,4.58,1,9,1 C9,1,39,1,39,1 C43.42,1,47,4.58,47,9 C47,9,47,39,47,39 C47,43.42,43.42,47,39,47 C39,47,9,47,9,47 C4.58,47,1,43.42,1,39 C1,39,1,9,1,9 z\\\"/><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M16,29 C16,29,10,31,10,35 C10,39,16,39,16,39\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M32.00,29 C32.00,29,38.00,31,38.00,35 C38.00,39,32.00,39,32.00,39\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M9,10.18 C9,7.87,10.79,6,13,6 C13,6,35,6,35,6 C37.21,6,39,7.87,39,10.18 C39,10.18,39,24.82,39,24.82 C39,27.13,37.21,29,35,29 C35,29,13,29,13,29 C10.79,29,9,27.13,9,24.82 C9,24.82,9,10.18,9,10.18 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M24,11 C24,11,24,23,24,23\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M28,15 C28,15,28,17,28,17\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M20,15 C20,15,20,17,20,17\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M32,43 C32,43,30,41,30,41 C30,41,28,43,28,43\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M20,43 C20,43,18,41,18,41 C18,41,16,43,16,43\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M16,29 C16,29,32,29,32,29 C32,29,32,39,32,39 C32,39,16,39,16,39 C16,39,16,29,16,29 z\\\"/></g></g></g></svg> \",\n tosiPlatform: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><g><path style=\\\"fill:#3ea9f5;fill-rule:evenodd;stroke:none;\\\" d=\\\"M23.97,47 C23.97,47,39,47,39,47 C43.42,47,47,43.42,47,39 C47,39,47,9,47,9 C47,4.58,43.42,1,39,1 C39,1,9,1,9,1 C4.58,1,1,4.58,1,9 C1,9,1,39,1,39 C1,41.64,2.28,43.98,4.25,45.44 C4.09,44.82,4,44.17,4,43.5 C4,39.36,7.36,36,11.5,36 C15.14,36,18.18,38.60,18.86,42.05 C19.07,42.02,19.28,42,19.5,42 C21.99,42,24,44.01,24,46.5 C24,46.67,23.99,46.84,23.97,47 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:none;\\\" d=\\\"M4.25,45.44 C4.09,44.82,4,44.17,4,43.5 C4,39.36,7.36,36,11.5,36 C15.14,36,18.18,38.60,18.86,42.05 C19.07,42.02,19.28,42,19.5,42 C21.99,42,24,44.01,24,46.5 C24,46.67,23.99,46.84,23.97,47 C23.97,47,9,47,9,47 C7.22,47,5.58,46.42,4.25,45.44 z\\\"/></g><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M35,35 C35,35,32.17,35,32.17,35 C32.17,35,32.17,37.83,32.17,37.83\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M31,39 C31,39,28.17,39,28.17,39 C28.17,39,28.17,41.83,28.17,41.83\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M7.48,16 C4.45,16,2,18.45,2,21.48 C2,21.48,2,21.48,2,21.48 C2,23.98,4.02,26,6.52,26 C6.52,26,6.62,26,6.62,26 C7.38,26,8,26.62,8,27.38 C8,27.38,8,27.38,8,27.38 C8,29.93,10.07,32,12.62,32 C12.62,32,16,32,16,32 C18.58,32,20.68,29.91,20.68,27.32 C20.68,27.32,20.68,21.42,20.68,21.42 C20.68,18.43,18.25,16,15.26,16 C15.26,16,7.48,16,7.48,16 z\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M17,29 C17,29,33,29,33,29 C33,29,33,29,33,29 C33,34.52,28.52,39,23,39 C23,39,23,39,23,39 C19.69,39,17,36.31,17,33 C17,33,17,29,17,29 z\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M40.52,16 C43.55,16,46,18.45,46,21.48 C46,21.48,46,21.48,46,21.48 C46,23.98,43.98,26,41.48,26 C41.48,26,41.38,26,41.38,26 C40.62,26,40,26.62,40,27.38 C40,27.38,40,27.38,40,27.38 C40,29.93,37.93,32,35.38,32 C35.38,32,32,32,32,32 C29.42,32,27.32,29.91,27.32,27.32 C27.32,27.32,27.32,21.42,27.32,21.42 C27.32,18.43,29.75,16,32.74,16 C32.74,16,40.52,16,40.52,16 z\\\"/><g><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M6,10.18 C6,7.87,7.79,6,10,6 C10,6,32,6,32,6 C34.21,6,36,7.87,36,10.18 C36,10.18,36,24.82,36,24.82 C36,27.13,34.21,29,32,29 C32,29,10,29,10,29 C7.79,29,6,27.13,6,24.82 C6,24.82,6,10.18,6,10.18 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M21,11 C21,11,21,23,21,23\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M25,15 C25,15,25,17,25,17\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M17,15 C17,15,17,17,17,17\\\"/></g></g></g></svg> \",\n tosi: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,5.00,15.25,5.00,17.25 C5.00,19.25,8.00,19.25,8.00,19.25\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,14.25 C16.00,14.25,19.00,15.25,19.00,17.25 C19.00,19.25,16.00,19.25,16.00,19.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M4.50,4.85 C4.50,3.69,5.40,2.75,6.50,2.75 C6.50,2.75,17.50,2.75,17.50,2.75 C18.61,2.75,19.50,3.69,19.50,4.85 C19.50,4.85,19.50,12.16,19.50,12.16 C19.50,13.32,18.61,14.25,17.50,14.25 C17.50,14.25,6.50,14.25,6.50,14.25 C5.40,14.25,4.50,13.32,4.50,12.16 C4.50,12.16,4.50,4.85,4.50,4.85 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.00,5.25 C12.00,5.25,12.00,11.25,12.00,11.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14.00,7.25 C14.00,7.25,14.00,8.25,14.00,8.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,7.25 C10.00,7.25,10.00,8.25,10.00,8.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,21.25 C16.00,21.25,15.00,20.25,15.00,20.25 C15.00,20.25,14.00,21.25,14.00,21.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,21.25 C10.00,21.25,9.00,20.25,9.00,20.25 C9.00,20.25,8.00,21.25,8.00,21.25\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,16.00,14.25,16.00,14.25 C16.00,14.25,16.00,19.25,16.00,19.25 C16.00,19.25,8.00,19.25,8.00,19.25 C8.00,19.25,8.00,14.25,8.00,14.25 z\\\"/></g></svg> \",\n sortDescending: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path d=\\\"M16.5,14.5 C16.5,14.5,7.5,14.5,7.5,14.5\\\"/><path d=\\\"M14.5,18.5 C14.5,18.5,9.5,18.5,9.5,18.5\\\"/><path d=\\\"M18.5,10.5 C18.5,10.5,5.5,10.5,5.5,10.5\\\"/><path d=\\\"M20.5,6.5 C20.5,6.5,3.5,6.5,3.5,6.5\\\"/></g></svg> \",\n columns: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 3h7a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-7m0-18H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7m0-18v18\\\"></path></svg>\",\n underline: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\\\"></path><line x1=\\\"4\\\" y1=\\\"21\\\" x2=\\\"20\\\" y2=\\\"21\\\"></line></svg>\",\n grid: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"7\\\" height=\\\"7\\\"></rect><rect x=\\\"14\\\" y=\\\"3\\\" width=\\\"7\\\" height=\\\"7\\\"></rect><rect x=\\\"14\\\" y=\\\"14\\\" width=\\\"7\\\" height=\\\"7\\\"></rect><rect x=\\\"3\\\" y=\\\"14\\\" width=\\\"7\\\" height=\\\"7\\\"></rect></svg>\",\n triangle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\\\"></path></svg>\",\n search: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"></circle><line x1=\\\"21\\\" y1=\\\"21\\\" x2=\\\"16.65\\\" y2=\\\"16.65\\\"></line></svg>\",\n volume2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon><path d=\\\"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\\\"></path></svg>\",\n arrowUpCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"16 12 12 8 8 12\\\"></polyline><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line></svg>\",\n pauseCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"10\\\" y1=\\\"15\\\" x2=\\\"10\\\" y2=\\\"9\\\"></line><line x1=\\\"14\\\" y1=\\\"15\\\" x2=\\\"14\\\" y2=\\\"9\\\"></line></svg>\",\n checkSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 11 12 14 22 4\\\"></polyline><path d=\\\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\\\"></path></svg>\",\n arrowDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"5\\\" x2=\\\"12\\\" y2=\\\"19\\\"></line><polyline points=\\\"19 12 12 19 5 12\\\"></polyline></svg>\",\n figma: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 5.5A3.5 3.5 0 0 1 8.5 2H12v7H8.5A3.5 3.5 0 0 1 5 5.5z\\\"></path><path d=\\\"M12 2h3.5a3.5 3.5 0 1 1 0 7H12V2z\\\"></path><path d=\\\"M12 12.5a3.5 3.5 0 1 1 7 0 3.5 3.5 0 1 1-7 0z\\\"></path><path d=\\\"M5 19.5A3.5 3.5 0 0 1 8.5 16H12v3.5a3.5 3.5 0 1 1-7 0z\\\"></path><path d=\\\"M5 12.5A3.5 3.5 0 0 1 8.5 9H12v7H8.5A3.5 3.5 0 0 1 5 12.5z\\\"></path></svg>\",\n cornerRightUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"10 9 15 4 20 9\\\"></polyline><path d=\\\"M4 20h7a4 4 0 0 0 4-4V4\\\"></path></svg>\",\n chevronsRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"13 17 18 12 13 7\\\"></polyline><polyline points=\\\"6 17 11 12 6 7\\\"></polyline></svg>\",\n list: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"8\\\" y1=\\\"6\\\" x2=\\\"21\\\" y2=\\\"6\\\"></line><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"21\\\" y2=\\\"12\\\"></line><line x1=\\\"8\\\" y1=\\\"18\\\" x2=\\\"21\\\" y2=\\\"18\\\"></line><line x1=\\\"3\\\" y1=\\\"6\\\" x2=\\\"3.01\\\" y2=\\\"6\\\"></line><line x1=\\\"3\\\" y1=\\\"12\\\" x2=\\\"3.01\\\" y2=\\\"12\\\"></line><line x1=\\\"3\\\" y1=\\\"18\\\" x2=\\\"3.01\\\" y2=\\\"18\\\"></line></svg>\",\n chevronsDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"7 13 12 18 17 13\\\"></polyline><polyline points=\\\"7 6 12 11 17 6\\\"></polyline></svg>\",\n wind: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9.59 4.59A2 2 0 1 1 11 8H2m10.59 11.41A2 2 0 1 0 14 16H2m15.73-8.27A2.5 2.5 0 1 1 19.5 12H2\\\"></path></svg>\",\n cornerUpRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 14 20 9 15 4\\\"></polyline><path d=\\\"M4 20v-7a4 4 0 0 1 4-4h12\\\"></path></svg>\",\n target: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"6\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"2\\\"></circle></svg>\",\n scissors: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"6\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><line x1=\\\"20\\\" y1=\\\"4\\\" x2=\\\"8.12\\\" y2=\\\"15.88\\\"></line><line x1=\\\"14.47\\\" y1=\\\"14.48\\\" x2=\\\"20\\\" y2=\\\"20\\\"></line><line x1=\\\"8.12\\\" y1=\\\"8.12\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n minimize2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"4 14 10 14 10 20\\\"></polyline><polyline points=\\\"20 10 14 10 14 4\\\"></polyline><line x1=\\\"14\\\" y1=\\\"10\\\" x2=\\\"21\\\" y2=\\\"3\\\"></line><line x1=\\\"3\\\" y1=\\\"21\\\" x2=\\\"10\\\" y2=\\\"14\\\"></line></svg>\",\n playCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polygon points=\\\"10 8 16 12 10 16 10 8\\\"></polygon></svg>\",\n crosshair: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"22\\\" y1=\\\"12\\\" x2=\\\"18\\\" y2=\\\"12\\\"></line><line x1=\\\"6\\\" y1=\\\"12\\\" x2=\\\"2\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"6\\\" x2=\\\"12\\\" y2=\\\"2\\\"></line><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"18\\\"></line></svg>\",\n airplay: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-1\\\"></path><polygon points=\\\"12 15 17 21 7 21 12 15\\\"></polygon></svg>\",\n xOctagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\\\"></polygon><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n repeat: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"17 1 21 5 17 9\\\"></polyline><path d=\\\"M3 11V9a4 4 0 0 1 4-4h14\\\"></path><polyline points=\\\"7 23 3 19 7 15\\\"></polyline><path d=\\\"M21 13v2a4 4 0 0 1-4 4H3\\\"></path></svg>\",\n edit3: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 20h9\\\"></path><path d=\\\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\\\"></path></svg>\",\n volume1: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon><path d=\\\"M15.54 8.46a5 5 0 0 1 0 7.07\\\"></path></svg>\",\n sunrise: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 18a5 5 0 0 0-10 0\\\"></path><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"9\\\"></line><line x1=\\\"4.22\\\" y1=\\\"10.22\\\" x2=\\\"5.64\\\" y2=\\\"11.64\\\"></line><line x1=\\\"1\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"23\\\" y2=\\\"18\\\"></line><line x1=\\\"18.36\\\" y1=\\\"11.64\\\" x2=\\\"19.78\\\" y2=\\\"10.22\\\"></line><line x1=\\\"23\\\" y1=\\\"22\\\" x2=\\\"1\\\" y2=\\\"22\\\"></line><polyline points=\\\"8 6 12 2 16 6\\\"></polyline></svg>\",\n toggleRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"5\\\" width=\\\"22\\\" height=\\\"14\\\" rx=\\\"7\\\" ry=\\\"7\\\"></rect><circle cx=\\\"16\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n umbrella: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M23 12a11.05 11.05 0 0 0-22 0zm-5 7a3 3 0 0 1-6 0v-7\\\"></path></svg>\",\n user: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"12\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle></svg>\",\n fileMinus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\\\"></path><polyline points=\\\"14 2 14 8 20 8\\\"></polyline><line x1=\\\"9\\\" y1=\\\"15\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n xCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n circle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle></svg>\",\n phoneMissed: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"23\\\" y1=\\\"1\\\" x2=\\\"17\\\" y2=\\\"7\\\"></line><line x1=\\\"17\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"7\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n edit2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 3a2.83 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z\\\"></path></svg>\",\n cornerLeftUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"14 9 9 4 4 9\\\"></polyline><path d=\\\"M20 20h-7a4 4 0 0 1-4-4V4\\\"></path></svg>\",\n home: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\\\"></path><polyline points=\\\"9 22 9 12 15 12 15 22\\\"></polyline></svg>\",\n gitlab: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z\\\"></path></svg>\",\n music: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 18V5l12-2v13\\\"></path><circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><circle cx=\\\"18\\\" cy=\\\"16\\\" r=\\\"3\\\"></circle></svg>\",\n smartphone: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"5\\\" y=\\\"2\\\" width=\\\"14\\\" height=\\\"20\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12.01\\\" y2=\\\"18\\\"></line></svg>\",\n moreHorizontal: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle><circle cx=\\\"19\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle><circle cx=\\\"5\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle></svg>\",\n sliders: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"4\\\" y1=\\\"21\\\" x2=\\\"4\\\" y2=\\\"14\\\"></line><line x1=\\\"4\\\" y1=\\\"10\\\" x2=\\\"4\\\" y2=\\\"3\\\"></line><line x1=\\\"12\\\" y1=\\\"21\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"3\\\"></line><line x1=\\\"20\\\" y1=\\\"21\\\" x2=\\\"20\\\" y2=\\\"16\\\"></line><line x1=\\\"20\\\" y1=\\\"12\\\" x2=\\\"20\\\" y2=\\\"3\\\"></line><line x1=\\\"1\\\" y1=\\\"14\\\" x2=\\\"7\\\" y2=\\\"14\\\"></line><line x1=\\\"9\\\" y1=\\\"8\\\" x2=\\\"15\\\" y2=\\\"8\\\"></line><line x1=\\\"17\\\" y1=\\\"16\\\" x2=\\\"23\\\" y2=\\\"16\\\"></line></svg>\",\n arrowUpLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"17\\\" y1=\\\"17\\\" x2=\\\"7\\\" y2=\\\"7\\\"></line><polyline points=\\\"7 17 7 7 17 7\\\"></polyline></svg>\",\n chevronDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"6 9 12 15 18 9\\\"></polyline></svg>\",\n hexagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path></svg>\",\n github: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22\\\"></path></svg>\",\n crop: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6.13 1L6 16a2 2 0 0 0 2 2h15\\\"></path><path d=\\\"M1 6.13L16 6a2 2 0 0 1 2 2v15\\\"></path></svg>\",\n tag: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\\\"></path><line x1=\\\"7\\\" y1=\\\"7\\\" x2=\\\"7.01\\\" y2=\\\"7\\\"></line></svg>\",\n briefcase: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"7\\\" width=\\\"20\\\" height=\\\"14\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\\\"></path></svg>\",\n rotateCw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 4 23 10 17 10\\\"></polyline><path d=\\\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\\\"></path></svg>\",\n map: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6\\\"></polygon><line x1=\\\"8\\\" y1=\\\"2\\\" x2=\\\"8\\\" y2=\\\"18\\\"></line><line x1=\\\"16\\\" y1=\\\"6\\\" x2=\\\"16\\\" y2=\\\"22\\\"></line></svg>\",\n inbox: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"22 12 16 12 14 15 10 15 8 12 2 12\\\"></polyline><path d=\\\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\\\"></path></svg>\",\n alignJustify: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"21\\\" y1=\\\"10\\\" x2=\\\"3\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line></svg>\",\n plusSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n power: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18.36 6.64a9 9 0 1 1-12.73 0\\\"></path><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n database: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><ellipse cx=\\\"12\\\" cy=\\\"5\\\" rx=\\\"9\\\" ry=\\\"3\\\"></ellipse><path d=\\\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\\\"></path><path d=\\\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\\\"></path></svg>\",\n cameraOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line><path d=\\\"M21 21H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3m3-3h6l2 3h4a2 2 0 0 1 2 2v9.34m-7.72-2.06a4 4 0 1 1-5.56-5.56\\\"></path></svg>\",\n toggleLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"5\\\" width=\\\"22\\\" height=\\\"14\\\" rx=\\\"7\\\" ry=\\\"7\\\"></rect><circle cx=\\\"8\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n file: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\\\"></path><polyline points=\\\"13 2 13 9 20 9\\\"></polyline></svg>\",\n messageCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\\\"></path></svg>\",\n voicemail: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"5.5\\\" cy=\\\"11.5\\\" r=\\\"4.5\\\"></circle><circle cx=\\\"18.5\\\" cy=\\\"11.5\\\" r=\\\"4.5\\\"></circle><line x1=\\\"5.5\\\" y1=\\\"16\\\" x2=\\\"18.5\\\" y2=\\\"16\\\"></line></svg>\",\n terminal: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"4 17 10 11 4 5\\\"></polyline><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"20\\\" y2=\\\"19\\\"></line></svg>\",\n move: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"5 9 2 12 5 15\\\"></polyline><polyline points=\\\"9 5 12 2 15 5\\\"></polyline><polyline points=\\\"15 19 12 22 9 19\\\"></polyline><polyline points=\\\"19 9 22 12 19 15\\\"></polyline><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"22\\\"></line></svg>\",\n maximize: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\\\"></path></svg>\",\n chevronUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"18 15 12 9 6 15\\\"></polyline></svg>\",\n arrowDownLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"17\\\" y1=\\\"7\\\" x2=\\\"7\\\" y2=\\\"17\\\"></line><polyline points=\\\"17 17 7 17 7 7\\\"></polyline></svg>\",\n fileText: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\\\"></path><polyline points=\\\"14 2 14 8 20 8\\\"></polyline><line x1=\\\"16\\\" y1=\\\"13\\\" x2=\\\"8\\\" y2=\\\"13\\\"></line><line x1=\\\"16\\\" y1=\\\"17\\\" x2=\\\"8\\\" y2=\\\"17\\\"></line><polyline points=\\\"10 9 9 9 8 9\\\"></polyline></svg>\",\n droplet: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z\\\"></path></svg>\",\n zapOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"12.41 6.75 13 2 10.57 4.92\\\"></polyline><polyline points=\\\"18.57 12.91 21 10 15.66 10\\\"></polyline><polyline points=\\\"8 8 3 14 12 14 11 22 16 16\\\"></polyline><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n x: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"18\\\" y1=\\\"6\\\" x2=\\\"6\\\" y2=\\\"18\\\"></line><line x1=\\\"6\\\" y1=\\\"6\\\" x2=\\\"18\\\" y2=\\\"18\\\"></line></svg>\",\n barChart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12\\\" y2=\\\"10\\\"></line><line x1=\\\"18\\\" y1=\\\"20\\\" x2=\\\"18\\\" y2=\\\"4\\\"></line><line x1=\\\"6\\\" y1=\\\"20\\\" x2=\\\"6\\\" y2=\\\"16\\\"></line></svg>\",\n lock: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"11\\\" width=\\\"18\\\" height=\\\"11\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M7 11V7a5 5 0 0 1 10 0v4\\\"></path></svg>\",\n logIn: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\\\"></path><polyline points=\\\"10 17 15 12 10 7\\\"></polyline><line x1=\\\"15\\\" y1=\\\"12\\\" x2=\\\"3\\\" y2=\\\"12\\\"></line></svg>\",\n shoppingBag: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\\\"></path><line x1=\\\"3\\\" y1=\\\"6\\\" x2=\\\"21\\\" y2=\\\"6\\\"></line><path d=\\\"M16 10a4 4 0 0 1-8 0\\\"></path></svg>\",\n divide: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"6\\\" r=\\\"2\\\"></circle><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line><circle cx=\\\"12\\\" cy=\\\"18\\\" r=\\\"2\\\"></circle></svg>\",\n cloudDrizzle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"8\\\" y1=\\\"19\\\" x2=\\\"8\\\" y2=\\\"21\\\"></line><line x1=\\\"8\\\" y1=\\\"13\\\" x2=\\\"8\\\" y2=\\\"15\\\"></line><line x1=\\\"16\\\" y1=\\\"19\\\" x2=\\\"16\\\" y2=\\\"21\\\"></line><line x1=\\\"16\\\" y1=\\\"13\\\" x2=\\\"16\\\" y2=\\\"15\\\"></line><line x1=\\\"12\\\" y1=\\\"21\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"12\\\" y1=\\\"15\\\" x2=\\\"12\\\" y2=\\\"17\\\"></line><path d=\\\"M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25\\\"></path></svg>\",\n refreshCw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 4 23 10 17 10\\\"></polyline><polyline points=\\\"1 20 1 14 7 14\\\"></polyline><path d=\\\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\\\"></path></svg>\",\n chevronRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 18 15 12 9 6\\\"></polyline></svg>\",\n clipboard: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\\\"></path><rect x=\\\"8\\\" y=\\\"2\\\" width=\\\"8\\\" height=\\\"4\\\" rx=\\\"1\\\" ry=\\\"1\\\"></rect></svg>\",\n package: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"16.5\\\" y1=\\\"9.4\\\" x2=\\\"7.5\\\" y2=\\\"4.21\\\"></line><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path><polyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"></polyline><line x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n instagram: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"20\\\" height=\\\"20\\\" rx=\\\"5\\\" ry=\\\"5\\\"></rect><path d=\\\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\\\"></path><line x1=\\\"17.5\\\" y1=\\\"6.5\\\" x2=\\\"17.51\\\" y2=\\\"6.5\\\"></line></svg>\",\n link: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\"></path><path d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\"></path></svg>\",\n videoOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 16v1a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2m5.66 0H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n key: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.78 7.78 5.5 5.5 0 0 1 7.78-7.78zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\\\"></path></svg>\",\n meh: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"8\\\" y1=\\\"15\\\" x2=\\\"16\\\" y2=\\\"15\\\"></line><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"9.01\\\" y2=\\\"9\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"15.01\\\" y2=\\\"9\\\"></line></svg>\",\n cornerDownRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 10 20 15 15 20\\\"></polyline><path d=\\\"M4 4v7a4 4 0 0 0 4 4h12\\\"></path></svg>\",\n arrowRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line><polyline points=\\\"12 5 19 12 12 19\\\"></polyline></svg>\",\n aperture: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"14.31\\\" y1=\\\"8\\\" x2=\\\"20.05\\\" y2=\\\"17.94\\\"></line><line x1=\\\"9.69\\\" y1=\\\"8\\\" x2=\\\"21.17\\\" y2=\\\"8\\\"></line><line x1=\\\"7.38\\\" y1=\\\"12\\\" x2=\\\"13.12\\\" y2=\\\"2.06\\\"></line><line x1=\\\"9.69\\\" y1=\\\"16\\\" x2=\\\"3.95\\\" y2=\\\"6.06\\\"></line><line x1=\\\"14.31\\\" y1=\\\"16\\\" x2=\\\"2.83\\\" y2=\\\"16\\\"></line><line x1=\\\"16.62\\\" y1=\\\"12\\\" x2=\\\"10.88\\\" y2=\\\"21.94\\\"></line></svg>\",\n stopCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"6\\\" height=\\\"6\\\"></rect></svg>\",\n logOut: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\\\"></path><polyline points=\\\"16 17 21 12 16 7\\\"></polyline><line x1=\\\"21\\\" y1=\\\"12\\\" x2=\\\"9\\\" y2=\\\"12\\\"></line></svg>\",\n arrowLeftCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"12 8 8 12 12 16\\\"></polyline><line x1=\\\"16\\\" y1=\\\"12\\\" x2=\\\"8\\\" y2=\\\"12\\\"></line></svg>\",\n barChart2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"18\\\" y1=\\\"20\\\" x2=\\\"18\\\" y2=\\\"10\\\"></line><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12\\\" y2=\\\"4\\\"></line><line x1=\\\"6\\\" y1=\\\"20\\\" x2=\\\"6\\\" y2=\\\"14\\\"></line></svg>\",\n gitPullRequest: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"18\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><path d=\\\"M13 6h3a2 2 0 0 1 2 2v7\\\"></path><line x1=\\\"6\\\" y1=\\\"9\\\" x2=\\\"6\\\" y2=\\\"21\\\"></line></svg>\",\n minimize: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\\\"></path></svg>\",\n minusSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n settings: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle><path d=\\\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\\\"></path></svg>\",\n cloudSnow: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 4 16.25\\\"></path><line x1=\\\"8\\\" y1=\\\"16\\\" x2=\\\"8.01\\\" y2=\\\"16\\\"></line><line x1=\\\"8\\\" y1=\\\"20\\\" x2=\\\"8.01\\\" y2=\\\"20\\\"></line><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12.01\\\" y2=\\\"18\\\"></line><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12.01\\\" y2=\\\"22\\\"></line><line x1=\\\"16\\\" y1=\\\"16\\\" x2=\\\"16.01\\\" y2=\\\"16\\\"></line><line x1=\\\"16\\\" y1=\\\"20\\\" x2=\\\"16.01\\\" y2=\\\"20\\\"></line></svg>\",\n thumbsDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\\\"></path></svg>\",\n type: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"4 7 4 4 20 4 20 7\\\"></polyline><line x1=\\\"9\\\" y1=\\\"20\\\" x2=\\\"15\\\" y2=\\\"20\\\"></line><line x1=\\\"12\\\" y1=\\\"4\\\" x2=\\\"12\\\" y2=\\\"20\\\"></line></svg>\",\n archive: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"21 8 21 21 3 21 3 8\\\"></polyline><rect x=\\\"1\\\" y=\\\"3\\\" width=\\\"22\\\" height=\\\"5\\\"></rect><line x1=\\\"10\\\" y1=\\\"12\\\" x2=\\\"14\\\" y2=\\\"12\\\"></line></svg>\",\n phoneOutgoing: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 7 23 1 17 1\\\"></polyline><line x1=\\\"16\\\" y1=\\\"8\\\" x2=\\\"23\\\" y2=\\\"1\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n pocket: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 3h16a2 2 0 0 1 2 2v6a10 10 0 0 1-10 10A10 10 0 0 1 2 11V5a2 2 0 0 1 2-2z\\\"></path><polyline points=\\\"8 10 12 14 16 10\\\"></polyline></svg>\",\n mail: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\\\"></path><polyline points=\\\"22,6 12,13 2,6\\\"></polyline></svg>\",\n shield: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\\\"></path></svg>\",\n download: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"></path><polyline points=\\\"7 10 12 15 17 10\\\"></polyline><line x1=\\\"12\\\" y1=\\\"15\\\" x2=\\\"12\\\" y2=\\\"3\\\"></line></svg>\",\n phoneForwarded: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"19 1 23 5 19 9\\\"></polyline><line x1=\\\"15\\\" y1=\\\"5\\\" x2=\\\"23\\\" y2=\\\"5\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n cornerRightDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"10 15 15 20 20 15\\\"></polyline><path d=\\\"M4 4h7a4 4 0 0 1 4 4v12\\\"></path></svg>\",\n bookOpen: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\\\"></path><path d=\\\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\\\"></path></svg>\",\n divideSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line></svg>\",\n server: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"20\\\" height=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><rect x=\\\"2\\\" y=\\\"14\\\" width=\\\"20\\\" height=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"6\\\" y1=\\\"6\\\" x2=\\\"6.01\\\" y2=\\\"6\\\"></line><line x1=\\\"6\\\" y1=\\\"18\\\" x2=\\\"6.01\\\" y2=\\\"18\\\"></line></svg>\",\n tv: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"7\\\" width=\\\"20\\\" height=\\\"15\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><polyline points=\\\"17 2 12 7 7 2\\\"></polyline></svg>\",\n skipForward: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"5 4 15 12 5 20 5 4\\\"></polygon><line x1=\\\"19\\\" y1=\\\"5\\\" x2=\\\"19\\\" y2=\\\"19\\\"></line></svg>\",\n volume: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon></svg>\",\n userPlus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><line x1=\\\"20\\\" y1=\\\"8\\\" x2=\\\"20\\\" y2=\\\"14\\\"></line><line x1=\\\"23\\\" y1=\\\"11\\\" x2=\\\"17\\\" y2=\\\"11\\\"></line></svg>\",\n batteryCharging: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 18H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3.19M15 6h2a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-3.19\\\"></path><line x1=\\\"23\\\" y1=\\\"13\\\" x2=\\\"23\\\" y2=\\\"11\\\"></line><polyline points=\\\"11 6 7 12 13 12 9 18\\\"></polyline></svg>\",\n layers: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 2 7 12 12 22 7 12 2\\\"></polygon><polyline points=\\\"2 17 12 22 22 17\\\"></polyline><polyline points=\\\"2 12 12 17 22 12\\\"></polyline></svg>\",\n slash: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"4.93\\\" y1=\\\"4.93\\\" x2=\\\"19.07\\\" y2=\\\"19.07\\\"></line></svg>\",\n radio: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"2\\\"></circle><path d=\\\"M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14\\\"></path></svg>\",\n book: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\\\"></path><path d=\\\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\\\"></path></svg>\",\n userMinus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><line x1=\\\"23\\\" y1=\\\"11\\\" x2=\\\"17\\\" y2=\\\"11\\\"></line></svg>\",\n bell: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\\\"></path><path d=\\\"M13.73 21a2 2 0 0 1-3.46 0\\\"></path></svg>\",\n gitBranch: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"6\\\" y1=\\\"3\\\" x2=\\\"6\\\" y2=\\\"15\\\"></line><circle cx=\\\"18\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><path d=\\\"M18 9a9 9 0 0 1-9 9\\\"></path></svg>\",\n coffee: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 8h1a4 4 0 0 1 0 8h-1\\\"></path><path d=\\\"M2 8h16v9a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4V8z\\\"></path><line x1=\\\"6\\\" y1=\\\"1\\\" x2=\\\"6\\\" y2=\\\"4\\\"></line><line x1=\\\"10\\\" y1=\\\"1\\\" x2=\\\"10\\\" y2=\\\"4\\\"></line><line x1=\\\"14\\\" y1=\\\"1\\\" x2=\\\"14\\\" y2=\\\"4\\\"></line></svg>\",\n code: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 18 22 12 16 6\\\"></polyline><polyline points=\\\"8 6 2 12 8 18\\\"></polyline></svg>\",\n thermometer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 14.76V3.5a2.5 2.5 0 0 0-5 0v11.26a4.5 4.5 0 1 0 5 0z\\\"></path></svg>\",\n cast: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M2 16.1A5 5 0 0 1 5.9 20M2 12.05A9 9 0 0 1 9.95 20M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\\\"></path><line x1=\\\"2\\\" y1=\\\"20\\\" x2=\\\"2.01\\\" y2=\\\"20\\\"></line></svg>\",\n flag: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z\\\"></path><line x1=\\\"4\\\" y1=\\\"22\\\" x2=\\\"4\\\" y2=\\\"15\\\"></line></svg>\",\n eyeOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n battery: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"6\\\" width=\\\"18\\\" height=\\\"12\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"23\\\" y1=\\\"13\\\" x2=\\\"23\\\" y2=\\\"11\\\"></line></svg>\",\n disc: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n frown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M16 16s-1.5-2-4-2-4 2-4 2\\\"></path><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"9.01\\\" y2=\\\"9\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"15.01\\\" y2=\\\"9\\\"></line></svg>\",\n tool: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\\\"></path></svg>\",\n cpu: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"4\\\" y=\\\"4\\\" width=\\\"16\\\" height=\\\"16\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"6\\\" height=\\\"6\\\"></rect><line x1=\\\"9\\\" y1=\\\"1\\\" x2=\\\"9\\\" y2=\\\"4\\\"></line><line x1=\\\"15\\\" y1=\\\"1\\\" x2=\\\"15\\\" y2=\\\"4\\\"></line><line x1=\\\"9\\\" y1=\\\"20\\\" x2=\\\"9\\\" y2=\\\"23\\\"></line><line x1=\\\"15\\\" y1=\\\"20\\\" x2=\\\"15\\\" y2=\\\"23\\\"></line><line x1=\\\"20\\\" y1=\\\"9\\\" x2=\\\"23\\\" y2=\\\"9\\\"></line><line x1=\\\"20\\\" y1=\\\"14\\\" x2=\\\"23\\\" y2=\\\"14\\\"></line><line x1=\\\"1\\\" y1=\\\"9\\\" x2=\\\"4\\\" y2=\\\"9\\\"></line><line x1=\\\"1\\\" y1=\\\"14\\\" x2=\\\"4\\\" y2=\\\"14\\\"></line></svg>\",\n bold: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\\\"></path><path d=\\\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\\\"></path></svg>\",\n hash: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"4\\\" y1=\\\"9\\\" x2=\\\"20\\\" y2=\\\"9\\\"></line><line x1=\\\"4\\\" y1=\\\"15\\\" x2=\\\"20\\\" y2=\\\"15\\\"></line><line x1=\\\"10\\\" y1=\\\"3\\\" x2=\\\"8\\\" y2=\\\"21\\\"></line><line x1=\\\"16\\\" y1=\\\"3\\\" x2=\\\"14\\\" y2=\\\"21\\\"></line></svg>\",\n share2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"18\\\" cy=\\\"5\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle><circle cx=\\\"18\\\" cy=\\\"19\\\" r=\\\"3\\\"></circle><line x1=\\\"8.59\\\" y1=\\\"13.51\\\" x2=\\\"15.42\\\" y2=\\\"17.49\\\"></line><line x1=\\\"15.41\\\" y1=\\\"6.51\\\" x2=\\\"8.59\\\" y2=\\\"10.49\\\"></line></svg>\",\n plus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"5\\\" x2=\\\"12\\\" y2=\\\"19\\\"></line><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line></svg>\",\n check: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"20 6 9 17 4 12\\\"></polyline></svg>\",\n rotateCcw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"1 4 1 10 7 10\\\"></polyline><path d=\\\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\\\"></path></svg>\",\n hardDrive: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"22\\\" y1=\\\"12\\\" x2=\\\"2\\\" y2=\\\"12\\\"></line><path d=\\\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\\\"></path><line x1=\\\"6\\\" y1=\\\"16\\\" x2=\\\"6.01\\\" y2=\\\"16\\\"></line><line x1=\\\"10\\\" y1=\\\"16\\\" x2=\\\"10.01\\\" y2=\\\"16\\\"></line></svg>\",\n bluetooth: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"6.5 6.5 17.5 17.5 12 23 12 1 17.5 6.5 6.5 17.5\\\"></polyline></svg>\",\n pieChart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21.21 15.89A10 10 0 1 1 8 2.83\\\"></path><path d=\\\"M22 12A10 10 0 0 0 12 2v10z\\\"></path></svg>\",\n headphones: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M3 18v-6a9 9 0 0 1 18 0v6\\\"></path><path d=\\\"M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z\\\"></path></svg>\",\n rss: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 11a9 9 0 0 1 9 9\\\"></path><path d=\\\"M4 4a16 16 0 0 1 16 16\\\"></path><circle cx=\\\"5\\\" cy=\\\"19\\\" r=\\\"1\\\"></circle></svg>\",\n wifi: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 12.55a11 11 0 0 1 14.08 0\\\"></path><path d=\\\"M1.42 9a16 16 0 0 1 21.16 0\\\"></path><path d=\\\"M8.53 16.11a6 6 0 0 1 6.95 0\\\"></path><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12.01\\\" y2=\\\"20\\\"></line></svg>\",\n cornerUpLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 14 4 9 9 4\\\"></polyline><path d=\\\"M20 20v-7a4 4 0 0 0-4-4H4\\\"></path></svg>\",\n watch: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"7\\\"></circle><polyline points=\\\"12 9 12 12 13.5 13.5\\\"></polyline><path d=\\\"M16.51 17.35l-.35 3.83a2 2 0 0 1-2 1.82H9.83a2 2 0 0 1-2-1.82l-.35-3.83m.01-10.7l.35-3.83A2 2 0 0 1 9.83 1h4.35a2 2 0 0 1 2 1.82l.35 3.83\\\"></path></svg>\",\n info: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12.01\\\" y2=\\\"8\\\"></line></svg>\",\n userX: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><line x1=\\\"18\\\" y1=\\\"8\\\" x2=\\\"23\\\" y2=\\\"13\\\"></line><line x1=\\\"23\\\" y1=\\\"8\\\" x2=\\\"18\\\" y2=\\\"13\\\"></line></svg>\",\n loader: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"6\\\"></line><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12\\\" y2=\\\"22\\\"></line><line x1=\\\"4.93\\\" y1=\\\"4.93\\\" x2=\\\"7.76\\\" y2=\\\"7.76\\\"></line><line x1=\\\"16.24\\\" y1=\\\"16.24\\\" x2=\\\"19.07\\\" y2=\\\"19.07\\\"></line><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"6\\\" y2=\\\"12\\\"></line><line x1=\\\"18\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><line x1=\\\"4.93\\\" y1=\\\"19.07\\\" x2=\\\"7.76\\\" y2=\\\"16.24\\\"></line><line x1=\\\"16.24\\\" y1=\\\"7.76\\\" x2=\\\"19.07\\\" y2=\\\"4.93\\\"></line></svg>\",\n refreshCcw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"1 4 1 10 7 10\\\"></polyline><polyline points=\\\"23 20 23 14 17 14\\\"></polyline><path d=\\\"M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15\\\"></path></svg>\",\n folderPlus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\\\"></path><line x1=\\\"12\\\" y1=\\\"11\\\" x2=\\\"12\\\" y2=\\\"17\\\"></line><line x1=\\\"9\\\" y1=\\\"14\\\" x2=\\\"15\\\" y2=\\\"14\\\"></line></svg>\",\n gitMerge: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"18\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><path d=\\\"M6 21V9a9 9 0 0 0 9 9\\\"></path></svg>\",\n mic: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\\\"></path><path d=\\\"M19 10v2a7 7 0 0 1-14 0v-2\\\"></path><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"8\\\" y1=\\\"23\\\" x2=\\\"16\\\" y2=\\\"23\\\"></line></svg>\",\n copy: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"13\\\" height=\\\"13\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\\\"></path></svg>\",\n zoomIn: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"></circle><line x1=\\\"21\\\" y1=\\\"21\\\" x2=\\\"16.65\\\" y2=\\\"16.65\\\"></line><line x1=\\\"11\\\" y1=\\\"8\\\" x2=\\\"11\\\" y2=\\\"14\\\"></line><line x1=\\\"8\\\" y1=\\\"11\\\" x2=\\\"14\\\" y2=\\\"11\\\"></line></svg>\",\n arrowRightCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"12 16 16 12 12 8\\\"></polyline><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n alignRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"21\\\" y1=\\\"10\\\" x2=\\\"7\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"7\\\" y2=\\\"18\\\"></line></svg>\",\n image: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><circle cx=\\\"8.5\\\" cy=\\\"8.5\\\" r=\\\"1.5\\\"></circle><polyline points=\\\"21 15 16 10 5 21\\\"></polyline></svg>\",\n maximize2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 3 21 3 21 9\\\"></polyline><polyline points=\\\"9 21 3 21 3 15\\\"></polyline><line x1=\\\"21\\\" y1=\\\"3\\\" x2=\\\"14\\\" y2=\\\"10\\\"></line><line x1=\\\"3\\\" y1=\\\"21\\\" x2=\\\"10\\\" y2=\\\"14\\\"></line></svg>\",\n checkCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 11.08V12a10 10 0 1 1-5.93-9.14\\\"></path><polyline points=\\\"22 4 12 14.01 9 11.01\\\"></polyline></svg>\",\n sunset: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 18a5 5 0 0 0-10 0\\\"></path><line x1=\\\"12\\\" y1=\\\"9\\\" x2=\\\"12\\\" y2=\\\"2\\\"></line><line x1=\\\"4.22\\\" y1=\\\"10.22\\\" x2=\\\"5.64\\\" y2=\\\"11.64\\\"></line><line x1=\\\"1\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"23\\\" y2=\\\"18\\\"></line><line x1=\\\"18.36\\\" y1=\\\"11.64\\\" x2=\\\"19.78\\\" y2=\\\"10.22\\\"></line><line x1=\\\"23\\\" y1=\\\"22\\\" x2=\\\"1\\\" y2=\\\"22\\\"></line><polyline points=\\\"16 5 12 9 8 5\\\"></polyline></svg>\",\n save: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\\\"></path><polyline points=\\\"17 21 17 13 7 13 7 21\\\"></polyline><polyline points=\\\"7 3 7 8 15 8\\\"></polyline></svg>\",\n smile: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M8 14s1.5 2 4 2 4-2 4-2\\\"></path><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"9.01\\\" y2=\\\"9\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"15.01\\\" y2=\\\"9\\\"></line></svg>\",\n navigation: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"3 11 22 2 13 21 11 13 3 11\\\"></polygon></svg>\",\n cloudLightning: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19 16.9A5 5 0 0 0 18 7h-1.26a8 8 0 1 0-11.62 9\\\"></path><polyline points=\\\"13 11 9 17 15 17 11 23\\\"></polyline></svg>\",\n paperclip: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\\\"></path></svg>\",\n fastForward: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"13 19 22 12 13 5 13 19\\\"></polygon><polygon points=\\\"2 19 11 12 2 5 2 19\\\"></polygon></svg>\",\n xSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line></svg>\",\n award: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"8\\\" r=\\\"7\\\"></circle><polyline points=\\\"8.21 13.89 7 23 12 20 17 23 15.79 13.88\\\"></polyline></svg>\",\n zoomOut: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"></circle><line x1=\\\"21\\\" y1=\\\"21\\\" x2=\\\"16.65\\\" y2=\\\"16.65\\\"></line><line x1=\\\"8\\\" y1=\\\"11\\\" x2=\\\"14\\\" y2=\\\"11\\\"></line></svg>\",\n box: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path><polyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"></polyline><line x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n thumbsUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\\\"></path></svg>\",\n percent: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"19\\\" y1=\\\"5\\\" x2=\\\"5\\\" y2=\\\"19\\\"></line><circle cx=\\\"6.5\\\" cy=\\\"6.5\\\" r=\\\"2.5\\\"></circle><circle cx=\\\"17.5\\\" cy=\\\"17.5\\\" r=\\\"2.5\\\"></circle></svg>\",\n sidebar: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"9\\\" y1=\\\"3\\\" x2=\\\"9\\\" y2=\\\"21\\\"></line></svg>\",\n square: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect></svg>\",\n play: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"5 3 19 12 5 21 5 3\\\"></polygon></svg>\",\n gitCommit: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><line x1=\\\"1.05\\\" y1=\\\"12\\\" x2=\\\"7\\\" y2=\\\"12\\\"></line><line x1=\\\"17.01\\\" y1=\\\"12\\\" x2=\\\"22.96\\\" y2=\\\"12\\\"></line></svg>\",\n table: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18\\\"></path></svg>\",\n send: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"22\\\" y1=\\\"2\\\" x2=\\\"11\\\" y2=\\\"13\\\"></line><polygon points=\\\"22 2 15 22 11 13 2 9 22 2\\\"></polygon></svg>\",\n phoneCall: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M15.05 5A5 5 0 0 1 19 8.95M15.05 1A9 9 0 0 1 23 8.94m-1 7.98v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n speaker: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"4\\\" y=\\\"2\\\" width=\\\"16\\\" height=\\\"20\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><circle cx=\\\"12\\\" cy=\\\"14\\\" r=\\\"4\\\"></circle><line x1=\\\"12\\\" y1=\\\"6\\\" x2=\\\"12.01\\\" y2=\\\"6\\\"></line></svg>\",\n facebook: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M464 0h-416c-26.4 0-48 21.6-48 48v416c0 26.4 21.6 48 48 48h208v-224h-64v-64h64v-32c0-52.9 43.1-96 96-96h64v64h-64c-17.6 0-32 14.4-32 32v32h96l-16 64h-80v224h144c26.4 0 48-21.6 48-48v-416c0-26.4-21.6-48-48-48z\\\"></path></svg> \",\n codesandbox: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path><polyline points=\\\"7.5 4.21 12 6.81 16.5 4.21\\\"></polyline><polyline points=\\\"7.5 19.79 7.5 14.6 3 12\\\"></polyline><polyline points=\\\"21 12 16.5 14.6 16.5 19.79\\\"></polyline><polyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"></polyline><line x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n camera: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\\\"></path><circle cx=\\\"12\\\" cy=\\\"13\\\" r=\\\"4\\\"></circle></svg>\",\n link2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3\\\"></path><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n printer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"6 9 6 2 18 2 18 9\\\"></polyline><path d=\\\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\\\"></path><rect x=\\\"6\\\" y=\\\"14\\\" width=\\\"12\\\" height=\\\"8\\\"></rect></svg>\",\n folderMinus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\\\"></path><line x1=\\\"9\\\" y1=\\\"14\\\" x2=\\\"15\\\" y2=\\\"14\\\"></line></svg>\",\n arrowUpRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"7\\\" y1=\\\"17\\\" x2=\\\"17\\\" y2=\\\"7\\\"></line><polyline points=\\\"7 7 17 7 17 17\\\"></polyline></svg>\",\n truck: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"3\\\" width=\\\"15\\\" height=\\\"13\\\"></rect><polygon points=\\\"16 8 20 8 23 11 23 16 16 16 16 8\\\"></polygon><circle cx=\\\"5.5\\\" cy=\\\"18.5\\\" r=\\\"2.5\\\"></circle><circle cx=\\\"18.5\\\" cy=\\\"18.5\\\" r=\\\"2.5\\\"></circle></svg>\",\n lifeBuoy: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><line x1=\\\"4.93\\\" y1=\\\"4.93\\\" x2=\\\"9.17\\\" y2=\\\"9.17\\\"></line><line x1=\\\"14.83\\\" y1=\\\"14.83\\\" x2=\\\"19.07\\\" y2=\\\"19.07\\\"></line><line x1=\\\"14.83\\\" y1=\\\"9.17\\\" x2=\\\"19.07\\\" y2=\\\"4.93\\\"></line><line x1=\\\"14.83\\\" y1=\\\"9.17\\\" x2=\\\"18.36\\\" y2=\\\"5.64\\\"></line><line x1=\\\"4.93\\\" y1=\\\"19.07\\\" x2=\\\"9.17\\\" y2=\\\"14.83\\\"></line></svg>\",\n penTool: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 19l7-7 3 3-7 7-3-3z\\\"></path><path d=\\\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\\\"></path><path d=\\\"M2 2l7.59 7.59\\\"></path><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"2\\\"></circle></svg>\",\n atSign: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><path d=\\\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94\\\"></path></svg>\",\n feather: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20.24 12.24a6 6 0 0 0-8.49-8.49L5 10.5V19h8.5z\\\"></path><line x1=\\\"16\\\" y1=\\\"8\\\" x2=\\\"2\\\" y2=\\\"22\\\"></line><line x1=\\\"17.5\\\" y1=\\\"15\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line></svg>\",\n trash: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"3 6 5 6 21 6\\\"></polyline><path d=\\\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"></path></svg>\",\n wifiOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line><path d=\\\"M16.72 11.06A10.94 10.94 0 0 1 19 12.55\\\"></path><path d=\\\"M5 12.55a10.94 10.94 0 0 1 5.17-2.39\\\"></path><path d=\\\"M10.71 5.05A16 16 0 0 1 22.58 9\\\"></path><path d=\\\"M1.42 9a15.91 15.91 0 0 1 4.7-2.88\\\"></path><path d=\\\"M8.53 16.11a6 6 0 0 1 6.95 0\\\"></path><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12.01\\\" y2=\\\"20\\\"></line></svg>\",\n cornerLeftDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"14 15 9 20 4 15\\\"></polyline><path d=\\\"M20 4h-7a4 4 0 0 0-4 4v12\\\"></path></svg>\",\n dollarSign: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"1\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><path d=\\\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\\\"></path></svg>\",\n star: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\\\"></polygon></svg>\",\n cloudOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22.61 16.95A5 5 0 0 0 18 10h-1.26a8 8 0 0 0-7.05-6M5 5a8 8 0 0 0 4 15h9a5 5 0 0 0 1.7-.3\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n sun: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"5\\\"></circle><line x1=\\\"12\\\" y1=\\\"1\\\" x2=\\\"12\\\" y2=\\\"3\\\"></line><line x1=\\\"12\\\" y1=\\\"21\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"4.22\\\" y1=\\\"4.22\\\" x2=\\\"5.64\\\" y2=\\\"5.64\\\"></line><line x1=\\\"18.36\\\" y1=\\\"18.36\\\" x2=\\\"19.78\\\" y2=\\\"19.78\\\"></line><line x1=\\\"1\\\" y1=\\\"12\\\" x2=\\\"3\\\" y2=\\\"12\\\"></line><line x1=\\\"21\\\" y1=\\\"12\\\" x2=\\\"23\\\" y2=\\\"12\\\"></line><line x1=\\\"4.22\\\" y1=\\\"19.78\\\" x2=\\\"5.64\\\" y2=\\\"18.36\\\"></line><line x1=\\\"18.36\\\" y1=\\\"5.64\\\" x2=\\\"19.78\\\" y2=\\\"4.22\\\"></line></svg>\",\n messageSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\\\"></path></svg>\",\n edit: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\\\"></path><path d=\\\"M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\\\"></path></svg>\",\n anchor: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"5\\\" r=\\\"3\\\"></circle><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line><path d=\\\"M5 12H2a10 10 0 0 0 20 0h-3\\\"></path></svg>\",\n alertCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12.01\\\" y2=\\\"16\\\"></line></svg>\",\n chevronsUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"17 11 12 6 7 11\\\"></polyline><polyline points=\\\"17 18 12 13 7 18\\\"></polyline></svg>\",\n uploadCloud: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 16 12 12 8 16\\\"></polyline><line x1=\\\"12\\\" y1=\\\"12\\\" x2=\\\"12\\\" y2=\\\"21\\\"></line><path d=\\\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\\\"></path><polyline points=\\\"16 16 12 12 8 16\\\"></polyline></svg>\",\n twitch: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7\\\"></path></svg>\",\n youtube: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M506.9 153.6c0 0-5-35.3-20.4-50.8-19.5-20.4-41.3-20.5-51.3-21.7-71.6-5.2-179.1-5.2-179.1-5.2h-0.2c0 0-107.5 0-179.1 5.2-10 1.2-31.8 1.3-51.3 21.7-15.4 15.5-20.3 50.8-20.3 50.8s-5.1 41.4-5.1 82.9v38.8c0 41.4 5.1 82.9 5.1 82.9s5 35.3 20.3 50.8c19.5 20.4 45.1 19.7 56.5 21.9 41 3.9 174.1 5.1 174.1 5.1s107.6-0.2 179.2-5.3c10-1.2 31.8-1.3 51.3-21.7 15.4-15.5 20.4-50.8 20.4-50.8s5.1-41.4 5.1-82.9v-38.8c-0.1-41.4-5.2-82.9-5.2-82.9zM203.1 322.4v-143.9l138.3 72.2-138.3 71.7z\\\"></path></svg> \",\n unlock: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"11\\\" width=\\\"18\\\" height=\\\"11\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M7 11V7a5 5 0 0 1 9.9-1\\\"></path></svg>\",\n compass: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polygon points=\\\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\\\"></polygon></svg>\",\n plusCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n creditCard: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"4\\\" width=\\\"22\\\" height=\\\"16\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"1\\\" y1=\\\"10\\\" x2=\\\"23\\\" y2=\\\"10\\\"></line></svg>\",\n cloudRain: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"16\\\" y1=\\\"13\\\" x2=\\\"16\\\" y2=\\\"21\\\"></line><line x1=\\\"8\\\" y1=\\\"13\\\" x2=\\\"8\\\" y2=\\\"21\\\"></line><line x1=\\\"12\\\" y1=\\\"15\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><path d=\\\"M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25\\\"></path></svg>\",\n trash2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"3 6 5 6 21 6\\\"></polyline><path d=\\\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"></path><line x1=\\\"10\\\" y1=\\\"11\\\" x2=\\\"10\\\" y2=\\\"17\\\"></line><line x1=\\\"14\\\" y1=\\\"11\\\" x2=\\\"14\\\" y2=\\\"17\\\"></line></svg>\",\n skipBack: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"19 20 9 12 19 4 19 20\\\"></polygon><line x1=\\\"5\\\" y1=\\\"19\\\" x2=\\\"5\\\" y2=\\\"5\\\"></line></svg>\",\n filePlus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\\\"></path><polyline points=\\\"14 2 14 8 20 8\\\"></polyline><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"9\\\" y1=\\\"15\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n delete: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 4H8l-7 8 7 8h13a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z\\\"></path><line x1=\\\"18\\\" y1=\\\"9\\\" x2=\\\"12\\\" y2=\\\"15\\\"></line><line x1=\\\"12\\\" y1=\\\"9\\\" x2=\\\"18\\\" y2=\\\"15\\\"></line></svg>\",\n command: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z\\\"></path></svg>\",\n clock: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"12 6 12 12 16 14\\\"></polyline></svg>\",\n octagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\\\"></polygon></svg>\",\n phone: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n eye: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\\\"></path><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n phoneOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10.68 13.31a16 16 0 0 0 3.41 2.6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7 2 2 0 0 1 1.72 2v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.42 19.42 0 0 1-3.33-2.67m-2.67-3.34a19.79 19.79 0 0 1-3.07-8.63A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91\\\"></path><line x1=\\\"23\\\" y1=\\\"1\\\" x2=\\\"1\\\" y2=\\\"23\\\"></line></svg>\",\n codepen: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2\\\"></polygon><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"15.5\\\"></line><polyline points=\\\"22 8.5 12 15.5 2 8.5\\\"></polyline><polyline points=\\\"2 15.5 12 8.5 22 15.5\\\"></polyline><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"8.5\\\"></line></svg>\",\n dribbble: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M8.56 2.75c4.37 6.03 6.02 9.42 8.03 17.72m2.54-15.38c-3.72 4.35-8.94 5.66-16.88 5.85m19.5 1.9c-3.5-.93-6.63-.82-8.94 0-2.58.92-5.01 2.86-7.44 6.32\\\"></path></svg>\",\n gift: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"20 12 20 22 4 22 4 12\\\"></polyline><rect x=\\\"2\\\" y=\\\"7\\\" width=\\\"20\\\" height=\\\"5\\\"></rect><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"7\\\"></line><path d=\\\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\\\"></path><path d=\\\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\\\"></path></svg>\",\n externalLink: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"></path><polyline points=\\\"15 3 21 3 21 9\\\"></polyline><line x1=\\\"10\\\" y1=\\\"14\\\" x2=\\\"21\\\" y2=\\\"3\\\"></line></svg>\",\n zap: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\\\"></polygon></svg>\",\n trello: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><rect x=\\\"7\\\" y=\\\"7\\\" width=\\\"3\\\" height=\\\"9\\\"></rect><rect x=\\\"14\\\" y=\\\"7\\\" width=\\\"3\\\" height=\\\"5\\\"></rect></svg>\",\n moreVertical: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle><circle cx=\\\"12\\\" cy=\\\"5\\\" r=\\\"1\\\"></circle><circle cx=\\\"12\\\" cy=\\\"19\\\" r=\\\"1\\\"></circle></svg>\",\n micOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line><path d=\\\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\\\"></path><path d=\\\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\\\"></path><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"8\\\" y1=\\\"23\\\" x2=\\\"16\\\" y2=\\\"23\\\"></line></svg>\",\n share: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\\\"></path><polyline points=\\\"16 6 12 2 8 6\\\"></polyline><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"15\\\"></line></svg>\",\n arrowUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"12\\\" y2=\\\"5\\\"></line><polyline points=\\\"5 12 12 5 19 12\\\"></polyline></svg>\",\n bellOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M13.73 21a2 2 0 0 1-3.46 0\\\"></path><path d=\\\"M18.63 13A17.89 17.89 0 0 1 18 8\\\"></path><path d=\\\"M6.26 6.26A5.86 5.86 0 0 0 6 8c0 7-3 9-3 9h14\\\"></path><path d=\\\"M18 8a6 6 0 0 0-9.33-5\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n linkedin: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z\\\"></path><rect x=\\\"2\\\" y=\\\"9\\\" width=\\\"4\\\" height=\\\"12\\\"></rect><circle cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle></svg>\",\n video: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"23 7 16 12 23 17 23 7\\\"></polygon><rect x=\\\"1\\\" y=\\\"5\\\" width=\\\"15\\\" height=\\\"14\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect></svg>\",\n divideCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle></svg>\",\n activity: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"22 12 18 12 15 21 9 3 6 12 2 12\\\"></polyline></svg>\",\n twitter: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z\\\"></path></svg>\",\n mapPin: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\\\"></path><circle cx=\\\"12\\\" cy=\\\"10\\\" r=\\\"3\\\"></circle></svg>\",\n filter: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\\\"></polygon></svg>\",\n phoneIncoming: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 2 16 8 22 8\\\"></polyline><line x1=\\\"23\\\" y1=\\\"1\\\" x2=\\\"16\\\" y2=\\\"8\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n italic: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"19\\\" y1=\\\"4\\\" x2=\\\"10\\\" y2=\\\"4\\\"></line><line x1=\\\"14\\\" y1=\\\"20\\\" x2=\\\"5\\\" y2=\\\"20\\\"></line><line x1=\\\"15\\\" y1=\\\"4\\\" x2=\\\"9\\\" y2=\\\"20\\\"></line></svg>\",\n chevronsLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"11 17 6 12 11 7\\\"></polyline><polyline points=\\\"18 17 13 12 18 7\\\"></polyline></svg>\",\n calendar: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"16\\\" y1=\\\"2\\\" x2=\\\"16\\\" y2=\\\"6\\\"></line><line x1=\\\"8\\\" y1=\\\"2\\\" x2=\\\"8\\\" y2=\\\"6\\\"></line><line x1=\\\"3\\\" y1=\\\"10\\\" x2=\\\"21\\\" y2=\\\"10\\\"></line></svg>\",\n globe: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><path d=\\\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\\\"></path></svg>\",\n arrowLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"19\\\" y1=\\\"12\\\" x2=\\\"5\\\" y2=\\\"12\\\"></line><polyline points=\\\"12 19 5 12 12 5\\\"></polyline></svg>\",\n alignCenter: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"18\\\" y1=\\\"10\\\" x2=\\\"6\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"18\\\" y1=\\\"18\\\" x2=\\\"6\\\" y2=\\\"18\\\"></line></svg>\",\n minusCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n arrowDownRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"7\\\" y1=\\\"7\\\" x2=\\\"17\\\" y2=\\\"17\\\"></line><polyline points=\\\"17 7 17 17 7 17\\\"></polyline></svg>\",\n framer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 16V9h14V2H5l14 14h-7m-7 0l7 7v-7m-7 0h7\\\"></path></svg>\",\n volumeX: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon><line x1=\\\"23\\\" y1=\\\"9\\\" x2=\\\"17\\\" y2=\\\"15\\\"></line><line x1=\\\"17\\\" y1=\\\"9\\\" x2=\\\"23\\\" y2=\\\"15\\\"></line></svg>\",\n slack: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14.5 10c-.83 0-1.5-.67-1.5-1.5v-5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5z\\\"></path><path d=\\\"M20.5 10H19V8.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\\\"></path><path d=\\\"M9.5 14c.83 0 1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5S8 21.33 8 20.5v-5c0-.83.67-1.5 1.5-1.5z\\\"></path><path d=\\\"M3.5 14H5v1.5c0 .83-.67 1.5-1.5 1.5S2 16.33 2 15.5 2.67 14 3.5 14z\\\"></path><path d=\\\"M14 14.5c0-.83.67-1.5 1.5-1.5h5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-5c-.83 0-1.5-.67-1.5-1.5z\\\"></path><path d=\\\"M15.5 19H14v1.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\\\"></path><path d=\\\"M10 9.5C10 8.67 9.33 8 8.5 8h-5C2.67 8 2 8.67 2 9.5S2.67 11 3.5 11h5c.83 0 1.5-.67 1.5-1.5z\\\"></path><path d=\\\"M8.5 5H10V3.5C10 2.67 9.33 2 8.5 2S7 2.67 7 3.5 7.67 5 8.5 5z\\\"></path></svg>\",\n cloud: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z\\\"></path></svg>\",\n downloadCloud: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"8 17 12 21 16 17\\\"></polyline><line x1=\\\"12\\\" y1=\\\"12\\\" x2=\\\"12\\\" y2=\\\"21\\\"></line><path d=\\\"M20.88 18.09A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.29\\\"></path></svg>\",\n shuffle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 3 21 3 21 8\\\"></polyline><line x1=\\\"4\\\" y1=\\\"20\\\" x2=\\\"21\\\" y2=\\\"3\\\"></line><polyline points=\\\"21 16 21 21 16 21\\\"></polyline><line x1=\\\"15\\\" y1=\\\"15\\\" x2=\\\"21\\\" y2=\\\"21\\\"></line><line x1=\\\"4\\\" y1=\\\"4\\\" x2=\\\"9\\\" y2=\\\"9\\\"></line></svg>\",\n rewind: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 19 2 12 11 5 11 19\\\"></polygon><polygon points=\\\"22 19 13 12 22 5 22 19\\\"></polygon></svg>\",\n upload: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"></path><polyline points=\\\"17 8 12 3 7 8\\\"></polyline><line x1=\\\"12\\\" y1=\\\"3\\\" x2=\\\"12\\\" y2=\\\"15\\\"></line></svg>\",\n trendingDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 18 13.5 8.5 8.5 13.5 1 6\\\"></polyline><polyline points=\\\"17 18 23 18 23 12\\\"></polyline></svg>\",\n pause: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"6\\\" y=\\\"4\\\" width=\\\"4\\\" height=\\\"16\\\"></rect><rect x=\\\"14\\\" y=\\\"4\\\" width=\\\"4\\\" height=\\\"16\\\"></rect></svg>\",\n arrowDownCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"8 12 12 16 16 12\\\"></polyline><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line></svg>\",\n bookmark: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\\\"></path></svg>\",\n alertTriangle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\\\"></path><line x1=\\\"12\\\" y1=\\\"9\\\" x2=\\\"12\\\" y2=\\\"13\\\"></line><line x1=\\\"12\\\" y1=\\\"17\\\" x2=\\\"12.01\\\" y2=\\\"17\\\"></line></svg>\",\n userCheck: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><polyline points=\\\"17 11 19 13 23 9\\\"></polyline></svg>\",\n tablet: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"4\\\" y=\\\"2\\\" width=\\\"16\\\" height=\\\"20\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12.01\\\" y2=\\\"18\\\"></line></svg>\",\n alertOctagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\\\"></polygon><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12.01\\\" y2=\\\"16\\\"></line></svg>\",\n menu: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"3\\\" y1=\\\"12\\\" x2=\\\"21\\\" y2=\\\"12\\\"></line><line x1=\\\"3\\\" y1=\\\"6\\\" x2=\\\"21\\\" y2=\\\"6\\\"></line><line x1=\\\"3\\\" y1=\\\"18\\\" x2=\\\"21\\\" y2=\\\"18\\\"></line></svg>\",\n chrome: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><line x1=\\\"21.17\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line><line x1=\\\"3.95\\\" y1=\\\"6.06\\\" x2=\\\"8.54\\\" y2=\\\"14\\\"></line><line x1=\\\"10.88\\\" y1=\\\"21.94\\\" x2=\\\"15.46\\\" y2=\\\"14\\\"></line></svg>\",\n shoppingCart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"9\\\" cy=\\\"21\\\" r=\\\"1\\\"></circle><circle cx=\\\"20\\\" cy=\\\"21\\\" r=\\\"1\\\"></circle><path d=\\\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\\\"></path></svg>\",\n folder: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\\\"></path></svg>\",\n users: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"9\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><path d=\\\"M23 21v-2a4 4 0 0 0-3-3.87\\\"></path><path d=\\\"M16 3.13a4 4 0 0 1 0 7.75\\\"></path></svg>\",\n cornerDownLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 10 4 15 9 20\\\"></polyline><path d=\\\"M20 4v7a4 4 0 0 1-4 4H4\\\"></path></svg>\",\n monitor: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"3\\\" width=\\\"20\\\" height=\\\"14\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"8\\\" y1=\\\"21\\\" x2=\\\"16\\\" y2=\\\"21\\\"></line><line x1=\\\"12\\\" y1=\\\"17\\\" x2=\\\"12\\\" y2=\\\"21\\\"></line></svg>\",\n minus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line></svg>\",\n helpCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\\\"></path><line x1=\\\"12\\\" y1=\\\"17\\\" x2=\\\"12.01\\\" y2=\\\"17\\\"></line></svg>\",\n navigation2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 19 21 12 17 5 21 12 2\\\"></polygon></svg>\",\n chevronLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 18 9 12 15 6\\\"></polyline></svg>\",\n film: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"20\\\" height=\\\"20\\\" rx=\\\"2.18\\\" ry=\\\"2.18\\\"></rect><line x1=\\\"7\\\" y1=\\\"2\\\" x2=\\\"7\\\" y2=\\\"22\\\"></line><line x1=\\\"17\\\" y1=\\\"2\\\" x2=\\\"17\\\" y2=\\\"22\\\"></line><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><line x1=\\\"2\\\" y1=\\\"7\\\" x2=\\\"7\\\" y2=\\\"7\\\"></line><line x1=\\\"2\\\" y1=\\\"17\\\" x2=\\\"7\\\" y2=\\\"17\\\"></line><line x1=\\\"17\\\" y1=\\\"17\\\" x2=\\\"22\\\" y2=\\\"17\\\"></line><line x1=\\\"17\\\" y1=\\\"7\\\" x2=\\\"22\\\" y2=\\\"7\\\"></line></svg>\",\n moon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\\\"></path></svg>\",\n shieldOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19.69 14a6.9 6.9 0 0 0 .31-2V5l-8-3-3.16 1.18\\\"></path><path d=\\\"M4.73 4.73L4 5v7c0 6 8 10 8 10a20.29 20.29 0 0 0 5.62-4.38\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n layout: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"3\\\" y1=\\\"9\\\" x2=\\\"21\\\" y2=\\\"9\\\"></line><line x1=\\\"9\\\" y1=\\\"21\\\" x2=\\\"9\\\" y2=\\\"9\\\"></line></svg>\",\n mousePointer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\\\"></path><path d=\\\"M13 13l6 6\\\"></path></svg>\",\n alignLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"17\\\" y1=\\\"10\\\" x2=\\\"3\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"17\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line></svg>\",\n heart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\\\"></path></svg>\",\n trendingUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 6 13.5 15.5 8.5 10.5 1 18\\\"></polyline><polyline points=\\\"17 6 23 6 23 12\\\"></polyline></svg>\",\n fontBold: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M13.5,11 C15.71,11,17.5,12.68,17.5,14.75 C17.5,16.82,15.71,18.5,13.5,18.5 C13.5,18.5,8.5,18.5,8.5,18.5 C8.5,18.5,8.5,3.5,8.5,3.5 C8.5,3.5,13.5,3.5,13.5,3.5 C15.71,3.5,17.5,5.18,17.5,7.25 C17.5,9.32,15.71,11,13.5,11 C13.5,11,13.5,11,13.5,11 z\\\"/><path style=\\\"\\\" d=\\\"M13.5,11 C13.5,11,8.5,11,8.5,11\\\"/><path style=\\\"\\\" d=\\\"M12.5,11 C14.71,11,16.5,12.68,16.5,14.75 C16.5,16.82,14.71,18.5,12.5,18.5 C12.5,18.5,7.5,18.5,7.5,18.5 C7.5,18.5,7.5,3.5,7.5,3.5 C7.5,3.5,12.5,3.5,12.5,3.5 C14.71,3.5,16.5,5.18,16.5,7.25 C16.5,9.32,14.71,11,12.5,11 C12.5,11,12.5,11,12.5,11 z\\\"/><path style=\\\"\\\" d=\\\"M12.5,11 C12.5,11,7.5,11,7.5,11\\\"/></g></svg> \",\n fontItalic: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M17.00,4.50 C17.00,4.50,13.00,4.50,13.00,4.50\\\"/><path style=\\\"\\\" d=\\\"M11.00,19.50 C11.00,19.50,7.00,19.50,7.00,19.50\\\"/><path style=\\\"\\\" d=\\\"M15.00,4.50 C15.00,4.50,9.00,19.50,9.00,19.50\\\"/></g></svg> \",\n fontUnderline: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M7.5,3.5 C7.5,3.5,7.5,10.74,7.5,13.5 C7.5,16.26,9.74,18.5,12.5,18.5 C15.26,18.5,17.5,16.26,17.5,13.5 C17.5,10.74,17.5,3.5,17.5,3.5\\\"/><path style=\\\"\\\" d=\\\"M7.5,21.5 C7.5,21.5,17.5,21.5,17.5,21.5\\\"/></g></svg> \",\n resize: \"<svg class=\\\"stroked\\\" version=\\\"1.1\\\" viewBox=\\\"0, 0, 24, 24\\\"><g><path d=\\\"M9,3 L3,3 L3,9\\\"/><path d=\\\"M15,21 L21,21 L21,15\\\"/><path d=\\\"M3,3 L10,10\\\"/><path d=\\\"M21,21 L14,14\\\"/></g></svg> \",\n bug: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M8,6 C8,3.79,9.79,2,12,2 C14.21,2,16,3.79,16,6 C16,6,8,6,8,6 z\\\"/><path style=\\\"\\\" d=\\\"M20,7 C20,7,18,9,18,9\\\"/><path style=\\\"\\\" d=\\\"M20,19 C20,19,18,17,18,17\\\"/><path style=\\\"\\\" d=\\\"M21,13 C21,13,18,13,18,13\\\"/><path style=\\\"\\\" d=\\\"M16.44,9 C17.30,9,18.00,9.70,18.00,10.56 C18.00,10.56,18.00,15.00,18.00,15.00 C18.00,18.31,15.31,21,12,21 C8.69,21,6,18.31,6,15.00 C6,15.00,6,10.56,6,10.56 C6,9.70,6.70,9,7.56,9 C7.56,9,16.44,9,16.44,9 z\\\"/><path style=\\\"\\\" d=\\\"M4,7 C4,7,6,9,6,9\\\"/><path style=\\\"\\\" d=\\\"M4,19 C4,19,6,17,6,17\\\"/><path style=\\\"\\\" d=\\\"M3,13 C3,13,6,13,6,13\\\"/><path style=\\\"\\\" d=\\\"M12,12 C12,12,12,17,12,17\\\"/></g></svg> \",\n blog: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M21,10.02 C21,10.02,21,15,21,15 C21,15.53,20.79,16.04,20.41,16.41 C20.04,16.79,19.53,17,19,17 C19,17,7,17,7,17 C5.67,18.33,4.33,19.67,3,21 C3,21,3,5,3,5 C3,4.47,3.21,3.96,3.59,3.59 C3.96,3.21,4.47,3,5,3 C8.53,3,10.49,3,14.02,3\\\"/><path style=\\\"\\\" d=\\\"M19,2 C19.54,1.46,20.32,1.25,21.05,1.45 C21.78,1.65,22.35,2.22,22.55,2.95 C22.75,3.68,22.54,4.46,22,5 C22,5,15.5,11.5,15.5,11.5 C14.17,11.83,12.83,12.17,11.5,12.5 C11.83,11.17,12.17,9.83,12.5,8.5 C15.67,5.33,15.83,5.17,19,2 z\\\"/><path style=\\\"\\\" d=\\\"M14.60,3\\\"/><path style=\\\"\\\" d=\\\"M21,8.77\\\"/><path style=\\\"\\\" d=\\\"M7,7 C7,7,10,7,10,7\\\"/><path style=\\\"\\\" d=\\\"M7,10 C7,10,9,10,9,10\\\"/></g></svg> \",\n sortAscending: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path d=\\\"M16.5,10.5 C16.5,10.5,7.5,10.5,7.5,10.5\\\"/><path d=\\\"M14.5,6.5 C14.5,6.5,9.5,6.5,9.5,6.5\\\"/><path d=\\\"M18.5,14.5 C18.5,14.5,5.5,14.5,5.5,14.5\\\"/><path d=\\\"M20.5,18.5 C20.5,18.5,3.5,18.5,3.5,18.5\\\"/></g></svg> \",\n npm: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M0 0v512h512v-512h-512zM416 416h-64v-256h-96v256h-160v-320h320v320z\\\"></path></svg> \",\n game: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 704 512\\\"><g></g><path d=\\\"M528 96.79v-0.79h-336c-88.36 0-160 71.64-160 160s71.64 160 160 160c52.34 0 98.82-25.14 128.01-64h63.98c29.19 38.86 75.66 64 128.01 64 88.37 0 160-71.63 160-160 0-82.97-63.15-151.18-144-159.21zM288 288h-64v64h-64v-64h-64v-64h64v-64h64v64h64v64zM480 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zM576 288c-17.67 0-32-14.33-32-32 0-17.67 14.33-32 32-32s32 14.33 32 32c0 17.67-14.33 32-32 32z\\\"></path></svg> \",\n google: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M256 0c-141.4 0-256 114.6-256 256s114.6 256 256 256 256-114.6 256-256-114.6-256-256-256zM259.8 448c-106.1 0-192-85.9-192-192s85.9-192 192-192c51.8 0 95.2 18.9 128.6 50.2l-52.1 50.2c-14.3-13.7-39.2-29.6-76.5-29.6-65.6 0-119 54.3-119 121.2s53.5 121.2 119 121.2c76 0 104.5-54.6 108.9-82.8h-108.9v-65.8h181.3c1.6 9.6 3 19.2 3 31.8 0.1 109.7-73.4 187.6-184.3 187.6z\\\"></path></svg> \",\n discord: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 1013 768\\\"><g></g><path d=\\\"M858.38 64.32c-60.41-28.44-130.58-50.8-204.05-63.60l-5.01-0.72c-8.35 14.47-17.31 32.35-25.34 50.74l-1.44 3.7c-34.87-5.53-75.06-8.69-116.00-8.69s-81.14 3.16-120.37 9.25l4.37-0.56c-9.48-22.09-18.44-39.97-28.27-57.29l1.49 2.86c-78.56 13.64-148.78 36.05-214.41 66.65l5.19-2.17c-132.30 195.75-168.17 386.63-150.24 574.80v0c73.25 54.65 158.46 98.55 250.43 127.12l5.97 1.60c19.28-25.64 37.51-54.63 53.29-85.10l1.63-3.45c-33.48-12.62-61.98-26.51-88.96-42.66l2.48 1.38c7.25-5.26 14.35-10.68 21.2-15.94 75.07 36.14 163.23 57.26 256.32 57.26s181.25-21.12 259.94-58.83l-3.62 1.56c6.93 5.66 14.03 11.08 21.2 15.94-24.54 14.80-53.09 28.72-82.88 40.10l-3.75 1.26c17.37 33.87 35.61 62.84 56.05 90.05l-1.14-1.58c98.00-30.05 183.28-73.93 258.78-130.22l-2.22 1.58c21.04-218.22-35.95-407.35-150.63-575.04zM338.33 523.56c-49.97 0-91.26-45.35-91.26-101.14s39.85-101.54 91.10-101.54 92.21 45.75 91.34 101.54-40.25 101.14-91.18 101.14zM674.99 523.56c-50.05 0-91.18-45.35-91.18-101.14s39.85-101.54 91.18-101.54 91.97 45.75 91.10 101.54-40.17 101.14-91.10 101.14z\\\"></path></svg> \"\n}\n",
10
- "/*#\n# lottie / bodymovin\n\nA [lottie](https://airbnb.io/lottie/#/web) (a.k.a. **bodymovin**) player.\n\nIt's designed to work like an `<img>` element (just set its `src` attribute).\n\n```js\nconst { icons, popFloat } = tosijsui\nconst { div, label, input, select, option, span } = tosijs.elements\n\nconst rocket = preview.querySelector('xin-lottie')\nsetTimeout(\n () => {\n preview.append(\n popFloat({\n content: [\n { class: 'panel', drag: true },\n div({ class: 'panel-header' }, 'Player Controls' ),\n label(\n { class: 'no-drag' },\n 'speed',\n input({ type: 'range', min: -1, max: 1, step: 0.1, value: 0, onInput(event) {\n const speed = Math.pow(5, Number(event.target.value))\n rocket.animation.setSpeed(speed)\n event.target.nextSibling.textContent = (speed * 100).toFixed(0) + '%'\n } }),\n span('100%', {style: { textAlign: 'right', width: '40px'}})\n ),\n label(\n { class: 'no-drag' },\n 'direction',\n select(\n option('Forwards', {value: 1, selected: true}),\n option('Backwards', {value: -1}),\n {\n onChange(event) {\n rocket.animation.setDirection(event.target.value)\n }\n }\n ),\n icons.chevronDown(),\n )\n ],\n target: rocket,\n position: 's'\n })\n )\n },\n 500\n)\n```\n```html\n<xin-lottie\n style=\"height: 100%; max-width: 100%\"\n src=\"88140-rocket-livetrade.json\"\n></xin-lottie>\n<div class=\"caption\">\n Animation by <a target=\"_blank\" href=\"https://lottiefiles.com/dvskjbicfc\">chiến lê hồng</a>\n</div>\n```\n```css\n.preview {\n padding: var(--spacing);\n text-align: center;\n}\n\n.preview .panel {\n padding: 10px;\n border-radius: 5px;\n gap: 5px;\n background: white;\n box-shadow: 0 2px 8px rgba(0,0,0,0.25);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.preview .caption {\n position: absolute;\n right: 5px;\n bottom: 5px;\n}\n\n.preview .panel-header {\n margin: 0;\n text-align: center;\n font-weight: bold;\n background: var(--brand-color);\n color: white;\n padding: 5px;\n margin: -10px -10px 0 -10px;\n cursor: move;\n}\n```\n\nYou can also directly set its `json` property to the content of a `lottie.json` file.\n\nAnd of course just access the element's `animation` property to [use the bodymovin API](https://airbnb.io/lottie/#/web).\n\nAlso see the [documentation for advanced interactions](https://lottiefiles.github.io/lottie-docs/advanced_interactions/)\n*/\n\nimport { Component as WebComponent, ElementCreator } from 'tosijs'\nimport { scriptTag } from './via-tag'\n\nexport interface LottieConfig {\n container?: HTMLElement | ShadowRoot\n renderer: 'svg' | 'canvas' | 'html'\n loop: boolean\n autoplay: boolean\n animationData?: string\n path?: string\n [key: string]: any\n}\n\nexport class BodymovinPlayer extends WebComponent {\n content = null\n src = ''\n json = ''\n config: LottieConfig = {\n renderer: 'svg',\n loop: true,\n autoplay: true,\n }\n\n static bodymovinAvailable?: Promise<any>\n\n animation: any\n\n static styleSpec = {\n ':host': {\n width: 400,\n height: 400,\n display: 'inline-block',\n },\n }\n\n private _loading = false\n\n get loading(): boolean {\n return this._loading\n }\n\n constructor() {\n super()\n this.initAttributes('src', 'json')\n if (BodymovinPlayer.bodymovinAvailable === undefined) {\n BodymovinPlayer.bodymovinAvailable = scriptTag(\n 'https://cdnjs.cloudflare.com/ajax/libs/bodymovin/5.12.2/lottie.min.js',\n 'bodymovin'\n )\n }\n }\n\n private readonly doneLoading = (): void => {\n this._loading = false\n }\n\n private readonly load = ({ bodymovin }: { bodymovin: any }): void => {\n this._loading = true\n\n this.config.container =\n this.shadowRoot !== null ? this.shadowRoot : undefined\n if (this.json !== '') {\n this.config.animationData = this.json\n delete this.config.path\n } else if (this.src !== '') {\n delete this.config.animationData\n this.config.path = this.src\n } else {\n console.log(\n '%c<xin-lottie>%c expected either %cjson%c (animation data) or %csrc% c(url) but found neither.',\n 'color: #44f; background: #fff; padding: 0 5px',\n 'color: default',\n 'color: #44f; background: #fff; padding: 0 5px',\n 'color: default',\n 'color: #44f; background: #fff; padding: 0 5px',\n 'color: default'\n )\n }\n\n if (this.animation) {\n this.animation.destroy()\n const root = this.shadowRoot\n if (root !== null) {\n root.querySelector('svg')?.remove()\n }\n }\n this.animation = bodymovin.loadAnimation(this.config)\n this.animation.addEventListener('DOMLoaded', this.doneLoading)\n }\n\n render(): void {\n super.render()\n\n BodymovinPlayer.bodymovinAvailable!.then(this.load).catch(\n (e: string): void => {\n console.error(e)\n }\n )\n }\n}\n\nexport const bodymovinPlayer = BodymovinPlayer.elementCreator({\n tag: 'xin-lottie',\n}) as ElementCreator<BodymovinPlayer>\n",
5
+ "/*#\n# ab-test\n\n`<xin-ab>` provides a simple method for implementing A|B-testing.\n\n```js\nimport { AbTest } from 'tosijs-ui'\n\nfunction randomize() {\n const conditions = {\n testA: Math.random() < 0.5,\n testB: Math.random() < 0.5,\n testC: Math.random() < 0.5\n }\n\n AbTest.conditions = conditions\n\n preview.querySelector('pre').innerText = JSON.stringify(conditions, null, 2)\n}\n\npreview.querySelector('.randomize-conditions').addEventListener('click', randomize)\n\nrandomize()\n```\n```html\n<div style=\"display: flex; gap: 10px; align-items: center;\">\n <div style=\"display: flex; flex-direction: column; gap: 10px;\">\n <xin-ab class=\"a\" condition=\"testA\">\n <p>testA</p>\n </xin-ab>\n <xin-ab class=\"not-a\" not condition=\"testA\">\n <p>not testA</p>\n </xin-ab>\n <xin-ab class=\"b\" condition=\"testB\">\n <p>testB</p>\n </xin-ab>\n <xin-ab class=\"not-b\" not condition=\"testB\">\n <p>not testB</p>\n </xin-ab>\n <xin-ab class=\"c\" condition=\"testC\">\n <p>testC</p>\n </xin-ab>\n <xin-ab class=\"not-c\" not condition=\"testC\">\n <p>not testC</p>\n </xin-ab>\n </div>\n <pre>\n </pre>\n</div>\n<button class=\"randomize-conditions\">Randomize</button>\n```\n```css\n.preview {\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: flex-start;\n}\n.preview p {\n background: #44c;\n color: white;\n display: block;\n border-radius: 99px;\n padding: 4px 10px;\n margin: 0;\n}\n\n.preview xin-ab[not] p {\n background: red;\n}\n```\n\n- Set `AbTest.conditions` to anything you like.\n- Use `<xin-ab>` elements to display conditional content.\n- `condition` attribute determines which value in `AbTest.conditions` controls the element\n- `not` reverses the condition (so `<xin-ab not condition=\"foo\">` will be visible if `conditions.foo` is `false`)\n*/\n\nimport { Component } from 'tosijs'\n\nconst abTestConditions = {} as { [key: string]: any }\n\nexport class AbTest extends Component {\n static set conditions(context: { [key: string]: any }) {\n Object.assign(abTestConditions, context)\n\n for (const abTest of [...AbTest.instances]) {\n abTest.queueRender()\n }\n }\n\n condition = ''\n\n not = false\n\n static instances: Set<AbTest> = new Set()\n\n constructor() {\n super()\n this.initAttributes('condition', 'not')\n }\n\n connectedCallback() {\n super.connectedCallback()\n AbTest.instances.add(this)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n AbTest.instances.delete(this)\n }\n\n render(): void {\n if (\n this.condition !== '' &&\n (this.not\n ? (abTestConditions[this.condition]) !== true\n : (abTestConditions[this.condition]) === true)\n ) {\n this.toggleAttribute('hidden', false)\n } else {\n this.toggleAttribute('hidden', true)\n }\n }\n}\n\nexport const abTest = AbTest.elementCreator({ tag: 'xin-ab' })\n",
6
+ "/*#\n# 3d\n\nA [babylonjs](https://www.babylonjs.com/) wrapper.\n\nA `<xin-3d>` element is initialized with an `engine`, `canvas`, `scene`, and an update-loop.\n\nIf you view this example with an XR-enabled device, such as the\n[Meta Quest 3](https://www.meta.com/quest/quest-3/), then you should be able to view this\nas an AR scene.\n\n```js\nimport { b3d, gamepadText, xrControllers, xrControllersText } from 'tosijs-ui'\n\npreview.append(b3d({\n async sceneCreated(element, BABYLON) {\n const camera = new BABYLON.FreeCamera(\n 'camera',\n new BABYLON.Vector3(0, 1, -4),\n element.scene\n )\n camera.attachControl(element.parts.canvas, true)\n\n new BABYLON.HemisphericLight('light', new BABYLON.Vector3(0.25, 1, -0.5))\n\n this.loadScene('/', 'xin3d.glb')\n\n const size = 1024\n const textTexture = new BABYLON.DynamicTexture('Text', size, element.scene)\n const textContext = textTexture.getContext()\n textTexture.update()\n\n const textMaterial = new BABYLON.StandardMaterial('Text', element.scene)\n textMaterial.diffuseTexture = textTexture\n textMaterial.emissiveTexture = textTexture\n textMaterial.backfaceCulling = false\n\n const plaque = BABYLON.MeshBuilder.CreatePlane('Plaque', {size: 1}, element.scene)\n plaque.position.x = 0\n plaque.position.y = 2\n plaque.billboardMode = BABYLON.Mesh.BILLBOARDMODE_ALL\n plaque.material = textMaterial\n\n let controllers\n if (navigator.xr) {\n const xrHelper = await element.scene.createDefaultXRExperienceAsync({\n uiOptions: {\n sessionMode: 'immersive-ar'\n }\n })\n controllers = xrControllers(xrHelper)\n }\n\n const interval = setInterval(() => {\n if (document.body.contains(element)) {\n textContext.fillStyle = '#204020'\n textContext.fillRect(0, 0, size, size)\n const text = gamepadText() + '\\n' + xrControllersText(controllers)\n const lines = text.split('\\n')\n textContext.fillStyle = '#afa'\n textContext.font = '32px monospace'\n for(let i = 0; i < lines.length; i++) {\n const line = lines[i]\n textContext.fillText(line, 40, 70 + i * 40)\n }\n textContext.fillStyle = '#bbb'\n textContext.fillText('xinjs-xr — debug info', 40, 984)\n textTexture.update()\n } else {\n clearInterval(interval)\n }\n }, 100)\n },\n}))\n```\n```css\n.preview xin-3d {\n width: 100%;\n height: 100%;\n}\n```\n\nYou can access the `scene` and `engine` properties. You can also assign `sceneCreated`\nand `update` callbacks that will be executed when the scene is first initialized and\nbefore each update, respectively. (See the example, it does both.)\n\nBoth `sceneCreated` and `update` may be `async`. The component will `await` `sceneCreated`\nbefore starting the renderLoop, but `update` is simply passed to babylon, so be careful.\n\nBy default, this component loads `babylon.js` from the [babylonjs CDN](https://doc.babylonjs.com/setup/frameworkPackages/CDN),\nbut if `BABYLON` is already defined (e.g. if you've bundled it) then it will use that instead.\n\nIf you need additional libraries, e.g. `https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js` for loading models such as `gltf` and `glb` files, you should load those in `sceneCreated`.\n\nHere's a simple example of a terrain mesh comprising 125k triangles, 50% of which is being scaled using a `profileScale` function that\ntakes an array of numbers that use a linear profile to change the landform.\n\n```js\nimport { b3d } from 'tosijs-ui'\nimport { MoreMath } from 'tosijs'\n\nconst debugCutoff = 0.5\nconst defaultProfile = [0, 1, 5, 8, 10].map(x => x/10)\n\nconst { clamp } = MoreMath\nfunction profileScale(t = 0, bypass = false, profile = defaultProfile) {\n if (bypass) {\n return t\n }\n const count = profile.length - 1\n if (count < 1) {\n throw new Error('profile must be of length ≥ 2')\n }\n\n const s = clamp(0, (t + 1) / 2, 1)\n const index = Math.floor(s * count)\n const dt = (s - index / count) * count\n const min = profile[index]\n const max = profile[index + 1]\n const p = dt * (max - min) + min\n return 2 * p - 1\n}\n\npreview.append(b3d({\n async sceneCreated(element, BABYLON) {\n const { scene } = element\n const { createNoise2D } = await import('https://cdn.jsdelivr.net/npm/simplex-noise@4.0.1/+esm')\n\n new BABYLON.HemisphericLight('light', new BABYLON.Vector3(0.25, 1, 2))\n\n const terrain = new BABYLON.Mesh('terrain', scene)\n const vertexData = new BABYLON.VertexData()\n\n const noise2D = createNoise2D()\n const positions = []\n const indices = []\n const gridSize = 100\n const gridResolution = 250\n const gridPoints = gridResolution + 1\n const noiseScale = 0.03\n const heightScale = 4.5\n terrain.position.y = -5\n const scale = t => t * gridSize / gridResolution - gridSize * 0.5\n for(let x = 0; x <= gridResolution; x++) {\n for(let z = 0; z <= gridResolution; z++) {\n const y = profileScale(noise2D(scale(x) * noiseScale, scale(z) * noiseScale), x < gridResolution * debugCutoff)\n positions.push(scale(x), y * heightScale, scale(z))\n if (x > 0 && z > 0) {\n const i = x * gridPoints + z\n indices.push(\n i, i - gridPoints - 1, i - 1,\n i, i - gridPoints, i - gridPoints - 1,\n )\n }\n }\n }\n const normals = []\n BABYLON.VertexData.ComputeNormals(positions, indices, normals);\n\n vertexData.positions = positions\n vertexData.indices = indices\n vertexData.normals = normals\n vertexData.applyToMesh(terrain)\n },\n}))\n```\n\n## loadScene\n\n`<xin-3d>.loadScene(path: string, file: string, callBack(meshes: any[]): void)` can\nbe used to load `.glb` files.\n\n## loadUI\n\n`<xin-3d>.loadUI(options: B3dUIOptions)` loads babylonjs guis, which you can create programmatically or using the [babylonjs gui tool](https://gui.babylonjs.com/).\n*/\nimport { Component as WebComponent, ElementCreator, elements } from 'tosijs'\nimport { scriptTag } from './via-tag'\nimport { icons, svg2DataUrl } from './icons'\n\ntype B3dCallback =\n | ((element: B3d, BABYLON: any) => void)\n | ((element: B3d, BABYLON: any) => Promise<void>)\n\ninterface B3dUIOptions {\n snippetId?: string\n jsonUrl?: string\n data?: any\n size?: number\n}\n\ntype MeshProcessCallback = (meshes: any[]) => void\n\nconst noop = () => {\n /* do not care */\n}\n\nexport class B3d extends WebComponent {\n babylonReady: Promise<any>\n BABYLON?: any\n\n static styleSpec = {\n ':host': {\n display: 'block',\n position: 'relative',\n },\n ':host canvas': {\n width: '100%',\n height: '100%',\n },\n ':host .babylonVRicon': {\n height: 50,\n width: 80,\n backgroundColor: 'transparent',\n filter: 'drop-shadow(0 0 4px #000c)',\n backgroundImage: svg2DataUrl(icons.xrColor()),\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n border: 'none',\n borderRadius: 5,\n borderStyle: 'none',\n outline: 'none',\n transition: 'transform 0.125s ease-out',\n },\n ':host .babylonVRicon:hover': {\n transform: 'scale(1.1)',\n },\n }\n\n content = elements.canvas({ part: 'canvas' })\n\n constructor() {\n super()\n\n this.babylonReady = (async () => {\n const { BABYLON } = await scriptTag(\n 'https://cdn.babylonjs.com/babylon.js',\n 'BABYLON'\n )\n return BABYLON\n })()\n }\n\n scene: any\n engine: any\n\n sceneCreated: B3dCallback = noop\n update: B3dCallback = noop\n\n private _update = () => {\n if (this.scene) {\n if (this.update !== undefined) {\n this.update(this, this.BABYLON)\n }\n if (this.scene.activeCamera !== undefined) {\n this.scene.render()\n }\n }\n }\n\n onResize() {\n if (this.engine) {\n this.engine.resize()\n }\n }\n\n loadScene = async (\n path: string,\n file: string,\n processCallback?: MeshProcessCallback\n ): Promise<void> => {\n const { BABYLON } = await scriptTag(\n 'https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js',\n 'BABYLON'\n )\n\n BABYLON.SceneLoader.Append(path, file, this.scene, processCallback)\n }\n\n loadUI = async (options: B3dUIOptions): Promise<any> => {\n const { BABYLON } = await scriptTag(\n 'https://cdn.babylonjs.com/gui/babylon.gui.min.js',\n 'BABYLON'\n )\n const advancedTexture =\n BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI(\n 'GUI',\n true,\n this.scene\n )\n const { snippetId, jsonUrl, data, size } = options\n if (size) {\n advancedTexture.idealWidth = size\n advancedTexture.renderAtIdealSize = true\n }\n // edit or create your own snippet here\n // https://gui.babylonjs.com/\n let gui\n if (snippetId) {\n gui = await advancedTexture.parseFromSnippetAsync(snippetId)\n } else if (jsonUrl) {\n gui = await advancedTexture.parseFromURLAsync(jsonUrl)\n } else if (data) {\n gui = advancedTexture.parseContent(data)\n } else {\n return null\n }\n\n const root = advancedTexture.getChildren()[0]\n const widgets = root.children.reduce(\n (map: { [key: string]: any }, widget: any) => {\n map[widget.name] = widget\n return map\n },\n {}\n )\n\n return { advancedTexture, gui, root, widgets }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n const { canvas } = this.parts as { canvas: HTMLCanvasElement }\n\n this.babylonReady.then(async (BABYLON) => {\n this.BABYLON = BABYLON\n this.engine = new BABYLON.Engine(canvas, true)\n this.scene = new BABYLON.Scene(this.engine)\n if (this.sceneCreated) {\n await this.sceneCreated(this, BABYLON)\n }\n if (this.scene.activeCamera === undefined) {\n const camera = new BABYLON.ArcRotateCamera(\n 'default-camera',\n -Math.PI / 2,\n Math.PI / 2.5,\n 3,\n new BABYLON.Vector3(0, 0, 0)\n )\n camera.attachControl(this.parts.canvas, true)\n }\n this.engine.runRenderLoop(this._update)\n })\n }\n}\n\nexport const b3d = B3d.elementCreator({ tag: 'xin-3d' }) as ElementCreator<B3d>\n",
7
+ "/*#\n# scriptTag & styleSheet\n\n## scriptTag\n\nIf you need to load an old school (cjs) javascript or css library via cdn then use these two functions.\n\n`tosijs-ui` uses this library to implement the `<xin-code>`, `<xin-lottie>`, and `<xin-map>`\nelements.\n\n`scriptTag()` and `styleSheet()` return promises that resolve `globalThis` when the module in question\nhas loaded and otherwise behave as much like `import()` as possible.\n\nThis example uses `scriptTag` and `styleSheet` to load [quilljs](https://quilljs.com) on-the-fly.\n\n```js\nimport { elements } from 'tosijs'\nimport { scriptTag, styleSheet } from 'tosijs-ui'\n\nconst toolbarOptions = [\n [{ header: [1, 2, 3, 4, false] }],\n ['blockquote', 'code-block'],\n [{ 'align': [] }],\n ['bold', 'italic', 'strike'],\n ['link', 'image', 'video'],\n [{ 'list': 'ordered'}, { 'list': 'bullet' }, { 'list': 'check' }],\n [{ 'indent': '-1'}, { 'indent': '+1' }],\n ['clean']\n]\n\n;(async () => {\n await Promise.all([\n styleSheet('https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.core.css'),\n styleSheet('https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.snow.css'),\n ])\n\n const container = elements.div()\n const { Quill } = await scriptTag('https://cdn.jsdelivr.net/npm/quill@2.0.2/dist/quill.js')\n preview.append(container)\n\n const quill = new Quill(container, {\n debug: 'info',\n modules: {\n toolbar: toolbarOptions,\n },\n theme: 'snow',\n })\n})()\n```\n\nNote that `scriptTag` will resolve `globalThis` so it behaves as much like async `import()`\nas possible.\n\nAs an aside:\n\n`<xin-lottie>` is implemented in such a way that if you've preloaded the module\n(e.g. via a script tag or packaging) it won't load it again, which affords offline\nuse.\n\nThere's no point for `<xin-map>` since it won't work without connectivity anyway.\n\n## styleSheet\n\nstyleSheet creates a `<link>` tag for a specified css file.\n\nUsing `styleSheet`:\n\n styleSheet('../path/to/style.css')\n\nThis is awaitable, if you care. The stylesheet `<link>` will only be inserted _once_.\n*/\n\nimport { elements } from 'tosijs'\n\ninterface PromiseMap {\n [key: string]: Promise<any>\n}\n\nconst loadedScripts: PromiseMap = {}\nexport function scriptTag(\n src: string,\n existingSymbolName?: string\n): Promise<any> {\n if (loadedScripts[src] === undefined) {\n if (existingSymbolName !== undefined) {\n // @ts-ignore-error aaaargh\n const existing = globalThis[existingSymbolName]\n loadedScripts[src] = Promise.resolve({ [existingSymbolName]: existing })\n }\n\n const scriptElt = elements.script({ src })\n\n document.head.append(scriptElt)\n\n loadedScripts[src] = new Promise((resolve) => {\n scriptElt.onload = () => resolve(globalThis)\n })\n }\n\n return loadedScripts[src]\n}\n\nconst loadedStyleSheets: PromiseMap = {}\nexport function styleSheet(href: string): Promise<void> {\n if (loadedStyleSheets[href] === undefined) {\n const linkElement = elements.link({\n rel: 'stylesheet',\n type: 'text/css',\n href,\n })\n\n document.head.append(linkElement)\n\n loadedStyleSheets[href] = new Promise((resolve) => {\n linkElement.onload = resolve\n })\n }\n return loadedStyleSheets[href]\n}\n",
8
+ "/*#\n# icons\n\n<div class=\"center\">\n <xin-icon icon=\"settings\" style=\"--xin-icon-size: 128px\"></xin-icon>\n <xin-icon icon=\"xrColor\" style=\"--xin-icon-size: 96px\"></xin-icon>\n <xin-icon icon=\"rgb\" style=\"--xin-icon-size: 128px\"></xin-icon>\n</div>\n\nA library that provides `ElementCreator` functions that produce SVG icons. It leverages `tosijs`'s\n`svgElements` proxy and is intended to address all the key use-cases for SVG icons in web\napplications along with being very easy to extend and maintain.\n\n> ### Supported Use Cases\n> - inline SVGs that can be styled by CSS (for buttons, etc.)\n> - allows both stroked and filled icons (unlike font-based systems)\n> - No build process magic needed (it's \"just javascript\")\n> - highly optimized and compressible\n> - support for color icons (without requiring multiple glyphs perfectly aligned)\n> - icons can be rendered as data urls, e.g. to insert into CSS…\n\n## icons\n\n`icons` is a proxy that generates an `ElementCreator` for a given icon on demand,\ne.g. `icons.chevronDown()` produces an `<svg>` element containing a downward-pointing chevron\nicon with the class `icon-chevron-down`.\n\n```js\nconst { tosi } = tosijs\nimport { icons, svgIcon, postNotification } from 'tosijs-ui'\nimport { div } from 'tosijs'.elements\n\nconst { iconDemo } = tosi({\n iconDemo: {\n icon: ''\n }\n})\n\npreview.append(\n div(\n {\n class: 'scroller'\n },\n ...Object.keys(icons).sort().map(iconName => div(\n { \n class: 'tile', \n onClick() {\n iconDemo.icon = iconDemo.icon != iconName ? iconName : ''\n postNotification({\n icon: iconName,\n message: `${iconName} clicked`,\n duration: 2,\n color: 'hotpink'\n })\n },\n onMouseleave() {\n iconDemo.icon = ''\n }\n },\n svgIcon({icon: iconName, size: 24}),\n div(iconName)\n )),\n ),\n svgIcon({\n class: 'icon-detail',\n size: 256,\n bind: {\n binding: {\n toDOM(element, value) {\n element.style.opacity = value ? 1 : 0\n if (value) element.icon = value\n }\n },\n value: iconDemo.icon\n }\n })\n)\n```\n```css\n.preview .scroller {\n display: grid;\n grid-template-columns: calc(33% - 5px) calc(33% - 5px) calc(33% - 5px);\n flex-wrap: wrap;\n padding: var(--spacing);\n gap: var(--spacing);\n overflow: hidden scroll !important;\n height: 100%;\n}\n\n.preview .tile {\n display: flex;\n text-align: center;\n cursor: pointer;\n background: #fff8;\n padding: 10px;\n gap: 10px;\n border-radius: 5px;\n}\n\n.preview .tile:hover {\n background: white;\n color: var(--brand-color);\n}\n\n.preview .tile > div {\n font-family: Menlo, Monaco, monospace;\n whitespace: no-wrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.preview .tile xin-icon {\n font-size: 24px;\n}\n\n.preview .icon-detail {\n position: absolute;\n display: block;\n height: 256px;\n opacity: 0;\n transition: 0.5s ease-out;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: #fffc;\n padding: 10px;\n borderRadius: 10px;\n pointerEvents: none;\n}\n```\n\nThese icons are completely unstyled and can be colored using the css `fill` property. This will\nprobably be broken out as a standalone library to allow the use of whatever icons you like\n(its source data is currently generated from an [icomoon](https://icomoon.com/app)\n`selection.json` file, but could just as easily be generated from a directory full of SVGs).\n\n## Adding and redefining icons\n\nSimply pass a map of icon names to svg source strings…\n\n```\ndefineIcons({\n someIcon: '<svg ....',\n otherIcon: '<svg ...',\n})\n```\n\n### Icon Classes\n\nIcons will be generated with the class `xin-icon`.\n\nYou can also assign the classes `filled`, `stroked`, and `color` to icons to set default\nicon styling.\n\n## `<xin-icon>`\n\n`<xin-icon>` is a simple component that lets you embed icons as HTML. Check the CSS tab to see\nhow it's styled.\n\n`<xin-icon>` supports four attributes:\n\n- `size` (defaults to 0) if non-zero sets the height of the icon in pixels\n- `icon` is the name of the icon\n- `color` is the fill color (if you don't want to style it using CSS)\n- `stroke` is the stroke color\n- `stroke-width` (defaults to 1) is the width of the stroke assuming the icon's viewBox is 1024 units tall but the\n icon is rendered at 32px (so it's multiplied by 32).\n\n> **Aside**: the tool used to build the icon library scales up the viewBox to 1024 tall and then rounds\n> all coordinates to nearest integer on the assumption that this is plenty precise enough for icons and\n> makes everything smaller and easier to compress.\n\n## SVGs as data-urls\n\n```js\nimport { elements } from 'tosijs'\nimport { icons, svg2DataUrl } from 'tosijs-ui'\n\npreview.append(\n elements.span({\n style: {\n display: 'inline-block',\n width: '120px',\n height: '24px',\n content: '\" \"',\n background: svg2DataUrl(icons.star(), 'none', '#bbb', 3)\n }\n }),\n elements.span({\n style: {\n display: 'inline-block',\n width: '120px',\n height: '24px',\n content: '\" \"',\n background: svg2DataUrl(icons.star(), 'gold', 'orange', 2)\n }\n }),\n elements.span({\n style: {\n display: 'inline-block',\n width: '100px',\n height: '200px',\n content: '\" \"',\n background: svg2DataUrl(icons.tosi())\n }\n }),\n)\n```\n\n`svg2DataUrl(svg: SVGElement, fill?: string, stroke?: string): string` is provided as a\nutility for converting SVG elements into data-urls (e.g. for incorporation into\nCSS properties. (It's used by the `<xin-3d>` component to render the XR widget.)\n\nIf you're using `SVGElement`s created using the `icons` proxy, you'll want to provide `fill` and/or\n`stroke` values, because images loaded via css properties cannot be styled.\n\n## Color Icons\n\n```html\n<xin-icon icon=\"tosiFavicon\" class=\"demo-icon\"></xin-icon>\n<xin-icon icon=\"tosiPlatform\" class=\"demo-icon recolored\"></xin-icon>\n<xin-icon icon=\"tosiXr\" class=\"demo-icon animated\"></xin-icon>\n```\n```css\n.demo-icon {\n --xin-icon-size: 160px\n}\n\n.recolored > svg {\n pointer-events: all;\n transition: 0.25s ease-out;\n transform: scale(1);\n filter: grayscale(0.5)\n}\n\n.recolored:hover > svg {\n opacity: 1;\n transform: scale(1.1);\n filter: grayscale(0);\n}\n\n.animated > svg {\n animation: 2s linear 0s infinite rainbow;\n}\n\n@keyframes rainbow {\n 0% {\n filter: hue-rotate(0deg);\n }\n 100% {\n filter: hue-rotate(360deg);\n }\n}\n```\n\nColored icons have the `color` class added to them, so you can easily create css rules\nthat, for example, treat all colored icons inside buttons the same way.\n\n> Earlier versions of this library replaced color specifications with CSS-variables in a\n> very convoluted way, but in practice this isn't terribly useful as SVG properties can't\n> be animated by CSS, so this functionality has been stripped out.\n\n## Missing Icons\n\nIf you ask for an icon that isn't defined, the `icons` proxy will print a warning to console\nand render a `square` (in fact, `icons.square()`) as a fallback.\n\n## Why?\n\nMy evolution has been:\n\n1. Using Icomoon.io, which I still think is a solid choice for managing custom icon fonts\n2. Processing Icomoon selection.json files into icon-data and then generating SVGs dynamically\n from the data\n3. Ingesting SVGs directly, with a little cleanup\n\nThe goal is always to have a single source of truth for icons, no magic or convoluted tooling, and \nbe able to quickly and easily add and replace icons, distribute them with components, and\nhave no mess or fuss.\n\n1. Works well, but…\n - color icons are flaky,\n - doesn't play well with others, \n - can't really distribute the icons with your components. \n - difficult to use icons in CSS `content`\n - impossible to use icons in CSS backgrounds\n2. This is `icons.ts` until just now! Solves all the above, but…\n - no fancy SVG effects, like gradients (goodness knows I experimented with converting CSS gradients to SVG gradients) and, most \n - **strokes** need to be converted to outlines\n - outlined strokes can't be styled the way strokes can\n - blocks use of popular icon libraries\n3. This is how everyone else works, except…\n - no build magic needed: `defineIcons({ myIcon: '<svg....>', ... })`\n - if you want build magic, `icons.js` has no dependencies, finds icons and creates an `icon-data.ts` file.\n - smaller icon files, even though I'm now including more icons (including *all the current* feathericons)\n\n## Icon Sources\n\nMany of these icons are sourced from [Feather Icons](https://github.com/feathericons/feather), but\nall the icons have been processed to have integer coordinates in a `viewBox` typically scaled to 1024 &times; 1024.\n\nThe corporate logos (Google, etc.) are from a variety of sources, in many cases ultimately from the\norganizations themselves. It's up to you to use them correctly.\n\nThe remaining icons I have created myself using the excellent but sometimes flawed\n[Amadine](https://apps.apple.com/us/app/amadine-vector-design-art/id1339198386?mt=12)\nand generally reliable [Graphic](https://apps.apple.com/us/app/graphic/id404705039?mt=12).\n\n### Feather Icons Copyright Notice\n\nThe MIT License (MIT)\n\nCopyright (c) 2013-2023 Cole Bemis\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n*/\n\nimport {\n elements,\n svgElements,\n ElementCreator,\n ElementPart,\n ElementProps,\n Component as WebComponent,\n XinStyleRule,\n Color,\n varDefault,\n StyleSheet,\n} from 'tosijs'\nimport { SVGIconMap } from './icon-types'\nimport iconData from './icon-data'\n\nconst { svg, path } = svgElements\n\nexport const defineIcons = (newIcons: { [key: string]: string }): void => {\n Object.assign(iconData, newIcons)\n}\n\nexport const svg2DataUrl = (\n svg: SVGElement,\n fill?: string | false,\n stroke?: string | false,\n strokeWidth: number | string = 1\n): string => {\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n if (fill || stroke) {\n for (const path of [...svg.querySelectorAll('path, polygon')]) {\n if (fill) {\n path.setAttribute('fill', fill)\n }\n if (stroke) {\n path.setAttribute('stroke', stroke)\n path.setAttribute('stroke-width', String(strokeWidth))\n }\n }\n }\n\n const styled = svg.querySelectorAll('[style]')\n svg.removeAttribute('style')\n for (const item of [...styled] as HTMLElement[]) {\n const { fill, stroke, strokeWidth, strokeLinecap, strokeLinejoin } =\n item.style\n if (fill) item.setAttribute('fill', Color.fromCss(fill).html)\n if (stroke) item.setAttribute('stroke', Color.fromCss(stroke).html)\n if (strokeWidth) item.setAttribute('strokeWidth', strokeWidth)\n if (strokeLinecap) item.setAttribute('strokeLinecap', strokeLinecap)\n if (strokeLinejoin) item.setAttribute('strokeLinejoin', strokeLinejoin)\n item.removeAttribute('style')\n }\n\n const text = encodeURIComponent(svg.outerHTML)\n return `url(data:image/svg+xml;charset=UTF-8,${text})`\n}\n\nexport const icons = new Proxy(iconData, {\n get(\n target,\n prop: string\n ): ElementCreator {\n let iconSpec = iconData[prop as keyof typeof iconData] as string\n if (prop && !iconSpec) {\n console.warn(`icon ${prop} does not exist`)\n }\n if (!iconSpec) {\n iconSpec = iconData.square\n }\n return (...parts: ElementPart[]) => {\n const div = elements.div()\n div.innerHTML = iconSpec\n const sourceSvg = div.querySelector('svg') as SVGElement\n const classes = new Set(sourceSvg.classList)\n classes.add('xin-icon')\n const svg = svgElements.svg(\n {\n class: Array.from(classes).join(' '),\n viewBox: sourceSvg.getAttribute('viewBox'),\n },\n ...parts,\n ...sourceSvg.children\n )\n svg.style.strokeWidth = varDefault.xinIconStrokeWidth('2px')\n svg.style.stroke = varDefault.xinIconStroke(\n classes.has('filled') ? 'none' : 'currentColor'\n )\n svg.style.fill = varDefault.xinIconFill(\n classes.has('stroked') ? 'none' : 'currentColor'\n )\n svg.style.height = varDefault.xinIconSize('16px')\n return svg\n }\n },\n}) as unknown as SVGIconMap\n\nexport class SvgIcon extends WebComponent {\n icon = ''\n size = 0\n fill = ''\n stroke = ''\n strokeWidth = 1\n\n constructor() {\n super()\n\n this.initAttributes('icon', 'size', 'fill', 'stroke', 'strokeWidth')\n }\n\n render(): void {\n super.render()\n this.textContent = ''\n const style: XinStyleRule = {}\n if (this.size) {\n style.height = this.size + 'px'\n this.style.setProperty('--xin-icon-size', `${this.size}px`)\n }\n if (this.stroke) {\n style.stroke = this.stroke\n style.strokeWidth = this.strokeWidth\n }\n style.fill = this.fill\n this.append(icons[this.icon]({ style }))\n }\n}\n\nexport const svgIcon = SvgIcon.elementCreator({\n tag: 'xin-icon',\n styleSpec: {\n ':host': {\n display: 'inline-flex',\n stroke: 'currentColor',\n strokeWidth: varDefault.iconStrokeWidth('2px'),\n strokeLinejoin: varDefault.iconStrokeLinejoin('round'),\n strokeLinecap: varDefault.iconStrokeLinecap('round'),\n fill: varDefault.iconFill('none'),\n },\n ':host, :host svg': {\n height: varDefault.xinIconSize('16px'),\n },\n },\n})\n",
9
+ "interface IconData { [key: string]: string }\n\nexport default {\n earth: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><g><path style=\\\"fill:#a3d9ff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M7,13.46 C5.10,16.52,4,20.13,4,24 C4,31.81,8.47,38.57,15,41.87 C15,41.87,15,31,15,31 C15,31,9,29,9,29 C9,29,9,19,9,19 C9,19,7,15,7,15 C7,15,7,13.46,7,13.46 z\\\"/><path style=\\\"fill:#a3d9ff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M18.40,4.79 C20.18,4.28,22.06,4,24,4 C27.57,4,30.92,4.93,33.82,6.57 C33.82,6.57,29,13,29,13 C29,13,31,19,31,19 C31,19,37,21,37,21 C37,21,39,29,39,29 C39,29,37.35,38.89,37.35,38.89 C33.81,42.07,29.13,44,24,44 C21.03,44,18.22,43.35,15.69,42.20 C15.69,42.20,27,29,27,29 C27,29,27,25,27,25 C27,25,21,23,21,23 C21,23,15,19,15,19 C15,19,11,19,11,19 C11,19,11,13,11,13 C11,13,13,11,13,11 C13,11,15,15,15,15 C15,15,17,15,17,15 C17,15,17,9,17,9 C17,9,18.40,4.79,18.40,4.79 z\\\"/><path style=\\\"fill:#274e42;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M18.40,4.79 C18.40,4.79,17,9,17,9 C17,9,17,15,17,15 C17,15,15,15,15,15 C15,15,13,11,13,11 C13,11,11,13,11,13 C11,13,11,19,11,19 C11,19,15,19,15,19 C15,19,21,23,21,23 C21,23,27,25,27,25 C27,25,27,29,27,29 C27,29,15.69,42.20,15.69,42.20 C15.46,42.09,15.23,41.98,15,41.87 C15,41.87,15,31,15,31 C15,31,9,29,9,29 C9,29,9,19,9,19 C9,19,7,15,7,15 C7,15,7,13.46,7,13.46 C9.57,9.32,13.62,6.19,18.40,4.79 z\\\"/><path style=\\\"fill:#274e42;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M33.82,6.57 C33.82,6.57,29,13,29,13 C29,13,31,19,31,19 C31,19,37,21,37,21 C37,21,39,29,39,29 C39,29,37.35,38.89,37.35,38.89 C41.43,35.23,44,29.91,44,24 C44,16.52,39.90,10.00,33.82,6.57 z\\\"/></g></g></g></svg> \",\n blueprint: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.5,14.5 C10.5,14.5,7.5,15.5,7.5,17.5 C7.5,19.5,10.5,19.5,10.5,19.5\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M18.50,14.5 C18.50,14.5,21.50,15.5,21.50,17.5 C21.50,19.5,18.50,19.5,18.50,19.5\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M7,5.09 C7,3.94,7.90,3,9,3 C9,3,20,3,20,3 C21.10,3,22,3.94,22,5.09 C22,5.09,22,12.41,22,12.41 C22,13.56,21.10,14.5,20,14.5 C20,14.5,9,14.5,9,14.5 C7.90,14.5,7,13.56,7,12.41 C7,12.41,7,5.09,7,5.09 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14.5,5.5 C14.5,5.5,14.5,11.5,14.5,11.5\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.5,7.5 C16.5,7.5,16.5,8.5,16.5,8.5\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.5,7.5 C12.5,7.5,12.5,8.5,12.5,8.5\\\"/><g/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M18.5,21.5 C18.5,21.5,17.5,20.5,17.5,20.5 C17.5,20.5,16.5,21.5,16.5,21.5\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.5,21.5 C12.5,21.5,11.5,20.5,11.5,20.5 C11.5,20.5,10.5,21.5,10.5,21.5\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.5,14.5 C10.5,14.5,18.5,14.5,18.5,14.5 C18.5,14.5,18.5,19.5,18.5,19.5 C18.5,19.5,10.5,19.5,10.5,19.5 C10.5,19.5,10.5,14.5,10.5,14.5 z\\\"/><g><g><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14,16.5 C14,16.5,16,16.5,16,16.5 C16,16.5,14.53,19.5,14.53,19.5\\\"/><path style=\\\"fill:#5e78ca;fill-rule:evenodd;stroke:none;\\\" d=\\\"M3.59,8.5 C3.59,8.5,12.59,8.5,12.59,8.5 C12.59,8.5,14.53,19.5,14.53,19.5 C14.53,19.5,5.53,19.5,5.53,19.5 C5.53,19.5,3.59,8.5,3.59,8.5 z\\\"/><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.59,8.5 C12.59,8.5,11.12,11.5,11.12,11.5 C11.12,11.5,2.12,11.5,2.12,11.5 C2.12,11.5,3.59,8.5,3.59,8.5\\\"/><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.59,8.5 C12.59,8.5,14.53,19.5,14.53,19.5\\\"/><path style=\\\"fill:#5e78ca;fill-rule:nonzero;stroke:#f2f2f2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M4.12,11.5 C4.12,11.5,5.53,19.5,5.53,19.5\\\"/></g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M9.24,12.5 C10.75,12.5,12.20,13.73,12.46,15.24 C12.46,15.24,12.46,15.24,12.46,15.24 C12.68,16.49,11.85,17.5,10.60,17.5 C10.60,17.5,10.55,17.5,10.55,17.5 C10.17,17.5,9.92,17.81,9.98,18.19 C9.98,18.19,9.98,18.19,9.98,18.19 C10.21,19.47,9.36,20.5,8.08,20.5 C8.08,20.5,6.39,20.5,6.39,20.5 C5.10,20.5,3.87,19.45,3.64,18.16 C3.64,18.16,3.12,15.21,3.12,15.21 C2.86,13.71,3.86,12.5,5.35,12.5 C5.35,12.5,9.24,12.5,9.24,12.5 z\\\"/></g></g></svg> \",\n tosiXr: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,5.00,15.25,5.00,17.25 C5.00,19.25,8.00,19.25,8.00,19.25\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,14.25 C16.00,14.25,19.00,15.25,19.00,17.25 C19.00,19.25,16.00,19.25,16.00,19.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M4.50,4.85 C4.50,3.69,5.40,2.75,6.50,2.75 C6.50,2.75,17.50,2.75,17.50,2.75 C18.61,2.75,19.50,3.69,19.50,4.85 C19.50,4.85,19.50,12.16,19.50,12.16 C19.50,13.32,18.61,14.25,17.50,14.25 C17.50,14.25,6.50,14.25,6.50,14.25 C5.40,14.25,4.50,13.32,4.50,12.16 C4.50,12.16,4.50,4.85,4.50,4.85 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.00,5.25 C12.00,5.25,12.00,11.25,12.00,11.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14.00,7.25 C14.00,7.25,14.00,8.25,14.00,8.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,7.25 C10.00,7.25,10.00,8.25,10.00,8.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,21.25 C16.00,21.25,15.00,20.25,15.00,20.25 C15.00,20.25,14.00,21.25,14.00,21.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,21.25 C10.00,21.25,9.00,20.25,9.00,20.25 C9.00,20.25,8.00,21.25,8.00,21.25\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,16.00,14.25,16.00,14.25 C16.00,14.25,16.00,19.25,16.00,19.25 C16.00,19.25,8.00,19.25,8.00,19.25 C8.00,19.25,8.00,14.25,8.00,14.25 z\\\"/><path style=\\\"fill:#ff7bac;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.00,4.00 C12.00,4,11.99,4,11.99,4 C6.19,4,3,4.73,3,8.50 C3,11.39,4.66,13.00,7.27,13 C9.88,13.00,10.68,11.13,11.99,11.13 C11.99,11.13,12.00,11.13,12,11.13 C12.00,11.13,12.01,11.13,12.01,11.13 C13.32,11.13,14.12,13.00,16.73,13 C19.34,13.00,21,11.39,21,8.50 C21,4.73,17.81,4,12.01,4 C12.01,4,12.00,4,12.00,4.00 C12.00,4.00,12.00,4.00,12.00,4.00 z\\\"/></g></svg> \",\n cmy: \"<svg class=\\\"color filled\\\" viewBox=\\\"0 0 24 24\\\"><g><g><path style=\\\"fill:#00ff00;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C6.37,11.85,7.87,13.42,9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 z\\\"/><path style=\\\"fill:#0000ff;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C13.10,10.01,14.49,9.5,16,9.5 C16.78,9.5,17.53,9.64,18.22,9.89 C17.63,11.85,16.13,13.42,14.22,14.11 C13.83,12.81,13.04,11.69,12.00,10.88 C12.00,10.88,12.00,10.88,12.00,10.88 z\\\"/><path style=\\\"fill:#000000;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 C13.04,11.69,13.83,12.81,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#ff0000;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C9.60,14.71,9.5,15.34,9.5,16 C9.5,18.08,10.48,19.93,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#02fefe;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C5.60,9.29,5.5,8.66,5.5,8 C5.5,4.41,8.41,1.5,12,1.5 C15.59,1.5,18.5,4.41,18.5,8 C18.5,8.66,18.40,9.29,18.22,9.89 C17.53,9.64,16.78,9.5,16,9.5 C14.49,9.5,13.10,10.01,12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#fffe00;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C3.28,10.80,1.50,13.19,1.50,16 C1.50,19.59,4.41,22.5,8.00,22.5 C9.51,22.5,10.90,21.99,12.00,21.12 C10.48,19.93,9.5,18.08,9.5,16 C9.5,15.34,9.60,14.71,9.78,14.11 C7.87,13.42,6.37,11.85,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#ff00ff;fill-rule:evenodd;\\\" d=\\\"M18.22,9.89 C20.72,10.80,22.5,13.19,22.5,16 C22.5,19.59,19.59,22.5,16,22.5 C14.49,22.5,13.10,21.99,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C16.13,13.42,17.63,11.85,18.22,9.89 z\\\"/></g></g></svg> \",\n rgb: \"<svg class=\\\"color filled\\\" viewBox=\\\"0 0 24 24\\\"><g><g><path style=\\\"fill:#ff00ff;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C6.37,11.85,7.87,13.42,9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 z\\\"/><path style=\\\"fill:#ffff00;fill-rule:evenodd;\\\" d=\\\"M12.00,10.88 C13.10,10.01,14.49,9.5,16,9.5 C16.78,9.5,17.53,9.64,18.22,9.89 C17.63,11.85,16.13,13.42,14.22,14.11 C13.83,12.81,13.04,11.69,12.00,10.88 C12.00,10.88,12.00,10.88,12.00,10.88 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C10.17,12.81,10.96,11.69,12.00,10.88 C13.04,11.69,13.83,12.81,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#00ffff;fill-rule:evenodd;\\\" d=\\\"M9.78,14.11 C9.60,14.71,9.5,15.34,9.5,16 C9.5,18.08,10.48,19.93,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C13.53,14.36,12.78,14.5,12,14.5 C11.22,14.5,10.47,14.36,9.78,14.11 C9.78,14.11,9.78,14.11,9.78,14.11 z\\\"/><path style=\\\"fill:#ff0000;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C5.60,9.29,5.5,8.66,5.5,8 C5.5,4.41,8.41,1.5,12,1.5 C15.59,1.5,18.5,4.41,18.5,8 C18.5,8.66,18.40,9.29,18.22,9.89 C17.53,9.64,16.78,9.5,16,9.5 C14.49,9.5,13.10,10.01,12.00,10.88 C10.90,10.01,9.51,9.5,8.00,9.5 C7.22,9.5,6.47,9.64,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#0000ff;fill-rule:evenodd;\\\" d=\\\"M5.78,9.89 C3.28,10.80,1.50,13.19,1.50,16 C1.50,19.59,4.41,22.5,8.00,22.5 C9.51,22.5,10.90,21.99,12.00,21.12 C10.48,19.93,9.5,18.08,9.5,16 C9.5,15.34,9.60,14.71,9.78,14.11 C7.87,13.42,6.37,11.85,5.78,9.89 C5.78,9.89,5.78,9.89,5.78,9.89 z\\\"/><path style=\\\"fill:#00ff00;fill-rule:evenodd;\\\" d=\\\"M18.22,9.89 C20.72,10.80,22.5,13.19,22.5,16 C22.5,19.59,19.59,22.5,16,22.5 C14.49,22.5,13.10,21.99,12.00,21.12 C13.52,19.93,14.50,18.08,14.50,16 C14.50,15.34,14.40,14.71,14.22,14.11 C16.13,13.42,17.63,11.85,18.22,9.89 z\\\"/></g></g></svg> \",\n xrColor: \"<svg class=\\\"color filled\\\" viewBox=\\\"0 0 40 24\\\"><g><g><g><path style=\\\"fill:#000000;fill-rule:evenodd;\\\" d=\\\"M20.00,2.00 C19.99,2.00,19.98,2,19.98,2 C8.39,2,2,3.61,2,12.00 C2,18.41,5.32,22.00,10.54,22 C15.77,22.00,17.37,17.85,19.98,17.85 C19.98,17.85,19.99,17.85,20,17.85 C20.01,17.85,20.02,17.85,20.02,17.85 C22.63,17.85,24.23,22.00,29.46,22 C34.68,22.00,38,18.41,38,12.00 C38,3.61,31.61,2,20.02,2 C20.02,2,20.01,2.00,20.00,2.00 C20.00,2.00,20.00,2.00,20.00,2.00 z\\\"/></g><path style=\\\"fill:#fbed21;fill-rule:evenodd;\\\" d=\\\"M12.20,19.84 C15.79,19.39,17.07,16.46,19.07,16.46 C19.07,16.46,19.08,16.46,19.09,16.46 C19.09,16.46,19.10,16.46,19.11,16.46 C19.44,16.46,19.75,16.54,20.06,16.68 C20.37,16.54,20.68,16.46,21.01,16.46 C21.02,16.46,21.02,16.46,21.03,16.46 C21.04,16.46,21.04,16.46,21.05,16.46 C23.05,16.46,24.33,19.39,27.92,19.84 C31.66,19.40,33.98,16.50,33.98,11.62 C33.98,4.91,29.04,3.44,20.06,3.35 C11.07,3.44,6.14,4.91,6.14,11.62 C6.14,16.50,8.46,19.40,12.20,19.84 z\\\"/><path style=\\\"fill:#8cc63f;fill-rule:evenodd;\\\" d=\\\"M12.20,19.84 C12.52,19.87,12.86,19.89,13.21,19.89 C16.86,19.89,18.37,17.43,20.06,16.68 C19.75,16.54,19.44,16.46,19.11,16.46 C19.10,16.46,19.09,16.46,19.09,16.46 C19.08,16.46,19.07,16.46,19.07,16.46 C17.07,16.46,15.79,19.39,12.20,19.84 z\\\"/><path style=\\\"fill:#8cc63f;fill-rule:evenodd;\\\" d=\\\"M20.06,3.35 C20.37,3.35,20.69,3.35,21.01,3.35 C21.02,3.35,21.02,3.35,21.03,3.35 C21.03,3.35,21.03,3.35,21.03,3.35 C21.04,3.35,21.04,3.35,21.05,3.35 C30.64,3.35,35.92,4.68,35.92,11.62 C35.92,16.92,33.18,19.89,28.86,19.89 C28.53,19.89,28.22,19.87,27.92,19.84 C31.66,19.40,33.98,16.50,33.98,11.62 C33.98,4.91,29.04,3.44,20.06,3.35 C20.06,3.35,20.06,3.35,20.06,3.35 z\\\"/><path style=\\\"fill:#ff1c23;fill-rule:evenodd;\\\" d=\\\"M20.06,16.68 C21.74,17.43,23.25,19.89,26.91,19.89 C27.26,19.89,27.59,19.87,27.92,19.84 C24.33,19.39,23.05,16.46,21.05,16.46 C21.04,16.46,21.04,16.46,21.03,16.46 C21.02,16.46,21.02,16.46,21.01,16.46 C20.68,16.46,20.37,16.54,20.06,16.68 z\\\"/><path style=\\\"fill:#ff1c23;fill-rule:evenodd;\\\" d=\\\"M12.20,19.84 C11.90,19.87,11.59,19.89,11.26,19.89 C6.94,19.89,4.19,16.92,4.19,11.62 C4.19,4.68,9.48,3.35,19.07,3.35 C19.07,3.35,19.08,3.35,19.09,3.35 C19.09,3.35,19.09,3.35,19.09,3.35 C19.09,3.35,19.1,3.35,19.11,3.35 C19.43,3.35,19.75,3.35,20.06,3.35 C11.07,3.44,6.14,4.91,6.14,11.62 C6.14,16.50,8.46,19.40,12.20,19.84 z\\\"/></g><g><path style=\\\"fill:#8cc63e;fill-rule:nonzero;\\\" d=\\\"M22.55,8.63 C22.55,9.05,22.55,9.46,22.55,9.88 C22.54,10.25,22.85,10.56,23.20,10.55 C23.54,10.56,23.85,10.25,23.85,9.88 C23.85,9.46,23.85,9.05,23.85,8.63 C23.85,8.26,23.54,7.95,23.20,7.96 C22.85,7.95,22.54,8.26,22.55,8.63 z\\\"/><path style=\\\"fill:#8cc63e;fill-rule:nonzero;\\\" d=\\\"M17.32,8.63 C17.32,9.05,17.32,9.46,17.32,9.88 C17.31,10.25,17.62,10.56,17.97,10.55 C18.31,10.56,18.62,10.25,18.62,9.88 C18.62,9.46,18.62,9.05,18.62,8.63 C18.62,8.26,18.31,7.95,17.97,7.96 C17.62,7.95,17.31,8.26,17.32,8.63 z\\\"/><path style=\\\"fill:#8cc63e;fill-rule:nonzero;\\\" d=\\\"M19.99,4.39 C19.99,8.09,19.99,11.80,19.99,15.50 C19.99,15.87,20.30,16.18,20.64,16.17 C20.99,16.18,21.30,15.87,21.29,15.50 C21.29,11.80,21.29,8.09,21.29,4.39 C21.30,4.02,20.99,3.71,20.64,3.72 C20.30,3.71,19.99,4.02,19.99,4.39 z\\\"/><path style=\\\"fill:#fe1a22;fill-rule:nonzero;\\\" d=\\\"M21.43,8.63 C21.43,9.05,21.43,9.46,21.43,9.88 C21.42,10.25,21.73,10.56,22.08,10.55 C22.42,10.56,22.73,10.25,22.73,9.88 C22.73,9.46,22.73,9.05,22.73,8.63 C22.73,8.26,22.42,7.95,22.08,7.96 C21.73,7.95,21.42,8.26,21.43,8.63 z\\\"/><path style=\\\"fill:#fe1a22;fill-rule:nonzero;\\\" d=\\\"M16.20,8.63 C16.20,9.05,16.20,9.46,16.20,9.88 C16.19,10.25,16.50,10.56,16.85,10.55 C17.19,10.56,17.50,10.25,17.50,9.88 C17.50,9.46,17.50,9.05,17.50,8.63 C17.50,8.26,17.19,7.95,16.85,7.96 C16.50,7.95,16.19,8.26,16.20,8.63 z\\\"/><path style=\\\"fill:#fe1a22;fill-rule:nonzero;\\\" d=\\\"M18.87,4.39 C18.87,8.09,18.87,11.80,18.87,15.50 C18.87,15.87,19.18,16.18,19.52,16.17 C19.86,16.18,20.18,15.87,20.17,15.50 C20.17,11.80,20.17,8.09,20.17,4.39 C20.18,4.02,19.86,3.71,19.52,3.72 C19.18,3.71,18.87,4.02,18.87,4.39 z\\\"/><path style=\\\"fill:#000000;fill-rule:nonzero;\\\" d=\\\"M21.97,8.63 C21.97,9.05,21.97,9.46,21.97,9.88 C21.97,10.25,22.28,10.56,22.62,10.55 C22.97,10.56,23.28,10.25,23.27,9.88 C23.27,9.46,23.27,9.05,23.27,8.63 C23.28,8.26,22.97,7.95,22.62,7.96 C22.28,7.95,21.97,8.26,21.97,8.63 z\\\"/><path style=\\\"fill:#000000;fill-rule:nonzero;\\\" d=\\\"M16.74,8.63 C16.74,9.05,16.74,9.46,16.74,9.88 C16.74,10.25,17.05,10.56,17.39,10.55 C17.74,10.56,18.05,10.25,18.04,9.88 C18.04,9.46,18.04,9.05,18.04,8.63 C18.05,8.26,17.74,7.95,17.39,7.96 C17.05,7.95,16.74,8.26,16.74,8.63 z\\\"/><path style=\\\"fill:#000000;fill-rule:nonzero;\\\" d=\\\"M19.41,4.39 C19.41,8.09,19.41,11.80,19.41,15.50 C19.41,15.87,19.72,16.18,20.07,16.17 C20.41,16.18,20.72,15.87,20.72,15.50 C20.72,11.80,20.72,8.09,20.72,4.39 C20.72,4.02,20.41,3.71,20.07,3.72 C19.72,3.71,19.41,4.02,19.41,4.39 z\\\"/></g></g></svg> \",\n tosiUi: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><g><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M3,33 C3,31.90,3.90,31,5,31 C5,31,43,31,43,31 C44.10,31,45,31.90,45,33 C45,33,45,43,45,43 C45,44.10,44.10,45,43,45 C43,45,5,45,5,45 C3.90,45,3,44.10,3,43 C3,43,3,33,3,33 z\\\"/><g><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#ed247b;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M7,35 C7,35,7,36.34,7,38 C7,39.66,8.34,41,10,41 C11.66,41,13,39.66,13,38 C13,36.34,13,35,13,35\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#ed247b;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M17,35 C17,35,17,41,17,41\\\"/></g><g><path style=\\\"fill:#ed247b;fill-rule:evenodd;stroke:none;\\\" d=\\\"M38,33 C40.76,33,43,35.24,43,38 C43,40.76,40.76,43,38,43 C35.24,43,33,40.76,33,38 C33,35.24,35.24,33,38,33 z\\\"/><path style=\\\"fill:#ed247b;fill-rule:nonzero;stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M40,36 C40,36,36,40,36,40\\\"/><path style=\\\"fill:#ed247b;fill-rule:nonzero;stroke:#ffffff;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M36,36 C36,36,40,40,40,40\\\"/></g></g><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M15.97,21.01 C15.97,21.01,9.97,23.01,9.97,27.01 C9.97,31.01,15.97,31.01,15.97,31.01\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M31.97,21.01 C31.97,21.01,37.97,23.01,37.97,27.01 C37.97,31.01,31.97,31.01,31.97,31.01\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M31,33 C31,33,29.49,31,29.49,31 C29.49,31,27.97,33,27.97,33\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M19.97,33 C19.97,33,17.97,31,17.97,31 C17.97,31,15.97,33,15.97,33\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M15.97,21 C15.97,21,31.97,21,31.97,21 C31.97,21,31.97,31,31.97,31 C31.97,31,15.97,31,15.97,31 C15.97,31,15.97,21,15.97,21 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M9,7.18 C9,4.87,10.79,3,13.00,3 C13.00,3,35.02,3,35.02,3 C37.23,3,39.03,4.87,39.03,7.18 C39.03,7.18,39.03,21.82,39.03,21.82 C39.03,24.13,37.23,26,35.02,26 C35.02,26,13.00,26,13.00,26 C10.79,26,9,24.13,9,21.82 C9,21.82,9,7.18,9,7.18 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M24,11 C24,11,24,23,24,23\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M28,15 C28,15,28,17,28,17\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M20,15 C20,15,20,17,20,17\\\"/></g></g></g></svg> \",\n tosiFavicon: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><path style=\\\"fill:#ed247b;fill-rule:evenodd;stroke:none;\\\" d=\\\"M1,9 C1,4.58,4.58,1,9,1 C9,1,39,1,39,1 C43.42,1,47,4.58,47,9 C47,9,47,39,47,39 C47,43.42,43.42,47,39,47 C39,47,9,47,9,47 C4.58,47,1,43.42,1,39 C1,39,1,9,1,9 z\\\"/><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M16,29 C16,29,10,31,10,35 C10,39,16,39,16,39\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M32.00,29 C32.00,29,38.00,31,38.00,35 C38.00,39,32.00,39,32.00,39\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M9,10.18 C9,7.87,10.79,6,13,6 C13,6,35,6,35,6 C37.21,6,39,7.87,39,10.18 C39,10.18,39,24.82,39,24.82 C39,27.13,37.21,29,35,29 C35,29,13,29,13,29 C10.79,29,9,27.13,9,24.82 C9,24.82,9,10.18,9,10.18 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M24,11 C24,11,24,23,24,23\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M28,15 C28,15,28,17,28,17\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M20,15 C20,15,20,17,20,17\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M32,43 C32,43,30,41,30,41 C30,41,28,43,28,43\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M20,43 C20,43,18,41,18,41 C18,41,16,43,16,43\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M16,29 C16,29,32,29,32,29 C32,29,32,39,32,39 C32,39,16,39,16,39 C16,39,16,29,16,29 z\\\"/></g></g></g></svg> \",\n tosiPlatform: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 48 48\\\"><g><g><g><path style=\\\"fill:#3ea9f5;fill-rule:evenodd;stroke:none;\\\" d=\\\"M23.97,47 C23.97,47,39,47,39,47 C43.42,47,47,43.42,47,39 C47,39,47,9,47,9 C47,4.58,43.42,1,39,1 C39,1,9,1,9,1 C4.58,1,1,4.58,1,9 C1,9,1,39,1,39 C1,41.64,2.28,43.98,4.25,45.44 C4.09,44.82,4,44.17,4,43.5 C4,39.36,7.36,36,11.5,36 C15.14,36,18.18,38.60,18.86,42.05 C19.07,42.02,19.28,42,19.5,42 C21.99,42,24,44.01,24,46.5 C24,46.67,23.99,46.84,23.97,47 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:none;\\\" d=\\\"M4.25,45.44 C4.09,44.82,4,44.17,4,43.5 C4,39.36,7.36,36,11.5,36 C15.14,36,18.18,38.60,18.86,42.05 C19.07,42.02,19.28,42,19.5,42 C21.99,42,24,44.01,24,46.5 C24,46.67,23.99,46.84,23.97,47 C23.97,47,9,47,9,47 C7.22,47,5.58,46.42,4.25,45.44 z\\\"/></g><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M35,35 C35,35,32.17,35,32.17,35 C32.17,35,32.17,37.83,32.17,37.83\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M31,39 C31,39,28.17,39,28.17,39 C28.17,39,28.17,41.83,28.17,41.83\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M7.48,16 C4.45,16,2,18.45,2,21.48 C2,21.48,2,21.48,2,21.48 C2,23.98,4.02,26,6.52,26 C6.52,26,6.62,26,6.62,26 C7.38,26,8,26.62,8,27.38 C8,27.38,8,27.38,8,27.38 C8,29.93,10.07,32,12.62,32 C12.62,32,16,32,16,32 C18.58,32,20.68,29.91,20.68,27.32 C20.68,27.32,20.68,21.42,20.68,21.42 C20.68,18.43,18.25,16,15.26,16 C15.26,16,7.48,16,7.48,16 z\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M17,29 C17,29,33,29,33,29 C33,29,33,29,33,29 C33,34.52,28.52,39,23,39 C23,39,23,39,23,39 C19.69,39,17,36.31,17,33 C17,33,17,29,17,29 z\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M40.52,16 C43.55,16,46,18.45,46,21.48 C46,21.48,46,21.48,46,21.48 C46,23.98,43.98,26,41.48,26 C41.48,26,41.38,26,41.38,26 C40.62,26,40,26.62,40,27.38 C40,27.38,40,27.38,40,27.38 C40,29.93,37.93,32,35.38,32 C35.38,32,32,32,32,32 C29.42,32,27.32,29.91,27.32,27.32 C27.32,27.32,27.32,21.42,27.32,21.42 C27.32,18.43,29.75,16,32.74,16 C32.74,16,40.52,16,40.52,16 z\\\"/><g><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M6,10.18 C6,7.87,7.79,6,10,6 C10,6,32,6,32,6 C34.21,6,36,7.87,36,10.18 C36,10.18,36,24.82,36,24.82 C36,27.13,34.21,29,32,29 C32,29,10,29,10,29 C7.79,29,6,27.13,6,24.82 C6,24.82,6,10.18,6,10.18 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M21,11 C21,11,21,23,21,23\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M25,15 C25,15,25,17,25,17\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:2;\\\" d=\\\"M17,15 C17,15,17,17,17,17\\\"/></g></g></g></svg> \",\n tosi: \"<svg class=\\\"color\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,5.00,15.25,5.00,17.25 C5.00,19.25,8.00,19.25,8.00,19.25\\\"/><path style=\\\"fill:#9e9e9e;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,14.25 C16.00,14.25,19.00,15.25,19.00,17.25 C19.00,19.25,16.00,19.25,16.00,19.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M4.50,4.85 C4.50,3.69,5.40,2.75,6.50,2.75 C6.50,2.75,17.50,2.75,17.50,2.75 C18.61,2.75,19.50,3.69,19.50,4.85 C19.50,4.85,19.50,12.16,19.50,12.16 C19.50,13.32,18.61,14.25,17.50,14.25 C17.50,14.25,6.50,14.25,6.50,14.25 C5.40,14.25,4.50,13.32,4.50,12.16 C4.50,12.16,4.50,4.85,4.50,4.85 z\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M12.00,5.25 C12.00,5.25,12.00,11.25,12.00,11.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M14.00,7.25 C14.00,7.25,14.00,8.25,14.00,8.25\\\"/><path style=\\\"fill:#ffffff;fill-rule:nonzero;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,7.25 C10.00,7.25,10.00,8.25,10.00,8.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M16.00,21.25 C16.00,21.25,15.00,20.25,15.00,20.25 C15.00,20.25,14.00,21.25,14.00,21.25\\\"/><path style=\\\"fill:none;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M10.00,21.25 C10.00,21.25,9.00,20.25,9.00,20.25 C9.00,20.25,8.00,21.25,8.00,21.25\\\"/><path style=\\\"fill:#e4e4e4;fill-rule:evenodd;stroke:#000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-width:1;\\\" d=\\\"M8.00,14.25 C8.00,14.25,16.00,14.25,16.00,14.25 C16.00,14.25,16.00,19.25,16.00,19.25 C16.00,19.25,8.00,19.25,8.00,19.25 C8.00,19.25,8.00,14.25,8.00,14.25 z\\\"/></g></svg> \",\n sortDescending: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path d=\\\"M16.5,14.5 C16.5,14.5,7.5,14.5,7.5,14.5\\\"/><path d=\\\"M14.5,18.5 C14.5,18.5,9.5,18.5,9.5,18.5\\\"/><path d=\\\"M18.5,10.5 C18.5,10.5,5.5,10.5,5.5,10.5\\\"/><path d=\\\"M20.5,6.5 C20.5,6.5,3.5,6.5,3.5,6.5\\\"/></g></svg> \",\n columns: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 3h7a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-7m0-18H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h7m0-18v18\\\"></path></svg>\",\n underline: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\\\"></path><line x1=\\\"4\\\" y1=\\\"21\\\" x2=\\\"20\\\" y2=\\\"21\\\"></line></svg>\",\n grid: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"7\\\" height=\\\"7\\\"></rect><rect x=\\\"14\\\" y=\\\"3\\\" width=\\\"7\\\" height=\\\"7\\\"></rect><rect x=\\\"14\\\" y=\\\"14\\\" width=\\\"7\\\" height=\\\"7\\\"></rect><rect x=\\\"3\\\" y=\\\"14\\\" width=\\\"7\\\" height=\\\"7\\\"></rect></svg>\",\n triangle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\\\"></path></svg>\",\n search: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"></circle><line x1=\\\"21\\\" y1=\\\"21\\\" x2=\\\"16.65\\\" y2=\\\"16.65\\\"></line></svg>\",\n volume2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon><path d=\\\"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\\\"></path></svg>\",\n arrowUpCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"16 12 12 8 8 12\\\"></polyline><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line></svg>\",\n pauseCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"10\\\" y1=\\\"15\\\" x2=\\\"10\\\" y2=\\\"9\\\"></line><line x1=\\\"14\\\" y1=\\\"15\\\" x2=\\\"14\\\" y2=\\\"9\\\"></line></svg>\",\n checkSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 11 12 14 22 4\\\"></polyline><path d=\\\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\\\"></path></svg>\",\n arrowDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"5\\\" x2=\\\"12\\\" y2=\\\"19\\\"></line><polyline points=\\\"19 12 12 19 5 12\\\"></polyline></svg>\",\n figma: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 5.5A3.5 3.5 0 0 1 8.5 2H12v7H8.5A3.5 3.5 0 0 1 5 5.5z\\\"></path><path d=\\\"M12 2h3.5a3.5 3.5 0 1 1 0 7H12V2z\\\"></path><path d=\\\"M12 12.5a3.5 3.5 0 1 1 7 0 3.5 3.5 0 1 1-7 0z\\\"></path><path d=\\\"M5 19.5A3.5 3.5 0 0 1 8.5 16H12v3.5a3.5 3.5 0 1 1-7 0z\\\"></path><path d=\\\"M5 12.5A3.5 3.5 0 0 1 8.5 9H12v7H8.5A3.5 3.5 0 0 1 5 12.5z\\\"></path></svg>\",\n cornerRightUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"10 9 15 4 20 9\\\"></polyline><path d=\\\"M4 20h7a4 4 0 0 0 4-4V4\\\"></path></svg>\",\n chevronsRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"13 17 18 12 13 7\\\"></polyline><polyline points=\\\"6 17 11 12 6 7\\\"></polyline></svg>\",\n list: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"8\\\" y1=\\\"6\\\" x2=\\\"21\\\" y2=\\\"6\\\"></line><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"21\\\" y2=\\\"12\\\"></line><line x1=\\\"8\\\" y1=\\\"18\\\" x2=\\\"21\\\" y2=\\\"18\\\"></line><line x1=\\\"3\\\" y1=\\\"6\\\" x2=\\\"3.01\\\" y2=\\\"6\\\"></line><line x1=\\\"3\\\" y1=\\\"12\\\" x2=\\\"3.01\\\" y2=\\\"12\\\"></line><line x1=\\\"3\\\" y1=\\\"18\\\" x2=\\\"3.01\\\" y2=\\\"18\\\"></line></svg>\",\n chevronsDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"7 13 12 18 17 13\\\"></polyline><polyline points=\\\"7 6 12 11 17 6\\\"></polyline></svg>\",\n wind: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9.59 4.59A2 2 0 1 1 11 8H2m10.59 11.41A2 2 0 1 0 14 16H2m15.73-8.27A2.5 2.5 0 1 1 19.5 12H2\\\"></path></svg>\",\n cornerUpRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 14 20 9 15 4\\\"></polyline><path d=\\\"M4 20v-7a4 4 0 0 1 4-4h12\\\"></path></svg>\",\n target: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"6\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"2\\\"></circle></svg>\",\n scissors: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"6\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><line x1=\\\"20\\\" y1=\\\"4\\\" x2=\\\"8.12\\\" y2=\\\"15.88\\\"></line><line x1=\\\"14.47\\\" y1=\\\"14.48\\\" x2=\\\"20\\\" y2=\\\"20\\\"></line><line x1=\\\"8.12\\\" y1=\\\"8.12\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n minimize2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"4 14 10 14 10 20\\\"></polyline><polyline points=\\\"20 10 14 10 14 4\\\"></polyline><line x1=\\\"14\\\" y1=\\\"10\\\" x2=\\\"21\\\" y2=\\\"3\\\"></line><line x1=\\\"3\\\" y1=\\\"21\\\" x2=\\\"10\\\" y2=\\\"14\\\"></line></svg>\",\n playCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polygon points=\\\"10 8 16 12 10 16 10 8\\\"></polygon></svg>\",\n crosshair: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"22\\\" y1=\\\"12\\\" x2=\\\"18\\\" y2=\\\"12\\\"></line><line x1=\\\"6\\\" y1=\\\"12\\\" x2=\\\"2\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"6\\\" x2=\\\"12\\\" y2=\\\"2\\\"></line><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"18\\\"></line></svg>\",\n airplay: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-1\\\"></path><polygon points=\\\"12 15 17 21 7 21 12 15\\\"></polygon></svg>\",\n xOctagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\\\"></polygon><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n repeat: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"17 1 21 5 17 9\\\"></polyline><path d=\\\"M3 11V9a4 4 0 0 1 4-4h14\\\"></path><polyline points=\\\"7 23 3 19 7 15\\\"></polyline><path d=\\\"M21 13v2a4 4 0 0 1-4 4H3\\\"></path></svg>\",\n edit3: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 20h9\\\"></path><path d=\\\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\\\"></path></svg>\",\n volume1: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon><path d=\\\"M15.54 8.46a5 5 0 0 1 0 7.07\\\"></path></svg>\",\n sunrise: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 18a5 5 0 0 0-10 0\\\"></path><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"9\\\"></line><line x1=\\\"4.22\\\" y1=\\\"10.22\\\" x2=\\\"5.64\\\" y2=\\\"11.64\\\"></line><line x1=\\\"1\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"23\\\" y2=\\\"18\\\"></line><line x1=\\\"18.36\\\" y1=\\\"11.64\\\" x2=\\\"19.78\\\" y2=\\\"10.22\\\"></line><line x1=\\\"23\\\" y1=\\\"22\\\" x2=\\\"1\\\" y2=\\\"22\\\"></line><polyline points=\\\"8 6 12 2 16 6\\\"></polyline></svg>\",\n toggleRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"5\\\" width=\\\"22\\\" height=\\\"14\\\" rx=\\\"7\\\" ry=\\\"7\\\"></rect><circle cx=\\\"16\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n umbrella: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M23 12a11.05 11.05 0 0 0-22 0zm-5 7a3 3 0 0 1-6 0v-7\\\"></path></svg>\",\n user: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"12\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle></svg>\",\n fileMinus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\\\"></path><polyline points=\\\"14 2 14 8 20 8\\\"></polyline><line x1=\\\"9\\\" y1=\\\"15\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n xCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n circle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle></svg>\",\n phoneMissed: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"23\\\" y1=\\\"1\\\" x2=\\\"17\\\" y2=\\\"7\\\"></line><line x1=\\\"17\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"7\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n edit2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 3a2.83 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z\\\"></path></svg>\",\n cornerLeftUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"14 9 9 4 4 9\\\"></polyline><path d=\\\"M20 20h-7a4 4 0 0 1-4-4V4\\\"></path></svg>\",\n home: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\\\"></path><polyline points=\\\"9 22 9 12 15 12 15 22\\\"></polyline></svg>\",\n gitlab: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z\\\"></path></svg>\",\n music: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 18V5l12-2v13\\\"></path><circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><circle cx=\\\"18\\\" cy=\\\"16\\\" r=\\\"3\\\"></circle></svg>\",\n smartphone: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"5\\\" y=\\\"2\\\" width=\\\"14\\\" height=\\\"20\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12.01\\\" y2=\\\"18\\\"></line></svg>\",\n moreHorizontal: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle><circle cx=\\\"19\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle><circle cx=\\\"5\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle></svg>\",\n sliders: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"4\\\" y1=\\\"21\\\" x2=\\\"4\\\" y2=\\\"14\\\"></line><line x1=\\\"4\\\" y1=\\\"10\\\" x2=\\\"4\\\" y2=\\\"3\\\"></line><line x1=\\\"12\\\" y1=\\\"21\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"3\\\"></line><line x1=\\\"20\\\" y1=\\\"21\\\" x2=\\\"20\\\" y2=\\\"16\\\"></line><line x1=\\\"20\\\" y1=\\\"12\\\" x2=\\\"20\\\" y2=\\\"3\\\"></line><line x1=\\\"1\\\" y1=\\\"14\\\" x2=\\\"7\\\" y2=\\\"14\\\"></line><line x1=\\\"9\\\" y1=\\\"8\\\" x2=\\\"15\\\" y2=\\\"8\\\"></line><line x1=\\\"17\\\" y1=\\\"16\\\" x2=\\\"23\\\" y2=\\\"16\\\"></line></svg>\",\n arrowUpLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"17\\\" y1=\\\"17\\\" x2=\\\"7\\\" y2=\\\"7\\\"></line><polyline points=\\\"7 17 7 7 17 7\\\"></polyline></svg>\",\n chevronDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"6 9 12 15 18 9\\\"></polyline></svg>\",\n hexagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path></svg>\",\n github: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22\\\"></path></svg>\",\n crop: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6.13 1L6 16a2 2 0 0 0 2 2h15\\\"></path><path d=\\\"M1 6.13L16 6a2 2 0 0 1 2 2v15\\\"></path></svg>\",\n tag: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z\\\"></path><line x1=\\\"7\\\" y1=\\\"7\\\" x2=\\\"7.01\\\" y2=\\\"7\\\"></line></svg>\",\n briefcase: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"7\\\" width=\\\"20\\\" height=\\\"14\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\\\"></path></svg>\",\n rotateCw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 4 23 10 17 10\\\"></polyline><path d=\\\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\\\"></path></svg>\",\n map: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6\\\"></polygon><line x1=\\\"8\\\" y1=\\\"2\\\" x2=\\\"8\\\" y2=\\\"18\\\"></line><line x1=\\\"16\\\" y1=\\\"6\\\" x2=\\\"16\\\" y2=\\\"22\\\"></line></svg>\",\n inbox: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"22 12 16 12 14 15 10 15 8 12 2 12\\\"></polyline><path d=\\\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\\\"></path></svg>\",\n alignJustify: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"21\\\" y1=\\\"10\\\" x2=\\\"3\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line></svg>\",\n plusSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n power: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18.36 6.64a9 9 0 1 1-12.73 0\\\"></path><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n database: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><ellipse cx=\\\"12\\\" cy=\\\"5\\\" rx=\\\"9\\\" ry=\\\"3\\\"></ellipse><path d=\\\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\\\"></path><path d=\\\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\\\"></path></svg>\",\n cameraOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line><path d=\\\"M21 21H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3m3-3h6l2 3h4a2 2 0 0 1 2 2v9.34m-7.72-2.06a4 4 0 1 1-5.56-5.56\\\"></path></svg>\",\n toggleLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"5\\\" width=\\\"22\\\" height=\\\"14\\\" rx=\\\"7\\\" ry=\\\"7\\\"></rect><circle cx=\\\"8\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n file: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z\\\"></path><polyline points=\\\"13 2 13 9 20 9\\\"></polyline></svg>\",\n messageCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\\\"></path></svg>\",\n voicemail: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"5.5\\\" cy=\\\"11.5\\\" r=\\\"4.5\\\"></circle><circle cx=\\\"18.5\\\" cy=\\\"11.5\\\" r=\\\"4.5\\\"></circle><line x1=\\\"5.5\\\" y1=\\\"16\\\" x2=\\\"18.5\\\" y2=\\\"16\\\"></line></svg>\",\n terminal: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"4 17 10 11 4 5\\\"></polyline><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"20\\\" y2=\\\"19\\\"></line></svg>\",\n move: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"5 9 2 12 5 15\\\"></polyline><polyline points=\\\"9 5 12 2 15 5\\\"></polyline><polyline points=\\\"15 19 12 22 9 19\\\"></polyline><polyline points=\\\"19 9 22 12 19 15\\\"></polyline><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"22\\\"></line></svg>\",\n maximize: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\\\"></path></svg>\",\n chevronUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"18 15 12 9 6 15\\\"></polyline></svg>\",\n arrowDownLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"17\\\" y1=\\\"7\\\" x2=\\\"7\\\" y2=\\\"17\\\"></line><polyline points=\\\"17 17 7 17 7 7\\\"></polyline></svg>\",\n fileText: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\\\"></path><polyline points=\\\"14 2 14 8 20 8\\\"></polyline><line x1=\\\"16\\\" y1=\\\"13\\\" x2=\\\"8\\\" y2=\\\"13\\\"></line><line x1=\\\"16\\\" y1=\\\"17\\\" x2=\\\"8\\\" y2=\\\"17\\\"></line><polyline points=\\\"10 9 9 9 8 9\\\"></polyline></svg>\",\n droplet: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z\\\"></path></svg>\",\n zapOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"12.41 6.75 13 2 10.57 4.92\\\"></polyline><polyline points=\\\"18.57 12.91 21 10 15.66 10\\\"></polyline><polyline points=\\\"8 8 3 14 12 14 11 22 16 16\\\"></polyline><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n x: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"18\\\" y1=\\\"6\\\" x2=\\\"6\\\" y2=\\\"18\\\"></line><line x1=\\\"6\\\" y1=\\\"6\\\" x2=\\\"18\\\" y2=\\\"18\\\"></line></svg>\",\n barChart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12\\\" y2=\\\"10\\\"></line><line x1=\\\"18\\\" y1=\\\"20\\\" x2=\\\"18\\\" y2=\\\"4\\\"></line><line x1=\\\"6\\\" y1=\\\"20\\\" x2=\\\"6\\\" y2=\\\"16\\\"></line></svg>\",\n lock: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"11\\\" width=\\\"18\\\" height=\\\"11\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M7 11V7a5 5 0 0 1 10 0v4\\\"></path></svg>\",\n logIn: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\\\"></path><polyline points=\\\"10 17 15 12 10 7\\\"></polyline><line x1=\\\"15\\\" y1=\\\"12\\\" x2=\\\"3\\\" y2=\\\"12\\\"></line></svg>\",\n shoppingBag: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z\\\"></path><line x1=\\\"3\\\" y1=\\\"6\\\" x2=\\\"21\\\" y2=\\\"6\\\"></line><path d=\\\"M16 10a4 4 0 0 1-8 0\\\"></path></svg>\",\n divide: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"6\\\" r=\\\"2\\\"></circle><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line><circle cx=\\\"12\\\" cy=\\\"18\\\" r=\\\"2\\\"></circle></svg>\",\n cloudDrizzle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"8\\\" y1=\\\"19\\\" x2=\\\"8\\\" y2=\\\"21\\\"></line><line x1=\\\"8\\\" y1=\\\"13\\\" x2=\\\"8\\\" y2=\\\"15\\\"></line><line x1=\\\"16\\\" y1=\\\"19\\\" x2=\\\"16\\\" y2=\\\"21\\\"></line><line x1=\\\"16\\\" y1=\\\"13\\\" x2=\\\"16\\\" y2=\\\"15\\\"></line><line x1=\\\"12\\\" y1=\\\"21\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"12\\\" y1=\\\"15\\\" x2=\\\"12\\\" y2=\\\"17\\\"></line><path d=\\\"M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25\\\"></path></svg>\",\n refreshCw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 4 23 10 17 10\\\"></polyline><polyline points=\\\"1 20 1 14 7 14\\\"></polyline><path d=\\\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\\\"></path></svg>\",\n chevronRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 18 15 12 9 6\\\"></polyline></svg>\",\n clipboard: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\\\"></path><rect x=\\\"8\\\" y=\\\"2\\\" width=\\\"8\\\" height=\\\"4\\\" rx=\\\"1\\\" ry=\\\"1\\\"></rect></svg>\",\n package: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"16.5\\\" y1=\\\"9.4\\\" x2=\\\"7.5\\\" y2=\\\"4.21\\\"></line><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path><polyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"></polyline><line x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n instagram: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"20\\\" height=\\\"20\\\" rx=\\\"5\\\" ry=\\\"5\\\"></rect><path d=\\\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\\\"></path><line x1=\\\"17.5\\\" y1=\\\"6.5\\\" x2=\\\"17.51\\\" y2=\\\"6.5\\\"></line></svg>\",\n link: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\\\"></path><path d=\\\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\\\"></path></svg>\",\n videoOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 16v1a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h2m5.66 0H14a2 2 0 0 1 2 2v3.34l1 1L23 7v10\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n key: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.78 7.78 5.5 5.5 0 0 1 7.78-7.78zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4\\\"></path></svg>\",\n meh: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"8\\\" y1=\\\"15\\\" x2=\\\"16\\\" y2=\\\"15\\\"></line><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"9.01\\\" y2=\\\"9\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"15.01\\\" y2=\\\"9\\\"></line></svg>\",\n cornerDownRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 10 20 15 15 20\\\"></polyline><path d=\\\"M4 4v7a4 4 0 0 0 4 4h12\\\"></path></svg>\",\n arrowRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line><polyline points=\\\"12 5 19 12 12 19\\\"></polyline></svg>\",\n aperture: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"14.31\\\" y1=\\\"8\\\" x2=\\\"20.05\\\" y2=\\\"17.94\\\"></line><line x1=\\\"9.69\\\" y1=\\\"8\\\" x2=\\\"21.17\\\" y2=\\\"8\\\"></line><line x1=\\\"7.38\\\" y1=\\\"12\\\" x2=\\\"13.12\\\" y2=\\\"2.06\\\"></line><line x1=\\\"9.69\\\" y1=\\\"16\\\" x2=\\\"3.95\\\" y2=\\\"6.06\\\"></line><line x1=\\\"14.31\\\" y1=\\\"16\\\" x2=\\\"2.83\\\" y2=\\\"16\\\"></line><line x1=\\\"16.62\\\" y1=\\\"12\\\" x2=\\\"10.88\\\" y2=\\\"21.94\\\"></line></svg>\",\n stopCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"6\\\" height=\\\"6\\\"></rect></svg>\",\n logOut: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\\\"></path><polyline points=\\\"16 17 21 12 16 7\\\"></polyline><line x1=\\\"21\\\" y1=\\\"12\\\" x2=\\\"9\\\" y2=\\\"12\\\"></line></svg>\",\n arrowLeftCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"12 8 8 12 12 16\\\"></polyline><line x1=\\\"16\\\" y1=\\\"12\\\" x2=\\\"8\\\" y2=\\\"12\\\"></line></svg>\",\n barChart2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"18\\\" y1=\\\"20\\\" x2=\\\"18\\\" y2=\\\"10\\\"></line><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12\\\" y2=\\\"4\\\"></line><line x1=\\\"6\\\" y1=\\\"20\\\" x2=\\\"6\\\" y2=\\\"14\\\"></line></svg>\",\n gitPullRequest: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"18\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><path d=\\\"M13 6h3a2 2 0 0 1 2 2v7\\\"></path><line x1=\\\"6\\\" y1=\\\"9\\\" x2=\\\"6\\\" y2=\\\"21\\\"></line></svg>\",\n minimize: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\\\"></path></svg>\",\n minusSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n settings: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle><path d=\\\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\\\"></path></svg>\",\n cloudSnow: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20 17.58A5 5 0 0 0 18 8h-1.26A8 8 0 1 0 4 16.25\\\"></path><line x1=\\\"8\\\" y1=\\\"16\\\" x2=\\\"8.01\\\" y2=\\\"16\\\"></line><line x1=\\\"8\\\" y1=\\\"20\\\" x2=\\\"8.01\\\" y2=\\\"20\\\"></line><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12.01\\\" y2=\\\"18\\\"></line><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12.01\\\" y2=\\\"22\\\"></line><line x1=\\\"16\\\" y1=\\\"16\\\" x2=\\\"16.01\\\" y2=\\\"16\\\"></line><line x1=\\\"16\\\" y1=\\\"20\\\" x2=\\\"16.01\\\" y2=\\\"20\\\"></line></svg>\",\n thumbsDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\\\"></path></svg>\",\n type: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"4 7 4 4 20 4 20 7\\\"></polyline><line x1=\\\"9\\\" y1=\\\"20\\\" x2=\\\"15\\\" y2=\\\"20\\\"></line><line x1=\\\"12\\\" y1=\\\"4\\\" x2=\\\"12\\\" y2=\\\"20\\\"></line></svg>\",\n archive: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"21 8 21 21 3 21 3 8\\\"></polyline><rect x=\\\"1\\\" y=\\\"3\\\" width=\\\"22\\\" height=\\\"5\\\"></rect><line x1=\\\"10\\\" y1=\\\"12\\\" x2=\\\"14\\\" y2=\\\"12\\\"></line></svg>\",\n phoneOutgoing: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 7 23 1 17 1\\\"></polyline><line x1=\\\"16\\\" y1=\\\"8\\\" x2=\\\"23\\\" y2=\\\"1\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n pocket: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 3h16a2 2 0 0 1 2 2v6a10 10 0 0 1-10 10A10 10 0 0 1 2 11V5a2 2 0 0 1 2-2z\\\"></path><polyline points=\\\"8 10 12 14 16 10\\\"></polyline></svg>\",\n mail: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\\\"></path><polyline points=\\\"22,6 12,13 2,6\\\"></polyline></svg>\",\n shield: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\\\"></path></svg>\",\n download: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"></path><polyline points=\\\"7 10 12 15 17 10\\\"></polyline><line x1=\\\"12\\\" y1=\\\"15\\\" x2=\\\"12\\\" y2=\\\"3\\\"></line></svg>\",\n phoneForwarded: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"19 1 23 5 19 9\\\"></polyline><line x1=\\\"15\\\" y1=\\\"5\\\" x2=\\\"23\\\" y2=\\\"5\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n cornerRightDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"10 15 15 20 20 15\\\"></polyline><path d=\\\"M4 4h7a4 4 0 0 1 4 4v12\\\"></path></svg>\",\n bookOpen: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\\\"></path><path d=\\\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\\\"></path></svg>\",\n divideSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line></svg>\",\n server: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"20\\\" height=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><rect x=\\\"2\\\" y=\\\"14\\\" width=\\\"20\\\" height=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"6\\\" y1=\\\"6\\\" x2=\\\"6.01\\\" y2=\\\"6\\\"></line><line x1=\\\"6\\\" y1=\\\"18\\\" x2=\\\"6.01\\\" y2=\\\"18\\\"></line></svg>\",\n tv: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"7\\\" width=\\\"20\\\" height=\\\"15\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><polyline points=\\\"17 2 12 7 7 2\\\"></polyline></svg>\",\n skipForward: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"5 4 15 12 5 20 5 4\\\"></polygon><line x1=\\\"19\\\" y1=\\\"5\\\" x2=\\\"19\\\" y2=\\\"19\\\"></line></svg>\",\n volume: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon></svg>\",\n userPlus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><line x1=\\\"20\\\" y1=\\\"8\\\" x2=\\\"20\\\" y2=\\\"14\\\"></line><line x1=\\\"23\\\" y1=\\\"11\\\" x2=\\\"17\\\" y2=\\\"11\\\"></line></svg>\",\n batteryCharging: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 18H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h3.19M15 6h2a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-3.19\\\"></path><line x1=\\\"23\\\" y1=\\\"13\\\" x2=\\\"23\\\" y2=\\\"11\\\"></line><polyline points=\\\"11 6 7 12 13 12 9 18\\\"></polyline></svg>\",\n layers: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 2 7 12 12 22 7 12 2\\\"></polygon><polyline points=\\\"2 17 12 22 22 17\\\"></polyline><polyline points=\\\"2 12 12 17 22 12\\\"></polyline></svg>\",\n slash: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"4.93\\\" y1=\\\"4.93\\\" x2=\\\"19.07\\\" y2=\\\"19.07\\\"></line></svg>\",\n radio: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"2\\\"></circle><path d=\\\"M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14\\\"></path></svg>\",\n book: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\\\"></path><path d=\\\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z\\\"></path></svg>\",\n userMinus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><line x1=\\\"23\\\" y1=\\\"11\\\" x2=\\\"17\\\" y2=\\\"11\\\"></line></svg>\",\n bell: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\\\"></path><path d=\\\"M13.73 21a2 2 0 0 1-3.46 0\\\"></path></svg>\",\n gitBranch: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"6\\\" y1=\\\"3\\\" x2=\\\"6\\\" y2=\\\"15\\\"></line><circle cx=\\\"18\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><path d=\\\"M18 9a9 9 0 0 1-9 9\\\"></path></svg>\",\n coffee: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 8h1a4 4 0 0 1 0 8h-1\\\"></path><path d=\\\"M2 8h16v9a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4V8z\\\"></path><line x1=\\\"6\\\" y1=\\\"1\\\" x2=\\\"6\\\" y2=\\\"4\\\"></line><line x1=\\\"10\\\" y1=\\\"1\\\" x2=\\\"10\\\" y2=\\\"4\\\"></line><line x1=\\\"14\\\" y1=\\\"1\\\" x2=\\\"14\\\" y2=\\\"4\\\"></line></svg>\",\n code: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 18 22 12 16 6\\\"></polyline><polyline points=\\\"8 6 2 12 8 18\\\"></polyline></svg>\",\n thermometer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 14.76V3.5a2.5 2.5 0 0 0-5 0v11.26a4.5 4.5 0 1 0 5 0z\\\"></path></svg>\",\n cast: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M2 16.1A5 5 0 0 1 5.9 20M2 12.05A9 9 0 0 1 9.95 20M2 8V6a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-6\\\"></path><line x1=\\\"2\\\" y1=\\\"20\\\" x2=\\\"2.01\\\" y2=\\\"20\\\"></line></svg>\",\n flag: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z\\\"></path><line x1=\\\"4\\\" y1=\\\"22\\\" x2=\\\"4\\\" y2=\\\"15\\\"></line></svg>\",\n eyeOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n battery: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"6\\\" width=\\\"18\\\" height=\\\"12\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"23\\\" y1=\\\"13\\\" x2=\\\"23\\\" y2=\\\"11\\\"></line></svg>\",\n disc: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n frown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M16 16s-1.5-2-4-2-4 2-4 2\\\"></path><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"9.01\\\" y2=\\\"9\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"15.01\\\" y2=\\\"9\\\"></line></svg>\",\n tool: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\\\"></path></svg>\",\n cpu: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"4\\\" y=\\\"4\\\" width=\\\"16\\\" height=\\\"16\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"6\\\" height=\\\"6\\\"></rect><line x1=\\\"9\\\" y1=\\\"1\\\" x2=\\\"9\\\" y2=\\\"4\\\"></line><line x1=\\\"15\\\" y1=\\\"1\\\" x2=\\\"15\\\" y2=\\\"4\\\"></line><line x1=\\\"9\\\" y1=\\\"20\\\" x2=\\\"9\\\" y2=\\\"23\\\"></line><line x1=\\\"15\\\" y1=\\\"20\\\" x2=\\\"15\\\" y2=\\\"23\\\"></line><line x1=\\\"20\\\" y1=\\\"9\\\" x2=\\\"23\\\" y2=\\\"9\\\"></line><line x1=\\\"20\\\" y1=\\\"14\\\" x2=\\\"23\\\" y2=\\\"14\\\"></line><line x1=\\\"1\\\" y1=\\\"9\\\" x2=\\\"4\\\" y2=\\\"9\\\"></line><line x1=\\\"1\\\" y1=\\\"14\\\" x2=\\\"4\\\" y2=\\\"14\\\"></line></svg>\",\n bold: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\\\"></path><path d=\\\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\\\"></path></svg>\",\n hash: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"4\\\" y1=\\\"9\\\" x2=\\\"20\\\" y2=\\\"9\\\"></line><line x1=\\\"4\\\" y1=\\\"15\\\" x2=\\\"20\\\" y2=\\\"15\\\"></line><line x1=\\\"10\\\" y1=\\\"3\\\" x2=\\\"8\\\" y2=\\\"21\\\"></line><line x1=\\\"16\\\" y1=\\\"3\\\" x2=\\\"14\\\" y2=\\\"21\\\"></line></svg>\",\n share2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"18\\\" cy=\\\"5\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle><circle cx=\\\"18\\\" cy=\\\"19\\\" r=\\\"3\\\"></circle><line x1=\\\"8.59\\\" y1=\\\"13.51\\\" x2=\\\"15.42\\\" y2=\\\"17.49\\\"></line><line x1=\\\"15.41\\\" y1=\\\"6.51\\\" x2=\\\"8.59\\\" y2=\\\"10.49\\\"></line></svg>\",\n plus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"5\\\" x2=\\\"12\\\" y2=\\\"19\\\"></line><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line></svg>\",\n check: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"20 6 9 17 4 12\\\"></polyline></svg>\",\n rotateCcw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"1 4 1 10 7 10\\\"></polyline><path d=\\\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\\\"></path></svg>\",\n hardDrive: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"22\\\" y1=\\\"12\\\" x2=\\\"2\\\" y2=\\\"12\\\"></line><path d=\\\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\\\"></path><line x1=\\\"6\\\" y1=\\\"16\\\" x2=\\\"6.01\\\" y2=\\\"16\\\"></line><line x1=\\\"10\\\" y1=\\\"16\\\" x2=\\\"10.01\\\" y2=\\\"16\\\"></line></svg>\",\n bluetooth: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"6.5 6.5 17.5 17.5 12 23 12 1 17.5 6.5 6.5 17.5\\\"></polyline></svg>\",\n pieChart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21.21 15.89A10 10 0 1 1 8 2.83\\\"></path><path d=\\\"M22 12A10 10 0 0 0 12 2v10z\\\"></path></svg>\",\n headphones: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M3 18v-6a9 9 0 0 1 18 0v6\\\"></path><path d=\\\"M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z\\\"></path></svg>\",\n rss: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 11a9 9 0 0 1 9 9\\\"></path><path d=\\\"M4 4a16 16 0 0 1 16 16\\\"></path><circle cx=\\\"5\\\" cy=\\\"19\\\" r=\\\"1\\\"></circle></svg>\",\n wifi: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 12.55a11 11 0 0 1 14.08 0\\\"></path><path d=\\\"M1.42 9a16 16 0 0 1 21.16 0\\\"></path><path d=\\\"M8.53 16.11a6 6 0 0 1 6.95 0\\\"></path><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12.01\\\" y2=\\\"20\\\"></line></svg>\",\n cornerUpLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 14 4 9 9 4\\\"></polyline><path d=\\\"M20 20v-7a4 4 0 0 0-4-4H4\\\"></path></svg>\",\n watch: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"7\\\"></circle><polyline points=\\\"12 9 12 12 13.5 13.5\\\"></polyline><path d=\\\"M16.51 17.35l-.35 3.83a2 2 0 0 1-2 1.82H9.83a2 2 0 0 1-2-1.82l-.35-3.83m.01-10.7l.35-3.83A2 2 0 0 1 9.83 1h4.35a2 2 0 0 1 2 1.82l.35 3.83\\\"></path></svg>\",\n info: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12.01\\\" y2=\\\"8\\\"></line></svg>\",\n userX: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><line x1=\\\"18\\\" y1=\\\"8\\\" x2=\\\"23\\\" y2=\\\"13\\\"></line><line x1=\\\"23\\\" y1=\\\"8\\\" x2=\\\"18\\\" y2=\\\"13\\\"></line></svg>\",\n loader: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"6\\\"></line><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12\\\" y2=\\\"22\\\"></line><line x1=\\\"4.93\\\" y1=\\\"4.93\\\" x2=\\\"7.76\\\" y2=\\\"7.76\\\"></line><line x1=\\\"16.24\\\" y1=\\\"16.24\\\" x2=\\\"19.07\\\" y2=\\\"19.07\\\"></line><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"6\\\" y2=\\\"12\\\"></line><line x1=\\\"18\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><line x1=\\\"4.93\\\" y1=\\\"19.07\\\" x2=\\\"7.76\\\" y2=\\\"16.24\\\"></line><line x1=\\\"16.24\\\" y1=\\\"7.76\\\" x2=\\\"19.07\\\" y2=\\\"4.93\\\"></line></svg>\",\n refreshCcw: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"1 4 1 10 7 10\\\"></polyline><polyline points=\\\"23 20 23 14 17 14\\\"></polyline><path d=\\\"M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15\\\"></path></svg>\",\n folderPlus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\\\"></path><line x1=\\\"12\\\" y1=\\\"11\\\" x2=\\\"12\\\" y2=\\\"17\\\"></line><line x1=\\\"9\\\" y1=\\\"14\\\" x2=\\\"15\\\" y2=\\\"14\\\"></line></svg>\",\n gitMerge: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"18\\\" cy=\\\"18\\\" r=\\\"3\\\"></circle><circle cx=\\\"6\\\" cy=\\\"6\\\" r=\\\"3\\\"></circle><path d=\\\"M6 21V9a9 9 0 0 0 9 9\\\"></path></svg>\",\n mic: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\\\"></path><path d=\\\"M19 10v2a7 7 0 0 1-14 0v-2\\\"></path><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"8\\\" y1=\\\"23\\\" x2=\\\"16\\\" y2=\\\"23\\\"></line></svg>\",\n copy: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"13\\\" height=\\\"13\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\\\"></path></svg>\",\n zoomIn: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"></circle><line x1=\\\"21\\\" y1=\\\"21\\\" x2=\\\"16.65\\\" y2=\\\"16.65\\\"></line><line x1=\\\"11\\\" y1=\\\"8\\\" x2=\\\"11\\\" y2=\\\"14\\\"></line><line x1=\\\"8\\\" y1=\\\"11\\\" x2=\\\"14\\\" y2=\\\"11\\\"></line></svg>\",\n arrowRightCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"12 16 16 12 12 8\\\"></polyline><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n alignRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"21\\\" y1=\\\"10\\\" x2=\\\"7\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"7\\\" y2=\\\"18\\\"></line></svg>\",\n image: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><circle cx=\\\"8.5\\\" cy=\\\"8.5\\\" r=\\\"1.5\\\"></circle><polyline points=\\\"21 15 16 10 5 21\\\"></polyline></svg>\",\n maximize2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 3 21 3 21 9\\\"></polyline><polyline points=\\\"9 21 3 21 3 15\\\"></polyline><line x1=\\\"21\\\" y1=\\\"3\\\" x2=\\\"14\\\" y2=\\\"10\\\"></line><line x1=\\\"3\\\" y1=\\\"21\\\" x2=\\\"10\\\" y2=\\\"14\\\"></line></svg>\",\n checkCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 11.08V12a10 10 0 1 1-5.93-9.14\\\"></path><polyline points=\\\"22 4 12 14.01 9 11.01\\\"></polyline></svg>\",\n sunset: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 18a5 5 0 0 0-10 0\\\"></path><line x1=\\\"12\\\" y1=\\\"9\\\" x2=\\\"12\\\" y2=\\\"2\\\"></line><line x1=\\\"4.22\\\" y1=\\\"10.22\\\" x2=\\\"5.64\\\" y2=\\\"11.64\\\"></line><line x1=\\\"1\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line><line x1=\\\"21\\\" y1=\\\"18\\\" x2=\\\"23\\\" y2=\\\"18\\\"></line><line x1=\\\"18.36\\\" y1=\\\"11.64\\\" x2=\\\"19.78\\\" y2=\\\"10.22\\\"></line><line x1=\\\"23\\\" y1=\\\"22\\\" x2=\\\"1\\\" y2=\\\"22\\\"></line><polyline points=\\\"16 5 12 9 8 5\\\"></polyline></svg>\",\n save: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\\\"></path><polyline points=\\\"17 21 17 13 7 13 7 21\\\"></polyline><polyline points=\\\"7 3 7 8 15 8\\\"></polyline></svg>\",\n smile: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M8 14s1.5 2 4 2 4-2 4-2\\\"></path><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"9.01\\\" y2=\\\"9\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"15.01\\\" y2=\\\"9\\\"></line></svg>\",\n navigation: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"3 11 22 2 13 21 11 13 3 11\\\"></polygon></svg>\",\n cloudLightning: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19 16.9A5 5 0 0 0 18 7h-1.26a8 8 0 1 0-11.62 9\\\"></path><polyline points=\\\"13 11 9 17 15 17 11 23\\\"></polyline></svg>\",\n paperclip: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\\\"></path></svg>\",\n fastForward: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"13 19 22 12 13 5 13 19\\\"></polygon><polygon points=\\\"2 19 11 12 2 5 2 19\\\"></polygon></svg>\",\n xSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line><line x1=\\\"15\\\" y1=\\\"9\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line></svg>\",\n award: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"8\\\" r=\\\"7\\\"></circle><polyline points=\\\"8.21 13.89 7 23 12 20 17 23 15.79 13.88\\\"></polyline></svg>\",\n zoomOut: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"></circle><line x1=\\\"21\\\" y1=\\\"21\\\" x2=\\\"16.65\\\" y2=\\\"16.65\\\"></line><line x1=\\\"8\\\" y1=\\\"11\\\" x2=\\\"14\\\" y2=\\\"11\\\"></line></svg>\",\n box: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path><polyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"></polyline><line x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n thumbsUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\\\"></path></svg>\",\n percent: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"19\\\" y1=\\\"5\\\" x2=\\\"5\\\" y2=\\\"19\\\"></line><circle cx=\\\"6.5\\\" cy=\\\"6.5\\\" r=\\\"2.5\\\"></circle><circle cx=\\\"17.5\\\" cy=\\\"17.5\\\" r=\\\"2.5\\\"></circle></svg>\",\n sidebar: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"9\\\" y1=\\\"3\\\" x2=\\\"9\\\" y2=\\\"21\\\"></line></svg>\",\n square: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect></svg>\",\n play: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"5 3 19 12 5 21 5 3\\\"></polygon></svg>\",\n gitCommit: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><line x1=\\\"1.05\\\" y1=\\\"12\\\" x2=\\\"7\\\" y2=\\\"12\\\"></line><line x1=\\\"17.01\\\" y1=\\\"12\\\" x2=\\\"22.96\\\" y2=\\\"12\\\"></line></svg>\",\n table: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M9 3H5a2 2 0 0 0-2 2v4m6-6h10a2 2 0 0 1 2 2v4M9 3v18m0 0h10a2 2 0 0 0 2-2V9M9 21H5a2 2 0 0 1-2-2V9m0 0h18\\\"></path></svg>\",\n send: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"22\\\" y1=\\\"2\\\" x2=\\\"11\\\" y2=\\\"13\\\"></line><polygon points=\\\"22 2 15 22 11 13 2 9 22 2\\\"></polygon></svg>\",\n phoneCall: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M15.05 5A5 5 0 0 1 19 8.95M15.05 1A9 9 0 0 1 23 8.94m-1 7.98v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n speaker: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"4\\\" y=\\\"2\\\" width=\\\"16\\\" height=\\\"20\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><circle cx=\\\"12\\\" cy=\\\"14\\\" r=\\\"4\\\"></circle><line x1=\\\"12\\\" y1=\\\"6\\\" x2=\\\"12.01\\\" y2=\\\"6\\\"></line></svg>\",\n facebook: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M464 0h-416c-26.4 0-48 21.6-48 48v416c0 26.4 21.6 48 48 48h208v-224h-64v-64h64v-32c0-52.9 43.1-96 96-96h64v64h-64c-17.6 0-32 14.4-32 32v32h96l-16 64h-80v224h144c26.4 0 48-21.6 48-48v-416c0-26.4-21.6-48-48-48z\\\"></path></svg> \",\n codesandbox: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"></path><polyline points=\\\"7.5 4.21 12 6.81 16.5 4.21\\\"></polyline><polyline points=\\\"7.5 19.79 7.5 14.6 3 12\\\"></polyline><polyline points=\\\"21 12 16.5 14.6 16.5 19.79\\\"></polyline><polyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"></polyline><line x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line></svg>\",\n camera: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\\\"></path><circle cx=\\\"12\\\" cy=\\\"13\\\" r=\\\"4\\\"></circle></svg>\",\n link2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M15 7h3a5 5 0 0 1 5 5 5 5 0 0 1-5 5h-3m-6 0H6a5 5 0 0 1-5-5 5 5 0 0 1 5-5h3\\\"></path><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n printer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"6 9 6 2 18 2 18 9\\\"></polyline><path d=\\\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\\\"></path><rect x=\\\"6\\\" y=\\\"14\\\" width=\\\"12\\\" height=\\\"8\\\"></rect></svg>\",\n folderMinus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\\\"></path><line x1=\\\"9\\\" y1=\\\"14\\\" x2=\\\"15\\\" y2=\\\"14\\\"></line></svg>\",\n arrowUpRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"7\\\" y1=\\\"17\\\" x2=\\\"17\\\" y2=\\\"7\\\"></line><polyline points=\\\"7 7 17 7 17 17\\\"></polyline></svg>\",\n truck: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"3\\\" width=\\\"15\\\" height=\\\"13\\\"></rect><polygon points=\\\"16 8 20 8 23 11 23 16 16 16 16 8\\\"></polygon><circle cx=\\\"5.5\\\" cy=\\\"18.5\\\" r=\\\"2.5\\\"></circle><circle cx=\\\"18.5\\\" cy=\\\"18.5\\\" r=\\\"2.5\\\"></circle></svg>\",\n lifeBuoy: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><line x1=\\\"4.93\\\" y1=\\\"4.93\\\" x2=\\\"9.17\\\" y2=\\\"9.17\\\"></line><line x1=\\\"14.83\\\" y1=\\\"14.83\\\" x2=\\\"19.07\\\" y2=\\\"19.07\\\"></line><line x1=\\\"14.83\\\" y1=\\\"9.17\\\" x2=\\\"19.07\\\" y2=\\\"4.93\\\"></line><line x1=\\\"14.83\\\" y1=\\\"9.17\\\" x2=\\\"18.36\\\" y2=\\\"5.64\\\"></line><line x1=\\\"4.93\\\" y1=\\\"19.07\\\" x2=\\\"9.17\\\" y2=\\\"14.83\\\"></line></svg>\",\n penTool: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M12 19l7-7 3 3-7 7-3-3z\\\"></path><path d=\\\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\\\"></path><path d=\\\"M2 2l7.59 7.59\\\"></path><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"2\\\"></circle></svg>\",\n atSign: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><path d=\\\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-3.92 7.94\\\"></path></svg>\",\n feather: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20.24 12.24a6 6 0 0 0-8.49-8.49L5 10.5V19h8.5z\\\"></path><line x1=\\\"16\\\" y1=\\\"8\\\" x2=\\\"2\\\" y2=\\\"22\\\"></line><line x1=\\\"17.5\\\" y1=\\\"15\\\" x2=\\\"9\\\" y2=\\\"15\\\"></line></svg>\",\n trash: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"3 6 5 6 21 6\\\"></polyline><path d=\\\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"></path></svg>\",\n wifiOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line><path d=\\\"M16.72 11.06A10.94 10.94 0 0 1 19 12.55\\\"></path><path d=\\\"M5 12.55a10.94 10.94 0 0 1 5.17-2.39\\\"></path><path d=\\\"M10.71 5.05A16 16 0 0 1 22.58 9\\\"></path><path d=\\\"M1.42 9a15.91 15.91 0 0 1 4.7-2.88\\\"></path><path d=\\\"M8.53 16.11a6 6 0 0 1 6.95 0\\\"></path><line x1=\\\"12\\\" y1=\\\"20\\\" x2=\\\"12.01\\\" y2=\\\"20\\\"></line></svg>\",\n cornerLeftDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"14 15 9 20 4 15\\\"></polyline><path d=\\\"M20 4h-7a4 4 0 0 0-4 4v12\\\"></path></svg>\",\n dollarSign: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"1\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><path d=\\\"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\\\"></path></svg>\",\n star: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\\\"></polygon></svg>\",\n cloudOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22.61 16.95A5 5 0 0 0 18 10h-1.26a8 8 0 0 0-7.05-6M5 5a8 8 0 0 0 4 15h9a5 5 0 0 0 1.7-.3\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n sun: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"5\\\"></circle><line x1=\\\"12\\\" y1=\\\"1\\\" x2=\\\"12\\\" y2=\\\"3\\\"></line><line x1=\\\"12\\\" y1=\\\"21\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"4.22\\\" y1=\\\"4.22\\\" x2=\\\"5.64\\\" y2=\\\"5.64\\\"></line><line x1=\\\"18.36\\\" y1=\\\"18.36\\\" x2=\\\"19.78\\\" y2=\\\"19.78\\\"></line><line x1=\\\"1\\\" y1=\\\"12\\\" x2=\\\"3\\\" y2=\\\"12\\\"></line><line x1=\\\"21\\\" y1=\\\"12\\\" x2=\\\"23\\\" y2=\\\"12\\\"></line><line x1=\\\"4.22\\\" y1=\\\"19.78\\\" x2=\\\"5.64\\\" y2=\\\"18.36\\\"></line><line x1=\\\"18.36\\\" y1=\\\"5.64\\\" x2=\\\"19.78\\\" y2=\\\"4.22\\\"></line></svg>\",\n messageSquare: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\\\"></path></svg>\",\n edit: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\\\"></path><path d=\\\"M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\\\"></path></svg>\",\n anchor: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"5\\\" r=\\\"3\\\"></circle><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line><path d=\\\"M5 12H2a10 10 0 0 0 20 0h-3\\\"></path></svg>\",\n alertCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12.01\\\" y2=\\\"16\\\"></line></svg>\",\n chevronsUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"17 11 12 6 7 11\\\"></polyline><polyline points=\\\"17 18 12 13 7 18\\\"></polyline></svg>\",\n uploadCloud: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 16 12 12 8 16\\\"></polyline><line x1=\\\"12\\\" y1=\\\"12\\\" x2=\\\"12\\\" y2=\\\"21\\\"></line><path d=\\\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\\\"></path><polyline points=\\\"16 16 12 12 8 16\\\"></polyline></svg>\",\n twitch: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7\\\"></path></svg>\",\n youtube: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M506.9 153.6c0 0-5-35.3-20.4-50.8-19.5-20.4-41.3-20.5-51.3-21.7-71.6-5.2-179.1-5.2-179.1-5.2h-0.2c0 0-107.5 0-179.1 5.2-10 1.2-31.8 1.3-51.3 21.7-15.4 15.5-20.3 50.8-20.3 50.8s-5.1 41.4-5.1 82.9v38.8c0 41.4 5.1 82.9 5.1 82.9s5 35.3 20.3 50.8c19.5 20.4 45.1 19.7 56.5 21.9 41 3.9 174.1 5.1 174.1 5.1s107.6-0.2 179.2-5.3c10-1.2 31.8-1.3 51.3-21.7 15.4-15.5 20.4-50.8 20.4-50.8s5.1-41.4 5.1-82.9v-38.8c-0.1-41.4-5.2-82.9-5.2-82.9zM203.1 322.4v-143.9l138.3 72.2-138.3 71.7z\\\"></path></svg> \",\n unlock: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"11\\\" width=\\\"18\\\" height=\\\"11\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><path d=\\\"M7 11V7a5 5 0 0 1 9.9-1\\\"></path></svg>\",\n compass: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polygon points=\\\"16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76\\\"></polygon></svg>\",\n plusCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n creditCard: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"1\\\" y=\\\"4\\\" width=\\\"22\\\" height=\\\"16\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"1\\\" y1=\\\"10\\\" x2=\\\"23\\\" y2=\\\"10\\\"></line></svg>\",\n cloudRain: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"16\\\" y1=\\\"13\\\" x2=\\\"16\\\" y2=\\\"21\\\"></line><line x1=\\\"8\\\" y1=\\\"13\\\" x2=\\\"8\\\" y2=\\\"21\\\"></line><line x1=\\\"12\\\" y1=\\\"15\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><path d=\\\"M20 16.58A5 5 0 0 0 18 7h-1.26A8 8 0 1 0 4 15.25\\\"></path></svg>\",\n trash2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"3 6 5 6 21 6\\\"></polyline><path d=\\\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"></path><line x1=\\\"10\\\" y1=\\\"11\\\" x2=\\\"10\\\" y2=\\\"17\\\"></line><line x1=\\\"14\\\" y1=\\\"11\\\" x2=\\\"14\\\" y2=\\\"17\\\"></line></svg>\",\n skipBack: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"19 20 9 12 19 4 19 20\\\"></polygon><line x1=\\\"5\\\" y1=\\\"19\\\" x2=\\\"5\\\" y2=\\\"5\\\"></line></svg>\",\n filePlus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\\\"></path><polyline points=\\\"14 2 14 8 20 8\\\"></polyline><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"9\\\" y1=\\\"15\\\" x2=\\\"15\\\" y2=\\\"15\\\"></line></svg>\",\n delete: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 4H8l-7 8 7 8h13a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z\\\"></path><line x1=\\\"18\\\" y1=\\\"9\\\" x2=\\\"12\\\" y2=\\\"15\\\"></line><line x1=\\\"12\\\" y1=\\\"9\\\" x2=\\\"18\\\" y2=\\\"15\\\"></line></svg>\",\n command: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 3a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3H6a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3V6a3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3h12a3 3 0 0 0 3-3 3 3 0 0 0-3-3z\\\"></path></svg>\",\n clock: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"12 6 12 12 16 14\\\"></polyline></svg>\",\n octagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\\\"></polygon></svg>\",\n phone: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n eye: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\\\"></path><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"></circle></svg>\",\n phoneOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10.68 13.31a16 16 0 0 0 3.41 2.6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7 2 2 0 0 1 1.72 2v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.42 19.42 0 0 1-3.33-2.67m-2.67-3.34a19.79 19.79 0 0 1-3.07-8.63A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91\\\"></path><line x1=\\\"23\\\" y1=\\\"1\\\" x2=\\\"1\\\" y2=\\\"23\\\"></line></svg>\",\n codepen: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2\\\"></polygon><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"15.5\\\"></line><polyline points=\\\"22 8.5 12 15.5 2 8.5\\\"></polyline><polyline points=\\\"2 15.5 12 8.5 22 15.5\\\"></polyline><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"8.5\\\"></line></svg>\",\n dribbble: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M8.56 2.75c4.37 6.03 6.02 9.42 8.03 17.72m2.54-15.38c-3.72 4.35-8.94 5.66-16.88 5.85m19.5 1.9c-3.5-.93-6.63-.82-8.94 0-2.58.92-5.01 2.86-7.44 6.32\\\"></path></svg>\",\n gift: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"20 12 20 22 4 22 4 12\\\"></polyline><rect x=\\\"2\\\" y=\\\"7\\\" width=\\\"20\\\" height=\\\"5\\\"></rect><line x1=\\\"12\\\" y1=\\\"22\\\" x2=\\\"12\\\" y2=\\\"7\\\"></line><path d=\\\"M12 7H7.5a2.5 2.5 0 0 1 0-5C11 2 12 7 12 7z\\\"></path><path d=\\\"M12 7h4.5a2.5 2.5 0 0 0 0-5C13 2 12 7 12 7z\\\"></path></svg>\",\n externalLink: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"></path><polyline points=\\\"15 3 21 3 21 9\\\"></polyline><line x1=\\\"10\\\" y1=\\\"14\\\" x2=\\\"21\\\" y2=\\\"3\\\"></line></svg>\",\n zap: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\\\"></polygon></svg>\",\n trello: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><rect x=\\\"7\\\" y=\\\"7\\\" width=\\\"3\\\" height=\\\"9\\\"></rect><rect x=\\\"14\\\" y=\\\"7\\\" width=\\\"3\\\" height=\\\"5\\\"></rect></svg>\",\n moreVertical: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"1\\\"></circle><circle cx=\\\"12\\\" cy=\\\"5\\\" r=\\\"1\\\"></circle><circle cx=\\\"12\\\" cy=\\\"19\\\" r=\\\"1\\\"></circle></svg>\",\n micOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line><path d=\\\"M9 9v3a3 3 0 0 0 5.12 2.12M15 9.34V4a3 3 0 0 0-5.94-.6\\\"></path><path d=\\\"M17 16.95A7 7 0 0 1 5 12v-2m14 0v2a7 7 0 0 1-.11 1.23\\\"></path><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"12\\\" y2=\\\"23\\\"></line><line x1=\\\"8\\\" y1=\\\"23\\\" x2=\\\"16\\\" y2=\\\"23\\\"></line></svg>\",\n share: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\\\"></path><polyline points=\\\"16 6 12 2 8 6\\\"></polyline><line x1=\\\"12\\\" y1=\\\"2\\\" x2=\\\"12\\\" y2=\\\"15\\\"></line></svg>\",\n arrowUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"12\\\" y1=\\\"19\\\" x2=\\\"12\\\" y2=\\\"5\\\"></line><polyline points=\\\"5 12 12 5 19 12\\\"></polyline></svg>\",\n bellOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M13.73 21a2 2 0 0 1-3.46 0\\\"></path><path d=\\\"M18.63 13A17.89 17.89 0 0 1 18 8\\\"></path><path d=\\\"M6.26 6.26A5.86 5.86 0 0 0 6 8c0 7-3 9-3 9h14\\\"></path><path d=\\\"M18 8a6 6 0 0 0-9.33-5\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n linkedin: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z\\\"></path><rect x=\\\"2\\\" y=\\\"9\\\" width=\\\"4\\\" height=\\\"12\\\"></rect><circle cx=\\\"4\\\" cy=\\\"4\\\" r=\\\"2\\\"></circle></svg>\",\n video: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"23 7 16 12 23 17 23 7\\\"></polygon><rect x=\\\"1\\\" y=\\\"5\\\" width=\\\"15\\\" height=\\\"14\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect></svg>\",\n divideCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle></svg>\",\n activity: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"22 12 18 12 15 21 9 3 6 12 2 12\\\"></polyline></svg>\",\n twitter: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z\\\"></path></svg>\",\n mapPin: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\\\"></path><circle cx=\\\"12\\\" cy=\\\"10\\\" r=\\\"3\\\"></circle></svg>\",\n filter: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\\\"></polygon></svg>\",\n phoneIncoming: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 2 16 8 22 8\\\"></polyline><line x1=\\\"23\\\" y1=\\\"1\\\" x2=\\\"16\\\" y2=\\\"8\\\"></line><path d=\\\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\\\"></path></svg>\",\n italic: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"19\\\" y1=\\\"4\\\" x2=\\\"10\\\" y2=\\\"4\\\"></line><line x1=\\\"14\\\" y1=\\\"20\\\" x2=\\\"5\\\" y2=\\\"20\\\"></line><line x1=\\\"15\\\" y1=\\\"4\\\" x2=\\\"9\\\" y2=\\\"20\\\"></line></svg>\",\n chevronsLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"11 17 6 12 11 7\\\"></polyline><polyline points=\\\"18 17 13 12 18 7\\\"></polyline></svg>\",\n calendar: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"16\\\" y1=\\\"2\\\" x2=\\\"16\\\" y2=\\\"6\\\"></line><line x1=\\\"8\\\" y1=\\\"2\\\" x2=\\\"8\\\" y2=\\\"6\\\"></line><line x1=\\\"3\\\" y1=\\\"10\\\" x2=\\\"21\\\" y2=\\\"10\\\"></line></svg>\",\n globe: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><path d=\\\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\\\"></path></svg>\",\n arrowLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"19\\\" y1=\\\"12\\\" x2=\\\"5\\\" y2=\\\"12\\\"></line><polyline points=\\\"12 19 5 12 12 5\\\"></polyline></svg>\",\n alignCenter: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"18\\\" y1=\\\"10\\\" x2=\\\"6\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"18\\\" y1=\\\"18\\\" x2=\\\"6\\\" y2=\\\"18\\\"></line></svg>\",\n minusCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><line x1=\\\"8\\\" y1=\\\"12\\\" x2=\\\"16\\\" y2=\\\"12\\\"></line></svg>\",\n arrowDownRight: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"7\\\" y1=\\\"7\\\" x2=\\\"17\\\" y2=\\\"17\\\"></line><polyline points=\\\"17 7 17 17 7 17\\\"></polyline></svg>\",\n framer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M5 16V9h14V2H5l14 14h-7m-7 0l7 7v-7m-7 0h7\\\"></path></svg>\",\n volumeX: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\\\"></polygon><line x1=\\\"23\\\" y1=\\\"9\\\" x2=\\\"17\\\" y2=\\\"15\\\"></line><line x1=\\\"17\\\" y1=\\\"9\\\" x2=\\\"23\\\" y2=\\\"15\\\"></line></svg>\",\n slack: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M14.5 10c-.83 0-1.5-.67-1.5-1.5v-5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5z\\\"></path><path d=\\\"M20.5 10H19V8.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z\\\"></path><path d=\\\"M9.5 14c.83 0 1.5.67 1.5 1.5v5c0 .83-.67 1.5-1.5 1.5S8 21.33 8 20.5v-5c0-.83.67-1.5 1.5-1.5z\\\"></path><path d=\\\"M3.5 14H5v1.5c0 .83-.67 1.5-1.5 1.5S2 16.33 2 15.5 2.67 14 3.5 14z\\\"></path><path d=\\\"M14 14.5c0-.83.67-1.5 1.5-1.5h5c.83 0 1.5.67 1.5 1.5s-.67 1.5-1.5 1.5h-5c-.83 0-1.5-.67-1.5-1.5z\\\"></path><path d=\\\"M15.5 19H14v1.5c0 .83.67 1.5 1.5 1.5s1.5-.67 1.5-1.5-.67-1.5-1.5-1.5z\\\"></path><path d=\\\"M10 9.5C10 8.67 9.33 8 8.5 8h-5C2.67 8 2 8.67 2 9.5S2.67 11 3.5 11h5c.83 0 1.5-.67 1.5-1.5z\\\"></path><path d=\\\"M8.5 5H10V3.5C10 2.67 9.33 2 8.5 2S7 2.67 7 3.5 7.67 5 8.5 5z\\\"></path></svg>\",\n cloud: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z\\\"></path></svg>\",\n downloadCloud: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"8 17 12 21 16 17\\\"></polyline><line x1=\\\"12\\\" y1=\\\"12\\\" x2=\\\"12\\\" y2=\\\"21\\\"></line><path d=\\\"M20.88 18.09A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.29\\\"></path></svg>\",\n shuffle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"16 3 21 3 21 8\\\"></polyline><line x1=\\\"4\\\" y1=\\\"20\\\" x2=\\\"21\\\" y2=\\\"3\\\"></line><polyline points=\\\"21 16 21 21 16 21\\\"></polyline><line x1=\\\"15\\\" y1=\\\"15\\\" x2=\\\"21\\\" y2=\\\"21\\\"></line><line x1=\\\"4\\\" y1=\\\"4\\\" x2=\\\"9\\\" y2=\\\"9\\\"></line></svg>\",\n rewind: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"11 19 2 12 11 5 11 19\\\"></polygon><polygon points=\\\"22 19 13 12 22 5 22 19\\\"></polygon></svg>\",\n upload: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"></path><polyline points=\\\"17 8 12 3 7 8\\\"></polyline><line x1=\\\"12\\\" y1=\\\"3\\\" x2=\\\"12\\\" y2=\\\"15\\\"></line></svg>\",\n trendingDown: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 18 13.5 8.5 8.5 13.5 1 6\\\"></polyline><polyline points=\\\"17 18 23 18 23 12\\\"></polyline></svg>\",\n pause: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"6\\\" y=\\\"4\\\" width=\\\"4\\\" height=\\\"16\\\"></rect><rect x=\\\"14\\\" y=\\\"4\\\" width=\\\"4\\\" height=\\\"16\\\"></rect></svg>\",\n arrowDownCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><polyline points=\\\"8 12 12 16 16 12\\\"></polyline><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"16\\\"></line></svg>\",\n bookmark: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\\\"></path></svg>\",\n alertTriangle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\\\"></path><line x1=\\\"12\\\" y1=\\\"9\\\" x2=\\\"12\\\" y2=\\\"13\\\"></line><line x1=\\\"12\\\" y1=\\\"17\\\" x2=\\\"12.01\\\" y2=\\\"17\\\"></line></svg>\",\n userCheck: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"8.5\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><polyline points=\\\"17 11 19 13 23 9\\\"></polyline></svg>\",\n tablet: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"4\\\" y=\\\"2\\\" width=\\\"16\\\" height=\\\"20\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"12\\\" y1=\\\"18\\\" x2=\\\"12.01\\\" y2=\\\"18\\\"></line></svg>\",\n alertOctagon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\\\"></polygon><line x1=\\\"12\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"12\\\"></line><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12.01\\\" y2=\\\"16\\\"></line></svg>\",\n menu: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"3\\\" y1=\\\"12\\\" x2=\\\"21\\\" y2=\\\"12\\\"></line><line x1=\\\"3\\\" y1=\\\"6\\\" x2=\\\"21\\\" y2=\\\"6\\\"></line><line x1=\\\"3\\\" y1=\\\"18\\\" x2=\\\"21\\\" y2=\\\"18\\\"></line></svg>\",\n chrome: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"></circle><line x1=\\\"21.17\\\" y1=\\\"8\\\" x2=\\\"12\\\" y2=\\\"8\\\"></line><line x1=\\\"3.95\\\" y1=\\\"6.06\\\" x2=\\\"8.54\\\" y2=\\\"14\\\"></line><line x1=\\\"10.88\\\" y1=\\\"21.94\\\" x2=\\\"15.46\\\" y2=\\\"14\\\"></line></svg>\",\n shoppingCart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"9\\\" cy=\\\"21\\\" r=\\\"1\\\"></circle><circle cx=\\\"20\\\" cy=\\\"21\\\" r=\\\"1\\\"></circle><path d=\\\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\\\"></path></svg>\",\n folder: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\\\"></path></svg>\",\n users: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\\\"></path><circle cx=\\\"9\\\" cy=\\\"7\\\" r=\\\"4\\\"></circle><path d=\\\"M23 21v-2a4 4 0 0 0-3-3.87\\\"></path><path d=\\\"M16 3.13a4 4 0 0 1 0 7.75\\\"></path></svg>\",\n cornerDownLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"9 10 4 15 9 20\\\"></polyline><path d=\\\"M20 4v7a4 4 0 0 1-4 4H4\\\"></path></svg>\",\n monitor: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"3\\\" width=\\\"20\\\" height=\\\"14\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"8\\\" y1=\\\"21\\\" x2=\\\"16\\\" y2=\\\"21\\\"></line><line x1=\\\"12\\\" y1=\\\"17\\\" x2=\\\"12\\\" y2=\\\"21\\\"></line></svg>\",\n minus: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"></line></svg>\",\n helpCircle: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"></circle><path d=\\\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\\\"></path><line x1=\\\"12\\\" y1=\\\"17\\\" x2=\\\"12.01\\\" y2=\\\"17\\\"></line></svg>\",\n navigation2: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polygon points=\\\"12 2 19 21 12 17 5 21 12 2\\\"></polygon></svg>\",\n chevronLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"15 18 9 12 15 6\\\"></polyline></svg>\",\n film: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"2\\\" y=\\\"2\\\" width=\\\"20\\\" height=\\\"20\\\" rx=\\\"2.18\\\" ry=\\\"2.18\\\"></rect><line x1=\\\"7\\\" y1=\\\"2\\\" x2=\\\"7\\\" y2=\\\"22\\\"></line><line x1=\\\"17\\\" y1=\\\"2\\\" x2=\\\"17\\\" y2=\\\"22\\\"></line><line x1=\\\"2\\\" y1=\\\"12\\\" x2=\\\"22\\\" y2=\\\"12\\\"></line><line x1=\\\"2\\\" y1=\\\"7\\\" x2=\\\"7\\\" y2=\\\"7\\\"></line><line x1=\\\"2\\\" y1=\\\"17\\\" x2=\\\"7\\\" y2=\\\"17\\\"></line><line x1=\\\"17\\\" y1=\\\"17\\\" x2=\\\"22\\\" y2=\\\"17\\\"></line><line x1=\\\"17\\\" y1=\\\"7\\\" x2=\\\"22\\\" y2=\\\"7\\\"></line></svg>\",\n moon: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\\\"></path></svg>\",\n shieldOff: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M19.69 14a6.9 6.9 0 0 0 .31-2V5l-8-3-3.16 1.18\\\"></path><path d=\\\"M4.73 4.73L4 5v7c0 6 8 10 8 10a20.29 20.29 0 0 0 5.62-4.38\\\"></path><line x1=\\\"1\\\" y1=\\\"1\\\" x2=\\\"23\\\" y2=\\\"23\\\"></line></svg>\",\n layout: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"2\\\" ry=\\\"2\\\"></rect><line x1=\\\"3\\\" y1=\\\"9\\\" x2=\\\"21\\\" y2=\\\"9\\\"></line><line x1=\\\"9\\\" y1=\\\"21\\\" x2=\\\"9\\\" y2=\\\"9\\\"></line></svg>\",\n mousePointer: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z\\\"></path><path d=\\\"M13 13l6 6\\\"></path></svg>\",\n alignLeft: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><line x1=\\\"17\\\" y1=\\\"10\\\" x2=\\\"3\\\" y2=\\\"10\\\"></line><line x1=\\\"21\\\" y1=\\\"6\\\" x2=\\\"3\\\" y2=\\\"6\\\"></line><line x1=\\\"21\\\" y1=\\\"14\\\" x2=\\\"3\\\" y2=\\\"14\\\"></line><line x1=\\\"17\\\" y1=\\\"18\\\" x2=\\\"3\\\" y2=\\\"18\\\"></line></svg>\",\n heart: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><path d=\\\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\\\"></path></svg>\",\n trendingUp: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><polyline points=\\\"23 6 13.5 15.5 8.5 10.5 1 18\\\"></polyline><polyline points=\\\"17 6 23 6 23 12\\\"></polyline></svg>\",\n listBullet: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M21,6 C21,6,10,6,10,6\\\"/><path style=\\\"\\\" d=\\\"M21,12 C21,12,10,12,10,12\\\"/><path style=\\\"\\\" d=\\\"M21,18 C21,18,10,18,10,18\\\"/><path style=\\\"\\\" d=\\\"M5.5,5 C6.05,5,6.5,5.45,6.5,6 C6.5,6.55,6.05,7,5.5,7 C4.95,7,4.5,6.55,4.5,6 C4.5,5.45,4.95,5,5.5,5 z\\\"/><path style=\\\"\\\" d=\\\"M5.5,11 C6.05,11,6.5,11.45,6.5,12 C6.5,12.55,6.05,13,5.5,13 C4.95,13,4.5,12.55,4.5,12 C4.5,11.45,4.95,11,5.5,11 z\\\"/><path style=\\\"\\\" d=\\\"M5.5,17 C6.05,17,6.5,17.45,6.5,18 C6.5,18.55,6.05,19,5.5,19 C4.95,19,4.5,18.55,4.5,18 C4.5,17.45,4.95,17,5.5,17 z\\\"/></g></svg> \",\n indent: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M21,10 C21,10,8,10,8,10\\\"/><path style=\\\"\\\" d=\\\"M21,6 C21,6,8,6,8,6\\\"/><path style=\\\"\\\" d=\\\"M21,14 C21,14,8,14,8,14\\\"/><path style=\\\"\\\" d=\\\"M21,18 C21,18,8,18,8,18\\\"/><path style=\\\"\\\" d=\\\"M2.5,9 C2.5,9,5.5,12,5.5,12 C5.5,12,2.5,15,2.5,15\\\"/></g></svg> \",\n fontBold: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M13.5,11 C15.71,11,17.5,12.68,17.5,14.75 C17.5,16.82,15.71,18.5,13.5,18.5 C13.5,18.5,8.5,18.5,8.5,18.5 C8.5,18.5,8.5,3.5,8.5,3.5 C8.5,3.5,13.5,3.5,13.5,3.5 C15.71,3.5,17.5,5.18,17.5,7.25 C17.5,9.32,15.71,11,13.5,11 C13.5,11,13.5,11,13.5,11 z\\\"/><path style=\\\"\\\" d=\\\"M13.5,11 C13.5,11,8.5,11,8.5,11\\\"/><path style=\\\"\\\" d=\\\"M12.5,11 C14.71,11,16.5,12.68,16.5,14.75 C16.5,16.82,14.71,18.5,12.5,18.5 C12.5,18.5,7.5,18.5,7.5,18.5 C7.5,18.5,7.5,3.5,7.5,3.5 C7.5,3.5,12.5,3.5,12.5,3.5 C14.71,3.5,16.5,5.18,16.5,7.25 C16.5,9.32,14.71,11,12.5,11 C12.5,11,12.5,11,12.5,11 z\\\"/><path style=\\\"\\\" d=\\\"M12.5,11 C12.5,11,7.5,11,7.5,11\\\"/></g></svg> \",\n fontItalic: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M17.00,4.50 C17.00,4.50,13.00,4.50,13.00,4.50\\\"/><path style=\\\"\\\" d=\\\"M11.00,19.50 C11.00,19.50,7.00,19.50,7.00,19.50\\\"/><path style=\\\"\\\" d=\\\"M15.00,4.50 C15.00,4.50,9.00,19.50,9.00,19.50\\\"/></g></svg> \",\n fontUnderline: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M7.5,3.5 C7.5,3.5,7.5,10.74,7.5,13.5 C7.5,16.26,9.74,18.5,12.5,18.5 C15.26,18.5,17.5,16.26,17.5,13.5 C17.5,10.74,17.5,3.5,17.5,3.5\\\"/><path style=\\\"\\\" d=\\\"M7.5,21.5 C7.5,21.5,17.5,21.5,17.5,21.5\\\"/></g></svg> \",\n outdent: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M21,10 C21,10,8,10,8,10\\\"/><path style=\\\"\\\" d=\\\"M21,6 C21,6,8,6,8,6\\\"/><path style=\\\"\\\" d=\\\"M21,14 C21,14,8,14,8,14\\\"/><path style=\\\"\\\" d=\\\"M21,18 C21,18,8,18,8,18\\\"/><path style=\\\"\\\" d=\\\"M5.5,9 C5.5,9,2.5,12,2.5,12 C2.5,12,5.5,15,5.5,15\\\"/></g></svg> \",\n listNumber: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M21,6 C21,6,10,6,10,6\\\"/><path style=\\\"\\\" d=\\\"M21,12 C21,12,10,12,10,12\\\"/><path style=\\\"\\\" d=\\\"M21,18 C21,18,10,18,10,18\\\"/><path style=\\\"\\\" d=\\\"M4.5,5 C4.5,5,5.5,4,5.5,4 C5.5,4,5.5,8,5.5,8\\\"/><path style=\\\"\\\" d=\\\"M4.5,10 C4.5,10,5.50,10,5.50,10 C6.05,10,6.5,10.45,6.5,11.00 C6.5,11.00,6.5,11.00,6.5,11.00 C6.5,11.55,6.05,12,5.50,12 C5.50,12,5.50,12,5.50,12 C4.95,12,4.5,12.45,4.5,13.00 C4.5,13.00,4.5,14,4.5,14 C4.5,14,6.5,14,6.5,14\\\"/><path style=\\\"\\\" d=\\\"M4.5,16 C4.5,16,5.50,16,5.50,16 C6.05,16,6.5,16.45,6.5,17.00 C6.5,17.00,6.5,17.00,6.5,17.00 C6.5,17.55,6.05,18,5.50,18 C5.50,18,4.5,18,4.5,18 C4.5,18,5.50,18,5.50,18 C6.05,18,6.5,18.45,6.5,19.00 C6.5,19.00,6.5,19.00,6.5,19.00 C6.5,19.55,6.05,20,5.50,20 C5.50,20,4.5,20,4.5,20\\\"/></g></svg> \",\n resize: \"<svg class=\\\"stroked\\\" version=\\\"1.1\\\" viewBox=\\\"0, 0, 24, 24\\\"><g><path d=\\\"M9,3 L3,3 L3,9\\\"/><path d=\\\"M15,21 L21,21 L21,15\\\"/><path d=\\\"M3,3 L10,10\\\"/><path d=\\\"M21,21 L14,14\\\"/></g></svg> \",\n bug: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M8,6 C8,3.79,9.79,2,12,2 C14.21,2,16,3.79,16,6 C16,6,8,6,8,6 z\\\"/><path style=\\\"\\\" d=\\\"M20,7 C20,7,18,9,18,9\\\"/><path style=\\\"\\\" d=\\\"M20,19 C20,19,18,17,18,17\\\"/><path style=\\\"\\\" d=\\\"M21,13 C21,13,18,13,18,13\\\"/><path style=\\\"\\\" d=\\\"M16.44,9 C17.30,9,18.00,9.70,18.00,10.56 C18.00,10.56,18.00,15.00,18.00,15.00 C18.00,18.31,15.31,21,12,21 C8.69,21,6,18.31,6,15.00 C6,15.00,6,10.56,6,10.56 C6,9.70,6.70,9,7.56,9 C7.56,9,16.44,9,16.44,9 z\\\"/><path style=\\\"\\\" d=\\\"M4,7 C4,7,6,9,6,9\\\"/><path style=\\\"\\\" d=\\\"M4,19 C4,19,6,17,6,17\\\"/><path style=\\\"\\\" d=\\\"M3,13 C3,13,6,13,6,13\\\"/><path style=\\\"\\\" d=\\\"M12,12 C12,12,12,17,12,17\\\"/></g></svg> \",\n blog: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path style=\\\"\\\" d=\\\"M21,10.02 C21,10.02,21,15,21,15 C21,15.53,20.79,16.04,20.41,16.41 C20.04,16.79,19.53,17,19,17 C19,17,7,17,7,17 C5.67,18.33,4.33,19.67,3,21 C3,21,3,5,3,5 C3,4.47,3.21,3.96,3.59,3.59 C3.96,3.21,4.47,3,5,3 C8.53,3,10.49,3,14.02,3\\\"/><path style=\\\"\\\" d=\\\"M19,2 C19.54,1.46,20.32,1.25,21.05,1.45 C21.78,1.65,22.35,2.22,22.55,2.95 C22.75,3.68,22.54,4.46,22,5 C22,5,15.5,11.5,15.5,11.5 C14.17,11.83,12.83,12.17,11.5,12.5 C11.83,11.17,12.17,9.83,12.5,8.5 C15.67,5.33,15.83,5.17,19,2 z\\\"/><path style=\\\"\\\" d=\\\"M14.60,3\\\"/><path style=\\\"\\\" d=\\\"M21,8.77\\\"/><path style=\\\"\\\" d=\\\"M7,7 C7,7,10,7,10,7\\\"/><path style=\\\"\\\" d=\\\"M7,10 C7,10,9,10,9,10\\\"/></g></svg> \",\n sortAscending: \"<svg class=\\\"stroked\\\" viewBox=\\\"0 0 24 24\\\"><g><path d=\\\"M16.5,10.5 C16.5,10.5,7.5,10.5,7.5,10.5\\\"/><path d=\\\"M14.5,6.5 C14.5,6.5,9.5,6.5,9.5,6.5\\\"/><path d=\\\"M18.5,14.5 C18.5,14.5,5.5,14.5,5.5,14.5\\\"/><path d=\\\"M20.5,18.5 C20.5,18.5,3.5,18.5,3.5,18.5\\\"/></g></svg> \",\n npm: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M0 0v512h512v-512h-512zM416 416h-64v-256h-96v256h-160v-320h320v320z\\\"></path></svg> \",\n game: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 704 512\\\"><g></g><path d=\\\"M528 96.79v-0.79h-336c-88.36 0-160 71.64-160 160s71.64 160 160 160c52.34 0 98.82-25.14 128.01-64h63.98c29.19 38.86 75.66 64 128.01 64 88.37 0 160-71.63 160-160 0-82.97-63.15-151.18-144-159.21zM288 288h-64v64h-64v-64h-64v-64h64v-64h64v64h64v64zM480 288c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32zM576 288c-17.67 0-32-14.33-32-32 0-17.67 14.33-32 32-32s32 14.33 32 32c0 17.67-14.33 32-32 32z\\\"></path></svg> \",\n google: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 512 512\\\"><g></g><path d=\\\"M256 0c-141.4 0-256 114.6-256 256s114.6 256 256 256 256-114.6 256-256-114.6-256-256-256zM259.8 448c-106.1 0-192-85.9-192-192s85.9-192 192-192c51.8 0 95.2 18.9 128.6 50.2l-52.1 50.2c-14.3-13.7-39.2-29.6-76.5-29.6-65.6 0-119 54.3-119 121.2s53.5 121.2 119 121.2c76 0 104.5-54.6 108.9-82.8h-108.9v-65.8h181.3c1.6 9.6 3 19.2 3 31.8 0.1 109.7-73.4 187.6-184.3 187.6z\\\"></path></svg> \",\n discord: \"<svg class=\\\"filled\\\" version=\\\"1.1\\\" viewBox=\\\"0 0 1013 768\\\"><g></g><path d=\\\"M858.38 64.32c-60.41-28.44-130.58-50.8-204.05-63.60l-5.01-0.72c-8.35 14.47-17.31 32.35-25.34 50.74l-1.44 3.7c-34.87-5.53-75.06-8.69-116.00-8.69s-81.14 3.16-120.37 9.25l4.37-0.56c-9.48-22.09-18.44-39.97-28.27-57.29l1.49 2.86c-78.56 13.64-148.78 36.05-214.41 66.65l5.19-2.17c-132.30 195.75-168.17 386.63-150.24 574.80v0c73.25 54.65 158.46 98.55 250.43 127.12l5.97 1.60c19.28-25.64 37.51-54.63 53.29-85.10l1.63-3.45c-33.48-12.62-61.98-26.51-88.96-42.66l2.48 1.38c7.25-5.26 14.35-10.68 21.2-15.94 75.07 36.14 163.23 57.26 256.32 57.26s181.25-21.12 259.94-58.83l-3.62 1.56c6.93 5.66 14.03 11.08 21.2 15.94-24.54 14.80-53.09 28.72-82.88 40.10l-3.75 1.26c17.37 33.87 35.61 62.84 56.05 90.05l-1.14-1.58c98.00-30.05 183.28-73.93 258.78-130.22l-2.22 1.58c21.04-218.22-35.95-407.35-150.63-575.04zM338.33 523.56c-49.97 0-91.26-45.35-91.26-101.14s39.85-101.54 91.10-101.54 92.21 45.75 91.34 101.54-40.25 101.14-91.18 101.14zM674.99 523.56c-50.05 0-91.18-45.35-91.18-101.14s39.85-101.54 91.18-101.54 91.97 45.75 91.10 101.54-40.17 101.14-91.10 101.14z\\\"></path></svg> \"\n}\n",
10
+ "/*#\n# lottie / bodymovin\n\nA [lottie](https://airbnb.io/lottie/#/web) (a.k.a. **bodymovin**) player.\n\nIt's designed to work like an `<img>` element (just set its `src` attribute).\n\n```js\nimport { icons, popFloat } from 'tosijs-ui'\nimport { div, label, input, select, option, span } from 'tosijs'.elements\n\nconst rocket = preview.querySelector('xin-lottie')\nsetTimeout(\n () => {\n preview.append(\n popFloat({\n content: [\n { class: 'panel', drag: true },\n div({ class: 'panel-header' }, 'Player Controls' ),\n label(\n { class: 'no-drag' },\n 'speed',\n input({ type: 'range', min: -1, max: 1, step: 0.1, value: 0, onInput(event) {\n const speed = Math.pow(5, Number(event.target.value))\n rocket.animation.setSpeed(speed)\n event.target.nextSibling.textContent = (speed * 100).toFixed(0) + '%'\n } }),\n span('100%', {style: { textAlign: 'right', width: '40px'}})\n ),\n label(\n { class: 'no-drag' },\n 'direction',\n select(\n option('Forwards', {value: 1, selected: true}),\n option('Backwards', {value: -1}),\n {\n onChange(event) {\n rocket.animation.setDirection(event.target.value)\n }\n }\n ),\n icons.chevronDown(),\n )\n ],\n target: rocket,\n position: 's'\n })\n )\n },\n 500\n)\n```\n```html\n<xin-lottie\n style=\"height: 100%; max-width: 100%\"\n src=\"88140-rocket-livetrade.json\"\n></xin-lottie>\n<div class=\"caption\">\n Animation by <a target=\"_blank\" href=\"https://lottiefiles.com/dvskjbicfc\">chiến lê hồng</a>\n</div>\n```\n```css\n.preview {\n padding: var(--spacing);\n text-align: center;\n}\n\n.preview .panel {\n padding: 10px;\n border-radius: 5px;\n gap: 5px;\n background: white;\n box-shadow: 0 2px 8px rgba(0,0,0,0.25);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.preview .caption {\n position: absolute;\n right: 5px;\n bottom: 5px;\n}\n\n.preview .panel-header {\n margin: 0;\n text-align: center;\n font-weight: bold;\n background: var(--brand-color);\n color: white;\n padding: 5px;\n margin: -10px -10px 0 -10px;\n cursor: move;\n}\n```\n\nYou can also directly set its `json` property to the content of a `lottie.json` file.\n\nAnd of course just access the element's `animation` property to [use the bodymovin API](https://airbnb.io/lottie/#/web).\n\nAlso see the [documentation for advanced interactions](https://lottiefiles.github.io/lottie-docs/advanced_interactions/)\n*/\n\nimport { Component as WebComponent, ElementCreator } from 'tosijs'\nimport { scriptTag } from './via-tag'\n\nexport interface LottieConfig {\n container?: HTMLElement | ShadowRoot\n renderer: 'svg' | 'canvas' | 'html'\n loop: boolean\n autoplay: boolean\n animationData?: string\n path?: string\n [key: string]: any\n}\n\nexport class BodymovinPlayer extends WebComponent {\n content = null\n src = ''\n json = ''\n config: LottieConfig = {\n renderer: 'svg',\n loop: true,\n autoplay: true,\n }\n\n static bodymovinAvailable?: Promise<any>\n\n animation: any\n\n static styleSpec = {\n ':host': {\n width: 400,\n height: 400,\n display: 'inline-block',\n },\n }\n\n private _loading = false\n\n get loading(): boolean {\n return this._loading\n }\n\n constructor() {\n super()\n this.initAttributes('src', 'json')\n if (BodymovinPlayer.bodymovinAvailable === undefined) {\n BodymovinPlayer.bodymovinAvailable = scriptTag(\n 'https://cdnjs.cloudflare.com/ajax/libs/bodymovin/5.12.2/lottie.min.js',\n 'bodymovin'\n )\n }\n }\n\n private readonly doneLoading = (): void => {\n this._loading = false\n }\n\n private readonly load = ({ bodymovin }: { bodymovin: any }): void => {\n this._loading = true\n\n this.config.container =\n this.shadowRoot !== null ? this.shadowRoot : undefined\n if (this.json !== '') {\n this.config.animationData = this.json\n delete this.config.path\n } else if (this.src !== '') {\n delete this.config.animationData\n this.config.path = this.src\n } else {\n console.log(\n '%c<xin-lottie>%c expected either %cjson%c (animation data) or %csrc% c(url) but found neither.',\n 'color: #44f; background: #fff; padding: 0 5px',\n 'color: default',\n 'color: #44f; background: #fff; padding: 0 5px',\n 'color: default',\n 'color: #44f; background: #fff; padding: 0 5px',\n 'color: default'\n )\n }\n\n if (this.animation) {\n this.animation.destroy()\n const root = this.shadowRoot\n if (root !== null) {\n root.querySelector('svg')?.remove()\n }\n }\n this.animation = bodymovin.loadAnimation(this.config)\n this.animation.addEventListener('DOMLoaded', this.doneLoading)\n }\n\n render(): void {\n super.render()\n\n BodymovinPlayer.bodymovinAvailable!.then(this.load).catch(\n (e: string): void => {\n console.error(e)\n }\n )\n }\n}\n\nexport const bodymovinPlayer = BodymovinPlayer.elementCreator({\n tag: 'xin-lottie',\n}) as ElementCreator<BodymovinPlayer>\n",
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*/\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 makeCodeEditor = async (\n codeElement: any,\n mode = 'html',\n options = {},\n theme = DEFAULT_THEME\n) => {\n const { ace } = await scriptTag(`${ACE_BASE_URL}ace.min.js`)\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 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 get editor(): any {\n return this._editor\n }\n private _editor: any | undefined\n private _editorPromise: Promise<any> | undefined\n options: any = {}\n theme = DEFAULT_THEME\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((editor) => {\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) => editor.setReadOnly(this.disabled))\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\nconst { dataTable } = tosijsui\nconst { input } = 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 xinjs 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",
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\nconst { trackDrag } = tosijsui\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
- "/*#\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\nconst { popMenu, localize, xinMenu, postNotification, xinLocalized, icons } = tosijsui\nconst { elements } = 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.xinjs.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\nconst { popMenu, icons, postNotification } = tosijsui\nconst { elements } = 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\nconst { elements } = tosijs\nconst { xinLocalized, localize, icons, popMenu, postNotification } = tosijsui\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",
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 xinjs 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",
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
+ "/*#\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.xinjs.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
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\nconst { popFloat, positionFloat } = tosijsui\nconst { button } = 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 })\n )\n } else {\n // position an existing float\n positionFloat(float, target, target.dataset.float)\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;\n background: white;\n box-shadow: 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}\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' | boolean // default is 'remove'\n remainOnResize?: 'hide' | 'remove' | boolean // default is '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}\n\nexport const popFloat = (options: PopFloatOptions): XinFloat => {\n const { content, target, position } = options\n const float = Array.isArray(content)\n ? xinFloat(...content)\n : xinFloat(content)\n\n positionFloat(float, target, position)\n document.body.append(float)\n return float\n}\n\nexport const positionFloat = (\n element: HTMLElement,\n target: HTMLElement,\n position?: FloatPosition\n): void => {\n {\n const { position } = getComputedStyle(element)\n if (position !== 'fixed') {\n element.style.position = 'fixed'\n }\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\nconst { button, p } = tosijs.elements\nconst { setLocale } = tosijsui\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\nconst { xinLocalized, localize } = tosijsui\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 { Component, tosi, elements, bindings, observe, BoxedProxy } 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<{ // Or HTMLElement[], since span() returns an HTMLElement\n icon: HTMLElement; // Use HTMLElement as the type for span() result\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(),\n caption: window.navigator.language,\n value: window.navigator.language,\n },\n ],\n },\n}) as {i18n: I18nConfig}\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.includes(language)) {\n i18n.locale = 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 = locales\n i18n.languages = languages\n i18n.emoji = emoji\n i18n.stringMap = strings.reduce(\n (map: TranslationMap, strings: string[]) => {\n map[strings[0].toLocaleLowerCase()] = strings\n return map\n },\n {} as TranslationMap\n )\n i18n.localeOptions = 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.includes(i18n.locale.valueOf())) {\n const language = i18n.locale.substring(0, 2)\n i18n.locale =\n i18n.locales.find((locale: string) => locale.substring(0, 2) === language) ||\n i18n.locales[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.indexOf(i18n.locale.valueOf())\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",
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\nconst { select, option, div, span, ul, li } = tosijs.elements\nconst { icons, makeSorter } = tosijsui\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\nconst { icons } = tosijsui\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",
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 { Component, tosi, elements, bindings, observe, BoxedProxy } 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<{ // Or HTMLElement[], since span() returns an HTMLElement\n icon: HTMLElement; // Use HTMLElement as the type for span() result\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(),\n caption: window.navigator.language,\n value: window.navigator.language,\n },\n ],\n },\n}) as {i18n: I18nConfig}\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.includes(language)) {\n i18n.locale = 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 = locales\n i18n.languages = languages\n i18n.emoji = emoji\n i18n.stringMap = strings.reduce(\n (map: TranslationMap, strings: string[]) => {\n map[strings[0].toLocaleLowerCase()] = strings\n return map\n },\n {} as TranslationMap\n )\n i18n.localeOptions = 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.includes(i18n.locale.valueOf())) {\n const language = i18n.locale.substring(0, 2)\n i18n.locale =\n i18n.locales.find((locale: string) => locale.substring(0, 2) === language) ||\n i18n.locales[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.indexOf(i18n.locale.valueOf())\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",
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",
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\n> **Note** this library is a modernized version of the [b8rjs](https://b8rjs.com) drag-and-drop.js library.\n> It removes all usage of b8rjs and has no dependencies.\n\nA lightweight library building on top of 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 'xinjs-ui'\n\ndragAndDrop.init()\n```\n\nThe library just sets up some event listeners.\n\nYou can use `dragAndDrop.draggedElement()` to get the element being dragged (if it's\nactually from the page you're in).\n\n> ### Important Note\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 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\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\nconst { dragAndDrop } = tosijsui\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\nconst { elements, tosi, getListItem } = tosijs\nconst { dragAndDrop } = tosijsui\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]\nconst { spectrum } = tosi({\n spectrum: shuffle(colors).map(color => ({color}))\n})\n\nconst { div, template } = elements\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 console.log({dragged, draggedIndex, dropped, droppedIndex})\n\n event.preventDefault()\n event.stopPropagation()\n}\n\nconst dragId = 'spectrum/' + Math.floor(Math.random() * 1e9)\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
- "/*#\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\nconst { editableRect, icons } = tosijsui\nconst { elements } = 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",
25
- "/*#\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\nconst { elements } = tosijs\nconst { dataTable, filterBuilder, availableFilters } = tosijsui\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 } from 'tosijs'\nimport { icons } from '../src/'\n\nconst { div, input, select, option, 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 console.log(tags)\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 console.log(tags)\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: HTMLSelectElement): string {\n return select.options[select.selectedIndex].text\n}\n\ntype Fields = Array<{ name?: string; prop: string }>\n\nexport interface FilterPartState {\n haystack: string\n condition: string\n needle: string\n}\nexport class FilterPart extends WebComponent {\n fields: Fields = []\n filters = availableFilters\n haystack = '*'\n condition = ''\n needle = ''\n\n content = () => [\n select({ part: 'haystack' }),\n icons.chevronDown(),\n select({ part: 'condition' }),\n icons.chevronDown(),\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n }\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n }\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n remove: HTMLButtonElement\n }\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n }\n\n haystack.textContent = ''\n haystack.append(\n option('any field', { value: '*' }),\n ...this.fields.map((field) => {\n const caption = field.name || field.prop\n return option(`${caption}`, { value: field.prop })\n })\n )\n condition.textContent = ''\n const conditions = Object.keys(this.filters)\n .map((key) => {\n const filter = this.filters[key]\n return filter.negative !== undefined\n ? [\n option(filter.caption, { value: key }),\n option(filter.negative, { value: '~' + key }),\n ]\n : option(filter.caption, { value: key })\n })\n .flat()\n condition.append(...conditions)\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 class FilterBuilder extends WebComponent {\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=\"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",
23
+ "/*#\n# drag & drop\n\n> **Note** this library is a modernized version of the [b8rjs](https://b8rjs.com) drag-and-drop.js library.\n> It removes all usage of b8rjs and has no dependencies.\n\nA lightweight library building on top of 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 'xinjs-ui'\n\ndragAndDrop.init()\n```\n\nThe library just sets up some event listeners.\n\nYou can use `dragAndDrop.draggedElement()` to get the element being dragged (if it's\nactually from the page you're in).\n\n> ### Important Note\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 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\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 } 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]\nconst { spectrum } = tosi({\n spectrum: shuffle(colors).map(color => ({color}))\n})\n\nconst { div, template } = elements\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 console.log({dragged, draggedIndex, dropped, droppedIndex})\n\n event.preventDefault()\n event.stopPropagation()\n}\n\nconst dragId = 'spectrum/' + Math.floor(Math.random() * 1e9)\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
+ "/*#\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 } from 'tosijs'\n\nconst { dialog, button, header, footer, xinSlot, h3, p, label, input, div } = 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(\n { slot: 'header'},\n title\n ),\n p(\n message\n ),\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(\n { slot: 'header'},\n title\n ),\n p(\n message\n ),\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(message: string, title = 'Prompt', currentValue = ''): 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(\n { slot: 'header'},\n title\n ),\n p(\n label(\n {\n style: { \n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: 5\n },\n },\n div(\n message\n ),\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 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 = () => dialog(\n { part: 'dialog' },\n header(\n xinSlot({name: 'header'}),\n ),\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:has(dialog[open])': {\n position: 'fixed',\n display: 'block',\n inset: 0,\n background: '#0002',\n zIndex: 2,\n },\n ':host > dialog[open]': {\n top: '50%',\n left: '50%',\n minWidth: 300,\n transform: 'translate(-50%,-50%)',\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 boxShadow: '0 5px 10px #0004'\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})",
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
+ "/*#\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 } from 'tosijs'\nimport { icons } from '../src/'\n\nconst { div, input, select, option, 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 console.log(tags)\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 console.log(tags)\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: HTMLSelectElement): string {\n return select.options[select.selectedIndex].text\n}\n\ntype Fields = Array<{ name?: string; prop: string }>\n\nexport interface FilterPartState {\n haystack: string\n condition: string\n needle: string\n}\nexport class FilterPart extends WebComponent {\n fields: Fields = []\n filters = availableFilters\n haystack = '*'\n condition = ''\n needle = ''\n\n content = () => [\n select({ part: 'haystack' }),\n icons.chevronDown(),\n select({ part: 'condition' }),\n icons.chevronDown(),\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n }\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n }\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n remove: HTMLButtonElement\n }\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 as {\n haystack: HTMLSelectElement\n condition: HTMLSelectElement\n needle: HTMLInputElement\n }\n\n haystack.textContent = ''\n haystack.append(\n option('any field', { value: '*' }),\n ...this.fields.map((field) => {\n const caption = field.name || field.prop\n return option(`${caption}`, { value: field.prop })\n })\n )\n condition.textContent = ''\n const conditions = Object.keys(this.filters)\n .map((key) => {\n const filter = this.filters[key]\n return filter.negative !== undefined\n ? [\n option(filter.caption, { value: key }),\n option(filter.negative, { value: '~' + key }),\n ]\n : option(filter.caption, { value: key })\n })\n .flat()\n condition.append(...conditions)\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 class FilterBuilder extends WebComponent {\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=\"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",
26
27
  "/*#\n# forms\n\n`<xin-form>` and `<xin-field>` can be used to quickly create forms complete with\n[client-side validation](https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation#built-in_form_validation_examples).\n\n```js\nconst form = preview.querySelector('xin-form')\npreview.querySelector('.submit').addEventListener('click', form.submit)\n```\n```html\n<xin-form value='{\"formInitializer\": \"initial value from form\"}'>\n <h3 slot=\"header\">Example Form Header</h3>\n <xin-field caption=\"Required field\" key=\"required\"></xin-field>\n <xin-field optional key=\"optional\"><i>Optional</i> Field</xin-field>\n <xin-field key=\"text\" type=\"text\" placeholder=\"type it in here\">Tell us a long story</xin-field>\n <xin-field caption=\"Zip Code\" placeholder=\"12345 or 12345-6789\" key=\"zipcode\" pattern=\"\\d{5}(-\\d{4})?\"></xin-field>\n <xin-field caption=\"Date\" key=\"date\" type=\"date\"></xin-field>\n <xin-field caption=\"Number\" key=\"number\" type=\"number\"></xin-field>\n <xin-field caption=\"Range\" key=\"range\" type=\"range\" min=\"0\" max=\"10\"></xin-field>\n <xin-field key=\"boolean\" type=\"checkbox\">😃 <b>Agreed?!</b></xin-field>\n <xin-field key=\"color\" type=\"color\" value=\"pink\">\n favorite color\n </xin-field>\n <xin-field key=\"select\">\n Custom Field\n <select slot=\"input\">\n <option>This</option>\n <option>That</option>\n <option>The Other</option>\n </select>\n </xin-field>\n <xin-field key=\"tags\">\n Tag List\n <xin-tag-list editable slot=\"input\" available-tags=\"pick me,no pick me\"></xin-tag-list>\n </xin-field>\n <xin-field key=\"rating\">\n Rate this form!\n <xin-rating slot=\"input\"></xin-rating>\n </xin-field>\n <xin-field key=\"like\">\n Do you like it?\n <xin-segmented\n choices=\"yes=Yes:thumbsUp,no=No:thumbsDown\"\n slot=\"input\"\n ></xin-segmented>\n </xin-field>\n <xin-field key=\"relationship\">\n Relationship Status\n <xin-segmented\n style=\"--segmented-direction: column; --segmented-align-items: stretch\"\n choices=\"couple=In a relationship,single=Single\"\n other=\"It's complicated…\"\n slot=\"input\"\n ></xin-segmented>\n </xin-field>\n <xin-field key=\"amount\" fixed-precision=\"2\" type=\"number\" prefix=\"$\" suffix=\"(USD)\">\n What's it worth?\n </xin-field>\n <xin-field key=\"valueInitializer\" value=\"initial value from field\">\n Initialized by field\n </xin-field>\n <xin-field key=\"formInitializer\">\n Initialized by form\n </xin-field>\n <button slot=\"footer\" class=\"submit\">Submit</button>\n</xin-form>\n```\n```css\n.preview xin-form {\n height: 100%;\n}\n\n.preview ::part(header), .preview ::part(footer) {\n background: var(--inset-bg);\n justify-content: center;\n padding: calc(var(--spacing) * 0.5) var(--spacing);\n}\n\n.preview h3, .preview h4 {\n margin: 0;\n padding: 0;\n}\n\n.preview ::part(content) {\n padding: var(--spacing);\n gap: var(--spacing);\n background: var(--background);\n}\n\n.preview label {\n display: grid;\n grid-template-columns: 180px auto 100px;\n gap: var(--spacing);\n}\n\n.preview label [part=\"caption\"] {\n text-align: right;\n}\n\n.preview label:has(:invalid:required)::after {\n content: '* required'\n}\n\n@media (max-width: 500px) {\n .preview label [part=\"caption\"] {\n text-align: center;\n }\n\n .preview label {\n display: flex;\n flex-direction: column;\n position: relative;\n align-items: stretch;\n gap: calc(var(--spacing) * 0.5);\n }\n\n .preview label:has(:invalid:required)::after {\n position: absolute;\n top: 0;\n right: 0;\n content: '*'\n }\n\n .preview xin-field [part=\"field\"],\n .preview xin-field [part=\"input\"] > * {\n display: flex;\n justify-content: center;\n }\n}\n\n.preview :invalid {\n box-shadow: inset 0 0 0 2px #F008;\n}\n```\n\n## `<xin-form>`\n\n`<xin-form>` prevents the default form behavior when a `submit` event is triggered and instead validates the\nform contents (generating feedback if desired) and calls its `submitCallback(value: {[key: string]: any}, isValid: boolean): void`\nmethod.\n\n`<xin-form>` offers a `fields` proxy that allows values stored in the form to be updated. Any changes will trigger a `change`\nevent on the `<xin-form>` (in addition to any events fired by form fields).\n\n`<xin-form>` instances have `value` and `isValid` properties you can access any time. Note that `isValid` is computed\nand triggers form validation.\n\n`<xin-form>` has `header` and `footer` `<slot>`s in addition to default `<slot>`, which is tucked inside a `<form>` element.\n\n## `<xin-field>`\n\n`<xin-field>` is a simple web-component with no shadowDOM that combines an `<input>` field wrapped with a `<label>`. Any\ncontent of the custom-element will become the `caption` or you can simply set the `caption` attribute.\n\nYou can replace the default `<input>` field by adding an element to the slot `input` (it's a `xinSlot`) whereupon\nthe `value` of that element will be used instead of the built-in `<input>`. (The `<input>` is retained and\nis used to drive form-validation.)\n\n`<xin-field>` supports the following attributes:\n\n- `caption` labels the field\n- `key` determines the form property the field will populate\n- `type` determines the data-type: '' | 'checkbox' | 'number' | 'range' | 'date' | 'text' | 'color'\n- `optional` turns off the `required` attribute (fields are required by default)\n- `pattern` is an (optional) regex pattern\n- `placeholder` is an (optional) placeholder\n\nThe `text` type populates the `input` slot with a `<textarea>` element.\n\nThe `color` type populates the `input` slot with a `<xin-color>` element (and thus supports colors with alpha values).\n\n<xin-css-var-editor element-selector=\"xin-field\" target-selector=\".preview\"></xin-css-var-editor>\n*/\n\nimport {\n Component as XinComponent,\n ElementCreator,\n elements,\n varDefault,\n} from 'tosijs'\n\nimport { colorInput } from './color-input'\n\nconst { form, slot, xinSlot, label, input, span } = elements\n\nfunction attr(element: HTMLElement, name: string, value: any): void {\n if (value !== '' && value !== false) {\n element.setAttribute(name, value)\n } else {\n element.removeAttribute(name)\n }\n}\n\nfunction getInputValue(input: HTMLInputElement): any {\n switch (input.type) {\n case 'checkbox':\n return input.checked\n case 'radio': {\n const picked = input.parentElement?.querySelector(\n `input[type=\"radio\"][name=\"${input.name}\"]:checked`\n ) as HTMLInputElement | null\n return picked ? picked.value : null\n }\n case 'range':\n case 'number':\n return Number(input.value)\n default:\n return Array.isArray(input.value) && input.value.length === 0\n ? null\n : input.value\n }\n}\n\nfunction setElementValue(input: HTMLElement | null | undefined, value: any) {\n if (!(input instanceof HTMLElement)) {\n // do nothing\n } else if (input instanceof HTMLInputElement) {\n switch (input.type) {\n case 'checkbox':\n input.checked = value\n break\n case 'radio':\n input.checked = value === input.value\n break\n default:\n input.value = String(value || '')\n }\n } else {\n if (value != null || (input as HTMLInputElement).value != null) {\n ;(input as HTMLInputElement).value = String(value || '')\n }\n }\n}\n\nexport class XinField extends XinComponent {\n caption = ''\n key = ''\n type: '' | 'checkbox' | 'number' | 'range' | 'date' | 'text' | 'color' = ''\n optional = false\n pattern = ''\n placeholder = ''\n min = ''\n max = ''\n step = ''\n fixedPrecision = -1\n value: any = null\n\n content = label(\n xinSlot({ part: 'caption' }),\n span(\n { part: 'field' },\n xinSlot({ part: 'input', name: 'input' }),\n input({ part: 'valueHolder' })\n )\n )\n\n constructor() {\n super()\n this.initAttributes(\n 'caption',\n 'key',\n 'type',\n 'optional',\n 'pattern',\n 'placeholder',\n 'min',\n 'max',\n 'step',\n 'fixedPrecision',\n 'prefix',\n 'suffix'\n )\n }\n\n private valueChanged = false\n handleChange = () => {\n const { input, valueHolder } = this.parts as {\n input: HTMLElement\n valueHolder: HTMLInputElement\n }\n const inputElement = (input.children[0] || valueHolder) as HTMLInputElement\n if (inputElement !== valueHolder) {\n valueHolder.value = inputElement.value\n }\n this.value = getInputValue(inputElement)\n this.valueChanged = true\n const form = this.closest('xin-form') as XinForm\n if (form && this.key !== '') {\n switch (this.type) {\n case 'checkbox':\n form.fields[this.key] = inputElement.checked\n break\n case 'number':\n case 'range':\n if (this.fixedPrecision > -1) {\n inputElement.value = Number(inputElement.value).toFixed(\n this.fixedPrecision\n )\n form.fields[this.key] = Number(inputElement.value)\n } else {\n form.fields[this.key] = Number(inputElement.value)\n }\n break\n default:\n form.fields[this.key] = inputElement.value\n }\n }\n }\n\n initialize(form: XinForm) {\n const initialValue =\n form.fields[this.key] !== undefined ? form.fields[this.key] : this.value\n\n if (initialValue != null && initialValue !== '') {\n if (form.fields[this.key] == null) form.fields[this.key] = initialValue\n this.value = initialValue\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n const { input, valueHolder } = this.parts as {\n input: HTMLElement\n valueHolder: HTMLInputElement\n }\n\n const form = this.closest(XinForm.tagName!)\n if (form instanceof XinForm) {\n this.initialize(form)\n }\n\n valueHolder.addEventListener('change', this.handleChange)\n input.addEventListener('change', this.handleChange, true)\n }\n\n render() {\n if (this.valueChanged) {\n this.valueChanged = false\n return\n }\n const { input, caption, valueHolder, field } = this.parts as {\n input: HTMLElement\n field: HTMLElement\n caption: HTMLElement\n valueHolder: HTMLInputElement\n }\n if (caption.textContent?.trim() === '') {\n caption.append(this.caption !== '' ? this.caption : this.key)\n }\n if (this.type === 'text') {\n input.textContent = ''\n const textarea = elements.textarea({ value: this.value })\n if (this.placeholder) {\n textarea.setAttribute('placeholder', this.placeholder)\n }\n input.append(textarea)\n } else if (this.type === 'color') {\n input.textContent = ''\n input.append(colorInput({ value: this.value }))\n } else if (input.children.length === 0) {\n attr(valueHolder, 'placeholder', this.placeholder)\n attr(valueHolder, 'type', this.type)\n attr(valueHolder, 'pattern', this.pattern)\n attr(valueHolder, 'min', this.min)\n attr(valueHolder, 'max', this.max)\n if (this.step) {\n attr(valueHolder, 'step', this.step)\n } else if (this.fixedPrecision > 0 && this.type === 'number') {\n attr(valueHolder, 'step', Math.pow(10, - this.fixedPrecision))\n }\n }\n setElementValue(valueHolder, this.value)\n setElementValue(input.children[0] as HTMLElement, this.value)\n\n this.prefix\n ? field.setAttribute('prefix', this.prefix)\n : field.removeAttribute('prefix')\n this.suffix\n ? field.setAttribute('suffix', this.suffix)\n : field.removeAttribute('suffix')\n\n valueHolder.classList.toggle('hidden', input.children.length > 0)\n if (input.children.length > 0) {\n valueHolder.setAttribute('tabindex', '-1')\n } else {\n valueHolder.removeAttribute('tabindex')\n }\n input.style.display = input.children.length === 0 ? 'none' : ''\n attr(valueHolder, 'required', !this.optional)\n }\n}\n\nexport class XinForm extends XinComponent {\n context = {} as { [key: string]: any }\n value = {} as { [key: string]: any }\n get isValid(): boolean {\n const widgets = (\n [...this.querySelectorAll('*')] as HTMLInputElement[]\n ).filter((widget) => widget.required !== undefined)\n return widgets.find((widget) => !widget.reportValidity()) === undefined\n }\n\n static styleSpec = {\n ':host': {\n display: 'flex',\n flexDirection: 'column',\n },\n ':host::part(header), :host::part(footer)': {\n display: 'flex',\n },\n ':host::part(content)': {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden auto',\n height: '100%',\n width: '100%',\n position: 'relative',\n boxSizing: 'border-box',\n },\n ':host form': {\n display: 'flex',\n flex: '1 1 auto',\n position: 'relative',\n overflow: 'hidden',\n },\n }\n\n content = [\n slot({ part: 'header', name: 'header' }),\n form({ part: 'form' }, slot({ part: 'content' })),\n slot({ part: 'footer', name: 'footer' }),\n ]\n\n getField = (key: string): XinField | null => {\n return this.querySelector(`xin-field[key=\"${key}\"]`) as XinField | null\n }\n\n get fields(): any {\n if (typeof this.value === 'string') {\n try {\n this.value = JSON.parse(this.value)\n } catch (e) {\n console.log('<xin-form> could not use its value, expects valid JSON')\n this.value = {}\n }\n }\n const { getField } = this\n const dispatch = this.dispatchEvent.bind(this)\n return new Proxy(this.value, {\n get(target, prop: string): any {\n return target[prop]\n },\n\n set(target, prop: string, newValue: any): boolean {\n if (target[prop] !== newValue) {\n target[prop] = newValue\n const field = getField(prop)\n if (field) {\n field.value = newValue\n }\n dispatch(new Event('change'))\n }\n return true\n },\n })\n }\n\n set fields(values: { [key: string]: any }) {\n const fields = [...this.querySelectorAll(XinField.tagName!)] as XinField[]\n for (const field of fields) {\n field.value = values[field.key]\n }\n }\n\n submit = () => {\n this.parts.form.dispatchEvent(new Event('submit'))\n }\n\n handleSubmit = (event: SubmitEvent) => {\n event.preventDefault()\n event.stopPropagation()\n this.submitCallback(this.value, this.isValid)\n }\n\n submitCallback = (value: { [key: string]: any }, isValid: boolean): void => {\n console.log('override submitCallback to handle this data', {\n value,\n isValid,\n })\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n const { form } = this.parts as { form: HTMLFormElement }\n form.addEventListener('submit', this.handleSubmit)\n }\n}\n\nexport const xinField = XinField.elementCreator({\n tag: 'xin-field',\n styleSpec: {\n ':host [part=\"field\"]': {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n gap: varDefault.prefixSuffixGap('8px'),\n },\n ':host [part=\"field\"][prefix]::before': {\n content: 'attr(prefix)',\n },\n ':host [part=\"field\"][suffix]::after': {\n content: 'attr(suffix)',\n },\n ':host [part=\"field\"] > *, :host [part=\"input\"] > *': {\n width: '100%',\n },\n ':host textarea': {\n resize: 'none',\n },\n ':host input[type=\"checkbox\"]': {\n width: 'fit-content',\n },\n ':host .hidden': {\n position: 'absolute',\n pointerEvents: 'none',\n opacity: 0,\n },\n },\n}) as ElementCreator<XinField>\n\nexport const xinForm = XinForm.elementCreator({\n tag: 'xin-form',\n}) as ElementCreator<XinForm>\n",
27
- "/*#\n# gamepads\n\nA couple of utility functions for dealing with gamepads and XRInputs.\n\n`gamepadState()` gives you a condensed version of active gamepad state\n\n`gamepadText()` provides the above in minimal text form for debugging\n\n```js\nconst { elements } = tosijs\nconst { gamepadText } = tosijsui\n\nconst pre = elements.pre()\npreview.append(pre)\n\nconst interval = setInterval(() => {\n if (!pre.closest('body')) {\n clearInterval(interval)\n } else {\n pre.textContent = gamepadText()\n }\n}, 100)\n```\n\n## XRInput Devices\n\n> This is experimental, the API is changing and stuff doesn't work. Hopefully it\n> will become a lot more generally useful once Apple's VisionPro comes out.\n\n`xrControllers(babylonjsXRHelper)` returns an `XinXRControllerMap` structure that tries to\nconveniently render the current state of XR controls. (The babylonjs API for this is horrific!)\n\n`xrControllerText(controllerMap)` renders the map output by the above in a compact form\nwhich is useful when debugging.\n*/\n\nexport interface XinButton {\n index: number\n pressed: boolean\n value: number\n}\nexport interface XinGamepad {\n id: string\n axes: number[]\n buttons: { [key: number]: number }\n}\n\nexport function gamepadState() {\n const gamepads: Gamepad[] = navigator\n .getGamepads()\n .filter((p) => p !== null) as Gamepad[]\n\n return gamepads.map((p) => {\n const { id, axes, buttons } = p\n return {\n id,\n axes,\n buttons: buttons\n .map((button, index) => {\n const { pressed, value } = button\n return {\n index,\n pressed,\n value,\n } as XinButton\n })\n .filter((b) => b.pressed || b.value !== 0)\n .reduce((map: { [key: number]: number }, button) => {\n map[button.index] = button.value\n return map\n }, {}),\n }\n })\n}\n\nexport function gamepadText() {\n const state = gamepadState()\n return state.length === 0\n ? 'no active gamepads'\n : state\n .map(({ id, axes, buttons }) => {\n const axesText = axes.map((a) => a.toFixed(2)).join(' ')\n const buttonText = Object.keys(buttons)\n .map((key) => `[${key}](${buttons[Number(key)].toFixed(2)})`)\n .join(' ')\n return `${id}\\n${axesText}\\n${buttonText}`\n })\n .join('\\n')\n}\n\nexport interface XinXRControllerComponentState {\n pressed: boolean\n axes?: number[]\n}\n\nexport interface XinXRControllerState {\n [key: string]: XinXRControllerComponentState\n}\n\nexport interface XinXRControllerMap {\n [key: string]: XinXRControllerState\n}\n\nexport function xrControllers(xrHelper: any) {\n const controllers = {} as { [key: string]: XinXRControllerState }\n xrHelper.input.onControllerAddedObservable.add((controller: any) => {\n controller.onMotionControllerInitObservable.add((mc: any) => {\n const state = {} as XinXRControllerState\n const componentIds = mc.getComponentIds() as string[]\n componentIds.forEach((componentId) => {\n const component = mc.getComponent(componentId)\n state[componentId] = { pressed: component.pressed as boolean }\n component.onButtonStateChangedObservable.add(() => {\n state[componentId].pressed = component.pressed\n })\n // TODO does this work?! inquiring minds…\n if (component.onAxisValueChangedObservable) {\n state[componentId].axes = [] as number[]\n component.onAxisValueChangedObservable.add((axes: number[]) => {\n state[componentId].axes = axes\n })\n }\n })\n controllers[mc.handedness] = state\n })\n })\n return controllers\n}\n\nexport function xrControllersText(controllers?: XinXRControllerMap) {\n if (controllers === undefined || Object.keys(controllers).length === 0) {\n return 'no xr inputs'\n }\n\n return Object.keys(controllers)\n .map((controllerId) => {\n const state = controllers[controllerId] as XinXRControllerState\n const buttonText = Object.keys(state)\n .filter((componentId) => state[componentId].pressed)\n .join(' ')\n return `${controllerId}\\n${buttonText}`\n })\n .join('\\n')\n}\n",
28
- "/*#\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\nconst { div } = 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 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\nA `<xin-example>` can be 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). By default, that context comprises `preview`\n(the `<div>` in which the example is rendered), `tosijs` (`* from 'tosijs'`),\nand `tosijsui` (`* from 'tosijs-ui'`).\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 } = elements\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 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 hidden: true,\n },\n h4('Code'),\n button(\n {\n title: 'close code',\n class: 'transparent close-button',\n onClick: this.closeCode,\n },\n icons.x()\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',\n class: 'transparent',\n onClick: this.copy,\n },\n icons.copy()\n ),\n button(\n {\n title: 'reload',\n class: 'transparent',\n onClick: this.refreshRemote,\n },\n icons.refreshCw()\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 let sourceHTML = []\n if (this.html)\n sourceHTML.push(`<pre class=\"language-html\">${this.html}</pre>`)\n if (this.css)\n sourceHTML.push(`<pre class=\"language-css\">${this.css}</pre>`)\n if (this.js) sourceHTML.push(`<pre class=\"language-js\">${this.js}</pre>`)\n sources.innerHTML = sourceHTML.join('\\n')\n */\n }\n }\n\n refresh = () => {\n if (this.remoteId !== '') {\n return\n }\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 // @ts-expect-error ts is wrong and it makes me so mad\n const func = new AsyncFunction(...Object.keys(context), this.js)\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 .close-button': {\n position: 'absolute',\n top: '0',\n right: '0',\n color: 'var(--code-editors-bar-color)',\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\nexport function makeExamplesLive(element: HTMLElement) {\n const preElements = [...element.querySelectorAll('pre')].filter((pre) =>\n ['js', 'html', 'css', 'json'].includes(pre.innerText.split('\\n')[0])\n )\n for (let i = 0; i < preElements.length; i++) {\n const parts = [preElements[i]]\n while (preElements[i].nextElementSibling === preElements[i + 1]) {\n parts.push(preElements[i + 1])\n i += 1\n }\n const example = liveExample()\n element.insertBefore(example, parts[0])\n example.initFromElements(parts)\n }\n}\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",
29
- "/*#\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\nconst { div, button } = 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",
28
+ "/*#\n# gamepads\n\nA couple of utility functions for dealing with gamepads and XRInputs.\n\n`gamepadState()` gives you a condensed version of active gamepad state\n\n`gamepadText()` provides the above in minimal text form for debugging\n\n```js\nimport { elements } from 'tosijs'\nimport { gamepadText } from 'tosijs-ui'\n\nconst pre = elements.pre()\npreview.append(pre)\n\nconst interval = setInterval(() => {\n if (!pre.closest('body')) {\n clearInterval(interval)\n } else {\n pre.textContent = gamepadText()\n }\n}, 100)\n```\n\n## XRInput Devices\n\n> This is experimental, the API is changing and stuff doesn't work. Hopefully it\n> will become a lot more generally useful once Apple's VisionPro comes out.\n\n`xrControllers(babylonjsXRHelper)` returns an `XinXRControllerMap` structure that tries to\nconveniently render the current state of XR controls. (The babylonjs API for this is horrific!)\n\n`xrControllerText(controllerMap)` renders the map output by the above in a compact form\nwhich is useful when debugging.\n*/\n\nexport interface XinButton {\n index: number\n pressed: boolean\n value: number\n}\nexport interface XinGamepad {\n id: string\n axes: number[]\n buttons: { [key: number]: number }\n}\n\nexport function gamepadState() {\n const gamepads: Gamepad[] = navigator\n .getGamepads()\n .filter((p) => p !== null) as Gamepad[]\n\n return gamepads.map((p) => {\n const { id, axes, buttons } = p\n return {\n id,\n axes,\n buttons: buttons\n .map((button, index) => {\n const { pressed, value } = button\n return {\n index,\n pressed,\n value,\n } as XinButton\n })\n .filter((b) => b.pressed || b.value !== 0)\n .reduce((map: { [key: number]: number }, button) => {\n map[button.index] = button.value\n return map\n }, {}),\n }\n })\n}\n\nexport function gamepadText() {\n const state = gamepadState()\n return state.length === 0\n ? 'no active gamepads'\n : state\n .map(({ id, axes, buttons }) => {\n const axesText = axes.map((a) => a.toFixed(2)).join(' ')\n const buttonText = Object.keys(buttons)\n .map((key) => `[${key}](${buttons[Number(key)].toFixed(2)})`)\n .join(' ')\n return `${id}\\n${axesText}\\n${buttonText}`\n })\n .join('\\n')\n}\n\nexport interface XinXRControllerComponentState {\n pressed: boolean\n axes?: number[]\n}\n\nexport interface XinXRControllerState {\n [key: string]: XinXRControllerComponentState\n}\n\nexport interface XinXRControllerMap {\n [key: string]: XinXRControllerState\n}\n\nexport function xrControllers(xrHelper: any) {\n const controllers = {} as { [key: string]: XinXRControllerState }\n xrHelper.input.onControllerAddedObservable.add((controller: any) => {\n controller.onMotionControllerInitObservable.add((mc: any) => {\n const state = {} as XinXRControllerState\n const componentIds = mc.getComponentIds() as string[]\n componentIds.forEach((componentId) => {\n const component = mc.getComponent(componentId)\n state[componentId] = { pressed: component.pressed as boolean }\n component.onButtonStateChangedObservable.add(() => {\n state[componentId].pressed = component.pressed\n })\n // TODO does this work?! inquiring minds…\n if (component.onAxisValueChangedObservable) {\n state[componentId].axes = [] as number[]\n component.onAxisValueChangedObservable.add((axes: number[]) => {\n state[componentId].axes = axes\n })\n }\n })\n controllers[mc.handedness] = state\n })\n })\n return controllers\n}\n\nexport function xrControllersText(controllers?: XinXRControllerMap) {\n if (controllers === undefined || Object.keys(controllers).length === 0) {\n return 'no xr inputs'\n }\n\n return Object.keys(controllers)\n .map((controllerId) => {\n const state = controllers[controllerId] as XinXRControllerState\n const buttonText = Object.keys(state)\n .filter((componentId) => state[componentId].pressed)\n .join(' ')\n return `${controllerId}\\n${buttonText}`\n })\n .join('\\n')\n}\n",
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 } = elements\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 h4('Code'),\n button(\n {\n title: 'close code',\n class: 'transparent close-button',\n onClick: this.closeCode,\n },\n icons.x()\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 )\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(\n 'https://cdn.jsdelivr.net/npm/sucrase@3.35.0/+esm'\n )\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(new RegExp(`import \\\\{(.*)\\\\} from '${moduleName}'`, 'g'), `const {$1} = ${moduleName.replace(/-/g, '')}`)\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 .close-button': {\n position: 'absolute',\n top: '0',\n right: '0',\n color: 'var(--code-editors-bar-color)',\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\nexport function makeExamplesLive(element: HTMLElement) {\n const preElements = [...element.querySelectorAll('pre')].filter((pre) =>\n ['js', 'html', 'css', 'json'].includes(pre.innerText.split('\\n')[0])\n )\n for (let i = 0; i < preElements.length; i++) {\n const parts = [preElements[i]]\n while (preElements[i].nextElementSibling === preElements[i + 1]) {\n parts.push(preElements[i + 1])\n i += 1\n }\n const example = liveExample()\n element.insertBefore(example, parts[0])\n example.initFromElements(parts)\n }\n}\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
+ "/*#\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",
30
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",
31
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
- "/*#\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\nconst { tosiMonth, postNotification } = tosijsui\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",
33
- "/*#\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\nconst { postNotification, icons } = tosijsui\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 xinjs-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 } = 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",
34
- "/*#\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\nconst { xinLocalized, localize } = tosijsui\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",
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
+ "/*#\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 xinjs-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 } = 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
+ "/*#\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",
35
36
  "/*#\n# rating\n\n`XinRating` / `<xin-rating>` provides a drop-in replacement for an `<input>`\nthat renders a rating using <xin-icon icon=\"star\" color=\"red\"></xin-icon>s.\n\n```html\n<xin-rating value=3.4></xin-rating>\n<xin-rating min=0 value=3.4 step=0.5 hollow></xin-rating>\n<xin-rating value=3.4 color=\"deepskyblue\"></xin-rating>\n<xin-rating value=3.1 max=10 color=\"hotpink\" icon=\"heart\" icon-size=32></xin-rating>\n```\n```css\n.preview {\n display: flex;\n flex-direction: column;\n}\n```\n\n## Attributes\n\n- `icon-size` (24 by default) determines the height of the control and along with `max` its width\n- `max` maximum rating\n- `min` (1 by default) can be 0 or 1 (allowing ratings of 0 to max or 1 to max)\n- `step` (0.5 by default) granularity of rating\n- `icon` ('star' by default) determines the icon used\n- `rating-stroke` (#f91 by default) is the stroke of rating icons\n- `rating-fill` (#e81 by default) is the color of rating icons\n- `empty-stroke` (none by default) is the color of background icons\n- `empty-fill` (#ccc by default) is the color of background icons\n- `readonly` (false by default) prevents the user from changing the rating\n- `hollow` (false by default) makes the empty rating icons hollow.\n\n## Keyboard\n\n`<xin-rating>` should be fully keyboard navigable (and, I hope, accessible).\n\nThe up key increases the rating, down descreases it. This is the same\nas the behavior of `<input type=\"number\">`, [Shoelace's rating widget](https://shoelace.style/components/rating/),\nand (in my opinion) common sense, but not like [MUI's rating widget](https://mui.com/material-ui/react-rating/).\n*/\n\nimport { Component, elements, ElementCreator, vars, PartsMap } from 'tosijs'\nimport { icons } from './icons'\n\nconst { span } = elements\n\ninterface RatingParts extends PartsMap {\n empty: HTMLElement\n filled: HTMLElement\n container: HTMLElement\n}\n\nexport class XinRating extends Component {\n iconSize = 24\n min: 0 | 1 = 1\n max = 5\n step = 1\n value: number | null = null\n icon = 'star'\n ratingFill = '#f91'\n ratingStroke = '#e81'\n emptyFill = '#ccc'\n emptyStroke = 'none'\n readonly = false\n hollow = false\n\n static styleSpec = {\n ':host': {\n display: 'inline-block',\n position: 'relative',\n width: 'fit-content',\n },\n ':host::part(container)': {\n position: 'relative',\n display: 'inline-block',\n },\n ':host::part(empty), :host::part(filled)': {\n height: '100%',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n },\n ':host::part(empty)': {\n pointerEvents: 'none',\n _xinIconFill: vars.emptyFill,\n _xinIconStroke: vars.emptyStroke,\n },\n ':host::part(filled)': {\n position: 'absolute',\n left: 0,\n _xinIconFill: vars.ratingFill,\n _xinIconStroke: vars.ratingStroke,\n },\n ':host svg': {\n transform: 'scale(0.9)',\n pointerEvents: 'all !important',\n transition: '0.25s ease-in-out',\n },\n ':host svg:hover': {\n transform: 'scale(1)',\n },\n ':host svg:active': {\n transform: 'scale(1.1)',\n },\n }\n\n constructor() {\n super()\n\n this.initAttributes(\n 'max',\n 'min',\n 'icon',\n 'step',\n 'ratingStroke',\n 'ratingColor',\n 'emptyStroke',\n 'emptyColor',\n 'readonly',\n 'iconSize',\n 'hollow'\n )\n }\n\n content = () =>\n span(\n { part: 'container' },\n span({ part: 'empty' }),\n span({ part: 'filled' })\n )\n\n displayValue(value: number | null) {\n const { empty, filled } = this.parts as RatingParts\n const roundedValue = Math.round((value || 0) / this.step) * this.step\n filled.style.width = (roundedValue / this.max) * empty.offsetWidth + 'px'\n }\n\n update = (event: Event) => {\n if (this.readonly) {\n return\n }\n\n const { empty } = this.parts as RatingParts\n\n const x =\n event instanceof MouseEvent\n ? event.pageX - empty.getBoundingClientRect().x\n : 0\n const value = Math.min(\n Math.max(\n this.min,\n Math.round(\n ((x / empty.offsetWidth) * this.max) / this.step + this.step * 0.5\n ) * this.step\n ),\n this.max\n )\n if (event.type === 'click') {\n this.value = value\n } else if (event.type === 'mousemove') {\n this.displayValue(value)\n } else {\n this.displayValue(this.value || 0)\n }\n }\n\n handleKey = (event: KeyboardEvent) => {\n let value = Number(this.value)\n if (value == null) {\n value = Math.round((this.min + this.max) * 0.5 * this.step) * this.step\n }\n let blockEvent = false\n switch (event.key) {\n case 'ArrowUp':\n case 'ArrowRight':\n value += this.step\n blockEvent = true\n break\n case 'ArrowDown':\n case 'ArrowLeft':\n value -= this.step\n blockEvent = true\n break\n }\n this.value = Math.max(Math.min(value, this.max), this.min)\n if (blockEvent) {\n event.stopPropagation()\n event.preventDefault()\n }\n }\n\n connectedCallback() {\n super.connectedCallback()\n\n const { container } = this.parts as RatingParts\n\n container.tabIndex = 0\n container.addEventListener('mousemove', this.update, true)\n container.addEventListener('mouseleave', this.update)\n container.addEventListener('blur', this.update)\n container.addEventListener('click', this.update)\n\n container.addEventListener('keydown', this.handleKey)\n }\n\n private _renderedIcon = ''\n\n render() {\n super.render()\n\n const height = this.iconSize + 'px'\n this.style.setProperty('--rating-fill', this.ratingFill)\n this.style.setProperty('--rating-stroke', this.ratingStroke)\n this.style.setProperty('--empty-fill', this.emptyFill)\n this.style.setProperty('--empty-stroke', this.emptyStroke)\n this.style.setProperty('--xin-icon-size', height)\n\n if (this.readonly) {\n this.role = 'image'\n } else {\n this.role = 'slider'\n }\n this.ariaLabel = `rating ${this.value} out of ${this.max}`\n this.ariaValueMax = String(this.max)\n this.ariaValueMin = String(this.min)\n this.ariaValueNow = this.value === null ? String(-1) : String(this.value)\n\n const { empty, filled } = this.parts\n empty.classList.toggle('hollow', this.hollow)\n\n if (this._renderedIcon !== this.icon) {\n this._renderedIcon = this.icon\n for (let i = 0; i < this.max; i++) {\n empty.append(icons[this.icon]())\n filled.append(icons[this.icon]())\n }\n }\n\n this.displayValue(this.value)\n }\n}\n\nexport const xinRating = XinRating.elementCreator({\n tag: 'xin-rating',\n}) as ElementCreator<XinRating>\n",
36
- "/*#\n# word (rich text editor)\n\n`<xin-word>` is a simple and easily extensible `document.execCommand` WYSIWYG editor with some conveniences.\n\n```html\n<xin-word widgets=\"minimal\">\n<h3>Heading</h3>\n<p>And some <b>text</b></p>\n</xin-word>\n```\n```css\nxin-word {\n background: white;\n}\n\nxin-word [part=\"toolbar\"] {\n background: #f8f8f8;\n}\n\nxin-word [part=\"doc\"] {\n padding: 20px;\n}\n```\n\nBy default, `<xin-word>` treats its initial contents as its document, but you can also set (and get)\nits `value`.\n\n## toolbar\n\n`<xin-word>` elements have a `toolbar` slot (actually a xin-slot because it doesn't use\nthe shadowDOM).\n\nIf you set the `widgets` attribute to `default` or `minimal` you will get a toolbar\nfor free. Or you can add your own custom widgets.\n\n## helper functions\n\nA number of helper functions are available, including:\n\n- `commandButton(title: string, command: string, iconClass: string)`\n- `blockStyle(options: Array<{caption: string, tagType: string}>)`\n- `spacer(width = '10px')`\n- `elastic(width = '10px')`\n\nThese each create a toolbar widget. A `blockStyle`-generated `<select>` element will\nautomatically have its value changed based on the current selection.\n\n## properties\n\nA `<xin-word>` element also has `selectedText` and `selectedBlocks` properties, allowing\nyou to easily perform operations on text selections, and a `selectionChange` callback (which\nsimply passes through document `selectionchange` events, but also passes a reference to\nthe `<xin-word>` component).\n*/\n\nimport { Component as WebComponent, ElementCreator, PartsMap, elements } from 'tosijs'\nimport { icons } from './icons'\n\nimport { xinSelect, XinSelect } from './select'\n\nconst { xinSlot, div, button, span } = elements\n\nconst blockStyles = [\n {\n caption: 'Title',\n tagType: 'H1',\n },\n {\n caption: 'Heading',\n tagType: 'H2',\n },\n {\n caption: 'Subheading',\n tagType: 'H3',\n },\n {\n caption: 'Minor heading',\n tagType: 'H4',\n },\n {\n caption: 'Body',\n tagType: 'P',\n },\n {\n caption: 'Code Block',\n tagType: 'PRE',\n },\n]\n\nexport function blockStyle(options = blockStyles) {\n return xinSelect({\n title: 'paragraph style',\n slot: 'toolbar',\n class: 'block-style',\n options: options.map(({ caption, tagType }) => ({\n caption,\n value: `formatBlock,${tagType}`,\n })),\n })\n}\n\nexport function spacer(width = '10px') {\n return span({\n slot: 'toolbar',\n style: { flex: `0 0 ${width}`, content: ' ' },\n })\n}\n\nexport function elastic(width = '10px') {\n return span({\n slot: 'toolbar',\n style: { flex: `0 0 ${width}`, content: ' ' },\n })\n}\n\nexport function commandButton(\n title: string,\n dataCommand: string,\n icon: SVGElement\n) {\n return button({ slot: 'toolbar', dataCommand, title }, icon)\n}\n\nconst paragraphStyleWidgets = () => [\n commandButton('left-justify', 'justifyLeft', icons.alignLeft()),\n commandButton('center', 'justifyCenter', icons.alignCenter()),\n commandButton('right-justify', 'justifyRight', icons.alignRight()),\n spacer(),\n commandButton('bullet list', 'insertUnorderedList', icons.listBullet()),\n commandButton('numbered list', 'insertOrderedList', icons.listNumber()),\n spacer(),\n commandButton('indent', 'indent', icons.blockIndent()),\n commandButton('indent', 'outdent', icons.blockOutdent()),\n]\n\nconst characterStyleWidgets = () => [\n commandButton('bold', 'bold', icons.fontBold()),\n commandButton('italic', 'italic', icons.fontItalic()),\n commandButton('underline', 'underline', icons.fontUnderline()),\n]\n\nconst minimalWidgets = () => [\n blockStyle(),\n spacer(),\n ...characterStyleWidgets(),\n]\n\nexport const richTextWidgets = () => [\n blockStyle(),\n spacer(),\n ...paragraphStyleWidgets(),\n spacer(),\n ...characterStyleWidgets(),\n]\n\ninterface EditorParts extends PartsMap {\n toolbar: HTMLElement\n doc: HTMLElement\n content: HTMLElement\n}\n\nexport class RichText extends WebComponent<EditorParts> {\n widgets: 'none' | 'minimal' | 'default' = 'default'\n\n private isInitialized = false\n\n get value(): string {\n return this.isInitialized\n ? this.parts.doc.innerHTML\n : this.savedValue || this.innerHTML\n }\n\n set value(docHtml: string) {\n if (this.isInitialized) {\n this.parts.doc.innerHTML = docHtml\n } else {\n this.innerHTML = docHtml\n }\n }\n\n blockElement(elt: Node): Element | undefined {\n const { doc } = this.parts\n while (elt.parentElement !== null && elt.parentElement !== doc) {\n elt = elt.parentElement\n }\n return elt.parentElement === doc ? (elt as Element) : undefined\n }\n\n get selectedBlocks(): any[] {\n const { doc } = this.parts\n const selObject = window.getSelection()\n if (selObject === null) {\n return []\n }\n const blocks = [] as any[]\n for (let i = 0; i < selObject.rangeCount; i++) {\n const range = selObject.getRangeAt(i)\n if (!doc.contains(range.commonAncestorContainer)) {\n continue\n }\n let block: Element | null = this.blockElement(\n range.startContainer\n ) as Element\n const lastBlock = this.blockElement(range.endContainer) as Element\n blocks.push(block)\n while (block !== lastBlock && block !== null) {\n block = block.nextElementSibling\n blocks.push(block)\n }\n }\n return blocks\n }\n\n get selectedText(): string {\n const selObject = window.getSelection()\n if (selObject === null) {\n return ''\n }\n return this.selectedBlocks.length ? selObject.toString() : ''\n }\n\n selectionChange: (event: Event, editor: RichText) => void = () => {\n /* no not care */\n }\n\n handleSelectChange = (event: Event) => {\n // @ts-expect-error Typescript is wrong about event.target lacking closest\n const select = event.target.closest(XinSelect.tagName) as HTMLSelectElement\n if (select == null) {\n return\n }\n\n this.doCommand(select.value)\n }\n\n handleButtonClick = (event: Event) => {\n // @ts-expect-error Typescript is wrong about event.target lacking closest\n const button = event.target.closest('button')\n if (button == null) {\n return\n }\n\n this.doCommand(button.dataset.command)\n }\n\n content = [\n xinSlot({\n name: 'toolbar',\n part: 'toolbar',\n onClick: this.handleButtonClick,\n onChange: this.handleSelectChange,\n }),\n div({\n part: 'doc',\n contenteditable: true,\n style: {\n flex: '1 1 auto',\n outline: 'none',\n },\n }),\n xinSlot({\n part: 'content',\n }),\n ]\n\n constructor() {\n super()\n this.initAttributes('widgets')\n }\n\n doCommand(command?: string) {\n if (command === undefined) {\n return\n }\n const args = command.split(',') as string[]\n\n console.log('execCommand', args[0], false, ...args.slice(1))\n document.execCommand(args[0], false, ...args.slice(1))\n }\n\n updateBlockStyle() {\n const select = this.parts.toolbar.querySelector(\n '.block-style'\n ) as HTMLSelectElement | null\n if (select === null) {\n return\n }\n let blockTags = (this.selectedBlocks as HTMLElement[]).map(\n (block) => block.tagName\n )\n blockTags = [...new Set(blockTags)]\n select.value = blockTags.length === 1 ? `formatBlock,${blockTags[0]}` : ''\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n const { doc, content } = this.parts\n if (content.innerHTML !== '' && doc.innerHTML === '') {\n doc.innerHTML = content.innerHTML\n content.innerHTML = ''\n }\n\n this.isInitialized = true\n\n content.style.display = 'none'\n\n document.addEventListener('selectionchange', (event: Event) => {\n this.updateBlockStyle()\n this.selectionChange(event, this)\n })\n }\n\n render(): void {\n const { toolbar } = this.parts\n\n super.render()\n\n if (toolbar.children.length === 0) {\n switch (this.widgets) {\n case 'minimal':\n toolbar.append(...minimalWidgets())\n break\n case 'default':\n toolbar.append(...richTextWidgets())\n break\n }\n }\n }\n}\n\nexport const richText = RichText.elementCreator({\n tag: 'xin-word',\n styleSpec: {\n ':host': {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n },\n ':host [part=\"toolbar\"]': {\n padding: '4px',\n display: 'flex',\n gap: '0px',\n flex: '0 0 auto',\n flexWrap: 'wrap',\n },\n },\n}) as ElementCreator<RichText>\n",
37
+ "/*#\n# rich text\n\n`<xin-word>` is a simple and easily extensible `document.execCommand` WYSIWYG editor with some conveniences.\nThe class name is `RichText` and the ElementCreator is `richText`.\n\n### `default` widgets\n\n```html\n<xin-word>\n<h3>Heading</h3>\n<p>And some <b>text</b></p>\n</xin-word>\n```\n```css\nxin-word {\n background: white;\n}\n\nxin-word [part=\"toolbar\"] {\n background: #f8f8f8;\n}\n\nxin-word [part=\"doc\"] {\n padding: 20px;\n}\n```\n\n### `minimal` widgets\n\n```html\n<xin-word widgets=\"minimal\">\n<h3>Heading</h3>\n<p>And some <b>text</b></p>\n</xin-word>\n```\n```css\nxin-word {\n background: white;\n}\n\nxin-word [part=\"toolbar\"] {\n background: #f8f8f8;\n}\n\nxin-word [part=\"doc\"] {\n padding: 20px;\n}\n```\n\nBy default, `<xin-word>` treats its initial contents as its document, but you can also set (and get)\nits `value`.\n\n## toolbar\n\n`<xin-word>` elements have a `toolbar` slot (actually a xin-slot because it doesn't use\nthe shadowDOM).\n\nIf you set the `widgets` attribute to `default` or `minimal` you will get a toolbar\nfor free. Or you can add your own custom widgets.\n\n## helper functions\n\nA number of helper functions are available, including:\n\n- `commandButton(title: string, command: string, iconClass: string)`\n- `blockStyle(options: Array<{caption: string, tagType: string}>)`\n- `spacer(width = '10px')`\n- `elastic(width = '10px')`\n\nThese each create a toolbar widget. A `blockStyle`-generated `<select>` element will\nautomatically have its value changed based on the current selection.\n\n## properties\n\nA `<xin-word>` element also has `selectedText` and `selectedBlocks` properties, allowing\nyou to easily perform operations on text selections, and a `selectionChange` callback (which\nsimply passes through document `selectionchange` events, but also passes a reference to\nthe `<xin-word>` component).\n*/\n\nimport { Component as WebComponent, ElementCreator, PartsMap, elements } from 'tosijs'\nimport { icons } from './icons'\n\nimport { xinSelect, XinSelect } from './select'\n\nconst { xinSlot, div, button, span } = elements\n\nconst blockStyles = [\n {\n caption: 'Title',\n tagType: 'H1',\n },\n {\n caption: 'Heading',\n tagType: 'H2',\n },\n {\n caption: 'Subheading',\n tagType: 'H3',\n },\n {\n caption: 'Minor heading',\n tagType: 'H4',\n },\n {\n caption: 'Body',\n tagType: 'P',\n },\n {\n caption: 'Code Block',\n tagType: 'PRE',\n },\n]\n\nexport function blockStyle(options = blockStyles) {\n return xinSelect({\n title: 'paragraph style',\n slot: 'toolbar',\n class: 'block-style',\n options: options.map(({ caption, tagType }) => ({\n caption,\n value: `formatBlock,${tagType}`,\n })),\n })\n}\n\nexport function spacer(width = '10px') {\n return span({\n slot: 'toolbar',\n style: { flex: `0 0 ${width}`, content: ' ' },\n })\n}\n\nexport function elastic(width = '10px') {\n return span({\n slot: 'toolbar',\n style: { flex: `0 0 ${width}`, content: ' ' },\n })\n}\n\nexport function commandButton(\n title: string,\n dataCommand: string,\n icon: SVGElement\n) {\n return button({ slot: 'toolbar', dataCommand, title }, icon)\n}\n\nconst paragraphStyleWidgets = () => [\n commandButton('left-justify', 'justifyLeft', icons.alignLeft()),\n commandButton('center', 'justifyCenter', icons.alignCenter()),\n commandButton('right-justify', 'justifyRight', icons.alignRight()),\n spacer(),\n commandButton('bullet list', 'insertUnorderedList', icons.listBullet()),\n commandButton('numbered list', 'insertOrderedList', icons.listNumber()),\n spacer(),\n commandButton('indent', 'indent', icons.indent()),\n commandButton('indent', 'outdent', icons.outdent()),\n]\n\nconst characterStyleWidgets = () => [\n commandButton('bold', 'bold', icons.fontBold()),\n commandButton('italic', 'italic', icons.fontItalic()),\n commandButton('underline', 'underline', icons.fontUnderline()),\n]\n\nconst minimalWidgets = () => [\n blockStyle(),\n spacer(),\n ...characterStyleWidgets(),\n]\n\nexport const richTextWidgets = () => [\n blockStyle(),\n spacer(),\n ...paragraphStyleWidgets(),\n spacer(),\n ...characterStyleWidgets(),\n]\n\ninterface EditorParts extends PartsMap {\n toolbar: HTMLElement\n doc: HTMLElement\n content: HTMLElement\n}\n\nexport class RichText extends WebComponent<EditorParts> {\n widgets: 'none' | 'minimal' | 'default' = 'default'\n\n private isInitialized = false\n\n get value(): string {\n return this.isInitialized\n ? this.parts.doc.innerHTML\n : this.savedValue || this.innerHTML\n }\n\n set value(docHtml: string) {\n if (this.isInitialized) {\n this.parts.doc.innerHTML = docHtml\n } else {\n this.innerHTML = docHtml\n }\n }\n\n blockElement(elt: Node): Element | undefined {\n const { doc } = this.parts\n while (elt.parentElement !== null && elt.parentElement !== doc) {\n elt = elt.parentElement\n }\n return elt.parentElement === doc ? (elt as Element) : undefined\n }\n\n get selectedBlocks(): any[] {\n const { doc } = this.parts\n const selObject = window.getSelection()\n if (selObject === null) {\n return []\n }\n const blocks = [] as any[]\n for (let i = 0; i < selObject.rangeCount; i++) {\n const range = selObject.getRangeAt(i)\n if (!doc.contains(range.commonAncestorContainer)) {\n continue\n }\n let block: Element | null = this.blockElement(\n range.startContainer\n ) as Element\n const lastBlock = this.blockElement(range.endContainer) as Element\n blocks.push(block)\n while (block !== lastBlock && block !== null) {\n block = block.nextElementSibling\n blocks.push(block)\n }\n }\n return blocks\n }\n\n get selectedText(): string {\n const selObject = window.getSelection()\n if (selObject === null) {\n return ''\n }\n return this.selectedBlocks.length ? selObject.toString() : ''\n }\n\n selectionChange: (event: Event, editor: RichText) => void = () => {\n /* no not care */\n }\n\n handleSelectChange = (event: Event) => {\n // @ts-expect-error Typescript is wrong about event.target lacking closest\n const select = event.target.closest(XinSelect.tagName) as HTMLSelectElement\n if (select == null) {\n return\n }\n\n this.doCommand(select.value)\n }\n\n handleButtonClick = (event: Event) => {\n // @ts-expect-error Typescript is wrong about event.target lacking closest\n const button = event.target.closest('button')\n if (button == null) {\n return\n }\n\n this.doCommand(button.dataset.command)\n }\n\n content = [\n xinSlot({\n name: 'toolbar',\n part: 'toolbar',\n onClick: this.handleButtonClick,\n onChange: this.handleSelectChange,\n }),\n div({\n part: 'doc',\n contenteditable: true,\n style: {\n flex: '1 1 auto',\n outline: 'none',\n },\n }),\n xinSlot({\n part: 'content',\n }),\n ]\n\n constructor() {\n super()\n this.initAttributes('widgets')\n }\n\n doCommand(command?: string) {\n if (command === undefined) {\n return\n }\n const args = command.split(',') as string[]\n\n console.log('execCommand', args[0], false, ...args.slice(1))\n document.execCommand(args[0], false, ...args.slice(1))\n }\n\n updateBlockStyle() {\n const select = this.parts.toolbar.querySelector(\n '.block-style'\n ) as HTMLSelectElement | null\n if (select === null) {\n return\n }\n let blockTags = (this.selectedBlocks as HTMLElement[]).map(\n (block) => block.tagName\n )\n blockTags = [...new Set(blockTags)]\n select.value = blockTags.length === 1 ? `formatBlock,${blockTags[0]}` : ''\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n const { doc, content } = this.parts\n if (content.innerHTML !== '' && doc.innerHTML === '') {\n doc.innerHTML = content.innerHTML\n content.innerHTML = ''\n }\n\n this.isInitialized = true\n\n content.style.display = 'none'\n\n document.addEventListener('selectionchange', (event: Event) => {\n this.updateBlockStyle()\n this.selectionChange(event, this)\n })\n }\n\n render(): void {\n const { toolbar } = this.parts\n\n super.render()\n\n if (toolbar.children.length === 0) {\n switch (this.widgets) {\n case 'minimal':\n toolbar.append(...minimalWidgets())\n break\n case 'default':\n toolbar.append(...richTextWidgets())\n break\n }\n }\n }\n}\n\nexport const richText = RichText.elementCreator({\n tag: 'xin-word',\n styleSpec: {\n ':host': {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n },\n ':host [part=\"toolbar\"]': {\n padding: 4,\n display: 'flex',\n gap: '0px',\n flex: '0 0 auto',\n flexWrap: 'wrap',\n },\n ':host [part=\"toolbar\"] > button': {\n _xinIconSize: 18,\n }\n },\n}) as ElementCreator<RichText>\n",
37
38
  "/*#\n# segmented select\n\nThis is a fairly general-purpose segmented select control.\n\n```html\n<blockquote>\nCheck the console to see the values being set.\n</blockquote>\n\n<div class=\"grid\">\n<xin-segmented value=\"yes\" choices=\"yes, no, don't care\">\n Should we?\n</xin-segmented>\n\n<div>\n <b>Localized!</b><br>\n <xin-segmented\n localized\n title=\"do you like?\"\n choices=\"yes=Yes:thumbsUp, no=No:thumbsDown\"\n ></xin-segmented>\n</div>\n\n<xin-segmented\n style=\"--segmented-direction: column; --segmented-align-items: stretch\"\n choices=\"in a relationship, single\" other=\"it's complicated…\"\n placeholder=\"oooh… please elaborate\"\n value=\"separated\"\n>\n Relationship Status\n</xin-segmented>\n\n<xin-segmented\n multiple\n style=\"\n --segmented-direction: column;\n --segmented-align-items: start;\n --segmented-option-grid-columns: 24px 24px 100px;\n --segmented-input-visibility: visible;\n \"\n choices=\"star=Star:star, game=Game:game, bug=Bug:bug, camera=Camera:camera\"\n value=\"star,bug\"\n>\n Pick all that apply\n</xin-segmented>\n</div>\n```\n```css\n.preview .grid {\n --segmented-option-current-background: var(--brand-color);\n --segmented-option-current-color: var(--brand-text-color);\n padding: 16px;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n```\n```js\nfunction logEvent(event) {\n const { target } = event\n if (target.tagName === 'XIN-SEGMENTED') {\n console.log((target.textContent || target.title).trim(), target.value)\n }\n}\npreview.addEventListener('change', logEvent, true)\n```\n\n## Properties\n\n- `values` is an array of values (only really useful if `multiple` is set to true)\n\nYou can set `choices` programmatically to an array of `Choice` objects:\n\n interface Choice {\n icon?: string | SVGElement\n value: string\n caption: string\n }\n\n## Attributes\n\n- `choices` is a string of comma-delimited options of the form `value=caption:icon`,\n where caption and icon are optional\n- `multiple` allows multiple selection\n- `name` allows you to set the name of the `<input>` elements to a specific value, it will default\n to the component's `instanceId`\n- `other` (default '', meaning other is not allowed) is the caption for other options, allowing\n the user to input their choice. It will be reset to '' if `multiple` is set.\n- `placeholder` is the placeholder displayed in the `<input>` field for **other** responses\n- `localized` automatically localizes captions\n\n## Styling\n\nThe following CSS variables can be used to control customize the `<xin-segmented>` component.\n\n --segmented-align-items\n --segmented-direction\n --segmented-option-color\n --segmented-option-current-background\n --segmented-option-current-color\n --segmented-option-font\n --segmented-option-gap\n --segmented-option-grid-columns\n --segmented-option-icon-color\n --segmented-option-padding\n --segmented-options-background\n --segmented-options-border-radius\n --segmented-placeholder-opacity\n*/\n\nimport {\n Component as WebComponent,\n ElementCreator,\n elements,\n varDefault,\n} from 'tosijs'\nimport { icons } from './icons'\nimport { xinLocalized } from './localize'\n\nconst { div, slot, label, span, input } = elements\n\ninterface Choice {\n icon?: string | SVGElement\n value: string\n caption: string\n}\n\ninterface SegmentParts {\n [key: string]: HTMLElement\n custom: HTMLInputElement\n}\n\nexport class XinSegmented extends WebComponent {\n choices: string | Choice[] = ''\n other = ''\n multiple = false\n name = ''\n placeholder = 'Please specify…'\n localized = false\n\n value: null | string = null\n\n get values(): string[] {\n return (this.value || '')\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v !== '')\n }\n\n content = () => [\n slot(),\n div({ part: 'options' }, input({ part: 'custom', hidden: true })),\n ]\n\n static styleSpec = {\n ':host': {\n display: 'inline-flex',\n gap: varDefault.segmentedOptionGap('8px'),\n alignItems: varDefault.segmentedAlignItems('center'),\n },\n ':host, :host::part(options)': {\n flexDirection: varDefault.segmentedDirection('row'),\n },\n ':host label': {\n display: 'inline-grid',\n alignItems: 'center',\n gap: varDefault.segmentedOptionGap('8px'),\n gridTemplateColumns:\n varDefault.segmentedOptionGridColumns('0px 24px 1fr'),\n padding: varDefault.segmentedOptionPadding('4px 12px'),\n font: varDefault.segmentedOptionFont('16px'),\n },\n ':host label:has(:checked)': {\n color: varDefault.segmentedOptionCurrentColor('#eee'),\n background: varDefault.segmentedOptionCurrentBackground('#44a'),\n },\n ':host svg': {\n height: varDefault.segmentOptionIconSize('16px'),\n stroke: varDefault.segmentedOptionIconColor('currentColor'),\n },\n ':host label.no-icon': {\n gap: 0,\n gridTemplateColumns: varDefault.segmentedOptionGridColumns('0px 1fr'),\n },\n ':host input[type=\"radio\"], :host input[type=\"checkbox\"]': {\n visibility: varDefault.segmentedInputVisibility('hidden'),\n },\n ':host::part(options)': {\n display: 'flex',\n borderRadius: varDefault.segmentedOptionsBorderRadius('8px'),\n background: varDefault.segmentedOptionsBackground('#fff'),\n color: varDefault.segmentedOptionColor('#222'),\n overflow: 'hidden',\n alignItems: varDefault.segmentedOptionAlignItems('stretch'),\n },\n ':host::part(custom)': {\n padding: varDefault.segmentedOptionPadding('4px 12px'),\n color: varDefault.segmentedOptionCurrentColor('#eee'),\n background: varDefault.segmentedOptionCurrentBackground('#44a'),\n font: varDefault.segmentedOptionFont('16px'),\n border: '0',\n outline: 'none',\n },\n ':host::part(custom)::placeholder': {\n color: varDefault.segmentedOptionCurrentColor('#eee'),\n opacity: varDefault.segmentedPlaceholderOpacity(0.75),\n },\n }\n\n constructor() {\n super()\n\n this.initAttributes(\n 'direction',\n 'choices',\n 'other',\n 'multiple',\n 'name',\n 'placeholder',\n 'localized'\n )\n }\n\n private valueChanged = false\n handleChange = () => {\n const { options, custom } = this.parts as SegmentParts\n if (this.multiple) {\n const inputs = [\n ...options.querySelectorAll('input:checked'),\n ] as HTMLInputElement[]\n this.value = inputs.map((input) => input.value).join(',')\n } else {\n const input = options.querySelector(\n 'input:checked'\n ) as HTMLInputElement | null\n if (!input) {\n this.value = null\n } else if (input.value) {\n custom.setAttribute('hidden', '')\n this.value = input.value\n } else {\n custom.removeAttribute('hidden')\n custom.focus()\n custom.select()\n this.value = custom.value\n }\n }\n this.valueChanged = true\n }\n\n handleKey = (event: KeyboardEvent) => {\n switch (event.code) {\n case 'Space':\n ;(event.target as HTMLLabelElement).click()\n break\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n const { options } = this.parts\n\n if (this.name === '') {\n this.name = this.instanceId\n }\n\n options.addEventListener('change', this.handleChange)\n options.addEventListener('keydown', this.handleKey as EventListener)\n\n if (this.other && this.multiple) {\n console.warn(\n this,\n 'is set to [other] and [multiple]; [other] will be ignored'\n )\n this.other = ''\n }\n }\n\n private get _choices(): Choice[] {\n const options: Choice[] = Array.isArray(this.choices)\n ? this.choices\n : this.choices\n .split(',')\n .filter((c) => c.trim() !== '')\n .map((c) => {\n const [value, remains] = c.split('=').map((v) => v.trim())\n const [caption, iconName] = (remains || value)\n .split(':')\n .map((v) => v.trim())\n\n const icon = iconName ? icons[iconName]() : ''\n const choice = { value, icon, caption }\n return choice\n })\n\n if (this.other && !this.multiple) {\n const [caption, icon] = this.other.split(':')\n options.push({\n value: '',\n caption,\n icon,\n })\n }\n\n return options\n }\n\n get isOtherValue(): boolean {\n return Boolean(\n this.value === '' ||\n (this.value &&\n !this._choices.find((choice) => choice.value === this.value))\n )\n }\n\n render() {\n super.render()\n\n if (this.valueChanged) {\n this.valueChanged = false\n return\n }\n\n const { options, custom } = this.parts as SegmentParts\n options.textContent = ''\n const type = this.multiple ? 'checkbox' : 'radio'\n const { values, isOtherValue } = this\n options.append(\n ...this._choices.map((choice) => {\n return label(\n { tabindex: 0 },\n input({\n type,\n name: this.name,\n value: choice.value,\n checked:\n values.includes(choice.value) ||\n (choice.value === '' && isOtherValue),\n tabIndex: -1,\n }),\n choice.icon || { class: 'no-icon' },\n this.localized ? xinLocalized(choice.caption) : span(choice.caption)\n )\n })\n )\n if (this.other && !this.multiple) {\n custom.hidden = !isOtherValue\n custom.value = isOtherValue ? (this.value as string) : ''\n custom.placeholder = this.placeholder\n options.append(custom)\n }\n }\n}\n\nexport const xinSegmented = XinSegmented.elementCreator({\n tag: 'xin-segmented',\n}) as ElementCreator<XinSegmented>\n",
38
39
  "/*#\n# sidebar\n\nThe default layout for iOS / iPadOS apps is to hide the sidebar when displaying content on small\nscreens, and display the sidebar when space is available (with the user able to explicitly hide\nthe sidebar if so desired). `<xin-sidenav>` provides this functionality.\n\n`<xin-sidenav>` is used to handle the layout of the documentation tab panel.\n\n`<xin-sidenav>`'s behavior is controlled by two attributes, `minSize` is the point at which it will toggle between showing the navigation\nsidebar and content, while `navSize` is the width of the sidebar. You can interrogate its `compact` property to find out if it's\ncurrently in `compact` form.\n*/\n\nimport { Component, ElementCreator, elements, varDefault } from 'tosijs'\n\nconst { slot } = elements\n\nexport class SideNav extends Component {\n minSize = 800\n navSize = 200\n compact = false\n\n content = [slot({ name: 'nav', part: 'nav' }), slot({ part: 'content' })]\n\n private _contentVisible = false\n get contentVisible(): boolean {\n return this._contentVisible\n }\n\n set contentVisible(visible: boolean) {\n this._contentVisible = visible\n this.queueRender()\n }\n\n static styleSpec = {\n ':host': {\n display: 'grid',\n gridTemplateColumns: `${varDefault.navWidth(\n '50%'\n )} ${varDefault.contentWidth('50%')}`,\n gridTemplateRows: '100%',\n position: 'relative',\n margin: varDefault.margin('0 0 0 -100%'),\n transition: varDefault.sideNavTransition('0.25s ease-out'),\n },\n ':host slot': {\n position: 'relative',\n },\n ':host slot:not([name])': {\n display: 'block',\n },\n ':host slot[name=\"nav\"]': {\n display: 'block',\n },\n }\n\n onResize = () => {\n const { content } = this.parts\n const parent = this.offsetParent as HTMLElement | null\n if (parent === null) {\n return\n }\n\n this.compact = parent.offsetWidth < this.minSize\n\n const empty =\n [...this.childNodes].find((node) =>\n node instanceof Element ? node.getAttribute('slot') !== 'nav' : true\n ) === undefined\n if (empty) {\n this.style.setProperty('--nav-width', '100%')\n this.style.setProperty('--content-width', '0%')\n return\n }\n\n if (!this.compact) {\n content.classList.add('-xin-sidenav-visible')\n this.style.setProperty('--nav-width', `${this.navSize}px`)\n this.style.setProperty(\n '--content-width',\n `calc(100% - ${this.navSize}px)`\n )\n this.style.setProperty('--margin', '0')\n } else {\n content.classList.remove('-xin-sidenav-visible')\n this.style.setProperty('--nav-width', '50%')\n this.style.setProperty('--content-width', '50%')\n\n if (this.contentVisible) {\n this.style.setProperty('--margin', '0 0 0 -100%')\n } else {\n this.style.setProperty('--margin', '0 -100% 0 0')\n }\n }\n }\n\n private observer: any\n connectedCallback(): void {\n super.connectedCallback()\n this.contentVisible = this.parts.content.childNodes.length === 0\n globalThis.addEventListener('resize', this.onResize)\n\n this.observer = new MutationObserver(this.onResize)\n this.observer.observe(this, { childList: true })\n this.style.setProperty('--side-nav-transition', '0s')\n setTimeout(() => {\n this.style.removeProperty('--side-nav-transition')\n }, 250)\n }\n\n disconnectedCallback() {\n super.disconnectedCallback()\n this.observer.disconnect()\n }\n\n constructor() {\n super()\n this.initAttributes('minSize', 'navSize', 'compact')\n }\n\n render(): void {\n super.render()\n this.onResize()\n }\n}\n\nexport const sideNav = SideNav.elementCreator({\n tag: 'xin-sidenav',\n}) as ElementCreator<SideNav>\n",
39
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",
40
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",
41
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",
42
- "export const version = '1.0.3'",
43
- "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 * 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"
43
+ "export const version = '1.0.4'",
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"
44
45
  ],
45
- "mappings": "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",
46
- "debugId": "03ACA28BE90F86A964756E2164756E21",
46
+ "mappings": "2sBA8EA,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,GCkN3B,mBACE,kBACA,gBAIA,YAEA,iBACA,eC9UF,IAAe,IACb,MAAO,k0DACP,UAAW,imHACX,OAAQ,yrFACR,IAAK,s5DACL,IAAK,s5DACL,QAAS,kuJACT,OAAQ,iwGACR,YAAa,okEACb,aAAc,8tGACd,KAAM,4rEACN,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,ED4BO,IAAM,GAAc,CAAC,IAA8C,CACxE,OAAO,OAAO,GAAU,CAAQ,GAGrB,GAAc,CACzB,EACA,EACA,EACA,EAA+B,IACpB,CAEX,GADA,EAAI,aAAa,QAAS,4BAA4B,EAClD,GAAQ,EACV,QAAW,IAAQ,CAAC,GAAG,EAAI,iBAAiB,eAAe,CAAC,EAAG,CAC7D,GAAI,EACF,EAAK,aAAa,OAAQ,CAAI,EAEhC,GAAI,EACF,EAAK,aAAa,SAAU,CAAM,EAClC,EAAK,aAAa,eAAgB,OAAO,CAAW,CAAC,EAK3D,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,CACD,EACA,EACgB,CAChB,IAAI,EAAW,GAAS,GACxB,GAAI,IAAS,EACX,QAAQ,KAAK,QAAQ,kBAAqB,EAE5C,IAAK,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,EFnRD,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,kBACC,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,IAAM,KAAK,KACxC,EAAQ,SAAW,KAAK,MAAQ,KAAK,WAAa,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,SAAW,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,EC3WD,oBAAS,gBAGT,IAAM,GAAe,qDACf,GAAgB,qBAEhB,GAAiB,MACrB,EACA,EAAO,OACP,EAAU,CAAC,EACX,EAAQ,KACL,CACH,IAAQ,OAAQ,MAAM,EAAU,GAAG,cAAwB,EAC3D,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,GAGF,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,iBAEH,OAAM,EAAQ,CAChB,OAAO,KAAK,QAEN,QACA,eACR,QAAe,CAAC,EAChB,MAAQ,SAED,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,CAAC,IAAW,CACnC,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,CAAC,IAAW,EAAO,YAAY,KAAK,QAAQ,CAAC,EAG5E,CAEO,IAAM,GAAa,EAAW,eAAe,CAClD,IAAK,UACP,CAAC,EClGD,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,IAFqB,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,GAAe,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,GAAa,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,CACH,CAAC,GAAG,EAAS,MAAM,EAAE,QAAQ,CAAC,IAAoB,CACjD,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,OAED,CAAC,GAAG,EAAS,MAAM,EAAE,QAAQ,CAAC,IAAoB,CACjD,GAAI,EAAM,iBAAmB,OAC3B,EAAM,OAAS,GACV,QAAI,EAAM,iBAAmB,SAClC,EAAM,OAAO,EAEhB,GAEH,CAAE,QAAS,GAAM,QAAS,EAAK,CACjC,ECzBO,IAAM,GAAW,CAAC,IAAuC,CAC9D,IAAQ,UAAS,SAAQ,WAAU,iBAAgB,kBAAmB,EAChE,EAAQ,MAAM,QAAQ,CAAO,EAC/B,GAAS,GAAG,CAAO,EACnB,GAAS,CAAO,EAIpB,OAFA,GAAc,EAAO,EAAQ,EAAU,EAAgB,CAAc,EACrE,SAAS,KAAK,OAAO,CAAK,EACnB,GAGI,GAAgB,CAC3B,EACA,EACA,EACA,EACA,IACS,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,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,GAAU,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,OACD,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,GCzCF,oBAAS,WAAW,eAAM,eAAU,cAAU,gBClIvC,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,QAAS,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,UAAY,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,eACT,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,EFjPD,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,CAAQ,EAChC,EAAK,OAAS,EAEd,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,QAAU,EACf,EAAK,UAAY,EACjB,EAAK,MAAQ,EACb,EAAK,UAAY,EAAQ,OACvB,CAAC,EAAqB,IAAsB,CAE1C,OADA,EAAI,EAAQ,GAAG,kBAAkB,GAAK,EAC/B,GAET,CAAC,CACH,EACA,EAAK,cAAgB,EAClB,IAAI,CAAC,EAAQ,KAAW,CACvB,KAAM,GAAK,CAAE,MAAO,EAAQ,EAAO,EAAG,EAAM,EAAM,EAClD,QAAS,EAAU,GACnB,MAAO,CACT,EAAE,EACD,KAAK,EAAW,GAGd,EAAK,QAAQ,SAAS,EAAK,OAAO,QAAQ,CAAC,EAAG,CACjD,IAAM,EAAW,EAAK,OAAO,UAAU,EAAG,CAAC,EAC3C,EAAK,OACH,EAAK,QAAQ,KAAK,CAAC,IAAmB,EAAO,UAAU,EAAG,CAAC,IAAM,CAAQ,GACzE,EAAK,QAAQ,GAEjB,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,QAAQ,EAAK,OAAO,QAAQ,CAAC,EACxD,GAAI,EAAQ,GAAI,CACd,IAAM,EAAM,EAAK,UAAU,EAAI,kBAAkB,GAC3C,EAAY,GAAO,EAAI,GAC7B,GAAI,EACF,EACE,EAAI,kBAAkB,IAAM,EACxB,EAAU,kBAAkB,EAC5B,EAAU,QAAQ,EAG5B,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,IAAK,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,EG7aM,IAAM,GAAgB,CAC3B,EACA,IACY,CACZ,EAAW,EAAS,kBAAkB,EACtC,IAAM,IAAY,EAAS,MAAM,SAAS,EACpC,IAAY,EAAS,MAAM,QAAO,EAClC,IAAW,EAAS,MAAM,gBAAe,EACzC,IAAa,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,UAAY,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,YAAa,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,EACE,EAA4B,CAAC,EAEtB,EAAiB,CAAC,EAAQ,IAA8B,CACnE,IAAM,EAAc,EAAY,OAAO,CAAK,EAC5C,QAAW,KAAU,EACnB,EAAO,KAAK,OAAO,EAGrB,OADA,EAAa,EAAY,GAClB,EAAQ,EAAI,EAAY,EAAQ,GAAK,QAc9C,SAAS,KAAK,iBAAiB,YAAa,CAAC,IAAiB,CAC5D,GACE,EAAM,SACL,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,IAAe,SAAS,KAAK,SAAS,GAAY,IAAI,EACxD,EAAa,OAEf,GAAI,EAAY,SAAW,SAAS,KAAK,SAAS,EAAY,GAAG,IAAI,EACnE,EAAY,OAAO,CAAC,EAEtB,GAAI,IAAiB,GAAK,GAAY,SAAW,EAAQ,OACzD,IAAM,EAAS,EAAe,CAAY,EAC1C,GAAI,GAAY,SAAW,EAAQ,OACnC,GAAI,GAAU,EAAO,SAAW,EAAQ,CACtC,EAAe,EACf,OAGF,IAAK,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,IAAK,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,uDOldD,IAAM,GAAiB,MAAQ,SAAS,cAAc,cAAc,EAE9D,GAAgB,CACpB,EACA,IACG,CACH,IAAK,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,IAAK,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,IAAK,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,IAAK,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,IT5MlB,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,IAAK,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,IAAK,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,KAAO,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,IAAK,KAAK,SAAW,KAAK,SACxB,OAEF,IAAQ,UAAW,EACnB,KAAM,aAAkB,aACtB,OAEF,IAAM,EAAK,EAAO,QAAQ,KAAK,EAC/B,KAAM,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,GAAa,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,IAAK,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,iBACJ,KAAM,iBACN,MAAM,EAAG,CACP,EAAa,EAAS,YAAY,EAEtC,CACF,EAEF,IAAK,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,IAAe,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,UAAW,EAAQ,OAAS,MAC9B,CACF,EACA,KAAK,YACH,OAAO,EAAQ,OAAS,SAAW,EAAQ,KAAO,EAAQ,IAC5D,EACA,GAAK,CAAE,MAAO,CAAE,KAAM,GAAI,CAAE,CAAC,EAC7B,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,UAAW,EAAQ,OAAS,MAC9B,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,GAEhB,KAAK,UACI,GAAK,EAEnB,IAAM,EAAS,KAAK,WAAa,iBAC3B,EAAgB,EAAe,IAAI,CAAC,IAAW,CACnD,IAAM,EAAS,KAAK,WAAW,CAAM,EACrC,IAAK,KAAK,UACR,EAAO,aAAa,YAAa,MAAM,EACvC,EAAO,QAAQ,KAAO,EACtB,EAAO,QAAQ,KAAO,EACtB,EAAO,iBAAiB,YAAa,IAAM,CACzC,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,EUn1BD,oBAAS,eAAqB,SAAU,gBAExC,IAAQ,UAAQ,UAAQ,UAAQ,UAAQ,WAAS,MAAI,KAAG,SAAO,SAAO,QAAQ,GAOvE,MAAM,WAAmB,EAAuB,aACxC,MAAK,CAAC,EAAiB,EAAQ,QAAwB,CAClE,OAAO,IAAI,QAAQ,KAAW,CAC5B,IAAM,EAAc,GAClB,CACE,cAAe,GACf,uBAAwB,GACxB,eAAe,EAAG,CAChB,EAAQ,EAEZ,EACA,GACE,CAAE,KAAM,QAAQ,EAChB,CACF,EACA,GACE,CACF,CACF,EACA,SAAS,KAAK,OAAO,CAAW,EAChC,EAAY,UAAU,EACvB,cAGU,QAAO,CAAC,EAAiB,EAAQ,UAA6B,CACzE,OAAO,IAAI,QAAQ,KAAW,CAC5B,IAAM,EAAgB,GACpB,CACE,cAAe,GACf,eAAe,CAAC,EAAiB,CAC/B,EAAQ,IAAW,SAAS,EAEhC,EACA,GACE,CAAE,KAAM,QAAQ,EAChB,CACF,EACA,GACE,CACF,EACA,GACE,CACE,KAAM,SACN,OAAO,EAAG,CACR,EAAc,MAAM,EAExB,EACA,QACF,CACF,EACA,SAAS,KAAK,OAAO,CAAa,EAClC,EAAc,UAAU,EACzB,cAGU,OAAM,CAAC,EAAiB,EAAQ,SAAU,EAAe,GAA4B,CAChG,OAAO,IAAI,QAAQ,KAAW,CAC5B,IAAM,EAAa,GAAM,CAAE,MAAO,CAAa,CAAC,EAC1C,EAAe,GACnB,CACE,cAAe,GACf,eAAe,CAAC,EAAiB,CAC/B,EAAS,IAAW,UAAY,EAAW,MAAQ,IAAI,GAEzD,YAAY,EAAG,CACb,EAAW,MAAM,EAErB,EACA,GACE,CAAE,KAAM,QAAQ,EAChB,CACF,EACA,GACE,GACE,CACE,MAAO,CACL,QAAS,OACT,cAAe,SACf,WAAY,UACZ,IAAK,CACP,CACF,EACA,GACE,CACF,EACA,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,CACxC,OAAO,IAAI,QAAQ,KAAW,CAC5B,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,IAAM,GACd,CAAE,KAAM,QAAS,EACjB,GACE,GAAQ,CAAC,KAAM,QAAQ,CAAC,CAC1B,EACA,GAAQ,EACR,GACE,GAAQ,CAAC,KAAM,QAAQ,CAAC,EACxB,GAAO,CAAC,KAAM,KAAM,QAAS,KAAK,EAAE,EAAG,IAAI,CAC7C,CACF,CACF,CAEO,IAAM,GAAa,GAAW,eAAe,CAClD,IAAK,cACL,UAAW,CACT,0BAA2B,CACzB,SAAU,QACV,QAAS,QACT,MAAO,EACP,WAAY,QACZ,OAAQ,CACV,EACA,uBAAwB,CACtB,IAAK,MACL,KAAM,MACN,SAAU,IACV,UAAW,uBACX,OAAQ,EACR,aAAc,GACd,SAAU,SACV,UAAW,oBACX,QAAS,EACT,QAAS,OACT,cAAe,SACf,IAAK,EACL,UAAW,kBACb,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,EC1PD,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,GAAQ,GAAS,EAAQ,MAAM,KAAK,MAAM,IAAI,IAAM,KACpD,EAAS,EAAQ,MAAM,OAAO,MAAM,IAAI,IAAM,KAC9C,GAAO,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,GACI,EAAO,EAAO,GACnB,IAAK,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,GACrD,MAAM,CAAG,EACZ,EAAO,MAAM,IAAM,EAAM,EAAK,KAEhC,IAAK,MAAM,CAAM,EACf,EAAO,MAAM,OAAS,EAAS,EAAK,KAEtC,IAAK,MAAM,CAAI,EACb,EAAO,MAAM,KAAO,EAAO,EAAK,KAElC,IAAK,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,IAAK,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,IAAU,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,GAER,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,gBAGpD,IAAQ,OAAK,SAAO,UAAQ,UAAQ,UAAQ,SAAS,GAK/C,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,EAE7B,OADA,QAAQ,IAAI,CAAI,EACT,CAAC,IACN,MAAM,QAAQ,CAAG,GACjB,EAAK,KAAK,CAAC,KAAS,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,EAE7B,OADA,QAAQ,IAAI,CAAI,EACT,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,IAAK,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,MAAe,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,EAAmC,CACxD,OAAO,EAAO,QAAQ,EAAO,eAAe,KAUvC,MAAM,WAAmB,EAAa,CAC3C,OAAiB,CAAC,EAClB,QAAU,GACV,SAAW,IACX,UAAY,GACZ,OAAS,GAET,QAAU,IAAM,CACd,GAAO,CAAE,KAAM,UAAW,CAAC,EAC3B,EAAM,YAAY,EAClB,GAAO,CAAE,KAAM,WAAY,CAAC,EAC5B,EAAM,YAAY,EAClB,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,MAK7C,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,MAMvC,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,KAAc,EAAS,EAAI,EAAM,EAClC,CAAC,IAAa,EAAS,EAAI,EAAM,EAErC,OAAO,EACH,CAAC,IACC,OAAO,OAAO,CAAG,EAAE,KAAK,CAAC,KAAO,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,MAOrD,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,MAM7C,EAAS,YAAc,GACvB,EAAS,OACP,GAAO,YAAa,CAAE,MAAO,GAAI,CAAC,EAClC,GAAG,KAAK,OAAO,IAAI,CAAC,IAAU,CAC5B,IAAM,EAAU,EAAM,MAAQ,EAAM,KACpC,OAAO,GAAO,GAAG,IAAW,CAAE,MAAO,EAAM,IAAK,CAAC,EAClD,CACH,EACA,EAAU,YAAc,GACxB,IAAM,EAAa,OAAO,KAAK,KAAK,OAAO,EACxC,IAAI,CAAC,IAAQ,CACZ,IAAM,EAAS,KAAK,QAAQ,GAC5B,OAAO,EAAO,WAAa,OACvB,CACE,GAAO,EAAO,QAAS,CAAE,MAAO,CAAI,CAAC,EACrC,GAAO,EAAO,SAAU,CAAE,MAAO,IAAM,CAAI,CAAC,CAC9C,EACA,GAAO,EAAO,QAAS,CAAE,MAAO,CAAI,CAAC,EAC1C,EACA,KAAK,EAGR,GAFA,EAAU,OAAO,GAAG,CAAU,EAE1B,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,EAIM,MAAM,WAAsB,EAAa,CACtC,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,2CAA4C,CAC1C,gBAAiB,0BACjB,aAAc,QACd,OAAQ,qBACR,WAAY,qBACZ,OAAQ,IACR,QAAS,IACT,UAAW,SACX,MAAO,qBACP,KAAM,wBACR,CACF,CACF,CAAC,ECrZD,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,KAAM,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,IAAM,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,YAAa,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,KAAY,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,IAAK,EAAK,aAAa,MAAM,EAE3B,MADA,QAAQ,MAAM,gCAAiC,CAAI,EAC7C,IAAI,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,IAAK,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,KAAW,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,QAAQ,GAE3C,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,KAAa,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,UAAY,EAAY,QAAQ,EACrC,EAAK,UAAY,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,GAAG,MAAM,EACT,EACE,CACE,MAAO,aACP,MAAO,2BACP,QAAS,KAAK,SAChB,EACA,EAAM,EAAE,CACV,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,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,KACpB,6DAGM,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,QAAU,KAAc,OAAO,KAAK,KAAK,OAAO,EAC9C,EAAO,EAAK,QAAQ,IAAI,OAAO,2BAA2B,KAAe,GAAG,EAAG,gBAAgB,EAAW,QAAQ,KAAM,EAAE,GAAG,EAQ/H,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,sBAAuB,CACrB,SAAU,WACV,IAAK,IACL,MAAO,IACP,MAAO,+BACT,EAEA,yCAA0C,CACxC,MAAO,OACP,OAAQ,OACR,WAAY,OACZ,UAAW,SACX,QAAS,IACT,OAAQ,GACV,EAEA,eAAgB,CACd,OAAQ,aACV,CACF,CACF,CAAC,EAEM,SAAS,EAAgB,CAAC,EAAsB,CACrD,IAAM,EAAc,CAAC,GAAG,EAAQ,iBAAiB,KAAK,CAAC,EAAE,OAAO,CAAC,IAC/D,CAAC,KAAM,OAAQ,MAAO,MAAM,EAAE,SAAS,EAAI,UAAU,MAAM;AAAA,CAAI,EAAE,EAAE,CACrE,EACA,QAAS,EAAI,EAAG,EAAI,EAAY,OAAQ,IAAK,CAC3C,IAAM,EAAQ,CAAC,EAAY,EAAE,EAC7B,MAAO,EAAY,GAAG,qBAAuB,EAAY,EAAI,GAC3D,EAAM,KAAK,EAAY,EAAI,EAAE,EAC7B,GAAK,EAEP,IAAM,EAAU,GAAY,EAC5B,EAAQ,aAAa,EAAS,EAAM,EAAE,EACtC,EAAQ,iBAAiB,CAAK,GAIlC,IAAM,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,EE5uBhD,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,GACnB,KAAK,MACR,QAAQ,MACN,+EACF,EAIJ,MAAM,EAAS,CAGb,GAFA,MAAM,OAAO,GAER,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,gBA0FT,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,IAAK,EAAU,WAAW,GAAG,IAAM,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,EC1FD,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,IAAK,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,IAAK,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,KACN,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,WACE,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,YAER,KAAK,aAAe,KAAK,QAAU,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,cAAgB,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,SAAU,OAAO,OACvE,CAAE,KAAM,OAAQ,SAAU,EAAG,EAC7B,OAAO,IAAS,SAAW,CAAE,QAAS,CAAK,EAAI,CACjD,EAEA,IAAK,KAAK,UACR,KAAK,UAAY,GAAgB,EAGnC,IAAM,EAAY,KAAK,UAEvB,SAAS,KAAK,OAAO,CAAS,EAC9B,EAAU,MAAM,OAAS,OAAO,GAAa,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,IAAK,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,ECjMlC,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,SAAU,EAAS,MAAM,OAAO,EAChC,SAAU,EAAS,MAAM,OAAO,EAChC,UAAW,EAAS,MAAM,OAAO,EACjC,WAAY,EAAS,MAAM,cAAc,CAC3C,EAEO,KAAK,OAAO,SACf,EACA,OAAO,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,KAAO,CAAC,EAAE,OAAS,OAGtD,WAAU,EAAqB,CACnC,IAAM,EAAW,KAAK,cAAc,OAAO,GAAG,MAE9C,IAAK,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,ECnSD,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,ECnKD,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,IAAK,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,ECzQD,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,4BAA6B,CAC3B,MAAO,EAAW,4BAA4B,MAAM,EACpD,WAAY,EAAW,iCAAiC,MAAM,CAChE,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,IAAK,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,OAAQ,EAAM,UACP,QACD,EAAM,OAA4B,MAAM,EAC1C,QAIN,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,QAAU,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,QACH,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,QAAU,KAAK,SACtB,EAAO,QAAU,EACjB,EAAO,MAAQ,EAAgB,KAAK,MAAmB,GACvD,EAAO,YAAc,KAAK,YAC1B,EAAQ,OAAO,CAAM,EAG3B,CAEO,IAAM,GAAe,GAAa,eAAe,CACtD,IAAK,eACP,CAAC,ECvVD,oBAAS,eAA2B,iBAAU,gBAE9C,IAAQ,SAAS,GAEV,MAAM,WAAgB,EAAU,CACrC,QAAU,IACV,QAAU,IACV,QAAU,GAEV,QAAU,CAAC,GAAK,CAAE,KAAM,MAAO,KAAM,KAAM,CAAC,EAAG,GAAK,CAAE,KAAM,SAAU,CAAC,CAAC,EAEhE,gBAAkB,MACtB,eAAc,EAAY,CAC5B,OAAO,KAAK,mBAGV,eAAc,CAAC,EAAkB,CACnC,KAAK,gBAAkB,EACvB,KAAK,YAAY,QAGZ,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,OASF,GANA,KAAK,QAAU,EAAO,YAAc,KAAK,QAGvC,CAAC,GAAG,KAAK,UAAU,EAAE,KAAK,CAAC,IACzB,aAAgB,QAAU,EAAK,aAAa,MAAM,IAAM,MAAQ,EAClE,IAAM,OACG,CACT,KAAK,MAAM,YAAY,cAAe,MAAM,EAC5C,KAAK,MAAM,YAAY,kBAAmB,IAAI,EAC9C,OAGF,IAAK,KAAK,QACR,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,KAAK,MAAM,YAAY,WAAY,aAAa,EAEhD,UAAK,MAAM,YAAY,WAAY,aAAa,GAK9C,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,SAAS,EAGrD,MAAM,EAAS,CACb,MAAM,OAAO,EACb,KAAK,SAAS,EAElB,CAEO,IAAM,GAAU,GAAQ,eAAe,CAC5C,IAAK,aACP,CAAC,ECjID,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,KAAM,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,IAAK,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,GAEnB,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,QAAS,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,IAAK,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,KAAS,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,WAAa,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,WAAa,KAAK,SACzB,EAAQ,gBAAgB,SAAU,EAAK,EACvC,EAAS,gBAAgB,UAAW,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,WAAa,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": "3EBB43721494DF8964756E2164756E21",
47
48
  "names": []
48
49
  }