// ==UserScript== // @name Cotrans Manga/Image Translator (Regular Edition) // @name:zh-CN Cotrans 漫画/图片翻译器 (常规版) // @namespace https://cotrans.touhou.ai/userscript/#regular // @version 0.8.0-bata.8 // @description (WIP) Translate texts in images on Pixiv, Twitter // @description:zh-CN (WIP) 一键翻译图片内文字,支持 Pixiv、Twitter // @author QiroNT // @license GPL-3.0 // @contributionURL https://ko-fi.com/voilelabs // @supportURL https://discord.gg/975FRV8ca6 // @source https://cotrans.touhou.ai/ // @include http*://www.pixiv.net/* // @match http://www.pixiv.net/ // @include http*://twitter.com/* // @match http://twitter.com/ // @connect pixiv.net // @connect pximg.net // @connect twitter.com // @connect twimg.com // @connect api.cotrans.touhou.ai // @connect cotrans-r2.moe.ci // @connect * // @grant GM.xmlHttpRequest // @grant GM_xmlhttpRequest // @grant GM.setValue // @grant GM_setValue // @grant GM.getValue // @grant GM_getValue // @grant GM.deleteValue // @grant GM_deleteValue // @grant GM.addValueChangeListener // @grant GM_addValueChangeListener // @grant GM.removeValueChangeListener // @grant GM_removeValueChangeListener // @grant window.onurlchange // @run-at document-idle // @downloadURL none // ==/UserScript== /* eslint-disable no-undef, unused-imports/no-unused-vars */ const VERSION = '0.8.0-bata.8' const EDITION = 'regular' let GMP { // polyfill functions const GMPFunctionMap = { xmlHttpRequest: typeof GM_xmlhttpRequest !== 'undefined' ? GM_xmlhttpRequest : undefined, setValue: typeof GM_setValue !== 'undefined' ? GM_setValue : undefined, getValue: typeof GM_getValue !== 'undefined' ? GM_getValue : undefined, deleteValue: typeof GM_deleteValue !== 'undefined' ? GM_deleteValue : undefined, addValueChangeListener: typeof GM_addValueChangeListener !== 'undefined' ? GM_addValueChangeListener : undefined, removeValueChangeListener: typeof GM_removeValueChangeListener !== 'undefined' ? GM_removeValueChangeListener : undefined, } const xmlHttpRequest = GM.xmlHttpRequest.bind(GM) || GMPFunctionMap.xmlHttpRequest GMP = new Proxy(GM, { get(target, prop) { if (prop === 'xmlHttpRequest') { return (context) => { return new Promise((resolve, reject) => { xmlHttpRequest({ ...context, onload(event) { context.onload?.() resolve(event) }, onerror(event) { context.onerror?.() reject(event) }, }) }) } } if (prop in target) { const v = target[prop] return typeof v === 'function' ? v.bind(target) : v } if (prop in GMPFunctionMap && typeof GMPFunctionMap[prop] === 'function') return GMPFunctionMap[prop] console.error(`[Cotrans Manga Translator] GM.${prop} isn't supported in your userscript engine and it's required by this script. This may lead to unexpected behavior.`) }, }) } (function () { 'use strict'; var i=new Map([["align-self","-ms-grid-row-align"],["color-adjust","-webkit-print-color-adjust"],["column-gap","grid-column-gap"],["forced-color-adjust","-ms-high-contrast-adjust"],["gap","grid-gap"],["grid-template-columns","-ms-grid-columns"],["grid-template-rows","-ms-grid-rows"],["justify-self","-ms-grid-column-align"],["margin-inline-end","-webkit-margin-end"],["margin-inline-start","-webkit-margin-start"],["mask-border","-webkit-mask-box-image"],["mask-border-outset","-webkit-mask-box-image-outset"],["mask-border-slice","-webkit-mask-box-image-slice"],["mask-border-source","-webkit-mask-box-image-source"],["mask-border-repeat","-webkit-mask-box-image-repeat"],["mask-border-width","-webkit-mask-box-image-width"],["overflow-wrap","word-wrap"],["padding-inline-end","-webkit-padding-end"],["padding-inline-start","-webkit-padding-start"],["print-color-adjust","color-adjust"],["row-gap","grid-row-gap"],["scroll-margin-bottom","scroll-snap-margin-bottom"],["scroll-margin-left","scroll-snap-margin-left"],["scroll-margin-right","scroll-snap-margin-right"],["scroll-margin-top","scroll-snap-margin-top"],["scroll-margin","scroll-snap-margin"],["text-combine-upright","-ms-text-combine-horizontal"]]);function r(r){return i.get(r)}function a(i){var r=/^(?:(text-(?:decoration$|e|or|si)|back(?:ground-cl|d|f)|box-d|mask(?:$|-[ispro]|-cl)|pr|hyphena|flex-d)|(tab-|column(?!-s)|text-align-l)|(ap)|u|hy)/i.exec(i);return r?r[1]?1:r[2]?2:r[3]?3:5:0}function t$1(i,r){var a=/^(?:(pos)|(cli)|(background-i)|(flex(?:$|-b)|(?:max-|min-)?(?:block-s|inl|he|widt))|dis)/i.exec(i);return a?a[1]?/^sti/i.test(r)?1:0:a[2]?/^pat/i.test(r)?1:0:a[3]?/^image-/i.test(r)?1:0:a[4]?"-"===r[3]?2:0:/^(?:inline-)?grid$/i.test(r)?4:0:0} // src/internal/util.ts var includes = (value, search) => !!~value.indexOf(search); var join = (parts, separator = "-") => parts.join(separator); var joinTruthy = (parts, separator) => join(parts.filter(Boolean), separator); var tail = (array, startIndex = 1) => array.slice(startIndex); var identity = value => value; var noop = () => {}; var capitalize = value => value[0].toUpperCase() + tail(value); var hyphenate = value => value.replace(/[A-Z]/g, "-$&").toLowerCase(); var evalThunk = (value, context) => { while (typeof value == "function") { value = value(context); } return value; }; var ensureMaxSize = (map, max) => { if (map.size > max) { map.delete(map.keys().next().value); } }; var isCSSProperty = (key, value) => !includes("@:&", key[0]) && (includes("rg", (typeof value)[5]) || Array.isArray(value)); var merge = (target, source, context) => source ? Object.keys(source).reduce((target2, key) => { const value = evalThunk(source[key], context); if (isCSSProperty(key, value)) { target2[hyphenate(key)] = value; } else { target2[key] = key[0] == "@" && includes("figa", key[1]) ? (target2[key] || []).concat(value) : merge(target2[key] || {}, value, context); } return target2; }, target) : target; var escape = typeof CSS !== "undefined" && CSS.escape || (className => className.replace(/[!"'`*+.,;:\\/<=>?@#$%&^|~()[\]{}]/g, "\\$&").replace(/^\d/, "\\3$& ")); var buildMediaQuery = screen => { if (!Array.isArray(screen)) { screen = [screen]; } return "@media " + join(screen.map(screen2 => { if (typeof screen2 == "string") { screen2 = { min: screen2 }; } return screen2.raw || join(Object.keys(screen2).map(feature => `(${feature}-width:${screen2[feature]})`), " and "); }), ","); }; var cyrb32 = value => { for (var h = 9, index = value.length; index--;) { h = Math.imul(h ^ value.charCodeAt(index), 1597334677); } return "tw-" + ((h ^ h >>> 9) >>> 0).toString(36); }; var sortedInsertionIndex = (array, element) => { for (var low = 0, high = array.length; low < high;) { const pivot = high + low >> 1; if (array[pivot] <= element) { low = pivot + 1; } else { high = pivot; } } return high; }; // src/twind/parse.ts var groupings; var rules; var startGrouping = (value = "") => { groupings.push(value); return ""; }; var endGrouping = isWhitespace => { groupings.length = Math.max(groupings.lastIndexOf("") + ~~isWhitespace, 0); }; var onlyPrefixes = s => s && !includes("!:", s[0]); var onlyVariants = s => s[0] == ":"; var addRule = (directive2, negate) => { rules.push({ v: groupings.filter(onlyVariants), d: directive2, n: negate, i: includes(groupings, "!"), $: "" }); }; var saveRule = buffer => { const negate = buffer[0] == "-"; if (negate) { buffer = tail(buffer); } const prefix = join(groupings.filter(onlyPrefixes)); addRule(buffer == "&" ? prefix : (prefix && prefix + "-") + buffer, negate); return ""; }; var parseString = (token, isVariant) => { let buffer = ""; for (let char, dynamic = false, position2 = 0; char = token[position2++];) { if (dynamic || char == "[") { buffer += char; dynamic = char != "]"; continue; } switch (char) { case ":": buffer = buffer && startGrouping(":" + (token[position2] == char ? token[position2++] : "") + buffer); break; case "(": buffer = buffer && startGrouping(buffer); startGrouping(); break; case "!": startGrouping(char); break; case ")": case " ": case " ": case "\n": case "\r": buffer = buffer && saveRule(buffer); endGrouping(char !== ")"); break; default: buffer += char; } } if (buffer) { if (isVariant) { startGrouping(":" + buffer); } else if (buffer.slice(-1) == "-") { startGrouping(buffer.slice(0, -1)); } else { saveRule(buffer); } } }; var parseGroupedToken = token => { startGrouping(); parseToken(token); endGrouping(); }; var parseGroup = (key, token) => { if (token) { startGrouping(); const isVariant = includes("tbu", (typeof token)[1]); parseString(key, isVariant); if (isVariant) { parseGroupedToken(token); } endGrouping(); } }; var parseToken = token => { switch (typeof token) { case "string": parseString(token); break; case "function": addRule(token); break; case "object": if (Array.isArray(token)) { token.forEach(parseGroupedToken); } else if (token) { Object.keys(token).forEach(key => { parseGroup(key, token[key]); }); } } }; var staticsCaches = new WeakMap(); var buildStatics = strings => { let statics = staticsCaches.get(strings); if (!statics) { let slowModeIndex = NaN; let buffer = ""; statics = strings.map((token, index) => { if (slowModeIndex !== slowModeIndex && (token.slice(-1) == "[" || includes(":-(", (strings[index + 1] || "")[0]))) { slowModeIndex = index; } if (index >= slowModeIndex) { return interpolation => { if (index == slowModeIndex) { buffer = ""; } buffer += token; if (includes("rg", (typeof interpolation)[5])) { buffer += interpolation; } else if (interpolation) { parseString(buffer); buffer = ""; parseToken(interpolation); } if (index == strings.length - 1) { parseString(buffer); } }; } const staticRules = rules = []; parseString(token); const activeGroupings = [...groupings]; rules = []; return interpolation => { rules.push(...staticRules); groupings = [...activeGroupings]; if (interpolation) { parseToken(interpolation); } }; }); staticsCaches.set(strings, statics); } return statics; }; var parse = tokens => { groupings = []; rules = []; if (Array.isArray(tokens[0]) && Array.isArray(tokens[0].raw)) { buildStatics(tokens[0]).forEach((apply2, index) => apply2(tokens[index + 1])); } else { parseToken(tokens); } return rules; }; // src/twind/directive.ts var isFunctionFree; var detectFunction = (key, value) => { if (typeof value == "function") { isFunctionFree = false; } return value; }; var stringify = data => { isFunctionFree = true; const key = JSON.stringify(data, detectFunction); return isFunctionFree && key; }; var cacheByFactory = new WeakMap(); var directive = (factory, data) => { const key = stringify(data); let directive2; if (key) { var cache = cacheByFactory.get(factory); if (!cache) { cacheByFactory.set(factory, cache = new Map()); } directive2 = cache.get(key); } if (!directive2) { directive2 = Object.defineProperty((params, context) => { context = Array.isArray(params) ? context : params; return evalThunk(factory(data, context), context); }, "toJSON", { value: () => key || data }); if (cache) { cache.set(key, directive2); ensureMaxSize(cache, 1e4); } } return directive2; }; // src/twind/apply.ts var applyFactory = (tokens, { css }) => css(parse(tokens)); var apply = (...tokens) => directive(applyFactory, tokens); // src/twind/helpers.ts var positions = resolve => (value, position2, prefix, suffix) => { if (value) { const properties = position2 && resolve(position2); if (properties && properties.length > 0) { return properties.reduce((declarations, property2) => { declarations[joinTruthy([prefix, property2, suffix])] = value; return declarations; }, {}); } } }; var corners = /* @__PURE__ */positions(key => ({ t: ["top-left", "top-right"], r: ["top-right", "bottom-right"], b: ["bottom-left", "bottom-right"], l: ["bottom-left", "top-left"], tl: ["top-left"], tr: ["top-right"], bl: ["bottom-left"], br: ["bottom-right"] })[key]); var expandEdges = key => { const parts = ({ x: "lr", y: "tb" }[key] || key || "").split("").sort(); for (let index = parts.length; index--;) { if (!(parts[index] = { t: "top", r: "right", b: "bottom", l: "left" }[parts[index]])) return; } if (parts.length) return parts; }; var edges = /* @__PURE__ */positions(expandEdges); var stringifyVariant = (selector, variant) => selector + (variant[1] == ":" ? tail(variant, 2) + ":" : tail(variant)) + ":"; var stringifyRule = (rule, directive2 = rule.d) => typeof directive2 == "function" ? "" : rule.v.reduce(stringifyVariant, "") + (rule.i ? "!" : "") + (rule.n ? "-" : "") + directive2; // src/twind/plugins.ts var _; var __; var $; var toColumnsOrRows = x => x == "cols" ? "columns" : "rows"; var property = property2 => (params, context, id) => ({ [property2]: id + ((_ = join(params)) && "-" + _) }); var propertyValue = (property2, separator) => (params, context, id) => (_ = join(params, separator)) && { [property2 || id]: _ }; var themeProperty = section => (params, { theme: theme2 }, id) => (_ = theme2(section || id, params)) && { [section || id]: _ }; var themePropertyFallback = (section, separator) => (params, { theme: theme2 }, id) => (_ = theme2(section || id, params, join(params, separator))) && { [section || id]: _ }; var alias = (handler, name) => (params, context) => handler(params, context, name); var display = property("display"); var position = property("position"); var textTransform = property("textTransform"); var textDecoration = property("textDecoration"); var fontStyle = property("fontStyle"); var fontVariantNumeric = key => (params, context, id) => ({ ["--tw-" + key]: id, fontVariantNumeric: "var(--tw-ordinal,/*!*/ /*!*/) var(--tw-slashed-zero,/*!*/ /*!*/) var(--tw-numeric-figure,/*!*/ /*!*/) var(--tw-numeric-spacing,/*!*/ /*!*/) var(--tw-numeric-fraction,/*!*/ /*!*/)" }); var inset = (params, { theme: theme2 }, id) => (_ = theme2("inset", params)) && { [id]: _ }; var opacityProperty = (params, theme2, id, section = id) => (_ = theme2(section + "Opacity", tail(params))) && { [`--tw-${id}-opacity`]: _ }; var parseColorComponent = (chars, factor) => Math.round(parseInt(chars, 16) * factor); var asRGBA = (color, opacityProperty2, opacityDefault) => { if (color && color[0] == "#" && (_ = (color.length - 1) / 3) && ($ = [17, 1, 0.062272][_ - 1])) { return `rgba(${parseColorComponent(color.substr(1, _), $)},${parseColorComponent(color.substr(1 + _, _), $)},${parseColorComponent(color.substr(1 + 2 * _, _), $)},${opacityProperty2 ? `var(--tw-${opacityProperty2}${opacityDefault ? "," + opacityDefault : ""})` : opacityDefault || 1})`; } return color; }; var withOpacityFallback = (property2, kind, color) => color && typeof color == "string" ? (_ = asRGBA(color, kind + "-opacity")) && _ !== color ? { [`--tw-${kind}-opacity`]: "1", [property2]: [color, _] } : { [property2]: color } : void 0; var transparentTo = color => ($ = asRGBA(color, "", "0")) == _ ? "transparent" : $; var reversableEdge = (params, { theme: theme2 }, id, section, prefix, suffix) => (_ = { x: ["right", "left"], y: ["bottom", "top"] }[params[0]]) && ($ = `--tw-${id}-${params[0]}-reverse`) ? params[1] == "reverse" ? { [$]: "1" } : { [$]: "0", [joinTruthy([prefix, _[0], suffix])]: (__ = theme2(section, tail(params))) && `calc(${__} * var(${$}))`, [joinTruthy([prefix, _[1], suffix])]: __ && [__, `calc(${__} * calc(1 - var(${$})))`] } : void 0; var placeHelper = (property2, params) => params[0] && { [property2]: (includes("wun", (params[0] || "")[3]) ? "space-" : "") + params[0] }; var contentPluginFor = property2 => params => includes(["start", "end"], params[0]) ? { [property2]: "flex-" + params[0] } : placeHelper(property2, params); var gridPlugin = kind => (params, { theme: theme2 }) => { if (_ = theme2("grid" + capitalize(kind), params, "")) { return { ["grid-" + kind]: _ }; } switch (params[0]) { case "span": return params[1] && { ["grid-" + kind]: `span ${params[1]} / span ${params[1]}` }; case "start": case "end": return (_ = theme2("grid" + capitalize(kind) + capitalize(params[0]), tail(params), join(tail(params)))) && { [`grid-${kind}-${params[0]}`]: _ }; } }; var border = (params, { theme: theme2 }, id) => { switch (params[0]) { case "solid": case "dashed": case "dotted": case "double": case "none": return propertyValue("borderStyle")(params); case "collapse": case "separate": return propertyValue("borderCollapse")(params); case "opacity": return opacityProperty(params, theme2, id); } return (_ = theme2(id + "Width", params, "")) ? { borderWidth: _ } : withOpacityFallback("borderColor", id, theme2(id + "Color", params)); }; var borderEdges = (params, context, id) => { var _a; const edges2 = (_a = expandEdges(params[0])) == null ? void 0 : _a.map(capitalize); if (edges2) { params = tail(params); } let rules2 = border(params, context, id); if (edges2 && rules2 && typeof rules2 === "object") { rules2 = Object.entries(rules2).reduce((newRules, [key, value]) => { if (key.startsWith("border")) { for (const edge of edges2) { newRules[key.slice(0, 6) + edge + key.slice(6)] = value; } } else { newRules[key] = value; } return newRules; }, {}); } return rules2; }; var transform = gpu => (gpu ? "translate3d(var(--tw-translate-x,0),var(--tw-translate-y,0),0)" : "translateX(var(--tw-translate-x,0)) translateY(var(--tw-translate-y,0))") + " rotate(var(--tw-rotate,0)) skewX(var(--tw-skew-x,0)) skewY(var(--tw-skew-y,0)) scaleX(var(--tw-scale-x,1)) scaleY(var(--tw-scale-y,1))"; var transformXYFunction = (params, context, id) => params[0] && (_ = context.theme(id, params[1] || params[0])) && { [`--tw-${id}-x`]: params[0] !== "y" && _, [`--tw-${id}-y`]: params[0] !== "x" && _, transform: [`${id}${params[1] ? params[0].toUpperCase() : ""}(${_})`, transform()] }; var edgesPluginFor = key => (params, context, id) => id[1] ? edges(context.theme(key, params), id[1], key) : themeProperty(key)(params, context, id); var padding = edgesPluginFor("padding"); var margin = edgesPluginFor("margin"); var minMax = (params, { theme: theme2 }, id) => (_ = { w: "width", h: "height" }[params[0]]) && { [_ = `${id}${capitalize(_)}`]: theme2(_, tail(params)) }; var filter = (params, { theme: theme2 }, id) => { const parts = id.split("-"); const prefix = parts[0] == "backdrop" ? parts[0] + "-" : ""; if (!prefix) { params.unshift(...parts); } if (params[0] == "filter") { const filters = ["blur", "brightness", "contrast", "grayscale", "hue-rotate", "invert", prefix && "opacity", "saturate", "sepia", !prefix && "drop-shadow"].filter(Boolean); return params[1] == "none" ? { [prefix + "filter"]: "none" } : filters.reduce((css, key) => { css["--tw-" + prefix + key] = "var(--tw-empty,/*!*/ /*!*/)"; return css; }, { [prefix + "filter"]: filters.map(key => `var(--tw-${prefix}${key})`).join(" ") }); } $ = params.shift(); if (includes(["hue", "drop"], $)) $ += capitalize(params.shift()); return (_ = theme2(prefix ? "backdrop" + capitalize($) : $, params)) && { ["--tw-" + prefix + $]: (Array.isArray(_) ? _ : [_]).map(_4 => `${hyphenate($)}(${_4})`).join(" ") }; }; var corePlugins = { group: (params, { tag }, id) => tag(join([id, ...params])), hidden: alias(display, "none"), inline: display, block: display, contents: display, flow: display, table: (params, context, id) => includes(["auto", "fixed"], params[0]) ? { tableLayout: params[0] } : display(params, context, id), flex(params, context, id) { switch (params[0]) { case "row": case "col": return { flexDirection: join(params[0] == "col" ? ["column", ...tail(params)] : params) }; case "nowrap": case "wrap": return { flexWrap: join(params) }; case "grow": case "shrink": _ = context.theme("flex" + capitalize(params[0]), tail(params), params[1] || 1); return _ != null && { ["flex-" + params[0]]: "" + _ }; } return (_ = context.theme("flex", params, "")) ? { flex: _ } : display(params, context, id); }, grid(params, context, id) { switch (params[0]) { case "cols": case "rows": return (_ = context.theme("gridTemplate" + capitalize(toColumnsOrRows(params[0])), tail(params), params.length == 2 && Number(params[1]) ? `repeat(${params[1]},minmax(0,1fr))` : join(tail(params)))) && { ["gridTemplate-" + toColumnsOrRows(params[0])]: _ }; case "flow": return params.length > 1 && { gridAutoFlow: join(params[1] == "col" ? ["column", ...tail(params, 2)] : tail(params), " ") }; } return display(params, context, id); }, auto: (params, { theme: theme2 }) => includes(["cols", "rows"], params[0]) && (_ = theme2("gridAuto" + capitalize(toColumnsOrRows(params[0])), tail(params), join(tail(params)))) && { ["gridAuto-" + toColumnsOrRows(params[0])]: _ }, static: position, fixed: position, absolute: position, relative: position, sticky: position, visible: { visibility: "visible" }, invisible: { visibility: "hidden" }, antialiased: { WebkitFontSmoothing: "antialiased", MozOsxFontSmoothing: "grayscale" }, "subpixel-antialiased": { WebkitFontSmoothing: "auto", MozOsxFontSmoothing: "auto" }, truncate: { overflow: "hidden", whiteSpace: "nowrap", textOverflow: "ellipsis" }, "sr-only": { position: "absolute", width: "1px", height: "1px", padding: "0", margin: "-1px", overflow: "hidden", whiteSpace: "nowrap", clip: "rect(0,0,0,0)", borderWidth: "0" }, "not-sr-only": { position: "static", width: "auto", height: "auto", padding: "0", margin: "0", overflow: "visible", whiteSpace: "normal", clip: "auto" }, resize: params => ({ resize: { x: "horizontal", y: "vertical" }[params[0]] || params[0] || "both" }), box: params => params[0] && { boxSizing: params[0] + "-box" }, appearance: propertyValue(), cursor: themePropertyFallback(), float: propertyValue(), clear: propertyValue(), decoration: propertyValue("boxDecorationBreak"), isolate: { isolation: "isolate" }, isolation: propertyValue(), "mix-blend": propertyValue("mixBlendMode"), top: inset, right: inset, bottom: inset, left: inset, inset: (params, { theme: theme2 }) => (_ = expandEdges(params[0])) ? edges(theme2("inset", tail(params)), params[0]) : (_ = theme2("inset", params)) && { top: _, right: _, bottom: _, left: _ }, underline: textDecoration, "line-through": textDecoration, "no-underline": alias(textDecoration, "none"), "text-underline": alias(textDecoration, "underline"), "text-no-underline": alias(textDecoration, "none"), "text-line-through": alias(textDecoration, "line-through"), uppercase: textTransform, lowercase: textTransform, capitalize: textTransform, "normal-case": alias(textTransform, "none"), "text-normal-case": alias(textTransform, "none"), italic: fontStyle, "not-italic": alias(fontStyle, "normal"), "font-italic": alias(fontStyle, "italic"), "font-not-italic": alias(fontStyle, "normal"), font: (params, context, id) => (_ = context.theme("fontFamily", params, "")) ? { fontFamily: _ } : themeProperty("fontWeight")(params, context, id), items: params => params[0] && { alignItems: includes(["start", "end"], params[0]) ? "flex-" + params[0] : join(params) }, "justify-self": propertyValue(), "justify-items": propertyValue(), justify: contentPluginFor("justifyContent"), content: contentPluginFor("alignContent"), self: contentPluginFor("alignSelf"), place: params => params[0] && placeHelper("place-" + params[0], tail(params)), overscroll: params => params[0] && { ["overscrollBehavior" + (params[1] ? "-" + params[0] : "")]: params[1] || params[0] }, col: gridPlugin("column"), row: gridPlugin("row"), duration: themeProperty("transitionDuration"), delay: themeProperty("transitionDelay"), tracking: themeProperty("letterSpacing"), leading: themeProperty("lineHeight"), z: themeProperty("zIndex"), opacity: themeProperty(), ease: themeProperty("transitionTimingFunction"), p: padding, py: padding, px: padding, pt: padding, pr: padding, pb: padding, pl: padding, m: margin, my: margin, mx: margin, mt: margin, mr: margin, mb: margin, ml: margin, w: themeProperty("width"), h: themeProperty("height"), min: minMax, max: minMax, fill: themeProperty(), order: themeProperty(), origin: themePropertyFallback("transformOrigin", " "), select: propertyValue("userSelect"), "pointer-events": propertyValue(), align: propertyValue("verticalAlign"), whitespace: propertyValue("whiteSpace"), "normal-nums": { fontVariantNumeric: "normal" }, ordinal: fontVariantNumeric("ordinal"), "slashed-zero": fontVariantNumeric("slashed-zero"), "lining-nums": fontVariantNumeric("numeric-figure"), "oldstyle-nums": fontVariantNumeric("numeric-figure"), "proportional-nums": fontVariantNumeric("numeric-spacing"), "tabular-nums": fontVariantNumeric("numeric-spacing"), "diagonal-fractions": fontVariantNumeric("numeric-fraction"), "stacked-fractions": fontVariantNumeric("numeric-fraction"), overflow: (params, context, id) => includes(["ellipsis", "clip"], params[0]) ? propertyValue("textOverflow")(params) : params[1] ? { ["overflow-" + params[0]]: params[1] } : propertyValue()(params, context, id), transform: params => params[0] == "none" ? { transform: "none" } : { "--tw-translate-x": "0", "--tw-translate-y": "0", "--tw-rotate": "0", "--tw-skew-x": "0", "--tw-skew-y": "0", "--tw-scale-x": "1", "--tw-scale-y": "1", transform: transform(params[0] == "gpu") }, rotate: (params, { theme: theme2 }) => (_ = theme2("rotate", params)) && { "--tw-rotate": _, transform: [`rotate(${_})`, transform()] }, scale: transformXYFunction, translate: transformXYFunction, skew: transformXYFunction, gap: (params, context, id) => (_ = { x: "column", y: "row" }[params[0]]) ? { [_ + "Gap"]: context.theme("gap", tail(params)) } : themeProperty("gap")(params, context, id), stroke: (params, context, id) => (_ = context.theme("stroke", params, "")) ? { stroke: _ } : themeProperty("strokeWidth")(params, context, id), outline: (params, { theme: theme2 }) => (_ = theme2("outline", params)) && { outline: _[0], outlineOffset: _[1] }, "break-normal": { wordBreak: "normal", overflowWrap: "normal" }, "break-words": { overflowWrap: "break-word" }, "break-all": { wordBreak: "break-all" }, text(params, { theme: theme2 }, id) { switch (params[0]) { case "left": case "center": case "right": case "justify": return { textAlign: params[0] }; case "uppercase": case "lowercase": case "capitalize": return textTransform([], _, params[0]); case "opacity": return opacityProperty(params, theme2, id); } const fontSize = theme2("fontSize", params, ""); if (fontSize) { return typeof fontSize == "string" ? { fontSize } : { fontSize: fontSize[0], ...(typeof fontSize[1] == "string" ? { lineHeight: fontSize[1] } : fontSize[1]) }; } return withOpacityFallback("color", "text", theme2("textColor", params)); }, bg(params, { theme: theme2 }, id) { switch (params[0]) { case "fixed": case "local": case "scroll": return propertyValue("backgroundAttachment", ",")(params); case "bottom": case "center": case "left": case "right": case "top": return propertyValue("backgroundPosition", " ")(params); case "no": return params[1] == "repeat" && propertyValue("backgroundRepeat")(params); case "repeat": return includes("xy", params[1]) ? propertyValue("backgroundRepeat")(params) : { backgroundRepeat: params[1] || params[0] }; case "opacity": return opacityProperty(params, theme2, id, "background"); case "clip": case "origin": return params[1] && { ["background-" + params[0]]: params[1] + (params[1] == "text" ? "" : "-box") }; case "blend": return propertyValue("background-blend-mode")(tail(params)); case "gradient": if (params[1] == "to" && (_ = expandEdges(params[2]))) { return { backgroundImage: `linear-gradient(to ${join(_, " ")},var(--tw-gradient-stops))` }; } } return (_ = theme2("backgroundPosition", params, "")) ? { backgroundPosition: _ } : (_ = theme2("backgroundSize", params, "")) ? { backgroundSize: _ } : (_ = theme2("backgroundImage", params, "")) ? { backgroundImage: _ } : withOpacityFallback("backgroundColor", "bg", theme2("backgroundColor", params)); }, from: (params, { theme: theme2 }) => (_ = theme2("gradientColorStops", params)) && { "--tw-gradient-from": _, "--tw-gradient-stops": `var(--tw-gradient-from),var(--tw-gradient-to,${transparentTo(_)})` }, via: (params, { theme: theme2 }) => (_ = theme2("gradientColorStops", params)) && { "--tw-gradient-stops": `var(--tw-gradient-from),${_},var(--tw-gradient-to,${transparentTo(_)})` }, to: (params, { theme: theme2 }) => (_ = theme2("gradientColorStops", params)) && { "--tw-gradient-to": _ }, border: borderEdges, divide: (params, context, id) => (_ = reversableEdge(params, context, id, "divideWidth", "border", "width") || border(params, context, id)) && { "&>:not([hidden])~:not([hidden])": _ }, space: (params, context, id) => (_ = reversableEdge(params, context, id, "space", "margin")) && { "&>:not([hidden])~:not([hidden])": _ }, placeholder: (params, { theme: theme2 }, id) => (_ = params[0] == "opacity" ? opacityProperty(params, theme2, id) : withOpacityFallback("color", "placeholder", theme2("placeholderColor", params))) && { "&::placeholder": _ }, shadow: (params, { theme: theme2 }) => (_ = theme2("boxShadow", params)) && { ":global": { "*": { "--tw-shadow": "0 0 transparent" } }, "--tw-shadow": _ == "none" ? "0 0 transparent" : _, boxShadow: [_, `var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)`] }, animate: (params, { theme: theme2, tag }) => { if ($ = theme2("animation", params)) { const parts = $.split(" "); if ((_ = theme2("keyframes", parts[0], __ = {})) !== __) { return ($ = tag(parts[0])) && { animation: $ + " " + join(tail(parts), " "), ["@keyframes " + $]: _ }; } return { animation: $ }; } }, ring(params, { theme: theme2 }, id) { switch (params[0]) { case "inset": return { "--tw-ring-inset": "inset" }; case "opacity": return opacityProperty(params, theme2, id); case "offset": return (_ = theme2("ringOffsetWidth", tail(params), "")) ? { "--tw-ring-offset-width": _ } : { "--tw-ring-offset-color": theme2("ringOffsetColor", tail(params)) }; } return (_ = theme2("ringWidth", params, "")) ? { "--tw-ring-offset-shadow": `var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)`, "--tw-ring-shadow": `var(--tw-ring-inset) 0 0 0 calc(${_} + var(--tw-ring-offset-width)) var(--tw-ring-color)`, boxShadow: `var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)`, ":global": { "*": { "--tw-ring-inset": "var(--tw-empty,/*!*/ /*!*/)", "--tw-ring-offset-width": theme2("ringOffsetWidth", "", "0px"), "--tw-ring-offset-color": theme2("ringOffsetColor", "", "#fff"), "--tw-ring-color": asRGBA(theme2("ringColor", "", "#93c5fd"), "ring-opacity", theme2("ringOpacity", "", "0.5")), "--tw-ring-offset-shadow": "0 0 transparent", "--tw-ring-shadow": "0 0 transparent" } } } : { "--tw-ring-opacity": "1", "--tw-ring-color": asRGBA(theme2("ringColor", params), "ring-opacity") }; }, object: (params, context, id) => includes(["contain", "cover", "fill", "none", "scale-down"], join(params)) ? { objectFit: join(params) } : themePropertyFallback("objectPosition", " ")(params, context, id), list: (params, context, id) => join(params) == "item" ? display(params, context, id) : includes(["inside", "outside"], join(params)) ? { listStylePosition: params[0] } : themePropertyFallback("listStyleType")(params, context, id), rounded: (params, context, id) => corners(context.theme("borderRadius", tail(params), ""), params[0], "border", "radius") || themeProperty("borderRadius")(params, context, id), "transition-none": { transitionProperty: "none" }, transition: (params, { theme: theme2 }) => ({ transitionProperty: theme2("transitionProperty", params), transitionTimingFunction: theme2("transitionTimingFunction", ""), transitionDuration: theme2("transitionDuration", "") }), container: (params, { theme: theme2 }) => { const { screens = theme2("screens"), center, padding: padding2 } = theme2("container"); const paddingFor = screen => (_ = padding2 && (typeof padding2 == "string" ? padding2 : padding2[screen] || padding2.DEFAULT)) ? { paddingRight: _, paddingLeft: _ } : {}; return Object.keys(screens).reduce((rules2, screen) => { if (($ = screens[screen]) && typeof $ == "string") { rules2[buildMediaQuery($)] = { "&": { "max-width": $, ...paddingFor(screen) } }; } return rules2; }, { width: "100%", ...(center ? { marginRight: "auto", marginLeft: "auto" } : {}), ...paddingFor("xs") }); }, filter, blur: filter, brightness: filter, contrast: filter, grayscale: filter, "hue-rotate": filter, invert: filter, saturate: filter, sepia: filter, "drop-shadow": filter, backdrop: filter }; // src/twind/preflight.ts var createPreflight = theme2 => ({ ":root": { tabSize: 4 }, "body,blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre,fieldset,ol,ul": { margin: "0" }, button: { backgroundColor: "transparent", backgroundImage: "none" }, 'button,[type="button"],[type="reset"],[type="submit"]': { WebkitAppearance: "button" }, "button:focus": { outline: ["1px dotted", "5px auto -webkit-focus-ring-color"] }, "fieldset,ol,ul,legend": { padding: "0" }, "ol,ul": { listStyle: "none" }, html: { lineHeight: "1.5", WebkitTextSizeAdjust: "100%", fontFamily: theme2("fontFamily.sans", "ui-sans-serif,system-ui,sans-serif") }, body: { fontFamily: "inherit", lineHeight: "inherit" }, "*,::before,::after": { boxSizing: "border-box", border: `0 solid ${theme2("borderColor.DEFAULT", "currentColor")}` }, hr: { height: "0", color: "inherit", borderTopWidth: "1px" }, img: { borderStyle: "solid" }, textarea: { resize: "vertical" }, "input::placeholder,textarea::placeholder": { opacity: "1", color: theme2("placeholderColor.DEFAULT", theme2("colors.gray.400", "#a1a1aa")) }, 'button,[role="button"]': { cursor: "pointer" }, table: { textIndent: "0", borderColor: "inherit", borderCollapse: "collapse" }, "h1,h2,h3,h4,h5,h6": { fontSize: "inherit", fontWeight: "inherit" }, a: { color: "inherit", textDecoration: "inherit" }, "button,input,optgroup,select,textarea": { fontFamily: "inherit", fontSize: "100%", margin: "0", padding: "0", lineHeight: "inherit", color: "inherit" }, "button,select": { textTransform: "none" }, "::-moz-focus-inner": { borderStyle: "none", padding: "0" }, ":-moz-focusring": { outline: "1px dotted ButtonText" }, ":-moz-ui-invalid": { boxShadow: "none" }, progress: { verticalAlign: "baseline" }, "::-webkit-inner-spin-button,::-webkit-outer-spin-button": { height: "auto" }, '[type="search"]': { WebkitAppearance: "textfield", outlineOffset: "-2px" }, "::-webkit-search-decoration": { WebkitAppearance: "none" }, "::-webkit-file-upload-button": { WebkitAppearance: "button", font: "inherit" }, summary: { display: "list-item" }, "abbr[title]": { textDecoration: "underline dotted" }, "b,strong": { fontWeight: "bolder" }, "pre,code,kbd,samp": { fontFamily: theme2("fontFamily", "mono", "ui-monospace,monospace"), fontSize: "1em" }, "sub,sup": { fontSize: "75%", lineHeight: "0", position: "relative", verticalAlign: "baseline" }, sub: { bottom: "-0.25em" }, sup: { top: "-0.5em" }, "img,svg,video,canvas,audio,iframe,embed,object": { display: "block", verticalAlign: "middle" }, "img,video": { maxWidth: "100%", height: "auto" } }); // src/twind/variants.ts var coreVariants = { dark: "@media (prefers-color-scheme:dark)", sticky: "@supports ((position: -webkit-sticky) or (position:sticky))", "motion-reduce": "@media (prefers-reduced-motion:reduce)", "motion-safe": "@media (prefers-reduced-motion:no-preference)", first: "&:first-child", last: "&:last-child", even: "&:nth-child(2n)", odd: "&:nth-child(odd)", children: "&>*", siblings: "&~*", sibling: "&+*", override: "&&" }; // src/internal/dom.ts var STYLE_ELEMENT_ID = "__twind"; var getStyleElement = nonce => { let element = self[STYLE_ELEMENT_ID]; if (!element) { element = document.head.appendChild(document.createElement("style")); element.id = STYLE_ELEMENT_ID; nonce && (element.nonce = nonce); element.appendChild(document.createTextNode("")); } return element; }; // src/twind/sheets.ts var cssomSheet = ({ nonce, target = getStyleElement(nonce).sheet } = {}) => { const offset = target.cssRules.length; return { target, insert: (rule, index) => target.insertRule(rule, offset + index) }; }; var voidSheet = () => ({ target: null, insert: noop }); // src/twind/modes.ts var mode = report => ({ unknown(section, key = [], optional, context) { if (!optional) { this.report({ id: "UNKNOWN_THEME_VALUE", key: section + "." + join(key) }, context); } }, report({ id, ...info }) { return report(`[${id}] ${JSON.stringify(info)}`); } }); var warn = /* @__PURE__ */mode(message => console.warn(message)); var strict = /* @__PURE__ */mode(message => { throw new Error(message); }); var silent = /* @__PURE__ */mode(noop); var noprefix = (property2, value, important) => `${property2}:${value}${important ? " !important" : ""}`; var autoprefix = (property2, value, important) => { let cssText = ""; const propertyAlias = r(property2); if (propertyAlias) cssText += `${noprefix(propertyAlias, value, important)};`; let flags = a(property2); if (flags & 1) cssText += `-webkit-${noprefix(property2, value, important)};`; if (flags & 2) cssText += `-moz-${noprefix(property2, value, important)};`; if (flags & 4) cssText += `-ms-${noprefix(property2, value, important)};`; flags = t$1(property2, value); if (flags & 1) cssText += `${noprefix(property2, `-webkit-${value}`, important)};`; if (flags & 2) cssText += `${noprefix(property2, `-moz-${value}`, important)};`; if (flags & 4) cssText += `${noprefix(property2, `-ms-${value}`, important)};`; cssText += noprefix(property2, value, important); return cssText; }; // src/twind/theme.ts var ratios = (start, end) => { const result = {}; do { for (let dividend = 1; dividend < start; dividend++) { result[`${dividend}/${start}`] = Number((dividend / start * 100).toFixed(6)) + "%"; } } while (++start <= end); return result; }; var exponential = (stop, unit, start = 0) => { const result = {}; for (; start <= stop; start = start * 2 || 1) { result[start] = start + unit; } return result; }; var linear = (stop, unit = "", divideBy = 1, start = 0, step = 1, result = {}) => { for (; start <= stop; start += step) { result[start] = start / divideBy + unit; } return result; }; var alias2 = section => theme2 => theme2(section); var defaultTheme = { screens: { sm: "640px", md: "768px", lg: "1024px", xl: "1280px", "2xl": "1536px" }, colors: { transparent: "transparent", current: "currentColor", black: "#000", white: "#fff", gray: { 50: "#f9fafb", 100: "#f3f4f6", 200: "#e5e7eb", 300: "#d1d5db", 400: "#9ca3af", 500: "#6b7280", 600: "#4b5563", 700: "#374151", 800: "#1f2937", 900: "#111827" }, red: { 50: "#fef2f2", 100: "#fee2e2", 200: "#fecaca", 300: "#fca5a5", 400: "#f87171", 500: "#ef4444", 600: "#dc2626", 700: "#b91c1c", 800: "#991b1b", 900: "#7f1d1d" }, yellow: { 50: "#fffbeb", 100: "#fef3c7", 200: "#fde68a", 300: "#fcd34d", 400: "#fbbf24", 500: "#f59e0b", 600: "#d97706", 700: "#b45309", 800: "#92400e", 900: "#78350f" }, green: { 50: "#ecfdf5", 100: "#d1fae5", 200: "#a7f3d0", 300: "#6ee7b7", 400: "#34d399", 500: "#10b981", 600: "#059669", 700: "#047857", 800: "#065f46", 900: "#064e3b" }, blue: { 50: "#eff6ff", 100: "#dbeafe", 200: "#bfdbfe", 300: "#93c5fd", 400: "#60a5fa", 500: "#3b82f6", 600: "#2563eb", 700: "#1d4ed8", 800: "#1e40af", 900: "#1e3a8a" }, indigo: { 50: "#eef2ff", 100: "#e0e7ff", 200: "#c7d2fe", 300: "#a5b4fc", 400: "#818cf8", 500: "#6366f1", 600: "#4f46e5", 700: "#4338ca", 800: "#3730a3", 900: "#312e81" }, purple: { 50: "#f5f3ff", 100: "#ede9fe", 200: "#ddd6fe", 300: "#c4b5fd", 400: "#a78bfa", 500: "#8b5cf6", 600: "#7c3aed", 700: "#6d28d9", 800: "#5b21b6", 900: "#4c1d95" }, pink: { 50: "#fdf2f8", 100: "#fce7f3", 200: "#fbcfe8", 300: "#f9a8d4", 400: "#f472b6", 500: "#ec4899", 600: "#db2777", 700: "#be185d", 800: "#9d174d", 900: "#831843" } }, spacing: { px: "1px", 0: "0px", ... /* @__PURE__ */linear(4, "rem", 4, 0.5, 0.5), ... /* @__PURE__ */linear(12, "rem", 4, 5), 14: "3.5rem", ... /* @__PURE__ */linear(64, "rem", 4, 16, 4), 72: "18rem", 80: "20rem", 96: "24rem" }, durations: { 75: "75ms", 100: "100ms", 150: "150ms", 200: "200ms", 300: "300ms", 500: "500ms", 700: "700ms", 1e3: "1000ms" }, animation: { none: "none", spin: "spin 1s linear infinite", ping: "ping 1s cubic-bezier(0, 0, 0.2, 1) infinite", pulse: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite", bounce: "bounce 1s infinite" }, backdropBlur: /* @__PURE__ */alias2("blur"), backdropBrightness: /* @__PURE__ */alias2("brightness"), backdropContrast: /* @__PURE__ */alias2("contrast"), backdropGrayscale: /* @__PURE__ */alias2("grayscale"), backdropHueRotate: /* @__PURE__ */alias2("hueRotate"), backdropInvert: /* @__PURE__ */alias2("invert"), backdropOpacity: /* @__PURE__ */alias2("opacity"), backdropSaturate: /* @__PURE__ */alias2("saturate"), backdropSepia: /* @__PURE__ */alias2("sepia"), backgroundColor: /* @__PURE__ */alias2("colors"), backgroundImage: { none: "none" }, backgroundOpacity: /* @__PURE__ */alias2("opacity"), backgroundSize: { auto: "auto", cover: "cover", contain: "contain" }, blur: { 0: "0", sm: "4px", DEFAULT: "8px", md: "12px", lg: "16px", xl: "24px", "2xl": "40px", "3xl": "64px" }, brightness: { ... /* @__PURE__ */linear(200, "", 100, 0, 50), ... /* @__PURE__ */linear(110, "", 100, 90, 5), 75: "0.75", 125: "1.25" }, borderColor: theme2 => ({ ...theme2("colors"), DEFAULT: theme2("colors.gray.200", "currentColor") }), borderOpacity: /* @__PURE__ */alias2("opacity"), borderRadius: { none: "0px", sm: "0.125rem", DEFAULT: "0.25rem", md: "0.375rem", lg: "0.5rem", xl: "0.75rem", "2xl": "1rem", "3xl": "1.5rem", "1/2": "50%", full: "9999px" }, borderWidth: { DEFAULT: "1px", ... /* @__PURE__ */exponential(8, "px") }, boxShadow: { sm: "0 1px 2px 0 rgba(0,0,0,0.05)", DEFAULT: "0 1px 3px 0 rgba(0,0,0,0.1), 0 1px 2px 0 rgba(0,0,0,0.06)", md: "0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06)", lg: "0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05)", xl: "0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04)", "2xl": "0 25px 50px -12px rgba(0,0,0,0.25)", inner: "inset 0 2px 4px 0 rgba(0,0,0,0.06)", none: "none" }, contrast: { ... /* @__PURE__ */linear(200, "", 100, 0, 50), 75: "0.75", 125: "1.25" }, divideColor: /* @__PURE__ */alias2("borderColor"), divideOpacity: /* @__PURE__ */alias2("borderOpacity"), divideWidth: /* @__PURE__ */alias2("borderWidth"), dropShadow: { sm: "0 1px 1px rgba(0,0,0,0.05)", DEFAULT: ["0 1px 2px rgba(0,0,0,0.1)", "0 1px 1px rgba(0,0,0,0.06)"], md: ["0 4px 3px rgba(0,0,0,0.07)", "0 2px 2px rgba(0,0,0,0.06)"], lg: ["0 10px 8px rgba(0,0,0,0.04)", "0 4px 3px rgba(0,0,0,0.1)"], xl: ["0 20px 13px rgba(0,0,0,0.03)", "0 8px 5px rgba(0,0,0,0.08)"], "2xl": "0 25px 25px rgba(0,0,0,0.15)", none: "0 0 #0000" }, fill: { current: "currentColor" }, grayscale: { 0: "0", DEFAULT: "100%" }, hueRotate: { 0: "0deg", 15: "15deg", 30: "30deg", 60: "60deg", 90: "90deg", 180: "180deg" }, invert: { 0: "0", DEFAULT: "100%" }, flex: { 1: "1 1 0%", auto: "1 1 auto", initial: "0 1 auto", none: "none" }, fontFamily: { sans: 'ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"'.split(","), serif: 'ui-serif,Georgia,Cambria,"Times New Roman",Times,serif'.split(","), mono: 'ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace'.split(",") }, fontSize: { xs: ["0.75rem", "1rem"], sm: ["0.875rem", "1.25rem"], base: ["1rem", "1.5rem"], lg: ["1.125rem", "1.75rem"], xl: ["1.25rem", "1.75rem"], "2xl": ["1.5rem", "2rem"], "3xl": ["1.875rem", "2.25rem"], "4xl": ["2.25rem", "2.5rem"], "5xl": ["3rem", "1"], "6xl": ["3.75rem", "1"], "7xl": ["4.5rem", "1"], "8xl": ["6rem", "1"], "9xl": ["8rem", "1"] }, fontWeight: { thin: "100", extralight: "200", light: "300", normal: "400", medium: "500", semibold: "600", bold: "700", extrabold: "800", black: "900" }, gridTemplateColumns: {}, gridTemplateRows: {}, gridAutoColumns: { min: "min-content", max: "max-content", fr: "minmax(0,1fr)" }, gridAutoRows: { min: "min-content", max: "max-content", fr: "minmax(0,1fr)" }, gridColumn: { auto: "auto", "span-full": "1 / -1" }, gridRow: { auto: "auto", "span-full": "1 / -1" }, gap: /* @__PURE__ */alias2("spacing"), gradientColorStops: /* @__PURE__ */alias2("colors"), height: theme2 => ({ auto: "auto", ...theme2("spacing"), ...ratios(2, 6), full: "100%", screen: "100vh" }), inset: theme2 => ({ auto: "auto", ...theme2("spacing"), ...ratios(2, 4), full: "100%" }), keyframes: { spin: { from: { transform: "rotate(0deg)" }, to: { transform: "rotate(360deg)" } }, ping: { "0%": { transform: "scale(1)", opacity: "1" }, "75%,100%": { transform: "scale(2)", opacity: "0" } }, pulse: { "0%,100%": { opacity: "1" }, "50%": { opacity: ".5" } }, bounce: { "0%, 100%": { transform: "translateY(-25%)", animationTimingFunction: "cubic-bezier(0.8,0,1,1)" }, "50%": { transform: "none", animationTimingFunction: "cubic-bezier(0,0,0.2,1)" } } }, letterSpacing: { tighter: "-0.05em", tight: "-0.025em", normal: "0em", wide: "0.025em", wider: "0.05em", widest: "0.1em" }, lineHeight: { none: "1", tight: "1.25", snug: "1.375", normal: "1.5", relaxed: "1.625", loose: "2", ... /* @__PURE__ */linear(10, "rem", 4, 3) }, margin: theme2 => ({ auto: "auto", ...theme2("spacing") }), maxHeight: theme2 => ({ ...theme2("spacing"), full: "100%", screen: "100vh" }), maxWidth: (theme2, { breakpoints }) => ({ none: "none", 0: "0rem", xs: "20rem", sm: "24rem", md: "28rem", lg: "32rem", xl: "36rem", "2xl": "42rem", "3xl": "48rem", "4xl": "56rem", "5xl": "64rem", "6xl": "72rem", "7xl": "80rem", full: "100%", min: "min-content", max: "max-content", prose: "65ch", ...breakpoints(theme2("screens")) }), minHeight: { 0: "0px", full: "100%", screen: "100vh" }, minWidth: { 0: "0px", full: "100%", min: "min-content", max: "max-content" }, opacity: { ... /* @__PURE__ */linear(100, "", 100, 0, 10), 5: "0.05", 25: "0.25", 75: "0.75", 95: "0.95" }, order: { first: "-9999", last: "9999", none: "0", ... /* @__PURE__ */linear(12, "", 1, 1) }, outline: { none: ["2px solid transparent", "2px"], white: ["2px dotted white", "2px"], black: ["2px dotted black", "2px"] }, padding: /* @__PURE__ */alias2("spacing"), placeholderColor: /* @__PURE__ */alias2("colors"), placeholderOpacity: /* @__PURE__ */alias2("opacity"), ringColor: theme2 => ({ DEFAULT: theme2("colors.blue.500", "#3b82f6"), ...theme2("colors") }), ringOffsetColor: /* @__PURE__ */alias2("colors"), ringOffsetWidth: /* @__PURE__ */exponential(8, "px"), ringOpacity: theme2 => ({ DEFAULT: "0.5", ...theme2("opacity") }), ringWidth: { DEFAULT: "3px", ... /* @__PURE__ */exponential(8, "px") }, rotate: { ... /* @__PURE__ */exponential(2, "deg"), ... /* @__PURE__ */exponential(12, "deg", 3), ... /* @__PURE__ */exponential(180, "deg", 45) }, saturate: /* @__PURE__ */linear(200, "", 100, 0, 50), scale: { ... /* @__PURE__ */linear(150, "", 100, 0, 50), ... /* @__PURE__ */linear(110, "", 100, 90, 5), 75: "0.75", 125: "1.25" }, sepia: { 0: "0", DEFAULT: "100%" }, skew: { ... /* @__PURE__ */exponential(2, "deg"), ... /* @__PURE__ */exponential(12, "deg", 3) }, space: /* @__PURE__ */alias2("spacing"), stroke: { current: "currentColor" }, strokeWidth: /* @__PURE__ */linear(2), textColor: /* @__PURE__ */alias2("colors"), textOpacity: /* @__PURE__ */alias2("opacity"), transitionDuration: theme2 => ({ DEFAULT: "150ms", ...theme2("durations") }), transitionDelay: /* @__PURE__ */alias2("durations"), transitionProperty: { none: "none", all: "all", DEFAULT: "background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter", colors: "background-color,border-color,color,fill,stroke", opacity: "opacity", shadow: "box-shadow", transform: "transform" }, transitionTimingFunction: { DEFAULT: "cubic-bezier(0.4,0,0.2,1)", linear: "linear", in: "cubic-bezier(0.4,0,1,1)", out: "cubic-bezier(0,0,0.2,1)", "in-out": "cubic-bezier(0.4,0,0.2,1)" }, translate: theme2 => ({ ...theme2("spacing"), ...ratios(2, 4), full: "100%" }), width: theme2 => ({ auto: "auto", ...theme2("spacing"), ...ratios(2, 6), ...ratios(12, 12), screen: "100vw", full: "100%", min: "min-content", max: "max-content" }), zIndex: { auto: "auto", ... /* @__PURE__ */linear(50, "", 1, 0, 10) } }; var flattenColorPalette = (colors, target = {}, prefix = []) => { Object.keys(colors).forEach(property2 => { const value = colors[property2]; if (property2 == "DEFAULT") { target[join(prefix)] = value; target[join(prefix, ".")] = value; } const key = [...prefix, property2]; target[join(key)] = value; target[join(key, ".")] = value; if (value && typeof value == "object") { flattenColorPalette(value, target, key); } }, target); return target; }; var resolveContext = { negative: () => ({}), breakpoints: screens => Object.keys(screens).filter(key => typeof screens[key] == "string").reduce((target, key) => { target["screen-" + key] = screens[key]; return target; }, {}) }; var handleArbitraryValues = (section, key) => (key = key[0] == "[" && key.slice(-1) == "]" && key.slice(1, -1)) && includes(section, "olor") == /^(#|(hsl|rgb)a?\(|[a-z]+$)/.test(key) && (includes(key, "calc(") ? key.replace(/(-?\d*\.?\d(?!\b-.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g, "$1 $2 ") : key); var makeThemeResolver = config => { const cache = new Map(); const theme2 = { ...defaultTheme, ...config }; const deref = (theme3, section) => { const base = theme3 && theme3[section]; const value = typeof base == "function" ? base(resolve, resolveContext) : base; return value && section == "colors" ? flattenColorPalette(value) : value; }; const resolve = (section, key, defaultValue) => { const keypath = section.split("."); section = keypath[0]; if (keypath.length > 1) { defaultValue = key; key = join(tail(keypath), "."); } let base = cache.get(section); if (!base) { cache.set(section, base = { ...deref(theme2, section) }); Object.assign(base, deref(theme2.extend, section)); } if (key != null) { key = (Array.isArray(key) ? join(key) : key) || "DEFAULT"; const value = handleArbitraryValues(section, key) || base[key]; return value == null ? defaultValue : Array.isArray(value) && !includes(["fontSize", "outline", "dropShadow"], section) ? join(value, ",") : value; } return base; }; return resolve; }; // src/twind/translate.ts var translate = (plugins, context) => (rule, isTranslating) => { if (typeof rule.d == "function") { return rule.d(context); } const parameters = rule.d.split(/-(?![^[]*])/g); if (!isTranslating && parameters[0] == "tw" && rule.$ == rule.d) { return rule.$; } for (let index = parameters.length; index; index--) { const id = join(parameters.slice(0, index)); if (Object.prototype.hasOwnProperty.call(plugins, id)) { const plugin = plugins[id]; return typeof plugin == "function" ? plugin(tail(parameters, index), context, id) : typeof plugin == "string" ? context[isTranslating ? "css" : "tw"](plugin) : plugin; } } }; // src/twind/decorate.ts var _2; var GROUP_RE = /^:(group(?:(?!-focus).+?)*)-(.+)$/; var NOT_PREFIX_RE = /^(:not)-(.+)/; var prepareVariantSelector = variant => variant[1] == "[" ? tail(variant) : variant; var decorate = (darkMode, variants, { theme: theme2, tag }) => { const applyVariant = (translation, variant) => { if (_2 = theme2("screens", tail(variant), "")) { return { [buildMediaQuery(_2)]: translation }; } if (variant == ":dark" && darkMode == "class") { return { ".dark &": translation }; } if (_2 = GROUP_RE.exec(variant)) { return { [`.${escape(tag(_2[1]))}:${_2[2]} &`]: translation }; } return { [variants[tail(variant)] || "&" + variant.replace(NOT_PREFIX_RE, (_4, not, variant2) => not + "(" + prepareVariantSelector(":" + variant2) + ")")]: translation }; }; return (translation, rule) => rule.v.reduceRight(applyVariant, translation); }; // src/twind/presedence.ts var _3; var responsivePrecedence = css => (((_3 = /(?:^|min-width: *)(\d+(?:.\d+)?)(p)?/.exec(css)) ? +_3[1] / (_3[2] ? 15 : 1) / 10 : 0) & 31) << 22; var seperatorPrecedence = string => { _3 = 0; for (let index = string.length; index--;) { _3 += includes("-:,", string[index]); } return _3; }; var atRulePresedence = css => (seperatorPrecedence(css) & 15) << 18; var PRECEDENCES_BY_PSEUDO_CLASS = ["rst", "st", "en", "d", "nk", "sited", "pty", "ecked", "cus-w", "ver", "cus", "cus-v", "tive", "sable", "ad-on", "tiona", "quire"]; var pseudoPrecedence = pseudoClass => 1 << (~(_3 = PRECEDENCES_BY_PSEUDO_CLASS.indexOf(pseudoClass.replace(GROUP_RE, ":$2").slice(3, 8))) ? _3 : 17); var makeVariantPresedenceCalculator = (theme2, variants) => (presedence, variant) => presedence | ((_3 = theme2("screens", tail(variant), "")) ? 1 << 27 | responsivePrecedence(buildMediaQuery(_3)) : variant == ":dark" ? 1 << 30 : (_3 = variants[variant] || variant.replace(NOT_PREFIX_RE, ":$2"))[0] == "@" ? atRulePresedence(_3) : pseudoPrecedence(variant)); var declarationPropertyPrecedence = property2 => property2[0] == "-" ? 0 : seperatorPrecedence(property2) + ((_3 = /^(?:(border-(?!w|c|sty)|[tlbr].{2,4}m?$|c.{7}$)|([fl].{5}l|g.{8}$|pl))/.exec(property2)) ? +!!_3[1] || -!!_3[2] : 0) + 1; // src/twind/serialize.ts var stringifyBlock = (body, selector) => selector + "{" + body + "}"; var serialize = (prefix, variants, context) => { const { theme: theme2, tag } = context; const tagVar = (_4, property2) => "--" + tag(property2); const tagVars = value => `${value}`.replace(/--(tw-[\w-]+)\b/g, tagVar); const stringifyDeclaration = (property2, value, important) => { property2 = tagVars(property2); return Array.isArray(value) ? join(value.filter(Boolean).map(value2 => prefix(property2, tagVars(value2), important)), ";") : prefix(property2, tagVars(value), important); }; let rules2; const stringify2 = (atRules, selector, presedence, css, important) => { if (Array.isArray(css)) { css.forEach(css2 => css2 && stringify2(atRules, selector, presedence, css2, important)); return; } let declarations = ""; let maxPropertyPresedence = 0; let numberOfDeclarations = 0; if (css["@apply"]) { css = merge(evalThunk(apply(css["@apply"]), context), { ...css, "@apply": void 0 }, context); } Object.keys(css).forEach(key => { const value = evalThunk(css[key], context); if (isCSSProperty(key, value)) { if (value !== "" && key.length > 1) { const property2 = hyphenate(key); numberOfDeclarations += 1; maxPropertyPresedence = Math.max(maxPropertyPresedence, declarationPropertyPrecedence(property2)); declarations = (declarations && declarations + ";") + stringifyDeclaration(property2, value, important); } } else if (value) { if (key == ":global") { key = "@global"; } if (key[0] == "@") { if (key[1] == "g") { stringify2([], "", 0, value, important); } else if (key[1] == "f") { stringify2([], key, 0, value, important); } else if (key[1] == "k") { const currentSize = rules2.length; stringify2([], "", 0, value, important); const waypoints = rules2.splice(currentSize, rules2.length - currentSize); rules2.push({ r: stringifyBlock(join(waypoints.map(p => p.r), ""), key), p: waypoints.reduce((sum, p) => sum + p.p, 0) }); } else if (key[1] == "i") { (Array.isArray(value) ? value : [value]).forEach(value2 => value2 && rules2.push({ p: 0, r: `${key} ${value2};` })); } else { if (key[2] == "c") { key = buildMediaQuery(context.theme("screens", tail(key, 8).trim())); } stringify2([...atRules, key], selector, presedence | responsivePrecedence(key) | atRulePresedence(key), value, important); } } else { stringify2(atRules, selector ? selector.replace(/ *((?:\(.+?\)|\[.+?\]|[^,])+) *(,|$)/g, (_4, selectorPart, comma) => key.replace(/ *((?:\(.+?\)|\[.+?\]|[^,])+) *(,|$)/g, (_5, keyPart, comma2) => (includes(keyPart, "&") ? keyPart.replace(/&/g, selectorPart) : (selectorPart && selectorPart + " ") + keyPart) + comma2) + comma) : key, presedence, value, important); } } }); if (numberOfDeclarations) { rules2.push({ r: atRules.reduceRight(stringifyBlock, stringifyBlock(declarations, selector)), p: presedence * (1 << 8) + ((Math.max(0, 15 - numberOfDeclarations) & 15) << 4 | (maxPropertyPresedence || 15) & 15) }); } }; const variantPresedence = makeVariantPresedenceCalculator(theme2, variants); return (css, className, rule, layer = 0) => { layer <<= 28; rules2 = []; stringify2([], className ? "." + escape(className) : "", rule ? rule.v.reduceRight(variantPresedence, layer) : layer, css, rule && rule.i); return rules2; }; }; // src/twind/inject.ts var inject = (sheet, mode2, init, context) => { let sortedPrecedences; init((value = []) => sortedPrecedences = value); let insertedRules; init((value = new Set()) => insertedRules = value); return ({ r: css, p: presedence }) => { if (!insertedRules.has(css)) { insertedRules.add(css); const index = sortedInsertionIndex(sortedPrecedences, presedence); try { sheet.insert(css, index); sortedPrecedences.splice(index, 0, presedence); } catch (error) { if (!/:-[mwo]/.test(css)) { mode2.report({ id: "INJECT_CSS_ERROR", css, error }, context); } } } }; }; // src/twind/configure.ts var sanitize = (value, defaultValue, disabled, enabled = defaultValue) => value === false ? disabled : value === true ? enabled : value || defaultValue; var loadMode = mode2 => (typeof mode2 == "string" ? { t: strict, a: warn, i: silent }[mode2[1]] : mode2) || warn; var COMPONENT_PROPS = { _: { value: "", writable: true } }; var configure = (config = {}) => { const theme2 = makeThemeResolver(config.theme); const mode2 = loadMode(config.mode); const hash = sanitize(config.hash, false, false, cyrb32); const important = config.important; let activeRule = { v: [] }; let translateDepth = 0; const lastTranslations = []; const context = { tw: (...tokens) => process(tokens), theme: (section, key, defaultValue) => { var _a; const value = (_a = theme2(section, key, defaultValue)) != null ? _a : mode2.unknown(section, key == null || Array.isArray(key) ? key : key.split("."), defaultValue != null, context); return activeRule.n && value && includes("rg", (typeof value)[5]) ? `calc(${value} * -1)` : value; }, tag: value => hash ? hash(value) : value, css: rules2 => { translateDepth++; const lastTranslationsIndex = lastTranslations.length; try { ; (typeof rules2 == "string" ? parse([rules2]) : rules2).forEach(convert); const css = Object.create(null, COMPONENT_PROPS); for (let index = lastTranslationsIndex; index < lastTranslations.length; index++) { const translation = lastTranslations[index]; if (translation) { switch (typeof translation) { case "object": merge(css, translation, context); break; case "string": css._ += (css._ && " ") + translation; } } } return css; } finally { lastTranslations.length = lastTranslationsIndex; translateDepth--; } } }; const translate2 = translate({ ...corePlugins, ...config.plugins }, context); const doTranslate = rule => { const parentRule = activeRule; activeRule = rule; try { return evalThunk(translate2(rule), context); } finally { activeRule = parentRule; } }; const variants = { ...coreVariants, ...config.variants }; const decorate2 = decorate(config.darkMode || "media", variants, context); const serialize2 = serialize(sanitize(config.prefix, autoprefix, noprefix), variants, context); const sheet = config.sheet || (typeof window == "undefined" ? voidSheet() : cssomSheet(config)); const { init = callback => callback() } = sheet; const inject2 = inject(sheet, mode2, init, context); let idToClassName; init((value = new Map()) => idToClassName = value); const inlineDirectiveName = new WeakMap(); const evaluateFunctions = (key, value) => key == "_" ? void 0 : typeof value == "function" ? JSON.stringify(evalThunk(value, context), evaluateFunctions) : value; const convert = rule => { if (!translateDepth && activeRule.v.length) { rule = { ...rule, v: [...activeRule.v, ...rule.v], $: "" }; } if (!rule.$) { rule.$ = stringifyRule(rule, inlineDirectiveName.get(rule.d)); } let className = translateDepth ? null : idToClassName.get(rule.$); if (className == null) { let translation = doTranslate(rule); if (!rule.$) { rule.$ = cyrb32(JSON.stringify(translation, evaluateFunctions)); inlineDirectiveName.set(rule.d, rule.$); rule.$ = stringifyRule(rule, rule.$); } if (translation && typeof translation == "object") { rule.v = rule.v.map(prepareVariantSelector); if (important) rule.i = important; translation = decorate2(translation, rule); if (translateDepth) { lastTranslations.push(translation); } else { const layer = typeof rule.d == "function" ? typeof translation._ == "string" ? 1 : 3 : 2; className = hash || typeof rule.d == "function" ? (hash || cyrb32)(layer + rule.$) : rule.$; serialize2(translation, className, rule, layer).forEach(inject2); if (translation._) { className += " " + translation._; } } } else { if (typeof translation == "string") { className = translation; } else { className = rule.$; mode2.report({ id: "UNKNOWN_DIRECTIVE", rule: className }, context); } if (translateDepth && typeof rule.d !== "function") { lastTranslations.push(className); } } if (!translateDepth) { idToClassName.set(rule.$, className); ensureMaxSize(idToClassName, 3e4); } } return className; }; const process = tokens => join(parse(tokens).map(convert).filter(Boolean), " "); const preflight = sanitize(config.preflight, identity, false); if (preflight) { const css = createPreflight(theme2); const styles = serialize2(typeof preflight == "function" ? evalThunk(preflight(css, context), context) || css : { ...css, ...preflight }); init((injected = (styles.forEach(inject2), true)) => injected); } return { init: () => mode2.report({ id: "LATE_SETUP_CALL" }, context), process }; }; // src/twind/instance.ts var create = config => { let process = tokens => { init(); return process(tokens); }; let init = config2 => { ({ process, init } = configure(config2)); }; if (config) init(config); let context; const fromContext = key => () => { if (!context) { process([_4 => { context = _4; return ""; }]); } return context[key]; }; return { tw: Object.defineProperties((...tokens) => process(tokens), { theme: { get: fromContext("theme") } }), setup: config2 => init(config2) }; }; // src/twind/default.ts var { tw, setup } = /* @__PURE__ */create(); setup({ preflight: false, hash: true }); const equalFn = (a, b) => a === b; const $PROXY = Symbol("solid-proxy"); const $TRACK = Symbol("solid-track"); const $DEVCOMP = Symbol("solid-dev-component"); const signalOptions = { equals: equalFn }; let runEffects = runQueue; const STALE = 1; const PENDING = 2; const UNOWNED = { owned: null, cleanups: null, context: null, owner: null }; var Owner = null; let Transition = null; let Listener = null; let Updates = null; let Effects = null; let ExecCount = 0; function createRoot(fn, detachedOwner) { const listener = Listener, owner = Owner, unowned = fn.length === 0, root = unowned ? UNOWNED : { owned: null, cleanups: null, context: null, owner: detachedOwner === undefined ? owner : detachedOwner }, updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root))); Owner = root; Listener = null; try { return runUpdates(updateFn, true); } finally { Listener = listener; Owner = owner; } } function createSignal(value, options) { options = options ? Object.assign({}, signalOptions, options) : signalOptions; const s = { value, observers: null, observerSlots: null, comparator: options.equals || undefined }; const setter = value => { if (typeof value === "function") { value = value(s.value); } return writeSignal(s, value); }; return [readSignal.bind(s), setter]; } function createRenderEffect(fn, value, options) { const c = createComputation(fn, value, false, STALE); updateComputation(c); } function createEffect(fn, value, options) { runEffects = runUserEffects; const c = createComputation(fn, value, false, STALE); if (!options || !options.render) c.user = true; Effects ? Effects.push(c) : updateComputation(c); } function createMemo(fn, value, options) { options = options ? Object.assign({}, signalOptions, options) : signalOptions; const c = createComputation(fn, value, true, 0); c.observers = null; c.observerSlots = null; c.comparator = options.equals || undefined; updateComputation(c); return readSignal.bind(c); } function batch(fn) { return runUpdates(fn, false); } function untrack(fn) { if (Listener === null) return fn(); const listener = Listener; Listener = null; try { return fn(); } finally { Listener = listener; } } function on(deps, fn, options) { const isArray = Array.isArray(deps); let prevInput; let defer = options && options.defer; return prevValue => { let input; if (isArray) { input = Array(deps.length); for (let i = 0; i < deps.length; i++) input[i] = deps[i](); } else input = deps(); if (defer) { defer = false; return undefined; } const result = untrack(() => fn(input, prevInput, prevValue)); prevInput = input; return result; }; } function onMount(fn) { createEffect(() => untrack(fn)); } function onCleanup(fn) { if (Owner === null) ;else if (Owner.cleanups === null) Owner.cleanups = [fn];else Owner.cleanups.push(fn); return fn; } function getListener() { return Listener; } function getOwner() { return Owner; } function children(fn) { const children = createMemo(fn); const memo = createMemo(() => resolveChildren(children())); memo.toArray = () => { const c = memo(); return Array.isArray(c) ? c : c != null ? [c] : []; }; return memo; } function readSignal() { if (this.sources && (this.state)) { if ((this.state) === STALE) updateComputation(this);else { const updates = Updates; Updates = null; runUpdates(() => lookUpstream(this), false); Updates = updates; } } if (Listener) { const sSlot = this.observers ? this.observers.length : 0; if (!Listener.sources) { Listener.sources = [this]; Listener.sourceSlots = [sSlot]; } else { Listener.sources.push(this); Listener.sourceSlots.push(sSlot); } if (!this.observers) { this.observers = [Listener]; this.observerSlots = [Listener.sources.length - 1]; } else { this.observers.push(Listener); this.observerSlots.push(Listener.sources.length - 1); } } return this.value; } function writeSignal(node, value, isComp) { let current = node.value; if (!node.comparator || !node.comparator(current, value)) { node.value = value; if (node.observers && node.observers.length) { runUpdates(() => { for (let i = 0; i < node.observers.length; i += 1) { const o = node.observers[i]; const TransitionRunning = Transition && Transition.running; if (TransitionRunning && Transition.disposed.has(o)) ; if (TransitionRunning ? !o.tState : !o.state) { if (o.pure) Updates.push(o);else Effects.push(o); if (o.observers) markDownstream(o); } if (!TransitionRunning) o.state = STALE; } if (Updates.length > 10e5) { Updates = []; if (false) ; throw new Error(); } }, false); } } return value; } function updateComputation(node) { if (!node.fn) return; cleanNode(node); const owner = Owner, listener = Listener, time = ExecCount; Listener = Owner = node; runComputation(node, node.value, time); Listener = listener; Owner = owner; } function runComputation(node, value, time) { let nextValue; try { nextValue = node.fn(value); } catch (err) { if (node.pure) { { node.state = STALE; node.owned && node.owned.forEach(cleanNode); node.owned = null; } } node.updatedAt = time + 1; return handleError(err); } if (!node.updatedAt || node.updatedAt <= time) { if (node.updatedAt != null && "observers" in node) { writeSignal(node, nextValue); } else node.value = nextValue; node.updatedAt = time; } } function createComputation(fn, init, pure, state = STALE, options) { const c = { fn, state: state, updatedAt: null, owned: null, sources: null, sourceSlots: null, cleanups: null, value: init, owner: Owner, context: null, pure }; if (Owner === null) ;else if (Owner !== UNOWNED) { { if (!Owner.owned) Owner.owned = [c];else Owner.owned.push(c); } } return c; } function runTop(node) { if ((node.state) === 0) return; if ((node.state) === PENDING) return lookUpstream(node); if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node); const ancestors = [node]; while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) { if (node.state) ancestors.push(node); } for (let i = ancestors.length - 1; i >= 0; i--) { node = ancestors[i]; if ((node.state) === STALE) { updateComputation(node); } else if ((node.state) === PENDING) { const updates = Updates; Updates = null; runUpdates(() => lookUpstream(node, ancestors[0]), false); Updates = updates; } } } function runUpdates(fn, init) { if (Updates) return fn(); let wait = false; if (!init) Updates = []; if (Effects) wait = true;else Effects = []; ExecCount++; try { const res = fn(); completeUpdates(wait); return res; } catch (err) { if (!wait) Effects = null; Updates = null; handleError(err); } } function completeUpdates(wait) { if (Updates) { runQueue(Updates); Updates = null; } if (wait) return; const e = Effects; Effects = null; if (e.length) runUpdates(() => runEffects(e), false); } function runQueue(queue) { for (let i = 0; i < queue.length; i++) runTop(queue[i]); } function runUserEffects(queue) { let i, userLength = 0; for (i = 0; i < queue.length; i++) { const e = queue[i]; if (!e.user) runTop(e);else queue[userLength++] = e; } for (i = 0; i < userLength; i++) runTop(queue[i]); } function lookUpstream(node, ignore) { node.state = 0; for (let i = 0; i < node.sources.length; i += 1) { const source = node.sources[i]; if (source.sources) { const state = source.state; if (state === STALE) { if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source); } else if (state === PENDING) lookUpstream(source, ignore); } } } function markDownstream(node) { for (let i = 0; i < node.observers.length; i += 1) { const o = node.observers[i]; if (!o.state) { o.state = PENDING; if (o.pure) Updates.push(o);else Effects.push(o); o.observers && markDownstream(o); } } } function cleanNode(node) { let i; if (node.sources) { while (node.sources.length) { const source = node.sources.pop(), index = node.sourceSlots.pop(), obs = source.observers; if (obs && obs.length) { const n = obs.pop(), s = source.observerSlots.pop(); if (index < obs.length) { n.sourceSlots[s] = index; obs[index] = n; source.observerSlots[index] = s; } } } } if (node.owned) { for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]); node.owned = null; } if (node.cleanups) { for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i](); node.cleanups = null; } node.state = 0; node.context = null; } function handleError(err) { throw err; } function resolveChildren(children) { if (typeof children === "function" && !children.length) return resolveChildren(children()); if (Array.isArray(children)) { const results = []; for (let i = 0; i < children.length; i++) { const result = resolveChildren(children[i]); Array.isArray(result) ? results.push.apply(results, result) : results.push(result); } return results; } return children; } const FALLBACK = Symbol("fallback"); function dispose(d) { for (let i = 0; i < d.length; i++) d[i](); } function mapArray(list, mapFn, options = {}) { let items = [], mapped = [], disposers = [], len = 0, indexes = mapFn.length > 1 ? [] : null; onCleanup(() => dispose(disposers)); return () => { let newItems = list() || [], i, j; newItems[$TRACK]; return untrack(() => { let newLen = newItems.length, newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item; if (newLen === 0) { if (len !== 0) { dispose(disposers); disposers = []; items = []; mapped = []; len = 0; indexes && (indexes = []); } if (options.fallback) { items = [FALLBACK]; mapped[0] = createRoot(disposer => { disposers[0] = disposer; return options.fallback(); }); len = 1; } } else if (len === 0) { mapped = new Array(newLen); for (j = 0; j < newLen; j++) { items[j] = newItems[j]; mapped[j] = createRoot(mapper); } len = newLen; } else { temp = new Array(newLen); tempdisposers = new Array(newLen); indexes && (tempIndexes = new Array(newLen)); for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++); for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) { temp[newEnd] = mapped[end]; tempdisposers[newEnd] = disposers[end]; indexes && (tempIndexes[newEnd] = indexes[end]); } newIndices = new Map(); newIndicesNext = new Array(newEnd + 1); for (j = newEnd; j >= start; j--) { item = newItems[j]; i = newIndices.get(item); newIndicesNext[j] = i === undefined ? -1 : i; newIndices.set(item, j); } for (i = start; i <= end; i++) { item = items[i]; j = newIndices.get(item); if (j !== undefined && j !== -1) { temp[j] = mapped[i]; tempdisposers[j] = disposers[i]; indexes && (tempIndexes[j] = indexes[i]); j = newIndicesNext[j]; newIndices.set(item, j); } else disposers[i](); } for (j = start; j < newLen; j++) { if (j in temp) { mapped[j] = temp[j]; disposers[j] = tempdisposers[j]; if (indexes) { indexes[j] = tempIndexes[j]; indexes[j](j); } } else mapped[j] = createRoot(mapper); } mapped = mapped.slice(0, len = newLen); items = newItems.slice(0); } return mapped; }); function mapper(disposer) { disposers[j] = disposer; if (indexes) { const [s, set] = createSignal(j); indexes[j] = set; return mapFn(newItems[j], s); } return mapFn(newItems[j]); } }; } function createComponent(Comp, props) { return untrack(() => Comp(props || {})); } function trueFn() { return true; } const propTraps = { get(_, property, receiver) { if (property === $PROXY) return receiver; return _.get(property); }, has(_, property) { if (property === $PROXY) return true; return _.has(property); }, set: trueFn, deleteProperty: trueFn, getOwnPropertyDescriptor(_, property) { return { configurable: true, enumerable: true, get() { return _.get(property); }, set: trueFn, deleteProperty: trueFn }; }, ownKeys(_) { return _.keys(); } }; function splitProps(props, ...keys) { const blocked = new Set(keys.flat()); if ($PROXY in props) { const res = keys.map(k => { return new Proxy({ get(property) { return k.includes(property) ? props[property] : undefined; }, has(property) { return k.includes(property) && property in props; }, keys() { return k.filter(property => property in props); } }, propTraps); }); res.push(new Proxy({ get(property) { return blocked.has(property) ? undefined : props[property]; }, has(property) { return blocked.has(property) ? false : property in props; }, keys() { return Object.keys(props).filter(k => !blocked.has(k)); } }, propTraps)); return res; } const descriptors = Object.getOwnPropertyDescriptors(props); keys.push(Object.keys(descriptors).filter(k => !blocked.has(k))); return keys.map(k => { const clone = {}; for (let i = 0; i < k.length; i++) { const key = k[i]; if (!(key in props)) continue; Object.defineProperty(clone, key, descriptors[key] ? descriptors[key] : { get() { return props[key]; }, set() { return true; }, enumerable: true }); } return clone; }); } const narrowedError = name => `Stale read from <${name}>.`; function For(props) { const fallback = "fallback" in props && { fallback: () => props.fallback }; return createMemo(mapArray(() => props.each, props.children, fallback || undefined)); } function Show(props) { const keyed = props.keyed; const condition = createMemo(() => props.when, undefined, { equals: (a, b) => keyed ? a === b : !a === !b }); return createMemo(() => { const c = condition(); if (c) { const child = props.children; const fn = typeof child === "function" && child.length > 0; return fn ? untrack(() => child(keyed ? c : () => { if (!untrack(condition)) throw narrowedError("Show"); return props.when; })) : child; } return props.fallback; }, undefined, undefined); } function Switch(props) { let keyed = false; const equals = (a, b) => a[0] === b[0] && (keyed ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2]; const conditions = children(() => props.children), evalConditions = createMemo(() => { let conds = conditions(); if (!Array.isArray(conds)) conds = [conds]; for (let i = 0; i < conds.length; i++) { const c = conds[i].when; if (c) { keyed = !!conds[i].keyed; return [i, c, conds[i]]; } } return [-1]; }, undefined, { equals }); return createMemo(() => { const [index, when, cond] = evalConditions(); if (index < 0) return props.fallback; const c = cond.children; const fn = typeof c === "function" && c.length > 0; return fn ? untrack(() => c(keyed ? when : () => { if (untrack(evalConditions)[0] !== index) throw narrowedError("Match"); return cond.when; })) : c; }, undefined, undefined); } function Match(props) { return props; } const booleans = ["allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "disabled", "formnovalidate", "hidden", "indeterminate", "ismap", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "seamless", "selected"]; const Properties = /*#__PURE__*/new Set(["className", "value", "readOnly", "formNoValidate", "isMap", "noModule", "playsInline", ...booleans]); const ChildProperties = /*#__PURE__*/new Set(["innerHTML", "textContent", "innerText", "children"]); const Aliases = /*#__PURE__*/Object.assign(Object.create(null), { className: "class", htmlFor: "for" }); const PropAliases = /*#__PURE__*/Object.assign(Object.create(null), { class: "className", formnovalidate: { $: "formNoValidate", BUTTON: 1, INPUT: 1 }, ismap: { $: "isMap", IMG: 1 }, nomodule: { $: "noModule", SCRIPT: 1 }, playsinline: { $: "playsInline", VIDEO: 1 }, readonly: { $: "readOnly", INPUT: 1, TEXTAREA: 1 } }); function getPropAlias(prop, tagName) { const a = PropAliases[prop]; return typeof a === "object" ? a[tagName] ? a["$"] : undefined : a; } const DelegatedEvents = /*#__PURE__*/new Set(["beforeinput", "click", "dblclick", "contextmenu", "focusin", "focusout", "input", "keydown", "keyup", "mousedown", "mousemove", "mouseout", "mouseover", "mouseup", "pointerdown", "pointermove", "pointerout", "pointerover", "pointerup", "touchend", "touchmove", "touchstart"]); const SVGElements = /*#__PURE__*/new Set(["altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignObject", "g", "glyph", "glyphRef", "hkern", "image", "line", "linearGradient", "marker", "mask", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "set", "stop", "svg", "switch", "symbol", "text", "textPath", "tref", "tspan", "use", "view", "vkern"]); const SVGNamespace = { xlink: "http://www.w3.org/1999/xlink", xml: "http://www.w3.org/XML/1998/namespace" }; function reconcileArrays(parentNode, a, b) { let bLength = b.length, aEnd = a.length, bEnd = bLength, aStart = 0, bStart = 0, after = a[aEnd - 1].nextSibling, map = null; while (aStart < aEnd || bStart < bEnd) { if (a[aStart] === b[bStart]) { aStart++; bStart++; continue; } while (a[aEnd - 1] === b[bEnd - 1]) { aEnd--; bEnd--; } if (aEnd === aStart) { const node = bEnd < bLength ? bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart] : after; while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node); } else if (bEnd === bStart) { while (aStart < aEnd) { if (!map || !map.has(a[aStart])) a[aStart].remove(); aStart++; } } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) { const node = a[--aEnd].nextSibling; parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling); parentNode.insertBefore(b[--bEnd], node); a[aEnd] = b[bEnd]; } else { if (!map) { map = new Map(); let i = bStart; while (i < bEnd) map.set(b[i], i++); } const index = map.get(a[aStart]); if (index != null) { if (bStart < index && index < bEnd) { let i = aStart, sequence = 1, t; while (++i < aEnd && i < bEnd) { if ((t = map.get(a[i])) == null || t !== index + sequence) break; sequence++; } if (sequence > index - bStart) { const node = a[aStart]; while (bStart < index) parentNode.insertBefore(b[bStart++], node); } else parentNode.replaceChild(b[bStart++], a[aStart++]); } else aStart++; } else a[aStart++].remove(); } } } const $$EVENTS = "_$DX_DELEGATE"; function render(code, element, init, options = {}) { let disposer; createRoot(dispose => { disposer = dispose; element === document ? code() : insert(element, code(), element.firstChild ? null : undefined, init); }, options.owner); return () => { disposer(); element.textContent = ""; }; } function template(html, isCE, isSVG) { let node; const create = () => { const t = document.createElement("template"); t.innerHTML = html; return isSVG ? t.content.firstChild.firstChild : t.content.firstChild; }; const fn = isCE ? () => (node || (node = create())).cloneNode(true) : () => untrack(() => document.importNode(node || (node = create()), true)); fn.cloneNode = fn; return fn; } function delegateEvents(eventNames, document = window.document) { const e = document[$$EVENTS] || (document[$$EVENTS] = new Set()); for (let i = 0, l = eventNames.length; i < l; i++) { const name = eventNames[i]; if (!e.has(name)) { e.add(name); document.addEventListener(name, eventHandler); } } } function setAttribute(node, name, value) { if (value == null) node.removeAttribute(name);else node.setAttribute(name, value); } function setAttributeNS(node, namespace, name, value) { if (value == null) node.removeAttributeNS(namespace, name);else node.setAttributeNS(namespace, name, value); } function className(node, value) { if (value == null) node.removeAttribute("class");else node.className = value; } function addEventListener(node, name, handler, delegate) { if (delegate) { if (Array.isArray(handler)) { node[`$$${name}`] = handler[0]; node[`$$${name}Data`] = handler[1]; } else node[`$$${name}`] = handler; } else if (Array.isArray(handler)) { const handlerFn = handler[0]; node.addEventListener(name, handler[0] = e => handlerFn.call(node, handler[1], e)); } else node.addEventListener(name, handler); } function classList(node, value, prev = {}) { const classKeys = Object.keys(value || {}), prevKeys = Object.keys(prev); let i, len; for (i = 0, len = prevKeys.length; i < len; i++) { const key = prevKeys[i]; if (!key || key === "undefined" || value[key]) continue; toggleClassKey(node, key, false); delete prev[key]; } for (i = 0, len = classKeys.length; i < len; i++) { const key = classKeys[i], classValue = !!value[key]; if (!key || key === "undefined" || prev[key] === classValue || !classValue) continue; toggleClassKey(node, key, true); prev[key] = classValue; } return prev; } function style(node, value, prev) { if (!value) return prev ? setAttribute(node, "style") : value; const nodeStyle = node.style; if (typeof value === "string") return nodeStyle.cssText = value; typeof prev === "string" && (nodeStyle.cssText = prev = undefined); prev || (prev = {}); value || (value = {}); let v, s; for (s in prev) { value[s] == null && nodeStyle.removeProperty(s); delete prev[s]; } for (s in value) { v = value[s]; if (v !== prev[s]) { nodeStyle.setProperty(s, v); prev[s] = v; } } return prev; } function spread(node, props = {}, isSVG, skipChildren) { const prevProps = {}; if (!skipChildren) { createRenderEffect(() => prevProps.children = insertExpression(node, props.children, prevProps.children)); } createRenderEffect(() => props.ref && props.ref(node)); createRenderEffect(() => assign(node, props, isSVG, true, prevProps, true)); return prevProps; } function insert(parent, accessor, marker, initial) { if (marker !== undefined && !initial) initial = []; if (typeof accessor !== "function") return insertExpression(parent, accessor, initial, marker); createRenderEffect(current => insertExpression(parent, accessor(), current, marker), initial); } function assign(node, props, isSVG, skipChildren, prevProps = {}, skipRef = false) { props || (props = {}); for (const prop in prevProps) { if (!(prop in props)) { if (prop === "children") continue; prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef); } } for (const prop in props) { if (prop === "children") { if (!skipChildren) insertExpression(node, props.children); continue; } const value = props[prop]; prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef); } } function toPropertyName(name) { return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase()); } function toggleClassKey(node, key, value) { const classNames = key.trim().split(/\s+/); for (let i = 0, nameLen = classNames.length; i < nameLen; i++) node.classList.toggle(classNames[i], value); } function assignProp(node, prop, value, prev, isSVG, skipRef) { let isCE, isProp, isChildProp, propAlias, forceProp; if (prop === "style") return style(node, value, prev); if (prop === "classList") return classList(node, value, prev); if (value === prev) return prev; if (prop === "ref") { if (!skipRef) value(node); } else if (prop.slice(0, 3) === "on:") { const e = prop.slice(3); prev && node.removeEventListener(e, prev); value && node.addEventListener(e, value); } else if (prop.slice(0, 10) === "oncapture:") { const e = prop.slice(10); prev && node.removeEventListener(e, prev, true); value && node.addEventListener(e, value, true); } else if (prop.slice(0, 2) === "on") { const name = prop.slice(2).toLowerCase(); const delegate = DelegatedEvents.has(name); if (!delegate && prev) { const h = Array.isArray(prev) ? prev[0] : prev; node.removeEventListener(name, h); } if (delegate || value) { addEventListener(node, name, value, delegate); delegate && delegateEvents([name]); } } else if (prop.slice(0, 5) === "attr:") { setAttribute(node, prop.slice(5), value); } else if ((forceProp = prop.slice(0, 5) === "prop:") || (isChildProp = ChildProperties.has(prop)) || !isSVG && ((propAlias = getPropAlias(prop, node.tagName)) || (isProp = Properties.has(prop))) || (isCE = node.nodeName.includes("-"))) { if (forceProp) { prop = prop.slice(5); isProp = true; } if (prop === "class" || prop === "className") className(node, value);else if (isCE && !isProp && !isChildProp) node[toPropertyName(prop)] = value;else node[propAlias || prop] = value; } else { const ns = isSVG && prop.indexOf(":") > -1 && SVGNamespace[prop.split(":")[0]]; if (ns) setAttributeNS(node, ns, prop, value);else setAttribute(node, Aliases[prop] || prop, value); } return value; } function eventHandler(e) { const key = `$$${e.type}`; let node = e.composedPath && e.composedPath()[0] || e.target; if (e.target !== node) { Object.defineProperty(e, "target", { configurable: true, value: node }); } Object.defineProperty(e, "currentTarget", { configurable: true, get() { return node || document; } }); while (node) { const handler = node[key]; if (handler && !node.disabled) { const data = node[`${key}Data`]; data !== undefined ? handler.call(node, data, e) : handler.call(node, e); if (e.cancelBubble) return; } node = node._$host || node.parentNode || node.host; } } function insertExpression(parent, value, current, marker, unwrapArray) { while (typeof current === "function") current = current(); if (value === current) return current; const t = typeof value, multi = marker !== undefined; parent = multi && current[0] && current[0].parentNode || parent; if (t === "string" || t === "number") { if (t === "number") value = value.toString(); if (multi) { let node = current[0]; if (node && node.nodeType === 3) { node.data = value; } else node = document.createTextNode(value); current = cleanChildren(parent, current, marker, node); } else { if (current !== "" && typeof current === "string") { current = parent.firstChild.data = value; } else current = parent.textContent = value; } } else if (value == null || t === "boolean") { current = cleanChildren(parent, current, marker); } else if (t === "function") { createRenderEffect(() => { let v = value(); while (typeof v === "function") v = v(); current = insertExpression(parent, v, current, marker); }); return () => current; } else if (Array.isArray(value)) { const array = []; const currentArray = current && Array.isArray(current); if (normalizeIncomingArray(array, value, current, unwrapArray)) { createRenderEffect(() => current = insertExpression(parent, array, current, marker, true)); return () => current; } if (array.length === 0) { current = cleanChildren(parent, current, marker); if (multi) return current; } else if (currentArray) { if (current.length === 0) { appendNodes(parent, array, marker); } else reconcileArrays(parent, current, array); } else { current && cleanChildren(parent); appendNodes(parent, array); } current = array; } else if (value instanceof Node) { if (Array.isArray(current)) { if (multi) return current = cleanChildren(parent, current, marker, value); cleanChildren(parent, current, null, value); } else if (current == null || current === "" || !parent.firstChild) { parent.appendChild(value); } else parent.replaceChild(value, parent.firstChild); current = value; } else console.warn(`Unrecognized value. Skipped inserting`, value); return current; } function normalizeIncomingArray(normalized, array, current, unwrap) { let dynamic = false; for (let i = 0, len = array.length; i < len; i++) { let item = array[i], prev = current && current[i]; if (item instanceof Node) { normalized.push(item); } else if (item == null || item === true || item === false) ;else if (Array.isArray(item)) { dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic; } else if (typeof item === "function") { if (unwrap) { while (typeof item === "function") item = item(); dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], Array.isArray(prev) ? prev : [prev]) || dynamic; } else { normalized.push(item); dynamic = true; } } else { const value = String(item); if (prev && prev.nodeType === 3) { prev.data = value; normalized.push(prev); } else normalized.push(document.createTextNode(value)); } } return dynamic; } function appendNodes(parent, array, marker = null) { for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker); } function cleanChildren(parent, current, marker, replacement) { if (marker === undefined) return parent.textContent = ""; const node = replacement || document.createTextNode(""); if (current.length) { let inserted = false; for (let i = current.length - 1; i >= 0; i--) { const el = current[i]; if (node !== el) { const isParent = el.parentNode === parent; if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && el.remove(); } else inserted = true; } } else parent.insertBefore(node, marker); return [node]; } const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; function createElement(tagName, isSVG = false) { return isSVG ? document.createElementNS(SVG_NAMESPACE, tagName) : document.createElement(tagName); } function Dynamic(props) { const [p, others] = splitProps(props, ["component"]); const cached = createMemo(() => p.component); return createMemo(() => { const component = cached(); switch (typeof component) { case "function": Object.assign(component, { [$DEVCOMP]: true }); return untrack(() => component(others)); case "string": const isSvg = SVGElements.has(component); const el = createElement(component, isSvg); spread(el, others, isSvg); return el; } }); } var throttle = (callback, wait) => { let isThrottled = false, timeoutId, lastArgs; const throttled = (...args) => { lastArgs = args; if (isThrottled) return; isThrottled = true; timeoutId = setTimeout(() => { callback(...lastArgs); isThrottled = false; }, wait); }; const clear = () => { clearTimeout(timeoutId); isThrottled = false; }; if (getOwner()) onCleanup(clear); return Object.assign(throttled, { clear }); }; var access = v => typeof v === "function" && !v.length ? v() : v; var asArray = value => Array.isArray(value) ? value : value ? [value] : []; function createGMSignal(key, initialValue) { const [signal, setSignal] = createSignal(initialValue); let listener; GMP.addValueChangeListener?.(key, (name, oldValue, newValue, remote) => { if (name === key && (remote === void 0 || remote === true)) read(newValue); }).then(l => listener = l); let effectPaused = false; createEffect(on(signal, () => { if (effectPaused) return; if (signal() == null) { GMP.deleteValue(key); effectPaused = true; setSignal(() => initialValue); effectPaused = false; } else { GMP.setValue(key, signal()); } }, { defer: true })); async function read(newValue) { effectPaused = true; const rawValue = newValue ?? (await GMP.getValue(key)); if (rawValue == null) setSignal(() => initialValue);else setSignal(() => rawValue); effectPaused = false; } const [isReady, setIsReady] = createSignal(false); signal.isReady = isReady; signal.ready = read().then(() => { setIsReady(true); }); onCleanup(() => { if (listener) GMP.removeValueChangeListener?.(listener); }); return [signal, setSignal]; } const [detectionResolution, setDetectionResolution] = createGMSignal("detectionResolution", "M"); const [textDetector, setTextDetector] = createGMSignal("textDetector", "default"); const [translatorService, setTranslatorService] = createGMSignal("translator", "youdao"); const [renderTextOrientation, setRenderTextOrientation] = createGMSignal("renderTextOrientation", "auto"); const [targetLang, setTargetLang] = createGMSignal("targetLang", ""); const [scriptLang, setScriptLang] = createGMSignal("scriptLanguage", ""); const [keepInstances, setKeepInstances] = createGMSignal("keepInstances", "until-reload"); const storageReady = Promise.all([detectionResolution.ready, textDetector.ready, translatorService.ready, renderTextOrientation.ready, targetLang.ready, scriptLang.ready, keepInstances.ready]); var data$1 = { common:{ source:{ "download-image":"正在拉取原图", "download-image-progress":"正在拉取原图({progress})", "download-image-error":"拉取原图出错" }, client:{ submit:"正在提交翻译", "submit-progress":"正在提交翻译({progress})", "submit-error":"提交翻译出错", "download-image":"正在下载图片", "download-image-progress":"正在下载图片({progress})", "download-image-error":"下载图片出错", resize:"正在缩放图片", merging:"正在合并图层" }, status:{ "default":"未知状态", pending:"正在等待", "pending-pos":"正在等待,列队还有 {pos} 张图片", upscaling:"正在放大图片", detection:"正在检测文本", ocr:"正在识别文本", "mask-generation":"正在生成文本掩码", inpainting:"正在修补图片", translating:"正在翻译文本", rendering:"正在渲染", downscaling:"正在缩小图片", finished:"正在整理结果", error:"翻译出错", "error-lang":"你选择的翻译服务不支持你选择的语言", "error-translating":"翻译服务没有返回任何文本", "error-with-id":"翻译出错 (ID: {id})" }, control:{ translate:"翻译", batch:"翻译全部 ({count})", reset:"还原" }, batch:{ progress:"翻译中 ({count}/{total})", finish:"翻译完成", error:"翻译完成(有失败)" } }, settings:{ title:"Cotrans 图片翻译器设置", "inline-options-title":"设置当前翻译", "detection-resolution":"文本扫描清晰度", "text-detector":"文本扫描器", "text-detector-options":{ "default":"默认" }, translator:"翻译服务", "render-text-orientation":"渲染字体方向", "render-text-orientation-options":{ auto:"跟随原文本", horizontal:"仅限水平", vertical:"仅限垂直" }, "target-language":"翻译语言", "target-language-options":{ auto:"跟随网页语言" }, "script-language":"用户脚本语言", "script-language-options":{ auto:"跟随网页语言" }, reset:"重置所有设置", "detection-resolution-desc":"设置检测图片文本所用的清晰度,小文字适合使用更高的清晰度。", "text-detector-desc":"设置使用的文本扫描器。", "translator-desc":"设置翻译图片所用的翻译服务。", "render-text-orientation-desc":"设置嵌字的文本方向。", "target-language-desc":"设置图片翻译后的语言。", "script-language-desc":"设置此用户脚本的语言。", "translator-options":{ none:"None (删除文字)" }, "keep-instances-options":{ "until-reload":"直到页面刷新", "until-navigate":"直到下次跳转" }, "keep-instances":"保留翻译进度", "keep-instances-desc":"设置翻译进度的保留时间。 翻译进度即图片的翻译状态和翻译结果。 保留更多的翻译进度会占用更多的内存。", "force-retry":"强制重试 (忽略缓存)" }, sponsor:{ text:"制作不易,请考虑赞助我们!" } }; data$1.common; data$1.settings; data$1.sponsor; var data = { common:{ source:{ "download-image":"Downloading original image", "download-image-progress":"Downloading original image ({progress})", "download-image-error":"Error during original image download" }, client:{ submit:"Submitting translation", "submit-progress":"Submitting translation ({progress})", "submit-error":"Error during translation submission", "download-image":"Downloading translated image", "download-image-progress":"Downloading translated image ({progress})", "download-image-error":"Error during translated image download", resize:"Resizing image", merging:"Merging layers" }, status:{ "default":"Unknown status", pending:"Pending", "pending-pos":"Pending, {pos} in queue", upscaling:"Upscaling", detection:"Detecting text", ocr:"Scanning text", "mask-generation":"Generating mask", inpainting:"Inpainting", translating:"Translating", rendering:"Rendering", downscaling:"Downscaling", finished:"Finishing", error:"Error during translation", "error-lang":"Your target language is not supported by the chosen translator", "error-translating":"Did not get any text back from the text translation service", "error-with-id":"Error during translation (ID: {id})" }, control:{ translate:"Translate", batch:"Translate all ({count})", reset:"Reset" }, batch:{ progress:"Translating ({count}/{total} finished)", finish:"Translation finished", error:"Translation finished with errors" } }, settings:{ "detection-resolution":"Text detection resolution", "render-text-orientation":"Render text orientation", "render-text-orientation-options":{ auto:"Follow source", horizontal:"Horizontal only", vertical:"Vertical only" }, reset:"Reset Settings", "target-language":"Translate target language", "target-language-options":{ auto:"Follow website" }, "text-detector":"Text detector", "text-detector-options":{ "default":"Default" }, title:"Cotrans Manga Translator Settings", translator:"Translator", "script-language":"Userscript language", "script-language-options":{ auto:"Follow website language" }, "inline-options-title":"Current Settings", "detection-resolution-desc":"The resolution used to scan texts on an image, higher value are better suited for smaller texts.", "script-language-desc":"Language of this userscript.", "render-text-orientation-desc":"Overwrite the orientation of texts rendered in the translated image.", "target-language-desc":"The language that images are translated to.", "text-detector-desc":"The detector used to scan texts in an image.", "translator-desc":"The translate service used to translate texts.", "translator-options":{ none:"None (remove texts)" }, "keep-instances-options":{ "until-reload":"Until page reload", "until-navigate":"Until next navigation" }, "keep-instances":"Keep translation instances", "keep-instances-desc":"How long before a translation instance is disposed. A translation instance includes the translation state of an image, that is, whether the image is translated or not, and the translation result. Keeping more translation instances will result in more memory consumption.", "force-retry":"Force retry (ignore cache)" }, sponsor:{ text:"If you find this script helpful, please consider supporting us!" } }; data.common; data.settings; data.sponsor; const messages = { "zh-CN": data$1, "en-US": data }; function tryMatchLang(lang2) { if (lang2.startsWith("zh")) return "zh-CN"; if (lang2.startsWith("en")) return "en-US"; return "en-US"; } const [realLang, setRealLang] = createSignal(navigator.language); const lang = createMemo(() => scriptLang() || tryMatchLang(realLang())); function t(key_, props = {}) { return createMemo(() => { const key = access(key_); const segments = key.split("."); const msg = segments.reduce((obj, k) => obj[k], messages[lang()]) ?? segments.reduce((obj, k) => obj[k], messages["zh-CN"]); if (!msg) return key; return msg.replace(/\{([^}]+)\}/g, (_, k) => String(access(access(props)[k])) ?? ""); }); } let langEL; let langObserver; function changeLangEl(el) { if (langEL === el) return; if (langObserver) langObserver.disconnect(); langObserver = new MutationObserver(mutations => { for (const mutation of mutations) { if (mutation.type === "attributes" && mutation.attributeName === "lang") { const target = mutation.target; if (target.lang) setRealLang(target.lang); break; } } }); langObserver.observe(el, { attributes: true }); langEL = el; setRealLang(el.lang); } function BCP47ToISO639(code) { try { const lo = new Intl.Locale(code); switch (lo.language) { case "zh": { switch (lo.script) { case "Hans": return "CHS"; case "Hant": return "CHT"; } switch (lo.region) { case "CN": return "CHS"; case "HK": case "TW": return "CHT"; } return "CHS"; } case "ja": return "JPN"; case "en": return "ENG"; case "ko": return "KOR"; case "vi": return "VIE"; case "cs": return "CSY"; case "nl": return "NLD"; case "fr": return "FRA"; case "de": return "DEU"; case "hu": return "HUN"; case "it": return "ITA"; case "pl": return "PLK"; case "pt": return "PTB"; case "ro": return "ROM"; case "ru": return "RUS"; case "es": return "ESP"; case "tr": return "TRK"; case "uk": return "UKR"; } return "ENG"; } catch (e) { return "ENG"; } } DelegatedEvents.clear(); function createScopedInstance(cb) { return createRoot(dispose => { const instance = cb(); return { ...instance, dispose }; }); } let currentURL; let translator$2; let settingsInjector$2; async function start(translators, settingsInjectors) { await storageReady; async function onUpdate() { await new Promise(resolve => (queueMicrotask ?? setTimeout)(resolve)); if (currentURL !== location.href) { currentURL = location.href; changeLangEl(document.documentElement); if (translator$2?.canKeep?.(currentURL)) { translator$2.onURLChange?.(currentURL); } else { translator$2?.dispose(); translator$2 = void 0; const url = new URL(location.href); const matched = translators.find(t => t.match(url)); if (matched) translator$2 = createScopedInstance(matched.mount); } if (settingsInjector$2?.canKeep?.(currentURL)) { settingsInjector$2.onURLChange?.(currentURL); } else { settingsInjector$2?.dispose(); settingsInjector$2 = void 0; const url = new URL(location.href); const matched = settingsInjectors.find(t => t.match(url)); if (matched) settingsInjector$2 = createScopedInstance(matched.mount); } } } if (window.onurlchange === null) { window.addEventListener("urlchange", onUpdate); } else { const installObserver = new MutationObserver(throttle(onUpdate, 200)); installObserver.observe(document.body, { childList: true, subtree: true }); } onUpdate(); } // src/index.ts var triggerOptions = { equals: false }; var triggerCacheOptions = triggerOptions; var TriggerCache = class { #map; constructor(mapConstructor = Map) { this.#map = new mapConstructor(); } dirty(key) { this.#map.get(key)?.$$(); } track(key) { if (!getListener()) return; let trigger = this.#map.get(key); if (!trigger) { const [$, $$] = createSignal(void 0, triggerCacheOptions); this.#map.set(key, trigger = { $, $$, n: 1 }); } else trigger.n++; onCleanup(() => { if (trigger.n-- === 1) queueMicrotask(() => trigger.n === 0 && this.#map.delete(key)); }); trigger.$(); } }; // src/index.ts var $KEYS = Symbol("track-keys"); var ReactiveMap = class extends Map { #keyTriggers = new TriggerCache(); #valueTriggers = new TriggerCache(); constructor(initial) { super(); if (initial) for (const v of initial) super.set(v[0], v[1]); } // reads has(key) { this.#keyTriggers.track(key); return super.has(key); } get(key) { this.#valueTriggers.track(key); return super.get(key); } get size() { this.#keyTriggers.track($KEYS); return super.size; } keys() { this.#keyTriggers.track($KEYS); return super.keys(); } values() { this.#keyTriggers.track($KEYS); for (const v of super.keys()) this.#valueTriggers.track(v); return super.values(); } entries() { this.#keyTriggers.track($KEYS); for (const v of super.keys()) this.#valueTriggers.track(v); return super.entries(); } // writes set(key, value) { batch(() => { if (super.has(key)) { if (super.get(key) === value) return; } else { this.#keyTriggers.dirty(key); this.#keyTriggers.dirty($KEYS); } this.#valueTriggers.dirty(key); super.set(key, value); }); return this; } delete(key) { const r = super.delete(key); if (r) { batch(() => { this.#keyTriggers.dirty(key); this.#keyTriggers.dirty($KEYS); this.#valueTriggers.dirty(key); }); } return r; } clear() { if (super.size) { batch(() => { for (const v of super.keys()) { this.#keyTriggers.dirty(v); this.#valueTriggers.dirty(v); } super.clear(); this.#keyTriggers.dirty($KEYS); }); } } // callback forEach(callbackfn) { this.#keyTriggers.track($KEYS); super.forEach((value, key) => callbackfn(value, key, this)); } [Symbol.iterator]() { return this.entries(); } }; // src/index.ts function createMutationObserver(initial, b, c) { let defaultOptions, callback; const isSupported = typeof window !== "undefined" && "MutationObserver" in window; if (typeof b === "function") { defaultOptions = {}; callback = b; } else { defaultOptions = b; callback = c; } const instance = isSupported ? new MutationObserver(callback) : void 0; const add = (el, options) => instance?.observe(el, access(options) ?? defaultOptions); const start = () => { asArray(access(initial)).forEach(item => { item instanceof Node ? add(item, defaultOptions) : add(item[0], item[1]); }); }; const stop = () => instance?.disconnect(); onMount(start); onCleanup(stop); return [add, { start, stop, instance, isSupported }]; } const _tmpl$$9 = /*#__PURE__*/template(`