sagadeck 1.2.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 +21 -0
- package/README.md +305 -0
- package/SKILL.md +148 -0
- package/bin/sagadeck.js +511 -0
- package/docs/ANDAMENTO.md +1255 -0
- package/docs/EXPERIENCIAS.md +39 -0
- package/docs/PLANO-EXPERIENCIAS.md +39 -0
- package/docs/PLANO-TESTE-AULAS-TECNICAS.md +44 -0
- package/docs/PLANO-TESTE-DESINFORMACAO.md +38 -0
- package/docs/REFERENCIA.md +1131 -0
- package/package.json +59 -0
- package/src/adaptive-layouts.js +18 -0
- package/src/ai/art-direction.js +8 -0
- package/src/ai/commands.js +130 -0
- package/src/ai/context.js +245 -0
- package/src/ai/deck-ai.js +1135 -0
- package/src/ai/directions.js +74 -0
- package/src/ai/document-materials.js +49 -0
- package/src/ai/document-visuals.js +215 -0
- package/src/ai/evaluation.js +31 -0
- package/src/ai/ground.js +55 -0
- package/src/ai/llm.js +292 -0
- package/src/ai/quality.js +51 -0
- package/src/ai/relay.js +45 -0
- package/src/ai/staged-generation.js +24 -0
- package/src/ai/transform.js +858 -0
- package/src/ai/usage.js +17 -0
- package/src/ai/variety.js +80 -0
- package/src/ai/video-frames.js +24 -0
- package/src/ai/video-generation.js +126 -0
- package/src/ai/web-operation.js +31 -0
- package/src/algo-catalog.js +153 -0
- package/src/algo-trace.js +139 -0
- package/src/api-client.js +514 -0
- package/src/api-collections.js +14 -0
- package/src/api-demo.js +222 -0
- package/src/aspect.js +40 -0
- package/src/build.js +323 -0
- package/src/carousel.js +56 -0
- package/src/chrome.js +65 -0
- package/src/code-highlight.js +68 -0
- package/src/code-lab-browser.js +22 -0
- package/src/code-lab.js +3 -0
- package/src/code-language.js +52 -0
- package/src/csv.js +74 -0
- package/src/decision-lab.js +20 -0
- package/src/deck-file.js +119 -0
- package/src/diagram/napkin-examples.js +13 -0
- package/src/diagram/napkin.js +539 -0
- package/src/docx.js +128 -0
- package/src/dynamics/git-sim.js +200 -0
- package/src/dynamics/layouts.js +112 -0
- package/src/elements.js +554 -0
- package/src/experiences.js +124 -0
- package/src/exploration.js +31 -0
- package/src/export/browser.js +53 -0
- package/src/export/estudo.js +67 -0
- package/src/export/pptx.js +475 -0
- package/src/export/roteiro.js +40 -0
- package/src/export/shots.js +182 -0
- package/src/figures/charts.js +383 -0
- package/src/figures/diagrams.js +117 -0
- package/src/figures/icons.js +166 -0
- package/src/figures/material-pictos.js +20 -0
- package/src/figures/pictos.js +255 -0
- package/src/figures/points.js +106 -0
- package/src/figures/qr.js +29 -0
- package/src/figures/ufmap.js +48 -0
- package/src/fiscal/autofix.js +377 -0
- package/src/fiscal/normalize.js +115 -0
- package/src/graph-lab.js +24 -0
- package/src/hologram.js +30 -0
- package/src/identity.js +86 -0
- package/src/import/crop.js +59 -0
- package/src/import/index.js +132 -0
- package/src/import/legacy-word.js +42 -0
- package/src/import/merge.js +45 -0
- package/src/import/office.js +123 -0
- package/src/import/omml.js +69 -0
- package/src/import/pdf-render.js +56 -0
- package/src/import/pptx.js +701 -0
- package/src/import/xml.js +42 -0
- package/src/infographic.js +401 -0
- package/src/layouts.js +723 -0
- package/src/lessons.js +171 -0
- package/src/library.js +399 -0
- package/src/markup.js +116 -0
- package/src/master.js +214 -0
- package/src/mcp/server.js +371 -0
- package/src/meeting.js +42 -0
- package/src/motion.js +56 -0
- package/src/package.js +116 -0
- package/src/playground.js +19 -0
- package/src/portal-scene.js +20 -0
- package/src/preferences.js +61 -0
- package/src/protect.js +51 -0
- package/src/purpose.js +24 -0
- package/src/pytrace.js +1092 -0
- package/src/research/duckduckgo.js +73 -0
- package/src/research/research.js +202 -0
- package/src/research/svg-image.js +17 -0
- package/src/research/visuals.js +52 -0
- package/src/runtime/api-collection-ui.js +5 -0
- package/src/runtime/api-collections.js +28 -0
- package/src/runtime/api-core.js +530 -0
- package/src/runtime/api-ui.js +966 -0
- package/src/runtime/base.css +1774 -0
- package/src/runtime/calc.js +139 -0
- package/src/runtime/code-lab.js +371 -0
- package/src/runtime/decision-lab.js +49 -0
- package/src/runtime/diagram.js +341 -0
- package/src/runtime/fit.js +268 -0
- package/src/runtime/fonts/caveat.css +2 -0
- package/src/runtime/fonts/comic-neue.css +3 -0
- package/src/runtime/fonts/fredoka.css +2 -0
- package/src/runtime/fonts/index.json +10 -0
- package/src/runtime/fonts/inter.css +2 -0
- package/src/runtime/fonts/patrick-hand.css +2 -0
- package/src/runtime/fonts/plus-jakarta-sans.css +2 -0
- package/src/runtime/fonts/press-start-2p.css +2 -0
- package/src/runtime/fonts/vt323.css +2 -0
- package/src/runtime/formula.js +148 -0
- package/src/runtime/graph-lab.js +72 -0
- package/src/runtime/meeting.css +7 -0
- package/src/runtime/meeting.js +10 -0
- package/src/runtime/motion.js +15 -0
- package/src/runtime/playground.js +11 -0
- package/src/runtime/points.js +19 -0
- package/src/runtime/portal-scene.css +6 -0
- package/src/runtime/portal-scene.js +22 -0
- package/src/runtime/runtime.js +827 -0
- package/src/runtime/science.js +89 -0
- package/src/runtime/skins/aluminio.css +31 -0
- package/src/runtime/skins/arcade.css +25 -0
- package/src/runtime/skins/aurora.css +17 -0
- package/src/runtime/skins/bauhaus.css +19 -0
- package/src/runtime/skins/editorial.css +19 -0
- package/src/runtime/skins/jornal.css +17 -0
- package/src/runtime/skins/manual-noite.css +14 -0
- package/src/runtime/skins/manual.css +14 -0
- package/src/runtime/skins/noite.css +21 -0
- package/src/runtime/skins/oceano.css +17 -0
- package/src/runtime/skins/pop.css +23 -0
- package/src/runtime/skins/prata.css +18 -0
- package/src/runtime/skins/prisma.css +28 -0
- package/src/runtime/skins/rabisco.css +18 -0
- package/src/runtime/skins/relevo.css +33 -0
- package/src/runtime/skins/sinal.css +16 -0
- package/src/runtime/skins/terminal.css +23 -0
- package/src/runtime/vendor/KATEX-LICENSE.txt +21 -0
- package/src/runtime/vendor/MERMAID-LICENSE.txt +21 -0
- package/src/runtime/vendor/PLOTLY-LICENSE.txt +21 -0
- package/src/runtime/vendor/katex.css +1 -0
- package/src/runtime/vendor/mermaid.min.js +3636 -0
- package/src/runtime/vendor/plotly.min.js +3620 -0
- package/src/runtime/video-player.js +35 -0
- package/src/science.js +162 -0
- package/src/studio/ai-response.js +36 -0
- package/src/studio/api-routes.js +152 -0
- package/src/studio/assets/contexto/leia-me.md +12 -0
- package/src/studio/assets/contexto/vendas.csv +7 -0
- package/src/studio/assets/imagens/colecao-arquitetura.png +0 -0
- package/src/studio/assets/imagens/colecao-cor.png +0 -0
- package/src/studio/assets/imagens/colecao-equipe.png +0 -0
- package/src/studio/assets/imagens/lavanda-cover.jpg +0 -0
- package/src/studio/code-routes.js +32 -0
- package/src/studio/command-approval.js +48 -0
- package/src/studio/demo-decks.js +98 -0
- package/src/studio/direction-routes.js +29 -0
- package/src/studio/errors.js +65 -0
- package/src/studio/exploration-demo.js +17 -0
- package/src/studio/exporting.js +105 -0
- package/src/studio/generation-report.js +10 -0
- package/src/studio/instance.js +48 -0
- package/src/studio/layout-samples.js +152 -0
- package/src/studio/project.js +371 -0
- package/src/studio/public/api-collections.js +28 -0
- package/src/studio/public/app.js +5265 -0
- package/src/studio/public/art-preview.js +10 -0
- package/src/studio/public/calc-fields.js +11 -0
- package/src/studio/public/chat-progress.js +47 -0
- package/src/studio/public/developer-fields.js +22 -0
- package/src/studio/public/explorer.js +443 -0
- package/src/studio/public/history.js +58 -0
- package/src/studio/public/index.html +867 -0
- package/src/studio/public/inspector.js +270 -0
- package/src/studio/public/lab-fields.js +5 -0
- package/src/studio/public/library.css +275 -0
- package/src/studio/public/library.html +55 -0
- package/src/studio/public/library.js +471 -0
- package/src/studio/public/merge-decks.js +155 -0
- package/src/studio/public/review-ui.js +100 -0
- package/src/studio/public/screenshot-editor.js +140 -0
- package/src/studio/public/share-ui.js +72 -0
- package/src/studio/public/slide-clipboard.js +23 -0
- package/src/studio/public/slide-form.js +1263 -0
- package/src/studio/public/studio-awareness.js +154 -0
- package/src/studio/public/studio-next.css +303 -0
- package/src/studio/public/style.css +1262 -0
- package/src/studio/public/ui-icons.js +2 -0
- package/src/studio/public/viewers.js +372 -0
- package/src/studio/public/visual-editor.js +326 -0
- package/src/studio/public/workspace.js +18 -0
- package/src/studio/public-files.js +1 -0
- package/src/studio/request-helpers.js +41 -0
- package/src/studio/server.js +1583 -0
- package/src/studio/share-routes.js +146 -0
- package/src/studio/slide-copy-routes.js +26 -0
- package/src/studio/slide-copy.js +30 -0
- package/src/studio/snapshot.js +160 -0
- package/src/studio/style-routes.js +103 -0
- package/src/studio/template-collections.js +97 -0
- package/src/studio/versions.js +95 -0
- package/src/studio/video-download.js +29 -0
- package/src/studio/visual-keys.js +52 -0
- package/src/studio/workspaces.js +39 -0
- package/src/table.js +93 -0
- package/src/templates/scaffold.js +372 -0
- package/src/themes.js +604 -0
- package/src/trace-view.js +450 -0
- package/src/uid.js +19 -0
- package/src/video-player.js +40 -0
- package/src/visual-edits.js +99 -0
- package/src/ws.js +134 -0
- package/templates/cenario/Texto no cen/303/241rio.yaml" +171 -0
- package/templates/cenario/imagens/cidade.svg +30 -0
- package/templates/cenario/imagens/pessoa.svg +15 -0
- package/templates/cenario-e-ciencia.yaml +47 -0
- package/templates/ensaio-api.yaml +160 -0
- package/templates/exemplo-alegre.yaml +75 -0
- package/templates/exemplo-keynote.yaml +90 -0
- package/templates/exemplo-napkin.yaml +139 -0
- package/templates/exemplo.yaml +228 -0
package/src/themes.js
ADDED
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
// Temas do sagadeck.
|
|
2
|
+
//
|
|
3
|
+
// Cada tema define:
|
|
4
|
+
// colors – paleta base (hex sem '#', como o PowerPoint gosta)
|
|
5
|
+
// tones – "tons" de slide: light | dark | accent | alert. Cada tom remapeia
|
|
6
|
+
// as variáveis --bg/--fg/--muted/--line/--surface/--hi/--em
|
|
7
|
+
// faces – papéis tipográficos (display, heading, body, label, mono, quote).
|
|
8
|
+
// `css` é o que o navegador usa; `pptx` é a face exata que o PowerPoint
|
|
9
|
+
// vai usar. Usamos fontes que existem no Windows/Office, então o HTML e
|
|
10
|
+
// o .pptx ficam iguais na máquina de quem apresenta.
|
|
11
|
+
// fontFaces – @font-face extras (ex.: Bahnschrift variável com eixo de largura)
|
|
12
|
+
// deco – decoração de fundo opcional (grain, grid, none)
|
|
13
|
+
//
|
|
14
|
+
// Temas customizados no YAML: theme: { extends: sinal, colors: { accent: "3DDC97" } }
|
|
15
|
+
|
|
16
|
+
const SYS_SANS = "'Segoe UI', 'Helvetica Neue', Arial, sans-serif";
|
|
17
|
+
const SYS_MONO = "'Cascadia Mono', Consolas, 'SF Mono', Menlo, monospace";
|
|
18
|
+
|
|
19
|
+
export const THEMES = {
|
|
20
|
+
sinal: {
|
|
21
|
+
label: "Sinal — sinalização/segurança: DIN condensada, amarelo de aviso, pictogramas",
|
|
22
|
+
colors: {
|
|
23
|
+
paper: "F2F0EB", ink: "121212", accent: "FFC20E", alert: "E4401F",
|
|
24
|
+
muted: "6F6C66", line: "D6D2C8", surface: "E7E4DC", surfaceDark: "1E1E1E",
|
|
25
|
+
c1: "FFC20E", c2: "121212", c3: "E4401F", c4: "8C8880", c5: "3F3D39",
|
|
26
|
+
},
|
|
27
|
+
tones: {
|
|
28
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "alert", onHi: "ink" },
|
|
29
|
+
dark: { bg: "ink", fg: "paper", muted: "9C988F", line: "3A3936", surface: "surfaceDark", hi: "accent", em: "accent", onHi: "ink" },
|
|
30
|
+
accent: { bg: "accent", fg: "ink", muted: "5B4A10", line: "D9A300", surface: "FFD24D", hi: "ink", em: "ink", onHi: "accent" },
|
|
31
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFD2C6", line: "F07A5E", surface: "C93517", hi: "ink", em: "ink", onHi: "FFFFFF" },
|
|
32
|
+
},
|
|
33
|
+
fontFaces: [
|
|
34
|
+
{ family: "SagaDIN", src: "local('Bahnschrift')", weight: "300 700", stretch: "75% 100%" },
|
|
35
|
+
],
|
|
36
|
+
faces: {
|
|
37
|
+
display: { css: "font-family: SagaDIN, 'Arial Narrow', sans-serif; font-weight: 700; font-stretch: 75%; letter-spacing: -0.005em; line-height: 0.92;", pptx: { face: "Bahnschrift Condensed", bold: true } },
|
|
38
|
+
heading: { css: "font-family: SagaDIN, Arial, sans-serif; font-weight: 600; font-stretch: 87.5%; letter-spacing: 0; line-height: 1.02;", pptx: { face: "Bahnschrift SemiBold SemiConden" } },
|
|
39
|
+
body: { css: "font-family: SagaDIN, Arial, sans-serif; font-weight: 400; font-stretch: 100%; line-height: 1.28;", pptx: { face: "Bahnschrift" }, pptxBold: { face: "Bahnschrift SemiBold" } },
|
|
40
|
+
label: { css: "font-family: SagaDIN, Arial, sans-serif; font-weight: 600; font-stretch: 100%; letter-spacing: 0.14em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Bahnschrift SemiBold" } },
|
|
41
|
+
mono: { css: `font-family: ${SYS_MONO}; font-weight: 400; line-height: 1.4;`, pptx: { face: "Cascadia Mono" }, pptxBold: { face: "Cascadia Mono SemiBold" } },
|
|
42
|
+
quote: { css: "font-family: Georgia, 'Times New Roman', serif; font-style: italic; font-weight: 400; line-height: 1.12; letter-spacing: -0.01em;", pptx: { face: "Georgia", italic: true } },
|
|
43
|
+
},
|
|
44
|
+
radius: 14, deco: "grain",
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
editorial: {
|
|
48
|
+
label: "Editorial — revista: serifada grande, muito branco, um vermelho-tomate",
|
|
49
|
+
colors: {
|
|
50
|
+
paper: "FAF9F6", ink: "141414", accent: "E0432B", alert: "E0432B",
|
|
51
|
+
muted: "6B6A66", line: "DEDBD4", surface: "F0EEE8", surfaceDark: "222222",
|
|
52
|
+
c1: "E0432B", c2: "141414", c3: "8C8A84", c4: "C9C5BC", c5: "F2A28F",
|
|
53
|
+
},
|
|
54
|
+
tones: {
|
|
55
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "F7D9D2", em: "accent", onHi: "ink" },
|
|
56
|
+
dark: { bg: "ink", fg: "paper", muted: "A09E98", line: "3A3A3A", surface: "surfaceDark", hi: "accent", em: "F26A52", onHi: "FFFFFF" },
|
|
57
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "FFD9D1", line: "F07A66", surface: "C8361F", hi: "ink", em: "ink", onHi: "FFFFFF" },
|
|
58
|
+
alert: { bg: "ink", fg: "paper", muted: "A09E98", line: "3A3A3A", surface: "surfaceDark", hi: "accent", em: "F26A52", onHi: "FFFFFF" },
|
|
59
|
+
},
|
|
60
|
+
fontFaces: [],
|
|
61
|
+
faces: {
|
|
62
|
+
display: { css: "font-family: Georgia, 'Times New Roman', serif; font-weight: 400; letter-spacing: -0.025em; line-height: 0.98;", pptx: { face: "Georgia" } },
|
|
63
|
+
heading: { css: "font-family: Georgia, serif; font-weight: 400; letter-spacing: -0.015em; line-height: 1.05;", pptx: { face: "Georgia" } },
|
|
64
|
+
body: { css: `font-family: ${SYS_SANS}; font-weight: 400; line-height: 1.34;`, pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
65
|
+
label: { css: `font-family: ${SYS_SANS}; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; line-height: 1.2;`, pptx: { face: "Segoe UI Semibold" } },
|
|
66
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
67
|
+
quote: { css: "font-family: Georgia, serif; font-style: italic; line-height: 1.12; letter-spacing: -0.015em;", pptx: { face: "Georgia", italic: true } },
|
|
68
|
+
},
|
|
69
|
+
radius: 4, deco: "none",
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
noite: {
|
|
73
|
+
label: "Noite — escuro elegante: Segoe fina, latão, contraste alto",
|
|
74
|
+
colors: {
|
|
75
|
+
paper: "0F1115", ink: "EDEBE6", accent: "E4B660", alert: "FF6B57",
|
|
76
|
+
muted: "8E8C86", line: "2A2D33", surface: "181B21", surfaceDark: "181B21",
|
|
77
|
+
c1: "E4B660", c2: "EDEBE6", c3: "FF6B57", c4: "6F7C8A", c5: "A99A7A",
|
|
78
|
+
},
|
|
79
|
+
tones: {
|
|
80
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "accent", onHi: "0F1115" },
|
|
81
|
+
dark: { bg: "08090B", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "accent", onHi: "0F1115" },
|
|
82
|
+
accent: { bg: "accent", fg: "0F1115", muted: "5E4A22", line: "C79A45", surface: "EBC57C", hi: "0F1115", em: "0F1115", onHi: "accent" },
|
|
83
|
+
alert: { bg: "alert", fg: "0F1115", muted: "5A1E16", line: "E05645", surface: "FF8A7A", hi: "0F1115", em: "0F1115", onHi: "alert" },
|
|
84
|
+
},
|
|
85
|
+
fontFaces: [],
|
|
86
|
+
faces: {
|
|
87
|
+
display: { css: `font-family: 'Segoe UI Light', 'Segoe UI', ${SYS_SANS}; font-weight: 300; letter-spacing: -0.03em; line-height: 0.98;`, pptx: { face: "Segoe UI Light" } },
|
|
88
|
+
heading: { css: `font-family: 'Segoe UI Semibold', 'Segoe UI', ${SYS_SANS}; font-weight: 600; letter-spacing: -0.01em; line-height: 1.08;`, pptx: { face: "Segoe UI Semibold" } },
|
|
89
|
+
body: { css: `font-family: ${SYS_SANS}; font-weight: 400; line-height: 1.36;`, pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
90
|
+
label: { css: `font-family: 'Segoe UI Semibold', ${SYS_SANS}; font-weight: 600; letter-spacing: 0.2em; text-transform: uppercase; line-height: 1.2;`, pptx: { face: "Segoe UI Semibold" } },
|
|
91
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
92
|
+
quote: { css: "font-family: Georgia, serif; font-style: italic; line-height: 1.15;", pptx: { face: "Georgia", italic: true } },
|
|
93
|
+
},
|
|
94
|
+
radius: 18, deco: "none",
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
bauhaus: {
|
|
98
|
+
label: "Bauhaus — geométrico: Century Gothic, vermelho/azul/amarelo primários",
|
|
99
|
+
colors: {
|
|
100
|
+
paper: "F3EEE3", ink: "1A1A1A", accent: "D93A2B", alert: "1F4AA8",
|
|
101
|
+
muted: "6E6A60", line: "D8D1C2", surface: "E8E1D2", surfaceDark: "262626",
|
|
102
|
+
c1: "D93A2B", c2: "1F4AA8", c3: "F2B33D", c4: "1A1A1A", c5: "9C958A",
|
|
103
|
+
},
|
|
104
|
+
tones: {
|
|
105
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "F2B33D", em: "accent", onHi: "ink" },
|
|
106
|
+
dark: { bg: "ink", fg: "paper", muted: "A7A195", line: "3A3A3A", surface: "surfaceDark", hi: "F2B33D", em: "F2B33D", onHi: "ink" },
|
|
107
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "FFD6CF", line: "E86C5E", surface: "B92E21", hi: "F2B33D", em: "F2B33D", onHi: "ink" },
|
|
108
|
+
alert: { bg: "1F4AA8", fg: "FFFFFF", muted: "C9D6F2", line: "4C6FC0", surface: "183C8C", hi: "F2B33D", em: "F2B33D", onHi: "ink" },
|
|
109
|
+
},
|
|
110
|
+
fontFaces: [],
|
|
111
|
+
faces: {
|
|
112
|
+
display: { css: "font-family: 'Century Gothic', 'Futura', sans-serif; font-weight: 700; letter-spacing: -0.03em; line-height: 0.95;", pptx: { face: "Century Gothic", bold: true } },
|
|
113
|
+
heading: { css: "font-family: 'Century Gothic', 'Futura', sans-serif; font-weight: 700; letter-spacing: -0.01em; line-height: 1.05;", pptx: { face: "Century Gothic", bold: true } },
|
|
114
|
+
body: { css: "font-family: 'Century Gothic', 'Futura', sans-serif; font-weight: 400; line-height: 1.34;", pptx: { face: "Century Gothic" } },
|
|
115
|
+
label: { css: "font-family: 'Century Gothic', sans-serif; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Century Gothic", bold: true } },
|
|
116
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
117
|
+
quote: { css: "font-family: 'Century Gothic', sans-serif; font-style: italic; line-height: 1.15;", pptx: { face: "Century Gothic", italic: true } },
|
|
118
|
+
},
|
|
119
|
+
radius: 0, deco: "none",
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
terminal: {
|
|
123
|
+
label: "Terminal — dados/tech sem neon: monoespaçada, âmbar, fundo grafite",
|
|
124
|
+
colors: {
|
|
125
|
+
paper: "0D0E0D", ink: "DAD6CC", accent: "FFB224", alert: "FF5F4A",
|
|
126
|
+
muted: "85817A", line: "2A2B29", surface: "171816", surfaceDark: "171816",
|
|
127
|
+
c1: "FFB224", c2: "DAD6CC", c3: "FF5F4A", c4: "6E8B74", c5: "8A7F6A",
|
|
128
|
+
},
|
|
129
|
+
tones: {
|
|
130
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "accent", onHi: "0D0E0D" },
|
|
131
|
+
dark: { bg: "050505", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "accent", onHi: "0D0E0D" },
|
|
132
|
+
accent: { bg: "accent", fg: "0D0E0D", muted: "6B4A0A", line: "D9941A", surface: "FFC45A", hi: "0D0E0D", em: "0D0E0D", onHi: "accent" },
|
|
133
|
+
alert: { bg: "alert", fg: "0D0E0D", muted: "5C1A12", line: "E0503D", surface: "FF7F6D", hi: "0D0E0D", em: "0D0E0D", onHi: "alert" },
|
|
134
|
+
},
|
|
135
|
+
fontFaces: [],
|
|
136
|
+
faces: {
|
|
137
|
+
display: { css: `font-family: 'Cascadia Mono SemiBold', 'Cascadia Mono', ${SYS_MONO}; font-weight: 600; letter-spacing: -0.03em; line-height: 1.0;`, pptx: { face: "Cascadia Mono SemiBold" } },
|
|
138
|
+
heading: { css: `font-family: 'Cascadia Mono SemiBold', 'Cascadia Mono', ${SYS_MONO}; font-weight: 600; letter-spacing: -0.02em; line-height: 1.1;`, pptx: { face: "Cascadia Mono SemiBold" } },
|
|
139
|
+
body: { css: `font-family: ${SYS_SANS}; font-weight: 400; line-height: 1.36;`, pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
140
|
+
label: { css: `font-family: ${SYS_MONO}; font-weight: 400; letter-spacing: 0.08em; text-transform: uppercase; line-height: 1.2;`, pptx: { face: "Cascadia Mono" } },
|
|
141
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
142
|
+
quote: { css: `font-family: ${SYS_MONO}; font-style: italic; line-height: 1.2;`, pptx: { face: "Cascadia Mono", italic: true } },
|
|
143
|
+
},
|
|
144
|
+
radius: 6, deco: "grid",
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
jornal: {
|
|
148
|
+
label: "Jornal — manchete: Franklin Gothic pesada, papel-jornal, azul-tinta",
|
|
149
|
+
colors: {
|
|
150
|
+
paper: "F4F1EA", ink: "111111", accent: "1D5FA8", alert: "C8352B",
|
|
151
|
+
muted: "66625B", line: "D3CEC3", surface: "E9E5DB", surfaceDark: "1F1F1F",
|
|
152
|
+
c1: "1D5FA8", c2: "111111", c3: "C8352B", c4: "8E8A82", c5: "7FA7D4",
|
|
153
|
+
},
|
|
154
|
+
tones: {
|
|
155
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "D5E3F3", em: "accent", onHi: "ink" },
|
|
156
|
+
dark: { bg: "ink", fg: "paper", muted: "A29E96", line: "3B3B3B", surface: "surfaceDark", hi: "accent", em: "7FA7D4", onHi: "FFFFFF" },
|
|
157
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "CFE0F4", line: "4B80BD", surface: "174F8C", hi: "ink", em: "ink", onHi: "FFFFFF" },
|
|
158
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFD4CF", line: "DE6259", surface: "A62B22", hi: "ink", em: "ink", onHi: "FFFFFF" },
|
|
159
|
+
},
|
|
160
|
+
fontFaces: [],
|
|
161
|
+
faces: {
|
|
162
|
+
display: { css: "font-family: 'Franklin Gothic Heavy', 'Franklin Gothic', 'Arial Black', sans-serif; font-weight: 400; letter-spacing: -0.015em; line-height: 0.94;", pptx: { face: "Franklin Gothic Heavy" } },
|
|
163
|
+
heading: { css: "font-family: 'Franklin Gothic Demi', 'Franklin Gothic', Arial, sans-serif; font-weight: 400; line-height: 1.05;", pptx: { face: "Franklin Gothic Demi" } },
|
|
164
|
+
body: { css: "font-family: 'Franklin Gothic Book', 'Franklin Gothic', Arial, sans-serif; font-weight: 400; line-height: 1.32;", pptx: { face: "Franklin Gothic Book" }, pptxBold: { face: "Franklin Gothic Demi" } },
|
|
165
|
+
label: { css: "font-family: 'Franklin Gothic Demi', Arial, sans-serif; font-weight: 400; letter-spacing: 0.12em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Franklin Gothic Demi" } },
|
|
166
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
167
|
+
quote: { css: "font-family: Georgia, serif; font-style: italic; line-height: 1.14;", pptx: { face: "Georgia", italic: true } },
|
|
168
|
+
},
|
|
169
|
+
radius: 0, deco: "none",
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
rabisco: {
|
|
173
|
+
label: "Rabisco — artesanal & lousa: fontes desenhadas à mão, doodles, post-its e traços orgânicos",
|
|
174
|
+
colors: {
|
|
175
|
+
paper: "FFFDF6", ink: "2B2824", accent: "FF5C5C", alert: "E84118",
|
|
176
|
+
muted: "736D65", line: "E5DCCB", surface: "FFF7DB", surfaceDark: "302C28",
|
|
177
|
+
c1: "FF5C5C", c2: "2E86DE", c3: "FBC531", c4: "4CD137", c5: "9C88FF",
|
|
178
|
+
},
|
|
179
|
+
tones: {
|
|
180
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "FBC531", em: "accent", onHi: "ink" },
|
|
181
|
+
dark: { bg: "ink", fg: "paper", muted: "B0A89C", line: "4A453F", surface: "surfaceDark", hi: "FBC531", em: "accent", onHi: "ink" },
|
|
182
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "FFD0D0", line: "FF8585", surface: "D93838", hi: "FBC531", em: "ink", onHi: "ink" },
|
|
183
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFC5B8", line: "FF6E4A", surface: "B82805", hi: "FBC531", em: "ink", onHi: "FFFFFF" },
|
|
184
|
+
},
|
|
185
|
+
fontFaces: [],
|
|
186
|
+
faces: {
|
|
187
|
+
display: { css: "font-family: 'Caveat', 'Patrick Hand', 'Comic Sans MS', 'Ink Free', 'Segoe Print', cursive; font-weight: 700; letter-spacing: 0.01em; line-height: 1.02;", pptx: { face: "Ink Free", bold: true } },
|
|
188
|
+
heading: { css: "font-family: 'Caveat', 'Patrick Hand', 'Comic Sans MS', 'Ink Free', 'Segoe Print', cursive; font-weight: 700; letter-spacing: 0; line-height: 1.08;", pptx: { face: "Ink Free" } },
|
|
189
|
+
body: { css: "font-family: 'Patrick Hand', 'Comic Neue', 'Comic Sans MS', 'Segoe UI', cursive, sans-serif; font-weight: 400; line-height: 1.34;", pptx: { face: "Comic Sans MS" }, pptxBold: { face: "Comic Sans MS", bold: true } },
|
|
190
|
+
label: { css: "font-family: 'Patrick Hand', 'Comic Neue', 'Comic Sans MS', cursive; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Comic Sans MS", bold: true } },
|
|
191
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
192
|
+
quote: { css: "font-family: 'Caveat', 'Ink Free', cursive; font-style: normal; font-weight: 700; line-height: 1.1;", pptx: { face: "Ink Free", bold: true } },
|
|
193
|
+
},
|
|
194
|
+
radius: 18, deco: "sketch",
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
oceano: {
|
|
198
|
+
label: "Oceano — azul elétrico vivo: visual ultra vibrante, dinâmico, moderno e luminoso",
|
|
199
|
+
colors: {
|
|
200
|
+
paper: "F0F6FF", ink: "091830", accent: "0062FF", alert: "FF3B69",
|
|
201
|
+
muted: "4D6585", line: "D4E4FC", surface: "E2EEFD", surfaceDark: "0E2242",
|
|
202
|
+
c1: "0062FF", c2: "00C6FF", c3: "6366F1", c4: "00DF89", c5: "FFB800",
|
|
203
|
+
},
|
|
204
|
+
tones: {
|
|
205
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "0062FF", em: "accent", onHi: "FFFFFF" },
|
|
206
|
+
dark: { bg: "071120", fg: "F0F6FF", muted: "86A2C7", line: "1A3358", surface: "surfaceDark", hi: "00C6FF", em: "00C6FF", onHi: "091830" },
|
|
207
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "BFDBFE", line: "3B82F6", surface: "004EC4", hi: "00C6FF", em: "FFFFFF", onHi: "091830" },
|
|
208
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFE4EB", line: "FF668B", surface: "D61A47", hi: "FFFFFF", em: "FFFFFF", onHi: "091830" },
|
|
209
|
+
},
|
|
210
|
+
fontFaces: [],
|
|
211
|
+
faces: {
|
|
212
|
+
display: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', -apple-system, sans-serif; font-weight: 800; letter-spacing: -0.035em; line-height: 0.94;", pptx: { face: "Segoe UI", bold: true } },
|
|
213
|
+
heading: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 700; letter-spacing: -0.015em; line-height: 1.04;", pptx: { face: "Segoe UI Semibold" } },
|
|
214
|
+
body: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 450; line-height: 1.34;", pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
215
|
+
label: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Segoe UI Semibold" } },
|
|
216
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
217
|
+
quote: { css: "font-family: Georgia, serif; font-style: italic; line-height: 1.15; letter-spacing: -0.01em;", pptx: { face: "Georgia", italic: true } },
|
|
218
|
+
},
|
|
219
|
+
radius: 16, deco: "glow",
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
pop: {
|
|
223
|
+
label: "Pop — alegre & chiclete: paleta super animada, cartelas fofas, roxo, rosa, menta e sol",
|
|
224
|
+
colors: {
|
|
225
|
+
paper: "FFF9F2", ink: "191534", accent: "8B5CF6", alert: "EC4899",
|
|
226
|
+
muted: "6C6885", line: "FED7AA", surface: "FEF3C7", surfaceDark: "2B2252",
|
|
227
|
+
c1: "8B5CF6", c2: "EC4899", c3: "06B6D4", c4: "10B981", c5: "F59E0B",
|
|
228
|
+
},
|
|
229
|
+
tones: {
|
|
230
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "FDE047", em: "accent", onHi: "ink" },
|
|
231
|
+
dark: { bg: "120E29", fg: "FFF9F2", muted: "9D97B8", line: "352E5E", surface: "surfaceDark", hi: "FDE047", em: "alert", onHi: "ink" },
|
|
232
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "E9D5FF", line: "A855F7", surface: "7C3AED", hi: "FDE047", em: "FFFFFF", onHi: "ink" },
|
|
233
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FCE7F3", line: "F472B6", surface: "DB2777", hi: "FDE047", em: "FFFFFF", onHi: "ink" },
|
|
234
|
+
},
|
|
235
|
+
fontFaces: [],
|
|
236
|
+
faces: {
|
|
237
|
+
display: { css: "font-family: 'Fredoka', 'Century Gothic', -apple-system, sans-serif; font-weight: 700; letter-spacing: -0.02em; line-height: 0.96;", pptx: { face: "Century Gothic", bold: true } },
|
|
238
|
+
heading: { css: "font-family: 'Fredoka', 'Century Gothic', sans-serif; font-weight: 600; line-height: 1.06;", pptx: { face: "Century Gothic", bold: true } },
|
|
239
|
+
body: { css: "font-family: 'Century Gothic', -apple-system, sans-serif; font-weight: 400; line-height: 1.34;", pptx: { face: "Century Gothic" }, pptxBold: { face: "Century Gothic", bold: true } },
|
|
240
|
+
label: { css: "font-family: 'Century Gothic', sans-serif; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Century Gothic", bold: true } },
|
|
241
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
242
|
+
quote: { css: "font-family: 'Fredoka', 'Century Gothic', sans-serif; font-style: italic; line-height: 1.15;", pptx: { face: "Century Gothic", italic: true } },
|
|
243
|
+
},
|
|
244
|
+
radius: 26, deco: "dots",
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
aurora: {
|
|
248
|
+
label: "Aurora — noite mágica: fundo escuro espacial com luzes vivas em neon ciano, violeta e magenta",
|
|
249
|
+
colors: {
|
|
250
|
+
paper: "0A0D17", ink: "F8FAFC", accent: "00F2FE", alert: "FF007A",
|
|
251
|
+
muted: "94A3B8", line: "1E293B", surface: "131A2B", surfaceDark: "131A2B",
|
|
252
|
+
c1: "00F2FE", c2: "4FACFE", c3: "7F00FF", c4: "FF007A", c5: "00FF87",
|
|
253
|
+
},
|
|
254
|
+
tones: {
|
|
255
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "accent", onHi: "0A0D17" },
|
|
256
|
+
dark: { bg: "05070D", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "accent", onHi: "0A0D17" },
|
|
257
|
+
accent: { bg: "1E1B4B", fg: "FFFFFF", muted: "C7D2FE", line: "4338CA", surface: "312E81", hi: "accent", em: "00F2FE", onHi: "0A0D17" },
|
|
258
|
+
alert: { bg: "4C0519", fg: "FFFFFF", muted: "FECDD3", line: "9F1239", surface: "881337", hi: "accent", em: "FF007A", onHi: "0A0D17" },
|
|
259
|
+
},
|
|
260
|
+
fontFaces: [],
|
|
261
|
+
faces: {
|
|
262
|
+
display: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 800; letter-spacing: -0.03em; line-height: 0.95;", pptx: { face: "Segoe UI", bold: true } },
|
|
263
|
+
heading: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 700; letter-spacing: -0.01em; line-height: 1.05;", pptx: { face: "Segoe UI Semibold" } },
|
|
264
|
+
body: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 400; line-height: 1.36;", pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
265
|
+
label: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Segoe UI Semibold" } },
|
|
266
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
267
|
+
quote: { css: "font-family: Georgia, serif; font-style: italic; line-height: 1.15;", pptx: { face: "Georgia", italic: true } },
|
|
268
|
+
},
|
|
269
|
+
radius: 20, deco: "aurora",
|
|
270
|
+
},
|
|
271
|
+
|
|
272
|
+
prata: {
|
|
273
|
+
label: "Prata — Keynote clean & espacial: prata acetinado, muito respiro, tipografia SF / Inter limpa e elegante",
|
|
274
|
+
colors: {
|
|
275
|
+
paper: "F5F5F7", ink: "1D1D1F", accent: "0071E3", alert: "FF3B30",
|
|
276
|
+
muted: "86868B", line: "D2D2D7", surface: "FFFFFF", surfaceDark: "161617",
|
|
277
|
+
c1: "0071E3", c2: "1D1D1F", c3: "86868B", c4: "E5E5EA", c5: "3A3A3C",
|
|
278
|
+
},
|
|
279
|
+
tones: {
|
|
280
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "E8E8ED", em: "accent", onHi: "ink" },
|
|
281
|
+
dark: { bg: "000000", fg: "F5F5F7", muted: "86868B", line: "2C2C2E", surface: "surfaceDark", hi: "3A3A3C", em: "2997FF", onHi: "FFFFFF" },
|
|
282
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "D0E6FF", line: "479DFF", surface: "005BB5", hi: "FFFFFF", em: "FFFFFF", onHi: "0071E3" },
|
|
283
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFD1CF", line: "FF6961", surface: "D32F2F", hi: "FFFFFF", em: "FFFFFF", onHi: "alert" },
|
|
284
|
+
},
|
|
285
|
+
fontFaces: [],
|
|
286
|
+
faces: {
|
|
287
|
+
display: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', 'Segoe UI', 'Helvetica Neue', sans-serif; font-weight: 600; letter-spacing: -0.035em; line-height: 0.98;", pptx: { face: "Segoe UI", bold: true } },
|
|
288
|
+
heading: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', 'Segoe UI', sans-serif; font-weight: 600; letter-spacing: -0.015em; line-height: 1.06;", pptx: { face: "Segoe UI Semibold" } },
|
|
289
|
+
body: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif; font-weight: 400; letter-spacing: -0.005em; line-height: 1.38;", pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
290
|
+
label: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Segoe UI Semibold" } },
|
|
291
|
+
mono: { css: `font-family: 'SF Mono', ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
292
|
+
quote: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', sans-serif; font-weight: 400; letter-spacing: -0.02em; line-height: 1.15;", pptx: { face: "Segoe UI Light" } },
|
|
293
|
+
},
|
|
294
|
+
radius: 20, deco: "silver",
|
|
295
|
+
},
|
|
296
|
+
// Alumínio: a cara dos lançamentos de iPhone e iPad de 2020-2021 (prata metálico, alumínio escovado, títulos
|
|
297
|
+
// cromados, grafite no escuro). O prata segue fiel ao branco da Apple de hoje.
|
|
298
|
+
aluminio: {
|
|
299
|
+
label: "Alumínio — lançamento de iPhone e iPad (2020): prata metálico, títulos cromados, alumínio escovado e grafite",
|
|
300
|
+
colors: {
|
|
301
|
+
paper: "E4E5E9", ink: "1C1C1E", accent: "0066CC", alert: "D70015",
|
|
302
|
+
muted: "5E5E63", line: "C3C5CA", surface: "F4F5F7", surfaceDark: "2C2C2E",
|
|
303
|
+
c1: "0066CC", c2: "3A3A3C", c3: "8E8E93", c4: "B7BAC1", c5: "1C1C1E",
|
|
304
|
+
},
|
|
305
|
+
tones: {
|
|
306
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "D1D3D8", em: "accent", onHi: "ink" },
|
|
307
|
+
dark: { bg: "1C1C1E", fg: "F5F5F7", muted: "A1A1A6", line: "3A3A3C", surface: "surfaceDark", hi: "48484A", em: "2997FF", onHi: "FFFFFF" },
|
|
308
|
+
// azul-pacífico do iPhone 12 Pro, metálico (a pele põe o brilho)
|
|
309
|
+
accent: { bg: "1D3A50", fg: "FFFFFF", muted: "C5D6E3", line: "3F6580", surface: "2A4C64", hi: "FFFFFF", em: "8FC1E3", onHi: "1D3A50" },
|
|
310
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFD1D4", line: "F0525F", surface: "B30012", hi: "FFFFFF", em: "FFFFFF", onHi: "alert" },
|
|
311
|
+
},
|
|
312
|
+
fontFaces: [],
|
|
313
|
+
faces: {
|
|
314
|
+
display: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', 'Segoe UI', 'Helvetica Neue', sans-serif; font-weight: 700; letter-spacing: -0.04em; line-height: 0.96;", pptx: { face: "Segoe UI", bold: true } },
|
|
315
|
+
heading: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', 'Segoe UI', sans-serif; font-weight: 600; letter-spacing: -0.02em; line-height: 1.06;", pptx: { face: "Segoe UI Semibold" } },
|
|
316
|
+
body: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif; font-weight: 400; letter-spacing: -0.005em; line-height: 1.38;", pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
317
|
+
label: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; line-height: 1.2;", pptx: { face: "Segoe UI Semibold" } },
|
|
318
|
+
mono: { css: `font-family: 'SF Mono', ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
319
|
+
quote: { css: "font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', sans-serif; font-weight: 300; letter-spacing: -0.02em; line-height: 1.15;", pptx: { face: "Segoe UI Light" } },
|
|
320
|
+
},
|
|
321
|
+
radius: 24, deco: "none",
|
|
322
|
+
},
|
|
323
|
+
// Arcade: videogame, fliperama, cultura pop dos anos 80 e 90. Tela de tubo azul-noite com linhas de varredura, neon
|
|
324
|
+
// amarelo/ciano/magenta, títulos em pixel (Press Start 2P), rótulos de placar (VT323), cartões com borda de pixel.
|
|
325
|
+
arcade: {
|
|
326
|
+
label: "Arcade — videogame e fliperama: tela de tubo com linhas, neon, títulos em pixel e cartões de 8 bits",
|
|
327
|
+
colors: {
|
|
328
|
+
paper: "0E0B26", ink: "F4F1FF", accent: "FFD23F", alert: "FF3864",
|
|
329
|
+
muted: "A9A3D6", line: "2E2860", surface: "1B1640", surfaceDark: "120E30",
|
|
330
|
+
c1: "FFD23F", c2: "2DE2E6", c3: "FF3864", c4: "7CFF6B", c5: "B967FF",
|
|
331
|
+
},
|
|
332
|
+
tones: {
|
|
333
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "2DE2E6", onHi: "0E0B26" },
|
|
334
|
+
dark: { bg: "050410", fg: "ink", muted: "muted", line: "line", surface: "surfaceDark", hi: "accent", em: "2DE2E6", onHi: "0E0B26" },
|
|
335
|
+
accent: { bg: "3A0CA3", fg: "FFFFFF", muted: "D7C8FF", line: "5B2BD1", surface: "4A1CB8", hi: "FFD23F", em: "FFD23F", onHi: "0E0B26" },
|
|
336
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFD0DA", line: "FF6B8B", surface: "C2183E", hi: "FFD23F", em: "FFFFFF", onHi: "0E0B26" },
|
|
337
|
+
},
|
|
338
|
+
fontFaces: [],
|
|
339
|
+
faces: {
|
|
340
|
+
display: { css: "font-family: 'Press Start 2P', 'Courier New', monospace; font-weight: 400; letter-spacing: -0.02em; line-height: 1.22;", pptx: { face: "Press Start 2P" } },
|
|
341
|
+
heading: { css: "font-family: 'VT323', 'Courier New', monospace; font-weight: 400; letter-spacing: 0.01em; line-height: 0.98;", pptx: { face: "VT323" } },
|
|
342
|
+
body: { css: "font-family: 'Plus Jakarta Sans', 'Segoe UI', sans-serif; font-weight: 500; line-height: 1.36;", pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
343
|
+
label: { css: "font-family: 'VT323', 'Courier New', monospace; font-weight: 400; letter-spacing: 0.12em; text-transform: uppercase; line-height: 1.1;", pptx: { face: "VT323" } },
|
|
344
|
+
mono: { css: `font-family: 'VT323', ${SYS_MONO}; line-height: 1.25;`, pptx: { face: "Cascadia Mono" } },
|
|
345
|
+
quote: { css: "font-family: 'VT323', 'Courier New', monospace; font-weight: 400; line-height: 1.05;", pptx: { face: "VT323" } },
|
|
346
|
+
},
|
|
347
|
+
radius: 0, deco: "none",
|
|
348
|
+
},
|
|
349
|
+
// Relevo: ficção científica sóbria (a sala de controle de um filme, não o fliperama): grafite azulado profundo, curvas
|
|
350
|
+
// de nível ao fundo, painéis de vidro fosco, rótulos técnicos finos em monoespaçada, cantoneiras de mira nos cantos,
|
|
351
|
+
// título leve; gelo e âmbar, sem néon. Feito para ilustração 3D realista (terreno, cidade, água) e gráfico 3D.
|
|
352
|
+
relevo: {
|
|
353
|
+
label: "Relevo — ficção científica sóbria: grafite profundo, curvas de nível, vidro fosco, rótulos técnicos e 3D realista",
|
|
354
|
+
colors: {
|
|
355
|
+
paper: "0B1117", ink: "E6EDF2", accent: "8FD0E0", alert: "F0A35E",
|
|
356
|
+
muted: "8B9AA6", line: "223039", surface: "121C24", surfaceDark: "0E161D",
|
|
357
|
+
c1: "8FD0E0", c2: "F0A35E", c3: "9DB7A5", c4: "C7B3E5", c5: "6E8796",
|
|
358
|
+
},
|
|
359
|
+
tones: {
|
|
360
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "accent", em: "F0A35E", onHi: "0B1117" },
|
|
361
|
+
dark: { bg: "060A0E", fg: "ink", muted: "muted", line: "line", surface: "surfaceDark", hi: "accent", em: "F0A35E", onHi: "0B1117" },
|
|
362
|
+
accent: { bg: "102630", fg: "FFFFFF", muted: "B5CCD6", line: "2C4A57", surface: "17323E", hi: "8FD0E0", em: "F0A35E", onHi: "0B1117" },
|
|
363
|
+
alert: { bg: "3A2412", fg: "FFFFFF", muted: "E8CDB3", line: "6B4422", surface: "4A2F18", hi: "F0A35E", em: "FFD3A6", onHi: "0B1117" },
|
|
364
|
+
},
|
|
365
|
+
fontFaces: [],
|
|
366
|
+
faces: {
|
|
367
|
+
display: { css: "font-family: 'Inter', 'Segoe UI', sans-serif; font-weight: 300; letter-spacing: -0.035em; line-height: 0.98;", pptx: { face: "Segoe UI Light" } },
|
|
368
|
+
heading: { css: "font-family: 'Inter', 'Segoe UI', sans-serif; font-weight: 500; letter-spacing: -0.01em; line-height: 1.08;", pptx: { face: "Segoe UI Semibold" } },
|
|
369
|
+
body: { css: "font-family: 'Inter', 'Segoe UI', sans-serif; font-weight: 400; line-height: 1.42;", pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
370
|
+
label: { css: `font-family: 'Cascadia Mono', ${SYS_MONO}; font-weight: 400; letter-spacing: 0.22em; text-transform: uppercase; line-height: 1.2;`, pptx: { face: "Cascadia Mono" } },
|
|
371
|
+
mono: { css: `font-family: 'Cascadia Mono', ${SYS_MONO}; line-height: 1.4;`, pptx: { face: "Cascadia Mono" } },
|
|
372
|
+
quote: { css: "font-family: 'Inter', 'Segoe UI', sans-serif; font-weight: 200; letter-spacing: -0.02em; line-height: 1.15;", pptx: { face: "Segoe UI Light" } },
|
|
373
|
+
},
|
|
374
|
+
radius: 6, deco: "none",
|
|
375
|
+
},
|
|
376
|
+
// Par técnico (material de consulta, tutorial, apostila): o claro imprime bem, o escuro descansa a vista.
|
|
377
|
+
// pair: o Studio alterna entre os dois (Design › Claro/Escuro) e o PDF pode sair no claro (Preferências).
|
|
378
|
+
manual: {
|
|
379
|
+
label: "Manual — documentação técnica clara: fundo branco, texto escuro, código legível, ótimo para imprimir",
|
|
380
|
+
pair: "manual-noite",
|
|
381
|
+
colors: {
|
|
382
|
+
paper: "FFFFFF", ink: "1F2328", accent: "0969DA", alert: "CF222E",
|
|
383
|
+
muted: "59636E", line: "D0D7DE", surface: "F6F8FA", surfaceDark: "161B22",
|
|
384
|
+
c1: "0969DA", c2: "1A7F37", c3: "9A6700", c4: "8250DF", c5: "CF222E",
|
|
385
|
+
},
|
|
386
|
+
tones: {
|
|
387
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "DDF4FF", em: "accent", onHi: "ink" },
|
|
388
|
+
dark: { bg: "0D1117", fg: "E6EDF3", muted: "9198A1", line: "30363D", surface: "surfaceDark", hi: "1F3A5F", em: "4493F8", onHi: "FFFFFF" },
|
|
389
|
+
accent: { bg: "accent", fg: "FFFFFF", muted: "CFE6FF", line: "3B8BEB", surface: "0550AE", hi: "FFFFFF", em: "FFFFFF", onHi: "accent" },
|
|
390
|
+
alert: { bg: "alert", fg: "FFFFFF", muted: "FFD8D3", line: "E5534B", surface: "A40E26", hi: "FFFFFF", em: "FFFFFF", onHi: "alert" },
|
|
391
|
+
},
|
|
392
|
+
fontFaces: [],
|
|
393
|
+
faces: {
|
|
394
|
+
display: { css: `font-family: 'Segoe UI Variable Display', 'Segoe UI', ${SYS_SANS}; font-weight: 650; letter-spacing: -0.025em; line-height: 1.02;`, pptx: { face: "Segoe UI Semibold" } },
|
|
395
|
+
heading: { css: `font-family: 'Segoe UI Variable Display', 'Segoe UI', ${SYS_SANS}; font-weight: 600; letter-spacing: -0.01em; line-height: 1.12;`, pptx: { face: "Segoe UI Semibold" } },
|
|
396
|
+
body: { css: `font-family: 'Segoe UI', ${SYS_SANS}; font-weight: 400; line-height: 1.5;`, pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
397
|
+
label: { css: `font-family: 'Segoe UI Semibold', ${SYS_SANS}; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; line-height: 1.2;`, pptx: { face: "Segoe UI Semibold" } },
|
|
398
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.5;`, pptx: { face: "Cascadia Mono" } },
|
|
399
|
+
quote: { css: `font-family: 'Segoe UI', ${SYS_SANS}; font-style: italic; line-height: 1.3;`, pptx: { face: "Segoe UI", italic: true } },
|
|
400
|
+
},
|
|
401
|
+
radius: 10, deco: "none",
|
|
402
|
+
},
|
|
403
|
+
"manual-noite": {
|
|
404
|
+
label: "Manual noite — documentação técnica escura: descansa a vista, código em destaque, mesmo arranjo do Manual",
|
|
405
|
+
pair: "manual", dark: true,
|
|
406
|
+
colors: {
|
|
407
|
+
paper: "0D1117", ink: "E6EDF3", accent: "4493F8", alert: "F85149",
|
|
408
|
+
muted: "9198A1", line: "30363D", surface: "161B22", surfaceDark: "161B22",
|
|
409
|
+
c1: "4493F8", c2: "3FB950", c3: "D29922", c4: "A371F7", c5: "F85149",
|
|
410
|
+
},
|
|
411
|
+
tones: {
|
|
412
|
+
light: { bg: "paper", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "1F3A5F", em: "accent", onHi: "FFFFFF" },
|
|
413
|
+
dark: { bg: "010409", fg: "ink", muted: "muted", line: "line", surface: "surface", hi: "1F3A5F", em: "accent", onHi: "FFFFFF" },
|
|
414
|
+
accent: { bg: "1F6FEB", fg: "FFFFFF", muted: "CFE6FF", line: "4493F8", surface: "0550AE", hi: "FFFFFF", em: "FFFFFF", onHi: "1F6FEB" },
|
|
415
|
+
alert: { bg: "DA3633", fg: "FFFFFF", muted: "FFD8D3", line: "F85149", surface: "8E1519", hi: "FFFFFF", em: "FFFFFF", onHi: "DA3633" },
|
|
416
|
+
},
|
|
417
|
+
fontFaces: [],
|
|
418
|
+
faces: {
|
|
419
|
+
display: { css: `font-family: 'Segoe UI Variable Display', 'Segoe UI', ${SYS_SANS}; font-weight: 650; letter-spacing: -0.025em; line-height: 1.02;`, pptx: { face: "Segoe UI Semibold" } },
|
|
420
|
+
heading: { css: `font-family: 'Segoe UI Variable Display', 'Segoe UI', ${SYS_SANS}; font-weight: 600; letter-spacing: -0.01em; line-height: 1.12;`, pptx: { face: "Segoe UI Semibold" } },
|
|
421
|
+
body: { css: `font-family: 'Segoe UI', ${SYS_SANS}; font-weight: 400; line-height: 1.5;`, pptx: { face: "Segoe UI" }, pptxBold: { face: "Segoe UI Semibold" } },
|
|
422
|
+
label: { css: `font-family: 'Segoe UI Semibold', ${SYS_SANS}; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; line-height: 1.2;`, pptx: { face: "Segoe UI Semibold" } },
|
|
423
|
+
mono: { css: `font-family: ${SYS_MONO}; line-height: 1.5;`, pptx: { face: "Cascadia Mono" } },
|
|
424
|
+
quote: { css: `font-family: 'Segoe UI', ${SYS_SANS}; font-style: italic; line-height: 1.3;`, pptx: { face: "Segoe UI", italic: true } },
|
|
425
|
+
},
|
|
426
|
+
radius: 10, deco: "none",
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// Prisma usa tipografia já vendorizada; a pele clara deixa a cor nos pontos de atenção.
|
|
431
|
+
THEMES.prisma = {
|
|
432
|
+
...THEMES.manual,
|
|
433
|
+
label: 'Prisma — claro contemporâneo: azul, verde, violeta, laranja e magenta',
|
|
434
|
+
pair: undefined,
|
|
435
|
+
colors: {paper:'FBFCFF',ink:'182642',accent:'3769E8',alert:'CC1856',muted:'64728B',line:'DFE5F0',surface:'F0F4FC',surfaceDark:'182642',c1:'3769E8',c2:'0B9475',c3:'7954D4',c4:'E47B28',c5:'CC1856'},
|
|
436
|
+
tones: {
|
|
437
|
+
...THEMES.manual.tones,
|
|
438
|
+
light: {bg:'paper',fg:'ink',muted:'muted',line:'line',surface:'surface',hi:'E9EFFF',em:'accent',onHi:'ink'},
|
|
439
|
+
accent: {bg:'EDF2FF',fg:'ink',muted:'muted',line:'D7E2FF',surface:'FFFFFF',hi:'accent',em:'alert',onHi:'FFFFFF'},
|
|
440
|
+
alert: {bg:'FFF0F5',fg:'ink',muted:'muted',line:'F3D6E1',surface:'FFFFFF',hi:'alert',em:'alert',onHi:'FFFFFF'},
|
|
441
|
+
},
|
|
442
|
+
faces: THEMES.aurora.faces,
|
|
443
|
+
radius: 24, deco: 'none',
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
// Paletas: só as cores, independentes do tema (o tema cuida de fonte, arranjo e ornamentos). Qualquer tema aceita
|
|
447
|
+
// qualquer paleta, no deck (palette:) ou num slide. De quatro cores saem os quatro tons (claro, escuro, destaque,
|
|
448
|
+
// alerta). "tema" (ou nada) = as cores do próprio tema.
|
|
449
|
+
export const PALETTES = {
|
|
450
|
+
tinta: { label: "Tinta", paper: "F4F1EA", ink: "161616", accent: "D7263D", alert: "1B998B" },
|
|
451
|
+
floresta: { label: "Floresta", paper: "EEF2E9", ink: "1E2B22", accent: "2F7D4F", alert: "D98E04" },
|
|
452
|
+
mar: { label: "Mar", paper: "EAF4F8", ink: "0B2A3C", accent: "0E7CB8", alert: "F25F5C" },
|
|
453
|
+
entardecer: { label: "Entardecer", paper: "FFF4EA", ink: "2B1A2F", accent: "FF6B35", alert: "C2185B" },
|
|
454
|
+
lavanda: { label: "Lavanda", paper: "F4F1FA", ink: "2A2340", accent: "7B5CD6", alert: "E0569B" },
|
|
455
|
+
grafite: { label: "Grafite", paper: "F2F2F2", ink: "202124", accent: "5F6368", alert: "1A73E8" },
|
|
456
|
+
neon: { label: "Neon", paper: "0B0B12", ink: "F5F5FF", accent: "39FF14", alert: "FF2E97" },
|
|
457
|
+
areia: { label: "Areia", paper: "F3EAD8", ink: "3B2F2F", accent: "C08552", alert: "6B8F71" },
|
|
458
|
+
cereja: { label: "Cereja", paper: "FFF0F3", ink: "3A0D1A", accent: "E63946", alert: "457B9D" },
|
|
459
|
+
corporativo: { label: "Corporativo", paper: "FFFFFF", ink: "1B2A41", accent: "0052CC", alert: "FFAB00" },
|
|
460
|
+
// Paletas de família: a cor forte da marca cansa a vista, então ela vira só o detalhe (alert, a ênfase pontual)
|
|
461
|
+
// e quem trabalha na página são os parentes mais agradáveis dela (accent e family: tons claros e médios da mesma
|
|
462
|
+
// família). family alimenta os gráficos e os grupos dos diagramas no lugar das cores genéricas.
|
|
463
|
+
rubi: { label: "Rubi (vermelho discreto)", paper: "FFFFFF", ink: "3B2B33", accent: "B83A6E", alert: "CC092F", family: ["F9DCE5", "EFA3BC", "D9668F", "B83A6E", "7E2349"] },
|
|
464
|
+
ametista: { label: "Ametista (roxos)", paper: "FFFFFF", ink: "2D2440", accent: "8A05BE", alert: "4B0C7F", family: ["EFE3FA", "D2B4F0", "B07FE0", "8A05BE", "5B2A86"] },
|
|
465
|
+
tangerina: { label: "Tangerina (laranja e marinho)", paper: "FFFFFF", ink: "14213D", accent: "EC7000", alert: "1F4E8C", family: ["FFE3C7", "F9B26B", "EC7000", "1F4E8C", "0E2A55"] },
|
|
466
|
+
safira: { label: "Safira (azuis)", paper: "FFFFFF", ink: "1B2A3A", accent: "1F6FB2", alert: "E8A317", family: ["DCEBF7", "A7CBEA", "5C9FD6", "1F6FB2", "0F3F6E"] },
|
|
467
|
+
esmeralda: { label: "Esmeralda (verdes)", paper: "FFFFFF", ink: "1D2B24", accent: "2E8B57", alert: "0B5D3B", family: ["DDF2E6", "A8DDBE", "5DBB86", "2E8B57", "1B5E3A"] },
|
|
468
|
+
luzquente: { label: "Luz quente (brancos e âmbar, sem neon)", paper: "FFFDF6", ink: "26221A", accent: "B97F14", alert: "8C3B1B", family: ["FFF3D6", "F0D49A", "D9A441", "B97F14", "6E4E0C"] },
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
const rgb = (h) => [0, 2, 4].map((i) => parseInt(String(h).replace("#", "").slice(i, i + 2), 16));
|
|
472
|
+
const hex = (c) => c.map((v) => Math.round(Math.max(0, Math.min(255, v))).toString(16).padStart(2, "0")).join("").toUpperCase();
|
|
473
|
+
// a% de a com o resto de b
|
|
474
|
+
const mix = (a, b, p) => { const x = rgb(a), y = rgb(b); return hex(x.map((v, i) => v * p + y[i] * (1 - p))); };
|
|
475
|
+
const lum = (h) => { const [r, g, b] = rgb(h).map((v) => { v /= 255; return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; }); return 0.2126 * r + 0.7152 * g + 0.0722 * b; };
|
|
476
|
+
const contrast = (a, b) => { const [x, y] = [lum(a), lum(b)].sort((m, n) => n - m); return (x + 0.05) / (y + 0.05); };
|
|
477
|
+
// a cor de texto (entre as da paleta) que mais aparece sobre o fundo `bg`
|
|
478
|
+
const onColor = (bg, p) => (contrast(bg, p.ink) >= contrast(bg, p.paper) ? p.ink : p.paper);
|
|
479
|
+
// "hi" é a cor de DESTAQUE (fundo do marca-texto); como cor de TEXTO pode sumir no fundo (azul-bebê no branco, num
|
|
480
|
+
// estilo tirado do PowerPoint). --hi-ink: o próprio hi quando dá para ler, senão a ênfase, senão a cor do texto.
|
|
481
|
+
const hiInk = (bg, hi, em, fg) => (contrast(hi, bg) >= 3 ? hi : contrast(em, bg) >= 3 ? em : fg);
|
|
482
|
+
|
|
483
|
+
export function paletteColors(p) {
|
|
484
|
+
const { paper, ink, accent, alert } = p;
|
|
485
|
+
// parentes da cor (paletas de família): f1..fN, do mais claro ao mais escuro como vieram
|
|
486
|
+
const family = Object.fromEntries((Array.isArray(p.family) ? p.family : []).slice(0, 8).map((c, i) => [`f${i + 1}`, String(c).replace("#", "").toUpperCase()]));
|
|
487
|
+
const muted = mix(ink, paper, 0.55), line = mix(ink, paper, 0.16), surface = mix(ink, paper, 0.06), surfaceDark = mix(paper, ink, 0.1);
|
|
488
|
+
const tone = (bg, fg, hi, em) => ({ bg, fg, muted: mix(fg, bg, 0.62), line: mix(fg, bg, 0.2), surface: mix(fg, bg, 0.08), hi, em, onHi: onColor(hi, p) });
|
|
489
|
+
const onAccent = onColor(accent, p), onAlert = onColor(alert, p);
|
|
490
|
+
return {
|
|
491
|
+
colors: { paper, ink, accent, alert, muted, line, surface, surfaceDark, c1: accent, c2: ink, c3: alert, c4: muted, c5: mix(accent, alert, 0.5), ...family },
|
|
492
|
+
tones: {
|
|
493
|
+
light: { ...tone(paper, ink, accent, alert), muted, line, surface },
|
|
494
|
+
dark: tone(ink, paper, accent, contrast(ink, alert) > contrast(ink, accent) ? alert : accent),
|
|
495
|
+
accent: tone(accent, onAccent, onAccent, onAccent === ink ? mix(ink, accent, 0.7) : paper),
|
|
496
|
+
alert: tone(alert, onAlert, onAlert, onAlert === ink ? mix(ink, alert, 0.7) : paper),
|
|
497
|
+
},
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Séries 3 a 5 dos gráficos (em vez de cinzas): os parentes da família que aparecem sobre o fundo claro e o escuro.
|
|
502
|
+
function familySeriesCSS(theme, sel) {
|
|
503
|
+
const fam = Object.keys(theme.colors).filter((k) => /^f\d+$/.test(k)).map((k) => theme.colors[k]);
|
|
504
|
+
if (fam.length < 2) return "";
|
|
505
|
+
const { paper, ink } = theme.colors;
|
|
506
|
+
const pick = fam.map((c) => ({ c, k: Math.min(contrast(c, paper), contrast(c, ink)) })).sort((a, b) => b.k - a.k).slice(0, 3).map((x) => x.c);
|
|
507
|
+
return `${sel}{${pick.map((c, i) => `--s${i + 3}:#${c};`).join("")}}\n`;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// Identidade (fontes da empresa, de ~/.sagadeck/identidades.yaml; ver src/identity.js). Corpo, rótulos e código
|
|
511
|
+
// sempre na fonte da empresa; títulos também, menos nos temas com personalidade, que mantêm o título deles (a
|
|
512
|
+
// apresentação fica "da empresa, mas descontraída"). Cada papel vira uma lista: as fontes da empresa na ordem
|
|
513
|
+
// digitada e, se nenhuma estiver instalada, a do tema.
|
|
514
|
+
export const PERSONALITY_THEMES = new Set(["rabisco", "pop", "terminal", "jornal", "bauhaus"]);
|
|
515
|
+
const quoteFont = (f) => (/^[\w-]+$/.test(f) && /^(serif|sans-serif|monospace|cursive|system-ui)$/.test(f) ? f : `'${f.replace(/'/g, "")}'`);
|
|
516
|
+
function applyIdentity(theme, ident) {
|
|
517
|
+
const f = ident.fonts || {};
|
|
518
|
+
const titulo = f.titulo?.length ? f.titulo : f.corpo || [];
|
|
519
|
+
const corpo = f.corpo?.length ? f.corpo : f.titulo || [];
|
|
520
|
+
const own = !PERSONALITY_THEMES.has(theme.name);
|
|
521
|
+
const roles = { body: corpo, label: f.compacta?.length ? f.compacta : corpo, mono: f.codigo || [], ...(own ? { heading: titulo, display: titulo, quote: corpo } : {}) };
|
|
522
|
+
for (const [role, fonts] of Object.entries(roles)) {
|
|
523
|
+
const face = theme.faces[role];
|
|
524
|
+
if (!face || !fonts.length) continue;
|
|
525
|
+
const list = fonts.map(quoteFont).join(", ");
|
|
526
|
+
face.css = /font-family\s*:/.test(face.css) ? face.css.replace(/font-family\s*:\s*([^;]+);/, (m, fam) => `font-family: ${list}, ${fam.trim()};`) : `font-family: ${list};${face.css}`;
|
|
527
|
+
// o PowerPoint quer um nome só: a primeira fonte da empresa (sem ela instalada, ele troca por uma parecida)
|
|
528
|
+
if (face.pptx) face.pptx = { ...face.pptx, face: fonts[0] };
|
|
529
|
+
if (face.pptxBold) face.pptxBold = { ...face.pptxBold, face: fonts[0] };
|
|
530
|
+
}
|
|
531
|
+
theme.identity = ident.id;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// palette: nome de PALETTES, "tema"/vazio (as cores do tema) ou { paper, ink, accent, alert, family } próprias.
|
|
535
|
+
// identity: a identidade (src/identity.js) ou nada; a paleta dela vale quando o deck não escolheu outra.
|
|
536
|
+
export function resolveTheme(spec, palette, identity = null) {
|
|
537
|
+
// (paleta da identidade que não existe é ignorada: o arquivo é da pessoa e não pode quebrar a apresentação)
|
|
538
|
+
const ip = identity?.palette;
|
|
539
|
+
if (ip && (!palette || palette === "tema") && (typeof ip === "object" || PALETTES[ip])) palette = ip;
|
|
540
|
+
const t = typeof spec === "string" ? { extends: spec } : spec || {};
|
|
541
|
+
const base = THEMES[t.extends || "sinal"];
|
|
542
|
+
if (!base) throw new Error(`Tema desconhecido: ${t.extends}. Disponíveis: ${Object.keys(THEMES).join(", ")}`);
|
|
543
|
+
const theme = structuredClone(base);
|
|
544
|
+
theme.name = t.extends || "sinal";
|
|
545
|
+
const pal = !palette || palette === "tema" ? null : typeof palette === "object" ? palette : PALETTES[palette];
|
|
546
|
+
if (palette && palette !== "tema" && !pal) throw new Error(`Paleta desconhecida: ${palette}. Disponíveis: tema, ${Object.keys(PALETTES).join(", ")}`);
|
|
547
|
+
if (pal) Object.assign(theme, paletteColors(pal));
|
|
548
|
+
theme.palette = pal ? (typeof palette === "string" ? palette : "propria") : null;
|
|
549
|
+
// a "cara" do slide: tema + paleta (o CSS de cores de cada combinação vale só nos slides dela)
|
|
550
|
+
theme.key = theme.palette ? `${theme.name}--${theme.palette}` : theme.name;
|
|
551
|
+
Object.assign(theme.colors, t.colors || {});
|
|
552
|
+
for (const [k, v] of Object.entries(t.tones || {})) theme.tones[k] = { ...(theme.tones[k] || {}), ...v };
|
|
553
|
+
for (const [k, v] of Object.entries(t.faces || {})) theme.faces[k] = { ...(theme.faces[k] || {}), ...v };
|
|
554
|
+
if (t.fontFaces) theme.fontFaces = [...theme.fontFaces, ...t.fontFaces];
|
|
555
|
+
if (t.radius != null) theme.radius = t.radius;
|
|
556
|
+
if (t.deco != null) theme.deco = t.deco;
|
|
557
|
+
if (identity) applyIdentity(theme, identity);
|
|
558
|
+
return theme;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// cor por nome ("accent", "ink") ou hex
|
|
562
|
+
export function col(theme, v) {
|
|
563
|
+
if (!v) return v;
|
|
564
|
+
const s = String(v).replace(/^#/, "");
|
|
565
|
+
if (theme.colors[s]) return theme.colors[s];
|
|
566
|
+
return s;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
const fontFaceCSS = (theme) => (theme.fontFaces || []).map((f) => `@font-face{font-family:${f.family};src:${f.src};${f.weight ? `font-weight:${f.weight};` : ""}${f.stretch ? `font-stretch:${f.stretch};` : ""}${f.style ? `font-style:${f.style};` : ""}}\n`).join("");
|
|
570
|
+
|
|
571
|
+
// Para um slide com tema/paleta diferentes dos do deck: as cores valem só em .slide.lk-<tema--paleta>; as fontes
|
|
572
|
+
// (faces: true) só em .slide.th-<tema>. O deck continua usando themeCSS(theme) sem escopo.
|
|
573
|
+
export function scopedThemeCSS(theme, { faces = true } = {}) {
|
|
574
|
+
const c = (v) => "#" + col(theme, v);
|
|
575
|
+
const lk = `.slide.lk-${theme.key}`;
|
|
576
|
+
let css = faces ? fontFaceCSS(theme) : "";
|
|
577
|
+
css += `${lk}{` + Object.entries(theme.colors).map(([k, v]) => `--c-${k}:#${v};`).join("") + `--radius:${theme.radius}px;}\n`;
|
|
578
|
+
for (const [tone, m] of Object.entries(theme.tones)) css += `${lk}.tone-${tone}{--bg:${c(m.bg)};--fg:${c(m.fg)};--muted:${c(m.muted)};--line:${c(m.line)};--surface:${c(m.surface)};--hi:${c(m.hi)};--em:${c(m.em)};--on-hi:${c(m.onHi)};--hi-ink:${hiInk(c(m.bg), c(m.hi), c(m.em), c(m.fg))};}\n`;
|
|
579
|
+
css += familySeriesCSS(theme, `${lk}[class*="tone-"]`);
|
|
580
|
+
if (faces) for (const [name, f] of Object.entries(theme.faces)) css += `.slide.th-${theme.name} .f-${name}{${f.css}}\n`;
|
|
581
|
+
return css;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
export function themeCSS(theme) {
|
|
585
|
+
const c = (v) => "#" + col(theme, v);
|
|
586
|
+
let css = "";
|
|
587
|
+
for (const f of theme.fontFaces || []) {
|
|
588
|
+
css += `@font-face{font-family:${f.family};src:${f.src};${f.weight ? `font-weight:${f.weight};` : ""}${f.stretch ? `font-stretch:${f.stretch};` : ""}${f.style ? `font-style:${f.style};` : ""}}\n`;
|
|
589
|
+
}
|
|
590
|
+
css += `:root{`;
|
|
591
|
+
for (const [k, v] of Object.entries(theme.colors)) css += `--c-${k}:#${v};`;
|
|
592
|
+
css += `--radius:${theme.radius}px;}\n`;
|
|
593
|
+
for (const [tone, m] of Object.entries(theme.tones)) {
|
|
594
|
+
css += `.tone-${tone}{--bg:${c(m.bg)};--fg:${c(m.fg)};--muted:${c(m.muted)};--line:${c(m.line)};--surface:${c(m.surface)};--hi:${c(m.hi)};--em:${c(m.em)};--on-hi:${c(m.onHi)};--hi-ink:${hiInk(c(m.bg), c(m.hi), c(m.em), c(m.fg))};}\n`;
|
|
595
|
+
}
|
|
596
|
+
css += familySeriesCSS(theme, `[class*="tone-"]`);
|
|
597
|
+
for (const [name, f] of Object.entries(theme.faces)) css += `.f-${name}{${f.css}}\n`;
|
|
598
|
+
return css;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
// Mapa usado pelo exportador de PPTX: alias CSS da família -> face do PowerPoint.
|
|
602
|
+
export function pptxFontMap(theme) {
|
|
603
|
+
return Object.fromEntries(Object.entries(theme.faces).map(([k, f]) => [k, { regular: f.pptx, bold: f.pptxBold || { ...f.pptx, bold: true } }]));
|
|
604
|
+
}
|