@nxgt/material-core 0.9.1 → 0.11.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.
Files changed (41) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/README.md +180 -6
  3. package/dist/chunks/index-15vj9xbx.js +26 -0
  4. package/dist/chunks/index-15vj9xbx.js.map +10 -0
  5. package/dist/chunks/index-407b6zs0.js +41 -0
  6. package/dist/chunks/index-407b6zs0.js.map +10 -0
  7. package/dist/chunks/{index-h3vjydz7.js → index-r93kpbtg.js} +8 -23
  8. package/dist/chunks/index-r93kpbtg.js.map +10 -0
  9. package/dist/index.js +5 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/code-errors.d.ts +75 -0
  12. package/dist/lib/code-errors.d.ts.map +1 -0
  13. package/dist/lib/code-errors.js +37 -0
  14. package/dist/lib/code-errors.js.map +10 -0
  15. package/dist/lib/focus-control.js +7 -39
  16. package/dist/lib/focus-control.js.map +3 -4
  17. package/dist/lib/pdf-download.d.ts +1 -6
  18. package/dist/lib/pdf-download.d.ts.map +1 -1
  19. package/dist/lib/pdf-download.js +5 -3
  20. package/dist/lib/pdf-download.js.map +1 -1
  21. package/dist/lib/print-only.d.ts +29 -0
  22. package/dist/lib/print-only.d.ts.map +1 -0
  23. package/dist/lib/print-only.js +39 -0
  24. package/dist/lib/print-only.js.map +10 -0
  25. package/dist/lib/repeatable-group.d.ts +70 -0
  26. package/dist/lib/repeatable-group.d.ts.map +1 -0
  27. package/dist/lib/repeatable-group.js +59 -0
  28. package/dist/lib/repeatable-group.js.map +10 -0
  29. package/dist/lib/save-blob.d.ts +16 -0
  30. package/dist/lib/save-blob.d.ts.map +1 -0
  31. package/dist/lib/submit-guard.d.ts +72 -0
  32. package/dist/lib/submit-guard.d.ts.map +1 -0
  33. package/dist/lib/submit-guard.js +69 -0
  34. package/dist/lib/submit-guard.js.map +10 -0
  35. package/dist/lib/two-factor.d.ts +37 -0
  36. package/dist/lib/two-factor.d.ts.map +1 -0
  37. package/dist/lib/two-factor.js +38 -0
  38. package/dist/lib/two-factor.js.map +10 -0
  39. package/docs/roadmap.md +13 -0
  40. package/package.json +32 -2
  41. package/dist/chunks/index-h3vjydz7.js.map +0 -10
