@svgrid/enterprise 3.0.2 → 3.0.3
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 +94 -24
- package/README.md +36 -4
- package/dist/SvAdvancedFilter.svelte +1 -1
- package/dist/SvAlertsManager.svelte +2 -1
- package/dist/SvBoard.svelte +2 -1
- package/dist/SvExportMenu.svelte +4 -1
- package/dist/SvExportMenu.svelte.d.ts +0 -13
- package/dist/SvExpressionEditor.svelte +3 -3
- package/dist/SvFormulaBar.svelte +94 -20
- package/dist/SvFormulaBar.svelte.d.ts +7 -0
- package/dist/SvGridAlerts.svelte +49 -9
- package/dist/SvGridBoard.svelte +13 -8
- package/dist/SvGridBulkEditDrawer.svelte +26 -2
- package/dist/SvGridEditPanel.svelte +3 -0
- package/dist/SvGridScheduler.svelte +69 -40
- package/dist/SvGridSelectionBar.svelte +10 -3
- package/dist/SvPivotDesigner.svelte +198 -40
- package/dist/SvPivotDesigner.svelte.d.ts +27 -20
- package/dist/SvSheet.svelte +4043 -243
- package/dist/SvSheet.svelte.d.ts +76 -3
- package/dist/SvSheetChartSetup.svelte +151 -0
- package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
- package/dist/SvSheetComment.svelte +216 -31
- package/dist/SvSheetComment.svelte.d.ts +11 -11
- package/dist/SvSheetConditionalFormat.svelte +28 -31
- package/dist/SvSheetDataValidation.svelte +66 -42
- package/dist/SvSheetEditRanges.svelte +217 -0
- package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
- package/dist/SvSheetErrors.svelte +125 -0
- package/dist/SvSheetErrors.svelte.d.ts +20 -0
- package/dist/SvSheetEvaluate.svelte +133 -0
- package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
- package/dist/SvSheetFilterMenu.svelte +137 -34
- package/dist/SvSheetFilterMenu.svelte.d.ts +5 -0
- package/dist/SvSheetFindReplace.svelte +19 -19
- package/dist/SvSheetFormatCells.svelte +125 -81
- package/dist/SvSheetGoalSeek.svelte +17 -16
- package/dist/SvSheetInsertFunction.svelte +15 -13
- package/dist/SvSheetIteration.svelte +81 -0
- package/dist/SvSheetIteration.svelte.d.ts +10 -0
- package/dist/SvSheetLink.svelte +99 -0
- package/dist/SvSheetLink.svelte.d.ts +17 -0
- package/dist/SvSheetListPicker.svelte +4 -2
- package/dist/SvSheetListPicker.svelte.d.ts +0 -6
- package/dist/SvSheetManageRules.svelte +20 -18
- package/dist/SvSheetNameManager.svelte +17 -15
- package/dist/SvSheetPageSetup.svelte +159 -0
- package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
- package/dist/SvSheetPasteSpecial.svelte +22 -20
- package/dist/SvSheetPivot.svelte +220 -0
- package/dist/SvSheetPivot.svelte.d.ts +21 -0
- package/dist/SvSheetProtectSheet.svelte +81 -0
- package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
- package/dist/SvSheetRemoveDuplicates.svelte +13 -10
- package/dist/SvSheetRibbon.svelte +104 -51
- package/dist/SvSheetSizeDialog.svelte +4 -2
- package/dist/SvSheetSort.svelte +218 -0
- package/dist/SvSheetSort.svelte.d.ts +28 -0
- package/dist/SvSheetSparklines.svelte +135 -0
- package/dist/SvSheetSparklines.svelte.d.ts +14 -0
- package/dist/SvSheetTable.svelte +160 -0
- package/dist/SvSheetTable.svelte.d.ts +24 -0
- package/dist/SvSheetTabs.svelte +161 -31
- package/dist/SvSheetTabs.svelte.d.ts +22 -8
- package/dist/SvSheetTextToColumns.svelte +20 -20
- package/dist/SvSheetValidationAlert.svelte +8 -6
- package/dist/advanced-filter-enable.js +1 -1
- package/dist/alerts/alert-engine.d.ts +6 -0
- package/dist/alerts/alert-engine.js +21 -4
- package/dist/alerts/alert-formats.js +2 -0
- package/dist/alerts/alert-types.d.ts +1 -1
- package/dist/alerts.d.ts +1 -1
- package/dist/alerts.js +2 -2
- package/dist/board.js +2 -2
- package/dist/bulk-edit.d.ts +3 -1
- package/dist/bulk-edit.js +1 -1
- package/dist/cdn/svgrid-enterprise.svelte-external.js +39827 -16429
- package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
- package/dist/designer/assets/{SvChartMenu-D9hEeHar.js → SvChartMenu-BDoeqGz6.js} +1 -1
- package/dist/designer/assets/{SvDateTimePicker-DARvKUL2.js → SvDateTimePicker-DCPg7WGN.js} +1 -1
- package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
- package/dist/designer/assets/{SvGridChart-B8j1SSy3.js → SvGridChart-Cy1ATrWh.js} +2 -2
- package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
- package/dist/designer/assets/{SvGridChartPanel-pT6ITc2P.js → SvGridChartPanel-CATdVc9X.js} +3 -3
- package/dist/designer/assets/{SvGridChartView-bg281UA1.js → SvGridChartView-CmsZtCED.js} +1 -1
- package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
- package/dist/designer/assets/{SvTabs-UFCMTHXS.js → SvTabs-2mHC6oaz.js} +1 -1
- package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
- package/dist/designer/assets/{chart-cIPUsbM5.js → chart-Cn7MnNqA.js} +1 -1
- package/dist/designer/assets/{chart-panel-messages-DtTxpBUU.js → chart-panel-messages-Dz7PTIqT.js} +1 -1
- package/dist/designer/assets/{chart-summary-Czu_5epb.js → chart-summary-BD1qYB2R.js} +1 -1
- package/dist/designer/assets/{chart-trend-D5I5VEe8.js → chart-trend-B8xr5LuD.js} +1 -1
- package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
- package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
- package/dist/designer/assets/{focus-trap-CAreAhlU.js → focus-trap-V2-6Fy9I.js} +1 -1
- package/dist/designer/assets/{index-DwU7CAMm.js → index-D5bVbuzI.js} +317 -315
- package/dist/designer/assets/index-_JVFxt02.css +1 -0
- package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
- package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
- package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
- package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
- package/dist/designer/index.html +17 -16
- package/dist/export-pdf.d.ts +75 -0
- package/dist/export-pdf.js +216 -15
- package/dist/export.js +10 -2
- package/dist/gantt/SvGridGantt.svelte +2890 -0
- package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
- package/dist/gantt/gantt-config.d.ts +73 -0
- package/dist/gantt/gantt-config.js +1 -0
- package/dist/gantt/gantt-critical-path.d.ts +67 -0
- package/dist/gantt/gantt-critical-path.js +207 -0
- package/dist/gantt/gantt-model.d.ts +257 -0
- package/dist/gantt/gantt-model.js +651 -0
- package/dist/gantt/gantt-resources.d.ts +59 -0
- package/dist/gantt/gantt-resources.js +71 -0
- package/dist/gantt/gantt.d.ts +7 -0
- package/dist/gantt/gantt.js +36 -0
- package/dist/gantt/index.d.ts +15 -0
- package/dist/gantt/index.js +22 -0
- package/dist/gantt/timeline-arrows.d.ts +102 -0
- package/dist/gantt/timeline-arrows.js +181 -0
- package/dist/import.d.ts +2 -2
- package/dist/import.js +1 -1
- package/dist/index.d.ts +34 -7
- package/dist/index.js +44 -7
- package/dist/install.js +8 -1
- package/dist/license-core.d.ts +17 -1
- package/dist/license-core.js +16 -5
- package/dist/license.d.ts +18 -2
- package/dist/license.js +71 -6
- package/dist/node/studio.js +140 -8
- package/dist/pivot-enable.js +2 -2
- package/dist/scheduler-dependencies.d.ts +35 -0
- package/dist/scheduler-dependencies.js +36 -1
- package/dist/scheduler.js +2 -2
- package/dist/selection-bar.js +2 -2
- package/dist/server/SvGroupCell.svelte +213 -0
- package/dist/server/SvGroupCell.svelte.d.ts +62 -0
- package/dist/server/SvRowGroupPanel.svelte +322 -0
- package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
- package/dist/server/enable.d.ts +17 -0
- package/dist/server/enable.js +49 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.js +24 -0
- package/dist/server/messages.d.ts +45 -0
- package/dist/server/messages.js +35 -0
- package/dist/server/server-group-model.d.ts +104 -0
- package/dist/server/server-group-model.js +272 -0
- package/dist/server/server-pivot.d.ts +46 -0
- package/dist/server/server-pivot.js +57 -0
- package/dist/server/server-row-model.d.ts +547 -0
- package/dist/server/server-row-model.js +1551 -0
- package/dist/server/server-selection.d.ts +99 -0
- package/dist/server/server-selection.js +215 -0
- package/dist/server/svgrid-adapter.d.ts +155 -0
- package/dist/server/svgrid-adapter.js +202 -0
- package/dist/sheet/ast.d.ts +45 -1
- package/dist/sheet/ast.js +14 -0
- package/dist/sheet/auto-filter.d.ts +58 -4
- package/dist/sheet/auto-filter.js +159 -11
- package/dist/sheet/autocomplete.d.ts +9 -0
- package/dist/sheet/autocomplete.js +90 -4
- package/dist/sheet/cell-images.d.ts +39 -0
- package/dist/sheet/cell-images.js +90 -0
- package/dist/sheet/cell-types.d.ts +58 -0
- package/dist/sheet/cell-types.js +96 -0
- package/dist/sheet/coerce.d.ts +40 -0
- package/dist/sheet/coerce.js +170 -3
- package/dist/sheet/comments.d.ts +43 -9
- package/dist/sheet/comments.js +85 -27
- package/dist/sheet/conditional-formats.d.ts +29 -6
- package/dist/sheet/conditional-formats.js +37 -12
- package/dist/sheet/csv.d.ts +32 -0
- package/dist/sheet/csv.js +158 -0
- package/dist/sheet/culture.d.ts +87 -0
- package/dist/sheet/culture.js +247 -0
- package/dist/sheet/delta.d.ts +102 -0
- package/dist/sheet/delta.js +203 -0
- package/dist/sheet/deps.d.ts +45 -1
- package/dist/sheet/deps.js +77 -2
- package/dist/sheet/document.d.ts +106 -4
- package/dist/sheet/document.js +204 -3
- package/dist/sheet/engine.d.ts +67 -0
- package/dist/sheet/engine.js +19 -0
- package/dist/sheet/entry.d.ts +8 -4
- package/dist/sheet/entry.js +171 -21
- package/dist/sheet/error-check.d.ts +49 -0
- package/dist/sheet/error-check.js +83 -0
- package/dist/sheet/evaluate-steps.d.ts +48 -0
- package/dist/sheet/evaluate-steps.js +196 -0
- package/dist/sheet/evaluate.d.ts +67 -0
- package/dist/sheet/evaluate.js +725 -13
- package/dist/sheet/filter-files.d.ts +37 -0
- package/dist/sheet/filter-files.js +465 -0
- package/dist/sheet/format-store.d.ts +15 -0
- package/dist/sheet/format-store.js +11 -1
- package/dist/sheet/from-rows.d.ts +14 -0
- package/dist/sheet/from-rows.js +50 -0
- package/dist/sheet/function-catalog.d.ts +1 -1
- package/dist/sheet/function-catalog.js +296 -5
- package/dist/sheet/functions.js +363 -91
- package/dist/sheet/index.d.ts +35 -8
- package/dist/sheet/index.js +35 -8
- package/dist/sheet/links.d.ts +57 -0
- package/dist/sheet/links.js +174 -0
- package/dist/sheet/messages.d.ts +778 -0
- package/dist/sheet/messages.js +806 -0
- package/dist/sheet/number-format.d.ts +52 -5
- package/dist/sheet/number-format.js +465 -68
- package/dist/sheet/objects.d.ts +106 -0
- package/dist/sheet/objects.js +149 -0
- package/dist/sheet/ods-document.d.ts +44 -0
- package/dist/sheet/ods-document.js +1275 -0
- package/dist/sheet/open-file.d.ts +26 -0
- package/dist/sheet/open-file.js +56 -0
- package/dist/sheet/outline.d.ts +82 -0
- package/dist/sheet/outline.js +228 -0
- package/dist/sheet/packs/array.d.ts +16 -0
- package/dist/sheet/packs/array.js +172 -0
- package/dist/sheet/packs/database.d.ts +42 -0
- package/dist/sheet/packs/database.js +142 -0
- package/dist/sheet/packs/engineering.d.ts +2 -0
- package/dist/sheet/packs/engineering.js +296 -0
- package/dist/sheet/packs/financial.d.ts +5 -0
- package/dist/sheet/packs/financial.js +220 -0
- package/dist/sheet/packs/math-stats.d.ts +2 -0
- package/dist/sheet/packs/math-stats.js +372 -0
- package/dist/sheet/packs/special.d.ts +44 -0
- package/dist/sheet/packs/special.js +187 -0
- package/dist/sheet/packs/stats-dist.d.ts +2 -0
- package/dist/sheet/packs/stats-dist.js +785 -0
- package/dist/sheet/packs/text-date.d.ts +2 -0
- package/dist/sheet/packs/text-date.js +332 -0
- package/dist/sheet/packs/trig.d.ts +2 -0
- package/dist/sheet/packs/trig.js +73 -0
- package/dist/sheet/page-setup.d.ts +73 -0
- package/dist/sheet/page-setup.js +73 -0
- package/dist/sheet/parse.js +42 -10
- package/dist/sheet/paste-special.d.ts +22 -0
- package/dist/sheet/paste-special.js +14 -5
- package/dist/sheet/pivot-range.d.ts +160 -0
- package/dist/sheet/pivot-range.js +333 -0
- package/dist/sheet/presence.d.ts +73 -0
- package/dist/sheet/presence.js +79 -0
- package/dist/sheet/print.d.ts +104 -0
- package/dist/sheet/print.js +169 -0
- package/dist/sheet/protection.d.ts +55 -1
- package/dist/sheet/protection.js +55 -2
- package/dist/sheet/rects.d.ts +1 -1
- package/dist/sheet/refs.d.ts +48 -0
- package/dist/sheet/refs.js +155 -8
- package/dist/sheet/ribbon-icons.d.ts +1 -1
- package/dist/sheet/ribbon-icons.js +186 -0
- package/dist/sheet/ribbon.d.ts +1 -1
- package/dist/sheet/ribbon.js +324 -23
- package/dist/sheet/sheet-kinds.d.ts +74 -0
- package/dist/sheet/sheet-kinds.js +91 -0
- package/dist/sheet/shortcuts.d.ts +13 -3
- package/dist/sheet/shortcuts.js +63 -12
- package/dist/sheet/sort.d.ts +51 -0
- package/dist/sheet/sort.js +107 -0
- package/dist/sheet/sparklines.d.ts +111 -0
- package/dist/sheet/sparklines.js +204 -0
- package/dist/sheet/table-styles.d.ts +74 -0
- package/dist/sheet/table-styles.js +152 -0
- package/dist/sheet/tables.d.ts +19 -0
- package/dist/sheet/tables.js +31 -0
- package/dist/sheet/tokenize.d.ts +18 -1
- package/dist/sheet/tokenize.js +60 -9
- package/dist/sheet/validation.d.ts +16 -0
- package/dist/sheet/validation.js +37 -0
- package/dist/sheet/workbook.d.ts +148 -3
- package/dist/sheet/workbook.js +742 -31
- package/dist/sheet/xls-cfb.d.ts +32 -0
- package/dist/sheet/xls-cfb.js +290 -0
- package/dist/sheet/xls-document.d.ts +10 -0
- package/dist/sheet/xls-document.js +1243 -0
- package/dist/sheet/xls-formula.d.ts +40 -0
- package/dist/sheet/xls-formula.js +569 -0
- package/dist/sheet/xlsx-document.d.ts +108 -0
- package/dist/sheet/xlsx-document.js +1849 -0
- package/dist/sheet/xlsx-drawing.d.ts +99 -0
- package/dist/sheet/xlsx-drawing.js +420 -0
- package/dist/sheet-enable.js +6 -7
- package/dist/sheet-text.d.ts +7 -0
- package/dist/sheet-text.js +29 -0
- package/dist/sources/auth-supabase.js +2 -2
- package/dist/sources/realtime-supabase.js +2 -2
- package/dist/sources/rest.d.ts +6 -2
- package/dist/sources/rest.js +42 -7
- package/dist/sources/supabase.d.ts +10 -1
- package/dist/sources/supabase.js +73 -40
- package/dist/studio/emit-project.js +14 -1
- package/dist/studio/index.js +1 -1
- package/dist/studio/project.d.ts +11 -2
- package/dist/studio/project.js +5 -2
- package/dist/studio/ui-components.generated.js +107 -2
- package/dist/sveltekit/in-memory.d.ts +2 -2
- package/dist/sveltekit/in-memory.js +125 -4
- package/dist/sveltekit/index.d.ts +1 -1
- package/dist/sveltekit/index.js +1 -1
- package/dist/sveltekit/query-plan.d.ts +50 -4
- package/dist/sveltekit/query-plan.js +25 -3
- package/dist/sveltekit/sql-source.d.ts +6 -0
- package/dist/sveltekit/sql-source.js +34 -6
- package/dist/sveltekit/sql.d.ts +31 -0
- package/dist/sveltekit/sql.js +135 -25
- package/dist/sveltekit/transport.d.ts +10 -2
- package/dist/sveltekit/transport.js +30 -6
- package/dist/upgrade-prompt.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/watermark.js +35 -2
- package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
- package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
- package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
- package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
- package/dist/wc/SvField-B_kurx_P.js +149 -0
- package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
- package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
- package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
- package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
- package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
- package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
- package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
- package/dist/wc/SvModal-DrfOYYyX.js +189 -0
- package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
- package/dist/wc/chart-6OXlybVT.js +4341 -0
- package/dist/wc/chart-export-CeSADGfi.js +135 -0
- package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
- package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
- package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
- package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
- package/dist/wc/client-DQIzjDBG.js +3064 -0
- package/dist/wc/column-resize-DUPgynvc.js +101 -0
- package/dist/wc/date-format-DS-z_h9v.js +1130 -0
- package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
- package/dist/wc/editor-contract-peBDxir_.js +22 -0
- package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
- package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
- package/dist/wc/list-option-DrRyivWp.js +82 -0
- package/dist/wc/popover-WsGlvtQv.js +69 -0
- package/dist/wc/positioning-BiKLfu1E.js +112 -0
- package/dist/wc/react.d.ts +41 -0
- package/dist/wc/react.js +90 -0
- package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
- package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
- package/dist/wc/row-resize-limG_N1z.js +111 -0
- package/dist/wc/sv-sheet-element.d.ts +97 -0
- package/dist/wc/sv-sheet-element.js +44213 -0
- package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
- package/dist/wc/validate-BqDthkNr.js +88 -0
- package/dist/wc/vue.d.ts +31 -0
- package/dist/wc/vue.js +75 -0
- package/package.json +30 -5
- package/dist/designer/assets/GridMenus-BlsvL_aU.js +0 -8
- package/dist/designer/assets/SvGridCellEditor-C7uQXYds.js +0 -4
- package/dist/designer/assets/SvGridChartBuilder-kvyIU_Rl.js +0 -1
- package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
- package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
- package/dist/designer/assets/index-CMFgAoVV.css +0 -1
- package/dist/designer/assets/row-resize-DLktcqUK.js +0 -1
- package/dist/designer/assets/src-EdI3Xqds.js +0 -58
- package/dist/designer/assets/validate-h-aslRV9.js +0 -1
package/dist/export-pdf.js
CHANGED
|
@@ -59,6 +59,96 @@ export function registerPdfFonts(pdfMake, vfsModule) {
|
|
|
59
59
|
pdfMake.vfs = vfs;
|
|
60
60
|
return true;
|
|
61
61
|
}
|
|
62
|
+
/** `rgb(...)` / `rgba(...)` / `#hex` -> `#rrggbb`, or null for transparent and anything else. */
|
|
63
|
+
export function cssColorToHex(value) {
|
|
64
|
+
if (!value)
|
|
65
|
+
return null;
|
|
66
|
+
const v = value.trim();
|
|
67
|
+
const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(v);
|
|
68
|
+
if (hex) {
|
|
69
|
+
const h = hex[1];
|
|
70
|
+
return '#' + (h.length === 3 ? h.split('').map((c) => c + c).join('') : h).toLowerCase();
|
|
71
|
+
}
|
|
72
|
+
const rgb = /^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)(?:[\s,/]+([\d.]+%?))?\s*\)$/i.exec(v);
|
|
73
|
+
if (!rgb)
|
|
74
|
+
return null;
|
|
75
|
+
const alpha = rgb[4] === undefined ? 1 : rgb[4].endsWith('%') ? Number(rgb[4].slice(0, -1)) / 100 : Number(rgb[4]);
|
|
76
|
+
if (!(alpha > 0.05))
|
|
77
|
+
return null;
|
|
78
|
+
const to = (n) => Math.max(0, Math.min(255, Math.round(Number(n)))).toString(16).padStart(2, '0');
|
|
79
|
+
return '#' + to(rgb[1]) + to(rgb[2]) + to(rgb[3]);
|
|
80
|
+
}
|
|
81
|
+
/** Relative luminance of a `#rrggbb`, 0 (black) to 1 (white). */
|
|
82
|
+
export function hexLuminance(hex) {
|
|
83
|
+
const n = parseInt(hex.slice(1), 16);
|
|
84
|
+
const ch = (c) => {
|
|
85
|
+
const s = c / 255;
|
|
86
|
+
return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
|
|
87
|
+
};
|
|
88
|
+
return 0.2126 * ch((n >> 16) & 255) + 0.7152 * ch((n >> 8) & 255) + 0.0722 * ch(n & 255);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Read the colours a mounted grid is drawn with, from computed styles: the
|
|
92
|
+
* header cell's fill and text, a body cell's text and line colour, the
|
|
93
|
+
* stripe of an alternate row, a group row's fill and text. Colours that are
|
|
94
|
+
* transparent or unreadable are left out, and under a dark theme (a dark
|
|
95
|
+
* body background) only the header colours are reported, since the page
|
|
96
|
+
* the PDF prints on is white.
|
|
97
|
+
*/
|
|
98
|
+
export function readGridPdfTheme(root) {
|
|
99
|
+
if (!root || typeof getComputedStyle !== 'function')
|
|
100
|
+
return {};
|
|
101
|
+
const q = (sel) => root.querySelector(sel);
|
|
102
|
+
const style = (el, prop) => (el ? cssColorToHex(getComputedStyle(el).getPropertyValue(prop)) : null);
|
|
103
|
+
// The fill an element shows is the first painted background on the way
|
|
104
|
+
// up: a header cell is transparent over its column, a body cell over its
|
|
105
|
+
// row, the grid over the page. The walk goes past the root because a
|
|
106
|
+
// dark page is often what a dark theme's grid sits on, unpainted itself.
|
|
107
|
+
const fill = (el) => {
|
|
108
|
+
for (let node = el; node; node = node.parentElement) {
|
|
109
|
+
const c = style(node, 'background-color');
|
|
110
|
+
if (c)
|
|
111
|
+
return c;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
};
|
|
115
|
+
// A data column, not the row-number gutter or the checkbox column, and
|
|
116
|
+
// a data row, not the header row (which is a `.sv-grid-row` too).
|
|
117
|
+
const plain = ':not([class*="row-number"]):not([class*="selection"])';
|
|
118
|
+
const header = q(`.sv-grid-head .sv-grid-column${plain}`) ?? q('.sv-grid-header-cell') ?? q('thead th');
|
|
119
|
+
const cell = q(`.sv-grid-body .sv-grid-row:not(.sv-grid-row-alt):not(.sv-grid-header-row) .sv-grid-cell${plain}`) ?? q('tbody td');
|
|
120
|
+
const alt = q(`.sv-grid-body .sv-grid-row-alt .sv-grid-cell${plain}`);
|
|
121
|
+
const group = q('.sv-grid-group-row .sv-grid-cell');
|
|
122
|
+
const out = {};
|
|
123
|
+
const headerFill = fill(header);
|
|
124
|
+
const headerText = style(header, 'color');
|
|
125
|
+
if (headerFill)
|
|
126
|
+
out.headerColor = headerFill;
|
|
127
|
+
if (headerText)
|
|
128
|
+
out.headerTextColor = headerText;
|
|
129
|
+
const bodyBg = cell ? fill(cell.parentElement) : fill(q('.sv-grid-container') ?? root);
|
|
130
|
+
const text = style(cell, 'color');
|
|
131
|
+
// Dark: a dark ground, or light text (which would vanish on the white page
|
|
132
|
+
// whatever the ground was).
|
|
133
|
+
const dark = (bodyBg ? hexLuminance(bodyBg) < 0.4 : false) || (text ? hexLuminance(text) > 0.5 : false);
|
|
134
|
+
if (dark)
|
|
135
|
+
return out;
|
|
136
|
+
if (text)
|
|
137
|
+
out.textColor = text;
|
|
138
|
+
const line = style(cell, 'border-bottom-color') ?? style(header, 'border-bottom-color');
|
|
139
|
+
if (line)
|
|
140
|
+
out.borderColor = line;
|
|
141
|
+
const stripe = style(alt, 'background-color');
|
|
142
|
+
if (stripe && stripe !== bodyBg)
|
|
143
|
+
out.zebraColor = stripe;
|
|
144
|
+
const groupFill = style(group, 'background-color');
|
|
145
|
+
const groupText = style(group, 'color');
|
|
146
|
+
if (groupFill && groupFill !== bodyBg)
|
|
147
|
+
out.groupColor = groupFill;
|
|
148
|
+
if (groupText)
|
|
149
|
+
out.groupTextColor = groupText;
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
62
152
|
/** Page sizes in pt (portrait), for the content width the charts fill. */
|
|
63
153
|
const PAGE_PT = {
|
|
64
154
|
A4: [595.28, 841.89], A3: [841.89, 1190.55], A5: [419.53, 595.28], LETTER: [612, 792], LEGAL: [612, 1008],
|
|
@@ -95,29 +185,79 @@ export async function resolvePdfCharts(charts, rasterize) {
|
|
|
95
185
|
export function buildPdfDocDefinition(params) {
|
|
96
186
|
const { columns } = params;
|
|
97
187
|
const o = params.opts ?? {};
|
|
188
|
+
const st = params.styles ?? {};
|
|
189
|
+
const theme = params.theme ?? {};
|
|
98
190
|
const now = params.now ?? new Date(0);
|
|
99
191
|
const fontSize = o.fontSize ?? 8;
|
|
100
|
-
|
|
101
|
-
const
|
|
192
|
+
// Explicit PDF options, then the blanket styles, then the grid on screen, then the slate defaults.
|
|
193
|
+
const headerColor = o.headerColor ?? st.headerRow?.backgroundColor ?? theme.headerColor ?? '#334155';
|
|
194
|
+
const headerTextColor = o.headerTextColor ?? st.headerRow?.color ?? theme.headerTextColor ?? '#ffffff';
|
|
102
195
|
const zebra = o.zebra ?? true;
|
|
103
|
-
const zebraColor = o.zebraColor ?? '#f1f5f9';
|
|
104
|
-
const groupColor = o.groupColor ?? '#e2e8f0';
|
|
105
|
-
const groupTextColor = o.groupTextColor ?? '#0f172a';
|
|
106
|
-
const subtotalColor = o.subtotalColor ?? '#f8fafc';
|
|
196
|
+
const zebraColor = o.zebraColor ?? st.rowAlternate?.backgroundColor ?? theme.zebraColor ?? '#f1f5f9';
|
|
197
|
+
const groupColor = o.groupColor ?? theme.groupColor ?? '#e2e8f0';
|
|
198
|
+
const groupTextColor = o.groupTextColor ?? theme.groupTextColor ?? '#0f172a';
|
|
199
|
+
const subtotalColor = o.subtotalColor ?? theme.subtotalColor ?? '#f8fafc';
|
|
200
|
+
const textColor = o.textColor ?? st.rows?.color ?? theme.textColor;
|
|
201
|
+
const borderColor = o.borderColor ?? theme.borderColor ?? '#e2e8f0';
|
|
107
202
|
const repeatHeader = o.repeatHeader ?? true;
|
|
203
|
+
const isBold = (w) => w === 'bold' || (typeof w === 'number' && w >= 600);
|
|
204
|
+
const ptSize = (v) => {
|
|
205
|
+
if (v === undefined)
|
|
206
|
+
return undefined;
|
|
207
|
+
const n = typeof v === 'number' ? v : parseFloat(v);
|
|
208
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
209
|
+
};
|
|
210
|
+
/** Lay one cell style over a cell, keys the style names. */
|
|
211
|
+
const applyStyle = (cell, s) => {
|
|
212
|
+
if (!s)
|
|
213
|
+
return;
|
|
214
|
+
if (s.backgroundColor)
|
|
215
|
+
cell.fillColor = s.backgroundColor;
|
|
216
|
+
if (s.color)
|
|
217
|
+
cell.color = s.color;
|
|
218
|
+
if (isBold(s.fontWeight))
|
|
219
|
+
cell.bold = true;
|
|
220
|
+
else if (s.fontWeight === 'normal')
|
|
221
|
+
cell.bold = false;
|
|
222
|
+
if (s.fontStyle === 'italic')
|
|
223
|
+
cell.italics = true;
|
|
224
|
+
const size = ptSize(s.fontSize);
|
|
225
|
+
if (size)
|
|
226
|
+
cell.fontSize = size;
|
|
227
|
+
if (s.textAlign)
|
|
228
|
+
cell.alignment = s.textAlign;
|
|
229
|
+
};
|
|
230
|
+
// Per-cell overrides by A1 reference: row 1 is the header, so a data row
|
|
231
|
+
// `r` (0-based) is row `r + 2`, matching the xlsx and html writers.
|
|
232
|
+
const cellRefs = new Map();
|
|
233
|
+
for (const [ref, s] of Object.entries(st.cells ?? {})) {
|
|
234
|
+
const m = /^([A-Z]+)(\d+)$/i.exec(ref.trim());
|
|
235
|
+
if (!m)
|
|
236
|
+
continue;
|
|
237
|
+
let col = 0;
|
|
238
|
+
for (const ch of m[1].toUpperCase())
|
|
239
|
+
col = col * 26 + (ch.charCodeAt(0) - 64);
|
|
240
|
+
cellRefs.set(`${Number(m[2]) - 1}:${col - 1}`, s);
|
|
241
|
+
}
|
|
108
242
|
const orientation = o.pageOrientation ??
|
|
109
243
|
(columns.length > (o.autoLandscapeThreshold ?? 8) ? 'landscape' : 'portrait');
|
|
110
244
|
const widths = Array.isArray(o.columnWidths)
|
|
111
245
|
? o.columnWidths
|
|
112
246
|
: columns.map(() => (o.columnWidths === 'auto' ? 'auto' : '*'));
|
|
113
247
|
// Header row.
|
|
114
|
-
const headerRow = columns.map((c) =>
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
248
|
+
const headerRow = columns.map((c, ci) => {
|
|
249
|
+
const cell = {
|
|
250
|
+
text: c.header,
|
|
251
|
+
bold: true,
|
|
252
|
+
alignment: c.align ?? 'left',
|
|
253
|
+
color: headerTextColor,
|
|
254
|
+
fillColor: headerColor,
|
|
255
|
+
};
|
|
256
|
+
// The blanket header style already set the colours above; its weight, size and alignment apply here.
|
|
257
|
+
applyStyle(cell, st.headerRow ? { ...st.headerRow, backgroundColor: undefined, color: undefined } : undefined);
|
|
258
|
+
applyStyle(cell, cellRefs.get(`0:${ci}`));
|
|
259
|
+
return cell;
|
|
260
|
+
});
|
|
121
261
|
// Normalize to a structured body: `body` wins, else wrap flat `rows`.
|
|
122
262
|
const model = params.body ?? (params.rows ?? []).map((cells) => ({ kind: 'data', cells }));
|
|
123
263
|
// Track which body-row indices are plain data rows, so zebra striping only
|
|
@@ -154,6 +294,13 @@ export function buildPdfDocDefinition(params) {
|
|
|
154
294
|
const ord = dataOrdinal++;
|
|
155
295
|
bodyCells.push(columns.map((c, ci) => {
|
|
156
296
|
const cell = { text: row.cells[ci] ?? '', alignment: c.align ?? 'left' };
|
|
297
|
+
if (textColor)
|
|
298
|
+
cell.color = textColor;
|
|
299
|
+
// Blanket row style, the zebra text colour on alternate rows, then the A1 override.
|
|
300
|
+
applyStyle(cell, st.rows ? { ...st.rows, backgroundColor: undefined } : undefined);
|
|
301
|
+
if (zebra && ord % 2 === 1 && st.rowAlternate?.color)
|
|
302
|
+
cell.color = st.rowAlternate.color;
|
|
303
|
+
applyStyle(cell, cellRefs.get(`${ord + 1}:${ci}`));
|
|
157
304
|
const s = dataCellStyle?.(ord, ci);
|
|
158
305
|
if (s) {
|
|
159
306
|
if (s.fill)
|
|
@@ -174,6 +321,37 @@ export function buildPdfDocDefinition(params) {
|
|
|
174
321
|
}));
|
|
175
322
|
}
|
|
176
323
|
});
|
|
324
|
+
// Merged data cells: pdfmake spans from the top-left cell and expects the
|
|
325
|
+
// covered cells to be present and empty. Only flat exports: with group
|
|
326
|
+
// or subtotal rows the data row numbering would not be the body's.
|
|
327
|
+
if (params.merges?.length && !params.body) {
|
|
328
|
+
const dataRowsAt = [...dataRowIdx].sort((a, b) => a - b);
|
|
329
|
+
for (const m of params.merges) {
|
|
330
|
+
const rs = Math.max(1, Math.floor(m.rowSpan ?? 1));
|
|
331
|
+
const cs = Math.max(1, Math.floor(m.colSpan ?? 1));
|
|
332
|
+
if (rs === 1 && cs === 1)
|
|
333
|
+
continue;
|
|
334
|
+
const top = dataRowsAt[m.row];
|
|
335
|
+
if (top === undefined || m.col < 0 || m.col >= columns.length)
|
|
336
|
+
continue;
|
|
337
|
+
const anchor = bodyCells[top]?.[m.col];
|
|
338
|
+
if (!anchor)
|
|
339
|
+
continue;
|
|
340
|
+
if (rs > 1)
|
|
341
|
+
anchor.rowSpan = Math.min(rs, bodyCells.length - top);
|
|
342
|
+
if (cs > 1)
|
|
343
|
+
anchor.colSpan = Math.min(cs, columns.length - m.col);
|
|
344
|
+
for (let r = 0; r < (anchor.rowSpan ?? 1); r += 1) {
|
|
345
|
+
for (let c = 0; c < (anchor.colSpan ?? 1); c += 1) {
|
|
346
|
+
if (r === 0 && c === 0)
|
|
347
|
+
continue;
|
|
348
|
+
const covered = bodyCells[top + r]?.[m.col + c];
|
|
349
|
+
if (covered)
|
|
350
|
+
covered.text = '';
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
177
355
|
const table = {
|
|
178
356
|
table: {
|
|
179
357
|
headerRows: repeatHeader ? 1 : 0,
|
|
@@ -186,15 +364,37 @@ export function buildPdfDocDefinition(params) {
|
|
|
186
364
|
fillColor: (rowIndex) => zebra && rowIndex > 0 && rowIndex % 2 === 0 && dataRowIdx.has(rowIndex) ? zebraColor : null,
|
|
187
365
|
hLineWidth: () => 0.5,
|
|
188
366
|
vLineWidth: () => 0.5,
|
|
189
|
-
hLineColor: () =>
|
|
190
|
-
vLineColor: () =>
|
|
367
|
+
hLineColor: () => borderColor,
|
|
368
|
+
vLineColor: () => borderColor,
|
|
191
369
|
paddingTop: () => 3,
|
|
192
370
|
paddingBottom: () => 3,
|
|
193
371
|
paddingLeft: () => 5,
|
|
194
372
|
paddingRight: () => 5,
|
|
195
373
|
},
|
|
196
374
|
};
|
|
375
|
+
// The lines `ExportOptions.header` / `footer` carry: text with a style, an
|
|
376
|
+
// image, or a left / centre / right triple, above and below the table the
|
|
377
|
+
// way the xlsx writer puts them in rows around it.
|
|
378
|
+
const pageLines = (lines, margin) => (lines ?? []).map((line) => {
|
|
379
|
+
if ('image' in line) {
|
|
380
|
+
return { image: line.image, ...(line.width ? { width: line.width } : {}), ...(line.height ? { height: line.height } : {}), margin };
|
|
381
|
+
}
|
|
382
|
+
if ('text' in line) {
|
|
383
|
+
const cell = { text: line.text };
|
|
384
|
+
applyStyle(cell, line.style);
|
|
385
|
+
return { ...cell, margin };
|
|
386
|
+
}
|
|
387
|
+
return {
|
|
388
|
+
columns: [
|
|
389
|
+
{ text: line.left ?? '', alignment: 'left' },
|
|
390
|
+
{ text: line.center ?? '', alignment: 'center' },
|
|
391
|
+
{ text: line.right ?? '', alignment: 'right' },
|
|
392
|
+
],
|
|
393
|
+
margin,
|
|
394
|
+
};
|
|
395
|
+
});
|
|
197
396
|
const content = [];
|
|
397
|
+
content.push(...pageLines(params.headerLines, [0, 0, 0, 4]));
|
|
198
398
|
if (o.logo)
|
|
199
399
|
content.push({ image: o.logo, width: o.logoWidth ?? 90, margin: [0, 0, 0, 8] });
|
|
200
400
|
if (o.title)
|
|
@@ -253,6 +453,7 @@ export function buildPdfDocDefinition(params) {
|
|
|
253
453
|
content.push({ text: '', margin: [0, 0, 0, 12] });
|
|
254
454
|
content.push(...chartBlocks);
|
|
255
455
|
}
|
|
456
|
+
content.push(...pageLines(params.footerLines, [0, 4, 0, 0]));
|
|
256
457
|
const def = {
|
|
257
458
|
pageSize: o.pageSize ?? 'A4',
|
|
258
459
|
pageOrientation: orientation,
|
package/dist/export.js
CHANGED
|
@@ -6,7 +6,7 @@ import { installSmartShim } from './smart-shim.js';
|
|
|
6
6
|
import { downloadBlobFile, downloadTextFile, serializeDelimited, serializeHtml, serializeJson, serializeMarkdown, serializeXml, } from './export-serialize.js';
|
|
7
7
|
import { serializeSpreadsheetML } from './export-xls.js';
|
|
8
8
|
import { buildXlsxParts, packageXlsx } from './export-ooxml.js';
|
|
9
|
-
import { buildPdfDocDefinition, registerPdfFonts, resolvePdfCharts } from './export-pdf.js';
|
|
9
|
+
import { buildPdfDocDefinition, readGridPdfTheme, registerPdfFonts, resolvePdfCharts } from './export-pdf.js';
|
|
10
10
|
import { buildConditionalResolver } from './export-conditional.js';
|
|
11
11
|
/** Formats served by the native, dependency-free, streaming serializers. */
|
|
12
12
|
const NATIVE_TEXT_FORMATS = [
|
|
@@ -634,6 +634,10 @@ async function exportPdf(api, opts) {
|
|
|
634
634
|
...opts.pdf,
|
|
635
635
|
pageOrientation: opts.pdf?.pageOrientation ?? opts.pageOrientation,
|
|
636
636
|
};
|
|
637
|
+
// The grid on screen lends its colours unless told not to; explicit
|
|
638
|
+
// `pdf` colours and `styles` still win inside the builder.
|
|
639
|
+
const theme = pdfOpts.matchTheme === false ? {} : readGridPdfTheme(api.getElement?.() ?? null);
|
|
640
|
+
const lines = { headerLines: opts.header, footerLines: opts.footer };
|
|
637
641
|
// Charts handed over as elements are rasterised here, once, through the
|
|
638
642
|
// grid chart's own PNG path at 2x, so the page gets the picture on screen.
|
|
639
643
|
// The rasteriser comes from the grid's barrel, imported on demand: the
|
|
@@ -649,7 +653,7 @@ async function exportPdf(api, opts) {
|
|
|
649
653
|
// Conditional formatting is skipped for grouped PDFs (group / subtotal
|
|
650
654
|
// rows own the layout); the grid colors still show on screen.
|
|
651
655
|
const body = buildGroupedPdfBody(cols, sourceRows, effGroupBy);
|
|
652
|
-
def = buildPdfDocDefinition({ columns, body, opts: pdfOpts, charts, now });
|
|
656
|
+
def = buildPdfDocDefinition({ columns, body, opts: pdfOpts, styles: opts.styles, theme, ...lines, charts, now });
|
|
653
657
|
}
|
|
654
658
|
else {
|
|
655
659
|
const projected = await projectRows(sourceRows, cols, opts);
|
|
@@ -673,6 +677,10 @@ async function exportPdf(api, opts) {
|
|
|
673
677
|
},
|
|
674
678
|
dataCellLink: link,
|
|
675
679
|
opts: pdfOpts,
|
|
680
|
+
styles: opts.styles,
|
|
681
|
+
theme,
|
|
682
|
+
...lines,
|
|
683
|
+
merges: opts.merges,
|
|
676
684
|
charts,
|
|
677
685
|
now,
|
|
678
686
|
});
|