@hed-hog/core 0.0.400 → 0.0.401
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/dist/ai/ai.controller.d.ts +2 -0
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.service.d.ts +86 -2
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +304 -23
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +3 -0
- package/dist/core.module.js.map +1 -1
- package/dist/document-kit/document-kit.module.d.ts +3 -0
- package/dist/document-kit/document-kit.module.d.ts.map +1 -0
- package/dist/document-kit/document-kit.module.js +24 -0
- package/dist/document-kit/document-kit.module.js.map +1 -0
- package/dist/document-kit/document-kit.registry.d.ts +55 -0
- package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
- package/dist/document-kit/document-kit.registry.js +91 -0
- package/dist/document-kit/document-kit.registry.js.map +1 -0
- package/dist/document-kit/document-kit.service.d.ts +49 -0
- package/dist/document-kit/document-kit.service.d.ts.map +1 -0
- package/dist/document-kit/document-kit.service.js +135 -0
- package/dist/document-kit/document-kit.service.js.map +1 -0
- package/dist/file/file.service.d.ts +15 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +52 -24
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -1
- package/dist/file/mcp-file-source.schema.js +8 -5
- package/dist/file/mcp-file-source.schema.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +21 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
- package/dist/integration-profile/testers/ai.testers.js +46 -8
- package/dist/integration-profile/testers/ai.testers.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +2 -0
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
- package/dist/mcp/tools/core-files.mcp-tools.js +4 -4
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +72 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
- package/dist/oauth/oauth-token-broker.service.js +105 -3
- package/dist/oauth/oauth-token-broker.service.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +30 -4
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
- package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-bar.js +117 -0
- package/dist/pdf/document/charts/chart-bar.js.map +1 -0
- package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
- package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-donut.js +89 -0
- package/dist/pdf/document/charts/chart-donut.js.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.js +60 -0
- package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
- package/dist/pdf/document/charts/chart-line.d.ts +29 -0
- package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-line.js +89 -0
- package/dist/pdf/document/charts/chart-line.js.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.js +110 -0
- package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
- package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
- package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-radar.js +83 -0
- package/dist/pdf/document/charts/chart-radar.js.map +1 -0
- package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
- package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-scale.js +118 -0
- package/dist/pdf/document/charts/chart-scale.js.map +1 -0
- package/dist/pdf/document/charts/index.d.ts +8 -0
- package/dist/pdf/document/charts/index.d.ts.map +1 -0
- package/dist/pdf/document/charts/index.js +24 -0
- package/dist/pdf/document/charts/index.js.map +1 -0
- package/dist/pdf/document/index.d.ts +8 -0
- package/dist/pdf/document/index.d.ts.map +1 -0
- package/dist/pdf/document/index.js +24 -0
- package/dist/pdf/document/index.js.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.js +36 -0
- package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
- package/dist/pdf/document/pdf-document.css.d.ts +20 -0
- package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.css.js +239 -0
- package/dist/pdf/document/pdf-document.css.js.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.js +153 -0
- package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
- package/dist/pdf/document/pdf-document.service.d.ts +27 -0
- package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.service.js +81 -0
- package/dist/pdf/document/pdf-document.service.js.map +1 -0
- package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
- package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.theme.js +105 -0
- package/dist/pdf/document/pdf-document.theme.js.map +1 -0
- package/dist/pdf/document/pdf-document.types.d.ts +108 -0
- package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.types.js +18 -0
- package/dist/pdf/document/pdf-document.types.js.map +1 -0
- package/dist/pdf/pdf.module.d.ts.map +1 -1
- package/dist/pdf/pdf.module.js +3 -2
- package/dist/pdf/pdf.module.js.map +1 -1
- package/dist/pdf/pdf.service.d.ts +69 -1
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +164 -63
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
- package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
- package/dist/pdf/templates/commercial-proposal.template.js +276 -0
- package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
- package/dist/setting/favicon.controller.d.ts +26 -0
- package/dist/setting/favicon.controller.d.ts.map +1 -0
- package/dist/setting/favicon.controller.js +130 -0
- package/dist/setting/favicon.controller.js.map +1 -0
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +2 -1
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +25 -2
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/route.yaml +8 -0
- package/hedhog/data/setting_group.yaml +52 -0
- package/hedhog/frontend/messages/en.json +54 -1
- package/hedhog/frontend/messages/pt.json +54 -1
- package/package.json +4 -4
- package/src/ai/ai-attachment.fragments.spec.ts +56 -3
- package/src/ai/ai.service.responses.spec.ts +429 -0
- package/src/ai/ai.service.ts +409 -27
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
- package/src/core.module.ts +3 -0
- package/src/document-kit/document-kit.module.ts +12 -0
- package/src/document-kit/document-kit.registry.ts +125 -0
- package/src/document-kit/document-kit.service.spec.ts +156 -0
- package/src/document-kit/document-kit.service.ts +173 -0
- package/src/file/file.service.spec.ts +168 -1
- package/src/file/file.service.ts +72 -34
- package/src/file/mcp-file-source.schema.ts +8 -5
- package/src/index.ts +5 -0
- package/src/integration-profile/integration-profile.secrets.ts +21 -0
- package/src/integration-profile/testers/ai.testers.ts +70 -5
- package/src/integration-profile/testers/remaining.testers.spec.ts +65 -1
- package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
- package/src/mcp/mcp.module.ts +2 -0
- package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
- package/src/mcp/tools/core-files.mcp-tools.ts +4 -4
- package/src/meeting/meeting-provider.registry.ts +80 -0
- package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
- package/src/oauth/oauth-token-broker.service.ts +129 -2
- package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
- package/src/oauth/providers/microsoft-entra-id.provider.ts +29 -2
- package/src/pdf/document/charts/chart-bar.ts +217 -0
- package/src/pdf/document/charts/chart-donut.ts +163 -0
- package/src/pdf/document/charts/chart-gauge.ts +94 -0
- package/src/pdf/document/charts/chart-line.ts +159 -0
- package/src/pdf/document/charts/chart-primitives.ts +188 -0
- package/src/pdf/document/charts/chart-radar.ts +136 -0
- package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
- package/src/pdf/document/charts/chart-scale.ts +141 -0
- package/src/pdf/document/charts/charts.spec.ts +157 -0
- package/src/pdf/document/charts/index.ts +7 -0
- package/src/pdf/document/index.ts +7 -0
- package/src/pdf/document/pdf-document.chrome.ts +38 -0
- package/src/pdf/document/pdf-document.css.ts +238 -0
- package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
- package/src/pdf/document/pdf-document.renderer.ts +215 -0
- package/src/pdf/document/pdf-document.service.ts +77 -0
- package/src/pdf/document/pdf-document.theme.ts +146 -0
- package/src/pdf/document/pdf-document.types.ts +97 -0
- package/src/pdf/pdf.module.ts +3 -2
- package/src/pdf/pdf.service.spec.ts +131 -0
- package/src/pdf/pdf.service.ts +245 -82
- package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
- package/src/pdf/templates/commercial-proposal.template.ts +400 -0
- package/src/setting/favicon.controller.spec.ts +92 -0
- package/src/setting/favicon.controller.ts +135 -0
- package/src/setting/setting.module.ts +2 -1
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +73 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +32 -2
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Escalas, medidas e formatação dos gráficos do documento PDF.
|
|
4
|
+
*
|
|
5
|
+
* Tudo aqui é função pura e sem dependência: o gráfico é desenhado como SVG no
|
|
6
|
+
* servidor, onde não há canvas para medir texto nem biblioteca de plotagem.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.niceScale = niceScale;
|
|
10
|
+
exports.linearScale = linearScale;
|
|
11
|
+
exports.bandScale = bandScale;
|
|
12
|
+
exports.estimateTextWidth = estimateTextWidth;
|
|
13
|
+
exports.truncateToWidth = truncateToWidth;
|
|
14
|
+
exports.axisLabelPlan = axisLabelPlan;
|
|
15
|
+
exports.withAlpha = withAlpha;
|
|
16
|
+
exports.formatNumber = formatNumber;
|
|
17
|
+
/** Domínio arredondado para valores "redondos" (1, 2, 5 × 10^k) e os ticks dele. */
|
|
18
|
+
function niceScale(min, max, tickCount = 4) {
|
|
19
|
+
const safeMin = Number.isFinite(min) ? min : 0;
|
|
20
|
+
const safeMax = Number.isFinite(max) ? max : 0;
|
|
21
|
+
// Série toda igual (ou toda zero) não tem amplitude para dividir: um passo de
|
|
22
|
+
// 1 mantém o eixo legível em vez de gerar divisão por zero.
|
|
23
|
+
if (safeMax === safeMin) {
|
|
24
|
+
const value = safeMax === 0 ? 1 : Math.abs(safeMax);
|
|
25
|
+
const step = value / tickCount || 1;
|
|
26
|
+
return {
|
|
27
|
+
min: Math.min(0, safeMin),
|
|
28
|
+
max: safeMax === 0 ? 1 : safeMax,
|
|
29
|
+
step,
|
|
30
|
+
ticks: Array.from({ length: tickCount + 1 }, (_, i) => Math.min(0, safeMin) + step * i),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const rawStep = (safeMax - safeMin) / Math.max(tickCount, 1);
|
|
34
|
+
const magnitude = 10 ** Math.floor(Math.log10(rawStep));
|
|
35
|
+
const normalized = rawStep / magnitude;
|
|
36
|
+
// O 2,5 está na escada de propósito: sem ele, um eixo de 0 a 97 pedindo 4
|
|
37
|
+
// divisões cai no passo 50 e imprime só 0/50/100 — informação de menos para
|
|
38
|
+
// um relatório que se lê no papel, sem passar o mouse em nada.
|
|
39
|
+
const niceNormalized = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 2.5 ? 2.5 : normalized <= 5 ? 5 : 10;
|
|
40
|
+
const step = niceNormalized * magnitude;
|
|
41
|
+
const niceMin = Math.floor(safeMin / step) * step;
|
|
42
|
+
const niceMax = Math.ceil(safeMax / step) * step;
|
|
43
|
+
const ticks = [];
|
|
44
|
+
// Tolerância pelo passo: somar 0.1+0.2 em ponto flutuante erraria o último tick.
|
|
45
|
+
for (let value = niceMin; value <= niceMax + step / 1000; value += step) {
|
|
46
|
+
ticks.push(Number(value.toFixed(10)));
|
|
47
|
+
}
|
|
48
|
+
return { min: niceMin, max: niceMax, step, ticks };
|
|
49
|
+
}
|
|
50
|
+
/** Converte valor do domínio em pixel. */
|
|
51
|
+
function linearScale(domain, range) {
|
|
52
|
+
const [d0, d1] = domain;
|
|
53
|
+
const [r0, r1] = range;
|
|
54
|
+
const span = d1 - d0 || 1;
|
|
55
|
+
return (value) => r0 + ((value - d0) / span) * (r1 - r0);
|
|
56
|
+
}
|
|
57
|
+
/** Divide um intervalo em faixas de mesma largura, uma por categoria. */
|
|
58
|
+
function bandScale(count, range, paddingRatio = 0.2) {
|
|
59
|
+
const [r0, r1] = range;
|
|
60
|
+
const total = r1 - r0;
|
|
61
|
+
const slots = Math.max(count, 1);
|
|
62
|
+
const slot = total / slots;
|
|
63
|
+
const bandwidth = slot * (1 - paddingRatio);
|
|
64
|
+
const offset = (slot - bandwidth) / 2;
|
|
65
|
+
return {
|
|
66
|
+
band: (index) => r0 + slot * index + offset,
|
|
67
|
+
center: (index) => r0 + slot * index + slot / 2,
|
|
68
|
+
bandwidth,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Largura aproximada de um texto. Sem canvas no servidor, 0,55 × tamanho da
|
|
73
|
+
* fonte por caractere erra pouco para Arial/FreeSans e é o bastante para
|
|
74
|
+
* decidir corte e rotação de rótulo.
|
|
75
|
+
*/
|
|
76
|
+
function estimateTextWidth(text, fontSize) {
|
|
77
|
+
return text.length * fontSize * 0.55;
|
|
78
|
+
}
|
|
79
|
+
/** Corta o texto no limite de pixels, com reticências. */
|
|
80
|
+
function truncateToWidth(text, fontSize, maxWidth) {
|
|
81
|
+
if (estimateTextWidth(text, fontSize) <= maxWidth)
|
|
82
|
+
return text;
|
|
83
|
+
const maxChars = Math.max(Math.floor(maxWidth / (fontSize * 0.55)) - 1, 1);
|
|
84
|
+
return `${text.slice(0, maxChars).trimEnd()}…`;
|
|
85
|
+
}
|
|
86
|
+
/** Decide se os rótulos do eixo X cabem deitados e quantos pular. */
|
|
87
|
+
function axisLabelPlan(labels, bandwidth, fontSize) {
|
|
88
|
+
const widest = labels.reduce((max, label) => Math.max(max, estimateTextWidth(label, fontSize)), 0);
|
|
89
|
+
if (widest <= bandwidth)
|
|
90
|
+
return { rotate: 0, skipEvery: 1 };
|
|
91
|
+
// Girar resolve até certo ponto; passado ele, é melhor mostrar menos rótulos
|
|
92
|
+
// do que empilhar texto ilegível.
|
|
93
|
+
if (widest <= bandwidth * 3)
|
|
94
|
+
return { rotate: -35, skipEvery: 1 };
|
|
95
|
+
return { rotate: -35, skipEvery: Math.ceil(widest / (bandwidth * 3)) };
|
|
96
|
+
}
|
|
97
|
+
/** `#ff760c` + alpha → `rgba(255,118,12,0.18)`, para o preenchimento de área. */
|
|
98
|
+
function withAlpha(hexColor, alpha) {
|
|
99
|
+
const hex = hexColor.replace('#', '');
|
|
100
|
+
const full = hex.length === 3
|
|
101
|
+
? hex
|
|
102
|
+
.split('')
|
|
103
|
+
.map((char) => char + char)
|
|
104
|
+
.join('')
|
|
105
|
+
: hex;
|
|
106
|
+
const value = Number.parseInt(full.slice(0, 6), 16);
|
|
107
|
+
if (!Number.isFinite(value))
|
|
108
|
+
return hexColor;
|
|
109
|
+
const r = (value >> 16) & 255;
|
|
110
|
+
const g = (value >> 8) & 255;
|
|
111
|
+
const b = value & 255;
|
|
112
|
+
return `rgba(${r},${g},${b},${alpha})`;
|
|
113
|
+
}
|
|
114
|
+
/** Número no formato pt-BR, sem casas decimais desnecessárias. */
|
|
115
|
+
function formatNumber(value, maximumFractionDigits = 1) {
|
|
116
|
+
return new Intl.NumberFormat('pt-BR', { maximumFractionDigits }).format(value);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=chart-scale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-scale.js","sourceRoot":"","sources":["../../../../src/pdf/document/charts/chart-scale.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './chart-bar';
|
|
2
|
+
export * from './chart-donut';
|
|
3
|
+
export * from './chart-gauge';
|
|
4
|
+
export * from './chart-line';
|
|
5
|
+
export * from './chart-primitives';
|
|
6
|
+
export * from './chart-radar';
|
|
7
|
+
export * from './chart-scale';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pdf/document/charts/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./chart-bar"), exports);
|
|
18
|
+
__exportStar(require("./chart-donut"), exports);
|
|
19
|
+
__exportStar(require("./chart-gauge"), exports);
|
|
20
|
+
__exportStar(require("./chart-line"), exports);
|
|
21
|
+
__exportStar(require("./chart-primitives"), exports);
|
|
22
|
+
__exportStar(require("./chart-radar"), exports);
|
|
23
|
+
__exportStar(require("./chart-scale"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/pdf/document/charts/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,gDAA8B;AAC9B,gDAA8B;AAC9B,+CAA6B;AAC7B,qDAAmC;AACnC,gDAA8B;AAC9B,gDAA8B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './charts';
|
|
2
|
+
export * from './pdf-document.chrome';
|
|
3
|
+
export * from './pdf-document.css';
|
|
4
|
+
export * from './pdf-document.renderer';
|
|
5
|
+
export * from './pdf-document.service';
|
|
6
|
+
export * from './pdf-document.theme';
|
|
7
|
+
export * from './pdf-document.types';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pdf/document/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./charts"), exports);
|
|
18
|
+
__exportStar(require("./pdf-document.chrome"), exports);
|
|
19
|
+
__exportStar(require("./pdf-document.css"), exports);
|
|
20
|
+
__exportStar(require("./pdf-document.renderer"), exports);
|
|
21
|
+
__exportStar(require("./pdf-document.service"), exports);
|
|
22
|
+
__exportStar(require("./pdf-document.theme"), exports);
|
|
23
|
+
__exportStar(require("./pdf-document.types"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pdf/document/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,wDAAsC;AACtC,qDAAmC;AACnC,0DAAwC;AACxC,yDAAuC;AACvC,uDAAqC;AACrC,uDAAqC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PdfDocumentTheme } from './pdf-document.theme';
|
|
2
|
+
/**
|
|
3
|
+
* Cabeçalho e rodapé nativos do Chromium — a barra laranja que repete em toda
|
|
4
|
+
* página e o "3 / 15" que só o renderizador sabe calcular.
|
|
5
|
+
*
|
|
6
|
+
* Eles são mini-documentos, não parte da página: começam em `font-size: 0`,
|
|
7
|
+
* precisam do próprio `print-color-adjust` para manter fundo, e só
|
|
8
|
+
* `<span class="pageNumber">` e `<span class="totalPages">` são substituídos.
|
|
9
|
+
* As margens abaixo reservam o espaço deles — encolher `top`/`bottom` faz o
|
|
10
|
+
* conteúdo imprimir por cima.
|
|
11
|
+
*/
|
|
12
|
+
export declare const PDF_DOCUMENT_MARGIN: {
|
|
13
|
+
top: string;
|
|
14
|
+
right: string;
|
|
15
|
+
bottom: string;
|
|
16
|
+
left: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function buildAccentHeaderTemplate(theme: PdfDocumentTheme): string;
|
|
19
|
+
export declare function buildFooterTemplate(theme: PdfDocumentTheme, left: string): string;
|
|
20
|
+
//# sourceMappingURL=pdf-document.chrome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.chrome.d.ts","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.chrome.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB;;;;;CAK/B,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAMzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CASjF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PDF_DOCUMENT_MARGIN = void 0;
|
|
4
|
+
exports.buildAccentHeaderTemplate = buildAccentHeaderTemplate;
|
|
5
|
+
exports.buildFooterTemplate = buildFooterTemplate;
|
|
6
|
+
const pdf_document_renderer_1 = require("./pdf-document.renderer");
|
|
7
|
+
/**
|
|
8
|
+
* Cabeçalho e rodapé nativos do Chromium — a barra laranja que repete em toda
|
|
9
|
+
* página e o "3 / 15" que só o renderizador sabe calcular.
|
|
10
|
+
*
|
|
11
|
+
* Eles são mini-documentos, não parte da página: começam em `font-size: 0`,
|
|
12
|
+
* precisam do próprio `print-color-adjust` para manter fundo, e só
|
|
13
|
+
* `<span class="pageNumber">` e `<span class="totalPages">` são substituídos.
|
|
14
|
+
* As margens abaixo reservam o espaço deles — encolher `top`/`bottom` faz o
|
|
15
|
+
* conteúdo imprimir por cima.
|
|
16
|
+
*/
|
|
17
|
+
exports.PDF_DOCUMENT_MARGIN = {
|
|
18
|
+
top: '72px',
|
|
19
|
+
right: '56px',
|
|
20
|
+
bottom: '56px',
|
|
21
|
+
left: '56px',
|
|
22
|
+
};
|
|
23
|
+
function buildAccentHeaderTemplate(theme) {
|
|
24
|
+
return ('<style>*{margin:0;padding:0;box-sizing:border-box;}html,body{margin:0;padding:0;}</style>' +
|
|
25
|
+
'<div style="position:absolute;top:0;left:0;right:0;width:100%;height:8px;' +
|
|
26
|
+
`background:${theme.primary};-webkit-print-color-adjust:exact;print-color-adjust:exact;"></div>`);
|
|
27
|
+
}
|
|
28
|
+
function buildFooterTemplate(theme, left) {
|
|
29
|
+
return ('<div style="width:100%;padding:0 56px;display:flex;justify-content:space-between;' +
|
|
30
|
+
`align-items:center;font-family:${theme.fontFamily};font-size:8px;color:${theme.mutedFg};` +
|
|
31
|
+
'-webkit-print-color-adjust:exact;print-color-adjust:exact;">' +
|
|
32
|
+
`<span>${(0, pdf_document_renderer_1.escapeHtml)(left)}</span>` +
|
|
33
|
+
'<span><span class="pageNumber"></span> / <span class="totalPages"></span></span>' +
|
|
34
|
+
'</div>');
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=pdf-document.chrome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.chrome.js","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.chrome.ts"],"names":[],"mappings":";;;AAoBA,8DAMC;AAED,kDASC;AArCD,mEAAqD;AAGrD;;;;;;;;;GASG;AACU,QAAA,mBAAmB,GAAG;IACjC,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,SAAgB,yBAAyB,CAAC,KAAuB;IAC/D,OAAO,CACL,2FAA2F;QAC3F,2EAA2E;QAC3E,cAAc,KAAK,CAAC,OAAO,qEAAqE,CACjG,CAAC;AACJ,CAAC;AAED,SAAgB,mBAAmB,CAAC,KAAuB,EAAE,IAAY;IACvE,OAAO,CACL,mFAAmF;QACnF,kCAAkC,KAAK,CAAC,UAAU,wBAAwB,KAAK,CAAC,OAAO,GAAG;QAC1F,8DAA8D;QAC9D,SAAS,IAAA,kCAAU,EAAC,IAAI,CAAC,SAAS;QAClC,kFAAkF;QAClF,QAAQ,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PdfDocumentTheme } from './pdf-document.theme';
|
|
2
|
+
/**
|
|
3
|
+
* O CSS do documento padrão — o mesmo acabamento da proposta comercial do CRM
|
|
4
|
+
* (`libraries/crm/src/proposal/proposal.service.ts`), com três acréscimos que
|
|
5
|
+
* a proposta não precisava e um relatório precisa:
|
|
6
|
+
*
|
|
7
|
+
* 1. `thead { display: table-header-group }` — sem isso a tabela perde o
|
|
8
|
+
* cabeçalho a partir da segunda página, e um relatório de 15 páginas fica
|
|
9
|
+
* ilegível da página 2 em diante.
|
|
10
|
+
* 2. `tbody tr { break-inside: avoid }` — linha não parte no meio.
|
|
11
|
+
* 3. Nada de wrapper com `break-inside: avoid`, `overflow` ou borda arredondada
|
|
12
|
+
* em volta da tabela: foi o que fez a folha de impressão da tela sair com
|
|
13
|
+
* uma primeira página vazia e conteúdo cortado.
|
|
14
|
+
*
|
|
15
|
+
* A barra laranja do topo e o "X / N" do rodapé **não estão aqui** — são
|
|
16
|
+
* templates do Chromium (ver ./pdf-document.chrome.ts), porque só eles repetem
|
|
17
|
+
* em toda página e só eles sabem o total de páginas.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildDocumentCss(theme: PdfDocumentTheme, landscape?: boolean): string;
|
|
20
|
+
//# sourceMappingURL=pdf-document.css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.css.d.ts","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,UAAQ,GAAG,MAAM,CA0NnF"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildDocumentCss = buildDocumentCss;
|
|
4
|
+
/**
|
|
5
|
+
* O CSS do documento padrão — o mesmo acabamento da proposta comercial do CRM
|
|
6
|
+
* (`libraries/crm/src/proposal/proposal.service.ts`), com três acréscimos que
|
|
7
|
+
* a proposta não precisava e um relatório precisa:
|
|
8
|
+
*
|
|
9
|
+
* 1. `thead { display: table-header-group }` — sem isso a tabela perde o
|
|
10
|
+
* cabeçalho a partir da segunda página, e um relatório de 15 páginas fica
|
|
11
|
+
* ilegível da página 2 em diante.
|
|
12
|
+
* 2. `tbody tr { break-inside: avoid }` — linha não parte no meio.
|
|
13
|
+
* 3. Nada de wrapper com `break-inside: avoid`, `overflow` ou borda arredondada
|
|
14
|
+
* em volta da tabela: foi o que fez a folha de impressão da tela sair com
|
|
15
|
+
* uma primeira página vazia e conteúdo cortado.
|
|
16
|
+
*
|
|
17
|
+
* A barra laranja do topo e o "X / N" do rodapé **não estão aqui** — são
|
|
18
|
+
* templates do Chromium (ver ./pdf-document.chrome.ts), porque só eles repetem
|
|
19
|
+
* em toda página e só eles sabem o total de páginas.
|
|
20
|
+
*/
|
|
21
|
+
function buildDocumentCss(theme, landscape = false) {
|
|
22
|
+
const { primary, mutedBg, mutedFg, ink, line, fontFamily } = theme;
|
|
23
|
+
return `
|
|
24
|
+
@page {
|
|
25
|
+
size: A4${landscape ? ' landscape' : ''};
|
|
26
|
+
margin: 72px 56px 56px 56px;
|
|
27
|
+
}
|
|
28
|
+
* { box-sizing: border-box; }
|
|
29
|
+
html, body {
|
|
30
|
+
-webkit-print-color-adjust: exact;
|
|
31
|
+
print-color-adjust: exact;
|
|
32
|
+
}
|
|
33
|
+
body {
|
|
34
|
+
color: ${ink};
|
|
35
|
+
font-family: ${fontFamily};
|
|
36
|
+
font-size: 11.5px;
|
|
37
|
+
line-height: 1.55;
|
|
38
|
+
margin: 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* ── Letterhead ── */
|
|
42
|
+
header {
|
|
43
|
+
display: flex;
|
|
44
|
+
justify-content: space-between;
|
|
45
|
+
align-items: flex-start;
|
|
46
|
+
gap: 24px;
|
|
47
|
+
margin-bottom: 24px;
|
|
48
|
+
padding-bottom: 20px;
|
|
49
|
+
border-bottom: 1px solid ${line};
|
|
50
|
+
}
|
|
51
|
+
.brand { display: flex; align-items: center; gap: 14px; }
|
|
52
|
+
.brand img { height: 44px; max-width: 150px; object-fit: contain; }
|
|
53
|
+
.brand-text .eyebrow {
|
|
54
|
+
color: ${primary};
|
|
55
|
+
font-size: 9px;
|
|
56
|
+
font-weight: 700;
|
|
57
|
+
letter-spacing: 0.14em;
|
|
58
|
+
text-transform: uppercase;
|
|
59
|
+
margin-bottom: 3px;
|
|
60
|
+
}
|
|
61
|
+
.brand-text h1 {
|
|
62
|
+
font-size: 20px;
|
|
63
|
+
font-weight: 700;
|
|
64
|
+
color: ${ink};
|
|
65
|
+
margin: 0 0 2px;
|
|
66
|
+
line-height: 1.2;
|
|
67
|
+
}
|
|
68
|
+
.brand-text .company-name { font-size: 11px; color: ${mutedFg}; }
|
|
69
|
+
.meta-block {
|
|
70
|
+
text-align: right;
|
|
71
|
+
font-size: 11px;
|
|
72
|
+
color: ${mutedFg};
|
|
73
|
+
line-height: 1.7;
|
|
74
|
+
white-space: nowrap;
|
|
75
|
+
}
|
|
76
|
+
.meta-block .meta-value { font-weight: 600; color: ${ink}; }
|
|
77
|
+
|
|
78
|
+
/* ── Cards ── */
|
|
79
|
+
.cards {
|
|
80
|
+
display: grid;
|
|
81
|
+
gap: 12px;
|
|
82
|
+
margin-bottom: 18px;
|
|
83
|
+
break-inside: avoid;
|
|
84
|
+
}
|
|
85
|
+
.cards-2 { grid-template-columns: repeat(2, 1fr); }
|
|
86
|
+
.cards-3 { grid-template-columns: repeat(3, 1fr); }
|
|
87
|
+
.cards-4 { grid-template-columns: repeat(4, 1fr); }
|
|
88
|
+
.cards-5 { grid-template-columns: repeat(5, 1fr); }
|
|
89
|
+
.card {
|
|
90
|
+
background: ${mutedBg};
|
|
91
|
+
border: 1px solid ${line};
|
|
92
|
+
border-top: 2px solid ${primary};
|
|
93
|
+
border-radius: 10px;
|
|
94
|
+
padding: 10px 12px;
|
|
95
|
+
}
|
|
96
|
+
.card .card-label {
|
|
97
|
+
font-size: 8.5px;
|
|
98
|
+
font-weight: 700;
|
|
99
|
+
letter-spacing: 0.12em;
|
|
100
|
+
text-transform: uppercase;
|
|
101
|
+
color: ${mutedFg};
|
|
102
|
+
margin-bottom: 4px;
|
|
103
|
+
}
|
|
104
|
+
.card .card-value { font-size: 12px; font-weight: 600; color: ${ink}; }
|
|
105
|
+
.cards-metric .card .card-value { font-size: 17px; font-weight: 700; }
|
|
106
|
+
.card .card-hint { font-size: 9px; color: ${mutedFg}; margin-top: 2px; }
|
|
107
|
+
|
|
108
|
+
/* ── Seções ── */
|
|
109
|
+
h2 {
|
|
110
|
+
font-size: 12.5px;
|
|
111
|
+
font-weight: 700;
|
|
112
|
+
color: ${ink};
|
|
113
|
+
margin: 22px 0 10px;
|
|
114
|
+
padding-bottom: 6px;
|
|
115
|
+
border-bottom: 1px solid ${line};
|
|
116
|
+
text-transform: uppercase;
|
|
117
|
+
letter-spacing: 0.06em;
|
|
118
|
+
break-after: avoid;
|
|
119
|
+
}
|
|
120
|
+
h2 .section-hint {
|
|
121
|
+
float: right;
|
|
122
|
+
font-size: 9.5px;
|
|
123
|
+
font-weight: 400;
|
|
124
|
+
letter-spacing: 0;
|
|
125
|
+
text-transform: none;
|
|
126
|
+
color: ${mutedFg};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* ── Tabela ── */
|
|
130
|
+
.doc-table {
|
|
131
|
+
border-collapse: collapse;
|
|
132
|
+
width: 100%;
|
|
133
|
+
font-size: 10.5px;
|
|
134
|
+
}
|
|
135
|
+
.doc-table.compact { font-size: 9px; }
|
|
136
|
+
.doc-table thead { display: table-header-group; }
|
|
137
|
+
.doc-table thead tr { border-bottom: 1px solid ${line}; }
|
|
138
|
+
.doc-table th {
|
|
139
|
+
background: ${mutedBg};
|
|
140
|
+
color: ${mutedFg};
|
|
141
|
+
font-size: 9px;
|
|
142
|
+
font-weight: 700;
|
|
143
|
+
letter-spacing: 0.08em;
|
|
144
|
+
text-transform: uppercase;
|
|
145
|
+
padding: 7px 8px;
|
|
146
|
+
text-align: left;
|
|
147
|
+
vertical-align: middle;
|
|
148
|
+
}
|
|
149
|
+
.doc-table td {
|
|
150
|
+
border-bottom: 1px solid ${line};
|
|
151
|
+
padding: 6px 8px;
|
|
152
|
+
text-align: left;
|
|
153
|
+
vertical-align: top;
|
|
154
|
+
color: ${ink};
|
|
155
|
+
}
|
|
156
|
+
/*
|
|
157
|
+
* Os tons precisam vencer o color da propria celula: ".doc-table td" tem
|
|
158
|
+
* especificidade 0-1-1 e ".tone-accent" sozinho tem 0-1-0, entao a cor do
|
|
159
|
+
* tom era descartada em toda tabela do sistema — so o font-weight passava,
|
|
160
|
+
* porque a regra da celula nao mexe nele. Quem marca um valor como "warn"
|
|
161
|
+
* quer que ele salte aos olhos, nao que fique so em negrito igual ao resto.
|
|
162
|
+
*/
|
|
163
|
+
.doc-table td.tone-muted { color: ${mutedFg}; }
|
|
164
|
+
.doc-table td.tone-accent { color: ${primary}; }
|
|
165
|
+
.doc-table td.tone-warn { color: #b45309; }
|
|
166
|
+
.doc-table tbody tr { break-inside: avoid; }
|
|
167
|
+
.doc-table tbody tr:last-child td { border-bottom: none; }
|
|
168
|
+
.doc-table.zebra tbody tr:nth-child(even) td { background: ${mutedBg}; }
|
|
169
|
+
.doc-table .align-right { text-align: right; }
|
|
170
|
+
.doc-table .align-center { text-align: center; }
|
|
171
|
+
/* Valor numérico não quebra: "1h 00min" partido em duas linhas dobra a
|
|
172
|
+
altura da linha e desalinha a leitura de cima a baixo. O cabeçalho pode
|
|
173
|
+
quebrar à vontade — é o que mantém "On demand" numa coluna estreita. */
|
|
174
|
+
.doc-table td.align-right,
|
|
175
|
+
.doc-table td.align-center { white-space: nowrap; }
|
|
176
|
+
/* A coluna "#" é numerada no servidor: contador de CSS reiniciaria a cada
|
|
177
|
+
repetição do <thead>. */
|
|
178
|
+
.doc-table .idx {
|
|
179
|
+
width: 30px;
|
|
180
|
+
color: ${mutedFg};
|
|
181
|
+
text-align: right;
|
|
182
|
+
font-variant-numeric: tabular-nums;
|
|
183
|
+
}
|
|
184
|
+
.cell-sub { font-size: 8.5px; color: ${mutedFg}; margin-top: 1px; }
|
|
185
|
+
.tone-muted { color: ${mutedFg}; }
|
|
186
|
+
.tone-bold { font-weight: 700; }
|
|
187
|
+
.tone-accent { color: ${primary}; font-weight: 600; }
|
|
188
|
+
.tone-warn { color: #b45309; font-weight: 600; }
|
|
189
|
+
.table-empty {
|
|
190
|
+
border: 1px dashed ${line};
|
|
191
|
+
border-radius: 10px;
|
|
192
|
+
padding: 18px;
|
|
193
|
+
text-align: center;
|
|
194
|
+
font-size: 10.5px;
|
|
195
|
+
color: ${mutedFg};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* ── Gráficos ── */
|
|
199
|
+
.chart { margin: 4px 0 18px; break-inside: avoid; }
|
|
200
|
+
.chart-title {
|
|
201
|
+
font-size: 10.5px;
|
|
202
|
+
font-weight: 700;
|
|
203
|
+
color: ${ink};
|
|
204
|
+
margin-bottom: 6px;
|
|
205
|
+
}
|
|
206
|
+
.chart svg { width: 100%; height: auto; }
|
|
207
|
+
.chart-caption { font-size: 9px; color: ${mutedFg}; margin-top: 4px; }
|
|
208
|
+
.chart-grid {
|
|
209
|
+
display: grid;
|
|
210
|
+
grid-template-columns: repeat(2, 1fr);
|
|
211
|
+
gap: 16px;
|
|
212
|
+
margin-bottom: 18px;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* ── Notas e legenda ── */
|
|
216
|
+
.note {
|
|
217
|
+
background: ${mutedBg};
|
|
218
|
+
border: 1px solid ${line};
|
|
219
|
+
border-radius: 8px;
|
|
220
|
+
padding: 9px 12px;
|
|
221
|
+
font-size: 10px;
|
|
222
|
+
color: ${mutedFg};
|
|
223
|
+
margin: 12px 0;
|
|
224
|
+
break-inside: avoid;
|
|
225
|
+
}
|
|
226
|
+
.note-accent { border-left: 3px solid ${primary}; }
|
|
227
|
+
.legend {
|
|
228
|
+
margin-top: 18px;
|
|
229
|
+
padding-top: 10px;
|
|
230
|
+
border-top: 1px solid ${line};
|
|
231
|
+
font-size: 9px;
|
|
232
|
+
line-height: 1.6;
|
|
233
|
+
color: ${mutedFg};
|
|
234
|
+
}
|
|
235
|
+
.legend p { margin: 0 0 3px; }
|
|
236
|
+
.page-break { break-before: page; }
|
|
237
|
+
`;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=pdf-document.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.css.js","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.css.ts"],"names":[],"mappings":";;AAmBA,4CA0NC;AA3OD;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,gBAAgB,CAAC,KAAuB,EAAE,SAAS,GAAG,KAAK;IACzE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAEnE,OAAO;;gBAEO,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;;;;;;;;;eAS9B,GAAG;qBACG,UAAU;;;;;;;;;;;;;;iCAcE,IAAI;;;;;eAKtB,OAAO;;;;;;;;;;eAUP,GAAG;;;;0DAIwC,OAAO;;;;eAIlD,OAAO;;;;yDAImC,GAAG;;;;;;;;;;;;;;oBAcxC,OAAO;0BACD,IAAI;8BACA,OAAO;;;;;;;;;eAStB,OAAO;;;oEAG8C,GAAG;;gDAEvB,OAAO;;;;;;eAMxC,GAAG;;;iCAGe,IAAI;;;;;;;;;;;eAWtB,OAAO;;;;;;;;;;;qDAW+B,IAAI;;oBAErC,OAAO;eACZ,OAAO;;;;;;;;;;iCAUW,IAAI;;;;eAItB,GAAG;;;;;;;;;wCASsB,OAAO;yCACN,OAAO;;;;iEAIiB,OAAO;;;;;;;;;;;;eAYzD,OAAO;;;;2CAIqB,OAAO;2BACvB,OAAO;;4BAEN,OAAO;;;2BAGR,IAAI;;;;;eAKhB,OAAO;;;;;;;;eAQP,GAAG;;;;8CAI4B,OAAO;;;;;;;;;;oBAUjC,OAAO;0BACD,IAAI;;;;eAIf,OAAO;;;;4CAIsB,OAAO;;;;8BAIrB,IAAI;;;eAGnB,OAAO;;;;GAInB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PdfDocumentTheme } from './pdf-document.theme';
|
|
2
|
+
import { PdfDocumentBlock, PdfDocumentInput } from './pdf-document.types';
|
|
3
|
+
/**
|
|
4
|
+
* Único ponto por onde texto entra no HTML. Nome de aluno, título de curso e
|
|
5
|
+
* rótulo de tarefa são dados de usuário indo para um Chromium headless.
|
|
6
|
+
*/
|
|
7
|
+
export declare function escapeHtml(value: unknown): string;
|
|
8
|
+
export declare function renderBlock(block: PdfDocumentBlock): string;
|
|
9
|
+
export declare function renderDocumentHtml(input: PdfDocumentInput, theme: PdfDocumentTheme): string;
|
|
10
|
+
//# sourceMappingURL=pdf-document.renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.renderer.d.ts","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.renderer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAEhB,gBAAgB,EAIjB,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASjD;AAiGD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAoD3D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAuC3F"}
|