@@ -0,0 +1,37 @@
1
+ /**
2
+ * A secret in groups of `size` characters (4 by default), as one reads it
3
+ * out to type it: `"JBSWY3DPEHPK3PXP"` → `"JBSW Y3DP EHPK 3PXP"`. Whitespace
4
+ * already in it is dropped first, so a grouped secret groups the same.
5
+ */
6
+ export declare function groupSecret(secret: string, size?: number): string;
7
+ export type RecoveryCodesTextOptions = {
8
+ /** The file's first line: what the codes are for (an account, a product). */
9
+ heading?: string;
10
+ /** Its second line: how to use them ("Each code works once."). */
11
+ note?: string;
12
+ };
13
+ /**
14
+ * The recovery codes as the text file a person keeps: the heading, the note,
15
+ * a blank line, then one code per line and a trailing newline. A heading or
16
+ * note left out (or empty) is a line left out; with neither, the file is the
17
+ * codes alone.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * recoveryCodesText(['A-1', 'B-2'], { heading: 'Codes for ada@example.com', note: 'Each works once.' });
22
+ * // "Codes for ada@example.com\nEach works once.\n\nA-1\nB-2\n"
23
+ * ```
24
+ */
25
+ export declare function recoveryCodesText(codes: readonly string[], { heading, note }?: RecoveryCodesTextOptions): string;
26
+ export type DownloadTextOptions = {
27
+ /** The file's media type; `text/plain;charset=utf-8` by default. */
28
+ type?: string;
29
+ };
30
+ /**
31
+ * Saves `text` as a file named `fileName`, through an object URL and a
32
+ * temporary `<a download>`; the URL is revoked a minute later
33
+ * (`OBJECT_URL_TTL_MS`), as revoking it at once cancels the download in
34
+ * Firefox and Safari.
35
+ */
36
+ export declare function downloadText(text: string, fileName: string, options?: DownloadTextOptions): void;
37
+ //# sourceMappingURL=two-factor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"two-factor.d.ts","sourceRoot":"","sources":["../../src/lib/two-factor.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,MAAM,CAS5D;AAED,MAAM,MAAM,wBAAwB,GAAG;IACtC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,EAAE,OAAO,EAAE,IAAI,EAAE,GAAE,wBAA6B,GAC9C,MAAM,CAIR;AAED,MAAM,MAAM,mBAAmB,GAAG;IACjC,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAC/B,IAAI,CAGN"}
@@ -0,0 +1,38 @@
1
+ import {
2
+ saveBlob
3
+ } from "../chunks/index-15vj9xbx.js";
4
+
5
+ // src/lib/two-factor.ts
6
+ function groupSecret(secret, size = 4) {
7
+ const raw = secret.replace(/\s+/g, "");
8
+ const step = Math.floor(size);
9
+ if (!(step >= 1))
10
+ return raw;
11
+ const groups = [];
12
+ for (let start = 0;start < raw.length; start += step) {
13
+ groups.push(raw.slice(start, start + step));
14
+ }
15
+ return groups.join(" ");
16
+ }
17
+ function recoveryCodesText(codes, { heading, note } = {}) {
18
+ const head = [heading, note].filter((line) => Boolean(line));
19
+ const body = `${codes.join(`
20
+ `)}
21
+ `;
22
+ return head.length ? `${head.join(`
23
+ `)}
24
+
25
+ ${body}` : body;
26
+ }
27
+ function downloadText(text, fileName, options = {}) {
28
+ const type = options.type ?? "text/plain;charset=utf-8";
29
+ saveBlob(new Blob([text], { type }), fileName);
30
+ }
31
+ export {
32
+ downloadText,
33
+ groupSecret,
34
+ recoveryCodesText
35
+ };
36
+
37
+ //# debugId=86107FED2A9CC6B264756E2164756E21
38
+ //# sourceMappingURL=two-factor.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/two-factor.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * `@nxgt/material-core/two-factor` — the framework-free part of both\n * libraries' `EnrolmentSecret` and `RecoveryCodes`: a TOTP secret grouped\n * to be typed by hand, the recovery codes as a text file, and saving that\n * file. Reads the DOM only when called. Printing one element of the page is\n * `/print-only`.\n */\nimport { saveBlob } from './save-blob';\n\n/**\n * A secret in groups of `size` characters (4 by default), as one reads it\n * out to type it: `\"JBSWY3DPEHPK3PXP\"` → `\"JBSW Y3DP EHPK 3PXP\"`. Whitespace\n * already in it is dropped first, so a grouped secret groups the same.\n */\nexport function groupSecret(secret: string, size = 4): string {\n\tconst raw = secret.replace(/\\s+/g, '');\n\tconst step = Math.floor(size);\n\tif (!(step >= 1)) return raw;\n\tconst groups: string[] = [];\n\tfor (let start = 0; start < raw.length; start += step) {\n\t\tgroups.push(raw.slice(start, start + step));\n\t}\n\treturn groups.join(' ');\n}\n\nexport type RecoveryCodesTextOptions = {\n\t/** The file's first line: what the codes are for (an account, a product). */\n\theading?: string;\n\t/** Its second line: how to use them (\"Each code works once.\"). */\n\tnote?: string;\n};\n\n/**\n * The recovery codes as the text file a person keeps: the heading, the note,\n * a blank line, then one code per line and a trailing newline. A heading or\n * note left out (or empty) is a line left out; with neither, the file is the\n * codes alone.\n *\n * @example\n * ```ts\n * recoveryCodesText(['A-1', 'B-2'], { heading: 'Codes for ada@example.com', note: 'Each works once.' });\n * // \"Codes for ada@example.com\\nEach works once.\\n\\nA-1\\nB-2\\n\"\n * ```\n */\nexport function recoveryCodesText(\n\tcodes: readonly string[],\n\t{ heading, note }: RecoveryCodesTextOptions = {},\n): string {\n\tconst head = [heading, note].filter((line): line is string => Boolean(line));\n\tconst body = `${codes.join('\\n')}\\n`;\n\treturn head.length ? `${head.join('\\n')}\\n\\n${body}` : body;\n}\n\nexport type DownloadTextOptions = {\n\t/** The file's media type; `text/plain;charset=utf-8` by default. */\n\ttype?: string;\n};\n\n/**\n * Saves `text` as a file named `fileName`, through an object URL and a\n * temporary `<a download>`; the URL is revoked a minute later\n * (`OBJECT_URL_TTL_MS`), as revoking it at once cancels the download in\n * Firefox and Safari.\n */\nexport function downloadText(\n\ttext: string,\n\tfileName: string,\n\toptions: DownloadTextOptions = {},\n): void {\n\tconst type = options.type ?? 'text/plain;charset=utf-8';\n\tsaveBlob(new Blob([text], { type }), fileName);\n}\n"
6
+ ],
7
+ "mappings": ";;;;;AAcO,SAAS,WAAW,CAAC,QAAgB,OAAO,GAAW;AAAA,EAC7D,MAAM,MAAM,OAAO,QAAQ,QAAQ,EAAE;AAAA,EACrC,MAAM,OAAO,KAAK,MAAM,IAAI;AAAA,EAC5B,IAAI,EAAE,QAAQ;AAAA,IAAI,OAAO;AAAA,EACzB,MAAM,SAAmB,CAAC;AAAA,EAC1B,SAAS,QAAQ,EAAG,QAAQ,IAAI,QAAQ,SAAS,MAAM;AAAA,IACtD,OAAO,KAAK,IAAI,MAAM,OAAO,QAAQ,IAAI,CAAC;AAAA,EAC3C;AAAA,EACA,OAAO,OAAO,KAAK,GAAG;AAAA;AAsBhB,SAAS,iBAAiB,CAChC,SACE,SAAS,SAAmC,CAAC,GACtC;AAAA,EACT,MAAM,OAAO,CAAC,SAAS,IAAI,EAAE,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAAA,EAC3E,MAAM,OAAO,GAAG,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA,EAC/B,OAAO,KAAK,SAAS,GAAG,KAAK,KAAK;AAAA,CAAI;AAAA;AAAA,EAAQ,SAAS;AAAA;AAcjD,SAAS,YAAY,CAC3B,MACA,UACA,UAA+B,CAAC,GACzB;AAAA,EACP,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAC7B,SAAS,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,GAAG,QAAQ;AAAA;",
8
+ "debugId": "86107FED2A9CC6B264756E2164756E21",
9
+ "names": []
10
+ }
package/docs/roadmap.md CHANGED
@@ -76,6 +76,19 @@ Nothing is in progress.
76
76
 
