@coreui/data-grid 0.1.0-rc.0 → 0.3.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -6
- package/dist/css/data-grid.css +156 -38
- package/dist/css/data-grid.css.map +1 -1
- package/dist/css/data-grid.min.css +2 -2
- package/dist/css/data-grid.min.css.map +1 -1
- package/dist/css/data-grid.standalone.css +1066 -0
- package/dist/css/data-grid.standalone.css.map +1 -0
- package/dist/css/data-grid.standalone.min.css +5 -0
- package/dist/css/data-grid.standalone.min.css.map +1 -0
- package/dist/js/clipboard.cjs +56 -0
- package/dist/js/clipboard.cjs.map +1 -0
- package/dist/js/clipboard.mjs +54 -0
- package/dist/js/clipboard.mjs.map +1 -0
- package/dist/js/csv.cjs +36 -59
- package/dist/js/csv.cjs.map +1 -1
- package/dist/js/csv.mjs +35 -55
- package/dist/js/csv.mjs.map +1 -1
- package/dist/js/data-grid.esm.js +14108 -9331
- package/dist/js/data-grid.esm.js.map +1 -1
- package/dist/js/data-grid.esm.min.js +6 -6
- package/dist/js/data-grid.esm.min.js.map +1 -1
- package/dist/js/data-grid.js +14408 -9634
- package/dist/js/data-grid.js.map +1 -1
- package/dist/js/data-grid.lite.esm.js +10507 -0
- package/dist/js/data-grid.lite.esm.js.map +1 -0
- package/dist/js/data-grid.lite.esm.min.js +8 -0
- package/dist/js/data-grid.lite.esm.min.js.map +1 -0
- package/dist/js/data-grid.lite.js +10520 -0
- package/dist/js/data-grid.lite.js.map +1 -0
- package/dist/js/data-grid.lite.min.js +8 -0
- package/dist/js/data-grid.lite.min.js.map +1 -0
- package/dist/js/data-grid.lite.mjs +10507 -0
- package/dist/js/data-grid.lite.mjs.map +1 -0
- package/dist/js/data-grid.min.js +6 -6
- package/dist/js/data-grid.min.js.map +1 -1
- package/dist/js/data-grid.mjs +14108 -9331
- package/dist/js/data-grid.mjs.map +1 -1
- package/dist/js/direction.cjs +26 -0
- package/dist/js/direction.cjs.map +1 -0
- package/dist/js/direction.mjs +24 -0
- package/dist/js/direction.mjs.map +1 -0
- package/dist/js/drag.cjs +467 -0
- package/dist/js/drag.cjs.map +1 -0
- package/dist/js/drag.mjs +464 -0
- package/dist/js/drag.mjs.map +1 -0
- package/dist/js/export-table-BdabEbJG.mjs +26 -0
- package/dist/js/export-table-BdabEbJG.mjs.map +1 -0
- package/dist/js/export-table-D762wrZ1.cjs +55 -0
- package/dist/js/export-table-D762wrZ1.cjs.map +1 -0
- package/dist/js/filters.cjs +89 -132
- package/dist/js/filters.cjs.map +1 -1
- package/dist/js/filters.mjs +88 -128
- package/dist/js/filters.mjs.map +1 -1
- package/dist/js/labels.cjs +65 -70
- package/dist/js/labels.cjs.map +1 -1
- package/dist/js/labels.mjs +64 -66
- package/dist/js/labels.mjs.map +1 -1
- package/dist/js/print.cjs +66 -0
- package/dist/js/print.cjs.map +1 -0
- package/dist/js/print.mjs +64 -0
- package/dist/js/print.mjs.map +1 -0
- package/dist/js/validate.cjs +43 -0
- package/dist/js/validate.cjs.map +1 -0
- package/dist/js/validate.mjs +42 -0
- package/dist/js/validate.mjs.map +1 -0
- package/dist/js/xlsx.cjs +240 -0
- package/dist/js/xlsx.cjs.map +1 -0
- package/dist/js/xlsx.mjs +238 -0
- package/dist/js/xlsx.mjs.map +1 -0
- package/dist/types/base-component.d.ts +28 -18
- package/dist/types/data-grid.d.ts +26 -13
- package/dist/types/dom/data.d.ts +15 -0
- package/dist/types/dom/event-handler.d.ts +21 -10
- package/dist/types/dom/manipulator.d.ts +15 -8
- package/dist/types/engine/active-cell.d.ts +1 -0
- package/dist/types/engine/data-source.d.ts +1 -1
- package/dist/types/engine/features-lite.d.ts +25 -0
- package/dist/types/engine/features.d.ts +35 -0
- package/dist/types/engine/table.d.ts +3 -3
- package/dist/types/engine/validate.d.mts +1 -0
- package/dist/types/engine/validate.d.ts +20 -0
- package/dist/types/engine/virtualizer.d.ts +2 -0
- package/dist/types/icons.d.ts +6 -4
- package/dist/types/index-lite.d.mts +1 -0
- package/dist/types/index-lite.d.ts +19 -0
- package/dist/types/index.d.ts +11 -2
- package/dist/types/types.d.ts +53 -31
- package/dist/types/ui/body.d.ts +6 -3
- package/dist/types/ui/header.d.ts +3 -2
- package/dist/types/ui/loading.d.ts +1 -1
- package/dist/types/ui/pinning.d.ts +1 -1
- package/dist/types/ui/toolbar.d.ts +10 -2
- package/dist/types/util/clipboard.d.mts +1 -0
- package/dist/types/util/clipboard.d.ts +29 -0
- package/dist/types/util/config.d.ts +27 -10
- package/dist/types/util/csv.d.ts +5 -5
- package/dist/types/util/direction.d.mts +1 -0
- package/dist/types/util/direction.d.ts +17 -0
- package/dist/types/util/drag.d.mts +1 -0
- package/dist/types/util/drag.d.ts +48 -0
- package/dist/types/util/export-table.d.ts +47 -0
- package/dist/types/util/index.d.ts +66 -10
- package/dist/types/util/print.d.mts +1 -0
- package/dist/types/util/print.d.ts +32 -0
- package/dist/types/util/sanitizer.d.ts +15 -11
- package/dist/types/util/xlsx.d.mts +1 -0
- package/dist/types/util/xlsx.d.ts +17 -0
- package/dist/types/util/zip.d.ts +11 -0
- package/package.json +101 -10
- package/scss/_base.scss +13 -0
- package/scss/_config.scss +14 -0
- package/scss/_functions.scss +1 -0
- package/scss/_mixins.scss +1 -0
- package/scss/base/_buttons.scss +113 -0
- package/scss/base/_forms.scss +157 -0
- package/scss/base/_helpers.scss +24 -0
- package/scss/base/_pagination.scss +100 -0
- package/scss/base/_reboot.scss +93 -0
- package/scss/base/_root.scss +85 -0
- package/scss/base/_spinner.scss +45 -0
- package/scss/base/_table.scss +78 -0
- package/scss/components/_data-grid.scss +807 -0
- package/scss/data-grid.scss +7 -555
- package/scss/data-grid.standalone.scss +16 -0
- package/scss/functions/_defaults.scss +25 -0
- package/scss/mixins/_tokens.scss +12 -0
- package/src/{base-component.js → base-component.ts} +21 -17
- package/src/data-grid.ts +523 -201
- package/src/dom/{data.js → data.ts} +13 -10
- package/src/dom/event-handler.ts +380 -0
- package/src/dom/{manipulator.js → manipulator.ts} +11 -11
- package/src/engine/active-cell.ts +10 -3
- package/src/engine/data-source.ts +7 -3
- package/src/engine/features-lite.ts +47 -0
- package/src/engine/features.ts +68 -0
- package/src/engine/table.ts +86 -45
- package/src/engine/validate.ts +64 -0
- package/src/engine/virtualizer.ts +17 -1
- package/src/icons.ts +11 -5
- package/src/index-lite.ts +85 -0
- package/src/index.ts +30 -2
- package/src/labels.ts +6 -4
- package/src/types.ts +87 -32
- package/src/ui/body.ts +73 -17
- package/src/ui/header.ts +51 -26
- package/src/ui/loading.ts +2 -2
- package/src/ui/pinning.ts +16 -16
- package/src/ui/toolbar.ts +27 -3
- package/src/util/clipboard.ts +112 -0
- package/src/util/{config.js → config.ts} +25 -11
- package/src/util/csv.ts +11 -30
- package/src/util/direction.ts +37 -0
- package/src/util/drag.ts +832 -0
- package/src/util/export-table.ts +86 -0
- package/src/util/{index.js → index.ts} +55 -35
- package/src/util/print.ts +125 -0
- package/src/util/{sanitizer.js → sanitizer.ts} +17 -13
- package/src/util/xlsx.ts +183 -0
- package/src/util/zip.ts +170 -0
- package/src/base-component.d.ts +0 -19
- package/src/dom/event-handler.d.ts +0 -11
- package/src/dom/event-handler.js +0 -331
- package/src/dom/manipulator.d.ts +0 -9
- package/src/util/config.d.ts +0 -11
- package/src/util/index.d.ts +0 -10
- package/src/util/sanitizer.d.ts +0 -11
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* CoreUI PRO data-grid v0.3.0-rc.0 (https://coreui.io)
|
|
3
|
+
* Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
|
|
4
|
+
* License (https://coreui.io/pro/license/)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
|
+
//#region src/util/clipboard.ts
|
|
8
|
+
const DELIMITER = " ";
|
|
9
|
+
const ROW_SEPARATOR = "\n";
|
|
10
|
+
const REGION_SEPARATOR = "\n\n";
|
|
11
|
+
const escape = (text) => /[\t\n"]/.test(text) ? `"${text.replace(/"/g, "\"\"")}"` : text;
|
|
12
|
+
const serializeCellSelection = (table, columns) => {
|
|
13
|
+
const { rows } = table.getRowModel();
|
|
14
|
+
return table.getCellSelectionBounds().map((bounds) => {
|
|
15
|
+
const lines = [];
|
|
16
|
+
for (let rowIndex = bounds.minRowIndex; rowIndex <= bounds.maxRowIndex; rowIndex++) {
|
|
17
|
+
const row = rows[rowIndex];
|
|
18
|
+
if (!row) continue;
|
|
19
|
+
const cells = [];
|
|
20
|
+
for (let columnIndex = bounds.minColumnIndex; columnIndex <= bounds.maxColumnIndex; columnIndex++) {
|
|
21
|
+
const column = columns[columnIndex];
|
|
22
|
+
if (!column) continue;
|
|
23
|
+
const value = row.getValue(column.id);
|
|
24
|
+
cells.push(escape(column.formatter ? column.formatter(value, row.original) : String(value ?? "")));
|
|
25
|
+
}
|
|
26
|
+
lines.push(cells.join(DELIMITER));
|
|
27
|
+
}
|
|
28
|
+
return lines.join(ROW_SEPARATOR);
|
|
29
|
+
}).filter((region) => region !== "").join(REGION_SEPARATOR);
|
|
30
|
+
};
|
|
31
|
+
const copyCellSelection = async (table, columns) => {
|
|
32
|
+
const text = serializeCellSelection(table, columns);
|
|
33
|
+
if (text === "") return text;
|
|
34
|
+
try {
|
|
35
|
+
await navigator.clipboard.writeText(text);
|
|
36
|
+
} catch {
|
|
37
|
+
const textarea = document.createElement("textarea");
|
|
38
|
+
textarea.value = text;
|
|
39
|
+
textarea.setAttribute("aria-hidden", "true");
|
|
40
|
+
textarea.style.position = "fixed";
|
|
41
|
+
textarea.style.opacity = "0";
|
|
42
|
+
document.body.append(textarea);
|
|
43
|
+
textarea.select();
|
|
44
|
+
try {
|
|
45
|
+
document.execCommand("copy");
|
|
46
|
+
} finally {
|
|
47
|
+
textarea.remove();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return text;
|
|
51
|
+
};
|
|
52
|
+
//#endregion
|
|
53
|
+
exports.copyCellSelection = copyCellSelection;
|
|
54
|
+
exports.serializeCellSelection = serializeCellSelection;
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=clipboard.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.cjs","names":[],"sources":["../../src/util/clipboard.ts"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * CoreUI PRO data-grid util/clipboard.ts\n * License (https://coreui.io/pro/license/)\n * --------------------------------------------------------------------------\n */\n\nimport type { DataGridItem } from '../types'\n\n// table-core resolves the selection to index rectangles and leaves the text to\n// userland, \"since the delimiter, the null representation, and any quoting\n// rules are application decisions\". This is that decision, made once for all\n// four editions: TSV, because that is what spreadsheets paste as columns.\n\nconst DELIMITER = '\\t'\nconst ROW_SEPARATOR = '\\n'\n// Disjoint regions are separated the way a spreadsheet shows a gap.\nconst REGION_SEPARATOR = '\\n\\n'\n\nexport interface ClipboardBounds {\n maxColumnIndex: number\n maxRowIndex: number\n minColumnIndex: number\n minRowIndex: number\n}\n\nexport interface ClipboardRow {\n getValue: (columnId: string) => unknown\n original: DataGridItem\n}\n\nexport interface ClipboardTable {\n getCellSelectionBounds: () => ClipboardBounds[]\n getRowModel: () => { rows: ClipboardRow[] }\n}\n\n// The grid's own visible columns, in display order — the same order the\n// selection's column indexes address.\nexport interface ClipboardColumn {\n id: string\n formatter?: (value: unknown, item: DataGridItem) => string\n}\n\n// A tab or a newline inside a value would break the grid the paste target\n// rebuilds, so a value carrying either is quoted the way TSV consumers expect.\nconst escape = (text: string): string =>\n (/[\\t\\n\"]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text)\n\nexport const serializeCellSelection = (table: ClipboardTable, columns: ClipboardColumn[]): string => {\n const { rows } = table.getRowModel()\n\n return table\n .getCellSelectionBounds()\n .map(bounds => {\n const lines: string[] = []\n for (let rowIndex = bounds.minRowIndex; rowIndex <= bounds.maxRowIndex; rowIndex++) {\n const row = rows[rowIndex]\n if (!row) {\n continue\n }\n\n const cells: string[] = []\n for (let columnIndex = bounds.minColumnIndex; columnIndex <= bounds.maxColumnIndex; columnIndex++) {\n const column = columns[columnIndex]\n if (!column) {\n continue\n }\n\n const value = row.getValue(column.id)\n // The formatter is what the cell displays; a copied date should\n // paste as the date the user is looking at, not its raw value.\n cells.push(escape(column.formatter ? column.formatter(value, row.original) : String(value ?? '')))\n }\n\n lines.push(cells.join(DELIMITER))\n }\n\n return lines.join(ROW_SEPARATOR)\n })\n .filter(region => region !== '')\n .join(REGION_SEPARATOR)\n}\n\nexport const copyCellSelection = async (table: ClipboardTable, columns: ClipboardColumn[]): Promise<string> => {\n const text = serializeCellSelection(table, columns)\n if (text === '') {\n return text\n }\n\n try {\n await navigator.clipboard.writeText(text)\n } catch {\n // Denied permission, an insecure context, or a browser without the async\n // clipboard: fall back to the selection-and-execCommand route, which only\n // works inside the user gesture that asked for the copy — which is exactly\n // where this runs.\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('aria-hidden', 'true')\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.append(textarea)\n textarea.select()\n try {\n document.execCommand('copy')\n } finally {\n textarea.remove()\n }\n }\n\n return text\n}\n"],"mappings":";;;;;;;AAcA,MAAM,YAAY;AAClB,MAAM,gBAAgB;AAEtB,MAAM,mBAAmB;AA4BzB,MAAM,UAAU,SACb,UAAU,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,MAAM,MAAI,EAAE,KAAK;AAE5D,MAAa,0BAA0B,OAAuB,YAAuC;CACnG,MAAM,EAAE,SAAS,MAAM,YAAY;CAEnC,OAAO,MACJ,uBAAuB,CAAC,CACxB,KAAI,WAAU;EACb,MAAM,QAAkB,CAAC;EACzB,KAAK,IAAI,WAAW,OAAO,aAAa,YAAY,OAAO,aAAa,YAAY;GAClF,MAAM,MAAM,KAAK;GACjB,IAAI,CAAC,KACH;GAGF,MAAM,QAAkB,CAAC;GACzB,KAAK,IAAI,cAAc,OAAO,gBAAgB,eAAe,OAAO,gBAAgB,eAAe;IACjG,MAAM,SAAS,QAAQ;IACvB,IAAI,CAAC,QACH;IAGF,MAAM,QAAQ,IAAI,SAAS,OAAO,EAAE;IAGpC,MAAM,KAAK,OAAO,OAAO,YAAY,OAAO,UAAU,OAAO,IAAI,QAAQ,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC;GACnG;GAEA,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC;EAClC;EAEA,OAAO,MAAM,KAAK,aAAa;CACjC,CAAC,CAAC,CACD,QAAO,WAAU,WAAW,EAAE,CAAC,CAC/B,KAAK,gBAAgB;AAC1B;AAEA,MAAa,oBAAoB,OAAO,OAAuB,YAAgD;CAC7G,MAAM,OAAO,uBAAuB,OAAO,OAAO;CAClD,IAAI,SAAS,IACX,OAAO;CAGT,IAAI;EACF,MAAM,UAAU,UAAU,UAAU,IAAI;CAC1C,QAAQ;EAKN,MAAM,WAAW,SAAS,cAAc,UAAU;EAClD,SAAS,QAAQ;EACjB,SAAS,aAAa,eAAe,MAAM;EAC3C,SAAS,MAAM,WAAW;EAC1B,SAAS,MAAM,UAAU;EACzB,SAAS,KAAK,OAAO,QAAQ;EAC7B,SAAS,OAAO;EAChB,IAAI;GACF,SAAS,YAAY,MAAM;EAC7B,UAAU;GACR,SAAS,OAAO;EAClB;CACF;CAEA,OAAO;AACT"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* CoreUI PRO data-grid v0.3.0-rc.0 (https://coreui.io)
|
|
3
|
+
* Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
|
|
4
|
+
* License (https://coreui.io/pro/license/)
|
|
5
|
+
*/
|
|
6
|
+
//#region src/util/clipboard.ts
|
|
7
|
+
const DELIMITER = " ";
|
|
8
|
+
const ROW_SEPARATOR = "\n";
|
|
9
|
+
const REGION_SEPARATOR = "\n\n";
|
|
10
|
+
const escape = (text) => /[\t\n"]/.test(text) ? `"${text.replace(/"/g, "\"\"")}"` : text;
|
|
11
|
+
const serializeCellSelection = (table, columns) => {
|
|
12
|
+
const { rows } = table.getRowModel();
|
|
13
|
+
return table.getCellSelectionBounds().map((bounds) => {
|
|
14
|
+
const lines = [];
|
|
15
|
+
for (let rowIndex = bounds.minRowIndex; rowIndex <= bounds.maxRowIndex; rowIndex++) {
|
|
16
|
+
const row = rows[rowIndex];
|
|
17
|
+
if (!row) continue;
|
|
18
|
+
const cells = [];
|
|
19
|
+
for (let columnIndex = bounds.minColumnIndex; columnIndex <= bounds.maxColumnIndex; columnIndex++) {
|
|
20
|
+
const column = columns[columnIndex];
|
|
21
|
+
if (!column) continue;
|
|
22
|
+
const value = row.getValue(column.id);
|
|
23
|
+
cells.push(escape(column.formatter ? column.formatter(value, row.original) : String(value ?? "")));
|
|
24
|
+
}
|
|
25
|
+
lines.push(cells.join(DELIMITER));
|
|
26
|
+
}
|
|
27
|
+
return lines.join(ROW_SEPARATOR);
|
|
28
|
+
}).filter((region) => region !== "").join(REGION_SEPARATOR);
|
|
29
|
+
};
|
|
30
|
+
const copyCellSelection = async (table, columns) => {
|
|
31
|
+
const text = serializeCellSelection(table, columns);
|
|
32
|
+
if (text === "") return text;
|
|
33
|
+
try {
|
|
34
|
+
await navigator.clipboard.writeText(text);
|
|
35
|
+
} catch {
|
|
36
|
+
const textarea = document.createElement("textarea");
|
|
37
|
+
textarea.value = text;
|
|
38
|
+
textarea.setAttribute("aria-hidden", "true");
|
|
39
|
+
textarea.style.position = "fixed";
|
|
40
|
+
textarea.style.opacity = "0";
|
|
41
|
+
document.body.append(textarea);
|
|
42
|
+
textarea.select();
|
|
43
|
+
try {
|
|
44
|
+
document.execCommand("copy");
|
|
45
|
+
} finally {
|
|
46
|
+
textarea.remove();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return text;
|
|
50
|
+
};
|
|
51
|
+
//#endregion
|
|
52
|
+
export { copyCellSelection, serializeCellSelection };
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=clipboard.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.mjs","names":[],"sources":["../../src/util/clipboard.ts"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * CoreUI PRO data-grid util/clipboard.ts\n * License (https://coreui.io/pro/license/)\n * --------------------------------------------------------------------------\n */\n\nimport type { DataGridItem } from '../types'\n\n// table-core resolves the selection to index rectangles and leaves the text to\n// userland, \"since the delimiter, the null representation, and any quoting\n// rules are application decisions\". This is that decision, made once for all\n// four editions: TSV, because that is what spreadsheets paste as columns.\n\nconst DELIMITER = '\\t'\nconst ROW_SEPARATOR = '\\n'\n// Disjoint regions are separated the way a spreadsheet shows a gap.\nconst REGION_SEPARATOR = '\\n\\n'\n\nexport interface ClipboardBounds {\n maxColumnIndex: number\n maxRowIndex: number\n minColumnIndex: number\n minRowIndex: number\n}\n\nexport interface ClipboardRow {\n getValue: (columnId: string) => unknown\n original: DataGridItem\n}\n\nexport interface ClipboardTable {\n getCellSelectionBounds: () => ClipboardBounds[]\n getRowModel: () => { rows: ClipboardRow[] }\n}\n\n// The grid's own visible columns, in display order — the same order the\n// selection's column indexes address.\nexport interface ClipboardColumn {\n id: string\n formatter?: (value: unknown, item: DataGridItem) => string\n}\n\n// A tab or a newline inside a value would break the grid the paste target\n// rebuilds, so a value carrying either is quoted the way TSV consumers expect.\nconst escape = (text: string): string =>\n (/[\\t\\n\"]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text)\n\nexport const serializeCellSelection = (table: ClipboardTable, columns: ClipboardColumn[]): string => {\n const { rows } = table.getRowModel()\n\n return table\n .getCellSelectionBounds()\n .map(bounds => {\n const lines: string[] = []\n for (let rowIndex = bounds.minRowIndex; rowIndex <= bounds.maxRowIndex; rowIndex++) {\n const row = rows[rowIndex]\n if (!row) {\n continue\n }\n\n const cells: string[] = []\n for (let columnIndex = bounds.minColumnIndex; columnIndex <= bounds.maxColumnIndex; columnIndex++) {\n const column = columns[columnIndex]\n if (!column) {\n continue\n }\n\n const value = row.getValue(column.id)\n // The formatter is what the cell displays; a copied date should\n // paste as the date the user is looking at, not its raw value.\n cells.push(escape(column.formatter ? column.formatter(value, row.original) : String(value ?? '')))\n }\n\n lines.push(cells.join(DELIMITER))\n }\n\n return lines.join(ROW_SEPARATOR)\n })\n .filter(region => region !== '')\n .join(REGION_SEPARATOR)\n}\n\nexport const copyCellSelection = async (table: ClipboardTable, columns: ClipboardColumn[]): Promise<string> => {\n const text = serializeCellSelection(table, columns)\n if (text === '') {\n return text\n }\n\n try {\n await navigator.clipboard.writeText(text)\n } catch {\n // Denied permission, an insecure context, or a browser without the async\n // clipboard: fall back to the selection-and-execCommand route, which only\n // works inside the user gesture that asked for the copy — which is exactly\n // where this runs.\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('aria-hidden', 'true')\n textarea.style.position = 'fixed'\n textarea.style.opacity = '0'\n document.body.append(textarea)\n textarea.select()\n try {\n document.execCommand('copy')\n } finally {\n textarea.remove()\n }\n }\n\n return text\n}\n"],"mappings":";;;;;;AAcA,MAAM,YAAY;AAClB,MAAM,gBAAgB;AAEtB,MAAM,mBAAmB;AA4BzB,MAAM,UAAU,SACb,UAAU,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,MAAM,MAAI,EAAE,KAAK;AAE5D,MAAa,0BAA0B,OAAuB,YAAuC;CACnG,MAAM,EAAE,SAAS,MAAM,YAAY;CAEnC,OAAO,MACJ,uBAAuB,CAAC,CACxB,KAAI,WAAU;EACb,MAAM,QAAkB,CAAC;EACzB,KAAK,IAAI,WAAW,OAAO,aAAa,YAAY,OAAO,aAAa,YAAY;GAClF,MAAM,MAAM,KAAK;GACjB,IAAI,CAAC,KACH;GAGF,MAAM,QAAkB,CAAC;GACzB,KAAK,IAAI,cAAc,OAAO,gBAAgB,eAAe,OAAO,gBAAgB,eAAe;IACjG,MAAM,SAAS,QAAQ;IACvB,IAAI,CAAC,QACH;IAGF,MAAM,QAAQ,IAAI,SAAS,OAAO,EAAE;IAGpC,MAAM,KAAK,OAAO,OAAO,YAAY,OAAO,UAAU,OAAO,IAAI,QAAQ,IAAI,OAAO,SAAS,EAAE,CAAC,CAAC;GACnG;GAEA,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC;EAClC;EAEA,OAAO,MAAM,KAAK,aAAa;CACjC,CAAC,CAAC,CACD,QAAO,WAAU,WAAW,EAAE,CAAC,CAC/B,KAAK,gBAAgB;AAC1B;AAEA,MAAa,oBAAoB,OAAO,OAAuB,YAAgD;CAC7G,MAAM,OAAO,uBAAuB,OAAO,OAAO;CAClD,IAAI,SAAS,IACX,OAAO;CAGT,IAAI;EACF,MAAM,UAAU,UAAU,UAAU,IAAI;CAC1C,QAAQ;EAKN,MAAM,WAAW,SAAS,cAAc,UAAU;EAClD,SAAS,QAAQ;EACjB,SAAS,aAAa,eAAe,MAAM;EAC3C,SAAS,MAAM,WAAW;EAC1B,SAAS,MAAM,UAAU;EACzB,SAAS,KAAK,OAAO,QAAQ;EAC7B,SAAS,OAAO;EAChB,IAAI;GACF,SAAS,YAAY,MAAM;EAC7B,UAAU;GACR,SAAS,OAAO;EAClB;CACF;CAEA,OAAO;AACT"}
|
package/dist/js/csv.cjs
CHANGED
|
@@ -1,68 +1,45 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
* CoreUI PRO data-grid v0.3.0-rc.0 (https://coreui.io)
|
|
3
|
+
* Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
|
|
4
|
+
* License (https://coreui.io/pro/license/)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
|
+
const require_export_table = require("./export-table-D762wrZ1.cjs");
|
|
8
|
+
//#region src/util/csv.ts
|
|
10
9
|
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const escapeField = (value, delimiter) => /["\r\n]/.test(value) || value.includes(delimiter) ? `"${value.replace(/"/g,
|
|
17
|
-
// CSV formula injection: a leading =, +, -, @, tab or CR makes spreadsheets treat
|
|
18
|
-
// the cell as a formula. Opt-in guard prefixes such fields with an apostrophe.
|
|
10
|
+
* --------------------------------------------------------------------------
|
|
11
|
+
* CoreUI PRO data-grid util/csv.ts
|
|
12
|
+
* License (https://coreui.io/pro/license/)
|
|
13
|
+
* --------------------------------------------------------------------------
|
|
14
|
+
*/
|
|
15
|
+
const escapeField = (value, delimiter) => /["\r\n]/.test(value) || value.includes(delimiter) ? `"${value.replace(/"/g, "\"\"")}"` : value;
|
|
19
16
|
const sanitizeField = (value) => /^[=+\-@\t\r]/.test(value) ? `'${value}` : value;
|
|
20
|
-
const rowsFor = (table, scope) => {
|
|
21
|
-
if (scope === 'all') {
|
|
22
|
-
return table.getCoreRowModel().rows;
|
|
23
|
-
}
|
|
24
|
-
if (scope === 'selected') {
|
|
25
|
-
return table.getSelectedRowModel().rows;
|
|
26
|
-
}
|
|
27
|
-
return table.getSortedRowModel().rows;
|
|
28
|
-
};
|
|
29
17
|
const exportCsv = (table, options = {}) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const header = line(columns.map(column => { var _a, _b; return String((_b = (_a = column.columnDef.meta) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : column.id); }));
|
|
41
|
-
const body = rowsFor(table, options.scope).map(row => line(columns.map(column => {
|
|
42
|
-
var _a;
|
|
43
|
-
const value = row.getValue(column.id);
|
|
44
|
-
const meta = column.columnDef.meta;
|
|
45
|
-
// Coerce: a formatter may return a number/null in plain-JS usage.
|
|
46
|
-
return (meta === null || meta === void 0 ? void 0 : meta.formatter) ? String((_a = meta.formatter(value, row.original)) !== null && _a !== void 0 ? _a : '') : String(value !== null && value !== void 0 ? value : '');
|
|
47
|
-
})));
|
|
48
|
-
const csv = [header, ...body].join('\r\n');
|
|
49
|
-
return options.bom ? `\uFEFF${csv}` : csv;
|
|
18
|
+
const delimiter = options.delimiter ?? ",";
|
|
19
|
+
const columns = require_export_table.columnsFor(table);
|
|
20
|
+
const process = (field) => escapeField(options.sanitize ? sanitizeField(field) : field, delimiter);
|
|
21
|
+
const line = (fields) => fields.map(process).join(delimiter);
|
|
22
|
+
const csv = [line(columns.map((column) => require_export_table.headerFor(column))), ...require_export_table.rowsFor(table, options.scope).map((row) => line(columns.map((column) => {
|
|
23
|
+
const value = row.getValue(column.id);
|
|
24
|
+
const formatter = require_export_table.formatterFor(column);
|
|
25
|
+
return formatter ? String(formatter(value, row.original) ?? "") : String(value ?? "");
|
|
26
|
+
})))].join("\r\n");
|
|
27
|
+
return options.bom ? `\uFEFF${csv}` : csv;
|
|
50
28
|
};
|
|
51
29
|
const downloadCsv = (table, options = {}) => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
anchor.remove();
|
|
63
|
-
setTimeout(() => URL.revokeObjectURL(url));
|
|
30
|
+
const blob = new Blob([exportCsv(table, options)], { type: "text/csv;charset=utf-8;" });
|
|
31
|
+
const url = URL.createObjectURL(blob);
|
|
32
|
+
const anchor = document.createElement("a");
|
|
33
|
+
anchor.href = url;
|
|
34
|
+
anchor.download = options.filename ?? "export.csv";
|
|
35
|
+
anchor.style.display = "none";
|
|
36
|
+
document.body.append(anchor);
|
|
37
|
+
anchor.click();
|
|
38
|
+
anchor.remove();
|
|
39
|
+
setTimeout(() => URL.revokeObjectURL(url));
|
|
64
40
|
};
|
|
65
|
-
|
|
41
|
+
//#endregion
|
|
66
42
|
exports.downloadCsv = downloadCsv;
|
|
67
43
|
exports.exportCsv = exportCsv;
|
|
68
|
-
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=csv.cjs.map
|
package/dist/js/csv.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.cjs","sources":["../../src/util/csv.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"csv.cjs","names":["columnsFor","headerFor","rowsFor","formatterFor"],"sources":["../../src/util/csv.ts"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * CoreUI PRO data-grid util/csv.ts\n * License (https://coreui.io/pro/license/)\n * --------------------------------------------------------------------------\n */\n\nimport {\n columnsFor, formatterFor, headerFor, rowsFor, type ExportScope, type ExportTable\n} from './export-table'\n\nexport interface CsvOptions {\n scope?: ExportScope\n delimiter?: string\n bom?: boolean\n sanitize?: boolean\n}\n\nexport interface CsvDownloadOptions extends CsvOptions {\n filename?: string\n}\n\nexport type CsvTable = ExportTable\n\nconst escapeField = (value: string, delimiter: string): string =>\n /[\"\\r\\n]/.test(value) || value.includes(delimiter) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value\n\n// CSV formula injection: a leading =, +, -, @, tab or CR makes spreadsheets treat\n// the cell as a formula. Opt-in guard prefixes such fields with an apostrophe.\nconst sanitizeField = (value: string): string =>\n /^[=+\\-@\\t\\r]/.test(value) ? `'${value}` : value\n\nexport const exportCsv = (table: CsvTable, options: CsvOptions = {}): string => {\n const delimiter = options.delimiter ?? ','\n const columns = columnsFor(table)\n\n const process = (field: string) => escapeField(options.sanitize ? sanitizeField(field) : field, delimiter)\n const line = (fields: string[]) => fields.map(process).join(delimiter)\n\n const header = line(columns.map(column => headerFor(column)))\n const body = rowsFor(table, options.scope).map(row =>\n line(columns.map(column => {\n const value = row.getValue(column.id)\n const formatter = formatterFor(column)\n // Coerce: a formatter may return a number/null in plain-JS usage.\n return formatter ? String(formatter(value, row.original) ?? '') : String(value ?? '')\n }))\n )\n\n const csv = [header, ...body].join('\\r\\n')\n return options.bom ? `\\uFEFF${csv}` : csv\n}\n\nexport const downloadCsv = (table: CsvTable, options: CsvDownloadOptions = {}): void => {\n const blob = new Blob([exportCsv(table, options)], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = options.filename ?? 'export.csv'\n anchor.style.display = 'none'\n // Attach before clicking (older Firefox) and defer revoke (Safari race).\n document.body.append(anchor)\n anchor.click()\n anchor.remove()\n setTimeout(() => URL.revokeObjectURL(url))\n}\n"],"mappings":";;;;;;;;;;;;;;AAwBA,MAAM,eAAe,OAAe,cAClC,UAAU,KAAK,KAAK,KAAK,MAAM,SAAS,SAAS,IAAI,IAAI,MAAM,QAAQ,MAAM,MAAI,EAAE,KAAK;AAI1F,MAAM,iBAAiB,UACrB,eAAe,KAAK,KAAK,IAAI,IAAI,UAAU;AAE7C,MAAa,aAAa,OAAiB,UAAsB,CAAC,MAAc;CAC9E,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,UAAUA,qBAAAA,WAAW,KAAK;CAEhC,MAAM,WAAW,UAAkB,YAAY,QAAQ,WAAW,cAAc,KAAK,IAAI,OAAO,SAAS;CACzG,MAAM,QAAQ,WAAqB,OAAO,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS;CAYrE,MAAM,MAAM,CAVG,KAAK,QAAQ,KAAI,WAAUC,qBAAAA,UAAU,MAAM,CAAC,CAUzC,GAAG,GATRC,qBAAAA,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAI,QAC7C,KAAK,QAAQ,KAAI,WAAU;EACzB,MAAM,QAAQ,IAAI,SAAS,OAAO,EAAE;EACpC,MAAM,YAAYC,qBAAAA,aAAa,MAAM;EAErC,OAAO,YAAY,OAAO,UAAU,OAAO,IAAI,QAAQ,KAAK,EAAE,IAAI,OAAO,SAAS,EAAE;CACtF,CAAC,CAAC,CAGuB,CAAC,CAAC,CAAC,KAAK,MAAM;CACzC,OAAO,QAAQ,MAAM,SAAS,QAAQ;AACxC;AAEA,MAAa,eAAe,OAAiB,UAA8B,CAAC,MAAY;CACtF,MAAM,OAAO,IAAI,KAAK,CAAC,UAAU,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,0BAA0B,CAAC;CACtF,MAAM,MAAM,IAAI,gBAAgB,IAAI;CACpC,MAAM,SAAS,SAAS,cAAc,GAAG;CACzC,OAAO,OAAO;CACd,OAAO,WAAW,QAAQ,YAAY;CACtC,OAAO,MAAM,UAAU;CAEvB,SAAS,KAAK,OAAO,MAAM;CAC3B,OAAO,MAAM;CACb,OAAO,OAAO;CACd,iBAAiB,IAAI,gBAAgB,GAAG,CAAC;AAC3C"}
|
package/dist/js/csv.mjs
CHANGED
|
@@ -1,63 +1,43 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
* CoreUI PRO data-grid v0.3.0-rc.0 (https://coreui.io)
|
|
3
|
+
* Copyright 2026 The CoreUI Team (https://github.com/orgs/coreui/people)
|
|
4
|
+
* License (https://coreui.io/pro/license/)
|
|
5
|
+
*/
|
|
6
|
+
import { i as rowsFor, n as formatterFor, r as headerFor, t as columnsFor } from "./export-table-BdabEbJG.mjs";
|
|
7
|
+
//#region src/util/csv.ts
|
|
6
8
|
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const escapeField = (value, delimiter) => /["\r\n]/.test(value) || value.includes(delimiter) ? `"${value.replace(/"/g,
|
|
13
|
-
// CSV formula injection: a leading =, +, -, @, tab or CR makes spreadsheets treat
|
|
14
|
-
// the cell as a formula. Opt-in guard prefixes such fields with an apostrophe.
|
|
9
|
+
* --------------------------------------------------------------------------
|
|
10
|
+
* CoreUI PRO data-grid util/csv.ts
|
|
11
|
+
* License (https://coreui.io/pro/license/)
|
|
12
|
+
* --------------------------------------------------------------------------
|
|
13
|
+
*/
|
|
14
|
+
const escapeField = (value, delimiter) => /["\r\n]/.test(value) || value.includes(delimiter) ? `"${value.replace(/"/g, "\"\"")}"` : value;
|
|
15
15
|
const sanitizeField = (value) => /^[=+\-@\t\r]/.test(value) ? `'${value}` : value;
|
|
16
|
-
const rowsFor = (table, scope) => {
|
|
17
|
-
if (scope === 'all') {
|
|
18
|
-
return table.getCoreRowModel().rows;
|
|
19
|
-
}
|
|
20
|
-
if (scope === 'selected') {
|
|
21
|
-
return table.getSelectedRowModel().rows;
|
|
22
|
-
}
|
|
23
|
-
return table.getSortedRowModel().rows;
|
|
24
|
-
};
|
|
25
16
|
const exportCsv = (table, options = {}) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const header = line(columns.map(column => { var _a, _b; return String((_b = (_a = column.columnDef.meta) === null || _a === void 0 ? void 0 : _a.label) !== null && _b !== void 0 ? _b : column.id); }));
|
|
37
|
-
const body = rowsFor(table, options.scope).map(row => line(columns.map(column => {
|
|
38
|
-
var _a;
|
|
39
|
-
const value = row.getValue(column.id);
|
|
40
|
-
const meta = column.columnDef.meta;
|
|
41
|
-
// Coerce: a formatter may return a number/null in plain-JS usage.
|
|
42
|
-
return (meta === null || meta === void 0 ? void 0 : meta.formatter) ? String((_a = meta.formatter(value, row.original)) !== null && _a !== void 0 ? _a : '') : String(value !== null && value !== void 0 ? value : '');
|
|
43
|
-
})));
|
|
44
|
-
const csv = [header, ...body].join('\r\n');
|
|
45
|
-
return options.bom ? `\uFEFF${csv}` : csv;
|
|
17
|
+
const delimiter = options.delimiter ?? ",";
|
|
18
|
+
const columns = columnsFor(table);
|
|
19
|
+
const process = (field) => escapeField(options.sanitize ? sanitizeField(field) : field, delimiter);
|
|
20
|
+
const line = (fields) => fields.map(process).join(delimiter);
|
|
21
|
+
const csv = [line(columns.map((column) => headerFor(column))), ...rowsFor(table, options.scope).map((row) => line(columns.map((column) => {
|
|
22
|
+
const value = row.getValue(column.id);
|
|
23
|
+
const formatter = formatterFor(column);
|
|
24
|
+
return formatter ? String(formatter(value, row.original) ?? "") : String(value ?? "");
|
|
25
|
+
})))].join("\r\n");
|
|
26
|
+
return options.bom ? `\uFEFF${csv}` : csv;
|
|
46
27
|
};
|
|
47
28
|
const downloadCsv = (table, options = {}) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
anchor.remove();
|
|
59
|
-
setTimeout(() => URL.revokeObjectURL(url));
|
|
29
|
+
const blob = new Blob([exportCsv(table, options)], { type: "text/csv;charset=utf-8;" });
|
|
30
|
+
const url = URL.createObjectURL(blob);
|
|
31
|
+
const anchor = document.createElement("a");
|
|
32
|
+
anchor.href = url;
|
|
33
|
+
anchor.download = options.filename ?? "export.csv";
|
|
34
|
+
anchor.style.display = "none";
|
|
35
|
+
document.body.append(anchor);
|
|
36
|
+
anchor.click();
|
|
37
|
+
anchor.remove();
|
|
38
|
+
setTimeout(() => URL.revokeObjectURL(url));
|
|
60
39
|
};
|
|
61
|
-
|
|
40
|
+
//#endregion
|
|
62
41
|
export { downloadCsv, exportCsv };
|
|
63
|
-
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=csv.mjs.map
|
package/dist/js/csv.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.mjs","sources":["../../src/util/csv.ts"],"sourcesContent":[
|
|
1
|
+
{"version":3,"file":"csv.mjs","names":[],"sources":["../../src/util/csv.ts"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * CoreUI PRO data-grid util/csv.ts\n * License (https://coreui.io/pro/license/)\n * --------------------------------------------------------------------------\n */\n\nimport {\n columnsFor, formatterFor, headerFor, rowsFor, type ExportScope, type ExportTable\n} from './export-table'\n\nexport interface CsvOptions {\n scope?: ExportScope\n delimiter?: string\n bom?: boolean\n sanitize?: boolean\n}\n\nexport interface CsvDownloadOptions extends CsvOptions {\n filename?: string\n}\n\nexport type CsvTable = ExportTable\n\nconst escapeField = (value: string, delimiter: string): string =>\n /[\"\\r\\n]/.test(value) || value.includes(delimiter) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value\n\n// CSV formula injection: a leading =, +, -, @, tab or CR makes spreadsheets treat\n// the cell as a formula. Opt-in guard prefixes such fields with an apostrophe.\nconst sanitizeField = (value: string): string =>\n /^[=+\\-@\\t\\r]/.test(value) ? `'${value}` : value\n\nexport const exportCsv = (table: CsvTable, options: CsvOptions = {}): string => {\n const delimiter = options.delimiter ?? ','\n const columns = columnsFor(table)\n\n const process = (field: string) => escapeField(options.sanitize ? sanitizeField(field) : field, delimiter)\n const line = (fields: string[]) => fields.map(process).join(delimiter)\n\n const header = line(columns.map(column => headerFor(column)))\n const body = rowsFor(table, options.scope).map(row =>\n line(columns.map(column => {\n const value = row.getValue(column.id)\n const formatter = formatterFor(column)\n // Coerce: a formatter may return a number/null in plain-JS usage.\n return formatter ? String(formatter(value, row.original) ?? '') : String(value ?? '')\n }))\n )\n\n const csv = [header, ...body].join('\\r\\n')\n return options.bom ? `\\uFEFF${csv}` : csv\n}\n\nexport const downloadCsv = (table: CsvTable, options: CsvDownloadOptions = {}): void => {\n const blob = new Blob([exportCsv(table, options)], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = options.filename ?? 'export.csv'\n anchor.style.display = 'none'\n // Attach before clicking (older Firefox) and defer revoke (Safari race).\n document.body.append(anchor)\n anchor.click()\n anchor.remove()\n setTimeout(() => URL.revokeObjectURL(url))\n}\n"],"mappings":";;;;;;;;;;;;;AAwBA,MAAM,eAAe,OAAe,cAClC,UAAU,KAAK,KAAK,KAAK,MAAM,SAAS,SAAS,IAAI,IAAI,MAAM,QAAQ,MAAM,MAAI,EAAE,KAAK;AAI1F,MAAM,iBAAiB,UACrB,eAAe,KAAK,KAAK,IAAI,IAAI,UAAU;AAE7C,MAAa,aAAa,OAAiB,UAAsB,CAAC,MAAc;CAC9E,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,UAAU,WAAW,KAAK;CAEhC,MAAM,WAAW,UAAkB,YAAY,QAAQ,WAAW,cAAc,KAAK,IAAI,OAAO,SAAS;CACzG,MAAM,QAAQ,WAAqB,OAAO,IAAI,OAAO,CAAC,CAAC,KAAK,SAAS;CAYrE,MAAM,MAAM,CAVG,KAAK,QAAQ,KAAI,WAAU,UAAU,MAAM,CAAC,CAUzC,GAAG,GATR,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAI,QAC7C,KAAK,QAAQ,KAAI,WAAU;EACzB,MAAM,QAAQ,IAAI,SAAS,OAAO,EAAE;EACpC,MAAM,YAAY,aAAa,MAAM;EAErC,OAAO,YAAY,OAAO,UAAU,OAAO,IAAI,QAAQ,KAAK,EAAE,IAAI,OAAO,SAAS,EAAE;CACtF,CAAC,CAAC,CAGuB,CAAC,CAAC,CAAC,KAAK,MAAM;CACzC,OAAO,QAAQ,MAAM,SAAS,QAAQ;AACxC;AAEA,MAAa,eAAe,OAAiB,UAA8B,CAAC,MAAY;CACtF,MAAM,OAAO,IAAI,KAAK,CAAC,UAAU,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,0BAA0B,CAAC;CACtF,MAAM,MAAM,IAAI,gBAAgB,IAAI;CACpC,MAAM,SAAS,SAAS,cAAc,GAAG;CACzC,OAAO,OAAO;CACd,OAAO,WAAW,QAAQ,YAAY;CACtC,OAAO,MAAM,UAAU;CAEvB,SAAS,KAAK,OAAO,MAAM;CAC3B,OAAO,MAAM;CACb,OAAO,OAAO;CACd,iBAAiB,IAAI,gBAAgB,GAAG,CAAC;AAC3C"}
|