@nexterajs/ui 0.0.1

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 (50) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +64 -0
  4. package/fesm2022/nexterajs-ui-animations.mjs +184 -0
  5. package/fesm2022/nexterajs-ui-animations.mjs.map +1 -0
  6. package/fesm2022/nexterajs-ui-core.mjs +326 -0
  7. package/fesm2022/nexterajs-ui-core.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +953 -0
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -0
  10. package/fesm2022/nexterajs-ui-excel.mjs +779 -0
  11. package/fesm2022/nexterajs-ui-excel.mjs.map +1 -0
  12. package/fesm2022/nexterajs-ui-file-uploader.mjs +125 -0
  13. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -0
  14. package/fesm2022/nexterajs-ui-forms.mjs +1113 -0
  15. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -0
  16. package/fesm2022/nexterajs-ui-grid.mjs +4145 -0
  17. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -0
  18. package/fesm2022/nexterajs-ui-intl.mjs +377 -0
  19. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-pivot.mjs +4739 -0
  21. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -0
  22. package/fesm2022/nexterajs-ui-styling.mjs +59 -0
  23. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-tree-view.mjs +202 -0
  25. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -0
  26. package/fesm2022/nexterajs-ui-validation.mjs +269 -0
  27. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui.mjs +23 -0
  29. package/fesm2022/nexterajs-ui.mjs.map +1 -0
  30. package/package.json +100 -0
  31. package/styles/_button-directives.scss +39 -0
  32. package/styles/_dropdown.scss +113 -0
  33. package/styles/_editor.scss +146 -0
  34. package/styles/_mixins.scss +2 -0
  35. package/styles/_tokens.scss +77 -0
  36. package/styles/_widget.scss +58 -0
  37. package/styles/index.scss +83 -0
  38. package/types/nexterajs-ui-animations.d.ts +22 -0
  39. package/types/nexterajs-ui-core.d.ts +328 -0
  40. package/types/nexterajs-ui-dropdowns.d.ts +334 -0
  41. package/types/nexterajs-ui-excel.d.ts +159 -0
  42. package/types/nexterajs-ui-file-uploader.d.ts +47 -0
  43. package/types/nexterajs-ui-forms.d.ts +296 -0
  44. package/types/nexterajs-ui-grid.d.ts +1485 -0
  45. package/types/nexterajs-ui-intl.d.ts +125 -0
  46. package/types/nexterajs-ui-pivot.d.ts +1470 -0
  47. package/types/nexterajs-ui-styling.d.ts +40 -0
  48. package/types/nexterajs-ui-tree-view.d.ts +69 -0
  49. package/types/nexterajs-ui-validation.d.ts +102 -0
  50. package/types/nexterajs-ui.d.ts +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexterajs-ui-excel.mjs","sources":["../../../projects/nextera-ui/excel/src/lib/excel/nxe-xlsx-types.ts","../../../projects/nextera-ui/excel/src/lib/excel/nxe-zip.ts","../../../projects/nextera-ui/excel/src/lib/excel/nxe-xlsx-writer.ts","../../../projects/nextera-ui/excel/src/lib/excel/nxe-xlsx-reader.ts","../../../projects/nextera-ui/excel/src/lib/excel/nxe-save.ts","../../../projects/nextera-ui/excel/src/public-api.ts","../../../projects/nextera-ui/excel/src/nexterajs-ui-excel.ts"],"sourcesContent":["/**\r\n * Public value types for the in-repo .xlsx writer. These mirror the narrow slice of the exceljs\r\n * `Cell` shape the app actually uses (verified across every call site), so existing code migrates by\r\n * import path only — see {@link NxeWorkbook} (aliased as `Workbook`).\r\n */\r\n\r\n/** A cell's value. `null`/`undefined`/`''` render as blank. */\r\nexport type NxeCellValue = string | number | Date | null | undefined;\r\n\r\n/** Font facet. Default font (when unset) is undefined, NOT `{}` — `formatExcel` reads `font?.name`. */\r\nexport interface NxeFont {\r\n name?: string;\r\n bold?: boolean;\r\n size?: number;\r\n}\r\n\r\n/** Solid pattern fill, matching the exceljs `{ type, pattern, fgColor: { argb } }` shape. */\r\nexport interface NxeFill {\r\n type: 'pattern';\r\n pattern: 'solid';\r\n fgColor: { argb: string };\r\n}\r\n\r\n/** Cell alignment. `vertical: 'middle'` maps to Excel's `center`. */\r\nexport interface NxeAlignment {\r\n horizontal?: 'left' | 'center' | 'right';\r\n vertical?: 'top' | 'middle' | 'bottom';\r\n /** Text indent level. Like exceljs, emitted as-is; Excel only renders it with left/right/distributed horizontal. */\r\n indent?: number;\r\n}\r\n\r\n/** Auto-filter range, object form (`{ from: {row, column}, to: {row, column} }`), 1-based. */\r\nexport interface NxeAutoFilter {\r\n from: { row: number; column: number };\r\n to: { row: number; column: number };\r\n}\r\n","/**\r\n * Minimal, zero-dependency ZIP support for the in-repo .xlsx writer/reader — replacing the\r\n * `jszip`/`pako` machinery that used to arrive transitively via `exceljs`.\r\n *\r\n * The WRITE half ({@link writeZip}) emits a STORE-only (uncompressed) archive — valid for `.xlsx`,\r\n * which Excel reads happily — so no DEFLATE compressor is needed. CRC-32 is still required per entry\r\n * even under STORE, so it is computed here.\r\n *\r\n * The READ half ({@link readCentralDirectory} / {@link readZipEntryBytes}) parses a real-world\r\n * archive via its central directory (the authoritative size source — local headers may carry zeroed\r\n * sizes when a data descriptor is used) and inflates DEFLATE entries with the browser-native\r\n * {@link DecompressionStream} (`deflate-raw`); STORE entries are copied. No external lib.\r\n */\r\n\r\nconst SIG_LOCAL = 0x04034b50;\r\nconst SIG_CENTRAL = 0x02014b50;\r\nconst SIG_EOCD = 0x06054b50;\r\n\r\n/** A fixed DOS date/time (1980-01-01 00:00:00) so writer output is byte-reproducible. */\r\nconst DOS_DATE = 0x0021;\r\nconst DOS_TIME = 0x0000;\r\n\r\n// ────────────────────────────────────────────────────────────────────────────\r\n// CRC-32 (lazy 256-entry table, standard 0xEDB88320 polynomial)\r\n// ────────────────────────────────────────────────────────────────────────────\r\n\r\nlet CRC_TABLE: Uint32Array | null = null;\r\n\r\nfunction crcTable(): Uint32Array {\r\n if (CRC_TABLE) {\r\n return CRC_TABLE;\r\n }\r\n const t = new Uint32Array(256);\r\n for (let n = 0; n < 256; n++) {\r\n let c = n;\r\n for (let k = 0; k < 8; k++) {\r\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n }\r\n t[n] = c >>> 0;\r\n }\r\n return (CRC_TABLE = t);\r\n}\r\n\r\n/** CRC-32 of a byte array (as required by the ZIP format, including STORE entries). */\r\nexport function crc32(bytes: Uint8Array): number {\r\n const t = crcTable();\r\n let c = 0xffffffff;\r\n for (let i = 0; i < bytes.length; i++) {\r\n c = t[(c ^ bytes[i]) & 0xff] ^ (c >>> 8);\r\n }\r\n return (c ^ 0xffffffff) >>> 0;\r\n}\r\n\r\n// ────────────────────────────────────────────────────────────────────────────\r\n// WRITE — STORE-only archive\r\n// ────────────────────────────────────────────────────────────────────────────\r\n\r\n/** One archive member: a part name (e.g. `xl/workbook.xml`) and its already-encoded bytes. */\r\nexport interface ZipPart {\r\n name: string;\r\n bytes: Uint8Array;\r\n}\r\n\r\n/**\r\n * Build a STORE (uncompressed) ZIP archive from the given parts. Layout: every local file header +\r\n * data, then the central directory, then the End-Of-Central-Directory record. The first two bytes\r\n * are `PK` (0x50 0x4B). Returns the whole archive as one {@link Uint8Array}.\r\n */\r\nexport function writeZip(parts: ZipPart[]): Uint8Array<ArrayBuffer> {\r\n const enc = new TextEncoder();\r\n const entries = parts.map((p) => {\r\n const nameBytes = enc.encode(p.name);\r\n return { nameBytes, data: p.bytes, crc: crc32(p.bytes) };\r\n });\r\n\r\n let localSize = 0;\r\n let centralSize = 0;\r\n for (const e of entries) {\r\n localSize += 30 + e.nameBytes.length + e.data.length;\r\n centralSize += 46 + e.nameBytes.length;\r\n }\r\n\r\n const total = localSize + centralSize + 22;\r\n const out = new Uint8Array(total);\r\n const view = new DataView(out.buffer);\r\n let offset = 0;\r\n const localOffsets: number[] = [];\r\n\r\n // Local file headers + data.\r\n for (const e of entries) {\r\n localOffsets.push(offset);\r\n view.setUint32(offset, SIG_LOCAL, true);\r\n view.setUint16(offset + 4, 20, true); // version needed\r\n view.setUint16(offset + 6, 0, true); // general-purpose flag\r\n view.setUint16(offset + 8, 0, true); // method 0 = STORE\r\n view.setUint16(offset + 10, DOS_TIME, true);\r\n view.setUint16(offset + 12, DOS_DATE, true);\r\n view.setUint32(offset + 14, e.crc, true);\r\n view.setUint32(offset + 18, e.data.length, true); // compressed size\r\n view.setUint32(offset + 22, e.data.length, true); // uncompressed size\r\n view.setUint16(offset + 26, e.nameBytes.length, true);\r\n view.setUint16(offset + 28, 0, true); // extra length\r\n offset += 30;\r\n out.set(e.nameBytes, offset);\r\n offset += e.nameBytes.length;\r\n out.set(e.data, offset);\r\n offset += e.data.length;\r\n }\r\n\r\n // Central directory.\r\n const centralStart = offset;\r\n entries.forEach((e, i) => {\r\n view.setUint32(offset, SIG_CENTRAL, true);\r\n view.setUint16(offset + 4, 20, true); // version made by\r\n view.setUint16(offset + 6, 20, true); // version needed\r\n view.setUint16(offset + 8, 0, true); // flag\r\n view.setUint16(offset + 10, 0, true); // method STORE\r\n view.setUint16(offset + 12, DOS_TIME, true);\r\n view.setUint16(offset + 14, DOS_DATE, true);\r\n view.setUint32(offset + 16, e.crc, true);\r\n view.setUint32(offset + 20, e.data.length, true); // compressed size\r\n view.setUint32(offset + 24, e.data.length, true); // uncompressed size\r\n view.setUint16(offset + 28, e.nameBytes.length, true);\r\n view.setUint16(offset + 30, 0, true); // extra length\r\n view.setUint16(offset + 32, 0, true); // comment length\r\n view.setUint16(offset + 34, 0, true); // disk number start\r\n view.setUint16(offset + 36, 0, true); // internal attrs\r\n view.setUint32(offset + 38, 0, true); // external attrs\r\n view.setUint32(offset + 42, localOffsets[i], true); // local header offset\r\n offset += 46;\r\n out.set(e.nameBytes, offset);\r\n offset += e.nameBytes.length;\r\n });\r\n\r\n // End of central directory.\r\n view.setUint32(offset, SIG_EOCD, true);\r\n view.setUint16(offset + 4, 0, true); // disk number\r\n view.setUint16(offset + 6, 0, true); // disk with central dir\r\n view.setUint16(offset + 8, entries.length, true); // entries this disk\r\n view.setUint16(offset + 10, entries.length, true); // total entries\r\n view.setUint32(offset + 12, centralSize, true);\r\n view.setUint32(offset + 16, centralStart, true);\r\n view.setUint16(offset + 20, 0, true); // comment length\r\n\r\n return out;\r\n}\r\n\r\n// ────────────────────────────────────────────────────────────────────────────\r\n// READ — central-directory parse + inflate\r\n// ────────────────────────────────────────────────────────────────────────────\r\n\r\n/** A located archive member, sized from the (authoritative) central directory. */\r\nexport interface ZipEntry {\r\n name: string;\r\n method: number;\r\n compSize: number;\r\n uncompSize: number;\r\n localOffset: number;\r\n}\r\n\r\n/**\r\n * Parse the central directory of a ZIP buffer into a name → {@link ZipEntry} map. Scans backwards\r\n * for the EOCD record, then walks each central-directory header. Throws on a ZIP64 archive (never\r\n * produced by Excel for the small workbooks this app handles).\r\n */\r\nexport function readCentralDirectory(buf: Uint8Array): Map<string, ZipEntry> {\r\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\r\n const dec = new TextDecoder('utf-8');\r\n\r\n // Locate EOCD (signature within the last 22 + up to 65535 comment bytes).\r\n let eocd = -1;\r\n const minPos = Math.max(0, buf.length - 22 - 65535);\r\n for (let i = buf.length - 22; i >= minPos; i--) {\r\n if (view.getUint32(i, true) === SIG_EOCD) {\r\n eocd = i;\r\n break;\r\n }\r\n }\r\n if (eocd < 0) {\r\n throw new Error('Not a valid .xlsx file (no ZIP end-of-central-directory record).');\r\n }\r\n\r\n const entryCount = view.getUint16(eocd + 10, true);\r\n const cdOffset = view.getUint32(eocd + 16, true);\r\n if (entryCount === 0xffff || cdOffset === 0xffffffff) {\r\n throw new Error('Unsupported ZIP (ZIP64 archives are not supported).');\r\n }\r\n\r\n const map = new Map<string, ZipEntry>();\r\n let p = cdOffset;\r\n for (let i = 0; i < entryCount; i++) {\r\n if (view.getUint32(p, true) !== SIG_CENTRAL) {\r\n break;\r\n }\r\n const method = view.getUint16(p + 10, true);\r\n const compSize = view.getUint32(p + 20, true);\r\n const uncompSize = view.getUint32(p + 24, true);\r\n const nameLen = view.getUint16(p + 28, true);\r\n const extraLen = view.getUint16(p + 30, true);\r\n const commentLen = view.getUint16(p + 32, true);\r\n const localOffset = view.getUint32(p + 42, true);\r\n const name = dec.decode(buf.subarray(p + 46, p + 46 + nameLen));\r\n map.set(name, { name, method, compSize, uncompSize, localOffset });\r\n p += 46 + nameLen + extraLen + commentLen;\r\n }\r\n return map;\r\n}\r\n\r\n/** Inflate a raw-DEFLATE byte array using the browser-native DecompressionStream. */\r\nasync function inflateRaw(bytes: Uint8Array): Promise<Uint8Array> {\r\n // Copy into a fresh ArrayBuffer-backed view so it satisfies BlobPart (a subarray may be SAB-typed).\r\n const part = new Uint8Array(bytes);\r\n const stream = new Blob([part]).stream().pipeThrough(new DecompressionStream('deflate-raw'));\r\n const buf = await new Response(stream).arrayBuffer();\r\n return new Uint8Array(buf);\r\n}\r\n\r\n/** Resolve where an entry's file data begins, reading the LOCAL header's own name/extra lengths. */\r\nfunction localDataOffset(buf: Uint8Array, view: DataView, localOffset: number): number {\r\n if (view.getUint32(localOffset, true) !== SIG_LOCAL) {\r\n throw new Error('Corrupt ZIP (bad local file header).');\r\n }\r\n const nameLen = view.getUint16(localOffset + 26, true);\r\n const extraLen = view.getUint16(localOffset + 28, true);\r\n return localOffset + 30 + nameLen + extraLen;\r\n}\r\n\r\n/** Read (and inflate, if DEFLATE) one archive member's raw bytes. */\r\nexport async function readZipEntryBytes(buf: Uint8Array, entry: ZipEntry): Promise<Uint8Array> {\r\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\r\n const start = localDataOffset(buf, view, entry.localOffset);\r\n const comp = buf.subarray(start, start + entry.compSize);\r\n if (entry.method === 0) {\r\n return comp.slice();\r\n }\r\n if (entry.method === 8) {\r\n return inflateRaw(comp);\r\n }\r\n throw new Error(`Unsupported ZIP compression method ${entry.method}.`);\r\n}\r\n\r\n/** Read one archive member and decode it as UTF-8 text (for the OOXML parts). */\r\nexport async function readZipEntryText(buf: Uint8Array, entry: ZipEntry): Promise<string> {\r\n return new TextDecoder('utf-8').decode(await readZipEntryBytes(buf, entry));\r\n}\r\n","/**\r\n * Zero-dependency, in-repo `.xlsx` writer — a drop-in for the narrow exceljs surface this app uses\r\n * (verified across every call site). Replaces the `exceljs` package: callers migrate by import path\r\n * only, via the `Workbook` alias below.\r\n *\r\n * The object model ({@link NxeWorkbook} / {@link NxeWorksheet} / {@link NxeRow} / {@link NxeCell})\r\n * mirrors exceljs (`addWorksheet`, `addRow`, `getCell` 1-based + auto-extend, `mergeCells`,\r\n * `autoFilter`, `eachSheet`/`eachRow`/`eachCell`, `rowCount`, cell `value`/`numFmt`/`font`/`fill`/\r\n * `alignment`, `xlsx.writeBuffer()`). {@link NxeWorkbook.serialize} emits a flat 6-part OOXML\r\n * (SpreadsheetML) package using inline strings — no `sharedStrings.xml` — and packs it as a STORE\r\n * (uncompressed) ZIP via {@link writeZip}.\r\n *\r\n * Scope is deliberately exactly what the app needs: string/number/Date/'' cells, custom number\r\n * formats, fonts (name + bold, per cell or per row), solid fills, alignment (incl. indent), merged\r\n * cells, auto-filter, column widths. No borders, formulas, images, rich text.\r\n */\r\nimport { NxeAlignment, NxeAutoFilter, NxeCellValue, NxeFill, NxeFont } from './nxe-xlsx-types';\r\nimport { writeZip, ZipPart } from './nxe-zip';\r\n\r\nconst MAIN_NS = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main';\r\nconst REL_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\r\nconst PKG_REL_NS = 'http://schemas.openxmlformats.org/package/2006/relationships';\r\nconst CT_NS = 'http://schemas.openxmlformats.org/package/2006/content-types';\r\n\r\n// ────────────────────────────────────────────────────────────────────────────\r\n// Small helpers (column letters, escaping, Excel serial dates)\r\n// ────────────────────────────────────────────────────────────────────────────\r\n\r\n/** 1 → A, 27 → AA. */\r\nexport function colLetter(n: number): string {\r\n let s = '';\r\n while (n > 0) {\r\n const r = (n - 1) % 26;\r\n s = String.fromCharCode(65 + r) + s;\r\n n = Math.floor((n - 1) / 26);\r\n }\r\n return s;\r\n}\r\n\r\n/** 1-based (row, col) → A1 reference. */\r\nfunction cellRef(row: number, col: number): string {\r\n return colLetter(col) + row;\r\n}\r\n\r\n/** Strip XML-1.0-forbidden control chars, then escape `& < >` for element text. */\r\nfunction escapeText(s: string): string {\r\n return s\r\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/g, '')\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n}\r\n\r\n/** Escape for attribute values (adds `\"`). */\r\nfunction escapeAttr(s: string): string {\r\n return escapeText(s).replace(/\"/g, '&quot;');\r\n}\r\n\r\n/** `xml:space=\"preserve\"` when leading/trailing whitespace would otherwise be collapsed. */\r\nfunction preserve(s: string): string {\r\n return /^\\s|\\s$/.test(s) ? ' xml:space=\"preserve\"' : '';\r\n}\r\n\r\n/**\r\n * Excel serial date — days since 1899-12-30 (epoch absorbs the 1900 leap-year bug for all dates\r\n * ≥ 1900-03-01, the only range these reports produce). Built from LOCAL calendar components so the\r\n * printed `dd mmm yyyy` matches the day the grid showed, regardless of timezone.\r\n */\r\nfunction excelSerial(d: Date): number {\r\n const epoch = Date.UTC(1899, 11, 30);\r\n const ms = Date.UTC(\r\n d.getFullYear(),\r\n d.getMonth(),\r\n d.getDate(),\r\n d.getHours(),\r\n d.getMinutes(),\r\n d.getSeconds(),\r\n d.getMilliseconds(),\r\n );\r\n return (ms - epoch) / 86400000;\r\n}\r\n\r\nfunction alignmentXml(a: NxeAlignment): string {\r\n const h = a.horizontal ? ` horizontal=\"${a.horizontal}\"` : '';\r\n const vMap = { top: 'top', middle: 'center', bottom: 'bottom' } as const;\r\n const v = a.vertical ? ` vertical=\"${vMap[a.vertical]}\"` : '';\r\n const i = a.indent != null && a.indent > 0 ? ` indent=\"${a.indent}\"` : '';\r\n return h || v || i ? `<alignment${h}${v}${i}/>` : '';\r\n}\r\n\r\n// ────────────────────────────────────────────────────────────────────────────\r\n// Style registry — de-duped numFmts / fonts / fills / cellXfs\r\n// ────────────────────────────────────────────────────────────────────────────\r\n\r\nclass StyleRegistry {\r\n private numFmts: string[] = [];\r\n private numFmtIndex = new Map<string, number>();\r\n private fonts: string[] = ['<font><sz val=\"11\"/><name val=\"Calibri Light\"/></font>'];\r\n private fontIndex = new Map<string, number>([['Calibri Light|false|11', 0]]);\r\n private fills: string[] = [\r\n '<fill><patternFill patternType=\"none\"/></fill>',\r\n '<fill><patternFill patternType=\"gray125\"/></fill>',\r\n ];\r\n private fillIndex = new Map<string, number>();\r\n private xfs: string[] = ['<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>'];\r\n private xfIndex = new Map<string, number>();\r\n\r\n private numFmtId(code: string): number {\r\n let id = this.numFmtIndex.get(code);\r\n if (id === undefined) {\r\n id = 164 + this.numFmts.length;\r\n this.numFmts.push(code);\r\n this.numFmtIndex.set(code, id);\r\n }\r\n return id;\r\n }\r\n\r\n private fontId(font: NxeFont): number {\r\n const name = font.name || 'Calibri Light';\r\n const bold = !!font.bold;\r\n const size = font.size || 11;\r\n const key = `${name}|${bold}|${size}`;\r\n let id = this.fontIndex.get(key);\r\n if (id === undefined) {\r\n id = this.fonts.length;\r\n this.fonts.push(`<font>${bold ? '<b/>' : ''}<sz val=\"${size}\"/><name val=\"${escapeAttr(name)}\"/></font>`);\r\n this.fontIndex.set(key, id);\r\n }\r\n return id;\r\n }\r\n\r\n private fillId(fill: NxeFill): number {\r\n const argb = fill.fgColor.argb;\r\n let id = this.fillIndex.get(argb);\r\n if (id === undefined) {\r\n id = this.fills.length;\r\n this.fills.push(`<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${escapeAttr(argb)}\"/></patternFill></fill>`);\r\n this.fillIndex.set(argb, id);\r\n }\r\n return id;\r\n }\r\n\r\n /** Resolve the 0-based cellXfs index for a cell's facets; 0 means \"all default\" (omit `s`). */\r\n cellStyle(cell: NxeCell): number {\r\n const numFmtId = cell.numFmt ? this.numFmtId(cell.numFmt) : 0;\r\n const fontId = cell.font ? this.fontId(cell.font) : 0;\r\n const fillId = cell.fill ? this.fillId(cell.fill) : 0;\r\n const align = cell.alignment ? alignmentXml(cell.alignment) : '';\r\n if (numFmtId === 0 && fontId === 0 && fillId === 0 && align === '') {\r\n return 0;\r\n }\r\n const key = `${numFmtId}|${fontId}|${fillId}|${align}`;\r\n let s = this.xfIndex.get(key);\r\n if (s === undefined) {\r\n s = this.xfs.length;\r\n const flags =\r\n (numFmtId !== 0 ? ' applyNumberFormat=\"1\"' : '') +\r\n (fontId !== 0 ? ' applyFont=\"1\"' : '') +\r\n (fillId !== 0 ? ' applyFill=\"1\"' : '') +\r\n (align !== '' ? ' applyAlignment=\"1\"' : '');\r\n this.xfs.push(`<xf numFmtId=\"${numFmtId}\" fontId=\"${fontId}\" fillId=\"${fillId}\" borderId=\"0\" xfId=\"0\"${flags}>${align}</xf>`);\r\n this.xfIndex.set(key, s);\r\n }\r\n return s;\r\n }\r\n\r\n toXml(): string {\r\n const numFmtsXml = this.numFmts.length\r\n ? `<numFmts count=\"${this.numFmts.length}\">${this.numFmts\r\n .map((code, i) => `<numFmt numFmtId=\"${164 + i}\" formatCode=\"${escapeAttr(code)}\"/>`)\r\n .join('')}</numFmts>`\r\n : '';\r\n return (\r\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\r\n `<styleSheet xmlns=\"${MAIN_NS}\">` +\r\n numFmtsXml +\r\n `<fonts count=\"${this.fonts.length}\">${this.fonts.join('')}</fonts>` +\r\n `<fills count=\"${this.fills.length}\">${this.fills.join('')}</fills>` +\r\n '<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' +\r\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\r\n `<cellXfs count=\"${this.xfs.length}\">${this.xfs.join('')}</cellXfs>` +\r\n '</styleSheet>'\r\n );\r\n }\r\n}\r\n\r\n// ────────────────────────────────────────────────────────────────────────────\r\n// Object model\r\n// ────────────────────────────────────────────────────────────────────────────\r\n\r\nexport class NxeCell {\r\n value: NxeCellValue = null;\r\n numFmt?: string;\r\n /** Default MUST be undefined (never a shared `{}`) — `formatExcel` reads `cell.font?.name`. */\r\n font?: NxeFont;\r\n fill?: NxeFill;\r\n alignment?: NxeAlignment;\r\n}\r\n\r\nexport class NxeRow {\r\n /** 1-based column → cell (only accessed columns exist). */\r\n private cells = new Map<number, NxeCell>();\r\n private _font?: NxeFont;\r\n\r\n /**\r\n * exceljs parity: setting `row.font` overwrites every existing cell's font and seeds cells\r\n * created later in this row. Each cell gets its own copy — `formatExcel`-style passes mutate\r\n * `cell.font` in place, so cells must not alias one object.\r\n */\r\n get font(): NxeFont | undefined {\r\n return this._font;\r\n }\r\n set font(f: NxeFont | undefined) {\r\n this._font = f;\r\n this.cells.forEach((cell) => {\r\n cell.font = f ? { ...f } : undefined;\r\n });\r\n }\r\n\r\n getCell(col: number): NxeCell {\r\n let c = this.cells.get(col);\r\n if (!c) {\r\n c = new NxeCell();\r\n if (this._font) {\r\n c.font = { ...this._font };\r\n }\r\n this.cells.set(col, c);\r\n }\r\n return c;\r\n }\r\n\r\n eachCell(cb: (cell: NxeCell, colNumber: number) => void): void {\r\n for (const col of [...this.cells.keys()].sort((a, b) => a - b)) {\r\n cb(this.cells.get(col)!, col);\r\n }\r\n }\r\n}\r\n\r\n/** Column facet (exceljs `Column` slice) — only `width` (Excel character units) is supported. */\r\nexport class NxeColumn {\r\n width?: number;\r\n\r\n constructor(readonly number: number) {}\r\n}\r\n\r\nexport class NxeWorksheet {\r\n name: string;\r\n autoFilter?: NxeAutoFilter;\r\n private rows = new Map<number, NxeRow>();\r\n private maxRow = 0;\r\n private merges: string[] = [];\r\n /** 1-based column → column facet (only accessed columns exist). */\r\n private colMap = new Map<number, NxeColumn>();\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n }\r\n\r\n /** Highest populated row (0 when empty) — `getCell` auto-extends past the `addRow` cursor. */\r\n get rowCount(): number {\r\n return this.maxRow;\r\n }\r\n\r\n private rowAt(r: number): NxeRow {\r\n let row = this.rows.get(r);\r\n if (!row) {\r\n row = new NxeRow();\r\n this.rows.set(r, row);\r\n }\r\n if (r > this.maxRow) {\r\n this.maxRow = r;\r\n }\r\n return row;\r\n }\r\n\r\n addRow(values: NxeCellValue[]): NxeRow {\r\n const row = this.rowAt(this.maxRow + 1);\r\n values.forEach((v, i) => {\r\n row.getCell(i + 1).value = v;\r\n });\r\n return row;\r\n }\r\n\r\n /** 1-based (row, col); auto-extends the sheet (the pivot exporter writes past the cursor). */\r\n getCell(row: number, col: number): NxeCell {\r\n return this.rowAt(row).getCell(col);\r\n }\r\n\r\n /** Lazily-created column facet, 1-based (exceljs `getColumn`); may point past the used range. */\r\n getColumn(n: number): NxeColumn {\r\n let c = this.colMap.get(n);\r\n if (!c) {\r\n c = new NxeColumn(n);\r\n this.colMap.set(n, c);\r\n }\r\n return c;\r\n }\r\n\r\n /** exceljs parity: one entry per column touched so far (via `addRow`/`getCell`/`getColumn`). */\r\n get columns(): NxeColumn[] {\r\n let max = 0;\r\n this.eachRow((row) => row.eachCell((_c, col) => (max = Math.max(max, col))));\r\n for (const n of this.colMap.keys()) {\r\n max = Math.max(max, n);\r\n }\r\n const out: NxeColumn[] = [];\r\n for (let n = 1; n <= max; n++) {\r\n out.push(this.getColumn(n));\r\n }\r\n return out;\r\n }\r\n\r\n mergeCells(r1: number, c1: number, r2: number, c2: number): void {\r\n this.merges.push(`${cellRef(r1, c1)}:${cellRef(r2, c2)}`);\r\n this.getCell(r1, c1); // ensure the anchor cell renders\r\n }\r\n\r\n eachRow(cb: (row: NxeRow, rowNumber: number) => void): void {\r\n for (const r of [...this.rows.keys()].sort((a, b) => a - b)) {\r\n cb(this.rows.get(r)!, r);\r\n }\r\n }\r\n\r\n /** @internal Serialize this sheet to its worksheet XML, registering styles as it goes. */\r\n toXml(styles: StyleRegistry): string {\r\n const rowsXml: string[] = [];\r\n this.eachRow((row, r) => {\r\n const cellsXml: string[] = [];\r\n row.eachCell((cell, c) => {\r\n const xml = buildCellXml(cell, r, c, styles);\r\n if (xml) {\r\n cellsXml.push(xml);\r\n }\r\n });\r\n if (cellsXml.length) {\r\n rowsXml.push(`<row r=\"${r}\">${cellsXml.join('')}</row>`);\r\n }\r\n });\r\n const sheetData = rowsXml.length ? `<sheetData>${rowsXml.join('')}</sheetData>` : '<sheetData/>';\r\n const af = this.autoFilter;\r\n const autoFilterXml = af\r\n ? `<autoFilter ref=\"${cellRef(af.from.row, af.from.column)}:${cellRef(af.to.row, af.to.column)}\"/>`\r\n : '';\r\n const mergeXml = this.merges.length\r\n ? `<mergeCells count=\"${this.merges.length}\">${this.merges.map((m) => `<mergeCell ref=\"${m}\"/>`).join('')}</mergeCells>`\r\n : '';\r\n const widthCols = [...this.colMap.values()]\r\n .filter((c) => c.width != null)\r\n .sort((a, b) => a.number - b.number);\r\n // Schema requires ≥1 <col> child — never emit an empty <cols/>.\r\n const colsXml = widthCols.length\r\n ? `<cols>${widthCols.map((c) => `<col min=\"${c.number}\" max=\"${c.number}\" width=\"${c.width}\" customWidth=\"1\"/>`).join('')}</cols>`\r\n : '';\r\n // Schema order: cols → sheetData → autoFilter → mergeCells (regardless of call order).\r\n return (\r\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\r\n `<worksheet xmlns=\"${MAIN_NS}\" xmlns:r=\"${REL_NS}\">` +\r\n colsXml +\r\n sheetData +\r\n autoFilterXml +\r\n mergeXml +\r\n '</worksheet>'\r\n );\r\n }\r\n}\r\n\r\nfunction buildCellXml(cell: NxeCell, r: number, c: number, styles: StyleRegistry): string {\r\n const ref = cellRef(r, c);\r\n const s = styles.cellStyle(cell);\r\n const sAttr = s !== 0 ? ` s=\"${s}\"` : '';\r\n const v = cell.value;\r\n\r\n if (typeof v === 'number' && isFinite(v)) {\r\n return `<c r=\"${ref}\"${sAttr}><v>${v}</v></c>`;\r\n }\r\n if (v instanceof Date && !isNaN(v.getTime())) {\r\n return `<c r=\"${ref}\"${sAttr}><v>${excelSerial(v)}</v></c>`;\r\n }\r\n if (v !== null && v !== undefined && v !== '') {\r\n const text = String(v);\r\n return `<c r=\"${ref}\"${sAttr} t=\"inlineStr\"><is><t${preserve(text)}>${escapeText(text)}</t></is></c>`;\r\n }\r\n // Empty value: emit only if it carries a non-default style; otherwise omit entirely.\r\n return s !== 0 ? `<c r=\"${ref}\"${sAttr}/>` : '';\r\n}\r\n\r\nexport class NxeWorkbook {\r\n worksheets: NxeWorksheet[] = [];\r\n\r\n /** Mirrors `workbook.xlsx.writeBuffer()` — resolves to the packed `.xlsx` bytes. */\r\n readonly xlsx = { writeBuffer: (): Promise<Uint8Array<ArrayBuffer>> => Promise.resolve(this.serialize()) };\r\n\r\n addWorksheet(name?: string): NxeWorksheet {\r\n const ws = new NxeWorksheet(name || `Sheet${this.worksheets.length + 1}`);\r\n this.worksheets.push(ws);\r\n return ws;\r\n }\r\n\r\n eachSheet(cb: (sheet: NxeWorksheet, id: number) => void): void {\r\n this.worksheets.forEach((ws, i) => cb(ws, i + 1));\r\n }\r\n\r\n /** Build the full OOXML package and pack it as a STORE ZIP. */\r\n serialize(): Uint8Array<ArrayBuffer> {\r\n const styles = new StyleRegistry();\r\n const sheetXmls = this.worksheets.map((ws) => ws.toXml(styles)); // registers styles\r\n const stylesXml = styles.toXml();\r\n const n = this.worksheets.length;\r\n\r\n const overrides = this.worksheets\r\n .map(\r\n (_, i) =>\r\n `<Override PartName=\"/xl/worksheets/sheet${i + 1}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`,\r\n )\r\n .join('');\r\n const contentTypes =\r\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\r\n `<Types xmlns=\"${CT_NS}\">` +\r\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\r\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>' +\r\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\r\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' +\r\n overrides +\r\n '</Types>';\r\n\r\n const rootRels =\r\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\r\n `<Relationships xmlns=\"${PKG_REL_NS}\">` +\r\n `<Relationship Id=\"rId1\" Type=\"${REL_NS}/officeDocument\" Target=\"xl/workbook.xml\"/>` +\r\n '</Relationships>';\r\n\r\n const sheetsXml = this.worksheets\r\n .map((ws, i) => `<sheet name=\"${escapeAttr(ws.name)}\" sheetId=\"${i + 1}\" r:id=\"rId${i + 1}\"/>`)\r\n .join('');\r\n const workbookXml =\r\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\r\n `<workbook xmlns=\"${MAIN_NS}\" xmlns:r=\"${REL_NS}\"><sheets>${sheetsXml}</sheets></workbook>`;\r\n\r\n const wsRels = this.worksheets\r\n .map(\r\n (_, i) =>\r\n `<Relationship Id=\"rId${i + 1}\" Type=\"${REL_NS}/worksheet\" Target=\"worksheets/sheet${i + 1}.xml\"/>`,\r\n )\r\n .join('');\r\n const workbookRels =\r\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\r\n `<Relationships xmlns=\"${PKG_REL_NS}\">` +\r\n wsRels +\r\n `<Relationship Id=\"rId${n + 1}\" Type=\"${REL_NS}/styles\" Target=\"styles.xml\"/>` +\r\n '</Relationships>';\r\n\r\n const enc = new TextEncoder();\r\n const part = (name: string, xml: string): ZipPart => ({ name, bytes: enc.encode(xml) });\r\n const parts: ZipPart[] = [\r\n part('[Content_Types].xml', contentTypes),\r\n part('_rels/.rels', rootRels),\r\n part('xl/workbook.xml', workbookXml),\r\n part('xl/_rels/workbook.xml.rels', workbookRels),\r\n part('xl/styles.xml', stylesXml),\r\n ...sheetXmls.map((xml, i) => part(`xl/worksheets/sheet${i + 1}.xml`, xml)),\r\n ];\r\n return writeZip(parts);\r\n }\r\n}\r\n\r\n/** exceljs-compatible aliases so existing call sites migrate by import path only. */\r\nexport { NxeWorkbook as Workbook };\r\nexport type Worksheet = NxeWorksheet;\r\n","/**\r\n * Zero-dependency, in-repo `.xlsx` reader — replaces SheetJS (`xlsx`), which was used in exactly one\r\n * place to read an uploaded workbook into a positional array-of-arrays. Modern `.xlsx` only (legacy\r\n * binary `.xls` is intentionally unsupported — guard with {@link isXlsxBytes} and reject upstream).\r\n *\r\n * Pipeline: {@link readCentralDirectory}/{@link readZipEntryText} (from {@link './nxe-zip'}) unzip the\r\n * needed OOXML parts, then the browser-native `DOMParser` reads `xl/workbook.xml` → first sheet,\r\n * `xl/_rels/workbook.xml.rels` → its path, optional `xl/sharedStrings.xml` → the string table, and\r\n * the sheet XML → cells. Output mirrors SheetJS `sheet_to_json(ws, { header: 1 })`: one array per\r\n * row, values placed at their column index (gaps filled with `''`), numbers kept as real numbers.\r\n */\r\nimport { readCentralDirectory, readZipEntryText, ZipEntry } from './nxe-zip';\r\n\r\n/** True when the bytes begin with the ZIP local-file-header magic (`PK\\x03\\x04`) — i.e. an `.xlsx`. */\r\nexport function isXlsxBytes(buf: Uint8Array): boolean {\r\n return buf.length >= 4 && buf[0] === 0x50 && buf[1] === 0x4b && buf[2] === 0x03 && buf[3] === 0x04;\r\n}\r\n\r\nfunction parseXml(text: string): Document {\r\n const doc = new DOMParser().parseFromString(text, 'application/xml');\r\n if (doc.getElementsByTagName('parsererror').length) {\r\n throw new Error('Malformed .xlsx (could not parse XML).');\r\n }\r\n return doc;\r\n}\r\n\r\n/** Read a namespaced attribute by its local name (e.g. the `r:id` on a `<sheet>`). */\r\nfunction attrByLocalName(el: Element, local: string): string | null {\r\n const direct = el.getAttribute(local) ?? el.getAttribute('r:' + local);\r\n if (direct != null) {\r\n return direct;\r\n }\r\n for (let i = 0; i < el.attributes.length; i++) {\r\n if (el.attributes[i].localName === local) {\r\n return el.attributes[i].value;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** A1 reference → 0-based { col, row }. */\r\nfunction refToColRow(ref: string): { col: number; row: number } {\r\n const m = /^([A-Z]+)(\\d+)$/.exec(ref);\r\n if (!m) {\r\n return { col: 0, row: 0 };\r\n }\r\n let col = 0;\r\n for (const ch of m[1]) {\r\n col = col * 26 + (ch.charCodeAt(0) - 64);\r\n }\r\n return { col: col - 1, row: Number(m[2]) - 1 };\r\n}\r\n\r\n/** Concatenate every descendant `<t>` text of a node (covers rich-text runs in shared strings). */\r\nfunction collectText(node: Element): string {\r\n const ts = node.getElementsByTagName('t');\r\n if (!ts.length) {\r\n return '';\r\n }\r\n let out = '';\r\n for (let i = 0; i < ts.length; i++) {\r\n out += ts[i].textContent ?? '';\r\n }\r\n return out;\r\n}\r\n\r\nfunction resolveFirstSheetPath(dir: Map<string, ZipEntry>, workbookXml: string, relsXml: string | null): string {\r\n const wb = parseXml(workbookXml);\r\n const sheets = wb.getElementsByTagName('sheet');\r\n const fallback = 'xl/worksheets/sheet1.xml';\r\n if (!sheets.length) {\r\n return fallback;\r\n }\r\n const rid = attrByLocalName(sheets[0], 'id');\r\n if (rid && relsXml) {\r\n const rels = parseXml(relsXml);\r\n const relationships = rels.getElementsByTagName('Relationship');\r\n for (let i = 0; i < relationships.length; i++) {\r\n if (relationships[i].getAttribute('Id') === rid) {\r\n let target = relationships[i].getAttribute('Target') || '';\r\n target = target.replace(/^\\//, '').replace(/^xl\\//, '');\r\n const full = 'xl/' + target.replace(/^\\.\\.\\//, '');\r\n return dir.has(full) ? full : fallback;\r\n }\r\n }\r\n }\r\n return dir.has(fallback) ? fallback : [...dir.keys()].find((k) => /^xl\\/worksheets\\/.+\\.xml$/.test(k)) || fallback;\r\n}\r\n\r\n/**\r\n * Read the FIRST worksheet of an `.xlsx` into a dense, positional array-of-arrays (matching SheetJS\r\n * `sheet_to_json(ws, { header: 1 })`). Numeric cells are returned as numbers; string cells as\r\n * strings; missing leading/intermediate cells as `''`.\r\n */\r\nexport async function readXlsxFirstSheet(input: ArrayBuffer | Uint8Array): Promise<(string | number)[][]> {\r\n const buf = input instanceof Uint8Array ? input : new Uint8Array(input);\r\n if (!isXlsxBytes(buf)) {\r\n throw new Error('Not an .xlsx file.');\r\n }\r\n\r\n const dir = readCentralDirectory(buf);\r\n const get = async (name: string): Promise<string | null> => {\r\n const entry = dir.get(name);\r\n return entry ? readZipEntryText(buf, entry) : null;\r\n };\r\n\r\n const workbookXml = await get('xl/workbook.xml');\r\n if (!workbookXml) {\r\n throw new Error('Invalid .xlsx (missing xl/workbook.xml).');\r\n }\r\n const relsXml = await get('xl/_rels/workbook.xml.rels');\r\n const sheetPath = resolveFirstSheetPath(dir, workbookXml, relsXml);\r\n\r\n // Shared strings (optional).\r\n const sharedStrings: string[] = [];\r\n const sharedXml = await get('xl/sharedStrings.xml');\r\n if (sharedXml) {\r\n const si = parseXml(sharedXml).getElementsByTagName('si');\r\n for (let i = 0; i < si.length; i++) {\r\n sharedStrings.push(collectText(si[i]));\r\n }\r\n }\r\n\r\n const sheetXml = await get(sheetPath);\r\n if (!sheetXml) {\r\n throw new Error('Invalid .xlsx (missing worksheet part).');\r\n }\r\n\r\n const result: (string | number)[][] = [];\r\n const rows = parseXml(sheetXml).getElementsByTagName('row');\r\n let runningRow = 0;\r\n for (let i = 0; i < rows.length; i++) {\r\n const rowEl = rows[i];\r\n const rAttr = rowEl.getAttribute('r');\r\n const rowIdx = rAttr ? Number(rAttr) - 1 : runningRow;\r\n runningRow = rowIdx + 1;\r\n\r\n const out: (string | number)[] = [];\r\n const cells = rowEl.getElementsByTagName('c');\r\n let runningCol = 0;\r\n for (let j = 0; j < cells.length; j++) {\r\n const cell = cells[j];\r\n const ref = cell.getAttribute('r');\r\n const colIdx = ref ? refToColRow(ref).col : runningCol;\r\n runningCol = colIdx + 1;\r\n\r\n const t = cell.getAttribute('t');\r\n let value: string | number = '';\r\n if (t === 's') {\r\n const v = cell.getElementsByTagName('v')[0];\r\n value = v ? sharedStrings[Number(v.textContent)] ?? '' : '';\r\n } else if (t === 'inlineStr') {\r\n const is = cell.getElementsByTagName('is')[0];\r\n value = is ? collectText(is) : '';\r\n } else if (t === 'str') {\r\n const v = cell.getElementsByTagName('v')[0];\r\n value = v ? v.textContent ?? '' : '';\r\n } else {\r\n // number / boolean / default\r\n const v = cell.getElementsByTagName('v')[0];\r\n value = v && v.textContent !== '' ? Number(v.textContent) : '';\r\n }\r\n\r\n for (let k = out.length; k < colIdx; k++) {\r\n out[k] = '';\r\n }\r\n out[colIdx] = value;\r\n }\r\n result[rowIdx] = out;\r\n }\r\n\r\n // Fill any skipped rows so the array is dense (positional), like SheetJS header:1.\r\n for (let i = 0; i < result.length; i++) {\r\n if (!result[i]) {\r\n result[i] = [];\r\n }\r\n }\r\n return result;\r\n}\r\n","/**\r\n * Tiny in-repo replacement for `file-saver-es`'s `saveAs`. Triggers a browser download of a Blob by\r\n * clicking a synthetic anchor with an object URL, then revoking it. Callers keep building their own\r\n * Blob (so the MIME type is preserved).\r\n */\r\nexport function nxeSaveAs(blob: Blob, fileName: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.style.display = 'none';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n setTimeout(() => URL.revokeObjectURL(url), 0);\r\n}\r\n","// @nexterajs/ui/excel — public API.\r\nexport * from './lib/excel/nxe-xlsx-types';\r\nexport * from './lib/excel/nxe-xlsx-writer';\r\nexport * from './lib/excel/nxe-xlsx-reader';\r\nexport * from './lib/excel/nxe-save';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"AAAA;;;;AAIG;;ACJH;;;;;;;;;;;;AAYG;AAEH,MAAM,SAAS,GAAG,UAAU;AAC5B,MAAM,WAAW,GAAG,UAAU;AAC9B,MAAM,QAAQ,GAAG,UAAU;AAE3B;AACA,MAAM,QAAQ,GAAG,MAAM;AACvB,MAAM,QAAQ,GAAG,MAAM;AAEvB;AACA;AACA;AAEA,IAAI,SAAS,GAAuB,IAAI;AAExC,SAAS,QAAQ,GAAA;IACb,IAAI,SAAS,EAAE;AACX,QAAA,OAAO,SAAS;IACpB;AACA,IAAA,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC;AAC9B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QAChD;AACA,QAAA,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IAClB;AACA,IAAA,QAAQ,SAAS,GAAG,CAAC;AACzB;AAEA;AACM,SAAU,KAAK,CAAC,KAAiB,EAAA;AACnC,IAAA,MAAM,CAAC,GAAG,QAAQ,EAAE;IACpB,IAAI,CAAC,GAAG,UAAU;AAClB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C;AACA,IAAA,OAAO,CAAC,CAAC,GAAG,UAAU,MAAM,CAAC;AACjC;AAYA;;;;AAIG;AACG,SAAU,QAAQ,CAAC,KAAgB,EAAA;AACrC,IAAA,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;QAC5B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,QAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;AAC5D,IAAA,CAAC,CAAC;IAEF,IAAI,SAAS,GAAG,CAAC;IACjB,IAAI,WAAW,GAAG,CAAC;AACnB,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACrB,QAAA,SAAS,IAAI,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM;QACpD,WAAW,IAAI,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM;IAC1C;AAEA,IAAA,MAAM,KAAK,GAAG,SAAS,GAAG,WAAW,GAAG,EAAE;AAC1C,IAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC;IACd,MAAM,YAAY,GAAa,EAAE;;AAGjC,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACrB,QAAA,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,EAAE;QACZ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;AAC5B,QAAA,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM;QAC5B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;AACvB,QAAA,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM;IAC3B;;IAGA,MAAM,YAAY,GAAG,MAAM;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QACrB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,EAAE;QACZ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;AAC5B,QAAA,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM;AAChC,IAAA,CAAC,CAAC;;IAGF,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC;AACtC,IAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACpC,IAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACpC,IAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,IAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC;IAC9C,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC;AAC/C,IAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAErC,IAAA,OAAO,GAAG;AACd;AAeA;;;;AAIG;AACG,SAAU,oBAAoB,CAAC,GAAe,EAAA;AAChD,IAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC;AACrE,IAAA,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC;;AAGpC,IAAA,IAAI,IAAI,GAAG,CAAC,CAAC;AACb,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC;AACnD,IAAA,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,QAAQ,EAAE;YACtC,IAAI,GAAG,CAAC;YACR;QACJ;IACJ;AACA,IAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACV,QAAA,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC;IACvF;AAEA,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC;AAClD,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC;IAChD,IAAI,UAAU,KAAK,MAAM,IAAI,QAAQ,KAAK,UAAU,EAAE;AAClD,QAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC;IAC1E;AAEA,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB;IACvC,IAAI,CAAC,GAAG,QAAQ;AAChB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACjC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,WAAW,EAAE;YACzC;QACJ;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;AAC3C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;AAC7C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;AAC/C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;AAC5C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;AAC7C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;AAC/C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;QAChD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;AAC/D,QAAA,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAClE,CAAC,IAAI,EAAE,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU;IAC7C;AACA,IAAA,OAAO,GAAG;AACd;AAEA;AACA,eAAe,UAAU,CAAC,KAAiB,EAAA;;AAEvC,IAAA,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,IAAI,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;AACpD,IAAA,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC;AAC9B;AAEA;AACA,SAAS,eAAe,CAAC,GAAe,EAAE,IAAc,EAAE,WAAmB,EAAA;IACzE,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,SAAS,EAAE;AACjD,QAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;IAC3D;AACA,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,EAAE,EAAE,IAAI,CAAC;AACtD,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,EAAE,EAAE,IAAI,CAAC;AACvD,IAAA,OAAO,WAAW,GAAG,EAAE,GAAG,OAAO,GAAG,QAAQ;AAChD;AAEA;AACO,eAAe,iBAAiB,CAAC,GAAe,EAAE,KAAe,EAAA;AACpE,IAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC;AACrE,IAAA,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC;AAC3D,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;AACxD,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACvB;AACA,IAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC;IAC3B;IACA,MAAM,IAAI,KAAK,CAAC,CAAA,mCAAA,EAAsC,KAAK,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;AAC1E;AAEA;AACO,eAAe,gBAAgB,CAAC,GAAe,EAAE,KAAe,EAAA;AACnE,IAAA,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/E;;ACjOA,MAAM,OAAO,GAAG,2DAA2D;AAC3E,MAAM,MAAM,GAAG,qEAAqE;AACpF,MAAM,UAAU,GAAG,8DAA8D;AACjF,MAAM,KAAK,GAAG,8DAA8D;AAE5E;AACA;AACA;AAEA;AACM,SAAU,SAAS,CAAC,CAAS,EAAA;IAC/B,IAAI,CAAC,GAAG,EAAE;AACV,IAAA,OAAO,CAAC,GAAG,CAAC,EAAE;QACV,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QACtB,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;AACnC,QAAA,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAChC;AACA,IAAA,OAAO,CAAC;AACZ;AAEA;AACA,SAAS,OAAO,CAAC,GAAW,EAAE,GAAW,EAAA;AACrC,IAAA,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG;AAC/B;AAEA;AACA,SAAS,UAAU,CAAC,CAAS,EAAA;AACzB,IAAA,OAAO;AACF,SAAA,OAAO,CAAC,+BAA+B,EAAE,EAAE;AAC3C,SAAA,OAAO,CAAC,IAAI,EAAE,OAAO;AACrB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AAC9B;AAEA;AACA,SAAS,UAAU,CAAC,CAAS,EAAA;IACzB,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;AAChD;AAEA;AACA,SAAS,QAAQ,CAAC,CAAS,EAAA;AACvB,IAAA,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,uBAAuB,GAAG,EAAE;AAC3D;AAEA;;;;AAIG;AACH,SAAS,WAAW,CAAC,CAAO,EAAA;AACxB,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;AACpC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CACf,CAAC,CAAC,WAAW,EAAE,EACf,CAAC,CAAC,QAAQ,EAAE,EACZ,CAAC,CAAC,OAAO,EAAE,EACX,CAAC,CAAC,QAAQ,EAAE,EACZ,CAAC,CAAC,UAAU,EAAE,EACd,CAAC,CAAC,UAAU,EAAE,EACd,CAAC,CAAC,eAAe,EAAE,CACtB;AACD,IAAA,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,QAAQ;AAClC;AAEA,SAAS,YAAY,CAAC,CAAe,EAAA;AACjC,IAAA,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAA,aAAA,EAAgB,CAAC,CAAC,UAAU,CAAA,CAAA,CAAG,GAAG,EAAE;AAC7D,IAAA,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAW;IACxE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAA,WAAA,EAAc,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE;IAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,SAAA,EAAY,CAAC,CAAC,MAAM,CAAA,CAAA,CAAG,GAAG,EAAE;AACzE,IAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA,UAAA,EAAa,CAAC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA,EAAA,CAAI,GAAG,EAAE;AACxD;AAEA;AACA;AACA;AAEA,MAAM,aAAa,CAAA;IACP,OAAO,GAAa,EAAE;AACtB,IAAA,WAAW,GAAG,IAAI,GAAG,EAAkB;AACvC,IAAA,KAAK,GAAa,CAAC,wDAAwD,CAAC;AAC5E,IAAA,SAAS,GAAG,IAAI,GAAG,CAAiB,CAAC,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,IAAA,KAAK,GAAa;QACtB,gDAAgD;QAChD,mDAAmD;KACtD;AACO,IAAA,SAAS,GAAG,IAAI,GAAG,EAAkB;AACrC,IAAA,GAAG,GAAa,CAAC,gEAAgE,CAAC;AAClF,IAAA,OAAO,GAAG,IAAI,GAAG,EAAkB;AAEnC,IAAA,QAAQ,CAAC,IAAY,EAAA;QACzB,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,EAAE,KAAK,SAAS,EAAE;YAClB,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;AAC9B,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC;AACA,QAAA,OAAO,EAAE;IACb;AAEQ,IAAA,MAAM,CAAC,IAAa,EAAA;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,eAAe;AACzC,QAAA,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE;QAC5B,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;QACrC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAChC,QAAA,IAAI,EAAE,KAAK,SAAS,EAAE;AAClB,YAAA,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;YACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,MAAM,GAAG,EAAE,CAAA,SAAA,EAAY,IAAI,CAAA,cAAA,EAAiB,UAAU,CAAC,IAAI,CAAC,CAAA,UAAA,CAAY,CAAC;YACzG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;QAC/B;AACA,QAAA,OAAO,EAAE;IACb;AAEQ,IAAA,MAAM,CAAC,IAAa,EAAA;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI;QAC9B,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,EAAE,KAAK,SAAS,EAAE;AAClB,YAAA,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA,qDAAA,EAAwD,UAAU,CAAC,IAAI,CAAC,CAAA,wBAAA,CAA0B,CAAC;YACnH,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC;AACA,QAAA,OAAO,EAAE;IACb;;AAGA,IAAA,SAAS,CAAC,IAAa,EAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACrD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;AAChE,QAAA,IAAI,QAAQ,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,EAAE;AAChE,YAAA,OAAO,CAAC;QACZ;QACA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;QACtD,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,SAAS,EAAE;AACjB,YAAA,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM;AACnB,YAAA,MAAM,KAAK,GACP,CAAC,QAAQ,KAAK,CAAC,GAAG,wBAAwB,GAAG,EAAE;iBAC9C,MAAM,KAAK,CAAC,GAAG,gBAAgB,GAAG,EAAE,CAAC;iBACrC,MAAM,KAAK,CAAC,GAAG,gBAAgB,GAAG,EAAE,CAAC;AACtC,iBAAC,KAAK,KAAK,EAAE,GAAG,qBAAqB,GAAG,EAAE,CAAC;AAC/C,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAA,UAAA,EAAa,MAAM,CAAA,UAAA,EAAa,MAAM,CAAA,uBAAA,EAA0B,KAAK,IAAI,KAAK,CAAA,KAAA,CAAO,CAAC;YAC7H,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5B;AACA,QAAA,OAAO,CAAC;IACZ;IAEA,KAAK,GAAA;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;cAC1B,CAAA,gBAAA,EAAmB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA,EAAA,EAAK,IAAI,CAAC;AAC3C,iBAAA,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA,kBAAA,EAAqB,GAAG,GAAG,CAAC,CAAA,cAAA,EAAiB,UAAU,CAAC,IAAI,CAAC,KAAK;iBACnF,IAAI,CAAC,EAAE,CAAC,CAAA,UAAA;cACb,EAAE;AACR,QAAA,QACI,yDAAyD;AACzD,YAAA,CAAA,mBAAA,EAAsB,OAAO,CAAA,EAAA,CAAI;YACjC,UAAU;AACV,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,QAAA,CAAU;AACpE,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,QAAA,CAAU;YACpE,yFAAyF;YACzF,8FAA8F;AAC9F,YAAA,CAAA,gBAAA,EAAmB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAA,EAAA,EAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,UAAA,CAAY;AACpE,YAAA,eAAe;IAEvB;AACH;AAED;AACA;AACA;MAEa,OAAO,CAAA;IAChB,KAAK,GAAiB,IAAI;AAC1B,IAAA,MAAM;;AAEN,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,SAAS;AACZ;MAEY,MAAM,CAAA;;AAEP,IAAA,KAAK,GAAG,IAAI,GAAG,EAAmB;AAClC,IAAA,KAAK;AAEb;;;;AAIG;AACH,IAAA,IAAI,IAAI,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK;IACrB;IACA,IAAI,IAAI,CAAC,CAAsB,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACxB,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,SAAS;AACxC,QAAA,CAAC,CAAC;IACN;AAEA,IAAA,OAAO,CAAC,GAAW,EAAA;QACf,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC,CAAC,EAAE;AACJ,YAAA,CAAC,GAAG,IAAI,OAAO,EAAE;AACjB,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE;gBACZ,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;YAC9B;YACA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B;AACA,QAAA,OAAO,CAAC;IACZ;AAEA,IAAA,QAAQ,CAAC,EAA8C,EAAA;QACnD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;AAC5D,YAAA,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,EAAE,GAAG,CAAC;QACjC;IACJ;AACH;AAED;MACa,SAAS,CAAA;AAGG,IAAA,MAAA;AAFrB,IAAA,KAAK;AAEL,IAAA,WAAA,CAAqB,MAAc,EAAA;QAAd,IAAA,CAAA,MAAM,GAAN,MAAM;IAAW;AACzC;MAEY,YAAY,CAAA;AACrB,IAAA,IAAI;AACJ,IAAA,UAAU;AACF,IAAA,IAAI,GAAG,IAAI,GAAG,EAAkB;IAChC,MAAM,GAAG,CAAC;IACV,MAAM,GAAa,EAAE;;AAErB,IAAA,MAAM,GAAG,IAAI,GAAG,EAAqB;AAE7C,IAAA,WAAA,CAAY,IAAY,EAAA;AACpB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;IACpB;;AAGA,IAAA,IAAI,QAAQ,GAAA;QACR,OAAO,IAAI,CAAC,MAAM;IACtB;AAEQ,IAAA,KAAK,CAAC,CAAS,EAAA;QACnB,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE;AACN,YAAA,GAAG,GAAG,IAAI,MAAM,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;QACzB;AACA,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACjB,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC;QACnB;AACA,QAAA,OAAO,GAAG;IACd;AAEA,IAAA,MAAM,CAAC,MAAsB,EAAA;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACpB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;AAChC,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,GAAG;IACd;;IAGA,OAAO,CAAC,GAAW,EAAE,GAAW,EAAA;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACvC;;AAGA,IAAA,SAAS,CAAC,CAAS,EAAA;QACf,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,EAAE;AACJ,YAAA,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB;AACA,QAAA,OAAO,CAAC;IACZ;;AAGA,IAAA,IAAI,OAAO,GAAA;QACP,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;YAChC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B;QACA,MAAM,GAAG,GAAgB,EAAE;AAC3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/B;AACA,QAAA,OAAO,GAAG;IACd;AAEA,IAAA,UAAU,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAA;QACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA,CAAE,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzB;AAEA,IAAA,OAAO,CAAC,EAA4C,EAAA;QAChD,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;AACzD,YAAA,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;QAC5B;IACJ;;AAGA,IAAA,KAAK,CAAC,MAAqB,EAAA;QACvB,MAAM,OAAO,GAAa,EAAE;QAC5B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;YACpB,MAAM,QAAQ,GAAa,EAAE;YAC7B,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AACrB,gBAAA,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;gBAC5C,IAAI,GAAG,EAAE;AACL,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;gBACtB;AACJ,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;AACjB,gBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,MAAA,CAAQ,CAAC;YAC5D;AACJ,QAAA,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAA,WAAA,EAAc,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,YAAA,CAAc,GAAG,cAAc;AAChG,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU;QAC1B,MAAM,aAAa,GAAG;AAClB,cAAE,CAAA,iBAAA,EAAoB,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA,GAAA;cAC5F,EAAE;AACR,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;AACzB,cAAE,CAAA,mBAAA,EAAsB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,gBAAA,EAAmB,CAAC,CAAA,GAAA,CAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,aAAA;cACvG,EAAE;QACR,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;aACrC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,IAAI;AAC7B,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;;AAExC,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC;AACtB,cAAE,CAAA,MAAA,EAAS,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,UAAA,EAAa,CAAC,CAAC,MAAM,CAAA,OAAA,EAAU,CAAC,CAAC,MAAM,CAAA,SAAA,EAAY,CAAC,CAAC,KAAK,CAAA,mBAAA,CAAqB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,OAAA;cACvH,EAAE;;AAER,QAAA,QACI,yDAAyD;YACzD,CAAA,kBAAA,EAAqB,OAAO,CAAA,WAAA,EAAc,MAAM,CAAA,EAAA,CAAI;YACpD,OAAO;YACP,SAAS;YACT,aAAa;YACb,QAAQ;AACR,YAAA,cAAc;IAEtB;AACH;AAED,SAAS,YAAY,CAAC,IAAa,EAAE,CAAS,EAAE,CAAS,EAAE,MAAqB,EAAA;IAC5E,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;AAChC,IAAA,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE;AACxC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;IAEpB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;AACtC,QAAA,OAAO,SAAS,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,IAAA,EAAO,CAAC,UAAU;IAClD;AACA,IAAA,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE;QAC1C,OAAO,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,IAAA,EAAO,WAAW,CAAC,CAAC,CAAC,CAAA,QAAA,CAAU;IAC/D;AACA,IAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,EAAE;AAC3C,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AACtB,QAAA,OAAO,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,KAAK,wBAAwB,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,eAAe;IACzG;;AAEA,IAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,CAAI,GAAG,EAAE;AACnD;MAEa,WAAW,CAAA;IACpB,UAAU,GAAmB,EAAE;;AAGtB,IAAA,IAAI,GAAG,EAAE,WAAW,EAAE,MAAwC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE;AAE1G,IAAA,YAAY,CAAC,IAAa,EAAA;AACtB,QAAA,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA,CAAE,CAAC;AACzE,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACxB,QAAA,OAAO,EAAE;IACb;AAEA,IAAA,SAAS,CAAC,EAA6C,EAAA;QACnD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD;;IAGA,SAAS,GAAA;AACL,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AAEhC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC;AAClB,aAAA,GAAG,CACA,CAAC,CAAC,EAAE,CAAC,KACD,CAAA,wCAAA,EAA2C,CAAC,GAAG,CAAC,iGAAiG;aAExJ,IAAI,CAAC,EAAE,CAAC;QACb,MAAM,YAAY,GACd,yDAAyD;AACzD,YAAA,CAAA,cAAA,EAAiB,KAAK,CAAA,EAAA,CAAI;YAC1B,oGAAoG;YACpG,0DAA0D;YAC1D,kIAAkI;YAClI,4HAA4H;YAC5H,SAAS;AACT,YAAA,UAAU;QAEd,MAAM,QAAQ,GACV,yDAAyD;AACzD,YAAA,CAAA,sBAAA,EAAyB,UAAU,CAAA,EAAA,CAAI;AACvC,YAAA,CAAA,8BAAA,EAAiC,MAAM,CAAA,2CAAA,CAA6C;AACpF,YAAA,kBAAkB;AAEtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC;aAClB,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAA,aAAA,EAAgB,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,GAAA,CAAK;aAC7F,IAAI,CAAC,EAAE,CAAC;QACb,MAAM,WAAW,GACb,yDAAyD;AACzD,YAAA,CAAA,iBAAA,EAAoB,OAAO,CAAA,WAAA,EAAc,MAAM,CAAA,UAAA,EAAa,SAAS,sBAAsB;AAE/F,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC;AACf,aAAA,GAAG,CACA,CAAC,CAAC,EAAE,CAAC,KACD,CAAA,qBAAA,EAAwB,CAAC,GAAG,CAAC,WAAW,MAAM,CAAA,oCAAA,EAAuC,CAAC,GAAG,CAAC,SAAS;aAE1G,IAAI,CAAC,EAAE,CAAC;QACb,MAAM,YAAY,GACd,yDAAyD;AACzD,YAAA,CAAA,sBAAA,EAAyB,UAAU,CAAA,EAAA,CAAI;YACvC,MAAM;AACN,YAAA,CAAA,qBAAA,EAAwB,CAAC,GAAG,CAAC,CAAA,QAAA,EAAW,MAAM,CAAA,8BAAA,CAAgC;AAC9E,YAAA,kBAAkB;AAEtB,QAAA,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE;QAC7B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,GAAW,MAAe,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACvF,QAAA,MAAM,KAAK,GAAc;AACrB,YAAA,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC;AACzC,YAAA,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC;AAC7B,YAAA,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC;AACpC,YAAA,IAAI,CAAC,4BAA4B,EAAE,YAAY,CAAC;AAChD,YAAA,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;YAChC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAA,IAAA,CAAM,EAAE,GAAG,CAAC,CAAC;SAC7E;AACD,QAAA,OAAO,QAAQ,CAAC,KAAK,CAAC;IAC1B;AACH;;AC/cD;;;;;;;;;;AAUG;AAGH;AACM,SAAU,WAAW,CAAC,GAAe,EAAA;AACvC,IAAA,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI;AACtG;AAEA,SAAS,QAAQ,CAAC,IAAY,EAAA;AAC1B,IAAA,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACpE,IAAI,GAAG,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE;AAChD,QAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;IAC7D;AACA,IAAA,OAAO,GAAG;AACd;AAEA;AACA,SAAS,eAAe,CAAC,EAAW,EAAE,KAAa,EAAA;AAC/C,IAAA,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,KAAK,CAAC;AACtE,IAAA,IAAI,MAAM,IAAI,IAAI,EAAE;AAChB,QAAA,OAAO,MAAM;IACjB;AACA,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,EAAE;YACtC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;QACjC;IACJ;AACA,IAAA,OAAO,IAAI;AACf;AAEA;AACA,SAAS,WAAW,CAAC,GAAW,EAAA;IAC5B,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;IACrC,IAAI,CAAC,CAAC,EAAE;QACJ,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IAC7B;IACA,IAAI,GAAG,GAAG,CAAC;IACX,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;AACnB,QAAA,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC5C;AACA,IAAA,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AAClD;AAEA;AACA,SAAS,WAAW,CAAC,IAAa,EAAA;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;AACzC,IAAA,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;AACZ,QAAA,OAAO,EAAE;IACb;IACA,IAAI,GAAG,GAAG,EAAE;AACZ,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAChC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE;IAClC;AACA,IAAA,OAAO,GAAG;AACd;AAEA,SAAS,qBAAqB,CAAC,GAA0B,EAAE,WAAmB,EAAE,OAAsB,EAAA;AAClG,IAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC;IAChC,MAAM,MAAM,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC;IAC/C,MAAM,QAAQ,GAAG,0BAA0B;AAC3C,IAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAChB,QAAA,OAAO,QAAQ;IACnB;IACA,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AAC5C,IAAA,IAAI,GAAG,IAAI,OAAO,EAAE;AAChB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;AAC/D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAA,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE;AAC7C,gBAAA,IAAI,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE;AAC1D,gBAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;AACvD,gBAAA,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AAClD,gBAAA,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,QAAQ;YAC1C;QACJ;IACJ;AACA,IAAA,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ;AACtH;AAEA;;;;AAIG;AACI,eAAe,kBAAkB,CAAC,KAA+B,EAAA;AACpE,IAAA,MAAM,GAAG,GAAG,KAAK,YAAY,UAAU,GAAG,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;AACvE,IAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;AACnB,QAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC;IACzC;AAEA,IAAA,MAAM,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC;AACrC,IAAA,MAAM,GAAG,GAAG,OAAO,IAAY,KAA4B;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,OAAO,KAAK,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI;AACtD,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC;IAChD,IAAI,CAAC,WAAW,EAAE;AACd,QAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC;IAC/D;AACA,IAAA,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,4BAA4B,CAAC;IACvD,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC;;IAGlE,MAAM,aAAa,GAAa,EAAE;AAClC,IAAA,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAAC;IACnD,IAAI,SAAS,EAAE;QACX,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC;AACzD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAChC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C;IACJ;AAEA,IAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE;AACX,QAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;IAC9D;IAEA,MAAM,MAAM,GAA0B,EAAE;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAC3D,IAAI,UAAU,GAAG,CAAC;AAClB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;AACrC,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU;AACrD,QAAA,UAAU,GAAG,MAAM,GAAG,CAAC;QAEvB,MAAM,GAAG,GAAwB,EAAE;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAC7C,IAAI,UAAU,GAAG,CAAC;AAClB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AAClC,YAAA,MAAM,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,UAAU;AACtD,YAAA,UAAU,GAAG,MAAM,GAAG,CAAC;YAEvB,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;YAChC,IAAI,KAAK,GAAoB,EAAE;AAC/B,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;gBACX,MAAM,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3C,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE;YAC/D;AAAO,iBAAA,IAAI,CAAC,KAAK,WAAW,EAAE;gBAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7C,gBAAA,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE;YACrC;AAAO,iBAAA,IAAI,CAAC,KAAK,KAAK,EAAE;gBACpB,MAAM,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3C,gBAAA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE,GAAG,EAAE;YACxC;iBAAO;;gBAEH,MAAM,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3C,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;YAClE;AAEA,YAAA,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,gBAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;YACf;AACA,YAAA,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK;QACvB;AACA,QAAA,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG;IACxB;;AAGA,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;AACZ,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE;QAClB;IACJ;AACA,IAAA,OAAO,MAAM;AACjB;;AClLA;;;;AAIG;AACG,SAAU,SAAS,CAAC,IAAU,EAAE,QAAgB,EAAA;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;IACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,IAAA,CAAC,CAAC,IAAI,GAAG,GAAG;AACZ,IAAA,CAAC,CAAC,QAAQ,GAAG,QAAQ;AACrB,IAAA,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AACxB,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,KAAK,EAAE;AACT,IAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5B,IAAA,UAAU,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjD;;ACfA;;ACAA;;AAEG;;"}
