@coreui/data-grid 0.1.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/LICENSE +3 -0
- package/README.md +37 -0
- package/dist/css/data-grid.css +444 -0
- package/dist/css/data-grid.css.map +1 -0
- package/dist/css/data-grid.min.css +5 -0
- package/dist/css/data-grid.min.css.map +1 -0
- package/dist/js/csv.cjs +68 -0
- package/dist/js/csv.cjs.map +1 -0
- package/dist/js/csv.mjs +63 -0
- package/dist/js/csv.mjs.map +1 -0
- package/dist/js/data-grid.esm.js +9618 -0
- package/dist/js/data-grid.esm.js.map +1 -0
- package/dist/js/data-grid.esm.min.js +8 -0
- package/dist/js/data-grid.esm.min.js.map +1 -0
- package/dist/js/data-grid.js +9635 -0
- package/dist/js/data-grid.js.map +1 -0
- package/dist/js/data-grid.min.js +8 -0
- package/dist/js/data-grid.min.js.map +1 -0
- package/dist/js/data-grid.mjs +9618 -0
- package/dist/js/data-grid.mjs.map +1 -0
- package/dist/js/filters.cjs +143 -0
- package/dist/js/filters.cjs.map +1 -0
- package/dist/js/filters.mjs +137 -0
- package/dist/js/filters.mjs.map +1 -0
- package/dist/js/labels.cjs +76 -0
- package/dist/js/labels.cjs.map +1 -0
- package/dist/js/labels.mjs +71 -0
- package/dist/js/labels.mjs.map +1 -0
- package/dist/types/base-component.d.ts +19 -0
- package/dist/types/data-grid.d.ts +128 -0
- package/dist/types/dom/event-handler.d.ts +11 -0
- package/dist/types/dom/manipulator.d.ts +9 -0
- package/dist/types/engine/active-cell.d.ts +32 -0
- package/dist/types/engine/data-source.d.ts +19 -0
- package/dist/types/engine/scheduler.d.ts +11 -0
- package/dist/types/engine/table.d.ts +9 -0
- package/dist/types/engine/virtualizer.d.ts +21 -0
- package/dist/types/filters.d.mts +1 -0
- package/dist/types/filters.d.ts +13 -0
- package/dist/types/icons.d.ts +21 -0
- package/dist/types/index.d.mts +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/labels.d.mts +1 -0
- package/dist/types/labels.d.ts +9 -0
- package/dist/types/types.d.ts +262 -0
- package/dist/types/ui/body.d.ts +34 -0
- package/dist/types/ui/column-chooser.d.ts +27 -0
- package/dist/types/ui/editor.d.ts +8 -0
- package/dist/types/ui/filter-menu.d.ts +21 -0
- package/dist/types/ui/header.d.ts +50 -0
- package/dist/types/ui/loading.d.ts +12 -0
- package/dist/types/ui/menu.d.ts +17 -0
- package/dist/types/ui/pagination.d.ts +17 -0
- package/dist/types/ui/pinning.d.ts +17 -0
- package/dist/types/ui/toolbar.d.ts +34 -0
- package/dist/types/ui/tooltip.d.ts +10 -0
- package/dist/types/util/config.d.ts +11 -0
- package/dist/types/util/csv.d.mts +1 -0
- package/dist/types/util/csv.d.ts +19 -0
- package/dist/types/util/debounce.d.ts +7 -0
- package/dist/types/util/index.d.ts +10 -0
- package/dist/types/util/sanitizer.d.ts +11 -0
- package/package.json +147 -0
- package/scss/data-grid.scss +559 -0
- package/src/base-component.d.ts +19 -0
- package/src/base-component.js +90 -0
- package/src/data-grid.ts +2208 -0
- package/src/dom/data.js +59 -0
- package/src/dom/event-handler.d.ts +11 -0
- package/src/dom/event-handler.js +331 -0
- package/src/dom/manipulator.d.ts +9 -0
- package/src/dom/manipulator.js +75 -0
- package/src/engine/active-cell.ts +195 -0
- package/src/engine/data-source.ts +63 -0
- package/src/engine/scheduler.ts +42 -0
- package/src/engine/table.ts +122 -0
- package/src/engine/virtualizer.ts +57 -0
- package/src/filters.ts +176 -0
- package/src/icons.ts +60 -0
- package/src/index.ts +56 -0
- package/src/labels.ts +70 -0
- package/src/types.ts +334 -0
- package/src/ui/body.ts +348 -0
- package/src/ui/column-chooser.ts +183 -0
- package/src/ui/editor.ts +98 -0
- package/src/ui/filter-menu.ts +398 -0
- package/src/ui/header.ts +441 -0
- package/src/ui/loading.ts +39 -0
- package/src/ui/menu.ts +218 -0
- package/src/ui/pagination.ts +150 -0
- package/src/ui/pinning.ts +53 -0
- package/src/ui/toolbar.ts +144 -0
- package/src/ui/tooltip.ts +113 -0
- package/src/util/config.d.ts +11 -0
- package/src/util/config.js +69 -0
- package/src/util/csv.ts +85 -0
- package/src/util/debounce.ts +18 -0
- package/src/util/index.d.ts +10 -0
- package/src/util/index.js +310 -0
- package/src/util/sanitizer.d.ts +11 -0
- package/src/util/sanitizer.js +162 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../scss/data-grid.scss","dist/css/data-grid.css"],"names":[],"mappings":"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","sourcesContent":["/*!\n * CoreUI PRO data-grid.scss v0.1.0\n * License (https://coreui.io/pro/license/)\n */\n\n.data-grid {\n // The column menu is positioned against the grid root (it must escape the\n // viewport's overflow while staying inside the token scope).\n position: relative;\n\n // Component tokens. Everything resolves through CoreUI semantic variables,\n // so light/dark theming via [data-coreui-theme] works with no extra rules.\n --cui-data-grid-viewport-max-height: 30rem;\n --cui-data-grid-header-bg: var(--cui-body-bg, #fff);\n --cui-data-grid-header-shadow: inset 0 calc(-1 * var(--cui-border-width, 1px)) 0 var(--cui-border-color, #dee2e6);\n --cui-data-grid-select-cell-width: 2.5rem;\n --cui-data-grid-sorter-margin: .25rem;\n --cui-data-grid-sorter-opacity: .3;\n --cui-data-grid-spacing: .5rem;\n --cui-data-grid-resizer-width: .625rem;\n --cui-data-grid-resizer-grip-height: 60%;\n --cui-data-grid-resizer-grip-color: var(--cui-border-color, #dee2e6);\n --cui-data-grid-resizer-grip-color-hover: var(--cui-secondary-color, #6c757d);\n --cui-data-grid-pinned-border-width: var(--cui-border-width);\n --cui-data-grid-pinned-border-color: var(--cui-border-color, #dee2e6);\n --cui-data-grid-drop-indicator: var(--cui-primary, #321fdb);\n --cui-data-grid-menu-bg: var(--cui-body-bg, #fff);\n --cui-data-grid-menu-border-color: var(--cui-border-color, #dee2e6);\n --cui-data-grid-menu-shadow: var(--cui-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));\n --cui-data-grid-menu-min-width: 10rem;\n --cui-data-grid-menu-item-hover-bg: var(--cui-tertiary-bg, #f8f9fa);\n --cui-data-grid-loading-bg: rgba(var(--cui-body-bg-rgb, 255, 255, 255), .6);\n --cui-data-grid-pinned-bg: var(--cui-body-bg, #fff);\n --cui-data-grid-focus-ring-width: 2px;\n --cui-data-grid-focus-ring-color: var(--cui-primary, #321fdb);\n\n .data-grid-toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--cui-data-grid-spacing);\n align-items: center;\n min-height: 48px;\n padding: var(--cui-data-grid-spacing);\n border-bottom: var(--cui-border-width, 1px) solid var(--cui-border-color, #dee2e6);\n }\n\n .data-grid-toolbar-actions {\n display: flex;\n gap: .25rem;\n align-items: center;\n }\n\n .data-grid-toolbar-search {\n margin-inline-start: auto;\n }\n\n .data-grid-viewport {\n position: relative;\n max-height: var(--cui-data-grid-viewport-max-height);\n overflow-y: auto;\n // Windowed rendering resizes the spacer rows and recycles row elements on\n // every frame; browser scroll anchoring chases those mutations and keeps\n // adjusting scrollTop, which turns wheel scrolling into a feedback loop.\n overflow-anchor: none;\n }\n\n // Inline editing: the in-cell editor fills the cell; the popup layer hosts\n // rich editors (date pickers, selects) anchored over the cell.\n .data-grid-cell-editor {\n width: 100%;\n min-width: 4rem;\n }\n\n .data-grid-editor-popup {\n position: absolute;\n z-index: 4;\n padding: .25rem;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, .375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n }\n\n // cellNavigation: the roving-tabindex active cell. The ring is inset so the\n // sticky header and pinned columns don't clip it.\n [role=\"grid\"] :is(td, th):focus-visible {\n outline: var(--cui-data-grid-focus-ring-width) solid var(--cui-data-grid-focus-ring-color);\n outline-offset: calc(-1 * var(--cui-data-grid-focus-ring-width));\n }\n\n .data-grid-viewport:focus-visible {\n outline: 0;\n }\n\n .data-grid-header {\n position: sticky;\n top: 0;\n z-index: 2;\n background-color: var(--cui-data-grid-header-bg);\n box-shadow: var(--cui-data-grid-header-shadow);\n }\n\n // Header label row: fixed 48px with vertically centered content (height on a\n // table cell acts as a min; min-height is ignored on table-cell).\n .data-grid-header tr:not(.data-grid-filter-row) > th {\n height: 48px;\n vertical-align: middle;\n }\n\n .data-grid-filter-row > th {\n padding-top: 0;\n font-weight: normal;\n }\n\n .data-grid-header th[data-coreui-draggable] {\n cursor: grab;\n }\n\n .data-grid-header-cell {\n display: flex;\n align-items: center;\n gap: .25rem;\n }\n\n .data-grid-header-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n // Icon-only ghost buttons: square them by matching horizontal padding to\n // vertical (follows .btn / .btn-sm automatically) and collapsing the text\n // line-height so height follows the icon, not a 1.5em text line.\n .btn-ghost {\n --cui-btn-padding-x: var(--cui-btn-padding-y);\n --cui-btn-line-height: 1;\n }\n\n .data-grid-menu-button {\n margin-inline-start: auto;\n }\n\n .data-grid-menu {\n position: absolute;\n z-index: 4;\n min-width: var(--cui-data-grid-menu-min-width);\n padding: .25rem 0;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, .375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n }\n\n .data-grid-menu-item {\n display: flex;\n align-items: center;\n gap: .5rem;\n width: 100%;\n padding: .25rem .75rem;\n font: inherit;\n color: inherit;\n text-align: start;\n cursor: pointer;\n background: none;\n border: 0;\n\n &:hover,\n &:focus-visible {\n background-color: var(--cui-data-grid-menu-item-hover-bg);\n }\n\n // Disabled items stay focusable (aria-disabled, APG menu pattern) so the\n // roving arrow cycle can reach them.\n &[aria-disabled=\"true\"] {\n color: var(--cui-secondary-color, #6c757d);\n cursor: default;\n background: none;\n }\n }\n\n .data-grid-filter-menu {\n position: absolute;\n z-index: 4;\n display: flex;\n flex-direction: column;\n gap: .5rem;\n min-width: var(--cui-data-grid-menu-min-width);\n max-width: 18rem;\n padding: .75rem;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, .375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n\n > div {\n display: flex;\n flex-direction: column;\n gap: .5rem;\n }\n }\n\n .data-grid-filter-menu-condition {\n display: flex;\n flex-direction: column;\n gap: .25rem;\n }\n\n .data-grid-filter-menu-join {\n display: flex;\n gap: 1rem;\n\n label {\n display: flex;\n gap: .375rem;\n align-items: center;\n }\n }\n\n .data-grid-filter-menu-values {\n display: flex;\n flex-direction: column;\n gap: .25rem;\n max-height: 14rem;\n overflow-y: auto;\n }\n\n .data-grid-filter-menu-footer {\n display: flex;\n gap: .5rem;\n justify-content: flex-end;\n }\n\n .data-grid-column-chooser {\n position: absolute;\n z-index: 4;\n display: flex;\n flex-direction: column;\n gap: .5rem;\n min-width: var(--cui-data-grid-menu-min-width);\n max-width: 18rem;\n max-height: 20rem;\n padding: .75rem;\n overflow-y: auto;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, .375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n }\n\n .data-grid-column-chooser-option {\n display: flex;\n gap: .375rem;\n align-items: center;\n margin-bottom: 0;\n }\n\n .data-grid-column-chooser-footer {\n display: flex;\n gap: .5rem;\n justify-content: flex-end;\n padding-top: .25rem;\n margin-top: .25rem;\n border-top: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n }\n\n .data-grid-filter-button {\n position: relative;\n // Right-align the trailing controls as a group: the filter button takes the\n // auto margin (menu drops its own below) so filter and menu sit together at\n // the end, matching a menu-only header.\n margin-inline-start: auto;\n\n ~ .data-grid-menu-button {\n margin-inline-start: 0;\n }\n }\n\n // Active-filter indicator dot on the filter button.\n .data-grid-filter-button-filtered::after {\n position: absolute;\n inset-block-start: .125rem;\n inset-inline-end: .125rem;\n width: .375rem;\n height: .375rem;\n content: \"\";\n background-color: var(--cui-primary, #321fdb);\n border-radius: 50%;\n }\n\n .data-grid-menu-item-icon {\n display: inline-flex;\n opacity: .75;\n\n svg {\n width: 1em;\n height: 1em;\n }\n }\n\n .data-grid-menu-divider {\n height: var(--cui-border-width, 1px);\n margin: .25rem 0;\n background-color: var(--cui-data-grid-menu-border-color);\n }\n\n .data-grid-header .data-grid-dragging {\n opacity: .5;\n }\n\n .data-grid-header .data-grid-drop-target {\n box-shadow: inset .125rem 0 0 var(--cui-data-grid-drop-indicator);\n }\n\n .data-grid-select-cell {\n width: var(--cui-data-grid-select-cell-width);\n text-align: center;\n }\n\n .data-grid-sort-button {\n display: inline-flex;\n align-items: center;\n gap: var(--cui-data-grid-sorter-margin);\n padding: 0;\n font: inherit;\n color: inherit;\n cursor: pointer;\n user-select: none;\n background: none;\n border: 0;\n }\n\n .data-grid-sort-icon {\n display: inline-flex;\n font-size: .875em;\n opacity: 0;\n\n svg {\n width: 1em;\n height: 1em;\n }\n }\n\n // The active sort direction is always visible; the neutral (unsorted) icon is\n // hidden unless `sorterVisibility` opts it in (steadily via \"always\", or on\n // header hover/focus via \"hover\").\n .data-grid-sortable[aria-sort] .data-grid-sort-icon {\n opacity: 1;\n }\n\n &[data-coreui-sorter-visibility=\"always\"] .data-grid-sortable:not([aria-sort]) .data-grid-sort-icon {\n opacity: var(--cui-data-grid-sorter-opacity);\n }\n\n &[data-coreui-sorter-visibility=\"hover\"] .data-grid-sortable:not([aria-sort]):hover .data-grid-sort-icon,\n &[data-coreui-sorter-visibility=\"hover\"] .data-grid-sortable:not([aria-sort]):focus-within .data-grid-sort-icon {\n opacity: var(--cui-data-grid-sorter-opacity);\n }\n\n .data-grid-viewport > .table {\n margin-bottom: 0;\n table-layout: fixed;\n }\n\n // Body cells render on a single line and truncate with an ellipsis instead of\n // spilling their content across the fixed-layout column boundary onto the next\n // column. Matches the default of AG Grid / MUI X Data Grid and TanStack's\n // virtualized-table guidance, and keeps every row a uniform height for the\n // fixed-height virtualizer (wrapping would desync `estimateSize`). Pinned cells\n // are excluded so their shadow pseudo-element (painted outside the box via a\n // translate) isn't clipped; the select cell holds only a checkbox.\n .data-grid-viewport > .table > tbody > tr:not(.data-grid-empty) > td:not(.data-grid-select-cell):not(.data-grid-cell-pinned-left):not(.data-grid-cell-pinned-right) {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n // Widths applied to each header cell drive the column layout; letting the\n // table grow to its content (min-width keeps it filling a wide viewport)\n // turns a resize or a pin into horizontal scroll rather than squeezing\n // neighbours. Both features share this layout mode.\n &.data-grid-resizable,\n &.data-grid-pinned {\n .data-grid-viewport {\n overflow-x: auto;\n }\n\n .table {\n width: max-content;\n min-width: 100%;\n }\n }\n\n // A pinned th is already sticky (a positioned containing block for the\n // resizer), so only non-pinned header cells need explicit relative here.\n &.data-grid-resizable .data-grid-header th:not(.data-grid-cell-pinned-left):not(.data-grid-cell-pinned-right) {\n position: relative;\n }\n\n &.data-grid-pinned .table {\n // position: sticky is unreliable on collapsed-border tables; the grid opts\n // into separate borders so pinned cells stay put on horizontal scroll.\n border-collapse: separate;\n border-spacing: 0;\n }\n\n .data-grid-cell-pinned-left,\n .data-grid-cell-pinned-right {\n position: sticky;\n z-index: 1;\n background-color: var(--cui-data-grid-pinned-bg);\n }\n\n .data-grid-header .data-grid-cell-pinned-left,\n .data-grid-header .data-grid-cell-pinned-right {\n z-index: 3;\n }\n\n // Edge cells cast a shadow over the scrolling content. A pseudo-element is\n // used because the cell's own box-shadow carries the table striping accent.\n .data-grid-cell-pinned-left-last,\n .data-grid-cell-pinned-right-first {\n position: sticky;\n\n &::after {\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--cui-data-grid-pinned-border-width);\n pointer-events: none;\n content: \"\";\n }\n }\n\n .data-grid-cell-pinned-left-last::after {\n right: 0;\n background: var(--cui-data-grid-pinned-border-color);\n }\n\n .data-grid-cell-pinned-right-first::after {\n left: 0;\n background: var(--cui-data-grid-pinned-border-color);\n }\n\n .data-grid-resizer {\n position: absolute;\n top: 0;\n right: calc(-.5 * var(--cui-data-grid-resizer-width));\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--cui-data-grid-resizer-width);\n height: 100%;\n cursor: col-resize;\n touch-action: none;\n user-select: none;\n\n // Always-visible grip so the resizable edge is discoverable, not just a\n // bare hover target.\n &::after {\n width: 2px;\n height: var(--cui-data-grid-resizer-grip-height);\n content: \"\";\n background-color: var(--cui-data-grid-resizer-grip-color);\n transition: background-color .15s ease;\n }\n\n &:hover::after,\n &.data-grid-resizer-active::after {\n background-color: var(--cui-data-grid-resizer-grip-color-hover);\n }\n }\n\n .data-grid-spacer > td {\n padding: 0;\n border: 0;\n }\n\n // Spacer rows break `nth-of-type` striping, so striping inside the grid is\n // driven by the absolute row index (.data-grid-row-odd) instead.\n .data-grid-viewport > .table-striped > tbody > tr:nth-of-type(odd) > * {\n --cui-table-color-type: initial;\n --cui-table-bg-type: initial;\n }\n\n .data-grid-viewport > .table-striped > tbody > tr.data-grid-row-odd > * {\n --cui-table-color-type: var(--cui-table-striped-color);\n --cui-table-bg-type: var(--cui-table-striped-bg);\n }\n\n // The last row closes on the viewport edge (or the pagination border), so it\n // doesn't need its own separator line.\n .data-grid-viewport > .table > tbody > tr:last-child > * {\n border-bottom-width: 0;\n }\n\n .data-grid-loading {\n position: absolute;\n inset: 0;\n z-index: 3;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--cui-data-grid-loading-bg);\n }\n\n // Shared icon-button tooltip. position: fixed (set in JS) so it escapes the\n // viewport overflow; theme-inverted like CoreUI's own tooltip.\n .data-grid-tooltip {\n position: fixed;\n z-index: 1080;\n max-width: 12rem;\n padding: .25rem .5rem;\n font-size: .875rem;\n line-height: 1.4;\n color: var(--cui-body-bg, #fff);\n text-align: center;\n pointer-events: none;\n background-color: var(--cui-emphasis-color, #000);\n border-radius: var(--cui-border-radius, .375rem);\n }\n\n .data-grid-empty > td {\n padding: 2rem 1rem;\n color: var(--cui-secondary-color, #6c757d);\n text-align: center;\n }\n\n .data-grid-pagination {\n display: flex;\n // Wrap the page controls, count and page-size select onto multiple rows on\n // narrow viewports; without this the fixed row overflows and scrolls the page\n // instead of staying inside the grid.\n flex-wrap: wrap;\n gap: var(--cui-data-grid-spacing);\n align-items: center;\n min-height: 48px;\n padding: var(--cui-data-grid-spacing);\n border-top: var(--cui-border-width, 1px) solid var(--cui-border-color, #dee2e6);\n\n &.data-grid-pagination-top {\n border-top: 0;\n border-bottom: var(--cui-border-width, 1px) solid var(--cui-border-color, #dee2e6);\n }\n\n .pagination {\n margin-bottom: 0;\n }\n\n .data-grid-pagination-info {\n margin-inline-start: auto;\n color: var(--cui-secondary-color, #6c757d);\n }\n\n .form-select {\n width: auto;\n }\n }\n}\n","/*!\n * CoreUI PRO data-grid.scss v0.1.0\n * License (https://coreui.io/pro/license/)\n */\n.data-grid {\n position: relative;\n --cui-data-grid-viewport-max-height: 30rem;\n --cui-data-grid-header-bg: var(--cui-body-bg, #fff);\n --cui-data-grid-header-shadow: inset 0 calc(-1 * var(--cui-border-width, 1px)) 0 var(--cui-border-color, #dee2e6);\n --cui-data-grid-select-cell-width: 2.5rem;\n --cui-data-grid-sorter-margin: .25rem;\n --cui-data-grid-sorter-opacity: .3;\n --cui-data-grid-spacing: .5rem;\n --cui-data-grid-resizer-width: .625rem;\n --cui-data-grid-resizer-grip-height: 60%;\n --cui-data-grid-resizer-grip-color: var(--cui-border-color, #dee2e6);\n --cui-data-grid-resizer-grip-color-hover: var(--cui-secondary-color, #6c757d);\n --cui-data-grid-pinned-border-width: var(--cui-border-width);\n --cui-data-grid-pinned-border-color: var(--cui-border-color, #dee2e6);\n --cui-data-grid-drop-indicator: var(--cui-primary, #321fdb);\n --cui-data-grid-menu-bg: var(--cui-body-bg, #fff);\n --cui-data-grid-menu-border-color: var(--cui-border-color, #dee2e6);\n --cui-data-grid-menu-shadow: var(--cui-box-shadow, 0 .5rem 1rem rgba(0, 0, 0, .15));\n --cui-data-grid-menu-min-width: 10rem;\n --cui-data-grid-menu-item-hover-bg: var(--cui-tertiary-bg, #f8f9fa);\n --cui-data-grid-loading-bg: rgba(var(--cui-body-bg-rgb, 255, 255, 255), .6);\n --cui-data-grid-pinned-bg: var(--cui-body-bg, #fff);\n --cui-data-grid-focus-ring-width: 2px;\n --cui-data-grid-focus-ring-color: var(--cui-primary, #321fdb);\n}\n.data-grid .data-grid-toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--cui-data-grid-spacing);\n align-items: center;\n min-height: 48px;\n padding: var(--cui-data-grid-spacing);\n border-bottom: var(--cui-border-width, 1px) solid var(--cui-border-color, #dee2e6);\n}\n.data-grid .data-grid-toolbar-actions {\n display: flex;\n gap: 0.25rem;\n align-items: center;\n}\n.data-grid .data-grid-toolbar-search {\n -webkit-margin-start: auto;\n margin-inline-start: auto;\n}\n.data-grid .data-grid-viewport {\n position: relative;\n max-height: var(--cui-data-grid-viewport-max-height);\n overflow-y: auto;\n overflow-anchor: none;\n}\n.data-grid .data-grid-cell-editor {\n width: 100%;\n min-width: 4rem;\n}\n.data-grid .data-grid-editor-popup {\n position: absolute;\n z-index: 4;\n padding: 0.25rem;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, 0.375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n}\n.data-grid [role=grid] :is(td, th):focus-visible {\n outline: var(--cui-data-grid-focus-ring-width) solid var(--cui-data-grid-focus-ring-color);\n outline-offset: calc(-1 * var(--cui-data-grid-focus-ring-width));\n}\n.data-grid .data-grid-viewport:focus-visible {\n outline: 0;\n}\n.data-grid .data-grid-header {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 2;\n background-color: var(--cui-data-grid-header-bg);\n box-shadow: var(--cui-data-grid-header-shadow);\n}\n.data-grid .data-grid-header tr:not(.data-grid-filter-row) > th {\n height: 48px;\n vertical-align: middle;\n}\n.data-grid .data-grid-filter-row > th {\n padding-top: 0;\n font-weight: normal;\n}\n.data-grid .data-grid-header th[data-coreui-draggable] {\n cursor: -webkit-grab;\n cursor: grab;\n}\n.data-grid .data-grid-header-cell {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n.data-grid .data-grid-header-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.data-grid .btn-ghost {\n --cui-btn-padding-x: var(--cui-btn-padding-y);\n --cui-btn-line-height: 1;\n}\n.data-grid .data-grid-menu-button {\n -webkit-margin-start: auto;\n margin-inline-start: auto;\n}\n.data-grid .data-grid-menu {\n position: absolute;\n z-index: 4;\n min-width: var(--cui-data-grid-menu-min-width);\n padding: 0.25rem 0;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, 0.375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n}\n.data-grid .data-grid-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.25rem 0.75rem;\n font: inherit;\n color: inherit;\n text-align: start;\n cursor: pointer;\n background: none;\n border: 0;\n}\n.data-grid .data-grid-menu-item:hover, .data-grid .data-grid-menu-item:focus-visible {\n background-color: var(--cui-data-grid-menu-item-hover-bg);\n}\n.data-grid .data-grid-menu-item[aria-disabled=true] {\n color: var(--cui-secondary-color, #6c757d);\n cursor: default;\n background: none;\n}\n.data-grid .data-grid-filter-menu {\n position: absolute;\n z-index: 4;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n min-width: var(--cui-data-grid-menu-min-width);\n max-width: 18rem;\n padding: 0.75rem;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, 0.375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n}\n.data-grid .data-grid-filter-menu > div {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n.data-grid .data-grid-filter-menu-condition {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n.data-grid .data-grid-filter-menu-join {\n display: flex;\n gap: 1rem;\n}\n.data-grid .data-grid-filter-menu-join label {\n display: flex;\n gap: 0.375rem;\n align-items: center;\n}\n.data-grid .data-grid-filter-menu-values {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n max-height: 14rem;\n overflow-y: auto;\n}\n.data-grid .data-grid-filter-menu-footer {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n}\n.data-grid .data-grid-column-chooser {\n position: absolute;\n z-index: 4;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n min-width: var(--cui-data-grid-menu-min-width);\n max-width: 18rem;\n max-height: 20rem;\n padding: 0.75rem;\n overflow-y: auto;\n background-color: var(--cui-data-grid-menu-bg);\n border: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n border-radius: var(--cui-border-radius, 0.375rem);\n box-shadow: var(--cui-data-grid-menu-shadow);\n}\n.data-grid .data-grid-column-chooser-option {\n display: flex;\n gap: 0.375rem;\n align-items: center;\n margin-bottom: 0;\n}\n.data-grid .data-grid-column-chooser-footer {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n padding-top: 0.25rem;\n margin-top: 0.25rem;\n border-top: var(--cui-border-width, 1px) solid var(--cui-data-grid-menu-border-color);\n}\n.data-grid .data-grid-filter-button {\n position: relative;\n -webkit-margin-start: auto;\n margin-inline-start: auto;\n}\n.data-grid .data-grid-filter-button ~ .data-grid-menu-button {\n -webkit-margin-start: 0;\n margin-inline-start: 0;\n}\n.data-grid .data-grid-filter-button-filtered::after {\n position: absolute;\n inset-block-start: 0.125rem;\n inset-inline-end: 0.125rem;\n width: 0.375rem;\n height: 0.375rem;\n content: \"\";\n background-color: var(--cui-primary, #321fdb);\n border-radius: 50%;\n}\n.data-grid .data-grid-menu-item-icon {\n display: inline-flex;\n opacity: 0.75;\n}\n.data-grid .data-grid-menu-item-icon svg {\n width: 1em;\n height: 1em;\n}\n.data-grid .data-grid-menu-divider {\n height: var(--cui-border-width, 1px);\n margin: 0.25rem 0;\n background-color: var(--cui-data-grid-menu-border-color);\n}\n.data-grid .data-grid-header .data-grid-dragging {\n opacity: 0.5;\n}\n.data-grid .data-grid-header .data-grid-drop-target {\n box-shadow: inset 0.125rem 0 0 var(--cui-data-grid-drop-indicator);\n}\n.data-grid .data-grid-select-cell {\n width: var(--cui-data-grid-select-cell-width);\n text-align: center;\n}\n.data-grid .data-grid-sort-button {\n display: inline-flex;\n align-items: center;\n gap: var(--cui-data-grid-sorter-margin);\n padding: 0;\n font: inherit;\n color: inherit;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n background: none;\n border: 0;\n}\n.data-grid .data-grid-sort-icon {\n display: inline-flex;\n font-size: 0.875em;\n opacity: 0;\n}\n.data-grid .data-grid-sort-icon svg {\n width: 1em;\n height: 1em;\n}\n.data-grid .data-grid-sortable[aria-sort] .data-grid-sort-icon {\n opacity: 1;\n}\n.data-grid[data-coreui-sorter-visibility=always] .data-grid-sortable:not([aria-sort]) .data-grid-sort-icon {\n opacity: var(--cui-data-grid-sorter-opacity);\n}\n.data-grid[data-coreui-sorter-visibility=hover] .data-grid-sortable:not([aria-sort]):hover .data-grid-sort-icon, .data-grid[data-coreui-sorter-visibility=hover] .data-grid-sortable:not([aria-sort]):focus-within .data-grid-sort-icon {\n opacity: var(--cui-data-grid-sorter-opacity);\n}\n.data-grid .data-grid-viewport > .table {\n margin-bottom: 0;\n table-layout: fixed;\n}\n.data-grid .data-grid-viewport > .table > tbody > tr:not(.data-grid-empty) > td:not(.data-grid-select-cell):not(.data-grid-cell-pinned-left):not(.data-grid-cell-pinned-right) {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.data-grid.data-grid-resizable .data-grid-viewport, .data-grid.data-grid-pinned .data-grid-viewport {\n overflow-x: auto;\n}\n.data-grid.data-grid-resizable .table, .data-grid.data-grid-pinned .table {\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n min-width: 100%;\n}\n.data-grid.data-grid-resizable .data-grid-header th:not(.data-grid-cell-pinned-left):not(.data-grid-cell-pinned-right) {\n position: relative;\n}\n.data-grid.data-grid-pinned .table {\n border-collapse: separate;\n border-spacing: 0;\n}\n.data-grid .data-grid-cell-pinned-left,\n.data-grid .data-grid-cell-pinned-right {\n position: -webkit-sticky;\n position: sticky;\n z-index: 1;\n background-color: var(--cui-data-grid-pinned-bg);\n}\n.data-grid .data-grid-header .data-grid-cell-pinned-left,\n.data-grid .data-grid-header .data-grid-cell-pinned-right {\n z-index: 3;\n}\n.data-grid .data-grid-cell-pinned-left-last,\n.data-grid .data-grid-cell-pinned-right-first {\n position: -webkit-sticky;\n position: sticky;\n}\n.data-grid .data-grid-cell-pinned-left-last::after,\n.data-grid .data-grid-cell-pinned-right-first::after {\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--cui-data-grid-pinned-border-width);\n pointer-events: none;\n content: \"\";\n}\n.data-grid .data-grid-cell-pinned-left-last::after {\n right: 0;\n background: var(--cui-data-grid-pinned-border-color);\n}\n.data-grid .data-grid-cell-pinned-right-first::after {\n left: 0;\n background: var(--cui-data-grid-pinned-border-color);\n}\n.data-grid .data-grid-resizer {\n position: absolute;\n top: 0;\n right: calc(-0.5 * var(--cui-data-grid-resizer-width));\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--cui-data-grid-resizer-width);\n height: 100%;\n cursor: col-resize;\n touch-action: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.data-grid .data-grid-resizer::after {\n width: 2px;\n height: var(--cui-data-grid-resizer-grip-height);\n content: \"\";\n background-color: var(--cui-data-grid-resizer-grip-color);\n transition: background-color 0.15s ease;\n}\n.data-grid .data-grid-resizer:hover::after, .data-grid .data-grid-resizer.data-grid-resizer-active::after {\n background-color: var(--cui-data-grid-resizer-grip-color-hover);\n}\n.data-grid .data-grid-spacer > td {\n padding: 0;\n border: 0;\n}\n.data-grid .data-grid-viewport > .table-striped > tbody > tr:nth-of-type(odd) > * {\n --cui-table-color-type: initial;\n --cui-table-bg-type: initial;\n}\n.data-grid .data-grid-viewport > .table-striped > tbody > tr.data-grid-row-odd > * {\n --cui-table-color-type: var(--cui-table-striped-color);\n --cui-table-bg-type: var(--cui-table-striped-bg);\n}\n.data-grid .data-grid-viewport > .table > tbody > tr:last-child > * {\n border-bottom-width: 0;\n}\n.data-grid .data-grid-loading {\n position: absolute;\n inset: 0;\n z-index: 3;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--cui-data-grid-loading-bg);\n}\n.data-grid .data-grid-tooltip {\n position: fixed;\n z-index: 1080;\n max-width: 12rem;\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.4;\n color: var(--cui-body-bg, #fff);\n text-align: center;\n pointer-events: none;\n background-color: var(--cui-emphasis-color, #000);\n border-radius: var(--cui-border-radius, 0.375rem);\n}\n.data-grid .data-grid-empty > td {\n padding: 2rem 1rem;\n color: var(--cui-secondary-color, #6c757d);\n text-align: center;\n}\n.data-grid .data-grid-pagination {\n display: flex;\n flex-wrap: wrap;\n gap: var(--cui-data-grid-spacing);\n align-items: center;\n min-height: 48px;\n padding: var(--cui-data-grid-spacing);\n border-top: var(--cui-border-width, 1px) solid var(--cui-border-color, #dee2e6);\n}\n.data-grid .data-grid-pagination.data-grid-pagination-top {\n border-top: 0;\n border-bottom: var(--cui-border-width, 1px) solid var(--cui-border-color, #dee2e6);\n}\n.data-grid .data-grid-pagination .pagination {\n margin-bottom: 0;\n}\n.data-grid .data-grid-pagination .data-grid-pagination-info {\n -webkit-margin-start: auto;\n margin-inline-start: auto;\n color: var(--cui-secondary-color, #6c757d);\n}\n.data-grid .data-grid-pagination .form-select {\n width: auto;\n}\n\n/*# sourceMappingURL=data-grid.css.map */"]}
|
package/dist/js/csv.cjs
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* CoreUI PRO data-grid v0.1.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
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* --------------------------------------------------------------------------
|
|
12
|
+
* CoreUI PRO data-grid util/csv.ts
|
|
13
|
+
* License (https://coreui.io/pro/license/)
|
|
14
|
+
* --------------------------------------------------------------------------
|
|
15
|
+
*/
|
|
16
|
+
const escapeField = (value, delimiter) => /["\r\n]/.test(value) || value.includes(delimiter) ? `"${value.replace(/"/g, '""')}"` : value;
|
|
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.
|
|
19
|
+
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
|
+
const exportCsv = (table, options = {}) => {
|
|
30
|
+
var _a;
|
|
31
|
+
const delimiter = (_a = options.delimiter) !== null && _a !== void 0 ? _a : ',';
|
|
32
|
+
// Export follows the rendered layout: pinning, column order and visibility.
|
|
33
|
+
const columns = [
|
|
34
|
+
...table.getLeftVisibleLeafColumns(),
|
|
35
|
+
...table.getCenterVisibleLeafColumns(),
|
|
36
|
+
...table.getRightVisibleLeafColumns()
|
|
37
|
+
];
|
|
38
|
+
const process = (field) => escapeField(options.sanitize ? sanitizeField(field) : field, delimiter);
|
|
39
|
+
const line = (fields) => fields.map(process).join(delimiter);
|
|
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;
|
|
50
|
+
};
|
|
51
|
+
const downloadCsv = (table, options = {}) => {
|
|
52
|
+
var _a;
|
|
53
|
+
const blob = new Blob([exportCsv(table, options)], { type: 'text/csv;charset=utf-8;' });
|
|
54
|
+
const url = URL.createObjectURL(blob);
|
|
55
|
+
const anchor = document.createElement('a');
|
|
56
|
+
anchor.href = url;
|
|
57
|
+
anchor.download = (_a = options.filename) !== null && _a !== void 0 ? _a : 'export.csv';
|
|
58
|
+
anchor.style.display = 'none';
|
|
59
|
+
// Attach before clicking (older Firefox) and defer revoke (Safari race).
|
|
60
|
+
document.body.append(anchor);
|
|
61
|
+
anchor.click();
|
|
62
|
+
anchor.remove();
|
|
63
|
+
setTimeout(() => URL.revokeObjectURL(url));
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
exports.downloadCsv = downloadCsv;
|
|
67
|
+
exports.exportCsv = exportCsv;
|
|
68
|
+
//# sourceMappingURL=csv.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.cjs","sources":["../../src/util/csv.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/js/csv.mjs
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* CoreUI PRO data-grid v0.1.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
|
+
/**
|
|
7
|
+
* --------------------------------------------------------------------------
|
|
8
|
+
* CoreUI PRO data-grid util/csv.ts
|
|
9
|
+
* License (https://coreui.io/pro/license/)
|
|
10
|
+
* --------------------------------------------------------------------------
|
|
11
|
+
*/
|
|
12
|
+
const escapeField = (value, delimiter) => /["\r\n]/.test(value) || value.includes(delimiter) ? `"${value.replace(/"/g, '""')}"` : value;
|
|
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.
|
|
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
|
+
const exportCsv = (table, options = {}) => {
|
|
26
|
+
var _a;
|
|
27
|
+
const delimiter = (_a = options.delimiter) !== null && _a !== void 0 ? _a : ',';
|
|
28
|
+
// Export follows the rendered layout: pinning, column order and visibility.
|
|
29
|
+
const columns = [
|
|
30
|
+
...table.getLeftVisibleLeafColumns(),
|
|
31
|
+
...table.getCenterVisibleLeafColumns(),
|
|
32
|
+
...table.getRightVisibleLeafColumns()
|
|
33
|
+
];
|
|
34
|
+
const process = (field) => escapeField(options.sanitize ? sanitizeField(field) : field, delimiter);
|
|
35
|
+
const line = (fields) => fields.map(process).join(delimiter);
|
|
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;
|
|
46
|
+
};
|
|
47
|
+
const downloadCsv = (table, options = {}) => {
|
|
48
|
+
var _a;
|
|
49
|
+
const blob = new Blob([exportCsv(table, options)], { type: 'text/csv;charset=utf-8;' });
|
|
50
|
+
const url = URL.createObjectURL(blob);
|
|
51
|
+
const anchor = document.createElement('a');
|
|
52
|
+
anchor.href = url;
|
|
53
|
+
anchor.download = (_a = options.filename) !== null && _a !== void 0 ? _a : 'export.csv';
|
|
54
|
+
anchor.style.display = 'none';
|
|
55
|
+
// Attach before clicking (older Firefox) and defer revoke (Safari race).
|
|
56
|
+
document.body.append(anchor);
|
|
57
|
+
anchor.click();
|
|
58
|
+
anchor.remove();
|
|
59
|
+
setTimeout(() => URL.revokeObjectURL(url));
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export { downloadCsv, exportCsv };
|
|
63
|
+
//# sourceMappingURL=csv.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csv.mjs","sources":["../../src/util/csv.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|