@mhmo91/schmancy 0.2.161 → 0.2.162
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/{area.component-B_aHh7nO.js → area.component-BWaTpFPB.js} +4 -4
- package/dist/{area.component-B_aHh7nO.js.map → area.component-BWaTpFPB.js.map} +1 -1
- package/dist/area.js +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{delay-CoyF7a2c.js → delay-DN-mtGtE.js} +10 -10
- package/dist/{delay-CoyF7a2c.js.map → delay-DN-mtGtE.js.map} +1 -1
- package/dist/delay.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +100 -102
- package/dist/index.js.map +1 -1
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/{notification-container-DUtK-Voc.cjs → notification-service-BFfFPd1Q.cjs} +19 -19
- package/dist/notification-service-BFfFPd1Q.cjs.map +1 -0
- package/dist/{notification-container-wVKpwK8s.js → notification-service-DA3l75i3.js} +126 -93
- package/dist/notification-service-DA3l75i3.js.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +5 -7
- package/dist/notification.js.map +1 -1
- package/dist/rxjs-utils.js +4 -4
- package/dist/selector-hook-omsuyAOu.js.map +1 -1
- package/dist/{sheet-CAs7kMKz.js → sheet-BmIoE7Ej.js} +11 -11
- package/dist/{sheet-CAs7kMKz.js.map → sheet-BmIoE7Ej.js.map} +1 -1
- package/dist/sheet.js +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/{teleport.component-BivAjnQn.cjs → teleport.component-CNVTORt3.cjs} +2 -2
- package/dist/{teleport.component-BivAjnQn.cjs.map → teleport.component-CNVTORt3.cjs.map} +1 -1
- package/dist/{teleport.component-Dxn-H8Xp.js → teleport.component-DSs12GIK.js} +6 -6
- package/dist/{teleport.component-Dxn-H8Xp.js.map → teleport.component-DSs12GIK.js.map} +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{typewriter-bUthirMf.js → typewriter-CFULjoNm.js} +9 -9
- package/dist/{typewriter-bUthirMf.js.map → typewriter-CFULjoNm.js.map} +1 -1
- package/dist/typewriter-CwrZhpWq.cjs.map +1 -1
- package/dist/typewriter.js +1 -1
- package/package.json +1 -1
- package/types/src/notification/index.d.ts +1 -1
- package/types/src/notification/notification-service.d.ts +20 -0
- package/dist/notification-container-DUtK-Voc.cjs.map +0 -1
- package/dist/notification-container-wVKpwK8s.js.map +0 -1
- package/dist/notification-service-DWeUoHi2.js +0 -29
- package/dist/notification-service-DWeUoHi2.js.map +0 -1
- package/dist/notification-service-DXXrRCmK.cjs +0 -2
- package/dist/notification-service-DXXrRCmK.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typewriter-CwrZhpWq.cjs","sources":["../.yarn/unplugged/typeit-npm-8.8.7-4441c75f10/node_modules/typeit/dist/index.es.js","../src/typewriter/typewriter.ts"],"sourcesContent":["// TypeIt by Alex MacArthur - https://typeitjs.com\nconst isArray = (thing) => Array.isArray(thing);\n\nconst asArray = (value) => isArray(value) ? value : [value];\n\nlet Queue = function(initialItems) {\n let add = function(steps) {\n asArray(steps).forEach((step) => {\n return _q.set(Symbol(step.char?.innerText), buildQueueItem({ ...step }));\n });\n return this;\n };\n let getTypeable = () => rawValues().filter((value) => value.typeable);\n let set = function(index, item) {\n let keys = [..._q.keys()];\n _q.set(keys[index], buildQueueItem(item));\n };\n let buildQueueItem = (queueItem) => {\n queueItem.shouldPauseCursor = function() {\n return Boolean(this.typeable || this.cursorable || this.deletable);\n };\n return queueItem;\n };\n let reset = function() {\n _q.forEach((item) => delete item.done);\n };\n let wipe = function() {\n _q = /* @__PURE__ */ new Map();\n add(initialItems);\n };\n let getQueue = () => _q;\n let rawValues = () => Array.from(_q.values());\n let destroy = (key) => _q.delete(key);\n let getPendingQueueItems = () => {\n const pending = [];\n for (let [, value] of getQueue()) {\n if (!value.done) {\n pending.push(value);\n }\n }\n return pending;\n };\n let getItems = (all = false) => all ? rawValues() : rawValues().filter((i) => !i.done);\n let done = (key, shouldDestroy = false) => shouldDestroy ? _q.delete(key) : _q.get(key).done = true;\n let _q = /* @__PURE__ */ new Map();\n add(initialItems);\n return {\n add,\n set,\n wipe,\n done,\n reset,\n destroy,\n getItems,\n getQueue,\n getTypeable,\n getPendingQueueItems\n };\n};\n\nconst DATA_ATTRIBUTE = \"data-typeit-id\";\nconst CURSOR_CLASS = \"ti-cursor\";\nconst END = \"END\";\nconst DEFAULT_STATUSES = {\n started: false,\n completed: false,\n frozen: false,\n destroyed: false\n};\nconst DEFAULT_OPTIONS = {\n breakLines: true,\n cursor: {\n autoPause: true,\n autoPauseDelay: 500,\n animation: {\n frames: [0, 0, 1].map((n) => {\n return { opacity: n };\n }),\n options: {\n iterations: Infinity,\n easing: \"steps(2, start)\",\n fill: \"forwards\"\n }\n }\n },\n cursorChar: \"|\",\n cursorSpeed: 1e3,\n deleteSpeed: null,\n html: true,\n lifeLike: true,\n loop: false,\n loopDelay: 750,\n nextStringDelay: 750,\n speed: 100,\n startDelay: 250,\n startDelete: false,\n strings: [],\n waitUntilVisible: false,\n beforeString: () => {\n },\n afterString: () => {\n },\n beforeStep: () => {\n },\n afterStep: () => {\n },\n afterComplete: () => {\n }\n};\nconst PLACEHOLDER_CSS = `[${DATA_ATTRIBUTE}]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}`;\n\nconst createElement = (el) => document.createElement(el);\n\nconst createTextNode = (content) => document.createTextNode(content);\n\nconst appendStyleBlock = (styles, id = \"\") => {\n let styleBlock = createElement(\"style\");\n styleBlock.id = id;\n styleBlock.appendChild(createTextNode(styles));\n document.head.appendChild(styleBlock);\n};\n\nconst calculateDelay = (delayArg) => {\n if (!isArray(delayArg)) {\n delayArg = [delayArg / 2, delayArg / 2];\n }\n return delayArg;\n};\n\nconst randomInRange = (value, range) => {\n return Math.abs(\n Math.random() * (value + range - (value - range)) + (value - range)\n );\n};\n\nlet range = (val) => val / 2;\nfunction calculatePace(options) {\n let { speed, deleteSpeed, lifeLike } = options;\n deleteSpeed = deleteSpeed !== null ? deleteSpeed : speed / 3;\n return lifeLike ? [\n randomInRange(speed, range(speed)),\n randomInRange(deleteSpeed, range(deleteSpeed))\n ] : [speed, deleteSpeed];\n}\n\nconst toArray = (val) => Array.from(val);\n\nlet expandTextNodes = (element) => {\n [...element.childNodes].forEach((child) => {\n if (child.nodeValue) {\n [...child.nodeValue].forEach((c) => {\n child.parentNode.insertBefore(createTextNode(c), child);\n });\n child.remove();\n return;\n }\n expandTextNodes(child);\n });\n return element;\n};\n\nconst getParsedBody = (content) => {\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = content;\n return expandTextNodes(doc.body);\n};\n\nfunction walkElementNodes(element, shouldReverse = false, shouldIncludeCursor = false) {\n let cursor = element.querySelector(`.${CURSOR_CLASS}`);\n let walker = document.createTreeWalker(element, NodeFilter.SHOW_ALL, {\n acceptNode: (node) => {\n if (cursor && shouldIncludeCursor) {\n if (node.classList?.contains(CURSOR_CLASS)) {\n return NodeFilter.FILTER_ACCEPT;\n }\n if (cursor.contains(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n }\n return node.classList?.contains(CURSOR_CLASS) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT;\n }\n });\n let nextNode;\n let nodes = [];\n while (nextNode = walker.nextNode()) {\n if (!nextNode.originalParent) {\n nextNode.originalParent = nextNode.parentNode;\n }\n nodes.push(nextNode);\n }\n return shouldReverse ? nodes.reverse() : nodes;\n}\nfunction chunkStringAsHtml(string) {\n return walkElementNodes(getParsedBody(string));\n}\nfunction maybeChunkStringAsHtml(str, asHtml = true) {\n return asHtml ? chunkStringAsHtml(str) : toArray(str).map(createTextNode);\n}\n\nconst cleanUpSkipped = ({\n index,\n newIndex,\n queueItems,\n cleanUp\n}) => {\n for (let i = index + 1; i < newIndex + 1; i++) {\n cleanUp(queueItems[i][0]);\n }\n};\n\nconst isNumber = (value) => Number.isInteger(value);\n\nconst countStepsToSelector = ({\n queueItems,\n selector,\n cursorPosition,\n to\n}) => {\n if (isNumber(selector)) {\n return selector * -1;\n }\n let isMovingToEnd = new RegExp(END, \"i\").test(to);\n let selectorIndex = selector ? [...queueItems].reverse().findIndex(({ char }) => {\n let parentElement = char.parentElement;\n let parentMatches = parentElement.matches(selector);\n if (isMovingToEnd && parentMatches) {\n return true;\n }\n return parentMatches && parentElement.firstChild.isSameNode(char);\n }) : -1;\n if (selectorIndex < 0) {\n selectorIndex = isMovingToEnd ? 0 : queueItems.length - 1;\n }\n let offset = isMovingToEnd ? 0 : 1;\n return selectorIndex - cursorPosition + offset;\n};\n\nconst destroyTimeouts = (timeouts) => {\n timeouts.forEach(clearTimeout);\n return [];\n};\n\nconst duplicate = (value, times) => new Array(times).fill(value);\n\nlet beforePaint = (cb) => {\n return new Promise((resolve) => {\n requestAnimationFrame(async () => {\n resolve(await cb());\n });\n });\n};\n\nlet getAnimationFromElement = (element) => {\n return element?.getAnimations().find((animation) => {\n return animation.id === element.dataset.tiAnimationId;\n });\n};\n\nlet setCursorAnimation = ({\n cursor,\n frames,\n options\n}) => {\n let animation = cursor.animate(frames, options);\n animation.pause();\n animation.id = cursor.dataset.tiAnimationId;\n beforePaint(() => {\n beforePaint(() => {\n animation.play();\n });\n });\n return animation;\n};\n\nlet rebuildCursorAnimation = ({\n cursor,\n options,\n cursorOptions\n}) => {\n if (!cursor || !cursorOptions) return;\n let animation = getAnimationFromElement(cursor);\n let oldCurrentTime;\n if (animation) {\n options.delay = animation.effect.getComputedTiming().delay;\n oldCurrentTime = animation.currentTime;\n animation.cancel();\n }\n let newAnimation = setCursorAnimation({\n cursor,\n frames: cursorOptions.animation.frames,\n options\n });\n if (oldCurrentTime) {\n newAnimation.currentTime = oldCurrentTime;\n }\n return newAnimation;\n};\n\nlet execute = (queueItem) => queueItem.func?.call(null);\nlet fireItem = async ({\n index,\n queueItems,\n wait,\n cursor,\n cursorOptions\n}) => {\n let queueItem = queueItems[index][1];\n let instantQueue = [];\n let tempIndex = index;\n let futureItem = queueItem;\n let shouldBeGrouped = () => futureItem && !futureItem.delay;\n let shouldPauseCursor = queueItem.shouldPauseCursor() && cursorOptions.autoPause;\n while (shouldBeGrouped()) {\n instantQueue.push(futureItem);\n shouldBeGrouped() && tempIndex++;\n futureItem = queueItems[tempIndex] ? queueItems[tempIndex][1] : null;\n }\n if (instantQueue.length) {\n await beforePaint(async () => {\n for (let q of instantQueue) {\n await execute(q);\n }\n });\n return tempIndex - 1;\n }\n let animation = getAnimationFromElement(cursor);\n let options;\n if (animation) {\n options = {\n ...animation.effect.getComputedTiming(),\n delay: shouldPauseCursor ? cursorOptions.autoPauseDelay : 0\n };\n }\n await wait(async () => {\n if (animation && shouldPauseCursor) {\n animation.cancel();\n }\n await beforePaint(() => {\n execute(queueItem);\n });\n }, queueItem.delay);\n await rebuildCursorAnimation({\n cursor,\n options,\n cursorOptions\n });\n return index;\n};\n\nconst fireWhenVisible = (element, func) => {\n let observer = new IntersectionObserver(\n (entries, observer2) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n func();\n observer2.unobserve(element);\n }\n });\n },\n { threshold: 1 }\n );\n observer.observe(element);\n};\n\nconst generateHash = () => Math.random().toString().substring(2, 9);\n\nconst isInput = (el) => {\n return \"value\" in el;\n};\n\nlet getAllChars = (element) => {\n if (isInput(element)) {\n return toArray(element.value);\n }\n return walkElementNodes(element, true).filter(\n (c) => !(c.childNodes.length > 0)\n );\n};\n\nlet handleFunctionalArg = (arg) => {\n return typeof arg === \"function\" ? arg() : arg;\n};\n\nlet select = (selector, element = document, all = false) => {\n return element[`querySelector${all ? \"All\" : \"\"}`](selector);\n};\n\nlet isBodyElement = (node) => /body/i.test(node?.tagName);\n\nlet insertIntoElement = (originalTarget, character) => {\n if (isInput(originalTarget)) {\n originalTarget.value = `${originalTarget.value}${character.textContent}`;\n return;\n }\n character.innerHTML = \"\";\n let target = isBodyElement(character.originalParent) ? originalTarget : (\n // If we add one-off fresh elements, there will be no\n // \"originalParent\", so always fall back to the default target.\n character.originalParent || originalTarget\n );\n let cursorNode = select(\".\" + CURSOR_CLASS, target) || null;\n if (cursorNode && cursorNode.parentElement !== target) {\n target = cursorNode.parentElement;\n }\n target.insertBefore(character, cursorNode);\n};\n\nconst isNonVoidElement = (el) => /<(.+)>(.*?)<\\/(.+)>/.test(el.outerHTML);\n\nconst merge = (originalObj, newObj) => Object.assign({}, originalObj, newObj);\n\nlet processCursorOptions = (cursorOptions) => {\n if (typeof cursorOptions === \"object\") {\n let newOptions = {};\n let { frames: defaultFrames, options: defaultOptions } = DEFAULT_OPTIONS.cursor.animation;\n newOptions.animation = cursorOptions.animation || {};\n newOptions.animation.frames = cursorOptions.animation?.frames || defaultFrames;\n newOptions.animation.options = merge(\n defaultOptions,\n cursorOptions.animation?.options || {}\n );\n newOptions.autoPause = cursorOptions.autoPause ?? DEFAULT_OPTIONS.cursor.autoPause;\n newOptions.autoPauseDelay = cursorOptions.autoPauseDelay || DEFAULT_OPTIONS.cursor.autoPauseDelay;\n return newOptions;\n }\n if (cursorOptions === true) {\n return DEFAULT_OPTIONS.cursor;\n }\n return cursorOptions;\n};\n\nconst removeNode = (node, rootElement) => {\n if (!node) return;\n let nodeParent = node.parentNode;\n let nodeToRemove = nodeParent.childNodes.length > 1 || nodeParent.isSameNode(rootElement) ? (\n // This parent still needs to exist.\n node\n ) : (\n // There's nothing else in there, so just delete the entire thing.\n // By doing this, we clean up markup as we go along.\n nodeParent\n );\n nodeToRemove.remove();\n};\n\nconst repositionCursor = (element, allChars, newCursorPosition) => {\n let nodeToInsertBefore = allChars[newCursorPosition - 1];\n let cursor = select(`.${CURSOR_CLASS}`, element);\n element = nodeToInsertBefore?.parentNode || element;\n element.insertBefore(cursor, nodeToInsertBefore || null);\n};\n\nfunction selectorToElement(thing) {\n return typeof thing === \"string\" ? select(thing) : thing;\n}\n\nlet cursorFontStyles = {\n \"font-family\": \"\",\n \"font-weight\": \"\",\n \"font-size\": \"\",\n \"font-style\": \"\",\n \"line-height\": \"\",\n color: \"\",\n transform: \"translateX(-.125em)\"\n};\nlet setCursorStyles = (id, element) => {\n let rootSelector = `[${DATA_ATTRIBUTE}='${id}']`;\n let cursorSelector = `${rootSelector} .${CURSOR_CLASS}`;\n let computedStyles = getComputedStyle(element);\n let customProperties = Object.entries(cursorFontStyles).reduce(\n (accumulator, [item, value]) => {\n return `${accumulator} ${item}: var(--ti-cursor-${item}, ${value || computedStyles[item]});`;\n },\n \"\"\n );\n appendStyleBlock(\n `${cursorSelector} { display: inline-block; width: 0; ${customProperties} }`,\n id\n );\n};\n\nfunction splitOnBreak(str) {\n return str.replace(/<!--(.+?)-->/g, \"\").trim().split(/<br(?:\\s*?)(?:\\/)?>/);\n}\n\nlet updateCursorPosition = (steps, cursorPosition, printedCharacters) => {\n return Math.min(\n Math.max(cursorPosition + steps, 0),\n printedCharacters.length\n );\n};\n\nlet wait = (callback, delay, timeouts) => {\n return new Promise((resolve) => {\n let cb = async () => {\n await callback();\n resolve();\n };\n timeouts.push(setTimeout(cb, delay || 0));\n });\n};\n\nclass TypeIt {\n element;\n timeouts;\n cursorPosition;\n predictedCursorPosition;\n statuses = {\n started: false,\n completed: false,\n frozen: false,\n destroyed: false,\n firing: false\n };\n opts;\n id;\n queue;\n cursor;\n flushCallback = null;\n unfreeze = () => {\n };\n constructor(element, options = {}) {\n this.opts = merge(DEFAULT_OPTIONS, options);\n this.element = selectorToElement(element);\n this.timeouts = [];\n this.cursorPosition = 0;\n this.unfreeze = () => {\n };\n this.predictedCursorPosition = null;\n this.statuses = merge({}, DEFAULT_STATUSES);\n this.id = generateHash();\n this.queue = Queue([{ delay: this.opts.startDelay }]);\n this.#buildOptions(options);\n this.cursor = this.#setUpCursor();\n this.element.dataset.typeitId = this.id;\n appendStyleBlock(PLACEHOLDER_CSS);\n if (this.opts.strings.length) {\n this.#generateQueue();\n }\n }\n /**\n * Can only be called once.\n */\n go() {\n if (this.statuses.started) {\n return this;\n }\n this.#attachCursor();\n if (!this.opts.waitUntilVisible) {\n this.#fire();\n return this;\n }\n fireWhenVisible(this.element, this.#fire.bind(this));\n return this;\n }\n destroy(shouldRemoveCursor = true) {\n this.timeouts = destroyTimeouts(this.timeouts);\n handleFunctionalArg(shouldRemoveCursor) && this.cursor && this.#removeNode(this.cursor);\n this.statuses.destroyed = true;\n }\n reset(rebuild) {\n !this.is(\"destroyed\") && this.destroy();\n if (rebuild) {\n this.queue.wipe();\n rebuild(this);\n } else {\n this.queue.reset();\n }\n this.cursorPosition = 0;\n for (let property in this.statuses) {\n this.statuses[property] = false;\n }\n this.element[this.#elementIsInput() ? \"value\" : \"innerHTML\"] = \"\";\n return this;\n }\n is = function(key) {\n return this.statuses[key];\n };\n type(string, actionOpts = {}) {\n string = handleFunctionalArg(string);\n let { instant } = actionOpts;\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n let chars = maybeChunkStringAsHtml(string, this.opts.html);\n let charsAsQueueItems = chars.map((char) => {\n return {\n func: () => this.#type(char),\n char,\n delay: instant || isNonVoidElement(char) ? 0 : this.#getPace(),\n typeable: char.nodeType === Node.TEXT_NODE\n };\n });\n let itemsToQueue = [\n bookEndQueueItems[0],\n { func: async () => await this.opts.beforeString(string, this) },\n ...charsAsQueueItems,\n { func: async () => await this.opts.afterString(string, this) },\n bookEndQueueItems[1]\n ];\n return this.#queueAndReturn(itemsToQueue, actionOpts);\n }\n break(actionOpts = {}) {\n return this.#queueAndReturn(\n {\n func: () => this.#type(createElement(\"BR\")),\n typeable: true\n },\n actionOpts\n );\n }\n move(movementArg, actionOpts = {}) {\n movementArg = handleFunctionalArg(movementArg);\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n let { instant, to } = actionOpts;\n let numberOfSteps = countStepsToSelector({\n queueItems: this.queue.getTypeable(),\n selector: movementArg === null ? \"\" : movementArg,\n to,\n cursorPosition: this.#derivedCursorPosition\n });\n let directionalStep = numberOfSteps < 0 ? -1 : 1;\n this.predictedCursorPosition = this.#derivedCursorPosition + numberOfSteps;\n return this.#queueAndReturn(\n [\n bookEndQueueItems[0],\n ...duplicate(\n {\n func: () => this.#move(directionalStep),\n delay: instant ? 0 : this.#getPace(),\n cursorable: true\n },\n Math.abs(numberOfSteps)\n ),\n bookEndQueueItems[1]\n ],\n actionOpts\n );\n }\n exec(func, actionOpts = {}) {\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n return this.#queueAndReturn(\n [bookEndQueueItems[0], { func: () => func(this) }, bookEndQueueItems[1]],\n actionOpts\n );\n }\n options(opts, actionOpts = {}) {\n opts = handleFunctionalArg(opts);\n this.#updateOptions(opts);\n return this.#queueAndReturn({}, actionOpts);\n }\n pause(milliseconds, actionOpts = {}) {\n return this.#queueAndReturn(\n { delay: handleFunctionalArg(milliseconds) },\n actionOpts\n );\n }\n delete(numCharacters = null, actionOpts = {}) {\n numCharacters = handleFunctionalArg(numCharacters);\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n let num = numCharacters;\n let { instant, to } = actionOpts;\n let typeableQueueItems = this.queue.getTypeable();\n let rounds = (() => {\n if (num === null) {\n return typeableQueueItems.length;\n }\n if (isNumber(num)) {\n return num;\n }\n return countStepsToSelector({\n queueItems: typeableQueueItems,\n selector: num,\n cursorPosition: this.#derivedCursorPosition,\n to\n });\n })();\n return this.#queueAndReturn(\n [\n bookEndQueueItems[0],\n ...duplicate(\n {\n func: this.#delete.bind(this),\n delay: instant ? 0 : this.#getPace(1),\n deletable: true\n },\n rounds\n ),\n bookEndQueueItems[1]\n ],\n actionOpts\n );\n }\n freeze() {\n this.statuses.frozen = true;\n }\n /**\n * Like `.go()`, but more... \"off the grid.\"\n *\n * - won't trigger `afterComplete` callback\n * - items won't be replayed after `.reset()`\n *\n * When called, all non-done items will be \"flushed\" --\n * that is, executed, but not remembered.\n */\n flush(cb = null) {\n this.flushCallback = cb || this.flushCallback;\n if (this.statuses.firing) {\n return this;\n }\n this.#attachCursor();\n this.#fire(false).then(() => {\n if (this.queue.getPendingQueueItems().length > 0) {\n return this.flush();\n }\n this.flushCallback();\n this.flushCallback = null;\n });\n return this;\n }\n getQueue() {\n return this.queue;\n }\n getOptions() {\n return this.opts;\n }\n updateOptions(options) {\n return this.#updateOptions(options);\n }\n getElement() {\n return this.element;\n }\n empty(actionOpts = {}) {\n return this.#queueAndReturn({ func: this.#empty.bind(this) }, actionOpts);\n }\n async #empty() {\n if (this.#elementIsInput()) {\n this.element.value = \"\";\n return;\n }\n this.#allChars.forEach(this.#removeNode.bind(this));\n return;\n }\n /**\n * Execute items in the queue.\n *\n * @param remember If false, each queue item will be destroyed once executed.\n * @returns\n */\n async #fire(remember = true) {\n this.statuses.started = true;\n this.statuses.firing = true;\n let cleanUp = (qKey) => {\n this.queue.done(qKey, !remember);\n };\n try {\n let queueItems = [...this.queue.getQueue()];\n for (let index = 0; index < queueItems.length; index++) {\n let [queueKey, queueItem] = queueItems[index];\n if (queueItem.done) continue;\n if (!queueItem.deletable || queueItem.deletable && this.#allChars.length) {\n let newIndex = await this.#fireItemWithContext(index, queueItems);\n cleanUpSkipped({\n index,\n newIndex,\n queueItems,\n cleanUp\n });\n index = newIndex;\n }\n cleanUp(queueKey);\n }\n if (!remember) {\n this.statuses.firing = false;\n return this;\n }\n this.statuses.completed = true;\n this.statuses.firing = false;\n await this.opts.afterComplete(this);\n if (!this.opts.loop) {\n throw \"\";\n }\n let delay = this.opts.loopDelay;\n this.#wait(async () => {\n await this.#prepLoop(delay[0]);\n this.#fire();\n }, delay[1]);\n } catch (e) {\n }\n this.statuses.firing = false;\n return this;\n }\n async #move(step) {\n this.cursorPosition = updateCursorPosition(\n step,\n this.cursorPosition,\n this.#allChars\n );\n repositionCursor(this.element, this.#allChars, this.cursorPosition);\n }\n /**\n * 1. Reset queue.\n * 2. Reset initial pause.\n */\n async #prepLoop(delay) {\n let derivedCursorPosition = this.#derivedCursorPosition;\n derivedCursorPosition && await this.#move({ value: derivedCursorPosition });\n let queueItems = this.#allChars.map((c) => {\n return [\n Symbol(),\n {\n func: this.#delete.bind(this),\n delay: this.#getPace(1),\n deletable: true,\n shouldPauseCursor: () => true\n }\n ];\n });\n for (let index = 0; index < queueItems.length; index++) {\n await this.#fireItemWithContext(index, queueItems);\n }\n this.queue.reset();\n this.queue.set(0, { delay });\n }\n #fireItemWithContext(index, queueItems) {\n return fireItem({\n index,\n queueItems,\n wait: this.#wait.bind(this),\n cursor: this.cursor,\n cursorOptions: this.opts.cursor\n });\n }\n async #wait(callback, delay, silent = false) {\n if (this.statuses.frozen) {\n await new Promise((resolve) => {\n this.unfreeze = () => {\n this.statuses.frozen = false;\n resolve();\n };\n });\n }\n silent || await this.opts.beforeStep(this);\n await wait(callback, delay, this.timeouts);\n silent || await this.opts.afterStep(this);\n }\n /**\n * Attach it to the DOM so, along with the required CSS transition.\n */\n async #attachCursor() {\n !this.#elementIsInput() && this.cursor && this.element.appendChild(this.cursor);\n if (this.#shouldRenderCursor) {\n setCursorStyles(this.id, this.element);\n this.cursor.dataset.tiAnimationId = this.id;\n let { animation } = this.opts.cursor;\n let { frames, options } = animation;\n setCursorAnimation({\n frames,\n cursor: this.cursor,\n options: {\n duration: this.opts.cursorSpeed,\n ...options\n }\n });\n }\n }\n #elementIsInput() {\n return isInput(this.element);\n }\n #queueAndReturn(steps, opts) {\n this.queue.add(steps);\n this.#maybeAppendPause(opts);\n return this;\n }\n #maybeAppendPause(opts = {}) {\n let delay = opts.delay;\n delay && this.queue.add({ delay });\n }\n #generateTemporaryOptionQueueItems(newOptions = {}) {\n return [\n { func: () => this.#updateOptions(newOptions) },\n { func: () => this.#updateOptions(this.opts) }\n ];\n }\n async #updateOptions(opts) {\n this.opts = merge(this.opts, opts);\n }\n /**\n * Based on provided strings, generate a TypeIt queue\n * to be fired for each character in the string.\n */\n #generateQueue() {\n let strings = this.opts.strings.filter((string) => !!string);\n strings.forEach((string, index) => {\n this.type(string);\n if (index + 1 === strings.length) {\n return;\n }\n let splitItems = this.opts.breakLines ? [{ func: () => this.#type(createElement(\"BR\")), typeable: true }] : duplicate(\n {\n func: this.#delete.bind(this),\n delay: this.#getPace(1)\n },\n this.queue.getTypeable().length\n );\n this.#addSplitPause(splitItems);\n });\n }\n #buildOptions = (options) => {\n this.opts.cursor = processCursorOptions(\n options.cursor ?? DEFAULT_OPTIONS.cursor\n );\n this.opts.strings = this.#prependHardcodedStrings(\n asArray(this.opts.strings)\n );\n this.opts = merge(this.opts, {\n html: !this.#isInput && this.opts.html,\n nextStringDelay: calculateDelay(this.opts.nextStringDelay),\n loopDelay: calculateDelay(this.opts.loopDelay)\n });\n };\n #prependHardcodedStrings(strings) {\n let existingMarkup = this.element.innerHTML;\n if (!existingMarkup) {\n return strings;\n }\n this.element.innerHTML = \"\";\n if (this.opts.startDelete) {\n this.element.innerHTML = existingMarkup;\n expandTextNodes(this.element);\n this.#addSplitPause(\n duplicate(\n {\n func: this.#delete.bind(this),\n delay: this.#getPace(1),\n deletable: true\n },\n this.#allChars.length\n )\n );\n return strings;\n }\n return splitOnBreak(existingMarkup).concat(strings);\n }\n /**\n * Provided it's a non-form element and the options is provided,\n * set up the cursor element for the animation.\n */\n #setUpCursor() {\n if (this.#isInput) {\n return null;\n }\n let cursor = createElement(\"span\");\n cursor.className = CURSOR_CLASS;\n if (!this.#shouldRenderCursor) {\n cursor.style.visibility = \"hidden\";\n return cursor;\n }\n cursor.innerHTML = getParsedBody(this.opts.cursorChar).innerHTML;\n return cursor;\n }\n #addSplitPause(items) {\n let delay = this.opts.nextStringDelay;\n this.queue.add([{ delay: delay[0] }, ...items, { delay: delay[1] }]);\n }\n #type(char) {\n insertIntoElement(this.element, char);\n }\n #delete() {\n if (!this.#allChars.length) return;\n if (this.#isInput) {\n this.element.value = this.element.value.slice(0, -1);\n } else {\n this.#removeNode(this.#allChars[this.cursorPosition]);\n }\n }\n #removeNode(node) {\n removeNode(node, this.element);\n }\n #getPace(index = 0) {\n return calculatePace(this.opts)[index];\n }\n get #derivedCursorPosition() {\n return this.predictedCursorPosition ?? this.cursorPosition;\n }\n get #isInput() {\n return isInput(this.element);\n }\n get #shouldRenderCursor() {\n return !!this.opts.cursor && !this.#isInput;\n }\n get #allChars() {\n return getAllChars(this.element);\n }\n}\n\nexport { TypeIt as default };\n","import { consume } from '@lit/context'\nimport { $LitElement } from '@mixins/index'\nimport { delayContext } from '@schmancy/delay'\nimport hashContent from '@schmancy/utils/hashContent'\nimport { intersection$ } from '@schmancy/utils/intersection'\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement, property, query, queryAssignedElements, queryAssignedNodes } from 'lit/decorators.js'\nimport TypeIt, { Options as TypeItOptions } from 'typeit'\n\n@customElement('schmancy-typewriter')\nexport class TypewriterElement extends $LitElement(css`\n\t:host {\n\t\tdisplay: inherit;\n\t}\n\n\t#typewriter {\n\t\t--ti-cursor-display: initial;\n\t}\n\n\t#typewriter .ti-cursor {\n\t\tdisplay: var(--ti-cursor-display);\n\t}\n`) {\n\t/**\n\t * Typing speed in milliseconds per character.\n\t */\n\t@property({ type: Number })\n\tspeed: number = 50\n\n\t/**\n\t * Delay before typing starts (ms).\n\t */\n\t@consume({ context: delayContext, subscribe: true })\n\t@property({ type: Number })\n\tdelay: number = 0\n\n\t/**\n\t * Automatically start typing on initialization.\n\t */\n\t@property({ type: Boolean })\n\tautoStart: boolean = true\n\n\t/**\n\t * The cursor character.\n\t */\n\t@property({ type: String })\n\tcursorChar: string = ''\n\n\t/**\n\t * Typing speed for deletions (ms per character).\n\t */\n\t@property({ type: Number })\n\tdeleteSpeed: number = 25\n\n\t@property({ type: Boolean }) once = true\n\t/**\n\t * TypeIt instance.\n\t */\n\tprivate typeItInstance: TypeIt | null = null\n\n\t/**\n\t * Reference to the typewriter container.\n\t */\n\t@query('#typewriter')\n\tprivate typewriterContainer!: HTMLElement\n\n\t@queryAssignedNodes({\n\t\tflatten: true,\n\t})\n\tprivate _getSlottedNodes!: Node[]\n\n\t@queryAssignedElements({\n\t\tflatten: true,\n\t})\n\tprivate _getSlottedElements!: HTMLElement[]\n\t/**\n\t * Lifecycle method called when the component is disconnected from the DOM.\n\t * Ensures that TypeIt instances are properly cleaned up.\n\t */\n\n\tprivate sessionKey = ''\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis._destroyTypeIt()\n\t}\n\n\t/**\n\t * Initializes the TypeIt instance with the provided slotted content.\n\t */\n\tprivate _startTyping() {\n\t\t// Destroy any existing TypeIt instance\n\t\tthis._destroyTypeIt()\n\n\t\tthis.sessionKey = this.generateSessionKey()\n\n\t\tif (this.once && sessionStorage.getItem(this.sessionKey) === 'true') {\n\t\t\t// Skip delay and render immediately if once is set and already rendered\n\t\t\tthis.shadowRoot?.querySelector('slot')?.removeAttribute('hidden')\n\t\t\treturn\n\t\t}\n\n\t\tif (!this.typewriterContainer) {\n\t\t\tconsole.warn('Typewriter container not found.')\n\t\t\treturn\n\t\t}\n\n\t\t// Configure TypeIt options\n\t\tconst typeItOptions: TypeItOptions = {\n\t\t\tspeed: this.speed,\n\t\t\tstartDelay: this.delay,\n\t\t\tcursor: !!this.cursorChar,\n\t\t\tcursorChar: this.cursorChar,\n\t\t\tdeleteSpeed: this.deleteSpeed,\n\t\t\tafterComplete: () => {\n\t\t\t\tif (this.once) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsessionStorage.setItem(this.sessionKey, 'true')\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Error saving to session storage:', error)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Dispatch the custom event\n\t\t\t\tthis.dispatchEvent(new CustomEvent('typeit-complete', { bubbles: true, composed: true }))\n\n\t\t\t\t// Hide the cursor\n\t\t\t\tthis.typewriterContainer.style.setProperty('--ti-cursor-display', 'none')\n\t\t\t},\n\t\t}\n\n\t\t// Initialize TypeIt\n\t\tthis.typeItInstance = new TypeIt(this.typewriterContainer, typeItOptions)\n\n\t\t// Process slotted content as actions\n\t\tconst slottedNodes = this._getSlottedNodes\n\t\tslottedNodes.forEach(node => {\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\t// Handle plain text\n\t\t\t\tthis.typeItInstance?.type(node.textContent || '')\n\t\t\t} else if (node instanceof HTMLElement) {\n\t\t\t\t// Handle custom element\n\t\t\t\tthis._processCustomElement(node)\n\t\t\t}\n\t\t})\n\n\t\t// Start the typing animation if autoStart is enabled\n\t\t// use rxjs to detect once we are in the view port\n\t\tintersection$(this.shadowRoot?.host as Element).subscribe(() => {\n\t\t\t// alert('in view')\n\t\t\tthis.typeItInstance?.go()\n\t\t})\n\t\t// Start the typing animation if autoStart is enabled\n\t}\n\n\tprivate generateSessionKey(): string {\n\t\tconst slotContent = this._getSlottedElements.map(el => el.outerHTML).join('')\n\t\treturn this.once ? hashContent(slotContent) : ''\n\t}\n\t/**\n\t * Destroys the current TypeIt instance if it exists.\n\t */\n\tprivate _destroyTypeIt() {\n\t\tif (this.typeItInstance) {\n\t\t\ttry {\n\t\t\t\tthis.typeItInstance.destroy()\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error destroying TypeIt instance:', error)\n\t\t\t}\n\t\t\tthis.typeItInstance = null\n\t\t}\n\t}\n\n\t/**\n\t * Processes a custom element for its typing behavior.\n\t */\n\tprivate _processCustomElement(element: HTMLElement) {\n\t\tconst action = element.getAttribute('action')\n\t\tconst value = element.getAttribute('value')\n\t\tswitch (action) {\n\t\t\tcase 'pause':\n\t\t\t\tthis.typeItInstance?.pause(parseInt(value || '0', 10))\n\t\t\t\tbreak\n\t\t\tcase 'delete':\n\t\t\t\tthis.typeItInstance?.delete(parseInt(value || '0', 10))\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tif (element.tagName === 'P') {\n\t\t\t\t\tthis.typeItInstance.break()\n\t\t\t\t}\n\t\t\t\t// Treat as text if no action is defined\n\t\t\t\tthis.typeItInstance?.type(element.textContent || '')\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * Renders the component's HTML.\n\t */\n\trender(): TemplateResult {\n\t\treturn html`<div id=\"typewriter\" aria-live=\"polite\"></div>\n\n\t\t\t<div class=\"typewriter\">\n\t\t\t\t<slot\n\t\t\t\t\thidden\n\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\tthis._startTyping()\n\t\t\t\t\t}}\n\t\t\t\t></slot>\n\t\t\t</div> `\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-typewriter': TypewriterElement\n\t}\n}\n"],"names":["isArray","thing","Array","asArray","value","DATA_ATTRIBUTE","CURSOR_CLASS","DEFAULT_STATUSES","started","completed","frozen","destroyed","DEFAULT_OPTIONS","breakLines","cursor","autoPause","autoPauseDelay","animation","frames","map","n","opacity","options","iterations","Infinity","easing","fill","cursorChar","cursorSpeed","deleteSpeed","html","lifeLike","loop","loopDelay","nextStringDelay","speed","startDelay","startDelete","strings","waitUntilVisible","beforeString","afterString","beforeStep","afterStep","afterComplete","PLACEHOLDER_CSS","createElement","el","document","createTextNode","content","appendStyleBlock","styles","id","styleBlock","appendChild","head","calculateDelay","delayArg","randomInRange","range","Math","abs","random","val","toArray","from","expandTextNodes","element","childNodes","forEach","child","nodeValue","c","parentNode","insertBefore","remove","getParsedBody","doc","implementation","createHTMLDocument","body","innerHTML","walkElementNodes","shouldReverse","shouldIncludeCursor","nextNode","querySelector","walker","createTreeWalker","NodeFilter","SHOW_ALL","acceptNode","node","classList","contains","FILTER_ACCEPT","FILTER_REJECT","nodes","originalParent","push","reverse","maybeChunkStringAsHtml","str","asHtml","cleanUpSkipped","index","newIndex","queueItems","cleanUp","i","isNumber","Number","isInteger","countStepsToSelector","selector","cursorPosition","to","isMovingToEnd","RegExp","test","selectorIndex","findIndex","char","t","parentElement","parentMatches","matches","firstChild","isSameNode","length","duplicate","times","beforePaint","cb","Promise","resolve","requestAnimationFrame","async","getAnimationFromElement","getAnimations","find","dataset","tiAnimationId","setCursorAnimation","s","animate","pause","play","execute","queueItem","func","call","fireItem","wait","cursorOptions","instantQueue","tempIndex","futureItem","shouldBeGrouped","delay","shouldPauseCursor","q","effect","getComputedTiming","cancel","oldCurrentTime","currentTime","newAnimation","isInput","handleFunctionalArg","arg","select","all","merge","originalObj","newObj","Object","assign","cursorFontStyles","color","transform","TypeIt","__privateAdd","_z_instances","timeouts","predictedCursorPosition","statuses","firing","opts","queue","flushCallback","unfreeze","is","key","this","buildOptions","newOptions","defaultFrames","defaultOptions","toString","substring","initialItems","add","steps","step","_q","set","Symbol","innerText","buildQueueItem","Boolean","typeable","cursorable","deletable","getQueue","rawValues","values","Map","item","keys","wipe","done","shouldDestroy","delete","get","reset","destroy","getItems","filter","getTypeable","getPendingQueueItems","pending","setUpCursor","typeitId","go","attachCursor","bind","IntersectionObserver","entries","observer2","entry","isIntersecting","unobserve","threshold","observe","fire","shouldRemoveCursor","clearTimeout","removeNode","rebuild","property","string","actionOpts","instant","bookEndQueueItems","charsAsQueueItems","outerHTML","getPace","nodeType","Node","TEXT_NODE","itemsToQueue","movementArg","generateTemporaryOptionQueueItems","numberOfSteps","directionalStep","queueAndReturn","milliseconds","numCharacters","num","typeableQueueItems","rounds","derivedCursorPosition","then","flush","getOptions","getElement","empty","f_fn","elementIsInput","remember","qKey","queueKey","allChars","e","move","printedCharacters","min","max","newCursorPosition","nodeToInsertBefore","prepLoop","w_fn","fireItemWithContext","b_fn","callback","silent","setTimeout","shouldRenderCursor","cursorSelector","computedStyles","getComputedStyle","customProperties","reduce","accumulator","duration","n_fn","l_fn","maybeAppendPause","x_fn","o_fn","updateOptions","s_fn","generateQueue","type","splitItems","q_fn","prependHardcodedStrings","existingMarkup","replace","trim","split","concat","e_fn","className","style","visibility","S_fn","addSplitPause","items","a_fn","originalTarget","character","textContent","target","tagName","cursorNode","y_fn","slice","h_fn","rootElement","nodeParent","u_fn","c_get","v_get","TypewriterElement","$LitElement","css","constructor","super","arguments","autoStart","once","typeItInstance","sessionKey","disconnectedCallback","_destroyTypeIt","_startTyping","generateSessionKey","sessionStorage","getItem","shadowRoot","removeAttribute","typewriterContainer","typeItOptions","setItem","dispatchEvent","CustomEvent","bubbles","composed","setProperty","_getSlottedNodes","HTMLElement","_processCustomElement","intersection$","host","subscribe","slotContent","_getSlottedElements","join","hashContent","action","getAttribute","parseInt","break","render","__decorateClass","prototype","consume","context","delayContext","String","query","queryAssignedNodes","flatten","queryAssignedElements","customElement"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"typewriter-CwrZhpWq.cjs","sources":["../.yarn/unplugged/typeit-npm-8.8.7-4441c75f10/node_modules/typeit/dist/index.es.js","../src/typewriter/typewriter.ts"],"sourcesContent":["// TypeIt by Alex MacArthur - https://typeitjs.com\nconst isArray = (thing) => Array.isArray(thing);\n\nconst asArray = (value) => isArray(value) ? value : [value];\n\nlet Queue = function(initialItems) {\n let add = function(steps) {\n asArray(steps).forEach((step) => {\n return _q.set(Symbol(step.char?.innerText), buildQueueItem({ ...step }));\n });\n return this;\n };\n let getTypeable = () => rawValues().filter((value) => value.typeable);\n let set = function(index, item) {\n let keys = [..._q.keys()];\n _q.set(keys[index], buildQueueItem(item));\n };\n let buildQueueItem = (queueItem) => {\n queueItem.shouldPauseCursor = function() {\n return Boolean(this.typeable || this.cursorable || this.deletable);\n };\n return queueItem;\n };\n let reset = function() {\n _q.forEach((item) => delete item.done);\n };\n let wipe = function() {\n _q = /* @__PURE__ */ new Map();\n add(initialItems);\n };\n let getQueue = () => _q;\n let rawValues = () => Array.from(_q.values());\n let destroy = (key) => _q.delete(key);\n let getPendingQueueItems = () => {\n const pending = [];\n for (let [, value] of getQueue()) {\n if (!value.done) {\n pending.push(value);\n }\n }\n return pending;\n };\n let getItems = (all = false) => all ? rawValues() : rawValues().filter((i) => !i.done);\n let done = (key, shouldDestroy = false) => shouldDestroy ? _q.delete(key) : _q.get(key).done = true;\n let _q = /* @__PURE__ */ new Map();\n add(initialItems);\n return {\n add,\n set,\n wipe,\n done,\n reset,\n destroy,\n getItems,\n getQueue,\n getTypeable,\n getPendingQueueItems\n };\n};\n\nconst DATA_ATTRIBUTE = \"data-typeit-id\";\nconst CURSOR_CLASS = \"ti-cursor\";\nconst END = \"END\";\nconst DEFAULT_STATUSES = {\n started: false,\n completed: false,\n frozen: false,\n destroyed: false\n};\nconst DEFAULT_OPTIONS = {\n breakLines: true,\n cursor: {\n autoPause: true,\n autoPauseDelay: 500,\n animation: {\n frames: [0, 0, 1].map((n) => {\n return { opacity: n };\n }),\n options: {\n iterations: Infinity,\n easing: \"steps(2, start)\",\n fill: \"forwards\"\n }\n }\n },\n cursorChar: \"|\",\n cursorSpeed: 1e3,\n deleteSpeed: null,\n html: true,\n lifeLike: true,\n loop: false,\n loopDelay: 750,\n nextStringDelay: 750,\n speed: 100,\n startDelay: 250,\n startDelete: false,\n strings: [],\n waitUntilVisible: false,\n beforeString: () => {\n },\n afterString: () => {\n },\n beforeStep: () => {\n },\n afterStep: () => {\n },\n afterComplete: () => {\n }\n};\nconst PLACEHOLDER_CSS = `[${DATA_ATTRIBUTE}]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}`;\n\nconst createElement = (el) => document.createElement(el);\n\nconst createTextNode = (content) => document.createTextNode(content);\n\nconst appendStyleBlock = (styles, id = \"\") => {\n let styleBlock = createElement(\"style\");\n styleBlock.id = id;\n styleBlock.appendChild(createTextNode(styles));\n document.head.appendChild(styleBlock);\n};\n\nconst calculateDelay = (delayArg) => {\n if (!isArray(delayArg)) {\n delayArg = [delayArg / 2, delayArg / 2];\n }\n return delayArg;\n};\n\nconst randomInRange = (value, range) => {\n return Math.abs(\n Math.random() * (value + range - (value - range)) + (value - range)\n );\n};\n\nlet range = (val) => val / 2;\nfunction calculatePace(options) {\n let { speed, deleteSpeed, lifeLike } = options;\n deleteSpeed = deleteSpeed !== null ? deleteSpeed : speed / 3;\n return lifeLike ? [\n randomInRange(speed, range(speed)),\n randomInRange(deleteSpeed, range(deleteSpeed))\n ] : [speed, deleteSpeed];\n}\n\nconst toArray = (val) => Array.from(val);\n\nlet expandTextNodes = (element) => {\n [...element.childNodes].forEach((child) => {\n if (child.nodeValue) {\n [...child.nodeValue].forEach((c) => {\n child.parentNode.insertBefore(createTextNode(c), child);\n });\n child.remove();\n return;\n }\n expandTextNodes(child);\n });\n return element;\n};\n\nconst getParsedBody = (content) => {\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = content;\n return expandTextNodes(doc.body);\n};\n\nfunction walkElementNodes(element, shouldReverse = false, shouldIncludeCursor = false) {\n let cursor = element.querySelector(`.${CURSOR_CLASS}`);\n let walker = document.createTreeWalker(element, NodeFilter.SHOW_ALL, {\n acceptNode: (node) => {\n if (cursor && shouldIncludeCursor) {\n if (node.classList?.contains(CURSOR_CLASS)) {\n return NodeFilter.FILTER_ACCEPT;\n }\n if (cursor.contains(node)) {\n return NodeFilter.FILTER_REJECT;\n }\n }\n return node.classList?.contains(CURSOR_CLASS) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT;\n }\n });\n let nextNode;\n let nodes = [];\n while (nextNode = walker.nextNode()) {\n if (!nextNode.originalParent) {\n nextNode.originalParent = nextNode.parentNode;\n }\n nodes.push(nextNode);\n }\n return shouldReverse ? nodes.reverse() : nodes;\n}\nfunction chunkStringAsHtml(string) {\n return walkElementNodes(getParsedBody(string));\n}\nfunction maybeChunkStringAsHtml(str, asHtml = true) {\n return asHtml ? chunkStringAsHtml(str) : toArray(str).map(createTextNode);\n}\n\nconst cleanUpSkipped = ({\n index,\n newIndex,\n queueItems,\n cleanUp\n}) => {\n for (let i = index + 1; i < newIndex + 1; i++) {\n cleanUp(queueItems[i][0]);\n }\n};\n\nconst isNumber = (value) => Number.isInteger(value);\n\nconst countStepsToSelector = ({\n queueItems,\n selector,\n cursorPosition,\n to\n}) => {\n if (isNumber(selector)) {\n return selector * -1;\n }\n let isMovingToEnd = new RegExp(END, \"i\").test(to);\n let selectorIndex = selector ? [...queueItems].reverse().findIndex(({ char }) => {\n let parentElement = char.parentElement;\n let parentMatches = parentElement.matches(selector);\n if (isMovingToEnd && parentMatches) {\n return true;\n }\n return parentMatches && parentElement.firstChild.isSameNode(char);\n }) : -1;\n if (selectorIndex < 0) {\n selectorIndex = isMovingToEnd ? 0 : queueItems.length - 1;\n }\n let offset = isMovingToEnd ? 0 : 1;\n return selectorIndex - cursorPosition + offset;\n};\n\nconst destroyTimeouts = (timeouts) => {\n timeouts.forEach(clearTimeout);\n return [];\n};\n\nconst duplicate = (value, times) => new Array(times).fill(value);\n\nlet beforePaint = (cb) => {\n return new Promise((resolve) => {\n requestAnimationFrame(async () => {\n resolve(await cb());\n });\n });\n};\n\nlet getAnimationFromElement = (element) => {\n return element?.getAnimations().find((animation) => {\n return animation.id === element.dataset.tiAnimationId;\n });\n};\n\nlet setCursorAnimation = ({\n cursor,\n frames,\n options\n}) => {\n let animation = cursor.animate(frames, options);\n animation.pause();\n animation.id = cursor.dataset.tiAnimationId;\n beforePaint(() => {\n beforePaint(() => {\n animation.play();\n });\n });\n return animation;\n};\n\nlet rebuildCursorAnimation = ({\n cursor,\n options,\n cursorOptions\n}) => {\n if (!cursor || !cursorOptions) return;\n let animation = getAnimationFromElement(cursor);\n let oldCurrentTime;\n if (animation) {\n options.delay = animation.effect.getComputedTiming().delay;\n oldCurrentTime = animation.currentTime;\n animation.cancel();\n }\n let newAnimation = setCursorAnimation({\n cursor,\n frames: cursorOptions.animation.frames,\n options\n });\n if (oldCurrentTime) {\n newAnimation.currentTime = oldCurrentTime;\n }\n return newAnimation;\n};\n\nlet execute = (queueItem) => queueItem.func?.call(null);\nlet fireItem = async ({\n index,\n queueItems,\n wait,\n cursor,\n cursorOptions\n}) => {\n let queueItem = queueItems[index][1];\n let instantQueue = [];\n let tempIndex = index;\n let futureItem = queueItem;\n let shouldBeGrouped = () => futureItem && !futureItem.delay;\n let shouldPauseCursor = queueItem.shouldPauseCursor() && cursorOptions.autoPause;\n while (shouldBeGrouped()) {\n instantQueue.push(futureItem);\n shouldBeGrouped() && tempIndex++;\n futureItem = queueItems[tempIndex] ? queueItems[tempIndex][1] : null;\n }\n if (instantQueue.length) {\n await beforePaint(async () => {\n for (let q of instantQueue) {\n await execute(q);\n }\n });\n return tempIndex - 1;\n }\n let animation = getAnimationFromElement(cursor);\n let options;\n if (animation) {\n options = {\n ...animation.effect.getComputedTiming(),\n delay: shouldPauseCursor ? cursorOptions.autoPauseDelay : 0\n };\n }\n await wait(async () => {\n if (animation && shouldPauseCursor) {\n animation.cancel();\n }\n await beforePaint(() => {\n execute(queueItem);\n });\n }, queueItem.delay);\n await rebuildCursorAnimation({\n cursor,\n options,\n cursorOptions\n });\n return index;\n};\n\nconst fireWhenVisible = (element, func) => {\n let observer = new IntersectionObserver(\n (entries, observer2) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n func();\n observer2.unobserve(element);\n }\n });\n },\n { threshold: 1 }\n );\n observer.observe(element);\n};\n\nconst generateHash = () => Math.random().toString().substring(2, 9);\n\nconst isInput = (el) => {\n return \"value\" in el;\n};\n\nlet getAllChars = (element) => {\n if (isInput(element)) {\n return toArray(element.value);\n }\n return walkElementNodes(element, true).filter(\n (c) => !(c.childNodes.length > 0)\n );\n};\n\nlet handleFunctionalArg = (arg) => {\n return typeof arg === \"function\" ? arg() : arg;\n};\n\nlet select = (selector, element = document, all = false) => {\n return element[`querySelector${all ? \"All\" : \"\"}`](selector);\n};\n\nlet isBodyElement = (node) => /body/i.test(node?.tagName);\n\nlet insertIntoElement = (originalTarget, character) => {\n if (isInput(originalTarget)) {\n originalTarget.value = `${originalTarget.value}${character.textContent}`;\n return;\n }\n character.innerHTML = \"\";\n let target = isBodyElement(character.originalParent) ? originalTarget : (\n // If we add one-off fresh elements, there will be no\n // \"originalParent\", so always fall back to the default target.\n character.originalParent || originalTarget\n );\n let cursorNode = select(\".\" + CURSOR_CLASS, target) || null;\n if (cursorNode && cursorNode.parentElement !== target) {\n target = cursorNode.parentElement;\n }\n target.insertBefore(character, cursorNode);\n};\n\nconst isNonVoidElement = (el) => /<(.+)>(.*?)<\\/(.+)>/.test(el.outerHTML);\n\nconst merge = (originalObj, newObj) => Object.assign({}, originalObj, newObj);\n\nlet processCursorOptions = (cursorOptions) => {\n if (typeof cursorOptions === \"object\") {\n let newOptions = {};\n let { frames: defaultFrames, options: defaultOptions } = DEFAULT_OPTIONS.cursor.animation;\n newOptions.animation = cursorOptions.animation || {};\n newOptions.animation.frames = cursorOptions.animation?.frames || defaultFrames;\n newOptions.animation.options = merge(\n defaultOptions,\n cursorOptions.animation?.options || {}\n );\n newOptions.autoPause = cursorOptions.autoPause ?? DEFAULT_OPTIONS.cursor.autoPause;\n newOptions.autoPauseDelay = cursorOptions.autoPauseDelay || DEFAULT_OPTIONS.cursor.autoPauseDelay;\n return newOptions;\n }\n if (cursorOptions === true) {\n return DEFAULT_OPTIONS.cursor;\n }\n return cursorOptions;\n};\n\nconst removeNode = (node, rootElement) => {\n if (!node) return;\n let nodeParent = node.parentNode;\n let nodeToRemove = nodeParent.childNodes.length > 1 || nodeParent.isSameNode(rootElement) ? (\n // This parent still needs to exist.\n node\n ) : (\n // There's nothing else in there, so just delete the entire thing.\n // By doing this, we clean up markup as we go along.\n nodeParent\n );\n nodeToRemove.remove();\n};\n\nconst repositionCursor = (element, allChars, newCursorPosition) => {\n let nodeToInsertBefore = allChars[newCursorPosition - 1];\n let cursor = select(`.${CURSOR_CLASS}`, element);\n element = nodeToInsertBefore?.parentNode || element;\n element.insertBefore(cursor, nodeToInsertBefore || null);\n};\n\nfunction selectorToElement(thing) {\n return typeof thing === \"string\" ? select(thing) : thing;\n}\n\nlet cursorFontStyles = {\n \"font-family\": \"\",\n \"font-weight\": \"\",\n \"font-size\": \"\",\n \"font-style\": \"\",\n \"line-height\": \"\",\n color: \"\",\n transform: \"translateX(-.125em)\"\n};\nlet setCursorStyles = (id, element) => {\n let rootSelector = `[${DATA_ATTRIBUTE}='${id}']`;\n let cursorSelector = `${rootSelector} .${CURSOR_CLASS}`;\n let computedStyles = getComputedStyle(element);\n let customProperties = Object.entries(cursorFontStyles).reduce(\n (accumulator, [item, value]) => {\n return `${accumulator} ${item}: var(--ti-cursor-${item}, ${value || computedStyles[item]});`;\n },\n \"\"\n );\n appendStyleBlock(\n `${cursorSelector} { display: inline-block; width: 0; ${customProperties} }`,\n id\n );\n};\n\nfunction splitOnBreak(str) {\n return str.replace(/<!--(.+?)-->/g, \"\").trim().split(/<br(?:\\s*?)(?:\\/)?>/);\n}\n\nlet updateCursorPosition = (steps, cursorPosition, printedCharacters) => {\n return Math.min(\n Math.max(cursorPosition + steps, 0),\n printedCharacters.length\n );\n};\n\nlet wait = (callback, delay, timeouts) => {\n return new Promise((resolve) => {\n let cb = async () => {\n await callback();\n resolve();\n };\n timeouts.push(setTimeout(cb, delay || 0));\n });\n};\n\nclass TypeIt {\n element;\n timeouts;\n cursorPosition;\n predictedCursorPosition;\n statuses = {\n started: false,\n completed: false,\n frozen: false,\n destroyed: false,\n firing: false\n };\n opts;\n id;\n queue;\n cursor;\n flushCallback = null;\n unfreeze = () => {\n };\n constructor(element, options = {}) {\n this.opts = merge(DEFAULT_OPTIONS, options);\n this.element = selectorToElement(element);\n this.timeouts = [];\n this.cursorPosition = 0;\n this.unfreeze = () => {\n };\n this.predictedCursorPosition = null;\n this.statuses = merge({}, DEFAULT_STATUSES);\n this.id = generateHash();\n this.queue = Queue([{ delay: this.opts.startDelay }]);\n this.#buildOptions(options);\n this.cursor = this.#setUpCursor();\n this.element.dataset.typeitId = this.id;\n appendStyleBlock(PLACEHOLDER_CSS);\n if (this.opts.strings.length) {\n this.#generateQueue();\n }\n }\n /**\n * Can only be called once.\n */\n go() {\n if (this.statuses.started) {\n return this;\n }\n this.#attachCursor();\n if (!this.opts.waitUntilVisible) {\n this.#fire();\n return this;\n }\n fireWhenVisible(this.element, this.#fire.bind(this));\n return this;\n }\n destroy(shouldRemoveCursor = true) {\n this.timeouts = destroyTimeouts(this.timeouts);\n handleFunctionalArg(shouldRemoveCursor) && this.cursor && this.#removeNode(this.cursor);\n this.statuses.destroyed = true;\n }\n reset(rebuild) {\n !this.is(\"destroyed\") && this.destroy();\n if (rebuild) {\n this.queue.wipe();\n rebuild(this);\n } else {\n this.queue.reset();\n }\n this.cursorPosition = 0;\n for (let property in this.statuses) {\n this.statuses[property] = false;\n }\n this.element[this.#elementIsInput() ? \"value\" : \"innerHTML\"] = \"\";\n return this;\n }\n is = function(key) {\n return this.statuses[key];\n };\n type(string, actionOpts = {}) {\n string = handleFunctionalArg(string);\n let { instant } = actionOpts;\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n let chars = maybeChunkStringAsHtml(string, this.opts.html);\n let charsAsQueueItems = chars.map((char) => {\n return {\n func: () => this.#type(char),\n char,\n delay: instant || isNonVoidElement(char) ? 0 : this.#getPace(),\n typeable: char.nodeType === Node.TEXT_NODE\n };\n });\n let itemsToQueue = [\n bookEndQueueItems[0],\n { func: async () => await this.opts.beforeString(string, this) },\n ...charsAsQueueItems,\n { func: async () => await this.opts.afterString(string, this) },\n bookEndQueueItems[1]\n ];\n return this.#queueAndReturn(itemsToQueue, actionOpts);\n }\n break(actionOpts = {}) {\n return this.#queueAndReturn(\n {\n func: () => this.#type(createElement(\"BR\")),\n typeable: true\n },\n actionOpts\n );\n }\n move(movementArg, actionOpts = {}) {\n movementArg = handleFunctionalArg(movementArg);\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n let { instant, to } = actionOpts;\n let numberOfSteps = countStepsToSelector({\n queueItems: this.queue.getTypeable(),\n selector: movementArg === null ? \"\" : movementArg,\n to,\n cursorPosition: this.#derivedCursorPosition\n });\n let directionalStep = numberOfSteps < 0 ? -1 : 1;\n this.predictedCursorPosition = this.#derivedCursorPosition + numberOfSteps;\n return this.#queueAndReturn(\n [\n bookEndQueueItems[0],\n ...duplicate(\n {\n func: () => this.#move(directionalStep),\n delay: instant ? 0 : this.#getPace(),\n cursorable: true\n },\n Math.abs(numberOfSteps)\n ),\n bookEndQueueItems[1]\n ],\n actionOpts\n );\n }\n exec(func, actionOpts = {}) {\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n return this.#queueAndReturn(\n [bookEndQueueItems[0], { func: () => func(this) }, bookEndQueueItems[1]],\n actionOpts\n );\n }\n options(opts, actionOpts = {}) {\n opts = handleFunctionalArg(opts);\n this.#updateOptions(opts);\n return this.#queueAndReturn({}, actionOpts);\n }\n pause(milliseconds, actionOpts = {}) {\n return this.#queueAndReturn(\n { delay: handleFunctionalArg(milliseconds) },\n actionOpts\n );\n }\n delete(numCharacters = null, actionOpts = {}) {\n numCharacters = handleFunctionalArg(numCharacters);\n let bookEndQueueItems = this.#generateTemporaryOptionQueueItems(actionOpts);\n let num = numCharacters;\n let { instant, to } = actionOpts;\n let typeableQueueItems = this.queue.getTypeable();\n let rounds = (() => {\n if (num === null) {\n return typeableQueueItems.length;\n }\n if (isNumber(num)) {\n return num;\n }\n return countStepsToSelector({\n queueItems: typeableQueueItems,\n selector: num,\n cursorPosition: this.#derivedCursorPosition,\n to\n });\n })();\n return this.#queueAndReturn(\n [\n bookEndQueueItems[0],\n ...duplicate(\n {\n func: this.#delete.bind(this),\n delay: instant ? 0 : this.#getPace(1),\n deletable: true\n },\n rounds\n ),\n bookEndQueueItems[1]\n ],\n actionOpts\n );\n }\n freeze() {\n this.statuses.frozen = true;\n }\n /**\n * Like `.go()`, but more... \"off the grid.\"\n *\n * - won't trigger `afterComplete` callback\n * - items won't be replayed after `.reset()`\n *\n * When called, all non-done items will be \"flushed\" --\n * that is, executed, but not remembered.\n */\n flush(cb = null) {\n this.flushCallback = cb || this.flushCallback;\n if (this.statuses.firing) {\n return this;\n }\n this.#attachCursor();\n this.#fire(false).then(() => {\n if (this.queue.getPendingQueueItems().length > 0) {\n return this.flush();\n }\n this.flushCallback();\n this.flushCallback = null;\n });\n return this;\n }\n getQueue() {\n return this.queue;\n }\n getOptions() {\n return this.opts;\n }\n updateOptions(options) {\n return this.#updateOptions(options);\n }\n getElement() {\n return this.element;\n }\n empty(actionOpts = {}) {\n return this.#queueAndReturn({ func: this.#empty.bind(this) }, actionOpts);\n }\n async #empty() {\n if (this.#elementIsInput()) {\n this.element.value = \"\";\n return;\n }\n this.#allChars.forEach(this.#removeNode.bind(this));\n return;\n }\n /**\n * Execute items in the queue.\n *\n * @param remember If false, each queue item will be destroyed once executed.\n * @returns\n */\n async #fire(remember = true) {\n this.statuses.started = true;\n this.statuses.firing = true;\n let cleanUp = (qKey) => {\n this.queue.done(qKey, !remember);\n };\n try {\n let queueItems = [...this.queue.getQueue()];\n for (let index = 0; index < queueItems.length; index++) {\n let [queueKey, queueItem] = queueItems[index];\n if (queueItem.done) continue;\n if (!queueItem.deletable || queueItem.deletable && this.#allChars.length) {\n let newIndex = await this.#fireItemWithContext(index, queueItems);\n cleanUpSkipped({\n index,\n newIndex,\n queueItems,\n cleanUp\n });\n index = newIndex;\n }\n cleanUp(queueKey);\n }\n if (!remember) {\n this.statuses.firing = false;\n return this;\n }\n this.statuses.completed = true;\n this.statuses.firing = false;\n await this.opts.afterComplete(this);\n if (!this.opts.loop) {\n throw \"\";\n }\n let delay = this.opts.loopDelay;\n this.#wait(async () => {\n await this.#prepLoop(delay[0]);\n this.#fire();\n }, delay[1]);\n } catch (e) {\n }\n this.statuses.firing = false;\n return this;\n }\n async #move(step) {\n this.cursorPosition = updateCursorPosition(\n step,\n this.cursorPosition,\n this.#allChars\n );\n repositionCursor(this.element, this.#allChars, this.cursorPosition);\n }\n /**\n * 1. Reset queue.\n * 2. Reset initial pause.\n */\n async #prepLoop(delay) {\n let derivedCursorPosition = this.#derivedCursorPosition;\n derivedCursorPosition && await this.#move({ value: derivedCursorPosition });\n let queueItems = this.#allChars.map((c) => {\n return [\n Symbol(),\n {\n func: this.#delete.bind(this),\n delay: this.#getPace(1),\n deletable: true,\n shouldPauseCursor: () => true\n }\n ];\n });\n for (let index = 0; index < queueItems.length; index++) {\n await this.#fireItemWithContext(index, queueItems);\n }\n this.queue.reset();\n this.queue.set(0, { delay });\n }\n #fireItemWithContext(index, queueItems) {\n return fireItem({\n index,\n queueItems,\n wait: this.#wait.bind(this),\n cursor: this.cursor,\n cursorOptions: this.opts.cursor\n });\n }\n async #wait(callback, delay, silent = false) {\n if (this.statuses.frozen) {\n await new Promise((resolve) => {\n this.unfreeze = () => {\n this.statuses.frozen = false;\n resolve();\n };\n });\n }\n silent || await this.opts.beforeStep(this);\n await wait(callback, delay, this.timeouts);\n silent || await this.opts.afterStep(this);\n }\n /**\n * Attach it to the DOM so, along with the required CSS transition.\n */\n async #attachCursor() {\n !this.#elementIsInput() && this.cursor && this.element.appendChild(this.cursor);\n if (this.#shouldRenderCursor) {\n setCursorStyles(this.id, this.element);\n this.cursor.dataset.tiAnimationId = this.id;\n let { animation } = this.opts.cursor;\n let { frames, options } = animation;\n setCursorAnimation({\n frames,\n cursor: this.cursor,\n options: {\n duration: this.opts.cursorSpeed,\n ...options\n }\n });\n }\n }\n #elementIsInput() {\n return isInput(this.element);\n }\n #queueAndReturn(steps, opts) {\n this.queue.add(steps);\n this.#maybeAppendPause(opts);\n return this;\n }\n #maybeAppendPause(opts = {}) {\n let delay = opts.delay;\n delay && this.queue.add({ delay });\n }\n #generateTemporaryOptionQueueItems(newOptions = {}) {\n return [\n { func: () => this.#updateOptions(newOptions) },\n { func: () => this.#updateOptions(this.opts) }\n ];\n }\n async #updateOptions(opts) {\n this.opts = merge(this.opts, opts);\n }\n /**\n * Based on provided strings, generate a TypeIt queue\n * to be fired for each character in the string.\n */\n #generateQueue() {\n let strings = this.opts.strings.filter((string) => !!string);\n strings.forEach((string, index) => {\n this.type(string);\n if (index + 1 === strings.length) {\n return;\n }\n let splitItems = this.opts.breakLines ? [{ func: () => this.#type(createElement(\"BR\")), typeable: true }] : duplicate(\n {\n func: this.#delete.bind(this),\n delay: this.#getPace(1)\n },\n this.queue.getTypeable().length\n );\n this.#addSplitPause(splitItems);\n });\n }\n #buildOptions = (options) => {\n this.opts.cursor = processCursorOptions(\n options.cursor ?? DEFAULT_OPTIONS.cursor\n );\n this.opts.strings = this.#prependHardcodedStrings(\n asArray(this.opts.strings)\n );\n this.opts = merge(this.opts, {\n html: !this.#isInput && this.opts.html,\n nextStringDelay: calculateDelay(this.opts.nextStringDelay),\n loopDelay: calculateDelay(this.opts.loopDelay)\n });\n };\n #prependHardcodedStrings(strings) {\n let existingMarkup = this.element.innerHTML;\n if (!existingMarkup) {\n return strings;\n }\n this.element.innerHTML = \"\";\n if (this.opts.startDelete) {\n this.element.innerHTML = existingMarkup;\n expandTextNodes(this.element);\n this.#addSplitPause(\n duplicate(\n {\n func: this.#delete.bind(this),\n delay: this.#getPace(1),\n deletable: true\n },\n this.#allChars.length\n )\n );\n return strings;\n }\n return splitOnBreak(existingMarkup).concat(strings);\n }\n /**\n * Provided it's a non-form element and the options is provided,\n * set up the cursor element for the animation.\n */\n #setUpCursor() {\n if (this.#isInput) {\n return null;\n }\n let cursor = createElement(\"span\");\n cursor.className = CURSOR_CLASS;\n if (!this.#shouldRenderCursor) {\n cursor.style.visibility = \"hidden\";\n return cursor;\n }\n cursor.innerHTML = getParsedBody(this.opts.cursorChar).innerHTML;\n return cursor;\n }\n #addSplitPause(items) {\n let delay = this.opts.nextStringDelay;\n this.queue.add([{ delay: delay[0] }, ...items, { delay: delay[1] }]);\n }\n #type(char) {\n insertIntoElement(this.element, char);\n }\n #delete() {\n if (!this.#allChars.length) return;\n if (this.#isInput) {\n this.element.value = this.element.value.slice(0, -1);\n } else {\n this.#removeNode(this.#allChars[this.cursorPosition]);\n }\n }\n #removeNode(node) {\n removeNode(node, this.element);\n }\n #getPace(index = 0) {\n return calculatePace(this.opts)[index];\n }\n get #derivedCursorPosition() {\n return this.predictedCursorPosition ?? this.cursorPosition;\n }\n get #isInput() {\n return isInput(this.element);\n }\n get #shouldRenderCursor() {\n return !!this.opts.cursor && !this.#isInput;\n }\n get #allChars() {\n return getAllChars(this.element);\n }\n}\n\nexport { TypeIt as default };\n","import { consume } from '@lit/context'\nimport { $LitElement } from '@mixins/index'\nimport { delayContext } from '@schmancy/delay'\nimport hashContent from '@schmancy/utils/hashContent'\nimport { intersection$ } from '@schmancy/utils/intersection'\nimport { css, html, TemplateResult } from 'lit'\nimport { customElement, property, query, queryAssignedElements, queryAssignedNodes } from 'lit/decorators.js'\nimport TypeIt, { Options as TypeItOptions } from 'typeit'\n\n@customElement('schmancy-typewriter')\nexport class TypewriterElement extends $LitElement(css`\n\t:host {\n\t\tdisplay: inherit;\n\t}\n\n\t#typewriter {\n\t\t--ti-cursor-display: initial;\n\t}\n\n\t#typewriter .ti-cursor {\n\t\tdisplay: var(--ti-cursor-display);\n\t}\n`) {\n\t/**\n\t * Typing speed in milliseconds per character.\n\t */\n\t@property({ type: Number })\n\tspeed: number = 50\n\n\t/**\n\t * Delay before typing starts (ms).\n\t */\n\t@consume({ context: delayContext, subscribe: true })\n\t@property({ type: Number })\n\tdelay: number = 0\n\n\t/**\n\t * Automatically start typing on initialization.\n\t */\n\t@property({ type: Boolean })\n\tautoStart: boolean = true\n\n\t/**\n\t * The cursor character.\n\t */\n\t@property({ type: String })\n\tcursorChar: string = ''\n\n\t/**\n\t * Typing speed for deletions (ms per character).\n\t */\n\t@property({ type: Number })\n\tdeleteSpeed: number = 25\n\n\t@property({ type: Boolean }) once = true\n\t/**\n\t * TypeIt instance.\n\t */\n\tprivate typeItInstance: TypeIt | null = null\n\n\t/**\n\t * Reference to the typewriter container.\n\t */\n\t@query('#typewriter')\n\tprivate typewriterContainer!: HTMLElement\n\n\t@queryAssignedNodes({\n\t\tflatten: true,\n\t})\n\tprivate _getSlottedNodes!: Node[]\n\n\t@queryAssignedElements({\n\t\tflatten: true,\n\t})\n\tprivate _getSlottedElements!: HTMLElement[]\n\t/**\n\t * Lifecycle method called when the component is disconnected from the DOM.\n\t * Ensures that TypeIt instances are properly cleaned up.\n\t */\n\n\tprivate sessionKey = ''\n\tdisconnectedCallback() {\n\t\tsuper.disconnectedCallback()\n\t\tthis._destroyTypeIt()\n\t}\n\n\t/**\n\t * Initializes the TypeIt instance with the provided slotted content.\n\t */\n\tprivate _startTyping() {\n\t\t// Destroy any existing TypeIt instance\n\t\tthis._destroyTypeIt()\n\n\t\tthis.sessionKey = this.generateSessionKey()\n\n\t\tif (this.once && sessionStorage.getItem(this.sessionKey) === 'true') {\n\t\t\t// Skip delay and render immediately if once is set and already rendered\n\t\t\tthis.shadowRoot?.querySelector('slot')?.removeAttribute('hidden')\n\t\t\treturn\n\t\t}\n\n\t\tif (!this.typewriterContainer) {\n\t\t\tconsole.warn('Typewriter container not found.')\n\t\t\treturn\n\t\t}\n\n\t\t// Configure TypeIt options\n\t\tconst typeItOptions: TypeItOptions = {\n\t\t\tspeed: this.speed,\n\t\t\tstartDelay: this.delay,\n\t\t\tcursor: !!this.cursorChar,\n\t\t\tcursorChar: this.cursorChar,\n\t\t\tdeleteSpeed: this.deleteSpeed,\n\t\t\tafterComplete: () => {\n\t\t\t\tif (this.once) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsessionStorage.setItem(this.sessionKey, 'true')\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Error saving to session storage:', error)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Dispatch the custom event\n\t\t\t\tthis.dispatchEvent(new CustomEvent('typeit-complete', { bubbles: true, composed: true }))\n\n\t\t\t\t// Hide the cursor\n\t\t\t\tthis.typewriterContainer.style.setProperty('--ti-cursor-display', 'none')\n\t\t\t},\n\t\t}\n\n\t\t// Initialize TypeIt\n\t\tthis.typeItInstance = new TypeIt(this.typewriterContainer, typeItOptions)\n\n\t\t// Process slotted content as actions\n\t\tconst slottedNodes = this._getSlottedNodes\n\t\tslottedNodes.forEach(node => {\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\t\t// Handle plain text\n\t\t\t\tthis.typeItInstance?.type(node.textContent || '')\n\t\t\t} else if (node instanceof HTMLElement) {\n\t\t\t\t// Handle custom element\n\t\t\t\tthis._processCustomElement(node)\n\t\t\t}\n\t\t})\n\n\t\t// Start the typing animation if autoStart is enabled\n\t\t// use rxjs to detect once we are in the view port\n\t\tintersection$(this.shadowRoot?.host as Element).subscribe(() => {\n\t\t\t// alert('in view')\n\t\t\tthis.typeItInstance?.go()\n\t\t})\n\t\t// Start the typing animation if autoStart is enabled\n\t}\n\n\tprivate generateSessionKey(): string {\n\t\tconst slotContent = this._getSlottedElements.map(el => el.outerHTML).join('')\n\t\treturn this.once ? hashContent(slotContent) : ''\n\t}\n\t/**\n\t * Destroys the current TypeIt instance if it exists.\n\t */\n\tprivate _destroyTypeIt() {\n\t\tif (this.typeItInstance) {\n\t\t\ttry {\n\t\t\t\tthis.typeItInstance.destroy()\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error destroying TypeIt instance:', error)\n\t\t\t}\n\t\t\tthis.typeItInstance = null\n\t\t}\n\t}\n\n\t/**\n\t * Processes a custom element for its typing behavior.\n\t */\n\tprivate _processCustomElement(element: HTMLElement) {\n\t\tconst action = element.getAttribute('action')\n\t\tconst value = element.getAttribute('value')\n\t\tswitch (action) {\n\t\t\tcase 'pause':\n\t\t\t\tthis.typeItInstance?.pause(parseInt(value || '0', 10))\n\t\t\t\tbreak\n\t\t\tcase 'delete':\n\t\t\t\tthis.typeItInstance?.delete(parseInt(value || '0', 10))\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tif (element.tagName === 'P') {\n\t\t\t\t\tthis.typeItInstance.break()\n\t\t\t\t}\n\t\t\t\t// Treat as text if no action is defined\n\t\t\t\tthis.typeItInstance?.type(element.textContent || '')\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t/**\n\t * Renders the component's HTML.\n\t */\n\trender(): TemplateResult {\n\t\treturn html`<div id=\"typewriter\" aria-live=\"polite\"></div>\n\n\t\t\t<div class=\"typewriter\">\n\t\t\t\t<slot\n\t\t\t\t\thidden\n\t\t\t\t\t@slotchange=${() => {\n\t\t\t\t\t\tthis._startTyping()\n\t\t\t\t\t}}\n\t\t\t\t></slot>\n\t\t\t</div> `\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-typewriter': TypewriterElement\n\t}\n}\n"],"names":["isArray","thing","Array","asArray","value","DATA_ATTRIBUTE","CURSOR_CLASS","DEFAULT_STATUSES","started","completed","frozen","destroyed","DEFAULT_OPTIONS","breakLines","cursor","autoPause","autoPauseDelay","animation","frames","map","n","opacity","options","iterations","Infinity","easing","fill","cursorChar","cursorSpeed","deleteSpeed","html","lifeLike","loop","loopDelay","nextStringDelay","speed","startDelay","startDelete","strings","waitUntilVisible","beforeString","afterString","beforeStep","afterStep","afterComplete","PLACEHOLDER_CSS","createElement","el","document","createTextNode","content","appendStyleBlock","styles","id","styleBlock","appendChild","head","calculateDelay","delayArg","randomInRange","range","Math","abs","random","val","toArray","from","expandTextNodes","element","childNodes","forEach","child","nodeValue","c","parentNode","insertBefore","remove","getParsedBody","doc","implementation","createHTMLDocument","body","innerHTML","walkElementNodes","shouldReverse","shouldIncludeCursor","nextNode","querySelector","walker","createTreeWalker","NodeFilter","SHOW_ALL","acceptNode","node","classList","contains","FILTER_ACCEPT","FILTER_REJECT","nodes","originalParent","push","reverse","maybeChunkStringAsHtml","str","asHtml","cleanUpSkipped","index","newIndex","queueItems","cleanUp","i","isNumber","Number","isInteger","countStepsToSelector","selector","cursorPosition","to","isMovingToEnd","RegExp","test","selectorIndex","findIndex","char","t","parentElement","parentMatches","matches","firstChild","isSameNode","length","duplicate","times","beforePaint","cb","Promise","resolve","requestAnimationFrame","async","getAnimationFromElement","getAnimations","find","dataset","tiAnimationId","setCursorAnimation","s","animate","pause","play","execute","queueItem","func","call","fireItem","wait","cursorOptions","instantQueue","tempIndex","futureItem","shouldBeGrouped","delay","shouldPauseCursor","q","effect","getComputedTiming","cancel","oldCurrentTime","currentTime","newAnimation","isInput","handleFunctionalArg","arg","select","all","merge","originalObj","newObj","Object","assign","cursorFontStyles","color","transform","TypeIt","__privateAdd","_L_instances","timeouts","predictedCursorPosition","statuses","firing","opts","queue","flushCallback","unfreeze","is","key","this","buildOptions","newOptions","defaultFrames","defaultOptions","toString","substring","initialItems","add","steps","step","_q","set","Symbol","innerText","buildQueueItem","Boolean","typeable","cursorable","deletable","getQueue","rawValues","values","Map","item","keys","wipe","done","shouldDestroy","delete","get","reset","destroy","getItems","filter","getTypeable","getPendingQueueItems","pending","setUpCursor","typeitId","go","attachCursor","bind","IntersectionObserver","entries","observer2","entry","isIntersecting","unobserve","threshold","observe","fire","shouldRemoveCursor","clearTimeout","removeNode","rebuild","property","string","actionOpts","instant","bookEndQueueItems","charsAsQueueItems","outerHTML","getPace","nodeType","Node","TEXT_NODE","itemsToQueue","movementArg","generateTemporaryOptionQueueItems","numberOfSteps","directionalStep","queueAndReturn","milliseconds","numCharacters","num","typeableQueueItems","rounds","derivedCursorPosition","then","flush","getOptions","getElement","empty","f_fn","elementIsInput","remember","qKey","queueKey","allChars","e","move","printedCharacters","min","max","newCursorPosition","nodeToInsertBefore","prepLoop","w_fn","fireItemWithContext","b_fn","callback","silent","setTimeout","shouldRenderCursor","cursorSelector","computedStyles","getComputedStyle","customProperties","reduce","accumulator","duration","n_fn","l_fn","maybeAppendPause","x_fn","o_fn","updateOptions","s_fn","generateQueue","type","splitItems","q_fn","prependHardcodedStrings","existingMarkup","replace","trim","split","concat","e_fn","className","style","visibility","S_fn","addSplitPause","items","a_fn","originalTarget","character","textContent","target","tagName","cursorNode","y_fn","slice","h_fn","rootElement","nodeParent","u_fn","c_get","v_get","TypewriterElement","$LitElement","css","constructor","super","arguments","autoStart","once","typeItInstance","sessionKey","disconnectedCallback","_destroyTypeIt","_startTyping","generateSessionKey","sessionStorage","getItem","shadowRoot","removeAttribute","typewriterContainer","typeItOptions","setItem","dispatchEvent","CustomEvent","bubbles","composed","setProperty","_getSlottedNodes","HTMLElement","_processCustomElement","intersection$","host","subscribe","slotContent","_getSlottedElements","join","hashContent","action","getAttribute","parseInt","break","render","__decorateClass","prototype","consume","context","delayContext","String","query","queryAssignedNodes","flatten","queryAssignedElements","customElement"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/typewriter.js
CHANGED
package/package.json
CHANGED
|
@@ -3,4 +3,4 @@ export type { NotificationType } from './notification';
|
|
|
3
3
|
export { NotificationAudioService } from './notification-audio';
|
|
4
4
|
export { default as SchmancyNotificationContainer } from './notification-container';
|
|
5
5
|
export type { NotificationItem, NotificationOptions } from './notification-container';
|
|
6
|
-
export { $notify
|
|
6
|
+
export { $notify } from './notification-service';
|
|
@@ -5,6 +5,7 @@ import { NotificationOptions } from './notification-container';
|
|
|
5
5
|
*/
|
|
6
6
|
export declare class NotificationService {
|
|
7
7
|
private static instance;
|
|
8
|
+
private static DEFAULT_OPTIONS;
|
|
8
9
|
private constructor();
|
|
9
10
|
/**
|
|
10
11
|
* Get the singleton instance
|
|
@@ -31,6 +32,14 @@ export declare class NotificationService {
|
|
|
31
32
|
* Show an error notification
|
|
32
33
|
*/
|
|
33
34
|
error(message: string, options?: Partial<Omit<NotificationOptions, 'message' | 'type'>>): string;
|
|
35
|
+
/**
|
|
36
|
+
* Show a notification with a custom duration
|
|
37
|
+
*/
|
|
38
|
+
customDuration(message: string, duration: number, options?: Partial<Omit<NotificationOptions, 'message' | 'duration'>>): string;
|
|
39
|
+
/**
|
|
40
|
+
* Show a persistent notification (won't auto-dismiss)
|
|
41
|
+
*/
|
|
42
|
+
persistent(message: string, options?: Partial<Omit<NotificationOptions, 'message' | 'duration'>>): string;
|
|
34
43
|
}
|
|
35
44
|
/**
|
|
36
45
|
* Global notification utility - provides a quick way to show notifications
|
|
@@ -56,5 +65,16 @@ export declare const $notify: {
|
|
|
56
65
|
* Show an error notification
|
|
57
66
|
*/
|
|
58
67
|
error: (message: string, options?: Partial<Omit<NotificationOptions, "message" | "type">>) => string;
|
|
68
|
+
/**
|
|
69
|
+
* Show a notification with a custom duration
|
|
70
|
+
* @param message The notification message
|
|
71
|
+
* @param duration Duration in milliseconds before auto-dismissing (0 for no auto-dismiss)
|
|
72
|
+
* @param options Additional notification options
|
|
73
|
+
*/
|
|
74
|
+
customDuration: (message: string, duration: number, options?: Partial<Omit<NotificationOptions, "message" | "duration">>) => string;
|
|
75
|
+
/**
|
|
76
|
+
* Show a persistent notification that won't auto-dismiss
|
|
77
|
+
*/
|
|
78
|
+
persistent: (message: string, options?: Partial<Omit<NotificationOptions, "message" | "duration">>) => string;
|
|
59
79
|
};
|
|
60
80
|
export default NotificationService;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"notification-container-DUtK-Voc.cjs","sources":["../src/notification/notification.ts","../src/notification/notification-audio-generator.ts","../src/notification/notification-audio.ts","../src/notification/notification-container.ts"],"sourcesContent":["import { $LitElement } from '@mixins/index'\nimport { color } from '@schmancy/directives'\nimport { SchmancyTheme } from '@schmancy/theme/theme.interface'\nimport { html, PropertyValues } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { styleMap } from 'lit/directives/style-map.js'\nimport style from './notification.scss?inline'\n\nexport type NotificationType = 'info' | 'success' | 'warning' | 'error'\n\n/**\n * @fires close - When notification is closed\n */\n@customElement('sch-notification')\nexport default class SchmancyNotification extends $LitElement(style) {\n\t@property({ type: String }) title = ''\n\t@property({ type: String }) message = ''\n\t@property({ type: String }) type: NotificationType = 'info'\n\t@property({ type: Boolean }) closable = true\n\t@property({ type: Number }) duration = 5000 // 0 means no auto-close\n\t@property({ type: String }) id = `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\t@property({ type: Boolean }) playSound = true\n\n\t@state() private _visible = true\n\t@state() private _progress = 100\n\t@state() private _hovered = false\n\t@state() private _closing = false\n\t@state() private _autoCloseTimer?: number\n\t@state() private _progressTimer?: number\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\tif (this.duration > 0) {\n\t\t\tthis._startAutoCloseTimer()\n\t\t}\n\n\t\tif (this.playSound) {\n\t\t\tthis._playSound()\n\t\t}\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis._clearTimers()\n\t\tsuper.disconnectedCallback()\n\t}\n\n\tupdated(changedProps: PropertyValues) {\n\t\tsuper.updated(changedProps)\n\n\t\tif (changedProps.has('duration') && this.duration > 0) {\n\t\t\tthis._clearTimers()\n\t\t\tthis._startAutoCloseTimer()\n\t\t}\n\t}\n\n\tprivate _startAutoCloseTimer() {\n\t\tif (this.duration <= 0) return\n\n\t\tconst startTime = Date.now()\n\t\tconst endTime = startTime + this.duration\n\n\t\t// Setup the auto-close timer\n\t\tthis._autoCloseTimer = window.setTimeout(() => {\n\t\t\tthis.close()\n\t\t}, this.duration)\n\n\t\t// Setup the progress timer to update every 16ms (60fps)\n\t\tthis._progressTimer = window.setInterval(() => {\n\t\t\tif (this._hovered) return\n\n\t\t\tconst now = Date.now()\n\t\t\tconst remaining = Math.max(0, endTime - now)\n\t\t\tthis._progress = (remaining / this.duration) * 100\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tthis._clearTimers()\n\t\t\t}\n\t\t}, 16)\n\t}\n\n\tprivate _clearTimers() {\n\t\tif (this._autoCloseTimer) {\n\t\t\tclearTimeout(this._autoCloseTimer)\n\t\t\tthis._autoCloseTimer = undefined\n\t\t}\n\n\t\tif (this._progressTimer) {\n\t\t\tclearInterval(this._progressTimer)\n\t\t\tthis._progressTimer = undefined\n\t\t}\n\t}\n\n\tprivate _pauseTimers() {\n\t\tthis._clearTimers()\n\t}\n\n\tprivate _resumeTimers() {\n\t\tif (this.duration > 0) {\n\t\t\t// Calculate remaining time based on progress\n\t\t\tconst remainingTime = (this._progress / 100) * this.duration\n\n\t\t\tif (remainingTime > 0) {\n\t\t\t\tthis._autoCloseTimer = window.setTimeout(() => {\n\t\t\t\t\tthis.close()\n\t\t\t\t}, remainingTime)\n\n\t\t\t\tconst startTime = Date.now()\n\t\t\t\tconst endTime = startTime + remainingTime\n\n\t\t\t\tthis._progressTimer = window.setInterval(() => {\n\t\t\t\t\tif (this._hovered) return\n\n\t\t\t\t\tconst now = Date.now()\n\t\t\t\t\tconst remaining = Math.max(0, endTime - now)\n\t\t\t\t\tthis._progress = (remaining / remainingTime) * 100\n\n\t\t\t\t\tif (remaining <= 0) {\n\t\t\t\t\t\tthis._clearTimers()\n\t\t\t\t\t}\n\t\t\t\t}, 16)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _playSound() {\n\t\t// Dispatch event to play sound through audio service\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('playsound', {\n\t\t\t\tdetail: { type: this.type },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t)\n\t}\n\n\tprivate _handleMouseEnter() {\n\t\tthis._hovered = true\n\t\tthis._pauseTimers()\n\t}\n\n\tprivate _handleMouseLeave() {\n\t\tthis._hovered = false\n\t\tthis._resumeTimers()\n\t}\n\n\tpublic close() {\n\t\tif (this._closing) return\n\n\t\tthis._closing = true\n\t\tthis._clearTimers()\n\n\t\t// Add closing animation\n\t\tthis._visible = false\n\n\t\t// Dispatch close event\n\t\tsetTimeout(() => {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('close', {\n\t\t\t\t\tdetail: { id: this.id },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}, 300) // Match animation duration\n\t}\n\n\trender() {\n\t\tif (!this._visible && this._closing) return html``\n\n\t\tconst typeStyles = this._getTypeStyles()\n\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\tnotification: true,\n\t\t\t\t\tclosing: this._closing,\n\t\t\t\t\t[this.type]: true,\n\t\t\t\t})}\n\t\t\t\trole=\"alert\"\n\t\t\t\tstyle=${styleMap({\n\t\t\t\t\ttransform: this._closing ? 'translateX(120%)' : 'translateX(0)',\n\t\t\t\t\topacity: this._closing ? '0' : '1',\n\t\t\t\t})}\n\t\t\t\t@mouseenter=${this._handleMouseEnter}\n\t\t\t\t@mouseleave=${this._handleMouseLeave}\n\t\t\t>\n\t\t\t\t<div class=\"notification-content\">\n\t\t\t\t\t<div class=\"icon-container\" ${color({ color: typeStyles.iconColor })}>${typeStyles.icon}</div>\n\n\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t${this.title ? html` <div class=\"title\">${this.title}</div> ` : ''}\n\n\t\t\t\t\t\t<div class=\"message\">${this.message}</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t${this.closable\n\t\t\t\t\t\t? html`\n\t\t\t\t\t\t\t\t<button class=\"close-button\" aria-label=\"Close notification\" @click=${this.close}>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n\t\t\t\t\t\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t: ''}\n\t\t\t\t</div>\n\n\t\t\t\t${this.duration > 0\n\t\t\t\t\t? html`\n\t\t\t\t\t\t\t<div class=\"progress-bar-container\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=\"progress-bar\"\n\t\t\t\t\t\t\t\t\tstyle=\"width: ${this._progress}%\"\n\t\t\t\t\t\t\t\t\t${color({ bgColor: typeStyles.progressColor })}\n\t\t\t\t\t\t\t\t></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t: ''}\n\t\t\t</div>\n\t\t`\n\t}\n\n\tprivate _getTypeStyles() {\n\t\tswitch (this.type) {\n\t\t\tcase 'success':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\n\t\t\t\t\t\t\t<polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.success.default,\n\t\t\t\t\tprogressColor: SchmancyTheme.sys.color.success.default,\n\t\t\t\t}\n\t\t\tcase 'warning':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<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>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.tertiary.default,\n\t\t\t\t\tprogressColor: SchmancyTheme.sys.color.tertiary.default,\n\t\t\t\t}\n\t\t\tcase 'error':\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n\t\t\t\t\t\t\t<line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\n\t\t\t\t\t\t\t<line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.error.default,\n\t\t\t\t\tprogressColor: SchmancyTheme.sys.color.error.default,\n\t\t\t\t}\n\t\t\tcase 'info':\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\ticon: html`\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\n\t\t\t\t\t\t\t<line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t\ticonColor: SchmancyTheme.sys.color.primary.default,\n\t\t\t\t\tprogressColor: SchmancyTheme.sys.color.primary.default,\n\t\t\t\t}\n\t\t}\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification': SchmancyNotification\n\t}\n}\n","/**\n * Programmatic sound generator for Schmancy notifications\n * Uses Web Audio API to generate gentle, subtle and soft sounds for each notification type\n */\nexport class NotificationSoundGenerator {\n\tprivate audioContext: AudioContext | null = null\n\n\t/**\n\t * Get or create AudioContext\n\t */\n\tprivate getAudioContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\tconst AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\t\treturn this.audioContext\n\t}\n\n\tpublic playInfoSound(volume = 0.2): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst oscillator = ctx.createOscillator()\n\t\tconst gainNode = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\toscillator.type = 'sine'\n\t\toscillator.frequency.setValueAtTime(392, now) // G4\n\t\toscillator.frequency.exponentialRampToValueAtTime(523.25, now + 0.25) // C5\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 1500\n\n\t\tgainNode.gain.setValueAtTime(0.0001, now)\n\t\tgainNode.gain.exponentialRampToValueAtTime(volume, now + 0.15)\n\t\tgainNode.gain.exponentialRampToValueAtTime(0.0001, now + 0.4)\n\n\t\toscillator.connect(filter).connect(gainNode).connect(ctx.destination)\n\t\toscillator.start(now)\n\t\toscillator.stop(now + 0.45)\n\t}\n\n\tpublic playSuccessSound(volume = 0.2): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst createBell = (freq: number, start: number, duration: number) => {\n\t\t\tconst osc = ctx.createOscillator()\n\t\t\tconst gain = ctx.createGain()\n\t\t\tconst filter = ctx.createBiquadFilter()\n\n\t\t\tosc.type = 'sine'\n\t\t\tosc.frequency.setValueAtTime(freq, now)\n\t\t\tfilter.type = 'lowpass'\n\t\t\tfilter.frequency.value = freq * 4\n\n\t\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\t\tgain.gain.exponentialRampToValueAtTime(volume, now + 0.1)\n\t\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + duration)\n\n\t\t\tosc.connect(filter).connect(gain).connect(ctx.destination)\n\t\t\tosc.start(now + start)\n\t\t\tosc.stop(now + duration)\n\t\t}\n\n\t\tcreateBell(659.25, 0, 0.6) // E5\n\t\tcreateBell(523.25, 0.05, 0.55) // C5\n\t}\n\n\tpublic playWarningSound(volume = 0.25): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst osc1 = ctx.createOscillator()\n\t\tconst osc2 = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\tosc1.type = 'sine'\n\t\tosc2.type = 'sine'\n\t\tosc1.frequency.setValueAtTime(349.23, now) // F4\n\t\tosc2.frequency.setValueAtTime(440, now) // A4\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 1000\n\n\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\tgain.gain.exponentialRampToValueAtTime(volume, now + 0.08)\n\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + 0.5)\n\n\t\tosc1.connect(filter)\n\t\tosc2.connect(filter)\n\t\tfilter.connect(gain).connect(ctx.destination)\n\n\t\tosc1.start(now)\n\t\tosc2.start(now)\n\t\tosc1.stop(now + 0.55)\n\t\tosc2.stop(now + 0.55)\n\t}\n\n\tpublic playErrorSound(volume = 0.25): void {\n\t\tconst ctx = this.getAudioContext()\n\t\tconst now = ctx.currentTime\n\n\t\tconst osc = ctx.createOscillator()\n\t\tconst gain = ctx.createGain()\n\t\tconst filter = ctx.createBiquadFilter()\n\n\t\tosc.type = 'triangle'\n\t\tosc.frequency.setValueAtTime(220, now) // A3\n\t\tosc.frequency.exponentialRampToValueAtTime(1760, now + 0.3) // A6\n\n\t\tfilter.type = 'lowpass'\n\t\tfilter.frequency.value = 800\n\t\tfilter.Q.value = 0.5\n\n\t\tgain.gain.setValueAtTime(0.0001, now)\n\t\tgain.gain.exponentialRampToValueAtTime(volume * 0.8, now + 0.1)\n\t\tgain.gain.exponentialRampToValueAtTime(0.0001, now + 0.7)\n\n\t\tosc.connect(filter).connect(gain).connect(ctx.destination)\n\t\tosc.start(now)\n\t\tosc.stop(now + 0.75)\n\t}\n\n\t/**\n\t * Generate audio blob files for all notification sounds\n\t * Returns a Promise that resolves with URLs to the generated audio files\n\t */\n\tpublic async generateAudioFiles(volume = 0.25): Promise<Record<string, string>> {\n\t\t// Create offline audio context for rendering\n\t\tconst sampleRate = 44100\n\t\tconst duration = 1 // 1 second duration to capture the full sound\n\n\t\tconst audioUrls: Record<string, string> = {}\n\n\t\t// Generate info sound\n\t\taudioUrls.info = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create oscillator for main tone\n\t\t\t\tconst oscillator = ctx.createOscillator()\n\t\t\t\toscillator.type = 'sine'\n\t\t\t\toscillator.frequency.setValueAtTime(320, 0)\n\t\t\t\toscillator.frequency.exponentialRampToValueAtTime(520, 0.3)\n\n\t\t\t\t// Create gain node for volume control with softer attack/release\n\t\t\t\tconst gainNode = ctx.createGain()\n\t\t\t\tgainNode.gain.setValueAtTime(0, 0)\n\t\t\t\tgainNode.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgainNode.gain.linearRampToValueAtTime(0, 0.5)\n\n\t\t\t\t// Connect and play\n\t\t\t\toscillator.connect(gainNode)\n\t\t\t\tgainNode.connect(ctx.destination)\n\t\t\t\toscillator.start()\n\t\t\t\toscillator.stop(0.5)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate success sound\n\t\taudioUrls.success = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create main oscillator (higher note)\n\t\t\t\tconst osc1 = ctx.createOscillator()\n\t\t\t\tosc1.type = 'sine'\n\t\t\t\tosc1.frequency.setValueAtTime(660, 0)\n\n\t\t\t\t// Create secondary oscillator (lower note)\n\t\t\t\tconst osc2 = ctx.createOscillator()\n\t\t\t\tosc2.type = 'sine'\n\t\t\t\tosc2.frequency.setValueAtTime(440, 0)\n\n\t\t\t\t// Create gain nodes with softer envelope\n\t\t\t\tconst gain1 = ctx.createGain()\n\t\t\t\tgain1.gain.setValueAtTime(0, 0)\n\t\t\t\tgain1.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain1.gain.linearRampToValueAtTime(0, 0.5)\n\n\t\t\t\tconst gain2 = ctx.createGain()\n\t\t\t\tgain2.gain.setValueAtTime(0, 0)\n\t\t\t\tgain2.gain.linearRampToValueAtTime(volume * 0.6, 0.15)\n\t\t\t\tgain2.gain.linearRampToValueAtTime(0, 0.7)\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc1.connect(gain1)\n\t\t\t\tgain1.connect(ctx.destination)\n\n\t\t\t\tosc2.connect(gain2)\n\t\t\t\tgain2.connect(ctx.destination)\n\n\t\t\t\tosc1.start()\n\t\t\t\tosc2.start(0.15)\n\n\t\t\t\tosc1.stop(0.5)\n\t\t\t\tosc2.stop(0.7)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate warning sound\n\t\taudioUrls.warning = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create oscillators for a two-tone warning\n\t\t\t\tconst osc1 = ctx.createOscillator()\n\t\t\t\tosc1.type = 'sine'\n\t\t\t\tosc1.frequency.setValueAtTime(293.66, 0)\n\n\t\t\t\tconst osc2 = ctx.createOscillator()\n\t\t\t\tosc2.type = 'sine'\n\t\t\t\tosc2.frequency.setValueAtTime(349.23, 0)\n\n\t\t\t\t// Create gain node with softer envelope\n\t\t\t\tconst gain = ctx.createGain()\n\t\t\t\tgain.gain.setValueAtTime(0, 0)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.6, 0.2)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.8, 0.3)\n\t\t\t\tgain.gain.linearRampToValueAtTime(0, 0.6)\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc1.connect(gain)\n\t\t\t\tosc2.connect(gain)\n\t\t\t\tgain.connect(ctx.destination)\n\n\t\t\t\tosc1.start()\n\t\t\t\tosc2.start()\n\n\t\t\t\tosc1.stop(0.6)\n\t\t\t\tosc2.stop(0.6)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\t// Generate error sound\n\t\taudioUrls.error = await this.generateAudioFile(\n\t\t\tasync ctx => {\n\t\t\t\t// Create main oscillator\n\t\t\t\tconst osc = ctx.createOscillator()\n\t\t\t\tosc.type = 'sine'\n\t\t\t\tosc.frequency.setValueAtTime(196, 0)\n\n\t\t\t\t// Create gain node with softer envelope\n\t\t\t\tconst gain = ctx.createGain()\n\t\t\t\tgain.gain.setValueAtTime(0, 0)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume, 0.1)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.4, 0.2)\n\t\t\t\tgain.gain.linearRampToValueAtTime(volume * 0.6, 0.3)\n\t\t\t\tgain.gain.linearRampToValueAtTime(0, 0.7)\n\n\t\t\t\t// Additional filter to make it even softer\n\t\t\t\tconst filter = ctx.createBiquadFilter()\n\t\t\t\tfilter.type = 'lowpass'\n\t\t\t\tfilter.frequency.value = 600\n\t\t\t\tfilter.Q.value = 0.7\n\n\t\t\t\t// Connect and play\n\t\t\t\tosc.connect(filter)\n\t\t\t\tfilter.connect(gain)\n\t\t\t\tgain.connect(ctx.destination)\n\n\t\t\t\tosc.start()\n\t\t\t\tosc.stop(0.7)\n\t\t\t},\n\t\t\tsampleRate,\n\t\t\tduration,\n\t\t)\n\n\t\treturn audioUrls\n\t}\n\n\t/**\n\t * Generate an audio file from a sound generation function\n\t * @param renderFunction Function that creates the sound in the provided context\n\t * @param sampleRate Sample rate for the audio\n\t * @param duration Duration in seconds\n\t * @returns Promise that resolves with the URL to the generated audio file\n\t */\n\tprivate async generateAudioFile(\n\t\trenderFunction: (ctx: OfflineAudioContext) => Promise<void>,\n\t\tsampleRate = 44100,\n\t\tduration = 1,\n\t): Promise<string> {\n\t\t// Create offline context\n\t\tconst offlineCtx = new OfflineAudioContext(2, sampleRate * duration, sampleRate)\n\n\t\t// Render the sound\n\t\tawait renderFunction(offlineCtx)\n\n\t\t// Render the audio\n\t\tconst audioBuffer = await offlineCtx.startRendering()\n\n\t\t// Convert to WAV format\n\t\tconst wavBlob = this.audioBufferToWav(audioBuffer)\n\n\t\t// Create URL\n\t\treturn URL.createObjectURL(wavBlob)\n\t}\n\n\t/**\n\t * Convert AudioBuffer to WAV format\n\t * Based on https://github.com/Jam3/audiobuffer-to-wav\n\t */\n\tprivate audioBufferToWav(buffer: AudioBuffer): Blob {\n\t\tconst numChannels = buffer.numberOfChannels\n\t\tconst sampleRate = buffer.sampleRate\n\t\tconst format = 1 // PCM\n\t\tconst bitDepth = 16\n\n\t\tconst bytesPerSample = bitDepth / 8\n\t\tconst blockAlign = numChannels * bytesPerSample\n\n\t\tconst samples = this.getAudioSamples(buffer, bitDepth)\n\t\tconst dataLength = samples.length * bytesPerSample\n\n\t\t// Create WAV header\n\t\tconst headerLength = 44\n\t\tconst wavBuffer = new ArrayBuffer(headerLength + dataLength)\n\t\tconst view = new DataView(wavBuffer)\n\n\t\t// RIFF identifier\n\t\tthis.writeString(view, 0, 'RIFF')\n\t\t// File length minus RIFF identifier and file size\n\t\tview.setUint32(4, 36 + dataLength, true)\n\t\t// RIFF type\n\t\tthis.writeString(view, 8, 'WAVE')\n\t\t// Format chunk identifier\n\t\tthis.writeString(view, 12, 'fmt ')\n\t\t// Format chunk length\n\t\tview.setUint32(16, 16, true)\n\t\t// Sample format (PCM)\n\t\tview.setUint16(20, format, true)\n\t\t// Channel count\n\t\tview.setUint16(22, numChannels, true)\n\t\t// Sample rate\n\t\tview.setUint32(24, sampleRate, true)\n\t\t// Byte rate (sample rate * block align)\n\t\tview.setUint32(28, sampleRate * blockAlign, true)\n\t\t// Block align (channel count * bytes per sample)\n\t\tview.setUint16(32, blockAlign, true)\n\t\t// Bits per sample\n\t\tview.setUint16(34, bitDepth, true)\n\t\t// Data chunk identifier\n\t\tthis.writeString(view, 36, 'data')\n\t\t// Data chunk length\n\t\tview.setUint32(40, dataLength, true)\n\n\t\t// Write the audio data\n\t\tif (bitDepth === 16) {\n\t\t\tthis.writeInt16Samples(view, headerLength, samples)\n\t\t} else {\n\t\t\tthrow new Error('Only 16-bit audio is supported')\n\t\t}\n\n\t\treturn new Blob([wavBuffer], { type: 'audio/wav' })\n\t}\n\n\t/**\n\t * Get audio samples from an AudioBuffer\n\t */\n\tprivate getAudioSamples(buffer: AudioBuffer, bitDepth: number): number[] {\n\t\tconst numChannels = buffer.numberOfChannels\n\t\tconst length = buffer.length\n\t\tconst samples: number[] = []\n\t\tconst scale = bitDepth === 16 ? 32768 : 128\n\n\t\t// Get samples from all channels\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tfor (let channel = 0; channel < numChannels; channel++) {\n\t\t\t\tconst sample = buffer.getChannelData(channel)[i]\n\t\t\t\t// Convert float32 to int16 or int8\n\t\t\t\tconst intSample = Math.max(-1, Math.min(1, sample))\n\t\t\t\tsamples.push(intSample * scale)\n\t\t\t}\n\t\t}\n\n\t\treturn samples\n\t}\n\n\t/**\n\t * Write 16-bit samples to a DataView\n\t */\n\tprivate writeInt16Samples(view: DataView, offset: number, samples: number[]): void {\n\t\tfor (let i = 0; i < samples.length; i++) {\n\t\t\tview.setInt16(offset + i * 2, samples[i], true)\n\t\t}\n\t}\n\n\t/**\n\t * Write a string to a DataView\n\t */\n\tprivate writeString(view: DataView, offset: number, string: string): void {\n\t\tfor (let i = 0; i < string.length; i++) {\n\t\t\tview.setUint8(offset + i, string.charCodeAt(i))\n\t\t}\n\t}\n}\n","import { NotificationType } from './notification'\nimport { NotificationSoundGenerator } from './notification-audio-generator'\n\n/**\n * Audio service for playing notification sounds.\n * Uses Web Audio API with fallback to HTML5 Audio.\n */\nexport class NotificationAudioService {\n\tprivate audioContext: AudioContext | null = null\n\tprivate soundBuffers: Map<NotificationType, AudioBuffer> = new Map()\n\tprivate volume: number = 0.5\n\tprivate muted: boolean = false\n\tprivate soundGenerator = new NotificationSoundGenerator()\n\n\t// Default sound URLs (will be generated programmatically as fallback)\n\tprivate soundUrls: Record<NotificationType, string> = {\n\t\tinfo: '/assets/sounds/notification-info.mp3',\n\t\tsuccess: '/assets/sounds/notification-success.mp3',\n\t\twarning: '/assets/sounds/notification-warning.mp3',\n\t\terror: '/assets/sounds/notification-error.mp3',\n\t}\n\n\tconstructor() {\n\t\t// Initialize audio context when first needed\n\t\tthis.initializeAudioFiles()\n\t}\n\n\t/**\n\t * Initialize audio files - generate programmatically if needed\n\t */\n\tprivate async initializeAudioFiles(): Promise<void> {\n\t\ttry {\n\t\t\t// Try to load from default URLs\n\t\t\tawait this.preloadSounds()\n\t\t} catch (err) {\n\t\t\tconsole.log('Generating programmatic notification sounds')\n\n\t\t\t// If loading fails, generate programmatically\n\t\t\ttry {\n\t\t\t\tconst generatedUrls = await this.soundGenerator.generateAudioFiles(this.volume)\n\t\t\t\tthis.soundUrls = generatedUrls\n\t\t\t} catch (genErr) {\n\t\t\t\tconsole.warn('Failed to generate notification sounds:', genErr)\n\t\t\t\t// Will fall back to direct playback when needed\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Lazy-initialize the audio context\n\t */\n\tprivate getAudioContext(): AudioContext {\n\t\tif (!this.audioContext) {\n\t\t\t// Use AudioContext with webkit prefix fallback for Safari\n\t\t\tconst AudioContextClass = window.AudioContext || (window as any).webkitAudioContext\n\t\t\tthis.audioContext = new AudioContextClass()\n\t\t}\n\n\t\treturn this.audioContext\n\t}\n\n\t/**\n\t * Preload all notification sounds\n\t */\n\tprivate async preloadSounds(): Promise<void> {\n\t\tconst types: NotificationType[] = ['info', 'success', 'warning', 'error']\n\n\t\tfor (const type of types) {\n\t\t\ttry {\n\t\t\t\tconst buffer = await this.loadSound(type)\n\t\t\t\tthis.soundBuffers.set(type, buffer)\n\t\t\t} catch (err) {\n\t\t\t\tconsole.warn(`Failed to preload ${type} sound:`, err)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Load a sound file and decode it\n\t */\n\tprivate async loadSound(type: NotificationType): Promise<AudioBuffer> {\n\t\tconst url = this.soundUrls[type]\n\t\tconst response = await fetch(url)\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to load sound from ${url}: ${response.statusText}`)\n\t\t}\n\n\t\tconst arrayBuffer = await response.arrayBuffer()\n\t\treturn await this.getAudioContext().decodeAudioData(arrayBuffer)\n\t}\n\n\t/**\n\t * Play a notification sound\n\t */\n\tpublic async playSound(type: NotificationType): Promise<void> {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\t// Try to use Web Audio API first\n\t\t\tconst context = this.getAudioContext()\n\n\t\t\t// Ensure audio context is resumed (needed due to autoplay policy)\n\t\t\tif (context.state === 'suspended') {\n\t\t\t\tawait context.resume()\n\t\t\t}\n\n\t\t\t// Try to use programmatically generated sound first\n\t\t\tif (this.soundUrls[type].startsWith('blob:')) {\n\t\t\t\tthis.playFallbackSound(type)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Load sound if not already cached\n\t\t\tif (!this.soundBuffers.has(type)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst buffer = await this.loadSound(type)\n\t\t\t\t\tthis.soundBuffers.set(type, buffer)\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// Fall back to direct generator\n\t\t\t\t\tthis.playDirectGeneratedSound(type)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst buffer = this.soundBuffers.get(type)\n\t\t\tif (!buffer) {\n\t\t\t\tthrow new Error(`Sound buffer for ${type} not available`)\n\t\t\t}\n\n\t\t\t// Create source and gain nodes\n\t\t\tconst source = context.createBufferSource()\n\t\t\tsource.buffer = buffer\n\n\t\t\tconst gainNode = context.createGain()\n\t\t\tgainNode.gain.value = this.volume\n\n\t\t\t// Connect and play\n\t\t\tsource.connect(gainNode)\n\t\t\tgainNode.connect(context.destination)\n\t\t\tsource.start(0)\n\t\t} catch (err) {\n\t\t\tconsole.warn(`Web Audio API buffer playback failed, trying direct generation:`, err)\n\t\t\tthis.playDirectGeneratedSound(type)\n\t\t}\n\t}\n\n\t/**\n\t * Play a directly generated sound when other methods fail\n\t */\n\tprivate playDirectGeneratedSound(type: NotificationType): void {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\tswitch (type) {\n\t\t\t\tcase 'info':\n\t\t\t\t\tthis.soundGenerator.playInfoSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'success':\n\t\t\t\t\tthis.soundGenerator.playSuccessSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'warning':\n\t\t\t\t\tthis.soundGenerator.playWarningSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t\tcase 'error':\n\t\t\t\t\tthis.soundGenerator.playErrorSound(this.volume)\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error(`Failed to play generated sound for ${type}:`, err)\n\t\t}\n\t}\n\n\t/**\n\t * Play sound using HTML5 Audio as a fallback\n\t */\n\tprivate playFallbackSound(type: NotificationType): void {\n\t\tif (this.muted) return\n\n\t\ttry {\n\t\t\tconst audio = new Audio(this.soundUrls[type])\n\t\t\taudio.volume = this.volume\n\n\t\t\t// Add event listener to clean up after playback\n\t\t\taudio.addEventListener('ended', () => {\n\t\t\t\taudio.remove()\n\t\t\t})\n\n\t\t\taudio.play().catch(err => {\n\t\t\t\tconsole.error(`Failed to play fallback sound for ${type}:`, err)\n\t\t\t\tthis.playDirectGeneratedSound(type)\n\t\t\t})\n\t\t} catch (err) {\n\t\t\tconsole.error('HTML5 Audio fallback failed:', err)\n\t\t\tthis.playDirectGeneratedSound(type)\n\t\t}\n\t}\n\n\t/**\n\t * Set volume for notification sounds (0.0 to 1.0)\n\t */\n\tpublic setVolume(volume: number): void {\n\t\tthis.volume = Math.max(0, Math.min(1, volume))\n\t}\n\n\t/**\n\t * Get current volume level\n\t */\n\tpublic getVolume(): number {\n\t\treturn this.volume\n\t}\n\n\t/**\n\t * Mute notification sounds\n\t */\n\tpublic mute(): void {\n\t\tthis.muted = true\n\t}\n\n\t/**\n\t * Unmute notification sounds\n\t */\n\tpublic unmute(): void {\n\t\tthis.muted = false\n\t}\n\n\t/**\n\t * Check if notification sounds are muted\n\t */\n\tpublic isMuted(): boolean {\n\t\treturn this.muted\n\t}\n\n\t/**\n\t * Set custom sound URL for a notification type\n\t */\n\tpublic setSoundUrl(type: NotificationType, url: string): void {\n\t\tthis.soundUrls[type] = url\n\n\t\t// Clear cached buffer to force reload\n\t\tthis.soundBuffers.delete(type)\n\t}\n\n\t/**\n\t * Get the current sound URL for a notification type\n\t */\n\tpublic getSoundUrl(type: NotificationType): string {\n\t\treturn this.soundUrls[type]\n\t}\n}\n","import { $LitElement } from '@mixins/index'\nimport { html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { fromEvent, takeUntil } from 'rxjs'\nimport { NotificationType } from './notification'\nimport { NotificationAudioService } from './notification-audio'\nimport style from './notification-container.scss?inline'\n\nexport interface NotificationItem {\n\tid: string\n\ttitle: string\n\tmessage: string\n\ttype: NotificationType\n\tduration: number\n\tclosable: boolean\n\tplaySound: boolean\n}\n\nexport interface NotificationOptions {\n\tid?: string\n\ttitle?: string\n\tmessage: string\n\ttype?: NotificationType\n\tduration?: number\n\tclosable?: boolean\n\tplaySound?: boolean\n}\n\n/**\n * Container component for displaying stacked notifications.\n *\n * @element sch-notification-container\n */\n@customElement('sch-notification-container')\nexport default class SchmancyNotificationContainer extends $LitElement(style) {\n\t@property({ type: String }) position:\n\t\t| 'top-right'\n\t\t| 'top-left'\n\t\t| 'bottom-right'\n\t\t| 'bottom-left'\n\t\t| 'top-center'\n\t\t| 'bottom-center' = 'top-right'\n\t@property({ type: Number }) maxVisibleNotifications = 5\n\t@property({ type: Boolean }) playSound = false\n\t@property({ type: Number }) audioVolume = 0.5\n\n\t@state() private _notifications: NotificationItem[] = []\n\n\t// Audio service\n\tprivate _audioService = new NotificationAudioService()\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback()\n\n\t\t// Set audio volume\n\t\tthis._audioService.setVolume(this.audioVolume)\n\n\t\t// Listen for notification events\n\t\tfromEvent<CustomEvent<NotificationOptions>>(window, 'schmancy-notification')\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe(event => {\n\t\t\t\tthis.addNotification(event.detail)\n\t\t\t})\n\n\t\t// Listen for play sound events from child notifications\n\t\tthis.addEventListener('playsound', ((event: CustomEvent) => {\n\t\t\tif (this.playSound) {\n\t\t\t\tthis._audioService.playSound(event.detail.type)\n\t\t\t}\n\t\t}) as EventListener)\n\t}\n\n\t// Public API to add notifications\n\tpublic addNotification(options: NotificationOptions): string {\n\t\tconst id = options.id || `notification-${Date.now()}-${Math.floor(Math.random() * 10000)}`\n\n\t\tconst notification: NotificationItem = {\n\t\t\tid,\n\t\t\ttitle: options.title || '',\n\t\t\tmessage: options.message,\n\t\t\ttype: options.type || 'info',\n\t\t\tduration: options.duration !== undefined ? options.duration : 750,\n\t\t\tclosable: options.closable !== undefined ? options.closable : true,\n\t\t\tplaySound: options.playSound !== undefined ? options.playSound : this.playSound,\n\t\t}\n\n\t\t// Add new notification (top for top-* positions, bottom for bottom-* positions)\n\t\tif (this.position.startsWith('top')) {\n\t\t\tthis._notifications = [...this._notifications, notification]\n\t\t} else {\n\t\t\tthis._notifications = [notification, ...this._notifications]\n\t\t}\n\n\t\t// Enforce max visible notifications\n\t\tif (this._notifications.length > this.maxVisibleNotifications) {\n\t\t\tthis._notifications = this._notifications.slice(-this.maxVisibleNotifications)\n\t\t}\n\n\t\t// Play sound if enabled\n\t\tif (notification.playSound) {\n\t\t\tthis._audioService.playSound(notification.type)\n\t\t}\n\n\t\treturn id\n\t}\n\n\tpublic removeNotification(id: string) {\n\t\tthis._notifications = this._notifications.filter(n => n.id !== id)\n\t}\n\n\tprivate _handleClose(e: CustomEvent) {\n\t\tconst id = e.detail.id\n\t\tthis.removeNotification(id)\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<div\n\t\t\t\tclass=${classMap({\n\t\t\t\t\t'notification-container': true,\n\t\t\t\t\t[this.position]: true,\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t${repeat(\n\t\t\t\t\tthis._notifications,\n\t\t\t\t\tnotification => notification.id,\n\t\t\t\t\tnotification => html`\n <sch-notification\n .id=${notification.id}\n .title=${notification.title}\n .message=${notification.message}\n .type=${notification.type}\n .duration=${notification.duration}\n ?closable=${notification.closable}\n ?playSound=${false} /* We already played the sound on add */\n @close=${this._handleClose}\n ></sch-notification>\n `,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'sch-notification-container': SchmancyNotificationContainer\n\t}\n}\n"],"names":["SchmancyNotification","$LitElement","constructor","super","arguments","this","title","message","type","closable","duration","id","Date","now","Math","floor","random","playSound","_visible","_progress","_hovered","_closing","connectedCallback","_startAutoCloseTimer","_playSound","_clearTimers","disconnectedCallback","changedProps","updated","has","endTime","_autoCloseTimer","window","setTimeout","close","_progressTimer","setInterval","remaining","max","clearTimeout","clearInterval","remainingTime","dispatchEvent","CustomEvent","detail","bubbles","composed","_pauseTimers","_resumeTimers","render","html","typeStyles","_getTypeStyles","classMap","notification","closing","styleMap","transform","opacity","_handleMouseEnter","_handleMouseLeave","color","iconColor","icon","bgColor","progressColor","SchmancyTheme","sys","success","default","tertiary","error","primary","__decorateClass","property","String","prototype","Boolean","Number","state","customElement","NotificationSoundGenerator","audioContext","getAudioContext","AudioContextClass","AudioContext","webkitAudioContext","volume","ctx","currentTime","oscillator","createOscillator","gainNode","createGain","filter","createBiquadFilter","frequency","setValueAtTime","exponentialRampToValueAtTime","value","gain","connect","destination","start","stop","createBell","freq","osc","osc1","osc2","Q","generateAudioFiles","audioUrls","info","generateAudioFile","async","linearRampToValueAtTime","sampleRate","gain1","gain2","warning","renderFunction","offlineCtx","OfflineAudioContext","audioBuffer","startRendering","wavBlob","audioBufferToWav","URL","createObjectURL","buffer","numChannels","numberOfChannels","blockAlign","bitDepth","samples","getAudioSamples","dataLength","length","wavBuffer","ArrayBuffer","view","DataView","writeString","setUint32","setUint16","writeInt16Samples","Blob","scale","i","channel","sample","getChannelData","intSample","min","push","offset","setInt16","string","setUint8","charCodeAt","NotificationAudioService","soundBuffers","Map","muted","soundGenerator","soundUrls","initializeAudioFiles","preloadSounds","err","generatedUrls","genErr","types","loadSound","set","url","response","fetch","ok","Error","statusText","arrayBuffer","decodeAudioData","context","resume","startsWith","playFallbackSound","playDirectGeneratedSound","get","source","createBufferSource","playInfoSound","playSuccessSound","playWarningSound","playErrorSound","audio","Audio","addEventListener","remove","play","catch","mute","isMuted","delete","SchmancyNotificationContainer","position","maxVisibleNotifications","audioVolume","_notifications","_audioService","setVolume","fromEvent","pipe","takeUntil","disconnecting","subscribe","event","addNotification","options","slice","n","e","removeNotification","repeat","_handleClose"],"mappings":"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"}
|