@@ -0,0 +1,125 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, viewChild, signal, forwardRef, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';
4
+
5
+ /**
6
+ * `nxe-file-uploader` — drop-in replacement for DevExtreme `dx-file-uploader`.
7
+ *
8
+ * Both usages run `uploadMode="useForm"` (the widget never POSTs — the picked File is read by the
9
+ * parent and appended to a FormData) and bind the NATIVE `(change)` event, reading
10
+ * `$event.target.files[0]`. So this re-emits the inner `<input type=file>` change event verbatim
11
+ * via a `change` output, preserving `$event.target.files[0]`. Drag-drop assigns the dropped
12
+ * files to the hidden input and dispatches a change, keeping the same contract. Provides
13
+ * {@link NXE_VALIDATION_TARGET} (value = the selected File) so a nested `nxe-validator`'s
14
+ * `required` rule works — invalid while no file is chosen.
15
+ */
16
+ class NxeFileUploaderComponent {
17
+ allowCanceling = input(false, /* @ts-ignore */
18
+ ...(ngDevMode ? [{ debugName: "allowCanceling" }] : /* istanbul ignore next */ []));
19
+ accept = input('*', /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
21
+ labelText = input('or Drop here', /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "labelText" }] : /* istanbul ignore next */ []));
23
+ selectButtonText = input('Select File', /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "selectButtonText" }] : /* istanbul ignore next */ []));
25
+ /** Accepted for parity; only `useForm` is used (no server upload by the widget). */
26
+ uploadMode = input('useForm', /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "uploadMode" }] : /* istanbul ignore next */ []));
28
+ multiple = input(false, /* @ts-ignore */
29
+ ...(ngDevMode ? [{ debugName: "multiple" }] : /* istanbul ignore next */ []));
30
+ name = input('files[]', /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
32
+ /** Group for a nested nxe-validator (none used today → bare default group). */
33
+ validationGroupInput = input(undefined, { ...(ngDevMode ? { debugName: "validationGroupInput" } : /* istanbul ignore next */ {}), alias: 'validationGroup' });
34
+ /** Re-emits the native `<input type=file>` change so `$event.target.files[0]` keeps working. */
35
+ change = output();
36
+ fileInput = viewChild.required('fileInput', /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "fileInput" }] : /* istanbul ignore next */ []));
38
+ file = signal(null, /* @ts-ignore */
39
+ ...(ngDevMode ? [{ debugName: "file" }] : /* istanbul ignore next */ []));
40
+ dragOver = signal(false, /* @ts-ignore */
41
+ ...(ngDevMode ? [{ debugName: "dragOver" }] : /* istanbul ignore next */ []));
42
+ focused = signal(false, /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "focused" }] : /* istanbul ignore next */ []));
44
+ validationError = signal(null, /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "validationError" }] : /* istanbul ignore next */ []));
46
+ // --- NXE_VALIDATION_TARGET -------------------------------------------------------------
47
+ getValue() {
48
+ return this.file();
49
+ }
50
+ validationGroup() {
51
+ return this.validationGroupInput();
52
+ }
53
+ setValidationError(message) {
54
+ this.validationError.set(message);
55
+ }
56
+ browse() {
57
+ this.fileInput().nativeElement.click();
58
+ }
59
+ onNativeChange(event) {
60
+ const input = event.target;
61
+ this.file.set(input.files?.[0] ?? null);
62
+ this.change.emit(event);
63
+ }
64
+ cancel() {
65
+ const input = this.fileInput().nativeElement;
66
+ input.value = '';
67
+ // Re-runs onNativeChange (now with empty files) so the bound form control clears too.
68
+ input.dispatchEvent(new Event('change'));
69
+ }
70
+ onDragOver(event) {
71
+ event.preventDefault();
72
+ this.dragOver.set(true);
73
+ }
74
+ onDragLeave() {
75
+ this.dragOver.set(false);
76
+ }
77
+ onDrop(event) {
78
+ event.preventDefault();
79
+ this.dragOver.set(false);
80
+ const files = event.dataTransfer?.files;
81
+ if (files && files.length) {
82
+ const input = this.fileInput().nativeElement;
83
+ input.files = files;
84
+ input.dispatchEvent(new Event('change'));
85
+ }
86
+ }
87
+ formatSize(bytes) {
88
+ if (bytes < 1024) {
89
+ return `${bytes} b`;
90
+ }
91
+ if (bytes < 1024 * 1024) {
92
+ return `${(bytes / 1024).toFixed(1)} Kb`;
93
+ }
94
+ return `${(bytes / 1024 / 1024).toFixed(1)} Mb`;
95
+ }
96
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxeFileUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
97
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxeFileUploaderComponent, isStandalone: true, selector: "nxe-file-uploader", inputs: { allowCanceling: { classPropertyName: "allowCanceling", publicName: "allowCanceling", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, labelText: { classPropertyName: "labelText", publicName: "labelText", isSignal: true, isRequired: false, transformFunction: null }, selectButtonText: { classPropertyName: "selectButtonText", publicName: "selectButtonText", isSignal: true, isRequired: false, transformFunction: null }, uploadMode: { classPropertyName: "uploadMode", publicName: "uploadMode", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, validationGroupInput: { classPropertyName: "validationGroupInput", publicName: "validationGroup", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { listeners: { "dragover": "onDragOver($event)", "dragleave": "onDragLeave()", "drop": "onDrop($event)" }, properties: { "class.nxe-fileuploader-empty": "!file()", "class.nxe-fileuploader-dragover": "dragOver()", "class.nxe-fileuploader-invalid": "!!validationError()", "class.nxe-invalid": "!!validationError()", "class.nxe-focused": "focused()" }, classAttribute: "nxe-widget nxe-file-uploader" }, providers: [
98
+ { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeFileUploaderComponent) },
99
+ ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"nxe-fileuploader-wrapper\">\r\n <div class=\"nxe-fileuploader-container\">\r\n <div class=\"nxe-fileuploader-content\">\r\n <div class=\"nxe-fileuploader-input-wrapper\">\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-button nxe-fileuploader-upload-button\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (click)=\"browse()\">\r\n {{ selectButtonText() }}\r\n </button>\r\n <div class=\"nxe-fileuploader-input-container\">\r\n <input\r\n #fileInput\r\n class=\"nxe-fileuploader-input\"\r\n type=\"file\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (change)=\"onNativeChange($event)\" />\r\n <span class=\"nxe-fileuploader-input-label\">{{ labelText() }}</span>\r\n </div>\r\n </div>\r\n\r\n @if (file(); as f) {\r\n <div class=\"nxe-fileuploader-files-container\">\r\n <div class=\"nxe-fileuploader-file-container\">\r\n <div class=\"nxe-fileuploader-file\">\r\n <div class=\"nxe-fileuploader-file-info\">\r\n <span class=\"nxe-fileuploader-file-name\">{{ f.name }}</span>\r\n <span class=\"nxe-fileuploader-file-size\">{{ formatSize(f.size) }}</span>\r\n </div>\r\n </div>\r\n @if (allowCanceling()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-cancel-button\"\r\n title=\"Cancel\"\r\n (click)=\"cancel()\">\r\n &times;\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (validationError(); as err) {\r\n <div class=\"nxe-fileuploader-error\">{{ err }}</div>\r\n}\r\n\r\n<ng-content />\r\n", styles: ["nxe-file-uploader{display:block;position:relative}nxe-file-uploader .nxe-fileuploader-wrapper{padding-inline:0;padding-bottom:0}nxe-file-uploader.nxe-invalid .nxe-fileuploader-button,nxe-file-uploader.nxe-fileuploader-invalid .nxe-fileuploader-button{border-color:#d9534f}nxe-file-uploader .nxe-fileuploader-input-wrapper{display:flex;align-items:center;gap:8px;padding:4px 0;border:0}nxe-file-uploader .nxe-fileuploader-button{border:1px solid #ddd;border-radius:4px;background:#fff;color:#333;padding:6px 12px;font-size:var(--nxe-ui-font-size);line-height:1;cursor:pointer}nxe-file-uploader .nxe-fileuploader-button:hover{background:#f5f5f5}nxe-file-uploader .nxe-fileuploader-input{display:none}nxe-file-uploader .nxe-fileuploader-input-label{color:#999}nxe-file-uploader .nxe-fileuploader-files-container{margin-top:6px;padding-top:0}nxe-file-uploader .nxe-fileuploader-file{display:block}nxe-file-uploader .nxe-fileuploader-file-container{display:flex;align-items:center;gap:8px}nxe-file-uploader .nxe-fileuploader-file-name{font-weight:500;margin-right:6px}nxe-file-uploader .nxe-fileuploader-file-size{color:#999;font-size:10px}nxe-file-uploader .nxe-fileuploader-cancel-button{border:none;background:transparent;cursor:pointer;font-size:18px;line-height:1;color:#999}nxe-file-uploader .nxe-fileuploader-cancel-button:hover{color:#333}nxe-file-uploader.nxe-fileuploader-dragover .nxe-fileuploader-wrapper{outline:2px dashed #30374c;outline-offset:2px}nxe-file-uploader .nxe-fileuploader-error{color:#d9534f;font-size:12px;margin-top:4px;line-height:1.4}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
100
+ }
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxeFileUploaderComponent, decorators: [{
102
+ type: Component,
103
+ args: [{ selector: 'nxe-file-uploader', standalone: true, host: {
104
+ class: 'nxe-widget nxe-file-uploader',
105
+ '[class.nxe-fileuploader-empty]': '!file()',
106
+ '[class.nxe-fileuploader-dragover]': 'dragOver()',
107
+ '[class.nxe-fileuploader-invalid]': '!!validationError()',
108
+ '[class.nxe-invalid]': '!!validationError()',
109
+ '[class.nxe-focused]': 'focused()',
110
+ '(dragover)': 'onDragOver($event)',
111
+ '(dragleave)': 'onDragLeave()',
112
+ '(drop)': 'onDrop($event)',
113
+ }, providers: [
114
+ { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeFileUploaderComponent) },
115
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"nxe-fileuploader-wrapper\">\r\n <div class=\"nxe-fileuploader-container\">\r\n <div class=\"nxe-fileuploader-content\">\r\n <div class=\"nxe-fileuploader-input-wrapper\">\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-button nxe-fileuploader-upload-button\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (click)=\"browse()\">\r\n {{ selectButtonText() }}\r\n </button>\r\n <div class=\"nxe-fileuploader-input-container\">\r\n <input\r\n #fileInput\r\n class=\"nxe-fileuploader-input\"\r\n type=\"file\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (change)=\"onNativeChange($event)\" />\r\n <span class=\"nxe-fileuploader-input-label\">{{ labelText() }}</span>\r\n </div>\r\n </div>\r\n\r\n @if (file(); as f) {\r\n <div class=\"nxe-fileuploader-files-container\">\r\n <div class=\"nxe-fileuploader-file-container\">\r\n <div class=\"nxe-fileuploader-file\">\r\n <div class=\"nxe-fileuploader-file-info\">\r\n <span class=\"nxe-fileuploader-file-name\">{{ f.name }}</span>\r\n <span class=\"nxe-fileuploader-file-size\">{{ formatSize(f.size) }}</span>\r\n </div>\r\n </div>\r\n @if (allowCanceling()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-cancel-button\"\r\n title=\"Cancel\"\r\n (click)=\"cancel()\">\r\n &times;\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (validationError(); as err) {\r\n <div class=\"nxe-fileuploader-error\">{{ err }}</div>\r\n}\r\n\r\n<ng-content />\r\n", styles: ["nxe-file-uploader{display:block;position:relative}nxe-file-uploader .nxe-fileuploader-wrapper{padding-inline:0;padding-bottom:0}nxe-file-uploader.nxe-invalid .nxe-fileuploader-button,nxe-file-uploader.nxe-fileuploader-invalid .nxe-fileuploader-button{border-color:#d9534f}nxe-file-uploader .nxe-fileuploader-input-wrapper{display:flex;align-items:center;gap:8px;padding:4px 0;border:0}nxe-file-uploader .nxe-fileuploader-button{border:1px solid #ddd;border-radius:4px;background:#fff;color:#333;padding:6px 12px;font-size:var(--nxe-ui-font-size);line-height:1;cursor:pointer}nxe-file-uploader .nxe-fileuploader-button:hover{background:#f5f5f5}nxe-file-uploader .nxe-fileuploader-input{display:none}nxe-file-uploader .nxe-fileuploader-input-label{color:#999}nxe-file-uploader .nxe-fileuploader-files-container{margin-top:6px;padding-top:0}nxe-file-uploader .nxe-fileuploader-file{display:block}nxe-file-uploader .nxe-fileuploader-file-container{display:flex;align-items:center;gap:8px}nxe-file-uploader .nxe-fileuploader-file-name{font-weight:500;margin-right:6px}nxe-file-uploader .nxe-fileuploader-file-size{color:#999;font-size:10px}nxe-file-uploader .nxe-fileuploader-cancel-button{border:none;background:transparent;cursor:pointer;font-size:18px;line-height:1;color:#999}nxe-file-uploader .nxe-fileuploader-cancel-button:hover{color:#333}nxe-file-uploader.nxe-fileuploader-dragover .nxe-fileuploader-wrapper{outline:2px dashed #30374c;outline-offset:2px}nxe-file-uploader .nxe-fileuploader-error{color:#d9534f;font-size:12px;margin-top:4px;line-height:1.4}\n"] }]
116
+ }], propDecorators: { allowCanceling: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCanceling", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], labelText: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelText", required: false }] }], selectButtonText: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectButtonText", required: false }] }], uploadMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadMode", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], validationGroupInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "validationGroup", required: false }] }], change: [{ type: i0.Output, args: ["change"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }] } });
117
+
118
+ // @nexterajs/ui/file-uploader — public API.
119
+
120
+ /**
121
+ * Generated bundle index. Do not edit.
122
+ */
123
+
124
+ export { NxeFileUploaderComponent };
125
+ //# sourceMappingURL=nexterajs-ui-file-uploader.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexterajs-ui-file-uploader.mjs","sources":["../../../projects/nextera-ui/file-uploader/src/lib/file-uploader/nxe-file-uploader.component.ts","../../../projects/nextera-ui/file-uploader/src/lib/file-uploader/nxe-file-uploader.component.html","../../../projects/nextera-ui/file-uploader/src/public-api.ts","../../../projects/nextera-ui/file-uploader/src/nexterajs-ui-file-uploader.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n forwardRef,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n NXE_VALIDATION_TARGET,\r\n NxeValidationTarget,\r\n} from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-file-uploader` — drop-in replacement for DevExtreme `dx-file-uploader`.\r\n *\r\n * Both usages run `uploadMode=\"useForm\"` (the widget never POSTs — the picked File is read by the\r\n * parent and appended to a FormData) and bind the NATIVE `(change)` event, reading\r\n * `$event.target.files[0]`. So this re-emits the inner `<input type=file>` change event verbatim\r\n * via a `change` output, preserving `$event.target.files[0]`. Drag-drop assigns the dropped\r\n * files to the hidden input and dispatches a change, keeping the same contract. Provides\r\n * {@link NXE_VALIDATION_TARGET} (value = the selected File) so a nested `nxe-validator`'s\r\n * `required` rule works — invalid while no file is chosen.\r\n */\r\n@Component({\r\n selector: 'nxe-file-uploader',\r\n standalone: true,\r\n templateUrl: './nxe-file-uploader.component.html',\r\n styleUrl: './nxe-file-uploader.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-file-uploader',\r\n '[class.nxe-fileuploader-empty]': '!file()',\r\n '[class.nxe-fileuploader-dragover]': 'dragOver()',\r\n '[class.nxe-fileuploader-invalid]': '!!validationError()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n '[class.nxe-focused]': 'focused()',\r\n '(dragover)': 'onDragOver($event)',\r\n '(dragleave)': 'onDragLeave()',\r\n '(drop)': 'onDrop($event)',\r\n },\r\n providers: [\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeFileUploaderComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeFileUploaderComponent implements NxeValidationTarget {\r\n readonly allowCanceling = input(false);\r\n readonly accept = input('*');\r\n readonly labelText = input('or Drop here');\r\n readonly selectButtonText = input('Select File');\r\n /** Accepted for parity; only `useForm` is used (no server upload by the widget). */\r\n readonly uploadMode = input<'instantly' | 'useButtons' | 'useForm'>('useForm');\r\n readonly multiple = input(false);\r\n readonly name = input<string>('files[]');\r\n /** Group for a nested nxe-validator (none used today → bare default group). */\r\n readonly validationGroupInput = input<string | undefined>(undefined, {\r\n alias: 'validationGroup',\r\n });\r\n\r\n /** Re-emits the native `<input type=file>` change so `$event.target.files[0]` keeps working. */\r\n readonly change = output<Event>();\r\n\r\n private readonly fileInput = viewChild.required<ElementRef<HTMLInputElement>>('fileInput');\r\n\r\n readonly file = signal<File | null>(null);\r\n readonly dragOver = signal(false);\r\n readonly focused = signal(false);\r\n readonly validationError = signal<string | null>(null);\r\n\r\n // --- NXE_VALIDATION_TARGET -------------------------------------------------------------\r\n getValue(): unknown {\r\n return this.file();\r\n }\r\n validationGroup(): string | undefined {\r\n return this.validationGroupInput();\r\n }\r\n setValidationError(message: string | null): void {\r\n this.validationError.set(message);\r\n }\r\n\r\n protected browse(): void {\r\n this.fileInput().nativeElement.click();\r\n }\r\n\r\n protected onNativeChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.file.set(input.files?.[0] ?? null);\r\n this.change.emit(event);\r\n }\r\n\r\n protected cancel(): void {\r\n const input = this.fileInput().nativeElement;\r\n input.value = '';\r\n // Re-runs onNativeChange (now with empty files) so the bound form control clears too.\r\n input.dispatchEvent(new Event('change'));\r\n }\r\n\r\n protected onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragOver.set(true);\r\n }\r\n\r\n protected onDragLeave(): void {\r\n this.dragOver.set(false);\r\n }\r\n\r\n protected onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragOver.set(false);\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length) {\r\n const input = this.fileInput().nativeElement;\r\n input.files = files;\r\n input.dispatchEvent(new Event('change'));\r\n }\r\n }\r\n\r\n protected formatSize(bytes: number): string {\r\n if (bytes < 1024) {\r\n return `${bytes} b`;\r\n }\r\n if (bytes < 1024 * 1024) {\r\n return `${(bytes / 1024).toFixed(1)} Kb`;\r\n }\r\n return `${(bytes / 1024 / 1024).toFixed(1)} Mb`;\r\n }\r\n}\r\n","<div class=\"nxe-fileuploader-wrapper\">\r\n <div class=\"nxe-fileuploader-container\">\r\n <div class=\"nxe-fileuploader-content\">\r\n <div class=\"nxe-fileuploader-input-wrapper\">\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-button nxe-fileuploader-upload-button\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (click)=\"browse()\">\r\n {{ selectButtonText() }}\r\n </button>\r\n <div class=\"nxe-fileuploader-input-container\">\r\n <input\r\n #fileInput\r\n class=\"nxe-fileuploader-input\"\r\n type=\"file\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"focused.set(false)\"\r\n (change)=\"onNativeChange($event)\" />\r\n <span class=\"nxe-fileuploader-input-label\">{{ labelText() }}</span>\r\n </div>\r\n </div>\r\n\r\n @if (file(); as f) {\r\n <div class=\"nxe-fileuploader-files-container\">\r\n <div class=\"nxe-fileuploader-file-container\">\r\n <div class=\"nxe-fileuploader-file\">\r\n <div class=\"nxe-fileuploader-file-info\">\r\n <span class=\"nxe-fileuploader-file-name\">{{ f.name }}</span>\r\n <span class=\"nxe-fileuploader-file-size\">{{ formatSize(f.size) }}</span>\r\n </div>\r\n </div>\r\n @if (allowCanceling()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-fileuploader-cancel-button\"\r\n title=\"Cancel\"\r\n (click)=\"cancel()\">\r\n &times;\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n\r\n@if (validationError(); as err) {\r\n <div class=\"nxe-fileuploader-error\">{{ err }}</div>\r\n}\r\n\r\n<ng-content />\r\n","// @nexterajs/ui/file-uploader — public API.\r\nexport * from './lib/file-uploader/nxe-file-uploader.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}