@verbaly/studio 0.60.0 → 0.62.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +64 -17
- package/dist/cli.js.map +1 -1
- package/dist/index.js +64 -17
- package/dist/index.js.map +1 -1
- package/dist/ui/assets/index-DPqrh-r7.js +3 -0
- package/dist/ui/assets/index-YyNwvl9E.css +1 -0
- package/dist/ui/index.html +2 -2
- package/package.json +5 -5
- package/dist/ui/assets/index-BWCfMFep.js +0 -3
- package/dist/ui/assets/index-BYjBNask.css +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["readJob"],"sources":["../src/http.ts","../src/triage.ts","../src/api.ts","../src/jobs.ts","../src/actions.ts","../src/history.ts","../src/assets.ts","../src/guard.ts","../src/server.ts"],"sourcesContent":["// A client mistake is not a server fault, so the status rides with the error, not a blanket 500.\nexport class HttpError extends Error {\n readonly status: number;\n\n constructor(status: number, message: string) {\n super(message.startsWith('[verbaly]') ? message : `[verbaly] ${message}`);\n this.status = status;\n this.name = 'HttpError';\n }\n}\n\nexport const badRequest = (message: string) => new HttpError(400, message);\n\n// The absolute path of someone's project is not the browser's business.\nexport function scrub(message: string, root: string): string {\n return root ? message.split(root).join('.') : message;\n}\n","import type { Catalog } from '@verbaly/compiler';\n\nexport type TriageSignal = 'divergent' | 'collision' | 'echo' | 'digits' | 'code' | 'url';\n\nexport interface TriageReason {\n signal: TriageSignal;\n text: string;\n}\n\nexport type TriageResult = Record<string, TriageReason[]>;\n\n// check() already caught the structure, so these only point at the few worth reading first.\nexport interface TriageInput {\n source: Catalog;\n target: Catalog;\n reviewed: Catalog[];\n}\n\nconst DIGITS = /\\d[\\d.,]*/g;\nconst URLS = /https?:\\/\\/[^\\s<)\"']+/g;\nconst CODE = /<code>([^<]+)<\\/code>/g;\n\nfunction bag(text: string, re: RegExp, normalize?: (v: string) => string): string[] {\n const found = text.match(re) ?? [];\n return (normalize ? found.map(normalize) : found).sort();\n}\n\nfunction same(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n// A number or a url at the end of a clause takes the punctuation with it, and that is not a signal.\nconst trimPunct = (v: string) => v.replace(/[.,;:!?)\\]]+$/, '');\n// A separator is idiomatic (3.09 is 3,09 in Spanish); canonizing keeps 1.5 apart from 15.\nconst bareDigits = (v: string) => trimPunct(v).replaceAll(/[.,]/g, '.');\n\nfunction push(out: TriageResult, key: string, reason: TriageReason): void {\n (out[key] ??= []).push(reason);\n}\n\nexport function triage({ source, target, reviewed }: TriageInput): TriageResult {\n // null-prototype: a source text of \"__proto__\" or \"toString\" is a string, not a member of Object\n const out: TriageResult = Object.create(null);\n const keys = Object.keys(source);\n\n // One source text that two humans rendered two ways is ambiguous, so the machine had no chance.\n const bySource: Record<string, string[]> = Object.create(null);\n for (const key of keys) {\n const text = source[key]?.trim();\n if (text) (bySource[text] ??= []).push(key);\n }\n for (const [text, group] of Object.entries(bySource)) {\n if (group.length < 2) continue;\n const divergent = reviewed.some(\n (catalog) => new Set(group.map((k) => catalog[k]?.trim() ?? '').filter(Boolean)).size > 1,\n );\n if (divergent) {\n for (const key of group) {\n push(out, key, { signal: 'divergent', text: `\"${text}\" was already translated two ways` });\n }\n }\n // The same ambiguity seen from the result instead of from the history.\n const targets = new Set(group.map((key) => target[key]?.trim() ?? '').filter(Boolean));\n if (!divergent && targets.size > 1) {\n for (const key of group) {\n push(out, key, { signal: 'collision', text: `\"${text}\" came back as two different translations` });\n }\n }\n }\n\n for (const key of keys) {\n const src = source[key]?.trim() ?? '';\n const trg = target[key]?.trim() ?? '';\n if (!src || !trg) continue;\n\n // Only the locales with an opinion on this key vote: alone it fires on every do-not-translate.\n const opinions = reviewed.map((c) => c[key]?.trim()).filter((v) => v !== undefined && v !== '');\n if (trg === src && opinions.length > 0 && opinions.every((v) => v !== src)) {\n push(out, key, { signal: 'echo', text: 'still identical to the source' });\n }\n\n // a translation that adds a number is idiomatic (\"refresh\" is \"F5\"); one that changes it is not\n const srcDigits = bag(src, DIGITS, bareDigits);\n if (srcDigits.length > 0 && !same(srcDigits, bag(trg, DIGITS, bareDigits))) {\n push(out, key, { signal: 'digits', text: 'the numbers do not match the source' });\n }\n if (!same(bag(src, URLS, trimPunct), bag(trg, URLS, trimPunct))) {\n push(out, key, { signal: 'url', text: 'a URL changed' });\n }\n if (!same(bag(src, CODE), bag(trg, CODE))) {\n push(out, key, { signal: 'code', text: 'the contents of a <code> span changed' });\n }\n }\n\n return out;\n}\n","import { existsSync } from 'node:fs';\nimport { relative } from 'node:path';\nimport {\n check,\n clearDrafts,\n collectOrigins,\n doctor,\n effectiveDrafts,\n extractProject,\n loadDrafts,\n markDrafts,\n readCatalog,\n saveDrafts,\n status,\n targetLocales,\n validateMessage,\n validatePair,\n writeCatalog,\n} from '@verbaly/compiler';\nimport { DRAFTS_FILE } from '@verbaly/compiler';\nimport type {\n Catalog,\n Catalogs,\n CheckResult,\n DoctorResult,\n Drafts,\n ResolvedConfig,\n StatusResult,\n} from '@verbaly/compiler';\nimport { badRequest } from './http';\nimport { triage, type TriageResult } from './triage';\n\nexport interface StudioProblem {\n scope: string;\n message: string;\n}\n\nexport interface StudioState {\n root: string;\n dir: string;\n sourceLocale: string;\n locales: string[];\n scanning: boolean;\n catalogs: Catalogs;\n origins: Record<string, string[]>;\n status: StatusResult;\n check: CheckResult;\n drafts: Drafts;\n triage: Record<string, TriageResult>;\n problems: StudioProblem[];\n}\n\n// A locale nobody can parse must not take the panel down: Studio is what you open to fix it.\nfunction readAll(cfg: ResolvedConfig): { catalogs: Catalogs; problems: StudioProblem[] } {\n const catalogs: Catalogs = {};\n const problems: StudioProblem[] = [];\n // an empty green panel and a wrong --root look identical, and only this line tells them apart\n if (!existsSync(cfg.dir)) {\n const dir = relative(cfg.root, cfg.dir).replaceAll('\\\\', '/');\n problems.push({ scope: dir, message: '[verbaly] no catalogs here, run npx verbaly init or check --root' });\n }\n for (const locale of cfg.locales) {\n try {\n catalogs[locale] = readCatalog(cfg, locale);\n } catch (error) {\n catalogs[locale] = {};\n problems.push({\n scope: locale,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { catalogs, problems };\n}\n\n// A sidecar nobody can parse is the other file Studio exists to fix, so it degrades like a catalog.\nfunction readDrafts(cfg: ResolvedConfig): { drafts: Drafts; problems: StudioProblem[] } {\n try {\n return { drafts: loadDrafts(cfg), problems: [] };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { drafts: {}, problems: [{ scope: DRAFTS_FILE, message }] };\n }\n}\n\n// check() reports the file a stray key was used in as an absolute path, origins already do not.\nfunction relativize(cfg: ResolvedConfig, result: CheckResult): CheckResult {\n return {\n ...result,\n unknown: result.unknown.map((entry) => ({\n ...entry,\n files: entry.files.map((file) => relative(cfg.root, file).replaceAll('\\\\', '/')),\n })),\n };\n}\n\n// One shot and unpaginated: the biggest catalog we know is past 1600 messages, instant locally.\nexport async function buildState(cfg: ResolvedConfig): Promise<StudioState> {\n const { catalogs, problems } = readAll(cfg);\n const registry = await extractProject(cfg);\n const sidecar = readDrafts(cfg);\n problems.push(...sidecar.problems);\n const live = effectiveDrafts(sidecar.drafts, catalogs);\n const source = (catalogs[cfg.sourceLocale] ?? {}) as Catalog;\n const targets = targetLocales(cfg);\n\n for (const { file, message } of registry.parseErrors()) {\n problems.push({ scope: relative(cfg.root, file).replaceAll('\\\\', '/'), message });\n }\n\n const perLocale: Record<string, TriageResult> = {};\n for (const locale of targets) {\n perLocale[locale] = triage({\n source,\n target: (catalogs[locale] ?? {}) as Catalog,\n // a locale still carrying drafts has not been reviewed, so it cannot be the control\n reviewed: targets\n .filter((other) => other !== locale && !(live[other] ?? []).length)\n .map((other) => (catalogs[other] ?? {}) as Catalog),\n });\n }\n\n return {\n root: cfg.root,\n dir: cfg.dir,\n sourceLocale: cfg.sourceLocale,\n locales: cfg.locales,\n // with include: [] nothing is scanned, so an empty origins map is off, not \"none found\"\n scanning: cfg.include.length > 0,\n catalogs,\n origins: await collectOrigins(cfg, registry),\n status: status(cfg, catalogs, registry, live),\n check: relativize(cfg, check(cfg, catalogs, registry)),\n drafts: live,\n triage: perLocale,\n problems,\n };\n}\n\nexport function health(cfg: ResolvedConfig): Promise<DoctorResult> {\n return doctor(cfg);\n}\n\nexport interface WriteMessageResult {\n locale: string;\n key: string;\n clearedDraft: boolean;\n}\n\n// A human wrote it, so it is reviewed: the rule import already applies in run.ts:447.\nexport function writeMessage(\n cfg: ResolvedConfig,\n locale: string,\n key: string,\n text: string,\n): WriteMessageResult {\n if (locale === cfg.sourceLocale) {\n throw badRequest('the source text lives in your code, Studio never edits it');\n }\n if (!cfg.locales.includes(locale)) {\n throw badRequest(`${locale} is not one of this project's locales`);\n }\n const source = readCatalog(cfg, cfg.sourceLocale);\n // hasOwn, not `in`: `in` walks the prototype, so toString and __proto__ would pass this guard\n if (!Object.hasOwn(source, key)) {\n throw badRequest(`\"${key}\" is not in the source catalog, so Studio will not create it`);\n }\n // '' is untranslated everywhere else, so whitespace is that and not a translation to validate\n const value = text.trim() ? text : '';\n // the same two calls check() makes: validatePair alone misses a plural block with no other case\n const issues = value\n ? [...validateMessage(value, locale), ...validatePair(source[key] as string, value)]\n : [];\n const errors = issues.filter((issue) => issue.severity === 'error');\n if (errors.length) {\n throw badRequest(`${errors.map((issue) => issue.message).join('; ')}`);\n }\n\n const catalog = { ...readCatalog(cfg, locale), [key]: value };\n writeCatalog(cfg, locale, catalog);\n\n const drafts = loadDrafts(cfg);\n const clearedDraft = (drafts[locale] ?? []).includes(key);\n clearDrafts(drafts, locale, [key]);\n saveDrafts(cfg, drafts);\n return { locale, key, clearedDraft };\n}\n\nexport interface ApproveResult {\n locale: string;\n approved: number;\n keys: string[];\n}\n\n// The sidecar is re-read here: saveDrafts writes every locale, so a stale copy drops another's.\nexport function approve(cfg: ResolvedConfig, locale: string, keys?: string[]): ApproveResult {\n if (!cfg.locales.includes(locale)) {\n throw badRequest(`${locale} is not one of this project's locales`);\n }\n const drafts = loadDrafts(cfg);\n const had = drafts[locale] ?? [];\n // the keys it really cleared, because undo has to put back exactly those and nothing else\n const cleared = keys ? had.filter((key) => keys.includes(key)) : [...had];\n clearDrafts(drafts, locale, keys);\n saveDrafts(cfg, drafts);\n return { locale, approved: cleared.length, keys: cleared };\n}\n\n// Undo is not a nicety here: the flag records who wrote the text, so restoring it restores a fact.\nexport function unapprove(cfg: ResolvedConfig, locale: string, keys: string[]): ApproveResult {\n if (!cfg.locales.includes(locale)) {\n throw badRequest(`${locale} is not one of this project's locales`);\n }\n const drafts = loadDrafts(cfg);\n markDrafts(drafts, locale, keys);\n saveDrafts(cfg, drafts);\n return { locale, approved: keys.length, keys };\n}\n","import { badRequest, HttpError } from './http';\n\nexport type JobState = 'running' | 'done' | 'failed';\n\nexport interface Job {\n id: string;\n kind: 'translate';\n state: JobState;\n total: number;\n done: number;\n locale?: string;\n message?: string;\n result?: unknown;\n}\n\n// One at a time, because two runs over the same catalogs is a race over the same files.\nlet current: Job | null = null;\nlet counter = 0;\n\nexport function running(): Job | null {\n return current?.state === 'running' ? current : null;\n}\n\nexport function read(id: string): Job {\n if (!current || current.id !== id) throw new HttpError(404, `no job called \"${id}\"`);\n return current;\n}\n\nexport function start(kind: Job['kind'], total: number): Job {\n if (running()) throw badRequest('a job is already running, wait for it or read its progress');\n counter += 1;\n current = { id: `${kind}-${counter}`, kind, state: 'running', total, done: 0 };\n return current;\n}\n\n// A batch that failed still finishes: the bar reports work attempted, and message says what broke.\nexport function advance(id: string, keys: number, locale: string, error?: string): void {\n if (current?.id !== id) return;\n current.done = Math.min(current.done + keys, current.total);\n current.locale = locale;\n if (error) current.message = error;\n}\n\n// A run that writes part of its work and then fails is a success for what it wrote, so both land.\nexport function finish(id: string, state: 'done' | 'failed', patch: Partial<Job> = {}): void {\n if (current?.id === id) Object.assign(current, patch, { state });\n}\n","import {\n collectOrigins,\n extractProject,\n loadCatalogs,\n resolveProvider,\n syncCatalogs,\n translateCatalogs,\n writeCatalog,\n writeDts,\n markDrafts,\n loadDrafts,\n saveDrafts,\n} from '@verbaly/compiler';\nimport type { ResolvedConfig } from '@verbaly/compiler';\nimport { badRequest } from './http';\nimport { advance, finish, start, type Job } from './jobs';\n\nexport interface ExtractResult {\n added: Record<string, string[]>;\n // only the source locale counts as new text: a target gains a blank for every gap it had\n found: number;\n messages: number;\n}\n\n// Local, fast and free, so it answers in the same request instead of becoming a job.\nexport async function runExtract(cfg: ResolvedConfig): Promise<ExtractResult> {\n if (!cfg.include.length) {\n throw badRequest('source scanning is off (include: []), so there is nothing to extract');\n }\n const registry = await extractProject(cfg);\n const catalogs = loadCatalogs(cfg);\n const result = syncCatalogs(cfg, catalogs, registry);\n for (const locale of cfg.locales) writeCatalog(cfg, locale, catalogs[locale] ?? {});\n // the types come from the source catalog, and cfg.dts false means the project opted out\n if (cfg.dts !== false) writeDts(cfg, catalogs[cfg.sourceLocale] ?? {}, cfg.dts);\n const found = result.added[cfg.sourceLocale]?.length ?? 0;\n return { added: result.added, found, messages: registry.messages().size };\n}\n\nexport interface Plan {\n pending: Record<string, string[]>;\n total: number;\n}\n\n// translate is the one command that spends money and minutes, so the panel always shows the bill.\nexport async function planTranslate(cfg: ResolvedConfig, locales?: string[]): Promise<Plan> {\n const provider = await resolveProvider(cfg);\n const catalogs = loadCatalogs(cfg);\n const result = await translateCatalogs(cfg, catalogs, provider, { locales, dryRun: true });\n const total = Object.values(result.pending).reduce((n, keys) => n + keys.length, 0);\n return { pending: result.pending, total };\n}\n\nexport async function startTranslate(cfg: ResolvedConfig, locales?: string[]): Promise<Job> {\n const provider = await resolveProvider(cfg);\n // the job carries its own denominator, so progress reads the same whether or not you asked first\n const plan = await planTranslate(cfg, locales);\n const job = start('translate', plan.total);\n const id = job.id;\n\n // the run outlives this request on purpose: the client asks the job how it is going\n void (async () => {\n try {\n const catalogs = loadCatalogs(cfg);\n const result = await translateCatalogs(cfg, catalogs, provider, {\n locales,\n batchSize: cfg.translate.batchSize,\n concurrency: cfg.translate.concurrency,\n retries: cfg.translate.retries,\n origins: await collectOrigins(cfg),\n onProgress: (p) => advance(id, p.keys, p.locale, p.error),\n });\n for (const [locale, keys] of Object.entries(result.translated)) {\n if (keys.length) writeCatalog(cfg, locale, catalogs[locale] ?? {});\n }\n // what a machine wrote stays a draft: the panel does not get to change that rule\n const drafts = loadDrafts(cfg);\n for (const [locale, keys] of Object.entries(result.translated)) {\n markDrafts(drafts, locale, keys);\n }\n saveDrafts(cfg, drafts);\n finish(id, result.failed.length ? 'failed' : 'done', {\n result,\n message: result.failed.length ? `${result.failed.length} batches did not answer` : undefined,\n });\n } catch (error) {\n finish(id, 'failed', { message: error instanceof Error ? error.message : String(error) });\n }\n })();\n\n return job;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { relative } from 'node:path';\nimport type { ResolvedConfig } from '@verbaly/compiler';\n\nconst run = promisify(execFile);\n\nexport interface Commit {\n sha: string;\n author: string;\n date: string;\n subject: string;\n}\n\n// one field separator that no subject can contain, written as the escape and never as the byte\nconst FIELD = '\u001f';\nconst FORMAT = `--format=%H${FIELD}%an${FIELD}%aI${FIELD}%s`;\n\n// split out so the shape of a log line is tested without a repository and without writing one\nexport function parseLog(stdout: string): Commit[] {\n const commits: Commit[] = [];\n for (const line of stdout.split('\\n')) {\n const [sha, author, date, ...rest] = line.split(FIELD);\n // a subject holds anything but a newline, so it is the last field and is rejoined\n if (!sha || !author || !date || !rest.length) continue;\n commits.push({ sha: sha.slice(0, 7), author, date, subject: rest.join(FIELD) });\n }\n return commits;\n}\n\n// git is asked, never assumed: no repository and no git both mean there is no history to show\nexport async function catalogHistory(cfg: ResolvedConfig, limit = 5): Promise<Commit[]> {\n const dir = relative(cfg.root, cfg.dir).replaceAll('\\\\', '/') || '.';\n try {\n const { stdout } = await run('git', ['log', `-n${limit}`, FORMAT, '--', dir], {\n cwd: cfg.root,\n timeout: 3000,\n windowsHide: true,\n });\n return parseLog(stdout);\n } catch {\n return [];\n }\n}\n","import { existsSync, readFileSync, statSync } from 'node:fs';\nimport { join, normalize, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// the built panel sits beside the compiled server, so it is found relative to this file, never cwd\nconst UI = resolve(fileURLToPath(new URL('.', import.meta.url)), 'ui');\n\nconst TYPES: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.woff2': 'font/woff2',\n '.json': 'application/json; charset=utf-8',\n '.ico': 'image/x-icon',\n};\n\nexport interface Asset {\n body: Buffer;\n type: string;\n}\n\nexport const uiBuilt = (): boolean => existsSync(join(UI, 'index.html'));\n\n// A path is resolved and then checked to still be inside UI: ../ and an absolute one both land out.\nexport function readAsset(pathname: string): Asset | undefined {\n const wanted = pathname === '/' ? '/index.html' : pathname;\n const target = resolve(join(UI, normalize(wanted)));\n if (target !== UI && !target.startsWith(UI + (process.platform === 'win32' ? '\\\\' : '/'))) {\n return undefined;\n }\n if (!existsSync(target) || !statSync(target).isFile()) return undefined;\n const dot = target.lastIndexOf('.');\n return {\n body: readFileSync(target),\n type: TYPES[target.slice(dot).toLowerCase()] ?? 'application/octet-stream',\n };\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport interface GuardOptions {\n port: number;\n token: string;\n}\n\n// A local server that writes files is reachable from any page the browser has open.\nexport function newToken(): string {\n return randomBytes(9).toString('base64url');\n}\n\n// Only the two names that resolve to this machine. A DNS rebind arrives with a foreign Host.\nexport function hostAllowed(host: string | undefined, port: number): boolean {\n // a browser omits the port when it is the scheme default, so :80 would 403 every real request\n const names = port === 80 ? ['127.0.0.1', 'localhost'] : [];\n return [`127.0.0.1:${port}`, `localhost:${port}`, ...names].includes(host ?? '');\n}\n\n// No Origin at all is a same-origin navigation or a curl, both fine; a foreign one never is.\nexport function originAllowed(origin: string | undefined, port: number): boolean {\n if (origin === undefined) return true;\n return origin === `http://127.0.0.1:${port}` || origin === `http://localhost:${port}`;\n}\n\n// Compared in constant time so the token cannot be guessed one character at a time.\nexport function tokenMatches(given: string | null, expected: string): boolean {\n if (given === null) return false;\n const a = Buffer.from(given);\n const b = Buffer.from(expected);\n return a.length === b.length && timingSafeEqual(a, b);\n}\n\nexport interface GuardVerdict {\n ok: boolean;\n status: number;\n reason: string;\n}\n\nconst PASS: GuardVerdict = { ok: true, status: 200, reason: '' };\n\nexport function guardRequest(\n headers: { host?: string; origin?: string },\n url: URL,\n { port, token }: GuardOptions,\n): GuardVerdict {\n if (!hostAllowed(headers.host, port)) {\n return { ok: false, status: 403, reason: '[verbaly] unexpected Host header' };\n }\n if (!originAllowed(headers.origin, port)) {\n return { ok: false, status: 403, reason: '[verbaly] cross-origin request' };\n }\n if (!tokenMatches(url.searchParams.get('t'), token)) {\n return { ok: false, status: 401, reason: '[verbaly] missing or wrong token, open the printed url' };\n }\n return PASS;\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport type { ResolvedConfig } from '@verbaly/compiler';\nimport { approve, buildState, health, unapprove, writeMessage } from './api';\nimport { planTranslate, runExtract, startTranslate } from './actions';\nimport { read as readJob, running } from './jobs';\nimport { catalogHistory } from './history';\nimport { readAsset, uiBuilt } from './assets';\nimport { guardRequest, newToken } from './guard';\nimport { HttpError, badRequest, scrub } from './http';\n\nexport interface StudioServer {\n server: Server;\n port: number;\n token: string;\n url: string;\n close: () => Promise<void>;\n}\n\nexport interface StartOptions {\n port?: number;\n token?: string;\n}\n\nconst DEFAULT_PORT = 4747;\nconst MAX_BODY = 1_000_000;\n\nfunction send(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-store',\n });\n res.end(JSON.stringify(body));\n}\n\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n size += (chunk as Buffer).length;\n if (size > MAX_BODY) throw new HttpError(413, 'request body too large');\n chunks.push(chunk as Buffer);\n }\n if (!chunks.length) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(Buffer.concat(chunks).toString('utf8'));\n } catch {\n throw badRequest('body is not valid JSON');\n }\n // null and an array both pass typeof 'object', and reading .text off them is a 500\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw badRequest('body must be a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction segment(raw: string | undefined, what: string): string {\n let value: string;\n try {\n value = decodeURIComponent(raw ?? '');\n } catch {\n throw badRequest(`the ${what} in the url is not valid percent-encoding`);\n }\n if (!value) throw badRequest(`the url is missing a ${what}`);\n return value;\n}\n\n// One page, JSON on every route: a framework would only add a dependency to a local tool.\nexport function createStudioApp(cfg: ResolvedConfig, port: number, token: string) {\n return async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n // The url is built inside the try: `GET //` throws, and out here that would kill the process.\n try {\n let url: URL;\n try {\n url = new URL(req.url ?? '/', `http://127.0.0.1:${port}`);\n } catch {\n throw badRequest('the request target is not a valid url');\n }\n\n const api = url.pathname.startsWith('/api/');\n const verdict = guardRequest({ host: req.headers.host, origin: req.headers.origin }, url, {\n port,\n token,\n });\n // the panel files are the published npm package: only the project data needs a token\n if (!verdict.ok && (api || verdict.status !== 401)) {\n send(res, verdict.status, { error: verdict.reason });\n return;\n }\n\n if (!api && req.method === 'GET') {\n const asset = readAsset(url.pathname);\n if (asset) {\n res.writeHead(200, { 'content-type': asset.type, 'cache-control': 'no-store' });\n res.end(asset.body);\n return;\n }\n if (url.pathname === '/' && !uiBuilt()) {\n throw new HttpError(500, 'the panel is not in this install, so only /api/* answers here');\n }\n }\n\n if (req.method === 'GET' && url.pathname === '/api/state') {\n send(res, 200, await buildState(cfg));\n return;\n }\n if (req.method === 'GET' && url.pathname === '/api/history') {\n send(res, 200, { commits: await catalogHistory(cfg) });\n return;\n }\n if (req.method === 'GET' && url.pathname === '/api/health') {\n send(res, 200, await health(cfg));\n return;\n }\n if (req.method === 'PUT' && url.pathname.startsWith('/api/message/')) {\n const rest = url.pathname.slice('/api/message/'.length).split('/');\n const locale = segment(rest[0], 'locale');\n const key = segment(rest.slice(1).join('/'), 'key');\n const body = await readJson(req);\n if (typeof body.text !== 'string') throw badRequest('body needs a \"text\" string');\n send(res, 200, writeMessage(cfg, locale, key, body.text));\n return;\n }\n if (req.method === 'POST' && url.pathname === '/api/approve') {\n const body = await readJson(req);\n if (typeof body.locale !== 'string') throw badRequest('body needs a \"locale\" string');\n const keys = Array.isArray(body.keys)\n ? body.keys.filter((k): k is string => typeof k === 'string')\n : undefined;\n if (body.undo === true) {\n if (!keys?.length) throw badRequest('undoing needs the \"keys\" it should put back');\n send(res, 200, unapprove(cfg, body.locale, keys));\n return;\n }\n send(res, 200, approve(cfg, body.locale, keys));\n return;\n }\n if (req.method === 'POST' && url.pathname === '/api/extract') {\n send(res, 200, await runExtract(cfg));\n return;\n }\n if (req.method === 'GET' && url.pathname === '/api/translate') {\n const locales = url.searchParams.getAll('locale');\n send(res, 200, await planTranslate(cfg, locales.length ? locales : undefined));\n return;\n }\n if (req.method === 'POST' && url.pathname === '/api/translate') {\n const body = await readJson(req);\n const locales = Array.isArray(body.locales)\n ? body.locales.filter((l): l is string => typeof l === 'string')\n : undefined;\n send(res, 200, await startTranslate(cfg, locales?.length ? locales : undefined));\n return;\n }\n // a reload loses the id, so the panel asks what is running rather than losing the bar\n if (req.method === 'GET' && url.pathname === '/api/job') {\n send(res, 200, running());\n return;\n }\n if (req.method === 'GET' && url.pathname.startsWith('/api/job/')) {\n send(res, 200, readJob(segment(url.pathname.slice('/api/job/'.length), 'job id')));\n return;\n }\n\n send(res, 404, { error: `[verbaly] no route for ${req.method} ${url.pathname}` });\n } catch (error) {\n const status = error instanceof HttpError ? error.status : 500;\n const message = error instanceof Error ? error.message : String(error);\n send(res, status, { error: scrub(message, cfg.root) });\n }\n };\n}\n\n// A busy port climbs instead of failing: this is a local tool, not a service on a fixed address.\nfunction listen(server: Server, port: number, attemptsLeft: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const onError = (error: NodeJS.ErrnoException) => {\n if (error.code === 'EADDRINUSE' && attemptsLeft > 0) {\n server.removeListener('error', onError);\n resolve(listen(server, port + 1, attemptsLeft - 1));\n return;\n }\n reject(error);\n };\n server.once('error', onError);\n server.listen(port, '127.0.0.1', () => {\n server.removeListener('error', onError);\n // port 0 asks the system to pick, so the bound address is the only place the answer is\n const bound = server.address() as AddressInfo | string | null;\n resolve(typeof bound === 'object' && bound !== null ? bound.port : port);\n });\n });\n}\n\nexport async function startStudio(\n cfg: ResolvedConfig,\n options: StartOptions = {},\n): Promise<StudioServer> {\n const token = options.token ?? newToken();\n const server = createServer();\n // The handler is attached before listen so no request can arrive without one.\n let port = options.port ?? DEFAULT_PORT;\n server.on('request', (req, res) => void createStudioApp(cfg, port, token)(req, res));\n port = await listen(server, port, 20);\n\n return {\n server,\n port,\n token,\n url: `http://127.0.0.1:${port}/?t=${token}`,\n close: () =>\n new Promise<void>((resolve, reject) =>\n server.close((error) => (error ? reject(error) : resolve())),\n ),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["readJob"],"sources":["../src/http.ts","../src/triage.ts","../src/api.ts","../src/jobs.ts","../src/actions.ts","../src/history.ts","../src/assets.ts","../src/guard.ts","../src/server.ts"],"sourcesContent":["// A client mistake is not a server fault, so the status rides with the error, not a blanket 500.\nexport class HttpError extends Error {\n readonly status: number;\n\n constructor(status: number, message: string) {\n super(message.startsWith('[verbaly]') ? message : `[verbaly] ${message}`);\n this.status = status;\n this.name = 'HttpError';\n }\n}\n\nexport const badRequest = (message: string) => new HttpError(400, message);\n\n// The absolute path of someone's project is not the browser's business.\nexport function scrub(message: string, root: string): string {\n return root ? message.split(root).join('.') : message;\n}\n","import type { Catalog } from '@verbaly/compiler';\n\nexport type TriageSignal = 'divergent' | 'collision' | 'echo' | 'digits' | 'code' | 'url';\n\nexport interface TriageReason {\n signal: TriageSignal;\n text: string;\n}\n\nexport type TriageResult = Record<string, TriageReason[]>;\n\n// check() already caught the structure, so these only point at the few worth reading first.\nexport interface TriageInput {\n source: Catalog;\n target: Catalog;\n reviewed: ReviewedLocale[];\n}\n\n// the locale rides with the catalog because a reason that cannot name the language explains nothing\nexport interface ReviewedLocale {\n locale: string;\n catalog: Catalog;\n}\n\nconst DIGITS = /\\d[\\d.,]*/g;\nconst URLS = /https?:\\/\\/[^\\s<)\"']+/g;\nconst CODE = /<code>([^<]+)<\\/code>/g;\n\nfunction bag(text: string, re: RegExp, normalize?: (v: string) => string): string[] {\n const found = text.match(re) ?? [];\n return (normalize ? found.map(normalize) : found).sort();\n}\n\nfunction same(a: string[], b: string[]): boolean {\n return a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n// A number or a url at the end of a clause takes the punctuation with it, and that is not a signal.\nconst trimPunct = (v: string) => v.replace(/[.,;:!?)\\]]+$/, '');\n// A separator is idiomatic (3.09 is 3,09 in Spanish); canonizing keeps 1.5 apart from 15.\nconst bareDigits = (v: string) => trimPunct(v).replaceAll(/[.,]/g, '.');\n\nfunction push(out: TriageResult, key: string, reason: TriageReason): void {\n (out[key] ??= []).push(reason);\n}\n\n// the column is three short lines, so a reason quotes the evidence and never the whole message\nfunction clip(text: string, max = 42): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nconst quote = (text: string, max?: number) => `\"${clip(text, max)}\"`;\n\n// what the source has and the translation does not, which is the half worth naming\nfunction lost(from: string[], to: string[]): string[] {\n const rest = [...to];\n const out: string[] = [];\n for (const item of from) {\n const at = rest.indexOf(item);\n if (at < 0) out.push(item);\n else rest.splice(at, 1);\n }\n return out;\n}\n\n// \"the numbers moved\" is a label; naming the one that moved is what saves the reader a diff\nfunction movedText(kind: string, from: string[], to: string[]): string {\n const gone = lost(from, to);\n const added = lost(to, from);\n if (gone.length && added.length) {\n return `the source ${kind} ${quote(gone[0]!)}, this one ${kind} ${quote(added[0]!)}`;\n }\n if (gone.length) return `the source ${kind} ${quote(gone[0]!)} and this one does not`;\n return `this one ${kind} ${quote(added[0]!)} and the source does not`;\n}\n\nexport function triage({ source, target, reviewed }: TriageInput): TriageResult {\n // null-prototype: a source text of \"__proto__\" or \"toString\" is a string, not a member of Object\n const out: TriageResult = Object.create(null);\n const keys = Object.keys(source);\n\n // One source text that two humans rendered two ways is ambiguous, so the machine had no chance.\n const bySource: Record<string, string[]> = Object.create(null);\n for (const key of keys) {\n const text = source[key]?.trim();\n if (text) (bySource[text] ??= []).push(key);\n }\n for (const [text, group] of Object.entries(bySource)) {\n if (group.length < 2) continue;\n\n // the first reviewed locale that disagreed with itself, and the two renderings it used\n let split: { locale: string; first: string; second: string } | undefined;\n for (const { locale, catalog } of reviewed) {\n const seen = [...new Set(group.map((k) => catalog[k]?.trim() ?? '').filter(Boolean))];\n if (seen.length > 1) {\n split = { locale, first: seen[0]!, second: seen[1]! };\n break;\n }\n }\n if (split) {\n for (const key of group) {\n push(out, key, {\n signal: 'divergent',\n text: `${split.locale} already says this two ways: ${quote(split.first, 32)} and ${quote(split.second, 32)}`,\n });\n }\n }\n\n // The same ambiguity seen from the result instead of from the history.\n const targets = new Set(group.map((key) => target[key]?.trim() ?? '').filter(Boolean));\n if (!split && targets.size > 1) {\n for (const key of group) {\n const mine = target[key]?.trim() ?? '';\n const other = group.find((k) => k !== key && (target[k]?.trim() ?? '') !== mine && target[k]?.trim());\n push(out, key, {\n signal: 'collision',\n text: other\n ? `${other} has the same source text and says ${quote(target[other]!.trim())}`\n : `${quote(text)} came back as two different translations`,\n });\n }\n }\n }\n\n for (const key of keys) {\n const src = source[key]?.trim() ?? '';\n const trg = target[key]?.trim() ?? '';\n if (!src || !trg) continue;\n\n // Only the locales with an opinion on this key vote: alone it fires on every do-not-translate.\n const voters = reviewed.filter(({ catalog }) => {\n const value = catalog[key]?.trim();\n return value !== undefined && value !== '';\n });\n if (trg === src && voters.length > 0 && voters.every(({ catalog }) => catalog[key]?.trim() !== src)) {\n const names = voters.map(({ locale }) => locale).join(' and ');\n push(out, key, { signal: 'echo', text: `still the source text, and ${names} did translate it` });\n }\n\n // a translation that adds a number is idiomatic (\"refresh\" is \"F5\"); one that changes it is not\n const srcDigits = bag(src, DIGITS, bareDigits);\n const trgDigits = bag(trg, DIGITS, bareDigits);\n if (srcDigits.length > 0 && !same(srcDigits, trgDigits)) {\n push(out, key, { signal: 'digits', text: movedText('says', srcDigits, trgDigits) });\n }\n const srcUrls = bag(src, URLS, trimPunct);\n const trgUrls = bag(trg, URLS, trimPunct);\n if (!same(srcUrls, trgUrls)) {\n push(out, key, { signal: 'url', text: movedText('links to', srcUrls, trgUrls) });\n }\n const srcCode = bag(src, CODE);\n const trgCode = bag(trg, CODE);\n if (!same(srcCode, trgCode)) {\n push(out, key, { signal: 'code', text: movedText('shows the code', srcCode, trgCode) });\n }\n }\n\n return out;\n}\n","import { existsSync } from 'node:fs';\nimport { relative } from 'node:path';\nimport {\n check,\n clearDrafts,\n collectOrigins,\n doctor,\n effectiveDrafts,\n extractProject,\n loadDrafts,\n markDrafts,\n readCatalog,\n saveDrafts,\n status,\n targetLocales,\n validateMessage,\n validatePair,\n writeCatalog,\n} from '@verbaly/compiler';\nimport { DRAFTS_FILE } from '@verbaly/compiler';\nimport type {\n Catalog,\n Catalogs,\n CheckResult,\n DoctorResult,\n Drafts,\n ResolvedConfig,\n StatusResult,\n} from '@verbaly/compiler';\nimport { badRequest } from './http';\nimport { triage, type TriageResult } from './triage';\n\nexport interface StudioProblem {\n scope: string;\n message: string;\n}\n\nexport interface StudioState {\n root: string;\n dir: string;\n sourceLocale: string;\n locales: string[];\n scanning: boolean;\n catalogs: Catalogs;\n origins: Record<string, string[]>;\n status: StatusResult;\n check: CheckResult;\n drafts: Drafts;\n triage: Record<string, TriageResult>;\n problems: StudioProblem[];\n}\n\n// A locale nobody can parse must not take the panel down: Studio is what you open to fix it.\nfunction readAll(cfg: ResolvedConfig): { catalogs: Catalogs; problems: StudioProblem[] } {\n const catalogs: Catalogs = {};\n const problems: StudioProblem[] = [];\n // an empty green panel and a wrong --root look identical, and only this line tells them apart\n if (!existsSync(cfg.dir)) {\n const dir = relative(cfg.root, cfg.dir).replaceAll('\\\\', '/');\n problems.push({ scope: dir, message: '[verbaly] no catalogs here, run npx verbaly init or check --root' });\n }\n for (const locale of cfg.locales) {\n try {\n catalogs[locale] = readCatalog(cfg, locale);\n } catch (error) {\n catalogs[locale] = {};\n problems.push({\n scope: locale,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { catalogs, problems };\n}\n\n// A sidecar nobody can parse is the other file Studio exists to fix, so it degrades like a catalog.\nfunction readDrafts(cfg: ResolvedConfig): { drafts: Drafts; problems: StudioProblem[] } {\n try {\n return { drafts: loadDrafts(cfg), problems: [] };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { drafts: {}, problems: [{ scope: DRAFTS_FILE, message }] };\n }\n}\n\n// check() reports the file a stray key was used in as an absolute path, origins already do not.\nfunction relativize(cfg: ResolvedConfig, result: CheckResult): CheckResult {\n return {\n ...result,\n unknown: result.unknown.map((entry) => ({\n ...entry,\n files: entry.files.map((file) => relative(cfg.root, file).replaceAll('\\\\', '/')),\n })),\n };\n}\n\n// One shot and unpaginated: the biggest catalog we know is past 1600 messages, instant locally.\nexport async function buildState(cfg: ResolvedConfig): Promise<StudioState> {\n const { catalogs, problems } = readAll(cfg);\n const registry = await extractProject(cfg);\n const sidecar = readDrafts(cfg);\n problems.push(...sidecar.problems);\n const live = effectiveDrafts(sidecar.drafts, catalogs);\n const source = (catalogs[cfg.sourceLocale] ?? {}) as Catalog;\n const targets = targetLocales(cfg);\n\n for (const { file, message } of registry.parseErrors()) {\n problems.push({ scope: relative(cfg.root, file).replaceAll('\\\\', '/'), message });\n }\n\n const perLocale: Record<string, TriageResult> = {};\n for (const locale of targets) {\n perLocale[locale] = triage({\n source,\n target: (catalogs[locale] ?? {}) as Catalog,\n // a locale still carrying drafts has not been reviewed, so it cannot be the control\n reviewed: targets\n .filter((other) => other !== locale && !(live[other] ?? []).length)\n .map((other) => ({ locale: other, catalog: (catalogs[other] ?? {}) as Catalog })),\n });\n }\n\n return {\n root: cfg.root,\n dir: cfg.dir,\n sourceLocale: cfg.sourceLocale,\n locales: cfg.locales,\n // with include: [] nothing is scanned, so an empty origins map is off, not \"none found\"\n scanning: cfg.include.length > 0,\n catalogs,\n origins: await collectOrigins(cfg, registry),\n status: status(cfg, catalogs, registry, live),\n check: relativize(cfg, check(cfg, catalogs, registry)),\n drafts: live,\n triage: perLocale,\n problems,\n };\n}\n\nexport function health(cfg: ResolvedConfig): Promise<DoctorResult> {\n return doctor(cfg);\n}\n\nexport interface WriteMessageResult {\n locale: string;\n key: string;\n clearedDraft: boolean;\n}\n\n// A human wrote it, so it is reviewed: the rule import already applies in run.ts:447.\nexport function writeMessage(\n cfg: ResolvedConfig,\n locale: string,\n key: string,\n text: string,\n): WriteMessageResult {\n if (locale === cfg.sourceLocale) {\n throw badRequest('the source text lives in your code, Studio never edits it');\n }\n if (!cfg.locales.includes(locale)) {\n throw badRequest(`${locale} is not one of this project's locales`);\n }\n const source = readCatalog(cfg, cfg.sourceLocale);\n // hasOwn, not `in`: `in` walks the prototype, so toString and __proto__ would pass this guard\n if (!Object.hasOwn(source, key)) {\n throw badRequest(`\"${key}\" is not in the source catalog, so Studio will not create it`);\n }\n // '' is untranslated everywhere else, so whitespace is that and not a translation to validate\n const value = text.trim() ? text : '';\n // the same two calls check() makes: validatePair alone misses a plural block with no other case\n const issues = value\n ? [...validateMessage(value, locale), ...validatePair(source[key] as string, value)]\n : [];\n const errors = issues.filter((issue) => issue.severity === 'error');\n if (errors.length) {\n throw badRequest(`${errors.map((issue) => issue.message).join('; ')}`);\n }\n\n const catalog = { ...readCatalog(cfg, locale), [key]: value };\n writeCatalog(cfg, locale, catalog);\n\n const drafts = loadDrafts(cfg);\n const clearedDraft = (drafts[locale] ?? []).includes(key);\n clearDrafts(drafts, locale, [key]);\n saveDrafts(cfg, drafts);\n return { locale, key, clearedDraft };\n}\n\nexport interface ApproveResult {\n locale: string;\n approved: number;\n keys: string[];\n}\n\n// The sidecar is re-read here: saveDrafts writes every locale, so a stale copy drops another's.\nexport function approve(cfg: ResolvedConfig, locale: string, keys?: string[]): ApproveResult {\n if (!cfg.locales.includes(locale)) {\n throw badRequest(`${locale} is not one of this project's locales`);\n }\n const drafts = loadDrafts(cfg);\n const had = drafts[locale] ?? [];\n // the keys it really cleared, because undo has to put back exactly those and nothing else\n const cleared = keys ? had.filter((key) => keys.includes(key)) : [...had];\n clearDrafts(drafts, locale, keys);\n saveDrafts(cfg, drafts);\n return { locale, approved: cleared.length, keys: cleared };\n}\n\n// Undo is not a nicety here: the flag records who wrote the text, so restoring it restores a fact.\nexport function unapprove(cfg: ResolvedConfig, locale: string, keys: string[]): ApproveResult {\n if (!cfg.locales.includes(locale)) {\n throw badRequest(`${locale} is not one of this project's locales`);\n }\n const drafts = loadDrafts(cfg);\n markDrafts(drafts, locale, keys);\n saveDrafts(cfg, drafts);\n return { locale, approved: keys.length, keys };\n}\n","import { badRequest, HttpError } from './http';\n\nexport type JobState = 'running' | 'done' | 'failed';\n\nexport interface Job {\n id: string;\n kind: 'translate';\n state: JobState;\n total: number;\n done: number;\n locale?: string;\n message?: string;\n result?: unknown;\n}\n\n// One at a time, because two runs over the same catalogs is a race over the same files.\nlet current: Job | null = null;\nlet counter = 0;\n\nexport function running(): Job | null {\n return current?.state === 'running' ? current : null;\n}\n\nexport function read(id: string): Job {\n if (!current || current.id !== id) throw new HttpError(404, `no job called \"${id}\"`);\n return current;\n}\n\nexport function start(kind: Job['kind'], total: number): Job {\n if (running()) throw badRequest('a job is already running, wait for it or read its progress');\n counter += 1;\n current = { id: `${kind}-${counter}`, kind, state: 'running', total, done: 0 };\n return current;\n}\n\n// A batch that failed still finishes: the bar reports work attempted, and message says what broke.\nexport function advance(id: string, keys: number, locale: string, error?: string): void {\n if (current?.id !== id) return;\n current.done = Math.min(current.done + keys, current.total);\n current.locale = locale;\n if (error) current.message = error;\n}\n\n// A run that writes part of its work and then fails is a success for what it wrote, so both land.\nexport function finish(id: string, state: 'done' | 'failed', patch: Partial<Job> = {}): void {\n if (current?.id === id) Object.assign(current, patch, { state });\n}\n","import {\n collectOrigins,\n extractProject,\n loadCatalogs,\n resolveProvider,\n syncCatalogs,\n translateCatalogs,\n writeCatalog,\n writeDts,\n markDrafts,\n loadDrafts,\n saveDrafts,\n} from '@verbaly/compiler';\nimport type { ResolvedConfig } from '@verbaly/compiler';\nimport { badRequest } from './http';\nimport { advance, finish, start, type Job } from './jobs';\n\nexport interface ExtractResult {\n added: Record<string, string[]>;\n // only the source locale counts as new text: a target gains a blank for every gap it had\n found: number;\n messages: number;\n}\n\n// Local, fast and free, so it answers in the same request instead of becoming a job.\nexport async function runExtract(cfg: ResolvedConfig): Promise<ExtractResult> {\n if (!cfg.include.length) {\n throw badRequest('source scanning is off (include: []), so there is nothing to extract');\n }\n const registry = await extractProject(cfg);\n const catalogs = loadCatalogs(cfg);\n const result = syncCatalogs(cfg, catalogs, registry);\n for (const locale of cfg.locales) writeCatalog(cfg, locale, catalogs[locale] ?? {});\n // the types come from the source catalog, and cfg.dts false means the project opted out\n if (cfg.dts !== false) writeDts(cfg, catalogs[cfg.sourceLocale] ?? {}, cfg.dts);\n const found = result.added[cfg.sourceLocale]?.length ?? 0;\n return { added: result.added, found, messages: registry.messages().size };\n}\n\nexport interface Plan {\n pending: Record<string, string[]>;\n total: number;\n}\n\n// translate is the one command that spends money and minutes, so the panel always shows the bill.\nexport async function planTranslate(cfg: ResolvedConfig, locales?: string[]): Promise<Plan> {\n const provider = await resolveProvider(cfg);\n const catalogs = loadCatalogs(cfg);\n const result = await translateCatalogs(cfg, catalogs, provider, { locales, dryRun: true });\n const total = Object.values(result.pending).reduce((n, keys) => n + keys.length, 0);\n return { pending: result.pending, total };\n}\n\nexport async function startTranslate(cfg: ResolvedConfig, locales?: string[]): Promise<Job> {\n const provider = await resolveProvider(cfg);\n // the job carries its own denominator, so progress reads the same whether or not you asked first\n const plan = await planTranslate(cfg, locales);\n const job = start('translate', plan.total);\n const id = job.id;\n\n // the run outlives this request on purpose: the client asks the job how it is going\n void (async () => {\n try {\n const catalogs = loadCatalogs(cfg);\n const result = await translateCatalogs(cfg, catalogs, provider, {\n locales,\n batchSize: cfg.translate.batchSize,\n concurrency: cfg.translate.concurrency,\n retries: cfg.translate.retries,\n origins: await collectOrigins(cfg),\n onProgress: (p) => advance(id, p.keys, p.locale, p.error),\n });\n for (const [locale, keys] of Object.entries(result.translated)) {\n if (keys.length) writeCatalog(cfg, locale, catalogs[locale] ?? {});\n }\n // what a machine wrote stays a draft: the panel does not get to change that rule\n const drafts = loadDrafts(cfg);\n for (const [locale, keys] of Object.entries(result.translated)) {\n markDrafts(drafts, locale, keys);\n }\n saveDrafts(cfg, drafts);\n finish(id, result.failed.length ? 'failed' : 'done', {\n result,\n message: result.failed.length ? `${result.failed.length} batches did not answer` : undefined,\n });\n } catch (error) {\n finish(id, 'failed', { message: error instanceof Error ? error.message : String(error) });\n }\n })();\n\n return job;\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { relative } from 'node:path';\nimport type { ResolvedConfig } from '@verbaly/compiler';\n\nconst run = promisify(execFile);\n\nexport interface Commit {\n sha: string;\n author: string;\n date: string;\n subject: string;\n}\n\n// one field separator that no subject can contain, written as the escape and never as the byte\nconst FIELD = '\\u001f';\nconst FORMAT = `--format=%H${FIELD}%an${FIELD}%aI${FIELD}%s`;\n\n// split out so the shape of a log line is tested without a repository and without writing one\nexport function parseLog(stdout: string): Commit[] {\n const commits: Commit[] = [];\n for (const line of stdout.split('\\n')) {\n const [sha, author, date, ...rest] = line.split(FIELD);\n // a subject holds anything but a newline, so it is the last field and is rejoined\n if (!sha || !author || !date || !rest.length) continue;\n commits.push({ sha: sha.slice(0, 7), author, date, subject: rest.join(FIELD) });\n }\n return commits;\n}\n\n// git is asked, never assumed: no repository and no git both mean there is no history to show\nexport async function catalogHistory(cfg: ResolvedConfig, limit = 5): Promise<Commit[]> {\n const dir = relative(cfg.root, cfg.dir).replaceAll('\\\\', '/') || '.';\n try {\n const { stdout } = await run('git', ['log', `-n${limit}`, FORMAT, '--', dir], {\n cwd: cfg.root,\n timeout: 3000,\n windowsHide: true,\n });\n return parseLog(stdout);\n } catch {\n return [];\n }\n}\n","import { existsSync, readFileSync, statSync } from 'node:fs';\nimport { join, normalize, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// the built panel sits beside the compiled server, so it is found relative to this file, never cwd\nconst UI = resolve(fileURLToPath(new URL('.', import.meta.url)), 'ui');\n\nconst TYPES: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.woff2': 'font/woff2',\n '.json': 'application/json; charset=utf-8',\n '.ico': 'image/x-icon',\n};\n\nexport interface Asset {\n body: Buffer;\n type: string;\n}\n\nexport const uiBuilt = (): boolean => existsSync(join(UI, 'index.html'));\n\n// A path is resolved and then checked to still be inside UI: ../ and an absolute one both land out.\nexport function readAsset(pathname: string): Asset | undefined {\n const wanted = pathname === '/' ? '/index.html' : pathname;\n const target = resolve(join(UI, normalize(wanted)));\n if (target !== UI && !target.startsWith(UI + (process.platform === 'win32' ? '\\\\' : '/'))) {\n return undefined;\n }\n if (!existsSync(target) || !statSync(target).isFile()) return undefined;\n const dot = target.lastIndexOf('.');\n return {\n body: readFileSync(target),\n type: TYPES[target.slice(dot).toLowerCase()] ?? 'application/octet-stream',\n };\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport interface GuardOptions {\n port: number;\n token: string;\n}\n\n// A local server that writes files is reachable from any page the browser has open.\nexport function newToken(): string {\n return randomBytes(9).toString('base64url');\n}\n\n// Only the two names that resolve to this machine. A DNS rebind arrives with a foreign Host.\nexport function hostAllowed(host: string | undefined, port: number): boolean {\n // a browser omits the port when it is the scheme default, so :80 would 403 every real request\n const names = port === 80 ? ['127.0.0.1', 'localhost'] : [];\n return [`127.0.0.1:${port}`, `localhost:${port}`, ...names].includes(host ?? '');\n}\n\n// No Origin at all is a same-origin navigation or a curl, both fine; a foreign one never is.\nexport function originAllowed(origin: string | undefined, port: number): boolean {\n if (origin === undefined) return true;\n return origin === `http://127.0.0.1:${port}` || origin === `http://localhost:${port}`;\n}\n\n// Compared in constant time so the token cannot be guessed one character at a time.\nexport function tokenMatches(given: string | null, expected: string): boolean {\n if (given === null) return false;\n const a = Buffer.from(given);\n const b = Buffer.from(expected);\n return a.length === b.length && timingSafeEqual(a, b);\n}\n\nexport interface GuardVerdict {\n ok: boolean;\n status: number;\n reason: string;\n}\n\nconst PASS: GuardVerdict = { ok: true, status: 200, reason: '' };\n\nexport function guardRequest(\n headers: { host?: string; origin?: string },\n url: URL,\n { port, token }: GuardOptions,\n): GuardVerdict {\n if (!hostAllowed(headers.host, port)) {\n return { ok: false, status: 403, reason: '[verbaly] unexpected Host header' };\n }\n if (!originAllowed(headers.origin, port)) {\n return { ok: false, status: 403, reason: '[verbaly] cross-origin request' };\n }\n if (!tokenMatches(url.searchParams.get('t'), token)) {\n return { ok: false, status: 401, reason: '[verbaly] missing or wrong token, open the printed url' };\n }\n return PASS;\n}\n","import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport type { ResolvedConfig } from '@verbaly/compiler';\nimport { approve, buildState, health, unapprove, writeMessage } from './api';\nimport { planTranslate, runExtract, startTranslate } from './actions';\nimport { read as readJob, running } from './jobs';\nimport { catalogHistory } from './history';\nimport { readAsset, uiBuilt } from './assets';\nimport { guardRequest, newToken } from './guard';\nimport { HttpError, badRequest, scrub } from './http';\n\nexport interface StudioServer {\n server: Server;\n port: number;\n token: string;\n url: string;\n close: () => Promise<void>;\n}\n\nexport interface StartOptions {\n port?: number;\n token?: string;\n}\n\nconst DEFAULT_PORT = 4747;\nconst MAX_BODY = 1_000_000;\n\nfunction send(res: ServerResponse, status: number, body: unknown): void {\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-store',\n });\n res.end(JSON.stringify(body));\n}\n\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of req) {\n size += (chunk as Buffer).length;\n if (size > MAX_BODY) throw new HttpError(413, 'request body too large');\n chunks.push(chunk as Buffer);\n }\n if (!chunks.length) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(Buffer.concat(chunks).toString('utf8'));\n } catch {\n throw badRequest('body is not valid JSON');\n }\n // null and an array both pass typeof 'object', and reading .text off them is a 500\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw badRequest('body must be a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction segment(raw: string | undefined, what: string): string {\n let value: string;\n try {\n value = decodeURIComponent(raw ?? '');\n } catch {\n throw badRequest(`the ${what} in the url is not valid percent-encoding`);\n }\n if (!value) throw badRequest(`the url is missing a ${what}`);\n return value;\n}\n\n// One page, JSON on every route: a framework would only add a dependency to a local tool.\nexport function createStudioApp(cfg: ResolvedConfig, port: number, token: string) {\n return async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n // The url is built inside the try: `GET //` throws, and out here that would kill the process.\n try {\n let url: URL;\n try {\n url = new URL(req.url ?? '/', `http://127.0.0.1:${port}`);\n } catch {\n throw badRequest('the request target is not a valid url');\n }\n\n const api = url.pathname.startsWith('/api/');\n const verdict = guardRequest({ host: req.headers.host, origin: req.headers.origin }, url, {\n port,\n token,\n });\n // the panel files are the published npm package: only the project data needs a token\n if (!verdict.ok && (api || verdict.status !== 401)) {\n send(res, verdict.status, { error: verdict.reason });\n return;\n }\n\n if (!api && req.method === 'GET') {\n const asset = readAsset(url.pathname);\n if (asset) {\n res.writeHead(200, { 'content-type': asset.type, 'cache-control': 'no-store' });\n res.end(asset.body);\n return;\n }\n if (url.pathname === '/' && !uiBuilt()) {\n throw new HttpError(500, 'the panel is not in this install, so only /api/* answers here');\n }\n }\n\n if (req.method === 'GET' && url.pathname === '/api/state') {\n send(res, 200, await buildState(cfg));\n return;\n }\n if (req.method === 'GET' && url.pathname === '/api/history') {\n send(res, 200, { commits: await catalogHistory(cfg) });\n return;\n }\n if (req.method === 'GET' && url.pathname === '/api/health') {\n send(res, 200, await health(cfg));\n return;\n }\n if (req.method === 'PUT' && url.pathname.startsWith('/api/message/')) {\n const rest = url.pathname.slice('/api/message/'.length).split('/');\n const locale = segment(rest[0], 'locale');\n const key = segment(rest.slice(1).join('/'), 'key');\n const body = await readJson(req);\n if (typeof body.text !== 'string') throw badRequest('body needs a \"text\" string');\n send(res, 200, writeMessage(cfg, locale, key, body.text));\n return;\n }\n if (req.method === 'POST' && url.pathname === '/api/approve') {\n const body = await readJson(req);\n if (typeof body.locale !== 'string') throw badRequest('body needs a \"locale\" string');\n const keys = Array.isArray(body.keys)\n ? body.keys.filter((k): k is string => typeof k === 'string')\n : undefined;\n if (body.undo === true) {\n if (!keys?.length) throw badRequest('undoing needs the \"keys\" it should put back');\n send(res, 200, unapprove(cfg, body.locale, keys));\n return;\n }\n send(res, 200, approve(cfg, body.locale, keys));\n return;\n }\n if (req.method === 'POST' && url.pathname === '/api/extract') {\n send(res, 200, await runExtract(cfg));\n return;\n }\n if (req.method === 'GET' && url.pathname === '/api/translate') {\n const locales = url.searchParams.getAll('locale');\n send(res, 200, await planTranslate(cfg, locales.length ? locales : undefined));\n return;\n }\n if (req.method === 'POST' && url.pathname === '/api/translate') {\n const body = await readJson(req);\n const locales = Array.isArray(body.locales)\n ? body.locales.filter((l): l is string => typeof l === 'string')\n : undefined;\n send(res, 200, await startTranslate(cfg, locales?.length ? locales : undefined));\n return;\n }\n // a reload loses the id, so the panel asks what is running rather than losing the bar\n if (req.method === 'GET' && url.pathname === '/api/job') {\n send(res, 200, running());\n return;\n }\n if (req.method === 'GET' && url.pathname.startsWith('/api/job/')) {\n send(res, 200, readJob(segment(url.pathname.slice('/api/job/'.length), 'job id')));\n return;\n }\n\n send(res, 404, { error: `[verbaly] no route for ${req.method} ${url.pathname}` });\n } catch (error) {\n const status = error instanceof HttpError ? error.status : 500;\n const message = error instanceof Error ? error.message : String(error);\n send(res, status, { error: scrub(message, cfg.root) });\n }\n };\n}\n\n// A busy port climbs instead of failing: this is a local tool, not a service on a fixed address.\nfunction listen(server: Server, port: number, attemptsLeft: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const onError = (error: NodeJS.ErrnoException) => {\n if (error.code === 'EADDRINUSE' && attemptsLeft > 0) {\n server.removeListener('error', onError);\n resolve(listen(server, port + 1, attemptsLeft - 1));\n return;\n }\n reject(error);\n };\n server.once('error', onError);\n server.listen(port, '127.0.0.1', () => {\n server.removeListener('error', onError);\n // port 0 asks the system to pick, so the bound address is the only place the answer is\n const bound = server.address() as AddressInfo | string | null;\n resolve(typeof bound === 'object' && bound !== null ? bound.port : port);\n });\n });\n}\n\nexport async function startStudio(\n cfg: ResolvedConfig,\n options: StartOptions = {},\n): Promise<StudioServer> {\n const token = options.token ?? newToken();\n const server = createServer();\n // The handler is attached before listen so no request can arrive without one.\n let port = options.port ?? DEFAULT_PORT;\n server.on('request', (req, res) => void createStudioApp(cfg, port, token)(req, res));\n port = await listen(server, port, 20);\n\n return {\n server,\n port,\n token,\n url: `http://127.0.0.1:${port}/?t=${token}`,\n close: () =>\n new Promise<void>((resolve, reject) =>\n server.close((error) => (error ? reject(error) : resolve())),\n ),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=Array.isArray,t=Array.prototype.indexOf,n=Array.prototype.includes,r=Array.from,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,s=Object.prototype,c=Array.prototype,l=Object.getPrototypeOf,u=Object.isExtensible,d=()=>{};function f(e){for(var t=0;t<e.length;t++)e[t]()}function p(){var e,t;return{promise:new Promise((n,r)=>{e=n,t=r}),resolve:e,reject:t}}var m=1024,h=2048,g=4096,_=8192,v=16384,y=32768,b=1<<25,x=65536,S=1<<19,ee=1<<20,te=1<<25,ne=1<<21,re=1<<22,ie=1<<23,ae=Symbol(`$state`),oe=Symbol(`component`),se=Symbol(``),ce=Symbol(`attributes`),le=Symbol(`class`),C=Symbol(`style`),ue=Symbol(`text`),de=Symbol(`form reset`),fe=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},pe=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`),me={},w=Symbol(`uninitialized`),he=`http://www.w3.org/1999/xhtml`;function ge(){console.warn(`https://svelte.dev/e/derived_inert`)}function _e(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function ve(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function ye(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var T=!1;function be(e){T=e}var E;function D(e){if(e===null)throw _e(),me;return E=e}function xe(){return D(en(E))}function O(e){if(T){if(en(E)!==null)throw _e(),me;E=e}}function Se(e=1){if(T){for(var t=e,n=E;t--;)n=en(n);E=n}}function Ce(e=!0){for(var t=0,n=E;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=en(n);e&&n.remove(),n=i}}function we(e){if(!e||e.nodeType!==8)throw _e(),me;return e.data}function Te(e){return e===this.v}function Ee(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function De(e){return!Ee(e,this.v)}function Oe(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function ke(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ae(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function je(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Me(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Ne(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Pe(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Fe(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ie(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function Le(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Re(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var k=null;function ze(e){k=e}function Be(e,t=!1,n){k={p:k,i:!1,c:null,e:null,s:e,x:null,r:H,l:null}}function Ve(e){var t=k,n=t.e;if(n!==null){t.e=null;for(var r of n)hn(r)}return e!==void 0&&(t.x=e),t.i=!0,k=t.p,He(e)}function He(e={}){return i(e,oe,{value:!0}),e}function Ue(){return!0}var We=[];function Ge(){var e=We;We=[],f(e)}function Ke(e){if(We.length===0&&!bt){var t=We;queueMicrotask(()=>{t===We&&Ge()})}We.push(e)}function qe(){for(;We.length>0;)Ge()}var Je=~(h|g|m);function A(e,t){e.f=e.f&Je|t}function Ye(e){e.f&512||e.deps===null?A(e,m):A(e,g)}function Xe(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),A(e,m)}function Ze(e,t){if(t){let t=document.body;e.autofocus=!0,Ke(()=>{document.activeElement===t&&e.focus()})}}function Qe(e){T&&$t(e)!==null&&nn(e)}var $e=!1;function et(){$e||($e=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[de]?.()})},{capture:!0}))}function tt(e){var t=V,n=H;Ln(null),Rn(null);try{return e()}finally{Ln(t),Rn(n)}}function nt(e,t,n,r=n){e.addEventListener(t,()=>tt(n));let i=e[de];e[de]=i?()=>{i(),r(!0)}:()=>r(!0),et()}function rt(e,t,n,r){let i=Ue()?st:ut;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=H,c=it(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){cn(e,s)}at()}}var d=ot();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>lt(e))).then(u).catch(e=>cn(e,s)).finally(d)}l?l.then(()=>{c(),f(),at()}):f()}function it(){var e=H,t=V,n=k,r=M;return function(i=!0){Rn(e),Ln(t),ze(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function at(e=!0){Rn(null),Ln(null),ze(null),e&&M?.deactivate()}function ot(){var e=H,t=e.b,n=M,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function st(e){var t=2|h;return H!==null&&(H.f|=S),{ctx:k,deps:null,effects:null,equals:Te,f:t,fn:e,reactions:null,rv:0,v:w,wv:0,parent:H,ac:null}}var ct=Symbol(`obsolete`);function lt(e,t,n){let r=H;r===null&&ke();var i=void 0,a=Lt(w),o=!V,s=new Set;return vn(()=>{var t=H,n=p();i=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==fe&&n.reject(e)}).finally(at)}catch(e){n.reject(e),at()}var c=M;if(o){if(t.f&32768)var l=ot();if(r.b?.is_rendered())c.async_deriveds.get(t)?.reject(ct);else for(let e of s.values())e.reject(ct);s.add(n),c.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),s.delete(n),t!==ct&&(c.activate(),t?(a.f|=ie,Vt(a,t)):(a.f&8388608&&(a.f^=ie),Vt(a,e)),c.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),pn(()=>{for(let e of s)e.reject(ct)}),new Promise(e=>{function t(n){function r(){n===i?e(a):t(i)}n.then(r,r)}t(i)})}function j(e){let t=st(e);return Bn(t),t}function ut(e){let t=st(e);return t.equals=De,t}function dt(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n<t.length;n+=1)B(t[n])}}function ft(e){var t,n=H,r=e.parent;if(!Pn&&r!==null&&e.v!==w&&r.f&24576)return ge(),e.v;Rn(r);try{dt(e),t=Zn(e)}finally{Rn(n)}return t}function pt(e){var t=ft(e);if(!e.equals(t)&&(e.wv=Jn(),(!M?.is_fork||e.deps===null)&&(M===null?e.v=t:(M.capture(e,t,!0),_t?.capture(e,t,!0)),e.deps===null))){A(e,m);return}Pn||(vt===null?Ye(e):(fn()||M?.is_fork)&&vt.set(e,t))}function mt(e){if(e.effects!==null)for(let t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac!==null&&tt(()=>{t.ac.abort(fe),t.ac=null}),t.fn!==null&&(t.teardown=d),er(t,0),Cn(t))}function ht(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&tr(t)}var gt=null,M=null,_t=null,vt=null,yt=null,bt=!1,xt=!1,St=null,Ct=null,wt=0,Tt=1,Et=class e{id=Tt++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){gt===null?gt=this:(gt.#n=this,this.#t=gt),gt=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)A(r,h),t(r);for(r of n.m)A(r,g),t(r)}this.#p.add(e)}#g(){var e=[];for(let i of this.#c)if(!(i.f&16384||!(i.f&6144))){for(var t=i,n=!1;t.parent!==null;){t=t.parent;var r=t.f;if(r&96){if(!(r&1024)){n=!0;break}t.f^=m}}n||e.push(t)}return this.#c=[],e}#_(){this.#e=!0;for(let e of this.#u)this.#d.delete(e),A(e,h),this.schedule(e);for(let e of this.#d)A(e,g),this.schedule(e);this.apply();for(var t=St=[],n=[],r=Ct=[];this.#c.length>0;){wt++>1e3&&(this.#S(),Ot());for(let e of this.#g())try{this.#v(e,t,n)}catch(t){throw Nt(e),this.#h()||this.discard(),t}}if(M=null,r.length>0){var i=e.ensure();for(let e of r)i.schedule(e)}if(St=null,Ct=null,this.#h()){this.#x(n),this.#x(t);for(let[e,t]of this.#f)Mt(e,t);r.length>0&&M.#_();return}let a=this.#y();if(a){this.#x(n),this.#x(t),a.#b(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),_t=this,At(n),At(t),_t=null,this.#s?.resolve();var o=M;if(this.#a===0&&(this.#c.length===0||o!==null)&&this.#S(),this.#c.length>0){if(o!==null){for(let e of this.#c)o.#c.push(e);this.#c=[]}else o=this}o!==null&&(Ft.clear(),o.#_())}#v(e,t,n){e.f^=m;for(var r=e.first;r!==null;){var i=r.f,a=!!(i&96);if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=m:i&4?t.push(r):Yn(r)&&(i&16&&this.#d.add(r),tr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#y(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#b(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),A(i,h),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),M=this,this.#_()}#x(e){for(var t=0;t<e.length;t+=1)Xe(e[t],this.#u,this.#d)}capture(e,t,n=!1){e.v!==w&&!this.previous.has(e)&&this.previous.set(e,e.v),e.f&8388608||(this.current.set(e,[t,n]),vt?.set(e,t)),this.is_fork||(e.v=t)}activate(){M=this}deactivate(){M=null,vt=null}flush(){try{xt=!0,M=this,this.#_()}finally{wt=0,yt=null,St=null,Ct=null,xt=!1,M=null,vt=null,Ft.clear()}}discard(){for(let e of this.#i)e(this);this.#i.clear();for(let e of this.async_deriveds.values())e.reject(ct);this.#S(),this.#s?.resolve()}register_created_effect(e){this.#l.push(e)}increment(e,t){if(this.#a+=1,e){let e=this.#o.get(t)??0;this.#o.set(t,e+1)}}decrement(e,t){if(--this.#a,e){let e=this.#o.get(t)??0;e===1?this.#o.delete(t):this.#o.set(t,e-1)}this.#m||(this.#m=!0,Ke(()=>{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=p()).promise}static ensure(){if(M===null){let t=M=new e;!xt&&!bt&&Ke(()=>{t.#e||t.flush()})}return M}apply(){vt=null}schedule(e){if(yt=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)){e.b.defer_effect(e);return}this.#c.push(e)}#S(){if(this.linked){var e=this.#t,t=this.#n;e===null||(e.#n=t),t===null?gt=e:t.#t=e,this.linked=!1}}};function Dt(e){var t=bt;bt=!0;try{var n;for(e&&(M!==null&&!M.is_fork&&M.flush(),n=e());;){if(qe(),M===null)return n;M.flush()}}finally{bt=t}}function Ot(){try{Pe()}catch(e){cn(e,yt)}}var kt=null;function At(e){var t=e.length;if(t!==0){for(var n=0;n<t;){var r=e[n++];if(!(r.f&24576)&&Yn(r)&&(kt=new Set,tr(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&En(r),kt?.size>0)){Ft.clear();for(let e of kt){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)kt.has(n)&&(kt.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||tr(n)}}kt.clear()}}kt=null}}function jt(e){M.schedule(e)}function Mt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),A(e,m);for(var n=e.first;n!==null;)Mt(n,t),n=n.next}}function Nt(e){A(e,m);for(var t=e.first;t!==null;)Nt(t),t=t.next}var Pt=new Set,Ft=new Map,It=!1;function Lt(e,t){return{f:0,v:e,reactions:null,equals:Te,rv:0,wv:0}}function N(e,t){let n=Lt(e,t);return Bn(n),n}function Rt(e,t=!1,n=!0){let r=Lt(e);return t||(r.equals=De),r}function P(e,t,n=!1){return V!==null&&(!In||V.f&131072)&&Ue()&&V.f&4325394&&(zn===null||!zn.has(e))&&Le(),Vt(e,n?Gt(t):t,Ct)}var zt=null,Bt=0;function Vt(e,t,n=null){if(!e.equals(t)){Pn?Ft.set(e,t):Ft.has(e)||Ft.set(e,e.v);var r=Et.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&ft(t),vt===null&&Ye(t)}e.wv=Jn(),zt=null,Bt=0,Wt(e,h,n),zt=null,Ue()&&H!==null&&H.f&1024&&!(H.f&96)&&(Hn===null?Un([e]):Hn.push(e)),!r.is_fork&&Pt.size>0&&!It&&Ht()}return t}function Ht(){It=!1;for(let e of Pt){e.f&1024&&A(e,g);let t;try{t=Yn(e)}catch{t=!0}t&&tr(e)}Pt.clear()}function Ut(e){P(e,e.v+1)}function Wt(e,t,n){var r=e.reactions;if(r!==null){var i=Ue(),a=r.length;if(Bt+=a,Bt>1e5&&zt===null&&(zt=new Set),zt!==null){if(zt.has(e))return;zt.add(e)}for(var o=0;o<a;o++){var s=r[o],c=s.f;if(i||s!==H){var l=(c&h)===0;if(l&&A(s,t),c&131072)Pt.add(s);else if(c&2){var u=s;vt?.delete(u),Wt(u,g,n)}else if(l){var d=s;c&16&&kt!==null&&kt.add(d),n===null?jt(d):n.push(d)}}}}}function Gt(t){if(typeof t!=`object`||!t||ae in t||oe in t)return t;let n=l(t);if(n!==s&&n!==c)return t;var r=new Map,i=e(t),o=N(0),u=null,d=Kn,f=e=>{if(Kn===d)return e();var t=V,n=Kn;Ln(null),qn(d);var r=e();return Ln(t),qn(n),r};return i&&r.set(`length`,N(t.length,u)),new Proxy(t,{defineProperty(e,t,n){(!(`value`in n)||n.configurable===!1||n.enumerable===!1||n.writable===!1)&&Fe();var i=r.get(t);return i===void 0?f(()=>{var e=N(n.value,u);return r.set(t,e),e}):P(i,n.value,!0),!0},deleteProperty(e,t){var n=r.get(t);if(n===void 0){if(t in e){let e=f(()=>N(w,u));r.set(t,e),Ut(o)}}else P(n,w),Ut(o);return!0},get(e,n,i){if(n===ae)return t;var o=r.get(n),s=n in e;if(o===void 0&&(!s||a(e,n)?.writable)&&(o=f(()=>N(Gt(s?e[n]:w),u)),r.set(n,o)),o!==void 0){var c=W(o);return c===w?void 0:c}return Reflect.get(e,n,i)},getOwnPropertyDescriptor(e,t){this.has?.(e,t);var n=Reflect.getOwnPropertyDescriptor(e,t),i=r.get(t);if(i!==void 0){var a=W(i);if(a===w)return;if(n&&`value`in n)n.value=a;else return{enumerable:!0,configurable:!0,value:a,writable:!0}}return n},has(e,t){if(t===ae)return!0;var n=r.get(t),i=n!==void 0&&n.v!==w||Reflect.has(e,t);return(n!==void 0||H!==null&&(!i||a(e,t)?.writable))&&(n===void 0&&(n=f(()=>N(i?Gt(e[t]):w,u)),r.set(t,n)),W(n)===w)?!1:i},set(e,t,n,s){var c=r.get(t),l=t in e;if(i&&t===`length`)for(var d=n;d<c.v;d+=1){var p=r.get(d+``);p===void 0?d in e&&(p=f(()=>N(w,u)),r.set(d+``,p)):P(p,w)}if(c===void 0)(!l||a(e,t)?.writable)&&(c=f(()=>N(void 0,u)),P(c,Gt(n)),r.set(t,c));else{l=c.v!==w;var m=f(()=>Gt(n));P(c,m)}var h=Reflect.getOwnPropertyDescriptor(e,t);if(h?.set&&h.set.call(s,n),!l){if(i&&typeof t==`string`){var g=r.get(`length`),_=Number(t);Number.isInteger(_)&&_>=g.v&&P(g,_+1)}Ut(o)}return!0},ownKeys(e){W(o);var t=Reflect.ownKeys(e).filter(e=>{var t=r.get(e);return t===void 0||t.v!==w});for(var[n,i]of r)i.v!==w&&!(n in e)&&t.push(n);return t},setPrototypeOf(){Ie()}})}function Kt(e){try{if(typeof e==`object`&&e&&ae in e)return e[ae]}catch{}return e}function qt(e,t){return Object.is(Kt(e),Kt(t))}var Jt,Yt,Xt,Zt;function Qt(){if(Jt===void 0){Jt=window,Yt=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Xt=a(t,`firstChild`).get,Zt=a(t,`nextSibling`).get,u(e)&&(e[le]=void 0,e[ce]=null,e[C]=void 0,e.__e=void 0),u(n)&&(n[ue]=void 0)}}function F(e=``){return document.createTextNode(e)}function $t(e){return Xt.call(e)}function en(e){return Zt.call(e)}function I(e,t){if(!T)return $t(e);var n=$t(E);if(n===null)n=E.appendChild(F());else if(t&&n.nodeType!==3){var r=F();return n?.before(r),D(r),r}return t&&on(n),D(n),n}function tn(e,t=!1){if(!T){var n=$t(e);return n instanceof Comment&&n.data===``?en(n):n}if(t){if(E?.nodeType!==3){var r=F();return E?.before(r),D(r),r}on(E)}return E}function L(e,t=!1){if(!T)return $t(e);var n=I(e,t);return O(e),n}function R(e,t=1,n=!1){let r=T?E:e;for(var i;t--;)i=r,r=en(r);if(!T)return r;if(n){if(r?.nodeType!==3){var a=F();return r===null?i?.after(a):r.before(a),D(a),a}on(r)}return D(r),r}function nn(e){e.textContent=``}function rn(){return!1}function an(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function on(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function sn(e){var t=H;if(t===null)return V.f|=ie,e;if(!(t.f&32768)&&!(t.f&4))throw e;cn(e,t)}function cn(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128&&!(t.f&33570816)){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}function ln(e){H===null&&(V===null&&Ne(e),Me()),Pn&&je(e)}function un(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function dn(e,t){var n=H;n!==null&&n.f&8192&&(e|=_);var r={ctx:k,deps:null,nodes:null,f:e|h|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};M?.register_created_effect(r);var i=r;if(e&4)St===null?Et.ensure().schedule(r):St.push(r);else if(t!==null){try{tr(r)}catch(e){throw B(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=x))}if(i!==null&&(i.parent=n,n!==null&&un(i,n),V!==null&&V.f&2&&!(e&64))){var a=V;(a.effects??=[]).push(i)}return r}function fn(){return V!==null&&!In}function pn(e){let t=dn(8,null);return A(t,m),t.teardown=e,t}function mn(e){ln(`$effect`);var t=H.f;if(!V&&t&32&&k!==null&&!k.i){var n=k;(n.e??=[]).push(e)}else return hn(e)}function hn(e){return dn(4|ee,e)}function gn(e){Et.ensure();let t=dn(64|S,e);return(e={})=>new Promise(n=>{e.outro?Dn(t,()=>{B(t),n(void 0)}):(B(t),n(void 0))})}function _n(e){return dn(4,e)}function vn(e){return dn(re|S,e)}function yn(e,t=0){return dn(8|t,e)}function z(e,t=[],n=[],r=[]){rt(r,t,n,t=>{dn(8,()=>{e(...t.map(W))})})}function bn(e,t=0){return dn(16|t,e)}function xn(e){return dn(32|S,e)}function Sn(e){var t=e.teardown;if(t!==null){let n=Pn,r=V;Fn(!0),Ln(null);try{t.call(null)}catch(t){cn(t,e.parent)}finally{Fn(n),Ln(r)}}}function Cn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&tt(()=>{e.abort(fe)});var r=n.next;n.f&64?n.parent=null:B(n,t),n=r}}function wn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||B(t),t=n}}function B(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Tn(e.nodes.start,e.nodes.end),n=!0),e.f|=b,Cn(e,t&&!n),er(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();Sn(e),e.f^=b,e.f|=v;var i=e.parent;i!==null&&i.first!==null&&En(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Tn(e,t){for(;e!==null;){var n=e===t?null:en(e);e.remove(),e=n}}function En(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Dn(e,t,n=!0){var r=[];e.f|=256,On(e,r,!0);var i=()=>{n&&B(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function On(e,t,n){if(!(e.f&8192)){e.f^=_;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=!!(i.f&65536)||!!(i.f&32)&&!!(e.f&16);On(i,t,o?n:!1)}i=a}}}function kn(e){e.f&=-257,An(e,!0)}function An(e,t){if(!(e.f&256)&&e.f&8192){e.f^=_,e.f&1024||(A(e,h),Et.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=!!(n.f&65536)||!!(n.f&32);An(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function jn(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:en(n);t.append(n),n=i}}var Mn=null,Nn=!1,Pn=!1;function Fn(e){Pn=e}var V=null,In=!1;function Ln(e){V=e}var H=null;function Rn(e){H=e}var zn=null;function Bn(e){V!==null&&(V.f&2097152||V.f&2)&&(zn??=new Set).add(e)}var U=null,Vn=0,Hn=null;function Un(e){Hn=e}var Wn=1,Gn=0,Kn=Gn;function qn(e){Kn=e}function Jn(){return++Wn}function Yn(e){var t=e.f;if(t&2048)return!0;if(t&4096){for(var n=e.deps,r=n.length,i=0;i<r;i++){var a=n[i];if(Yn(a)&&pt(a),a.wv>e.wv)return!0}t&512&&vt===null&&A(e,m)}return!1}function Xn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(zn!==null&&zn.has(e)))for(var i=0;i<r.length;i++){var a=r[i];a.f&2?Xn(a,t,!1):t===a&&(n?A(a,h):a.f&1024&&A(a,g),jt(a))}}function Zn(e){var t=U,n=Vn,r=Hn,i=V,a=zn,o=k,s=In,c=Kn,l=e.f;U=null,Vn=0,Hn=null,V=l&96?null:e,zn=null,ze(e.ctx),In=!1,Kn=++Gn,e.ac!==null&&(tt(()=>{e.ac.abort(fe)}),e.ac=null);try{e.f|=ne;var u=e.fn,d=u();e.f|=y;var f=Qn(e);if(Ue()&&Hn!==null&&!In&&f!==null&&!(e.f&6146))for(var p=0;p<Hn.length;p++)Xn(Hn[p],e);if(i!==null&&i!==e){if(Gn++,i.deps!==null)for(let e=0;e<n;e+=1)i.deps[e].rv=Gn;if(t!==null)for(let e of t)e.rv=Gn;Hn!==null&&(r===null?r=Hn:r.push(...Hn))}return e.f&8388608&&(e.f^=ie),d}catch(t){return Qn(e),sn(t)}finally{e.f^=ne,U=t,Vn=n,Hn=r,V=i,zn=a,ze(o),In=s,Kn=c}}function Qn(e){var t=e.deps,n=M?.is_fork;if(U!==null){var r;if(n||er(e,Vn),t!==null&&Vn>0)for(t.length=Vn+U.length,r=0;r<U.length;r++)t[Vn+r]=U[r];else e.deps=t=U;if(fn()&&e.f&512)for(r=Vn;r<t.length;r++)(t[r].reactions??=[]).push(e)}else!n&&t!==null&&Vn<t.length&&(er(e,Vn),t.length=Vn);return t}function $n(e,r){let i=r.reactions;if(i!==null){var a=t.call(i,e);if(a!==-1){var o=i.length-1;o===0?i=r.reactions=null:(i[a]=i[o],i.pop())}}if(i===null&&r.f&2&&(U===null||!n.call(U,r))){var s=r;s.f&512&&(s.f^=512),s.v!==w&&Ye(s),s.ac!==null&&tt(()=>{s.ac.abort(fe),s.ac=null,A(s,h)}),mt(s),er(s,0)}}function er(e,t){var n=e.deps;if(n!==null)for(var r=t;r<n.length;r++)$n(e,n[r])}function tr(e){var t=e.f;if(!(t&16384)){A(e,m);var n=H,r=Nn;H=e,Nn=!(t&96);try{t&16777232?wn(e):Cn(e),Sn(e);var i=Zn(e);e.teardown=typeof i==`function`?i:null,e.wv=Wn}finally{Nn=r,H=n}}}async function nr(){await Promise.resolve(),Dt()}function W(e){var t=!!(e.f&2);if(Mn?.add(e),V!==null&&!In&&!(H!==null&&H.f&16384)&&(zn===null||!zn.has(e))){var r=V.deps;if(V.f&2097152)e.rv<Gn&&(e.rv=Gn,U===null&&r!==null&&r[Vn]===e?Vn++:U===null?U=[e]:U.push(e));else{V.deps??=[],n.call(V.deps,e)||V.deps.push(e);var i=e.reactions;i===null?e.reactions=[V]:n.call(i,V)||i.push(V)}}if(Pn&&Ft.has(e))return Ft.get(e);if(t){var a=e;if(Pn){var o=a.v;return(!(a.f&1024)&&a.reactions!==null||ir(a))&&(o=ft(a)),Ft.set(a,o),o}var s=!(a.f&512)&&!In&&V!==null&&(Nn||!!(V.f&512)),c=(a.f&y)===0;Yn(a)&&(s&&(a.f|=512),pt(a)),s&&!c&&(ht(a),rr(a))}if(vt?.has(e))return vt.get(e);if(e.f&8388608)throw e.v;return e.v}function rr(e){if(e.f|=512,e.deps!==null)for(let t of e.deps)(t.reactions??=[]).push(e),t.f&2&&!(t.f&512)&&(ht(t),rr(t))}function ir(e){if(e.v===w)return!0;if(e.deps===null)return!1;for(let t of e.deps)if(Ft.has(t)||t.f&2&&ir(t))return!0;return!1}function ar(e){var t=In;try{return In=!0,e()}finally{In=t}}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var or=[`touchstart`,`touchmove`];function sr(e){return or.includes(e)}var cr=Symbol(`events`),lr=new Set,ur=new Set;function dr(e,t,n,r={}){function i(e){if(r.capture||gr.call(t,e),!e.cancelBubble)return tt(()=>n?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?(i.__removed=!1,Ke(()=>{i.__removed||t.addEventListener(e,i,r)})):t.addEventListener(e,i,r),i}function fr(e,t,n,r,i){var a={capture:r,passive:i},o=dr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&pn(()=>{o.__removed=!0,t.removeEventListener(e,o,a)})}function G(e,t,n){(t[cr]??={})[e]=n}function pr(e){for(var t=0;t<e.length;t++)lr.add(e[t]);for(var n of ur)n(e)}var mr=null,hr=!1;function gr(e){var t=this,n=t.ownerDocument,r=e.type,a=e.composedPath?.()||[],o=a[0]||e.target;mr=e,hr||(hr=!0,setTimeout(()=>{hr=!1,mr=null}));var s=0,c=mr===e&&e[cr];if(c){var l=a.indexOf(c);if(l!==-1&&(t===document||t===window)){e[cr]=t;return}var u=a.indexOf(t);if(u===-1)return;l<=u&&(s=l)}if(o=a[s]||e.target,o!==t){i(e,`currentTarget`,{configurable:!0,get(){return o||n}});var d=V,f=H;Ln(null),Rn(null);try{for(var p,m=[];o!==null&&o!==t;){try{var h=o[cr]?.[r];h!=null&&(!o.disabled||e.target===o)&&h.call(o,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble)break;s++,o=s<a.length?a[s]:null}if(p){for(let e of m)queueMicrotask(()=>{throw e});throw p}}finally{e[cr]=t,delete e.currentTarget,Ln(d),Rn(f)}}}var _r=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function vr(e){return _r?.createHTML(e)??e}function yr(e){var t=an(`template`);return t.innerHTML=vr(e.replaceAll(`<!>`,`<!---->`)),t.content}function br(e,t){var n=H;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function K(e,t){var n=!!(t&1),r=!!(t&2),i,a=!e.startsWith(`<!>`);return()=>{if(T)return br(E,null),E;i===void 0&&(i=yr(a?e:`<!>`+e),n||(i=$t(i)));var t=r||Yt?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=$t(t),s=t.lastChild;br(o,s)}else br(t,t);return t}}function xr(e,t,n=`svg`){var r=!e.startsWith(`<!>`),i=!!(t&1),a=`<${n}>${r?e:`<!>`+e}</${n}>`,o;return()=>{if(T)return br(E,null),E;if(!o){var e=$t(yr(a));if(i)for(o=document.createDocumentFragment();$t(e);)o.appendChild($t(e));else o=$t(e)}var t=o.cloneNode(!0);if(i){var n=$t(t),r=t.lastChild;br(n,r)}else br(t,t);return t}}function Sr(e,t){return xr(e,t,`svg`)}function Cr(e=``){if(!T){var t=F(e+``);return br(t,t),t}var n=E;return n.nodeType===3?on(n):(n.before(n=F()),D(n)),br(n,n),n}function wr(){if(T)return br(E,null),E;var e=document.createDocumentFragment(),t=document.createComment(``),n=F();return e.append(t,n),br(t,n),e}function q(e,t){if(T){var n=H;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=E),xe();return}e!==null&&e.before(t)}function Tr(e){let t=0,n=Lt(0),r;return()=>{fn()&&(W(n),yn(()=>(t===0&&(r=ar(()=>e(()=>Ut(n)))),t+=1,()=>{Ke(()=>{--t,t===0&&(r?.(),r=void 0,Ut(n))})})))}}var Er=x|S;function Dr(e,t,n,r){new Or(e,t,n,r)}var Or=class{parent;is_pending=!1;transform_error;#e;#t=T?E:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=Tr(()=>(this.#m=Lt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=H;t.b=this,t.f|=128,n(e)},this.parent=H.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=bn(()=>{if(T){let e=this.#t;xe();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#y():this.#g()}else this.#b()},Er),T&&(this.#e=E)}#g(){try{this.#a=xn(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed,{reset:n,invoke_onerror:r}=this.#v(e);Ke(r),t&&(this.#s=xn(()=>{t(this.#e,()=>e,()=>n)}))}#v(e){var t=!1,n=!1;let r=()=>{if(t){ye();return}t=!0,n&&Re(),this.#s!==null&&Dn(this.#s,()=>{this.#s=null}),this.#S(()=>{this.#b()})};return{reset:r,invoke_onerror:()=>{try{n=!0,this.#n.onerror?.(e,r),n=!1}catch(e){cn(e,this.#i&&this.#i.parent)}}}}#y(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=xn(()=>e(this.#e)),Ke(()=>{var e=this.#c=document.createDocumentFragment(),t=F(),n=!1;if(e.append(t),this.#a=this.#S(()=>{try{return xn(()=>this.#r(t))}catch(e){try{this.error(e),n=!0}catch(e){cn(e,this.#i.parent)}return null}}),this.#a===null){this.#c=null,n&&this.#x(M);return}this.#u===0&&(this.#e.before(e),this.#c=null,Dn(this.#o,()=>{this.#o=null}),this.#x(M))}))}#b(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=xn(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();jn(this.#a,e);let t=this.#n.pending;this.#o=xn(()=>t(this.#e))}else this.#x(M)}catch(e){this.error(e)}}#x(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){Xe(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#S(e){var t=H,n=V,r=k;Rn(this.#i),Ln(this.#i),ze(this.#i.ctx);try{return Et.ensure(),e()}finally{Rn(t),Ln(n),ze(r)}}#C(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#C(e,t);return}this.#u+=e,this.#u===0&&(this.#x(t),this.#o&&Dn(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#C(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,Ke(()=>{this.#d=!1,this.#m&&Vt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),W(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;M?.is_fork?(this.#a&&M.skip_effect(this.#a),this.#o&&M.skip_effect(this.#o),this.#s&&M.skip_effect(this.#s),M.oncommit(()=>{this.#w(e)})):this.#w(e)}#w(e){this.#a&&=(B(this.#a),null),this.#o&&=(B(this.#o),null),this.#s&&=(B(this.#s),null),T&&(D(this.#t),Se(),D(Ce()));let t=this.#n.failed,n=e=>{let{reset:n,invoke_onerror:r}=this.#v(e);r(),t&&(this.#s=this.#S(()=>{try{return xn(()=>{var r=H;r.b=this,r.f|=128,t(this.#e,()=>e,()=>n)})}catch(e){return cn(e,this.#i.parent),null}}))};Ke(()=>{var t;try{t=this.transform_error(e)}catch(e){cn(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(n,e=>cn(e,this.#i&&this.#i.parent)):n(t)})}};function J(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[ue]??=e.nodeValue)&&(e[ue]=n,e.nodeValue=`${n}`)}function kr(e,t){return jr(e,t)}var Ar=new Map;function jr(e,{target:t,anchor:n,props:i={},events:a,context:o,intro:s=!0,transformError:c}){Qt();var l=void 0,u=gn(()=>{var s=n??t.appendChild(F());Dr(s,{pending:()=>{}},t=>{Be({});var n=k;if(o&&(n.c=o),a&&(i.$$events=a),T&&br(t,null),l=e(t,i)||He(),T&&(H.nodes.end=E,E===null||E.nodeType!==8||E.data!==`]`))throw _e(),me;Ve()},c);var u=new Set,d=e=>{for(var n=0;n<e.length;n++){var r=e[n];if(!u.has(r)){u.add(r);var i=sr(r);for(let e of[t,document]){var a=Ar.get(e);a===void 0&&(a=new Map,Ar.set(e,a));var o=a.get(r);o===void 0?(e.addEventListener(r,gr,{passive:i}),a.set(r,1)):a.set(r,o+1)}}}};return d(r(lr)),ur.add(d),()=>{for(var e of u)for(let n of[t,document]){var r=Ar.get(n),i=r.get(e);--i==0?(n.removeEventListener(e,gr),r.delete(e),r.size===0&&Ar.delete(n)):r.set(e,i)}ur.delete(d),s!==n&&s.parentNode?.removeChild(s)}});return Mr.set(l,u),l}var Mr=new WeakMap,Nr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)kn(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(kn(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(B(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();jn(r,t),t.append(F()),this.#n.set(e,{effect:r,fragment:t})}else B(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Dn(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(B(n.effect),this.#n.delete(e))};ensure(e,t){var n=M,r=rn();if(t&&!this.#t.has(e)&&!this.#n.has(e)){if(r){var i=document.createDocumentFragment(),a=F();i.append(a),this.#n.set(e,{effect:xn(()=>t(a)),fragment:i})}else this.#t.set(e,xn(()=>t(this.anchor)))}if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else T&&(this.anchor=E),this.#a(n)}};function Y(e,t,n=!1){var r;T&&(r=E,xe());var i=new Nr(e),a=n?x:0;function o(e,t){if(T){var n=we(r);if(e!==parseInt(n.substring(1))){var a=Ce();D(a),i.anchor=a,be(!1),i.ensure(e,t),be(!0);return}}i.ensure(e,t)}bn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}function Pr(e,t){return t}function Fr(e,t,n){for(var i=[],a=t.length,o,s=t.length,c=0;c<a;c++){let n=t[c];Dn(n,()=>{if(o){if(o.pending.delete(n),o.done.add(n),o.pending.size===0){var t=e.outrogroups;Ir(e,r(o.done)),t.delete(o),t.size===0&&(e.outrogroups=null)}}else--s},!1)}if(s===0){var l=i.length===0&&n!==null&&e.pending.size===0;if(l){var u=n,d=u.parentNode;nn(d),d.append(u),e.items.clear()}Ir(e,t,!l)}else o={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(o)}function Ir(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i<t.length;i++){var a=t[i];r?.has(a)?(a.f|=te,jn(a,document.createDocumentFragment())):B(t[i],n)}}var Lr;function X(t,n,i,a,o,s=null){var c=t,l=new Map;if(n&4){var u=t;c=T?D($t(u)):u.appendChild(F())}T&&xe();var d=null,f=ut(()=>{var t=i();return e(t)?t:t==null?[]:r(t)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,zr(v,p,c,n,a),d!==null&&(p.length===0?d.f&33554432?(d.f^=te,Vr(d,null,c)):kn(d):Dn(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:bn(()=>{p=W(f);var e=p.length;let t=!1;T&&we(c)===`[!`!=(e===0)&&(c=Ce(),D(c),be(!1),t=!0);for(var r=new Set,u=M,v=rn(),y=0;y<e;y+=1){T&&E.nodeType===8&&E.data===`]`&&(c=E,t=!0,be(!1));var b=p[y],x=a(b,y),S=h?null:l.get(x);S?(S.v&&Vt(S.v,b),S.i&&Vt(S.i,y),v&&u.unskip_effect(S.e)):(S=Br(l,h?c:Lr??=F(),b,x,y,o,n,i),h||(S.e.f|=te),l.set(x,S)),r.add(x)}if(e===0&&s&&!d&&(h?d=xn(()=>s(c)):(d=xn(()=>s(Lr??=F())),d.f|=te)),e>r.size&&Ae(``,``,``),T&&e>0&&D(Ce()),!h){if(m.set(u,r),v){for(let[e,t]of l)r.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u)}t&&be(!0),W(f)}),flags:n,items:l,pending:m,outrogroups:null,fallback:d};h=!1,T&&(c=E)}function Rr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function zr(e,t,n,i,a){var o=!!(i&8),s=t.length,c=e.items,l=Rr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(o)for(v=0;v<s;v+=1)h=t[v],g=a(h,v),_=c.get(g).e,_.f&33554432||(_.nodes?.a?.measure(),(f??=new Set).add(_));for(v=0;v<s;v+=1){if(h=t[v],g=a(h,v),_=c.get(g).e,e.outrogroups!==null)for(let t of e.outrogroups)t.pending.delete(_),t.done.delete(_);if(_.f&8192&&(kn(_),o&&(_.nodes?.a?.unfix(),(f??=new Set).delete(_))),_.f&33554432){if(_.f^=te,_===l)Vr(_,null,n);else{var y=d?d.next:l;_===e.effect.last&&(e.effect.last=_.prev),_.prev&&(_.prev.next=_.next),_.next&&(_.next.prev=_.prev),Hr(e,d,_),Hr(e,_,y),Vr(_,y,n),d=_,p=[],m=[],l=Rr(d.next);continue}}if(_!==l){if(u!==void 0&&u.has(_)){if(p.length<m.length){var b=m[0],x;d=b.prev;var S=p[0],ee=p[p.length-1];for(x=0;x<p.length;x+=1)Vr(p[x],b,n);for(x=0;x<m.length;x+=1)u.delete(m[x]);Hr(e,S.prev,ee.next),Hr(e,d,S),Hr(e,ee,b),l=b,d=ee,--v,p=[],m=[]}else u.delete(_),Vr(_,l,n),Hr(e,_.prev,_.next),Hr(e,_,d===null?e.effect.first:d.next),Hr(e,d,_),d=_;continue}for(p=[],m=[];l!==null&&l!==_;)(u??=new Set).add(l),m.push(l),l=Rr(l.next);if(l===null)continue}_.f&33554432||p.push(_),d=_,l=Rr(_.next)}if(e.outrogroups!==null){for(let t of e.outrogroups)t.pending.size===0&&(Ir(e,r(t.done)),e.outrogroups?.delete(t));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||u!==void 0){var ne=[];if(u!==void 0)for(_ of u)_.f&8192||ne.push(_);for(;l!==null;)!(l.f&8192)&&l!==e.fallback&&ne.push(l),l=Rr(l.next);var re=ne.length;if(re>0){var ie=i&4&&s===0?n:null;if(o){for(v=0;v<re;v+=1)ne[v].nodes?.a?.measure();for(v=0;v<re;v+=1)ne[v].nodes?.a?.fix()}Fr(e,ne,ie)}}o&&Ke(()=>{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function Br(e,t,n,r,i,a,o,s){var c=o&1?o&16?Lt(n):Rt(n,!1,!1):null,l=o&2?Lt(i):null;return{v:c,i:l,e:xn(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function Vr(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=en(r);if(a.before(r),r===i)return;r=o}}function Hr(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function Ur(e,t,...n){var r=new Nr(e);bn(()=>{let e=t()??null;r.ensure(e,e&&(t=>e(t,...n)))},x)}var Wr=[...`
|
|
2
|
+
\r\f\xA0\v`];function Gr(e,t,n){var r=e==null?``:``+e;if(t&&(r=r?r+` `+t:t),n){for(var i of Object.keys(n))if(n[i])r=r?r+` `+i:i;else if(r.length)for(var a=i.length,o=0;(o=r.indexOf(i,o))>=0;){var s=o+a;(o===0||Wr.includes(r[o-1]))&&(s===r.length||Wr.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function Kr(e,t=!1){var n=t?` !important;`:`;`,r=``;for(var i of Object.keys(e)){var a=e[i];a!=null&&a!==``&&(r+=` `+i+`: `+a+n)}return r}function qr(e){return e[0]!==`-`||e[1]!==`-`?e.toLowerCase():e}function Jr(e,t){if(t){var n=``,r,i;if(Array.isArray(t)?(r=t[0],i=t[1]):r=t,e){e=String(e).replaceAll(/\/\*.*?\*\//g,``).trim();var a=!1,o=0,s=!1,c=[];r&&c.push(...Object.keys(r).map(qr)),i&&c.push(...Object.keys(i).map(qr));var l=0,u=-1;let t=e.length;for(var d=0;d<t;d++){var f=e[d];if(s?f===`/`&&e[d-1]===`*`&&(s=!1):a?a===f&&(a=!1):f===`/`&&e[d+1]===`*`?s=!0:f===`"`||f===`'`?a=f:f===`(`?o++:f===`)`&&o--,!s&&a===!1&&o===0){if(f===`:`&&u===-1)u=d;else if(f===`;`||d===t-1){if(u!==-1){var p=qr(e.substring(l,u).trim());if(!c.includes(p)){f!==`;`&&d++;var m=e.substring(l,d).trim();n+=` `+m+`;`}}l=d+1,u=-1}}}}return r&&(n+=Kr(r)),i&&(n+=Kr(i,!0)),n=n.trim(),n===``?null:n}return e==null?null:String(e)}function Yr(e,t,n,r,i,a){var o=e[le];if(T||o!==n||o===void 0){var s=Gr(n,r,a);(!T||s!==e.getAttribute(`class`))&&(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[le]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}function Xr(e,t={},n,r){for(var i in n){var a=n[i];t[i]!==a&&(n[i]==null?e.style.removeProperty(i):e.style.setProperty(i,a,r))}}function Zr(e,t,n,r){var i=e[C];if(T||i!==t){var a=Jr(t,r);(!T||a!==e.getAttribute(`style`))&&(a==null?e.removeAttribute(`style`):e.style.cssText=a),e[C]=t}else r&&(Array.isArray(r)?(Xr(e,n?.[0],r[0]),Xr(e,n?.[1],r[1],`important`)):Xr(e,n,r));return r}function Qr(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function $r(t,n){var r=t.__defaultValue,i=t.multiple,a=i?r??[]:null;if(!i||e(a)){var o=t.selectedIndex,s=n&&i?new Set(t.selectedOptions):null;for(var c of t.options){var l=ni(c);Qr(c,i?a.includes(l):qt(l,r))}if(n){if(s!==null)for(c of t.options){var u=s.has(c);c.selected!==u&&(c.selected=u)}else t.selectedIndex!==o&&(t.selectedIndex=o)}}}function ei(t,n,r=!1){if(t.multiple){if(n==null)return;if(!e(n))return ve();for(var i of t.options)i.selected=n.includes(ni(i));return}for(i of t.options)if(qt(ni(i),n)){i.selected=!0;return}(!r||n!==void 0)&&(t.selectedIndex=-1)}function ti(e){var t=new MutationObserver(t=>{t.every(ri)||(`__defaultValue`in e&&$r(e,!1),`__value`in e&&ei(e,e.__value))});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),pn(()=>{t.disconnect()})}function ni(e){return`__value`in e?e.__value:e.value}function ri(e){if(e.target.closest(`selectedcontent`)!==null)return!0;if(e.type===`childList`){var t=[...e.addedNodes,...e.removedNodes];return t.length>0&&t.every(e=>e.nodeName===`SELECTEDCONTENT`)}return!1}var ii=Symbol(`is custom element`),ai=Symbol(`is html`),oi=pe?`link`:`LINK`;function si(e){if(T){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Z(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Z(e,`checked`,null),e.checked=r}}};e[de]=n,Ke(n),et()}}function ci(e,t){var n=li(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function Z(e,t,n,r){var i=li(e);T&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===oi)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[se]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&di(e).has(t)?e[t]=n:e.setAttribute(t,n))}function li(e){return e[ce]??={[ii]:e.nodeName.includes(`-`),[ai]:e.namespaceURI===he}}var ui=new Map;function di(e){var t=e.getAttribute(`is`)||e.nodeName,n=ui.get(t);if(n)return n;ui.set(t,n=new Set);for(var r,i=e,a=Element.prototype;a!==i;){for(var s in r=o(i),r)r[s].set&&s!==`innerHTML`&&s!==`textContent`&&s!==`innerText`&&n.add(s);i=l(i)}return n}function fi(e,t,n=t){var r=new WeakSet;nt(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=pi(e)?mi(a):a,n(a),M!==null&&r.add(M),await nr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(T&&e.defaultValue!==e.value||ar(t)==null&&e.value)&&(n(pi(e)?mi(e.value):e.value),M!==null&&r.add(M)),yn(()=>{var n=t();if(e===document.activeElement){var i=M;if(r.has(i))return}pi(e)&&n===mi(e.value)||(e.type!==`date`||n||e.value)&&n!==e.value&&(e.value=n??``)})}function pi(e){var t=e.type;return t===`number`||t===`range`}function mi(e){return e===``?null:+e}function hi(e,t){return e===t||e?.[ae]===t}function gi(e=He(),t,n,r){var i=k.r,a=H;return _n(()=>{var o,s;return yn(()=>{o=s,s=r?.()||[],ar(()=>{hi(n(...s),e)||(t(e,...s),o&&hi(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&hi(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function _i(e){k===null&&Oe(`onMount`),mn(()=>{let t=ar(e);if(typeof t==`function`)return t})}typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var vi=Sr(`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m3.4 8.4 3 3 6.2-6.8"></path></svg>`),yi=Sr(`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M8 4v5"></path><path d="M8 12h.01"></path></svg>`),bi=Sr(`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M4 4l8 8M12 4l-8 8"></path></svg>`),xi=K(`<span class="fix svelte-1grjtup"> </span>`),Si=K(`<li class="svelte-1grjtup"><span class="mark svelte-1grjtup" aria-hidden="true"><!></span> <span class="body svelte-1grjtup"><b class="svelte-1grjtup"> </b> <span class="msg svelte-1grjtup"> </span> <!></span> <span class="sr svelte-1grjtup"> </span></li>`),Ci=K(`<section class="health svelte-1grjtup" aria-label="Health"><header class="svelte-1grjtup"><h2 class="svelte-1grjtup"> </h2> <p class="svelte-1grjtup">This is the same check <code>npx verbaly doctor</code> runs, read out loud. It looks at your
|
|
3
|
+
settings, your catalogs and the way your build is wired, and it never changes anything.</p> <button class="close svelte-1grjtup">Back to the messages</button></header> <ul class="svelte-1grjtup"></ul></section>`);function wi(e,t){Be(t,!0);let n={config:`Your settings`,cli:`The verbaly command`,catalogs:`Your catalogs`,routing:`Where the language lives in your urls`,plugin:`The piece that wires your build`,types:`The generated types`,sources:`Reading your code`,orphans:`Keys nothing in your code uses`,bundle:`What the browser downloads`,translations:`The translations themselves`},r=j(()=>t.entries.filter(e=>e.level!==`ok`).length);var i=Ci(),a=I(i),o=I(a),s=L(o,!0),c=R(o,4);O(a);var l=R(a,2);X(l,21,()=>t.entries,Pr,(e,t)=>{var r=Si(),i=I(r),a=I(i),o=e=>{q(e,vi())},s=e=>{q(e,yi())},c=e=>{q(e,bi())};Y(a,e=>{W(t).level===`ok`?e(o):W(t).level===`warn`?e(s,1):e(c,-1)}),O(i);var l=R(i,2),u=I(l),d=L(u,!0),f=R(u,2),p=L(f,!0),m=R(f,2),h=e=>{var n=xi(),r=L(n,!0);z(()=>J(r,W(t).fix)),q(e,n)};Y(m,e=>{W(t).fix&&e(h)}),O(l);var g=L(R(l,2),!0);O(r),z(()=>{Z(r,`data-level`,W(t).level),J(d,n[W(t).check]??W(t).check),J(p,W(t).message),J(g,W(t).level)}),q(e,r)}),O(l),O(i),z(()=>J(s,t.ok?`Nothing is broken`:`${W(r)} of ${t.entries.length} need you`)),G(`click`,c,function(...e){t.onClose?.apply(this,e)}),q(e,i),Ve()}pr([`click`]);var Ti=new Set;function Ei(e){Ti.has(e)||(Ti.add(e),console.warn(`[verbaly] ${e}`))}var Di=200,Oi=new Map;function ki(e,t,n){let r=e.get(t);return r||(e.size>=Di&&e.delete(e.keys().next().value),r=n(),e.set(t,r)),r}function Ai(e){return ki(Oi,e,()=>new Intl.DisplayNames(e,{type:`language`}))}function ji(e,t=e){try{return Ai(t).of(e)??e}catch{return e}}var Mi=/\{\s*[a-zA-Z0-9_]+\s*,\s*(?:plural|selectordinal|select|number|date|time)\b/;function Ni(e){return Mi.test(e)}function Pi(e){let t=0,n=()=>e.charAt(t),r=()=>{for(;t<e.length&&/\s/.test(n());)t++},i=()=>{let r=``;for(;t<e.length&&/[a-zA-Z0-9_]/.test(n());)r+=e[t++];return r};function a(r){let i=[],a=``,c=()=>{a&&i.push({kind:`text`,value:a}),a=``};for(;t<e.length;){let e=n();if(e===`}`)break;e===`{`?(c(),i.push(s())):e===`#`&&r?(c(),i.push({kind:`hash`}),t++):e===`'`?a+=o():(a+=e,t++)}return c(),i}function o(){if(t++,n()===`'`)return t++,`'`;let r=n();if(r!==`{`&&r!==`}`&&r!==`#`)return`'`;let i=``;for(;t<e.length;){if(n()===`'`){if(e.charAt(t+1)===`'`){i+=`'`,t+=2;continue}return t++,i}i+=e[t++]}return i}function s(){t++,r();let o=i();if(r(),n()===`}`)return t++,{kind:`param`,name:o};n()===`,`&&t++,r();let s=i(),u={kind:`param`,name:o};if(s===`number`||s===`date`||s===`time`){r();let i=``;if(n()===`,`){for(t++,r();t<e.length&&n()!==`}`&&n()!==`,`;)i+=e[t++];i=i.trim()}return s===`number`?u.format=i===`integer`||i===`percent`||i===`currency`?i:`number`:(u.format=s,i&&(u.arg=i)),l(),u}if(s===`plural`||s===`selectordinal`||s===`select`){s===`selectordinal`&&(u.ordinal=!0);let i=[];if(r(),n()===`,`&&t++,r(),s!==`select`&&e.startsWith(`offset:`,t)){for(t+=7,r();t<e.length&&/[0-9]/.test(n());)t++;r()}for(;t<e.length&&n()!==`}`;){let e=c();if(r(),n()!==`{`)break;t++;let o=a(s!==`select`);n()===`}`&&t++,i.push([e,o]),r()}return n()===`}`&&t++,u.variants=i,u}return l(),u}function c(){if(n()===`=`){let r=`=`;for(t++;t<e.length&&/[0-9]/.test(n());)r+=e[t++];return r}let r=``;for(;t<e.length&&!/[\s{]/.test(n());)r+=e[t++];return r}function l(){for(;t<e.length&&n()!==`}`;)t++;n()===`}`&&t++}return a(!1)}var Fi=new Map,Ii=5e3;function Li(e,t){let n=Fi.get(e);if(!n){if(Ni(e)){if(!t)return Ri(e);n=t(e)}else n=zi(e,!1);Fi.size>=Ii&&Fi.delete(Fi.keys().next().value),Fi.set(e,n)}return n}function Ri(e){return Ei(`a message uses ICU syntax but no ICU parser is loaded: pass icu to createVerbaly (the compiler wires it when a catalog needs it, so this means it arrived after the build)`),[{kind:`text`,value:e}]}function zi(e,t){let n=[],r=``,i=0,a=()=>{r&&n.push({kind:`text`,value:r}),r=``};for(;i<e.length;){let o=e[i];if(o===`{`){if(e[i+1]===`{`){r+=`{`,i+=2;continue}let t=Bi(e,i);if(t<0){r+=e.slice(i);break}a(),n.push(Vi(e.slice(i+1,t))),i=t+1}else o===`}`&&e[i+1]===`}`?(r+=`}`,i+=2):t&&o===`#`?e[i+1]===`#`?(r+=`#`,i+=2):(a(),n.push({kind:`hash`}),i+=1):(r+=o,i+=1)}return a(),n}function Bi(e,t){let n=0,r=t;for(;r<e.length;){let t=e[r];if(t===`{`){if(e[r+1]===`{`){r+=2;continue}n+=1}else if(t===`}`){if(e[r+1]===`}`){r+=2;continue}if(--n,n===0)return r}r+=1}return-1}function Vi(e){let t=Hi(e),n=(t[0]??``).trim();if(!n)return{kind:`text`,value:`{${e}}`};let r=n.indexOf(`:`),i=(r<0?n:n.slice(0,r)).trim();if(!i)return{kind:`text`,value:`{${e}}`};let a={kind:`param`,name:i};if(r>=0){let e=n.slice(r+1).trim(),t=e.indexOf(`/`);a.format=(t<0?e:e.slice(0,t)).trim(),t>=0&&(a.arg=e.slice(t+1).trim())}if(t.length>1){a.variants=[];for(let e of t.slice(1)){let t=e.indexOf(`:`);if(t<0)continue;let n=e.slice(0,t).trim(),r=e.slice(t+1).trim();n&&a.variants.push([n,zi(r,!0)])}}return a}function Hi(e){let t=[],n=``,r=0,i=0;for(;i<e.length;){let a=e[i];if(a===`{`){if(e[i+1]===`{`){n+=`{{`,i+=2;continue}r+=1,n+=a}else if(a===`}`){if(e[i+1]===`}`){n+=`}}`,i+=2;continue}--r,n+=a}else if(a===`|`&&r===0){if(e[i+1]===`|`){n+=`|`,i+=2;continue}t.push(n),n=``}else n+=a;i+=1}return t.push(n),t}var Ui=/<(\/?)([a-zA-Z][\w-]*)(\/?)>/g,Wi=/&(?:(lt|gt|amp)|#(\d+)|#[xX]([0-9a-fA-F]+));/g,Gi={lt:`<`,gt:`>`,amp:`&`},Ki=e=>e.replace(Wi,(e,t,n,r)=>{if(t)return Gi[t];let i=n?parseInt(n,10):parseInt(r,16);return i<=1114111?String.fromCodePoint(i):e});function qi(e){Ui.lastIndex=0;let t=[],n=[],r=()=>n.length?n[n.length-1].children:t,i=e=>{e&&r().push(Ki(e))},a=0,o;for(;(o=Ui.exec(e))!==null;){let[t,s,c,l]=o;if(i(e.slice(a,o.index)),a=o.index+t.length,l)r().push({name:c,children:[]});else if(s){if(n.length&&n[n.length-1].name===c){let e=n.pop();r().push(e)}else i(t)}else n.push({name:c,children:[]})}for(i(e.slice(a));n.length;){let e=n.pop();r().push(...e.children)}return t}var Ji={done:{short:`ready`,long:`ready`},draft:{short:`unread`,long:`written by a machine, nobody has read it`},missing:{short:`missing`,long:`missing, so your visitor sees the source language`},broken:{short:`breaks`,long:`breaks your site`}},Yi={all:`everything`,missing:`missing`,draft:`unread`,broken:`breaks your site`,look:`worth a look`,clean:`nothing odd`},Xi={divergent:`the source says this two ways`,collision:`came back as two translations`,echo:`still identical to the source`,digits:`the numbers moved`,url:`a link changed`,code:`a code span changed`},Zi={cap:`Group`,all:`every group`,none:`Your keys have no groups yet.`,hint:`A key like nav.home belongs to nav.`},Qi=`Undo`,Q={find:`Find new text`,findWhy:`Reads your code and adds what your catalogs do not have yet.`,translate:`Translate what is missing`,translateWhy:`Calls your provider, so it costs money and takes minutes.`,cancel:`Not now`,working:`Reading your code`,running:`Translating`,nothingNew:`Nothing new: your catalogs already have every message your code uses.`,nothingMissing:`Nothing missing in the languages you ticked.`,pickFirst:`Tick a language to translate it.`,onlyLocale:`This project has one language, so there is nothing to translate into.`,scanOff:`Source scanning is off in your config, so there is nothing to read.`},$i={noCatalogs:`No messages yet. Studio reads the catalogs in your project, and there are none here.`,oneLocale:`One language is all you have, so there is nothing to compare it against yet.`,oneLocaleFix:`Add another one to your config and it shows up in the rail.`,pickOne:`Tick a language in the rail to see its translations.`,noMatch:`Nothing matches. Every message here is in the state you asked for.`};function ea(e){return`${e} ${e===1?`message`:`messages`}`}var ta={broken:{one:`translation breaks your site`,many:`translations break your site`},missing:{one:`message is missing`,many:`messages are missing`},draft:{one:`translation nobody has read`,many:`translations nobody has read`},undefined:{one:`key your code calls has no message`,many:`keys your code calls have no message`}},na={broken:`It lost a parameter or a tag, so the sentence would ship incomplete.`,missing:`Your visitor sees the source language until one is written.`,draft:`A machine wrote it and nobody has looked. It is already on your site.`,undefined:`Nothing defines it, so the build fails and the raw key would reach your page.`},ra={here:`Overview`,clear:`Nothing is waiting for you.`,clearWhy:`Every language is complete and the build passes.`,project:`Project`,healthy:`Healthy`,problems:`Needs a look`,checks:`checks`,history:`Last changes to your catalogs`,noHistory:`No git history for your catalog directory.`,countMessages:`Messages`,countLocales:`Languages`,open:`Open`},ia={label:`Search your messages`,scope:`Searches your text in every language, never the key.`,none:`Nothing has that text, in any language.`,oneHit:`1 message`,hits:e=>`${e} messages`,moveKeys:`move`,openKeys:`open`,closeKeys:`close`,close:`Close`,placeholder:`Search the text, not the key`},$={mark:`Look`,live:`They are already on your site.`,written:e=>`A machine wrote ${e===1?`one of them`:`${e} of them`} and nobody has read ${e===1?`it`:`them`} yet.`,sound:`Nothing is broken: the check your build runs passes on this language.`,broken:e=>`${e} ${e===1?`breaks`:`break`} your site, so ${e===1?`it is`:`they are`} first.`,flagged:e=>`${e} ${e===1?`is`:`are`} worth reading before the rest, so ${e===1?`it is`:`they are`} at the top.`,clean:`Nothing in them looks off to me.`,approve:e=>`Mark all of ${e} as read`,approveSub:e=>`${e} unread, and it undoes`,nothingUnread:`Every one of them has been read.`,chipAll:`Everything`,chipLook:`Look`,chipClean:`Nothing odd`,rest:e=>`${e} more with nothing odd. They are below and you do not need to read them.`,order:`Sorted by what is worth reading first`},aa=K(`<span> </span>`),oa=K(`<li><button><span> </span> <!></button></li>`),sa=K(`<button class="read svelte-l3e5c7"> <span class="n svelte-l3e5c7"> </span></button>`),ca=K(`<li><label><input type="checkbox" class="svelte-l3e5c7"/> <span class="meta svelte-l3e5c7"><span class="name svelte-l3e5c7"> <code class="svelte-l3e5c7"> </code></span> <span class="state svelte-l3e5c7"><b class="svelte-l3e5c7"> </b><!></span></span></label> <!></li>`),la=K(`<p class="undo svelte-l3e5c7"><span> </span> <button class="svelte-l3e5c7"> </button></p>`),ua=K(`<option> </option>`),da=K(`<h2 class="cap svelte-l3e5c7"> </h2> <select class="groups svelte-l3e5c7"><option> </option><!></select>`,1),fa=K(`<li><button type="button"><span> </span> <span class="count svelte-l3e5c7"> </span></button></li>`),pa=K(`<nav class="rail svelte-l3e5c7" aria-label="Languages and filters"><ul class="views svelte-l3e5c7"></ul> <!> <h2 class="cap svelte-l3e5c7">Languages</h2> <ul class="langs svelte-l3e5c7"></ul> <!> <!> <h2 class="cap svelte-l3e5c7">Show</h2> <ul class="filters svelte-l3e5c7"></ul></nav>`);function ma(e,t){Be(t,!0);let n=[{id:`overview`,label:`Overview`},{id:`messages`,label:`Messages`},{id:`health`,label:`Health`}],r=[`all`,`look`,`clean`,`missing`,`draft`,`broken`];function i(e){if(e.source)return[`the one you write`];let t=[];return e.broken&&t.push(`${e.broken} ${e.broken===1?`breaks`:`break`} your site`),e.missing&&t.push(`${e.missing} missing`),e.draft&&t.push(`${e.draft} nobody has read`),t.length?t:[`all read`]}function a(e){let t=i(e);return{lead:t[0],rest:t.slice(1).join(` · `)}}function o(e){return e.source?`done`:e.broken?`broken`:e.missing?`missing`:e.draft?`draft`:`done`}var s=pa(),c=I(s);X(c,21,()=>n,e=>e.id,(e,n)=>{var r=oa(),i=I(r);let a;var o=I(i),s=L(o,!0),c=R(o,2),l=e=>{var n=aa();let r;var i=L(n,!0);z(()=>{r=Yr(n,1,`bad svelte-l3e5c7`,null,r,{clean:!t.checks.bad}),J(i,t.checks.bad||`ok`)}),q(e,n)};Y(c,e=>{W(n).id===`health`&&t.checks&&e(l)}),O(i),O(r),z(()=>{a=Yr(i,1,`nav svelte-l3e5c7`,null,a,{on:t.view===W(n).id}),Z(i,`aria-current`,t.view===W(n).id?`page`:void 0),J(s,W(n).label)}),G(`click`,i,()=>t.onView(W(n).id)),q(e,r)}),O(c);var l=R(c,2);Ur(l,()=>t.actions);var u=R(l,4);X(u,21,()=>t.health,e=>e.locale,(e,n,r,i)=>{let s=j(()=>a(W(n)));var c=ca(),l=I(c);let u;var d=I(l);si(d);var f=R(d,2),p=I(f),m=I(p),h=L(R(m),!0);O(p);var g=R(p,2),_=I(g),v=L(_,!0),y=R(_),b=e=>{var t=Cr();z(()=>J(t,` · ${W(s).rest??``}`)),q(e,t)};Y(y,e=>{W(s).rest&&e(b)}),O(g),O(f),O(l);var x=R(l,2),S=e=>{var r=sa(),i=I(r),a=L(R(i),!0);O(r),z(()=>{J(i,`Mark as read `),J(a,W(n).draft)}),G(`click`,r,()=>t.onRead(W(n).locale)),q(e,r)};Y(x,e=>{!W(n).source&&W(n).draft>0&&e(S)}),O(c),z((e,t,r)=>{u=Yr(l,1,`lang svelte-l3e5c7`,null,u,{source:W(n).source}),ci(d,e),d.disabled=W(n).source,J(m,`${t??``} `),J(h,W(n).locale),Z(g,`data-state`,r),J(v,W(s).lead)},[()=>t.shown.includes(W(n).locale),()=>ji(W(n).locale),()=>o(W(n))]),G(`change`,d,()=>t.onToggle(W(n).locale)),q(e,c)}),O(u);var d=R(u,2),f=e=>{var n=la(),r=I(n),i=L(r),a=R(r,2),o=L(a,!0);O(n),z(()=>{J(i,`${t.pending.keys.length??``} in ${t.pending.locale??``} marked as read`),J(o,Qi)}),G(`click`,a,function(...e){t.onUndo?.apply(this,e)}),q(e,n)};Y(d,e=>{t.pending&&e(f)});var p=R(d,2),m=e=>{var n=da(),r=tn(n),i=L(r,!0),a=R(r,2),o=I(a),s=L(o,!0);o.value=o.__value=``,X(R(o),17,()=>t.groups,e=>e.name,(e,t)=>{var n=ua(),r=L(n),i={};z(()=>{J(r,`${W(t).name??``} (${W(t).total??``})${W(t).broken+W(t).missing+W(t).draft>0?` · ${W(t).broken+W(t).missing+W(t).draft} to do`:``}`),i!==(i=W(t).name)&&(n.value=(n.__value=i)??``)}),q(e,n)}),O(a);var c;ti(a),z(()=>{J(i,Zi.cap),Z(a,`aria-label`,Zi.cap),J(s,Zi.all),c!==(c=t.group??``)&&(a.value=(a.__value=c)??``,ei(a,c))}),G(`change`,a,e=>t.onGroup(e.currentTarget.value||null)),q(e,n)};Y(p,e=>{t.groups.length&&e(m)});var h=R(p,4);X(h,20,()=>r,e=>e,(e,n)=>{var r=fa(),i=I(r);let a;var o=I(i),s=L(o,!0),c=L(R(o,2),!0);O(i),O(r),z(()=>{a=Yr(i,1,`svelte-l3e5c7`,null,a,{on:t.state===n}),J(s,Yi[n]),J(c,t.counts[n]??0)}),G(`click`,i,()=>t.onState(n)),q(e,r)}),O(h),O(s),q(e,s),Ve()}pr([`click`,`change`]);var ha=Sr(`<svg viewBox="0 0 22 22" width="15" height="15" aria-hidden="true"><path d="M5 11h12" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path></svg>`),ga=Sr(`<svg viewBox="0 0 22 22" width="15" height="15" aria-hidden="true" fill="none"><path d="M6 12.5 11 7l5 5.5" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11 8v7" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"></path></svg>`),_a=Sr(`<svg viewBox="0 0 22 22" width="15" height="15" aria-hidden="true" fill="none"><path d="M4.5 12.5c1.6-2.2 3.2-2.2 4.8 0s3.2 2.2 4.8 0 3.2-2.2 4.8 0" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"></path></svg>`),va=Sr(`<svg viewBox="0 0 22 22" width="15" height="15" aria-hidden="true"><path d="M11 6v6.4" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path><circle cx="11" cy="16" r="1.2" fill="currentColor"></circle></svg>`),ya=K(`<!> <span class="sr svelte-1fu82r1"> </span>`,1);function ba(e,t){let n={done:`translated`,draft:`written by a machine`,missing:`not translated, shows in your source language`,broken:`breaks your site`};var r=ya(),i=tn(r),a=e=>{q(e,ha())},o=e=>{q(e,ga())},s=e=>{q(e,_a())},c=e=>{q(e,va())};Y(i,e=>{t.state===`done`?e(a):t.state===`missing`?e(o,1):t.state===`draft`?e(s,2):e(c,-1)});var l=L(R(i,2),!0);z(()=>J(l,n[t.state])),q(e,r)}function xa(e,t){for(let n of e)if(n.kind===`param`&&n.name){t.has(n.name)||t.set(n.name,new Set);for(let[e,r]of n.variants??[])t.get(n.name).add(e),xa(r,t)}}function Sa(e){let t=new Map;try{xa(Li(e,Pi),t)}catch{}return t}function Ca(e,t){for(let n of e)typeof n!=`string`&&(t.push(n.name),Ca(n.children,t))}function wa(e){let t=[];try{Ca(qi(e),t)}catch{return t}return t}function Ta(e){let t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);return t}var Ea=e=>e.length===1?e[0]:`${e.slice(0,-1).join(`, `)} and ${e.at(-1)}`;function Da(e,t){let n=Sa(e),r=Sa(t),i=[...new Set([...n.keys(),...r.keys()])].sort().map(e=>({name:e,inSource:n.has(e),inTarget:r.has(e)})),a=[],o=i.filter(e=>e.inSource&&!e.inTarget).map(e=>`{${e.name}}`),s=i.filter(e=>!e.inSource&&e.inTarget).map(e=>`{${e.name}}`);o.length&&a.push(`${Ea(o)} is missing, so its value never reaches the text`),s.length&&a.push(`${Ea(s)} is not in the source, so it renders as literal text`);for(let[e,t]of r)t.size&&!t.has(`other`)&&a.push(`the block for {${e}} has no "other" case, so some counts render empty`);let c=Ta(wa(e)),l=Ta(wa(t));for(let[e,t]of c)(l.get(e)??0)<t&&a.push(`<${e}> is missing from the translation`);for(let[e,t]of l)(c.get(e)??0)<t&&a.push(`<${e}> is not in the source message`);return{params:i,problems:a}}var Oa=K(`<span class="ojo svelte-2clsr"> </span>`),ka=K(`<span class="rmark svelte-2clsr"><!></span>`),Aa=K(`<span class="tile svelte-2clsr"><!></span>`),ja=K(`<span> </span>`),Ma=K(`<span class="vmsg svelte-2clsr"> </span>`),Na=K(`<span class="tl edit svelte-2clsr"><span class="disc svelte-2clsr"> </span> <textarea class="tf svelte-2clsr" rows="2"></textarea></span> <span class="editbar svelte-2clsr"><!> <!> <!> <button class="btn sm svelte-2clsr"> </button> <button class="btn sm quiet svelte-2clsr">Cancel</button> <span class="keys svelte-2clsr">Enter saves · Esc closes</span></span>`,1),Pa=K(`<button class="tv svelte-2clsr"> </button>`),Fa=K(`<button class="tv none svelte-2clsr"> </button>`),Ia=K(`<span class="sig svelte-2clsr"> </span>`),La=K(`<span class="tl svelte-2clsr"><span class="disc svelte-2clsr"> </span> <!> <!></span>`),Ra=K(`<span class="why svelte-2clsr"> </span>`),za=K(`<article><!> <span class="row-t svelte-2clsr"><span class="src svelte-2clsr"> </span> <!></span> <!></article>`);function Ba(e,t){Be(t,!0);let n=j(()=>t.why!==void 0),r=j(()=>t.row.cells.filter(e=>t.shown.includes(e.locale))),i=j(()=>[`broken`,`missing`,`draft`,`done`].find(e=>W(r).some(t=>t.state===e))??`done`),a=N(``),o=N(!1),s=N(null),c=j(()=>Da(t.row.source,W(a))),l=e=>`${e.locale} ${t.row.key}`;function u(e){P(a,e.text,!0),P(s,null),t.onEdit(l(e))}async function d(e){W(o)||(P(o,!0),P(s,await t.onSave(e.locale,t.row.key,W(a)),!0),P(o,!1),W(s)||t.onEdit(null))}function f(e,n){e.key===`Escape`&&t.onEdit(null),e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),d(n))}var p=za();let m;var h=I(p),g=e=>{var n=ka(),r=I(n),i=e=>{var t=Oa(),n=L(t,!0);z(()=>J(n,$.mark)),q(e,t)};Y(r,e=>{t.why&&e(i)}),O(n),q(e,n)},_=e=>{var t=Aa();ba(I(t),{get state(){return W(i)}}),O(t),z(()=>Z(t,`data-state`,W(i))),q(e,t)};Y(h,e=>{W(n)?e(g):e(_,-1)});var v=R(h,2),y=I(v),b=L(y,!0);X(R(y,2),17,()=>W(r),e=>e.locale,(e,r)=>{var i=wr(),p=tn(i),m=e=>{var n=Na(),i=tn(n),l=I(i),u=L(l,!0),p=R(l,2);Qe(p),Ze(p,!0),O(i);var m=R(i,2),h=I(m);X(h,17,()=>W(c).params,e=>e.name,(e,t)=>{var n=ja();let r;var i=L(n);z(()=>{r=Yr(n,1,`pm svelte-2clsr`,null,r,{gone:W(t).inSource&&!W(t).inTarget}),J(i,`${W(t).inSource&&!W(t).inTarget?`+`:``}{${W(t).name??``}}`)}),q(e,n)});var g=R(h,2);X(g,16,()=>W(c).problems,e=>e,(e,t)=>{var n=Ma(),r=L(n,!0);z(()=>J(r,t)),q(e,n)});var _=R(g,2),v=e=>{var t=Ma(),n=L(t,!0);z(()=>J(n,W(s))),q(e,t)};Y(_,e=>{W(s)&&!W(c).problems.length&&e(v)});var y=R(_,2),b=L(y,!0),x=R(y,2);Se(2),O(m),z(()=>{Z(l,`data-state`,W(r).state),J(u,W(r).locale),Z(p,`aria-label`,`Translation for ${W(r).locale??``}`),y.disabled=W(o),J(b,W(o)?`Saving`:`Save`)}),G(`keydown`,p,e=>f(e,W(r))),fi(p,()=>W(a),e=>P(a,e)),G(`click`,y,()=>d(W(r))),G(`click`,x,()=>t.onEdit(null)),q(e,n)},h=j(()=>t.editing===l(W(r))),g=e=>{var t=La(),i=I(t),a=L(i,!0),o=R(i,2),s=e=>{var t=Pa(),n=L(t,!0);z(()=>{Z(t,`title`,W(r).text),J(n,W(r).text)}),G(`click`,t,()=>u(W(r))),q(e,t)},c=e=>{var t=Fa(),n=L(t,!0);z(()=>J(n,Ji.missing.long)),G(`click`,t,()=>u(W(r))),q(e,t)};Y(o,e=>{W(r).text?e(s):e(c,-1)});var l=R(o,2),d=e=>{var t=wr();X(tn(t),17,()=>W(r).reasons,e=>e.signal,(e,t)=>{var n=Ia(),r=L(n,!0);z(()=>{Z(n,`title`,W(t).text),J(r,Xi[W(t).signal]??W(t).signal)}),q(e,n)}),q(e,t)};Y(l,e=>{W(n)||e(d)}),O(t),z(()=>{Z(i,`data-state`,W(r).state),J(a,W(r).locale)}),q(e,t)};Y(p,e=>{W(h)?e(m):e(g,-1)}),q(e,i)}),O(v);var x=R(v,2),S=e=>{var n=Ra(),r=L(n,!0);z(()=>J(r,t.why??``)),q(e,n)};Y(x,e=>{W(n)&&e(S)}),O(p),z(e=>{m=Yr(p,1,`row svelte-2clsr`,null,m,{open:e,flagged:W(n)&&!!t.why}),Z(p,`data-worst`,W(i)),Z(p,`data-key`,t.row.key),J(b,t.row.source)},[()=>W(r).some(e=>t.editing===l(e))]),q(e,p),Ve()}pr([`keydown`,`click`]);function Va(e,t=``,n={}){for(let[r,i]of Object.entries(e)){let e=t?`${t}.${r}`:r;typeof i==`string`?n[e]=i:i&&typeof i==`object`&&!Array.isArray(i)&&Va(i,e,n)}return n}function Ha(e){let t={};for(let n of e.locales)t[n]=Va(e.catalogs[n]??{});let n=new Map;for(let t of e.check.broken)t.severity===`error`&&n.set(`${t.locale}\u0000${t.key}`,t.issue);let r=new Map;for(let[t,n]of Object.entries(e.drafts))r.set(t,new Set(n));let i=t[e.sourceLocale]??{},a=e.locales.filter(t=>t!==e.sourceLocale),o=Object.keys(i).map(o=>({key:o,source:i[o]??``,origins:e.origins[o]??[],cells:a.map(i=>{let a=t[i]?.[o]??``,s=n.get(`${i}\u0000${o}`);return{locale:i,text:a,state:s?`broken`:a?r.get(i)?.has(o)?`draft`:`done`:`missing`,issue:s,reasons:e.triage?.[i]?.[o]??[]}})}));return{root:e.root,scanning:e.scanning,sourceLocale:e.sourceLocale,locales:e.locales,rows:o,undefined:e.check.unknown??[],problems:e.problems}}function Ua(e){return e.locales.map(t=>{let n=e.rows.length;if(t===e.sourceLocale)return{locale:t,source:!0,total:n,done:n,draft:0,missing:0,broken:0};let r={done:0,draft:0,missing:0,broken:0};for(let n of e.rows){let e=n.cells.find(e=>e.locale===t);e&&r[e.state]++}return{locale:t,source:!1,total:n,...r}})}function Wa(e,t){Object.assign(e,Ha(t))}function Ga(e,t,n){return e.rows.length?e.locales.length<2?`oneLocale`:t.length?n.length?null:`noMatch`:`pickOne`:`noCatalogs`}function Ka(e){let t=e.indexOf(`.`);return t>0?e.slice(0,t):null}function qa(e,t){let n=new Set(t),r=new Map;for(let t of e){let e=Ka(t.key);if(e===null)continue;let i=r.get(e)??{name:e,total:0,broken:0,missing:0,draft:0};i.total+=1;for(let e of t.cells)n.has(e.locale)&&e.state!==`done`&&(i[e.state]+=1);r.set(e,i)}return[...r.values()].sort((e,t)=>e.name<t.name?-1:1)}function Ja(e,t){let n=t.text.trim().toLowerCase(),r=new Set(t.locales);return e.filter(e=>{let i=e.cells.filter(e=>r.has(e.locale));return t.state===`look`&&!i.some(e=>e.reasons.length)||t.state===`clean`&&i.some(e=>e.reasons.length)||t.state!==`all`&&t.state!==`look`&&t.state!==`clean`&&!i.some(e=>e.state===t.state)||t.group&&Ka(e.key)!==t.group?!1:!n||e.source.toLowerCase().includes(n)?!0:i.some(e=>e.text.toLowerCase().includes(n))})}var Ya=[`broken`,`missing`,`draft`,`done`];function Xa(e){for(let t of Ya)if(e.cells.some(e=>e.state===t))return t;return`done`}function Za(e,t,n=40){let r=t.trim().toLowerCase();if(!r)return[];let i=[];for(let t of e.rows){let a=[];t.source.toLowerCase().includes(r)&&a.push(e.sourceLocale);for(let e of t.cells)e.text.toLowerCase().includes(r)&&a.push(e.locale);if(!a.length)continue;let o=a[0],s=o===e.sourceLocale?t.source:t.cells.find(e=>e.locale===o)?.text??``;if(i.push({key:t.key,group:Ka(t.key),source:t.source,locales:a,text:s,state:Xa(t)}),i.length===n)break}return i}function Qa(e,t){let n=t.trim(),r=e.toLowerCase().indexOf(n.toLowerCase());return r<0?[e,``,``]:[e.slice(0,r),e.slice(r,r+n.length),e.slice(r+n.length)]}function $a(e,t){let n=[],r=[];for(let i of e)(i.cells.find(e=>e.locale===t)?.reasons.length?n:r).push(i);return{rows:[...n,...r],flagged:n.length}}function eo(e,t){let n=e.cells.find(e=>e.locale===t);return n?.reasons.length?n.reasons.map(e=>e.text).join(`. `):null}var to=K(`<button> <b class="svelte-1u5fzi5"> </b></button>`),no=K(`<header class="langbar svelte-1u5fzi5"><div class="text svelte-1u5fzi5"><h2 class="svelte-1u5fzi5"> </h2> <p class="live svelte-1u5fzi5"><span class="disc svelte-1u5fzi5"> </span> <b class="svelte-1u5fzi5"> </b></p> <p class="why svelte-1u5fzi5"> </p></div> <div class="go svelte-1u5fzi5"><button class="btn svelte-1u5fzi5"> </button> <span class="sub svelte-1u5fzi5"> </span></div></header> <div class="chips svelte-1u5fzi5"></div>`,1);function ro(e,t){Be(t,!0);let n=j(()=>ji(t.locale)),r=j(()=>[t.unread>0?$.written(t.unread):$.nothingUnread,t.broken>0?$.broken(t.broken):$.sound,t.flagged>0?$.flagged(t.flagged):$.clean].join(` `)),i=j(()=>[{id:`all`,label:$.chipAll,n:t.total},{id:`look`,label:$.chipLook,n:t.flagged},{id:`clean`,label:$.chipClean,n:t.total-t.flagged}]);var a=no(),o=tn(a),s=I(o),c=I(s),l=L(c,!0),u=R(c,2),d=I(u),f=L(d,!0),p=R(d),m=L(R(p),!0);O(u);var h=L(R(u,2),!0);O(s);var g=R(s,2),_=I(g),v=L(_,!0),y=L(R(_,2),!0);O(g),O(o);var b=R(o,2);X(b,21,()=>W(i),e=>e.id,(e,n)=>{var r=to();let i;var a=I(r),o=L(R(a),!0);O(r),z(()=>{i=Yr(r,1,`pill svelte-1u5fzi5`,null,i,{on:t.chip===W(n).id,look:W(n).id===`look`}),Z(r,`aria-pressed`,t.chip===W(n).id),J(a,`${W(n).label??``} `),J(o,W(n).n)}),G(`click`,r,()=>t.onChip(W(n).id)),q(e,r)}),O(b),z((e,i,a)=>{J(l,W(n)),J(f,t.locale),J(p,`${e??``}. `),J(m,$.live),J(h,W(r)),_.disabled=t.unread===0,J(v,i),J(y,a)},[()=>ea(t.total),()=>$.approve(W(n)),()=>t.unread>0?$.approveSub(t.unread):$.nothingUnread]),G(`click`,_,function(...e){t.onApprove?.apply(this,e)}),q(e,a),Ve()}pr([`click`]);var io=K(`<div class="bill svelte-a18sfu"><p class="lede svelte-a18sfu"> </p> <p class="why svelte-a18sfu"> </p> <div class="pair svelte-a18sfu"><button class="go svelte-a18sfu"> </button> <button class="plain svelte-a18sfu"> </button></div></div>`),ao=K(`<div class="bill svelte-a18sfu"><p class="lede svelte-a18sfu"> </p> <div class="track svelte-a18sfu"><span class="fill svelte-a18sfu"></span></div> <p class="why svelte-a18sfu"> </p></div>`),oo=K(`<button class="act svelte-a18sfu"><span class="name svelte-a18sfu"> </span> <span class="why svelte-a18sfu"> </span></button> <button class="act svelte-a18sfu"><span class="name svelte-a18sfu"> </span> <span class="why svelte-a18sfu"> </span></button>`,1),so=K(`<p> </p>`),co=K(`<section class="acts svelte-a18sfu" aria-label="Commands"><h2 class="cap svelte-a18sfu">Commands</h2> <!> <!></section>`);function lo(e,t){Be(t,!0);let n=N(Gt({at:`idle`})),r=j(()=>W(n).at===`finding`||W(n).at===`planning`||W(n).at===`running`);function i(e,t=!1){P(n,{at:`said`,text:e,bad:t},!0)}async function a(){P(n,{at:`finding`},!0);let e=await t.api.extract();if(e.error||!e.value)return i(e.error??`no answer`,!0);let{found:r}=e.value;if(!r)return i(Q.nothingNew);let a=`${ea(r)} your code uses and your catalogs did not have`;await t.onDone(a),i(a)}async function o(){P(n,{at:`planning`},!0);let e=await t.api.plan(t.shown);if(e.error||!e.value)return i(e.error??`no answer`,!0);if(!e.value.total)return i(Q.nothingMissing);P(n,{at:`plan`,plan:e.value},!0)}async function s(e){let r=await t.api.job(e);if(r.error||!r.value)return i(r.error??`no answer`,!0);let a=r.value;if(a.state===`running`){P(n,{at:`running`,job:a},!0);return}let o=`${ea(a.done)} translated, unread until you read them`;await t.onDone(o),i(a.state===`failed`?a.message??`the run failed`:o,a.state===`failed`)}async function c(){let e=await t.api.translate(t.shown);if(e.error||!e.value)return i(e.error??`no answer`,!0);P(n,{at:`running`,job:e.value},!0)}_i(()=>{t.api.job().then(e=>{e.value&&W(n).at===`idle`&&P(n,{at:`running`,job:e.value},!0)})}),mn(()=>{if(W(n).at!==`running`)return;let e=W(n).job.id,t=setInterval(()=>void s(e),1e3);return()=>clearInterval(t)});let l=j(()=>t.targets?t.shown.length?Q.translateWhy:Q.pickFirst:Q.onlyLocale),u=j(()=>W(n).at===`running`&&W(n).job.total?W(n).job.done/W(n).job.total:0);var d=co(),f=R(I(d),2),p=e=>{var t=io(),r=I(t),i=L(r),a=R(r,2),o=L(a,!0),s=R(a,2),l=I(s),u=L(l,!0),d=R(l,2),f=L(d,!0);O(s),O(t),z((e,t)=>{J(i,`${e??``} in ${t??``}`),J(o,Q.translateWhy),J(u,Q.translate),J(f,Q.cancel)},[()=>ea(W(n).plan.total),()=>Object.keys(W(n).plan.pending).join(`, `)]),G(`click`,l,c),G(`click`,d,()=>P(n,{at:`idle`},!0)),q(e,t)},m=e=>{var t=ao(),r=I(t),i=L(r),a=R(r,2),o=L(a),s=L(R(a,2));O(t),z(e=>{J(i,`${Q.running??``} ${W(n).job.locale??``??``}`),Zr(o,`width: ${e??``}%`),J(s,`${W(n).job.done??``} of ${W(n).job.total??``}`)},[()=>Math.round(W(u)*100)]),q(e,t)},h=e=>{var i=oo(),s=tn(i),c=I(s),u=L(c,!0),d=L(R(c,2),!0);O(s);var f=R(s,2),p=I(f),m=L(p,!0),h=L(R(p,2),!0);O(f),z(()=>{s.disabled=W(r)||!t.scanning,J(u,W(n).at===`finding`?Q.working:Q.find),J(d,t.scanning?Q.findWhy:Q.scanOff),f.disabled=W(r)||!t.shown.length,J(m,Q.translate),J(h,W(l))}),G(`click`,s,a),G(`click`,f,o),q(e,i)};Y(f,e=>{W(n).at===`plan`?e(p):W(n).at===`running`?e(m,1):e(h,-1)});var g=R(f,2),_=e=>{var t=so();let r;var i=L(t,!0);z(()=>{r=Yr(t,1,`said svelte-a18sfu`,null,r,{bad:W(n).bad}),J(i,W(n).text)}),q(e,t)};Y(g,e=>{W(n).at===`said`&&e(_)}),O(d),q(e,d),Ve()}pr([`click`]);var uo=K(`<h2 class="svelte-1qmtve8"> </h2>`),fo=K(`<h2 class="svelte-1qmtve8"> </h2> <p class="svelte-1qmtve8"> </p>`,1),po=K(`<code class="keys svelte-1qmtve8"> </code>`),mo=K(`<button class="svelte-1qmtve8"> </button>`),ho=K(`<div class="job svelte-1qmtve8"><span class="tile svelte-1qmtve8"><!></span> <span class="what svelte-1qmtve8"><b class="svelte-1qmtve8"> </b> <span class="svelte-1qmtve8"> </span> <!></span> <!></div>`),go=K(`<p class="empty svelte-1qmtve8">…</p>`),_o=K(`<p class="empty svelte-1qmtve8"> </p>`),vo=K(`<p class="commit svelte-1qmtve8"><code class="svelte-1qmtve8"> </code> <span class="svelte-1qmtve8"><b class="svelte-1qmtve8"> </b><span class="svelte-1qmtve8"> </span></span></p>`),yo=K(`<main class="overview svelte-1qmtve8"><header class="svelte-1qmtve8"><span class="chip svelte-1qmtve8"> </span> <!></header> <div class="cols svelte-1qmtve8"><section class="jobs svelte-1qmtve8" aria-label="What needs you"></section> <aside class="side svelte-1qmtve8"><div class="card svelte-1qmtve8"><button class="ring svelte-1qmtve8"><b class="svelte-1qmtve8"> </b> <strong class="svelte-1qmtve8"> </strong> <span class="svelte-1qmtve8"> </span></button> <p class="kv svelte-1qmtve8"><b class="svelte-1qmtve8"> </b><strong class="svelte-1qmtve8"> </strong></p> <p class="kv svelte-1qmtve8"><b class="svelte-1qmtve8"> </b><strong class="svelte-1qmtve8"> </strong></p></div> <div class="card svelte-1qmtve8"><p class="head svelte-1qmtve8"> </p> <!></div></aside></div></main>`);function bo(e,t){Be(t,!0);let n=j(()=>t.health.filter(e=>!e.source)),r=j(()=>{let e=e=>W(n).reduce((t,n)=>t+e(n),0);return[{id:`broken`,n:e(e=>e.broken)},{id:`missing`,n:e(e=>e.missing)},{id:`draft`,n:e(e=>e.draft)},{id:`undefined`,n:t.undefinedKeys.length}].filter(e=>e.n>0)}),i=j(()=>W(r).reduce((e,t)=>e+t.n,0)),a=new Intl.RelativeTimeFormat(void 0,{numeric:`auto`});function o(e){let t=Math.round((Date.parse(e)-Date.now())/864e5);return t>-1?a.format(0,`day`):t>-31?a.format(t,`day`):a.format(Math.round(t/30),`month`)}var s=yo(),c=I(s),l=I(c),u=L(l,!0),d=R(l,2),f=e=>{var t=uo(),n=L(t);z(()=>J(n,`${W(i)??``} ${W(i)===1?`thing is`:`things are`} waiting for you.`)),q(e,t)},p=e=>{var t=fo(),n=tn(t),r=L(n,!0),i=L(R(n,2),!0);z(()=>{J(r,ra.clear),J(i,ra.clearWhy)}),q(e,t)};Y(d,e=>{W(i)>0?e(f):e(p,-1)}),O(c);var m=R(c,2),h=I(m);X(h,21,()=>W(r),e=>e.id,(e,n)=>{var r=ho(),i=I(r),a=I(i);{let e=j(()=>W(n).id===`undefined`?`broken`:W(n).id);ba(a,{get state(){return W(e)}})}O(i);var o=R(i,2),s=I(o),c=L(s),l=R(s,2),u=L(l,!0),d=R(l,2),f=e=>{var n=po(),r=L(n,!0);z(e=>J(r,e),[()=>t.undefinedKeys.slice(0,3).map(e=>e.key).join(` · `)]),q(e,n)};Y(d,e=>{W(n).id===`undefined`&&e(f)}),O(o);var p=R(o,2),m=e=>{var r=mo(),i=L(r,!0);z(()=>J(i,ra.open)),G(`click`,r,()=>t.onFilter(W(n).id)),q(e,r)};Y(p,e=>{W(n).id!==`undefined`&&e(m)}),O(r),z(()=>{Z(i,`data-state`,W(n).id===`undefined`?`broken`:W(n).id),J(c,`${W(n).n??``} ${(W(n).n===1?ta[W(n).id].one:ta[W(n).id].many)??``}`),J(u,na[W(n).id])}),q(e,r)}),O(h);var g=R(h,2),_=I(g),v=I(_),y=I(v),b=L(y,!0),x=R(y,2),S=L(x,!0),ee=L(R(x,2),!0);O(v);var te=R(v,2),ne=I(te),re=L(ne,!0),ie=L(R(ne),!0);O(te);var ae=R(te,2),oe=I(ae),se=L(oe,!0),ce=L(R(oe),!0);O(ae),O(_);var le=R(_,2),C=I(le),ue=L(C,!0),de=R(C,2),fe=e=>{q(e,go())},pe=e=>{var t=_o(),n=L(t,!0);z(()=>J(n,ra.noHistory)),q(e,t)},me=e=>{var n=wr();X(tn(n),17,()=>t.commits,e=>e.sha,(e,t)=>{var n=vo(),r=I(n),i=L(r,!0),a=R(r,2),s=I(a),c=L(s,!0),l=L(R(s));O(a),O(n),z(e=>{J(i,W(t).sha),J(c,W(t).subject),J(l,`${W(t).author??``} · ${e??``}`)},[()=>o(W(t).date)]),q(e,n)}),q(e,n)};Y(de,e=>{t.commits===null?e(fe):t.commits.length===0?e(pe,1):e(me,-1)}),O(le),O(g),O(m),O(s),z(()=>{J(u,ra.here),v.disabled=!t.checks,J(b,ra.project),J(S,t.checks&&t.checks.ok===t.checks.total?ra.healthy:ra.problems),J(ee,t.checks?`${t.checks.ok} of ${t.checks.total} ${ra.checks}`:`…`),J(re,ra.countMessages),J(ie,t.total),J(se,ra.countLocales),J(ce,t.locales.length),J(ue,ra.history)}),G(`click`,v,function(...e){t.onHealth?.apply(this,e)}),q(e,s),Ve()}pr([`click`]);var xo=K(`<p class="none svelte-1xn1b0j"> </p>`),So=K(`<span class="group svelte-1xn1b0j"> </span>`),Co=K(`<span class="src svelte-1xn1b0j"> </span>`),wo=K(`<b class="disc svelte-1xn1b0j"> </b>`),To=K(`<li><button><span class="tile svelte-1xn1b0j"><!></span> <span class="what svelte-1xn1b0j"><span class="found svelte-1xn1b0j"> <mark class="svelte-1xn1b0j"> </mark> </span> <!> <!></span> <span class="where svelte-1xn1b0j"></span></button></li>`),Eo=K(`<ul class="svelte-1xn1b0j"></ul>`),Do=K(`<div class="sheet svelte-1xn1b0j" role="dialog"><p class="head svelte-1xn1b0j"><span> </span> <b class="svelte-1xn1b0j"> </b></p> <!> <p class="keys svelte-1xn1b0j"><kbd class="svelte-1xn1b0j">↑</kbd><kbd class="svelte-1xn1b0j">↓</kbd> <kbd class="svelte-1xn1b0j">enter</kbd> <kbd class="svelte-1xn1b0j">esc</kbd> <button class="close svelte-1xn1b0j"> </button></p></div>`);function Oo(e,t){Be(t,!0);let n=N(0);mn(()=>{t.query,P(n,0)});function r(e){t.hits.length&&P(n,(W(n)+e+t.hits.length)%t.hits.length)}function i(){let e=t.hits[W(n)];e&&t.onPick(e.key)}var a={move:r,choose:i},o=Do(),s=I(o),c=I(s),l=L(c,!0),u=L(R(c,2),!0);O(s);var d=R(s,2),f=e=>{var t=xo(),n=L(t,!0);z(()=>J(n,ia.none)),q(e,t)},p=e=>{var r=Eo();X(r,23,()=>t.hits,e=>e.key,(e,r,i)=>{let a=j(()=>Qa(W(r).text,t.query));var o=To(),s=I(o);let c;var l=I(s);ba(I(l),{get state(){return W(r).state}}),O(l);var u=R(l,2),d=I(u),f=I(d,!0),p=R(f),m=L(p,!0),h=R(p,1,!0);O(d);var g=R(d,2),_=e=>{var t=So(),n=L(t,!0);z(()=>J(n,W(r).group)),q(e,t)};Y(g,e=>{W(r).group&&e(_)});var v=R(g,2),y=e=>{var t=Co(),n=L(t,!0);z(()=>J(n,W(r).source)),q(e,t)},b=j(()=>!W(r).locales.includes(t.sourceLocale));Y(v,e=>{W(b)&&e(y)}),O(u);var x=R(u,2);X(x,20,()=>W(r).locales,e=>e,(e,t)=>{var n=wo(),r=L(n,!0);z(()=>J(r,t)),q(e,n)}),O(x),O(s),O(o),z(()=>{c=Yr(s,1,`hit svelte-1xn1b0j`,null,c,{on:W(i)===W(n)}),Z(l,`data-state`,W(r).state),J(f,W(a)[0]),J(m,W(a)[1]),J(h,W(a)[2])}),G(`click`,s,()=>t.onPick(W(r).key)),q(e,o)}),O(r),q(e,r)};Y(d,e=>{t.hits.length===0?e(f):e(p,-1)});var m=R(d,2),h=R(I(m),2),g=R(h,2),_=R(g,2),v=R(_),y=L(v,!0);return O(m),O(o),z(e=>{Z(o,`aria-label`,ia.label),J(l,ia.scope),J(u,e),J(h,`${ia.moveKeys??``} `),J(g,`${ia.openKeys??``} `),J(_,`${ia.closeKeys??``} `),J(y,ia.close)},[()=>t.hits.length===1?ia.oneHit:ia.hits(t.hits.length)]),G(`click`,v,function(...e){t.onClose?.apply(this,e)}),q(e,o),Ve(a)}pr([`click`]);var ko=K(`<li><code> </code> </li>`),Ao=K(`<ul class="problems svelte-1xn7ig5"></ul>`),jo=K(`<p class="note svelte-1xn7ig5"> </p>`),Mo=K(`<!> <!>`,1),No=K(`<div class="lens svelte-1xn7ig5"><!> <main class="table svelte-1xn7ig5"><!></main></div>`),Po=K(`Saved in <code> </code>`,1),Fo=K(`<p class="snack svelte-1xn7ig5" role="status"><svg viewBox="0 0 16 16" width="15" height="15" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="svelte-1xn7ig5"><path d="m3.4 8.4 3 3 6.2-6.8"></path></svg> <!> <button class="svelte-1xn7ig5">Dismiss</button></p>`),Io=K(`<div class="shell svelte-1xn7ig5"><header class="bar svelte-1xn7ig5"><span class="brand svelte-1xn7ig5">verbaly <b class="svelte-1xn7ig5">studio</b></span> <input class="search svelte-1xn7ig5" type="search"/> <span class="root svelte-1xn7ig5"> </span></header> <!> <!> <div class="body svelte-1xn7ig5"><!> <!></div> <!></div>`);function Lo(e,t){Be(t,!0);let n=N(null),r=N(null),i=N(null),a=N(`overview`),o=N(null),s=N(null);function c(e){e===`health`?l():P(a,e,!0)}async function l(){P(a,`health`);let e=await t.api.health();if(e.error){P(r,{text:e.error,file:``},!0);return}e.value&&P(o,e.value,!0)}mn(()=>{t.api.health().then(e=>{e.value&&P(o,e.value,!0)}),t.api.history().then(e=>{P(s,e.value?.commits??[],!0)})});function u(e){P(g,W(v),!0),P(m,e,!0),P(a,`messages`)}async function d(e){let a=await t.api.state();if(a.error||!a.value){P(r,{text:a.error??`[verbaly] the server sent no state`,file:``},!0);return}P(n,null),P(i,null),Wa(t.panel,a.value),P(r,{text:e,file:``},!0);let s=await t.api.health();s.value&&P(o,s.value,!0)}async function f(e,n,a){let o=await t.api.setRead(e,n,a);if(o.error){P(r,{text:o.error,file:``},!0);return}let s=new Set(o.value?.keys??[]);for(let n of t.panel.rows){if(!s.has(n.key))continue;let t=n.cells.find(t=>t.locale===e);t?.text&&(t.state=a?`draft`:`done`)}P(i,a?null:{locale:e,keys:o.value?.keys??[]},!0)}async function p(e,n,i){let a=await t.api.save(e,n,i);if(a.error)return a.error;let o=t.panel.rows.find(e=>e.key===n)?.cells.find(t=>t.locale===e);return o&&(o.text=i,o.state=i?`done`:`missing`,o.issue=void 0),P(r,{text:i,file:`${e}.json`},!0),null}let m=N(`all`),h=N(``),g=N(null),_=N(null),v=j(()=>t.panel.locales.filter(e=>e!==t.panel.sourceLocale)),y=j(()=>W(g)??W(v).slice(0,1)),b=j(()=>Ua(t.panel)),x=j(()=>W(y).length===1?W(y)[0]:null),S=j(()=>W(x)?W(b).find(e=>e.locale===W(x)):void 0),ee=j(()=>W(x)?t.panel.rows.filter(e=>eo(e,W(x))!==null).length:0),te=j(()=>W(m)===`look`?`look`:W(m)===`clean`?`clean`:W(m)===`all`?`all`:null),ne=j(()=>Za(t.panel,W(h))),re=N(void 0),ie=N(void 0),ae=N(null),oe=j(()=>qa(t.panel.rows,W(y))),se=j(()=>{let e=Ja(t.panel.rows,{text:``,state:W(m),locales:W(y),group:W(_)});return W(x)?$a(e,W(x)).rows:e}),ce=j(()=>Ga(t.panel,W(y),W(se))),le=j(()=>{let e={all:0,look:0,clean:0,missing:0,draft:0,broken:0};for(let n of[`all`,`look`,`clean`,`missing`,`draft`,`broken`])e[n]=Ja(t.panel.rows,{text:``,state:n,locales:W(y),group:W(_)}).length;return e}),C=N(60);mn(()=>{W(m),W(y),W(_),P(C,60)});function ue(e){P(h,``),P(m,`all`),P(_,null),P(g,W(v),!0),P(a,`messages`),P(ae,e,!0)}mn(()=>{if(!W(ae))return;let e=W(ae),t=W(se).findIndex(t=>t.key===e);if(t<0){P(ae,null);return}if(t+1>W(C)){P(C,t+1);return}P(ae,null),nr().then(()=>{document.querySelector(`[data-key="${CSS.escape(e)}"]`)?.scrollIntoView({block:`center`})})});function de(e){if((e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`){e.preventDefault(),W(ie)?.focus(),W(ie)?.select();return}W(h)&&(e.key===`Escape`?(P(h,``),W(ie)?.blur()):e.key===`ArrowDown`?(e.preventDefault(),W(re)?.move(1)):e.key===`ArrowUp`?(e.preventDefault(),W(re)?.move(-1)):e.key===`Enter`&&(e.preventDefault(),W(re)?.choose()))}function fe(e){let t=e.currentTarget;t.scrollTop+t.clientHeight>t.scrollHeight-600&&W(C)<W(se).length&&P(C,W(C)+60)}function pe(e){P(g,W(y).includes(e)?W(y).filter(t=>t!==e):[...W(y),e],!0)}var me=Io();fr(`keydown`,Jt,de);var w=I(me),he=R(I(w),2);si(he),gi(he,e=>P(ie,e),()=>W(ie));var ge=R(he,2),_e=L(ge,!0);O(w);var ve=R(w,2),ye=e=>{var n=Ao();X(n,21,()=>t.panel.problems,e=>e.scope+e.message,(e,t)=>{var n=ko(),r=I(n),i=L(r,!0),a=R(r);O(n),z(()=>{J(i,W(t).scope),J(a,` ${W(t).message??``}`)}),q(e,n)}),O(n),q(e,n)};Y(ve,e=>{t.panel.problems.length&&e(ye)});var T=R(ve,2),be=e=>{gi(Oo(e,{get query(){return W(h)},get hits(){return W(ne)},get sourceLocale(){return t.panel.sourceLocale},onPick:ue,onClose:()=>P(h,``)}),e=>P(re,e,!0),()=>W(re))};Y(T,e=>{W(h)&&e(be)});var E=R(T,2),D=I(E);{let e=e=>{lo(e,{get api(){return t.api},get scanning(){return t.panel.scanning},get targets(){return W(v).length},get shown(){return W(y)},onDone:d})},n=j(()=>W(o)?{bad:W(o).entries.filter(e=>e.level!==`ok`).length}:null);ma(D,{get health(){return W(b)},get shown(){return W(y)},get state(){return W(m)},get counts(){return W(le)},get pending(){return W(i)},get checks(){return W(n)},onToggle:pe,onState:e=>P(m,e,!0),onRead:e=>f(e,void 0,!1),onUndo:()=>W(i)&&f(W(i).locale,W(i).keys,!0),get view(){return W(a)},onView:c,get groups(){return W(oe)},get group(){return W(_)},onGroup:e=>P(_,e,!0),actions:e,$$slots:{actions:!0}})}var xe=R(D,2),Se=e=>{{let n=j(()=>W(o)?{ok:W(o).entries.filter(e=>e.level===`ok`).length,total:W(o).entries.length}:null);bo(e,{get health(){return W(b)},get undefinedKeys(){return t.panel.undefined},get locales(){return t.panel.locales},get total(){return t.panel.rows.length},get checks(){return W(n)},get commits(){return W(s)},onFilter:u,onHealth:l})}},Ce=e=>{{let t=j(()=>W(o)?.entries??[]),n=j(()=>W(o)?.ok??!0);wi(e,{get entries(){return W(t)},get ok(){return W(n)},onClose:()=>P(a,`overview`)})}},we=e=>{var r=No(),i=I(r),a=e=>{ro(e,{get locale(){return W(x)},get total(){return t.panel.rows.length},get unread(){return W(S).draft},get broken(){return W(S).broken},get flagged(){return W(ee)},get chip(){return W(te)},onChip:e=>P(m,e,!0),onApprove:()=>f(W(x),void 0,!1)})};Y(i,e=>{W(x)&&W(S)&&!W(ce)&&e(a)});var o=R(i,2),s=I(o),c=e=>{var t=jo(),n=L(t);z(()=>J(n,`${$i[W(ce)]??``}${W(ce)===`oneLocale`?` ${$i.oneLocaleFix}`:``}`)),q(e,t)},l=e=>{var t=Mo(),r=tn(t);X(r,17,()=>W(se).slice(0,W(C)),e=>e.key,(e,t)=>{{let r=j(()=>W(x)?eo(W(t),W(x)):void 0);Ba(e,{get row(){return W(t)},get shown(){return W(y)},get editing(){return W(n)},onEdit:e=>P(n,e,!0),onSave:p,get why(){return W(r)}})}});var i=R(r,2),a=e=>{var t=jo(),n=L(t,!0);z(e=>J(n,e),[()=>W(x)?$.rest(W(se).length-W(C)):`${W(se).length-W(C)} more below`]),q(e,t)};Y(i,e=>{W(C)<W(se).length&&e(a)}),q(e,t)};Y(s,e=>{W(ce)?e(c):e(l,-1)}),O(o),O(r),fr(`scroll`,o,fe),q(e,r)};Y(xe,e=>{W(a)===`overview`?e(Se):W(a)===`health`?e(Ce,1):e(we,-1)}),O(E);var Te=R(E,2),Ee=e=>{var t=Fo(),n=R(I(t),2),i=e=>{var t=Po(),n=L(R(tn(t)),!0);z(()=>J(n,W(r).file)),q(e,t)},a=e=>{var t=Cr();z(()=>J(t,W(r).text)),q(e,t)};Y(n,e=>{W(r).file?e(i):e(a,-1)});var o=R(n,2);O(t),G(`click`,o,()=>P(r,null)),q(e,t)};Y(Te,e=>{W(r)&&e(Ee)}),O(me),z(()=>{Z(he,`placeholder`,ia.placeholder),Z(he,`aria-label`,ia.placeholder),Z(ge,`title`,t.panel.root),J(_e,t.panel.root)}),fi(he,()=>W(h),e=>P(h,e)),q(e,me),Ve()}pr([`click`]);async function Ro(e,t,n){let r=t.includes(`?`)?`&`:`?`,i;try{i=await fetch(`${t}${r}t=${encodeURIComponent(e)}`,{...n,headers:n?.body===void 0?void 0:{"content-type":`application/json`},body:n?.body===void 0?void 0:JSON.stringify(n.body)})}catch{return{error:`[verbaly] the studio server is not answering, is it still running?`}}let a=await i.json().catch(()=>({}));return i.ok?{value:a}:{error:a.error??`[verbaly] the server answered ${i.status}`}}function zo(e){return{state:()=>Ro(e,`/api/state`),health:()=>Ro(e,`/api/health`),history:()=>Ro(e,`/api/history`),save:(t,n,r)=>Ro(e,`/api/message/${encodeURIComponent(t)}/${encodeURIComponent(n)}`,{method:`PUT`,body:{text:r}}),setRead:(t,n,r)=>Ro(e,`/api/approve`,{method:`POST`,body:{locale:t,keys:n,undo:r}}),extract:()=>Ro(e,`/api/extract`,{method:`POST`}),plan:t=>{let n=t.map(e=>`locale=${encodeURIComponent(e)}`).join(`&`);return Ro(e,`/api/translate${n?`?${n}`:``}`)},translate:t=>Ro(e,`/api/translate`,{method:`POST`,body:{locales:t}}),job:t=>Ro(e,t?`/api/job/${encodeURIComponent(t)}`:`/api/job`)}}function Bo(e){return Gt(Ha(e))}var Vo=new URLSearchParams(location.search).get(`t`)??``;async function Ho(){let e=document.getElementById(`app`),t=zo(Vo),n=await t.state();if(n.error||!n.value){e.textContent=n.error??`[verbaly] the server sent no state`;return}kr(Lo,{target:e,props:{panel:Bo(n.value),api:t}})}Ho();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.health.svelte-1grjtup{background:var(--paper);flex:1;min-width:0;overflow-y:auto}header.svelte-1grjtup{border-bottom:1px solid var(--rule);padding:28px 24px 20px}h2.svelte-1grjtup{letter-spacing:-.014em;color:var(--ink);margin:0;font-size:21px;font-weight:500}header.svelte-1grjtup p:where(.svelte-1grjtup){max-width:64ch;color:var(--muted);margin:8px 0 0;font-size:13px}.close.svelte-1grjtup{border:1px solid var(--rule-strong);border-radius:var(--radius);background:var(--paper);color:var(--body);font:inherit;cursor:pointer;margin-top:16px;padding:5px 12px;font-size:12.5px}.close.svelte-1grjtup:hover{background:var(--ground)}ul.svelte-1grjtup{margin:0;padding:0;list-style:none}li.svelte-1grjtup{border-bottom:1px solid var(--rule);align-items:flex-start;gap:12px;padding:14px 24px;display:flex}.mark.svelte-1grjtup{background:var(--done-tint);width:20px;height:20px;color:var(--done);border-radius:50%;flex:none;justify-content:center;align-items:center;margin-top:1px;display:inline-flex}[data-level=warn].svelte-1grjtup .mark:where(.svelte-1grjtup){background:var(--missing-tint);color:var(--missing)}[data-level=error].svelte-1grjtup .mark:where(.svelte-1grjtup){background:var(--broken-tint);color:var(--broken)}.body.svelte-1grjtup{flex-direction:column;gap:2px;min-width:0;display:flex}b.svelte-1grjtup{color:var(--ink);font-size:13.5px;font-weight:500}.msg.svelte-1grjtup{color:var(--body);font-size:13px}.fix.svelte-1grjtup{font-family:var(--mono);color:var(--draft);margin-top:4px;font-size:12px}.sr.svelte-1grjtup{clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.rail.svelte-l3e5c7{width:var(--rail);border-right:1px solid var(--rule);background:var(--ground);flex:none;padding:18px 14px;overflow-y:auto}.views.svelte-l3e5c7{margin:0 0 18px;padding:0;list-style:none}.nav.svelte-l3e5c7{border-radius:var(--radius);width:100%;font:inherit;color:var(--body);cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;padding:7px 8px;font-size:13px;display:flex}.nav.svelte-l3e5c7:hover{background:var(--hollow)}.nav.on.svelte-l3e5c7{background:var(--done-tint);color:var(--done);box-shadow:inset 2px 0 0 var(--done);font-weight:500}.bad.svelte-l3e5c7{background:var(--broken-tint);color:var(--broken);font-family:var(--mono);border-radius:999px;margin-left:auto;padding:0 7px;font-size:11px}.bad.clean.svelte-l3e5c7{background:var(--done-tint);color:var(--done)}.groups.svelte-l3e5c7{border:1px solid var(--rule);border-radius:var(--radius);background:var(--paper);width:100%;color:var(--body);font:inherit;margin-bottom:18px;padding:7px 8px;font-size:13px}.cap.svelte-l3e5c7{letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 8px;padding:0 6px;font-size:11px;font-weight:600}ul.svelte-l3e5c7{margin:0 0 22px;padding:0;list-style:none}.lang.svelte-l3e5c7{border-radius:var(--radius);cursor:pointer;align-items:flex-start;gap:10px;padding:7px 6px;display:flex}.lang.svelte-l3e5c7:hover{background:var(--hollow)}.lang.source.svelte-l3e5c7{cursor:default}.lang.svelte-l3e5c7 input:where(.svelte-l3e5c7){accent-color:var(--done);margin:4px 0 0}.meta.svelte-l3e5c7{flex-direction:column;min-width:0;display:flex}.name.svelte-l3e5c7{font-family:var(--mono);color:var(--ink);font-size:13px;font-weight:600}.name.svelte-l3e5c7 code:where(.svelte-l3e5c7){font-family:var(--mono);color:var(--muted);font-size:10px}.state.svelte-l3e5c7 b:where(.svelte-l3e5c7){font-weight:500}.state.svelte-l3e5c7{color:var(--muted);font-size:11.5px}.state[data-state=broken].svelte-l3e5c7{color:var(--broken)}.state[data-state=missing].svelte-l3e5c7{color:var(--missing)}.state[data-state=draft].svelte-l3e5c7{color:var(--draft)}.read.svelte-l3e5c7{border:1px solid var(--draft);background:var(--draft-tint);color:var(--draft);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:6px;margin:2px 0 6px 30px;padding:3px 9px;font-size:11.5px;display:flex}.read.svelte-l3e5c7 .n:where(.svelte-l3e5c7){font-family:var(--mono);opacity:.8}.undo.svelte-l3e5c7{border-radius:var(--radius);background:var(--hollow);color:var(--body);align-items:center;gap:8px;margin:-14px 0 22px;padding:8px 10px;font-size:11.5px;display:flex}.undo.svelte-l3e5c7 button:where(.svelte-l3e5c7){border:1px solid var(--rule-strong);border-radius:var(--radius);background:var(--paper);color:var(--ink);font:inherit;cursor:pointer;margin-left:auto;padding:3px 10px;font-size:11.5px}.filters.svelte-l3e5c7 button:where(.svelte-l3e5c7){border-radius:var(--radius);width:100%;font:inherit;color:var(--body);cursor:pointer;text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:13px;display:flex}.filters.svelte-l3e5c7 button:where(.svelte-l3e5c7):hover{background:var(--hollow)}.filters.svelte-l3e5c7 button.on:where(.svelte-l3e5c7){background:var(--hollow);color:var(--ink);font-weight:600}.count.svelte-l3e5c7{font-family:var(--mono);color:var(--muted);font-size:12px}.sr.svelte-1fu82r1{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.why.svelte-2clsr{width:230px;color:var(--muted);-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;flex:none;align-self:center;font-size:11px;line-height:1.45;display:-webkit-box;overflow:hidden}.rmark.svelte-2clsr{flex:none;width:46px;margin-top:2px}.ojo.svelte-2clsr{background:var(--missing-tint);height:22px;color:var(--missing);border-radius:999px;align-items:center;padding:0 9px;font-size:12.5px;font-weight:500;display:inline-flex}.row.flagged.svelte-2clsr{box-shadow:inset 3px 0 0 var(--missing)}.row.svelte-2clsr{border-bottom:1px solid var(--rule);align-items:flex-start;gap:16px;min-height:64px;padding:12px 20px;display:flex}.row.svelte-2clsr:hover{background:var(--ground)}.row.open.svelte-2clsr{background:var(--paper);box-shadow:inset 3px 0 0 var(--done);outline:1px solid var(--rule);outline-offset:-1px}.tile.svelte-2clsr{border-radius:var(--radius);flex:none;justify-content:center;align-items:center;width:26px;height:26px;margin-top:2px;display:inline-flex}.tile[data-state=done].svelte-2clsr{color:var(--rule-strong)}.tile[data-state=draft].svelte-2clsr{background:var(--draft-tint);color:var(--draft)}.tile[data-state=missing].svelte-2clsr{background:var(--missing-tint);color:var(--missing)}.tile[data-state=broken].svelte-2clsr{background:var(--broken);color:var(--paper)}.row-t.svelte-2clsr{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.src.svelte-2clsr{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;line-height:1.3;overflow:hidden}.tl.svelte-2clsr{align-items:baseline;gap:8px;min-width:0;display:flex}.tl.edit.svelte-2clsr{align-items:flex-start}.disc.svelte-2clsr{background:var(--hollow);width:20px;height:20px;color:var(--body);font-family:var(--mono);letter-spacing:-.02em;border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:9px;display:inline-flex;transform:translateY(3px)}.disc[data-state=done].svelte-2clsr{background:var(--done-tint);color:var(--done)}.disc[data-state=draft].svelte-2clsr{background:var(--draft-tint);color:var(--draft)}.disc[data-state=missing].svelte-2clsr{background:var(--missing-tint);color:var(--missing)}.disc[data-state=broken].svelte-2clsr{background:var(--broken-tint);color:var(--broken)}.tv.svelte-2clsr{text-align:left;min-width:0;font-family:var(--serif);color:var(--ink);text-overflow:ellipsis;white-space:nowrap;cursor:text;background:0 0;border:0;flex:1;padding:0;font-size:17px;line-height:1.35;overflow:hidden}.sig.svelte-2clsr{color:var(--draft);background:var(--draft-tint);white-space:nowrap;border-radius:4px;flex:none;padding:1px 6px;font-size:11px}.tv.none.svelte-2clsr{font-family:var(--sans);color:var(--missing);font-size:13px;font-style:italic}.tf.svelte-2clsr{min-width:0;font-family:var(--serif);color:var(--ink);background:var(--paper);border:1px solid var(--done);border-radius:var(--radius);resize:vertical;flex:1;padding:6px 10px;font-size:17px;line-height:1.45}.tf.svelte-2clsr:focus-visible{outline:2px solid color-mix(in oklab, var(--done) 26%, transparent);outline-offset:1px}.editbar.svelte-2clsr{flex-wrap:wrap;align-items:center;gap:8px;margin-top:10px;display:flex}.pm.svelte-2clsr{font-family:var(--mono);color:var(--body);background:var(--hollow);border-radius:4px;padding:1px 5px;font-size:12.5px}.pm.gone.svelte-2clsr{background:var(--broken-tint);border:1px dashed var(--broken);color:var(--broken)}.vmsg.svelte-2clsr{color:var(--broken);background:var(--broken-tint);border-radius:var(--radius);align-items:center;gap:6px;padding:4px 9px;font-size:12.5px;display:inline-flex}.btn.svelte-2clsr{border:1px solid var(--done);border-radius:var(--radius);background:var(--done);height:30px;color:var(--paper);font:inherit;cursor:pointer;padding:0 12px;font-size:12.5px;font-weight:500}.btn.quiet.svelte-2clsr{background:var(--paper);color:var(--body);border-color:var(--rule-strong);font-weight:400}.btn.svelte-2clsr:disabled{opacity:.6;cursor:default}.keys.svelte-2clsr{font-family:var(--mono);color:var(--muted);font-size:11px}.langbar.svelte-1u5fzi5{border-bottom:1px solid var(--rule);background:var(--paper);flex:none;align-items:flex-start;gap:24px;padding:20px 24px;display:flex}.text.svelte-1u5fzi5{flex:1;min-width:0}h2.svelte-1u5fzi5{letter-spacing:-.014em;color:var(--ink);margin:0;font-size:21px;font-weight:500}.live.svelte-1u5fzi5{color:var(--body);align-items:center;gap:8px;margin:8px 0 0;font-size:13.5px;display:flex}.live.svelte-1u5fzi5 b:where(.svelte-1u5fzi5){color:var(--ink);font-weight:500}.disc.svelte-1u5fzi5{background:var(--done-tint);width:20px;height:20px;color:var(--done);font-family:var(--mono);text-transform:uppercase;border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:9px;display:inline-flex}.why.svelte-1u5fzi5{color:var(--muted);max-width:80ch;margin:4px 0 0;font-size:13.5px;line-height:1.5}.go.svelte-1u5fzi5{flex-direction:column;flex:none;align-items:flex-end;gap:4px;display:flex}.btn.svelte-1u5fzi5{border:1px solid var(--done);border-radius:var(--radius);background:var(--done);height:36px;color:var(--paper);cursor:pointer;padding:0 16px;font-family:inherit;font-size:13.5px;font-weight:500}.btn.svelte-1u5fzi5:disabled{border-color:var(--rule);background:var(--ground);color:var(--muted);cursor:default}.sub.svelte-1u5fzi5{color:var(--muted);font-variant-numeric:tabular-nums;font-size:11px}.chips.svelte-1u5fzi5{border-bottom:1px solid var(--rule);background:var(--paper);flex:none;align-items:center;gap:8px;padding:12px 24px;display:flex}.pill.svelte-1u5fzi5{border:1px solid var(--rule);background:var(--paper);height:28px;color:var(--body);cursor:pointer;border-radius:999px;padding:0 12px;font-family:inherit;font-size:12.5px}.pill.svelte-1u5fzi5 b:where(.svelte-1u5fzi5){font-variant-numeric:tabular-nums;margin-left:3px;font-weight:500}.pill.svelte-1u5fzi5:hover{background:var(--ground)}.pill.on.svelte-1u5fzi5{border-color:var(--done);background:var(--done-tint);color:var(--done)}.pill.look.on.svelte-1u5fzi5{border-color:var(--missing);background:var(--missing-tint);color:var(--missing)}.acts.svelte-a18sfu{margin-bottom:22px}.cap.svelte-a18sfu{letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 8px;padding:0 6px;font-size:11px;font-weight:600}.act.svelte-a18sfu{border-radius:var(--radius);width:100%;font:inherit;color:var(--body);cursor:pointer;text-align:left;background:0 0;border:0;flex-direction:column;gap:1px;margin-bottom:4px;padding:7px 8px;display:flex}.act.svelte-a18sfu:hover:not(:disabled){background:var(--hollow)}.act.svelte-a18sfu:disabled{cursor:default}.act.svelte-a18sfu:disabled .name:where(.svelte-a18sfu){opacity:.55}.name.svelte-a18sfu{color:var(--ink);font-size:13px}.why.svelte-a18sfu{color:var(--muted);margin:0;font-size:11.5px;line-height:1.35}.bill.svelte-a18sfu{border:1px solid var(--rule);border-radius:var(--radius);background:var(--paper);padding:10px}.lede.svelte-a18sfu{color:var(--ink);margin:0 0 4px;font-size:13px}.pair.svelte-a18sfu{gap:6px;margin-top:10px;display:flex}.go.svelte-a18sfu{border-radius:var(--radius);background:var(--done);color:var(--paper);font:inherit;cursor:pointer;border:0;flex:1;padding:5px 10px;font-size:12px}.plain.svelte-a18sfu{border:1px solid var(--rule-strong);border-radius:var(--radius);color:var(--body);font:inherit;cursor:pointer;background:0 0;padding:5px 10px;font-size:12px}.track.svelte-a18sfu{background:var(--hollow);border-radius:999px;height:4px;margin:8px 0 6px;overflow:hidden}.fill.svelte-a18sfu{background:var(--done);height:100%;transition:width .3s linear;display:block}.said.svelte-a18sfu{color:var(--muted);margin:6px 0 0;padding:0 8px;font-size:11.5px}.said.bad.svelte-a18sfu{color:var(--broken)}.overview.svelte-1qmtve8{background:var(--ground);flex:1;min-width:0;overflow-y:auto}header.svelte-1qmtve8{padding:28px 24px 20px}.chip.svelte-1qmtve8{background:var(--done-tint);color:var(--done);border-radius:999px;padding:3px 12px;font-size:12px;font-weight:500;display:inline-block}h2.svelte-1qmtve8{letter-spacing:-.024em;max-width:24ch;color:var(--ink);margin:14px 0 0;font-size:30px;font-weight:500;line-height:1.16}header.svelte-1qmtve8 p:where(.svelte-1qmtve8){color:var(--muted);margin:10px 0 0;font-size:14px}.cols.svelte-1qmtve8{grid-template-columns:minmax(0,1fr) 320px;align-items:start;gap:20px;padding:0 24px 28px;display:grid}.card.svelte-1qmtve8,.jobs.svelte-1qmtve8{background:var(--paper);border:1px solid var(--rule);border-radius:14px;overflow:hidden}.side.svelte-1qmtve8{flex-direction:column;gap:16px;min-width:0;display:flex}.job.svelte-1qmtve8{border-top:1px solid var(--rule);align-items:center;gap:16px;padding:16px 20px;display:flex}.job.svelte-1qmtve8:first-child{border-top:0}.tile.svelte-1qmtve8{border-radius:var(--radius);flex:none;justify-content:center;align-items:center;width:26px;height:26px;display:inline-flex}.tile[data-state=broken].svelte-1qmtve8{background:var(--broken);color:var(--paper)}.tile[data-state=missing].svelte-1qmtve8{background:var(--missing-tint);color:var(--missing)}.tile[data-state=draft].svelte-1qmtve8{background:var(--draft-tint);color:var(--draft)}.what.svelte-1qmtve8{flex:1;min-width:0}.what.svelte-1qmtve8 b:where(.svelte-1qmtve8){color:var(--ink);font-size:15px;font-weight:500;display:block}.what.svelte-1qmtve8>span:where(.svelte-1qmtve8){color:var(--muted);font-size:13px;display:block}.keys.svelte-1qmtve8{font-family:var(--mono);color:var(--muted);text-overflow:ellipsis;white-space:nowrap;margin-top:4px;font-size:11px;display:block;overflow:hidden}button.svelte-1qmtve8{border:1px solid var(--rule-strong);border-radius:var(--radius);background:var(--paper);height:32px;color:var(--body);cursor:pointer;flex:none;padding:0 14px;font-family:inherit;font-size:13px}button.svelte-1qmtve8:hover{background:var(--ground)}.ring.svelte-1qmtve8{text-align:left;border:0;border-radius:0;width:100%;height:auto;padding:18px 20px;display:block}.ring.svelte-1qmtve8:disabled{cursor:default}.ring.svelte-1qmtve8 b:where(.svelte-1qmtve8){color:var(--muted);font-size:12px;font-weight:400;display:block}.ring.svelte-1qmtve8 strong:where(.svelte-1qmtve8){color:var(--ink);margin-top:2px;font-size:17px;font-weight:500;display:block}.ring.svelte-1qmtve8 span:where(.svelte-1qmtve8){color:var(--muted);margin-top:4px;font-size:12px;display:block}.kv.svelte-1qmtve8{border-top:1px solid var(--rule);align-items:center;gap:12px;height:44px;margin:0;padding:0 20px;display:flex}.kv.svelte-1qmtve8 b:where(.svelte-1qmtve8){color:var(--body);flex:1;font-size:13px;font-weight:400}.kv.svelte-1qmtve8 strong:where(.svelte-1qmtve8){color:var(--ink);font-variant-numeric:tabular-nums;font-size:15px;font-weight:500}.head.svelte-1qmtve8{border-bottom:1px solid var(--rule);color:var(--ink);margin:0;padding:16px 20px;font-size:15px;font-weight:500}.empty.svelte-1qmtve8{color:var(--muted);margin:0;padding:16px 20px;font-size:13px}.commit.svelte-1qmtve8{align-items:flex-start;gap:12px;margin:0;padding:10px 20px;display:flex}.commit.svelte-1qmtve8 code:where(.svelte-1qmtve8){font-family:var(--mono);color:var(--muted);flex:none;margin-top:2px;font-size:11px}.commit.svelte-1qmtve8>span:where(.svelte-1qmtve8){flex:1;min-width:0}.commit.svelte-1qmtve8 b:where(.svelte-1qmtve8){color:var(--body);font-size:12px;font-weight:400;line-height:1.45;display:block}.commit.svelte-1qmtve8 span:where(.svelte-1qmtve8) span:where(.svelte-1qmtve8){color:var(--muted);margin-top:2px;font-size:11px;display:block}@media (max-width:900px){.cols.svelte-1qmtve8{grid-template-columns:minmax(0,1fr)}}.sheet.svelte-1xn1b0j{z-index:6;background:var(--paper);border:1px solid var(--rule);border-radius:0 0 14px 14px;flex-direction:column;width:660px;max-width:calc(100% - 32px);max-height:70%;display:flex;position:absolute;top:46px;left:50%;overflow:hidden;transform:translate(-50%);box-shadow:0 24px 60px -24px #00000073}.head.svelte-1xn1b0j{border-bottom:1px solid var(--rule);color:var(--muted);align-items:center;gap:12px;margin:0;padding:10px 18px;font-size:12px;display:flex}.head.svelte-1xn1b0j b:where(.svelte-1xn1b0j){background:var(--draft-tint);color:var(--draft);white-space:nowrap;border-radius:999px;margin-left:auto;padding:2px 9px;font-weight:500}.none.svelte-1xn1b0j{color:var(--muted);margin:0;padding:18px;font-size:13px}ul.svelte-1xn1b0j{margin:0;padding:0;list-style:none;overflow-y:auto}.hit.svelte-1xn1b0j{border:0;border-bottom:1px solid var(--rule);width:100%;font:inherit;text-align:left;cursor:pointer;background:0 0;align-items:center;gap:12px;padding:10px 18px;display:flex}.hit.svelte-1xn1b0j:hover,.hit.on.svelte-1xn1b0j{background:var(--ground)}.hit.on.svelte-1xn1b0j{box-shadow:inset 3px 0 0 var(--done)}.tile.svelte-1xn1b0j{border-radius:var(--radius);flex:none;justify-content:center;align-items:center;width:22px;height:22px;display:inline-flex}.tile[data-state=done].svelte-1xn1b0j{color:var(--rule-strong)}.tile[data-state=broken].svelte-1xn1b0j{background:var(--broken);color:var(--paper)}.tile[data-state=missing].svelte-1xn1b0j{background:var(--missing-tint);color:var(--missing)}.tile[data-state=draft].svelte-1xn1b0j{background:var(--draft-tint);color:var(--draft)}.what.svelte-1xn1b0j{flex:1;min-width:0}.found.svelte-1xn1b0j{font-family:var(--serif);color:var(--ink);text-overflow:ellipsis;white-space:nowrap;font-size:15px;display:block;overflow:hidden}mark.svelte-1xn1b0j{background:var(--draft-tint);color:inherit;border-radius:3px;padding:0 2px}.group.svelte-1xn1b0j{background:var(--hollow);color:var(--muted);font-family:var(--mono);border-radius:999px;margin-right:6px;padding:0 6px;font-size:10px;display:inline-block}.src.svelte-1xn1b0j{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;display:block;overflow:hidden}.where.svelte-1xn1b0j{flex:none;gap:4px;display:flex}.disc.svelte-1xn1b0j{background:var(--hollow);width:20px;height:20px;color:var(--body);font-family:var(--mono);text-transform:uppercase;border-radius:50%;justify-content:center;align-items:center;font-size:9px;font-weight:400;display:inline-flex}.keys.svelte-1xn1b0j{border-top:1px solid var(--rule);color:var(--muted);align-items:center;gap:6px;margin:0;padding:8px 18px;font-size:11px;display:flex}kbd.svelte-1xn1b0j{font-family:var(--mono);border:1px solid var(--rule);border-radius:3px;padding:0 4px;font-size:10px}.close.svelte-1xn1b0j{font:inherit;color:var(--muted);cursor:pointer;background:0 0;border:0;margin-left:auto;font-size:11px;text-decoration:underline}.lens.svelte-1xn7ig5{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.shell.svelte-1xn7ig5{flex-direction:column;height:100%;display:flex;position:relative}.bar.svelte-1xn7ig5{background:var(--bar);height:48px;color:var(--on-bar);flex:none;align-items:center;gap:16px;padding:0 16px;display:flex;box-shadow:inset 0 -1px #ffffff1f}.brand.svelte-1xn7ig5{letter-spacing:.02em;opacity:.75;white-space:nowrap;font-size:13px}.brand.svelte-1xn7ig5 b:where(.svelte-1xn7ig5){opacity:1;font-weight:600}.search.svelte-1xn7ig5{border-radius:var(--radius);max-width:520px;color:var(--on-bar);font:inherit;background:#ffffff0f;border:1px solid #ffffff29;flex:1;padding:6px 12px;font-size:13px}.search.svelte-1xn7ig5::placeholder{color:#ffffff73}.search.svelte-1xn7ig5:focus-visible{outline:2px solid var(--done);outline-offset:1px}.root.svelte-1xn7ig5{font-family:var(--mono);opacity:.55;text-overflow:ellipsis;white-space:nowrap;max-width:30ch;margin-left:auto;font-size:11.5px;overflow:hidden}.problems.svelte-1xn7ig5{background:var(--broken-tint);color:var(--broken);border-bottom:1px solid var(--rule);margin:0;padding:8px 16px;font-size:12.5px;list-style:none}.body.svelte-1xn7ig5{flex:1;min-height:0;display:flex}.table.svelte-1xn7ig5{background:var(--paper);flex:1;min-width:0;overflow-y:auto}.note.svelte-1xn7ig5{color:var(--muted);margin:0;padding:24px 20px;font-size:13px}.snack.svelte-1xn7ig5{background:var(--bar);height:44px;color:var(--on-bar);border-radius:var(--radius);white-space:nowrap;align-items:center;gap:12px;margin:0;padding:0 12px 0 20px;font-size:13px;display:flex;position:absolute;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 2px 6px #0610052e,0 34px 64px -28px #06100566}.snack.svelte-1xn7ig5 svg:where(.svelte-1xn7ig5){color:#8ed67f}.snack.svelte-1xn7ig5 button:where(.svelte-1xn7ig5){height:30px;color:inherit;font:inherit;cursor:pointer;background:#ffffff24;border:0;border-radius:4px;padding:0 12px;font-size:12.5px}.verbaly-studio{--paper:#f8fbf7;--ground:#eff4ee;--hollow:#e5ede4;--rule:#d7dfd5;--rule-strong:#828d80;--muted:#636c61;--body:#374036;--ink:#061005;--bar:#131e12;--on-bar:#f8fbf7;--broken:#b43931;--broken-tint:#eee0db;--missing:#8e5a04;--missing-tint:#e9e4d5;--draft:#2267ad;--draft-tint:#dae6ed;--done:#2e7428;--done-tint:#dce8da;--sans:"Schibsted Grotesk", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--serif:"Newsreader", ui-serif, Georgia, "Times New Roman", serif;--mono:"JetBrains Mono", ui-monospace, "Cascadia Code", "SF Mono", monospace;--rail:232px;--radius:6px}@media (prefers-color-scheme:dark){.verbaly-studio:not([data-theme=light]){--paper:#10170f;--ground:#161e15;--hollow:#1d271c;--rule:#2a352a;--rule-strong:#6f7a6d;--muted:#9aa598;--body:#d3dbd1;--ink:#f2f7f1;--broken:#f08a82;--broken-tint:#3a211f;--missing:#dcae4e;--missing-tint:#352c16;--draft:#7db6e8;--draft-tint:#172a3a;--done:#79c46f;--done-tint:#182c16}}.verbaly-studio[data-theme=dark]{--paper:#10170f;--ground:#161e15;--hollow:#1d271c;--rule:#2a352a;--rule-strong:#6f7a6d;--muted:#9aa598;--body:#d3dbd1;--ink:#f2f7f1;--broken:#f08a82;--broken-tint:#3a211f;--missing:#dcae4e;--missing-tint:#352c16;--draft:#7db6e8;--draft-tint:#172a3a;--done:#79c46f;--done-tint:#182c16}.verbaly-studio,.verbaly-studio *,.verbaly-studio :before,.verbaly-studio :after{box-sizing:border-box}.verbaly-studio{background:var(--ground);color:var(--body);font-family:var(--sans);-webkit-font-smoothing:antialiased;font-size:14px;line-height:1.5}.verbaly-studio code,.verbaly-studio kbd{font-family:var(--mono);font-size:.92em}@media (prefers-reduced-motion:reduce){.verbaly-studio,.verbaly-studio *,.verbaly-studio :before,.verbaly-studio :after{transition-duration:.01ms!important;animation-duration:.01ms!important}}html,body{height:100%}body{background:var(--ground);margin:0}#app{height:100%}
|
package/dist/ui/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>Verbaly Studio</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-DPqrh-r7.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-YyNwvl9E.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="app"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verbaly/studio",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.62.0",
|
|
4
4
|
"description": "Local review server for Verbaly: read, edit and approve translations over the JSON files already in your repo. No account, no database.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"i18n",
|
|
@@ -43,15 +43,15 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@verbaly/compiler": "^0.
|
|
46
|
+
"@verbaly/compiler": "^0.62.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@sveltejs/vite-plugin-svelte": "^7.3.0",
|
|
50
|
-
"@types/node": "^26.
|
|
51
|
-
"svelte": "^5.57.
|
|
50
|
+
"@types/node": "^26.6.2",
|
|
51
|
+
"svelte": "^5.57.1",
|
|
52
52
|
"svelte-check": "^4.7.6",
|
|
53
53
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
54
|
-
"verbaly": "^0.
|
|
54
|
+
"verbaly": "^0.62.0",
|
|
55
55
|
"vite": "^8.3.0"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|