77
77
  ## Shipped
78
78
 
79
+ - **A repeatable row group's focus rules** (`/repeatable-group`) — where the
80
+ focus goes after a row is added, removed or moved, the add and remove
81
+ limits, and what the live region announces, behind both libraries'
82
+ `RepeatableGroup`. 0.11.0.
83
+ - **Two-step verification helpers and printing one element** (`/two-factor`,
84
+ `/print-only`) — a TOTP secret grouped to be typed by hand, the recovery
85
+ codes as a text file, saving a text file, and printing one element of the
86
+ page with no inline style, behind both libraries' `EnrolmentSecret` and
87
+ `RecoveryCodes`. 0.10.0.
88
+ - **One submit in flight and errors worded by code** (`/submit-guard`,
89
+ `/code-errors`) — the guard behind both libraries' `useSubmitOnce`, and the
90
+ zod error map behind their `useCodeResolver`, which words a refinement's
91
+ `params.code` in the app's words and leaves the rest to a fallback. 0.10.0.
79
92
  - **The page's Content Security Policy nonce** (`/csp-nonce`) — one place both
80
93
  libraries read the nonce from, so every `<style>` they create carries it
81
94
  under a strict `style-src-elem`, and `cspAssetsInlineLimit` (`/vite`), which
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nxgt/material-core",
3
- "version": "0.9.1",
4
- "description": "The framework-free core of @nxgt/material and @nxgt/material-vue: the PDF document model and its react-pdf renderer, print formatters, PDF file helpers, the PDF viewer's pure modules, the currency digits, the file-size formatter, the field-blur layers, a field's first focusable control, the aria-describedby joiner, the inert background of a modal layer, Escape forwarded while an overlay closes, the Toaster's touch-hover guard and its focus hand-back, the page's Content Security Policy nonce, an object built on first use, the zod issue messages, the date range presets, the debounce, accent-insensitive text matching and the race-free async search behind Autocomplete and SearchField, the file preview's kind detection and text reader, the pdfkit fonts Vite plugin, a CSP-safe Vite assetsInlineLimit and the Node-only pdfkit fonts resolution for Next.js and Nuxt builds",
3
+ "version": "0.11.0",
4
+ "description": "The framework-free core of @nxgt/material and @nxgt/material-vue: the PDF document model and its react-pdf renderer, print formatters, PDF file helpers, the PDF viewer's pure modules, the currency digits, the file-size formatter, the field-blur layers, a field's first focusable control, a repeatable row group's focus and announcement rules, the aria-describedby joiner, the inert background of a modal layer, Escape forwarded while an overlay closes, the Toaster's touch-hover guard and its focus hand-back, the page's Content Security Policy nonce, an object built on first use, the zod issue messages, the date range presets, the debounce, accent-insensitive text matching and the race-free async search behind Autocomplete and SearchField, the submit guard, the code error map, the two-factor helpers (a grouped TOTP secret, the recovery codes' file, a text download), printing one element of the page, the file preview's kind detection and text reader, the pdfkit fonts Vite plugin, a CSP-safe Vite assetsInlineLimit and the Node-only pdfkit fonts resolution for Next.js and Nuxt builds",
5
5
  "license": "MIT",
6
6
  "bugs": {
7
7
  "email": "stevegires@gmail.com"
@@ -103,6 +103,11 @@
103
103
  "import": "./dist/lib/focus-control.js",
104
104
  "default": "./dist/lib/focus-control.js"
105
105
  },
106
+ "./repeatable-group": {
107
+ "types": "./dist/lib/repeatable-group.d.ts",
108
+ "import": "./dist/lib/repeatable-group.js",
109
+ "default": "./dist/lib/repeatable-group.js"
110
+ },
106
111
  "./escape-forward": {
107
112
  "types": "./dist/lib/escape-forward.d.ts",
108
113
  "import": "./dist/lib/escape-forward.js",
@@ -183,6 +188,26 @@
183
188
  "import": "./dist/lib/async-search.js",
184
189
  "default": "./dist/lib/async-search.js"
185
190
  },
191
+ "./submit-guard": {
192
+ "types": "./dist/lib/submit-guard.d.ts",
193
+ "import": "./dist/lib/submit-guard.js",
194
+ "default": "./dist/lib/submit-guard.js"
195
+ },
196
+ "./code-errors": {
197
+ "types": "./dist/lib/code-errors.d.ts",
198
+ "import": "./dist/lib/code-errors.js",
199
+ "default": "./dist/lib/code-errors.js"
200
+ },
201
+ "./print-only": {
202
+ "types": "./dist/lib/print-only.d.ts",
203
+ "import": "./dist/lib/print-only.js",
204
+ "default": "./dist/lib/print-only.js"
205
+ },
206
+ "./two-factor": {
207
+ "types": "./dist/lib/two-factor.d.ts",
208
+ "import": "./dist/lib/two-factor.js",
209
+ "default": "./dist/lib/two-factor.js"
210
+ },
186
211
  "./file-preview": {
187
212
  "types": "./dist/file-preview/index.d.ts",
188
213
  "import": "./dist/file-preview/index.js",
@@ -248,6 +273,7 @@
248
273
  "src/lib/currency-digits.ts",
249
274
  "src/lib/field-blur-layers.ts",
250
275
  "src/lib/focus-control.ts",
276
+ "src/lib/repeatable-group.ts",
251
277
  "src/lib/escape-forward.ts",
252
278
  "src/lib/described-by.ts",
253
279
  "src/lib/touch-hover.ts",
@@ -264,6 +290,10 @@
264
290
  "src/lib/debounce.ts",
265
291
  "src/lib/text-match.ts",
266
292
  "src/lib/async-search.ts",
293
+ "src/lib/submit-guard.ts",
294
+ "src/lib/code-errors.ts",
295
+ "src/lib/two-factor.ts",
296
+ "src/lib/print-only.ts",
267
297
  "src/file-preview/index.ts",
268
298
  "src/pdf-viewer/index.ts",
269
299
  "src/vite/index.ts",
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/pdf-download.ts"],
4
- "sourcesContent": [
5
- "import { resolvePdfFileName } from './pdf-file-name';\nimport {\n\tcopyPdfData,\n\tisBlob,\n\tisPdfUrlSource,\n\ttype PdfSource,\n\tpdfSourceUrl,\n} from './pdf-source';\n\n/**\n * How long an object URL outlives the click that started its download or\n * opened its tab. Revoking it synchronously cancels the download in Firefox\n * and Safari, which read the URL after `click()` returns.\n */\nexport const OBJECT_URL_TTL_MS = 60_000;\n\nexport type PdfFileOptions = {\n\t/** Name of the saved file; `.pdf` is added when missing. */\n\tfileName?: string;\n\t/**\n\t * Name used when neither `fileName`, a `File`'s name nor the URL gives\n\t * one: `document`, or its translation.\n\t */\n\tdefaultName?: string;\n\t/**\n\t * Bytes of the document the reader already loaded. Saving them needs no\n\t * second request, and works for a cross-origin URL, where the `download`\n\t * attribute is ignored.\n\t */\n\tgetData?: () =>\n\t\t| Uint8Array\n\t\t| null\n\t\t| undefined\n\t\t| Promise<Uint8Array | null | undefined>;\n};\n\nfunction fetchInit(source: PdfSource): RequestInit | undefined {\n\tif (!isPdfUrlSource(source)) return undefined;\n\treturn {\n\t\theaders: source.httpHeaders,\n\t\tcredentials: source.withCredentials ? 'include' : 'same-origin',\n\t};\n}\n\nasync function resolvePdfBlob(\n\tsource: PdfSource,\n\tgetData: PdfFileOptions['getData'],\n): Promise<Blob | null> {\n\tconst url = pdfSourceUrl(source);\n\tif (url === null) {\n\t\t// A Blob or bytes: a Blob copies what it is given.\n\t\treturn isBlob(source)\n\t\t\t? source\n\t\t\t: new Blob([copyPdfData(source as ArrayBuffer | Uint8Array)], {\n\t\t\t\t\ttype: 'application/pdf',\n\t\t\t\t});\n\t}\n\ttry {\n\t\tconst bytes = await getData?.();\n\t\tif (bytes?.byteLength) {\n\t\t\treturn new Blob([copyPdfData(bytes)], { type: 'application/pdf' });\n\t\t}\n\t} catch {\n\t\t/* the document may be gone; fetch it instead */\n\t}\n\ttry {\n\t\tconst init = fetchInit(source);\n\t\tconst response = await (init ? fetch(url, init) : fetch(url));\n\t\treturn response.ok ? await response.blob() : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction revokeLater(url: string) {\n\twindow.setTimeout(() => URL.revokeObjectURL(url), OBJECT_URL_TTL_MS);\n}\n\nfunction clickLink(href: string, attributes: Record<string, string>) {\n\tconst link = document.createElement('a');\n\tlink.href = href;\n\tfor (const [name, value] of Object.entries(attributes)) {\n\t\tlink.setAttribute(name, value);\n\t}\n\tlink.style.display = 'none';\n\t// Firefox ignores a click on a link that is not in the document.\n\tdocument.body.append(link);\n\tlink.click();\n\tlink.remove();\n}\n\n/** Saves a Blob under `fileName`, and revokes its URL once the save began. */\nfunction saveBlob(blob: Blob, fileName: string) {\n\tconst url = URL.createObjectURL(blob);\n\tclickLink(url, { download: fileName });\n\trevokeLater(url);\n}\n\nfunction openInNewTab(href: string) {\n\tclickLink(href, { target: '_blank', rel: 'noopener' });\n}\n\n/**\n * The URL a new tab may open when the document could not be read. None for\n * a URL with headers: a tab sends no `Authorization`, so it would only show\n * the server's refusal.\n */\nfunction fallbackUrl(source: PdfSource) {\n\tif (isPdfUrlSource(source) && source.httpHeaders) return null;\n\treturn pdfSourceUrl(source);\n}\n\n/**\n * Downloads the PDF under its resolved name. A URL is saved from the loaded\n * bytes or fetched; when neither works (CORS), it opens in a new tab, which\n * a popup blocker may stop once the click's activation has expired. A URL\n * with headers never opens in a tab: it would load without them.\n */\nexport async function downloadPdfFile(\n\tsource: PdfSource,\n\toptions: PdfFileOptions = {},\n) {\n\tconst name = resolvePdfFileName(\n\t\tsource,\n\t\toptions.fileName,\n\t\toptions.defaultName,\n\t);\n\tconst blob = await resolvePdfBlob(source, options.getData);\n\tconst url = fallbackUrl(source);\n\tif (blob) saveBlob(blob, name);\n\telse if (url !== null) openInNewTab(url);\n}\n\n/**\n * Prints the PDF from a same-origin object URL in a hidden frame. When the\n * browser refuses (a PDF plugin that blocks `print()`, a cross-origin URL\n * that could not be fetched), the document opens in a new tab instead.\n */\nexport async function printPdfFile(\n\tsource: PdfSource,\n\toptions: Pick<PdfFileOptions, 'getData'> = {},\n) {\n\tconst blob = await resolvePdfBlob(source, options.getData);\n\tif (!blob) {\n\t\tconst url = fallbackUrl(source);\n\t\tif (url !== null) openInNewTab(url);\n\t\treturn;\n\t}\n\tconst url = URL.createObjectURL(blob);\n\tconst frame = document.createElement('iframe');\n\tframe.setAttribute('aria-hidden', 'true');\n\tframe.style.position = 'fixed';\n\tframe.style.right = '0';\n\tframe.style.bottom = '0';\n\tframe.style.width = '0';\n\tframe.style.height = '0';\n\tframe.style.border = '0';\n\tframe.src = url;\n\tframe.onload = () => {\n\t\ttry {\n\t\t\tframe.contentWindow?.focus();\n\t\t\tframe.contentWindow?.print();\n\t\t} catch {\n\t\t\topenInNewTab(url);\n\t\t} finally {\n\t\t\twindow.setTimeout(() => frame.remove(), 1000);\n\t\t\trevokeLater(url);\n\t\t}\n\t};\n\tdocument.body.append(frame);\n}\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "77B6E1C9EF4463B464756E2164756E21",
9
- "names": []
10
- }