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
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/* Press Start 2P (SIL Open Font License 1.1, via @fontsource) */
|
|
2
|
+
@font-face{font-family:'Press Start 2P';font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,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) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/* VT323 (SIL Open Font License 1.1, via @fontsource) */
|
|
2
|
+
@font-face{font-family:'VT323';font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,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) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Fórmulas do slide "Fórmulas e funções": "a*sin(b*x)", "y = x² - 2x + 1", "z = sin(x)*cos(y)".
|
|
2
|
+
// Sem eval: um analisador pequeno monta funções JS a partir da expressão (só números, variáveis e as funções de
|
|
3
|
+
// matemática abaixo). Roda na apresentação (controles deslizantes redesenham a curva) e no Node (o motor
|
|
4
|
+
// confere a fórmula e desenha a prévia estática). Letra que não é x/y vira parâmetro: vira controle deslizante.
|
|
5
|
+
(function (root) {
|
|
6
|
+
// sem protótipo: "toString", "constructor" e afins não existem aqui
|
|
7
|
+
const FUNCS = Object.assign(Object.create(null), {
|
|
8
|
+
sin: Math.sin, cos: Math.cos, tan: Math.tan, asin: Math.asin, acos: Math.acos, atan: Math.atan,
|
|
9
|
+
sinh: Math.sinh, cosh: Math.cosh, tanh: Math.tanh, sen: Math.sin, tg: Math.tan,
|
|
10
|
+
exp: Math.exp, ln: Math.log, log: Math.log10, log10: Math.log10, log2: Math.log2, sqrt: Math.sqrt, raiz: Math.sqrt,
|
|
11
|
+
abs: Math.abs, floor: Math.floor, ceil: Math.ceil, round: Math.round, sign: Math.sign,
|
|
12
|
+
min: Math.min, max: Math.max, pow: Math.pow, atan2: Math.atan2,
|
|
13
|
+
});
|
|
14
|
+
const CONSTS = Object.assign(Object.create(null), { pi: Math.PI, e: Math.E });
|
|
15
|
+
|
|
16
|
+
// "y = …", "f(x) = …", "z = …": só o lado direito importa; símbolos comuns viram operadores
|
|
17
|
+
function normalize(src) {
|
|
18
|
+
let s = String(src ?? "").trim();
|
|
19
|
+
const eq = s.match(/^\s*(?:[a-zA-Z]\w*\s*(?:\([^)]*\))?)\s*=(?!=)/);
|
|
20
|
+
if (eq) s = s.slice(eq[0].length);
|
|
21
|
+
return s.replace(/[·×⋅]/g, "*").replace(/÷/g, "/").replace(/−/g, "-").replace(/π/g, "pi").replace(/√/g, "sqrt")
|
|
22
|
+
.replace(/²/g, "^2").replace(/³/g, "^3").replace(/(\d),(\d)/g, "$1.$2");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function tokenize(s) {
|
|
26
|
+
const out = [];
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (i < s.length) {
|
|
29
|
+
const c = s[i];
|
|
30
|
+
if (/\s/.test(c)) { i++; continue; }
|
|
31
|
+
const num = s.slice(i).match(/^(\d+\.?\d*|\.\d+)(e[+-]?\d+)?/i);
|
|
32
|
+
if (num) { out.push({ t: "num", v: parseFloat(num[0]) }); i += num[0].length; continue; }
|
|
33
|
+
const id = s.slice(i).match(/^[a-zA-Z_]\w*/);
|
|
34
|
+
if (id) { out.push({ t: "id", v: id[0] }); i += id[0].length; continue; }
|
|
35
|
+
if ("+-*/^(),;".includes(c)) { out.push({ t: c === ";" ? "," : c }); i++; continue; }
|
|
36
|
+
throw new Error(`símbolo "${c}" não entendido`);
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// identificador colado vira produto, como numa calculadora gráfica: "ax" = a*x, "xsin(x)" = x*sin(x).
|
|
42
|
+
// Nome de função, constante, variável ou letra grega (alpha, theta…) fica inteiro.
|
|
43
|
+
const GREEK = ["alpha", "beta", "gamma", "delta", "theta", "lambda", "mu", "sigma", "phi", "omega", "tau", "rho", "k0"];
|
|
44
|
+
function splitId(name, vars, callNext) {
|
|
45
|
+
// letra com número (h0, v0, x1) é um nome só
|
|
46
|
+
const whole = (n) => (FUNCS[n] && callNext) || n in CONSTS || vars.includes(n) || GREEK.includes(n) || /^[a-zA-Z][0-9_]*$/.test(n);
|
|
47
|
+
if (whole(name)) return [name];
|
|
48
|
+
// o maior pedaço conhecido no fim (função antes de "(" ou constante), o começo vira letras soltas
|
|
49
|
+
for (let k = 1; k < name.length; k++) {
|
|
50
|
+
const tail = name.slice(k);
|
|
51
|
+
if ((FUNCS[tail] && callNext) || tail in CONSTS || GREEK.includes(tail)) return [...splitId(name.slice(0, k), vars, false), tail];
|
|
52
|
+
}
|
|
53
|
+
return name.match(/[a-zA-Z][0-9_]*/g);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function parse(src, vars = ["x"]) {
|
|
57
|
+
const raw = tokenize(normalize(src));
|
|
58
|
+
const toks = [];
|
|
59
|
+
raw.forEach((tk, k) => {
|
|
60
|
+
if (tk.t === "id") splitId(tk.v, vars, ["(", "num", "id"].includes(raw[k + 1]?.t)).forEach((v) => toks.push({ t: "id", v }));
|
|
61
|
+
else toks.push(tk);
|
|
62
|
+
});
|
|
63
|
+
// multiplicação implícita: 2x, 2(x+1), (x+1)(x-1), x y, 3sin(x)
|
|
64
|
+
const seq = [];
|
|
65
|
+
toks.forEach((tk, k) => {
|
|
66
|
+
const prev = seq[seq.length - 1];
|
|
67
|
+
// nome de função que ficou inteiro espera o argumento: nada de "*" depois dele
|
|
68
|
+
const endsValue = prev && (prev.t === "num" || prev.t === ")" || (prev.t === "id" && !FUNCS[prev.v]));
|
|
69
|
+
if (endsValue && (tk.t === "num" || tk.t === "id" || tk.t === "(")) seq.push({ t: "*" });
|
|
70
|
+
seq.push(tk);
|
|
71
|
+
});
|
|
72
|
+
let p = 0;
|
|
73
|
+
const params = new Set();
|
|
74
|
+
const peek = () => seq[p], eat = (t) => { if (seq[p]?.t !== t) throw new Error(t === ")" ? "falta fechar parêntese" : `esperava "${t}"`); return seq[p++]; };
|
|
75
|
+
// expr := termo (+|- termo)*; termo := unário (*|/ unário)*; unário := -unário | potência; potência := átomo (^ unário)?
|
|
76
|
+
function expr() {
|
|
77
|
+
let a = term();
|
|
78
|
+
while (peek()?.t === "+" || peek()?.t === "-") { const op = seq[p++].t, l = a, r = term(); a = op === "+" ? (v) => l(v) + r(v) : (v) => l(v) - r(v); }
|
|
79
|
+
return a;
|
|
80
|
+
}
|
|
81
|
+
function term() {
|
|
82
|
+
let a = unary();
|
|
83
|
+
while (peek()?.t === "*" || peek()?.t === "/") { const op = seq[p++].t, l = a, r = unary(); a = op === "*" ? (v) => l(v) * r(v) : (v) => l(v) / r(v); }
|
|
84
|
+
return a;
|
|
85
|
+
}
|
|
86
|
+
function unary() {
|
|
87
|
+
if (peek()?.t === "-") { p++; const a = unary(); return (v) => -a(v); }
|
|
88
|
+
if (peek()?.t === "+") { p++; return unary(); }
|
|
89
|
+
return power();
|
|
90
|
+
}
|
|
91
|
+
function power() {
|
|
92
|
+
const base = atom();
|
|
93
|
+
if (peek()?.t === "^") { p++; const ex = unary(); return (v) => Math.pow(base(v), ex(v)); }
|
|
94
|
+
return base;
|
|
95
|
+
}
|
|
96
|
+
function atom() {
|
|
97
|
+
const tk = seq[p++];
|
|
98
|
+
if (!tk) throw new Error("a fórmula terminou no meio");
|
|
99
|
+
if (tk.t === "num") { const n = tk.v; return () => n; }
|
|
100
|
+
if (tk.t === "(") { const a = expr(); eat(")"); return a; }
|
|
101
|
+
if (tk.t === "id") {
|
|
102
|
+
const name = tk.v;
|
|
103
|
+
if (FUNCS[name] && peek()?.t === "(") {
|
|
104
|
+
p++;
|
|
105
|
+
const args = [expr()];
|
|
106
|
+
while (peek()?.t === ",") { p++; args.push(expr()); }
|
|
107
|
+
eat(")");
|
|
108
|
+
const fn = FUNCS[name];
|
|
109
|
+
return args.length === 1 ? ((a) => (v) => fn(a(v)))(args[0]) : (v) => fn(...args.map((a) => a(v)));
|
|
110
|
+
}
|
|
111
|
+
if (FUNCS[name] && peek() && peek().t !== "," && peek().t !== ")") { const a = power(), fn = FUNCS[name]; return (v) => fn(a(v)); } // "sin x"
|
|
112
|
+
if (FUNCS[name]) throw new Error(`${name} precisa de um valor: ${name}(x)`);
|
|
113
|
+
const read = (v) => (Object.hasOwn(v, name) ? v[name] : NaN); // só valores dados, nunca o protótipo
|
|
114
|
+
if (vars.includes(name)) return read;
|
|
115
|
+
if (name in CONSTS) { const c = CONSTS[name]; return () => c; }
|
|
116
|
+
params.add(name);
|
|
117
|
+
return read;
|
|
118
|
+
}
|
|
119
|
+
throw new Error(tk.t === ")" ? "parêntese fechando sem abrir" : `"${tk.t}" fora do lugar`);
|
|
120
|
+
}
|
|
121
|
+
if (!seq.length) throw new Error("fórmula vazia");
|
|
122
|
+
const fn = expr();
|
|
123
|
+
if (p < seq.length) throw new Error(seq[p].t === ")" ? "parêntese fechando sem abrir" : "sobrou algo no fim da fórmula");
|
|
124
|
+
return { fn, params: [...params] };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// compila e devolve { eval(vars) -> número ou null, params } ou lança erro em português
|
|
128
|
+
function compile(src, vars) {
|
|
129
|
+
const { fn, params } = parse(src, vars);
|
|
130
|
+
return { params, eval: (v) => { const y = fn(v); return Number.isFinite(y) ? y : null; } };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// valores das amostras: n pontos no intervalo [a, b]; saltos grandes (tan, 1/x) viram buraco na linha
|
|
134
|
+
// log: pontos espaçados em escala logarítmica (eixo x log, ex.: diagrama de Moody)
|
|
135
|
+
function sample(c, [a, b] = [-10, 10], values = {}, n = 400, log = false) {
|
|
136
|
+
const xs = [], ys = [];
|
|
137
|
+
const la = Math.log10(Math.max(a, 1e-12)), lb = Math.log10(Math.max(b, 1e-12));
|
|
138
|
+
for (let i = 0; i < n; i++) { const x = log ? Math.pow(10, la + ((lb - la) * i) / (n - 1)) : a + ((b - a) * i) / (n - 1); xs.push(+x.toPrecision(8)); ys.push(c.eval({ ...values, x })); }
|
|
139
|
+
const fin = ys.filter((y) => y != null).sort((p, q) => p - q);
|
|
140
|
+
if (fin.length > 10) {
|
|
141
|
+
const lo = fin[Math.floor(fin.length * 0.02)], hi = fin[Math.ceil(fin.length * 0.98) - 1], span = (hi - lo) || 1;
|
|
142
|
+
for (let i = 1; i < n; i++) if (ys[i] != null && ys[i - 1] != null && Math.abs(ys[i] - ys[i - 1]) > span * 4) ys[i] = null;
|
|
143
|
+
}
|
|
144
|
+
return { x: xs, y: ys };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
root.SagaFormula = { compile, sample, FUNCS: Object.keys(FUNCS) };
|
|
148
|
+
})(typeof globalThis !== "undefined" ? globalThis : window);
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Rede persistente: atualiza só nós/arestas afetados, sem substituir o SVG a cada interação.
|
|
2
|
+
(()=>{
|
|
3
|
+
const NS='http://www.w3.org/2000/svg';
|
|
4
|
+
const make=(tag,attrs={})=>{const e=document.createElementNS(NS,tag);for(const[k,v]of Object.entries(attrs))e.setAttribute(k,v);return e;};
|
|
5
|
+
let serial=0;
|
|
6
|
+
for(const root of document.querySelectorAll('[data-graphlab]')){
|
|
7
|
+
const initial=JSON.parse(root.querySelector('.gl-model').textContent),svg=root.querySelector('.gl-canvas>svg'),world=root.querySelector('.gl-world'),nodeLayer=root.querySelector('.gl-nodes'),edgeLayer=root.querySelector('.gl-edges');
|
|
8
|
+
const markerId=`gl-arrow-${serial++}`,defs=make('defs'),marker=make('marker',{id:markerId,viewBox:'0 0 10 10',refX:9,refY:5,markerWidth:6,markerHeight:6,orient:'auto'});marker.append(make('path',{d:'M 0 0 L 10 5 L 0 10 z',fill:'context-stroke'}));defs.append(marker);svg.prepend(defs);
|
|
9
|
+
const $=s=>root.querySelector(s),clone=o=>JSON.parse(JSON.stringify(o));
|
|
10
|
+
let model=clone(initial),selected=null,zoom=1,pan=[0,0],sequence=[],visited=[],route=[];
|
|
11
|
+
const nodeEls=new Map(),edgeEls=new Map();let nextId=1;
|
|
12
|
+
const edgeKey=(e,i)=>`${e.from}\u0000${e.to}\u0000${i}`;
|
|
13
|
+
const report=s=>{$('[data-gl-result]').textContent=s;};
|
|
14
|
+
function positions(){model.nodes.forEach((n,i)=>{if(!Number.isFinite(n.x)||!Number.isFinite(n.y)){const columns=Math.min(4,model.nodes.length),rows=Math.ceil(model.nodes.length/columns);n.x=130+(i%columns)*(740/Math.max(columns-1,1));n.y=rows===1?310:70+Math.floor(i/columns)*(480/(rows-1));}});
|
|
15
|
+
for(let k=0;k<12;k++)for(let i=0;i<model.nodes.length;i++)for(let j=i+1;j<model.nodes.length;j++){const a=model.nodes[i],b=model.nodes[j],dx=b.x-a.x,dy=b.y-a.y;if(Math.abs(dx)<240&&Math.abs(dy)<110){if(Math.abs(dx)>=Math.abs(dy)){const d=(240-Math.abs(dx))/2,sign=dx<0?-1:1;a.x=Math.max(110,Math.min(890,a.x-d*sign));b.x=Math.max(110,Math.min(890,b.x+d*sign));}else{const d=(110-Math.abs(dy))/2,sign=dy<0?-1:1;a.y=Math.max(55,Math.min(565,a.y-d*sign));b.y=Math.max(55,Math.min(565,b.y+d*sign));}}}
|
|
16
|
+
}
|
|
17
|
+
function options(){for(const sel of [$('[data-gl-start]'),$('[data-gl-goal]')]){const old=sel.value;sel.replaceChildren(...model.nodes.map(n=>{const o=document.createElement('option');o.value=n.id;o.textContent=n.label||n.id;return o;}));sel.value=model.nodes.some(n=>n.id===old)?old:(sel.hasAttribute('data-gl-start')?model.start:model.goal)||model.nodes[0]?.id||'';}}
|
|
18
|
+
function paint(){
|
|
19
|
+
const live=new Set(model.nodes.map(n=>n.id));
|
|
20
|
+
for(const[id,e]of nodeEls)if(!live.has(id)){e.classList.add('gl-leaving');setTimeout(()=>e.remove(),220);nodeEls.delete(id);}
|
|
21
|
+
const edgeLive=new Set();model.edges.forEach((edge,i)=>{
|
|
22
|
+
const k=edgeKey(edge,i);edgeLive.add(k);let e=edgeEls.get(k);
|
|
23
|
+
if(!e){e=make('g',{'class':'gl-edge'});e.append(make('line'),make('text',{'text-anchor':'middle'}));e.addEventListener('click',()=>select({edge:i}));edgeLayer.append(e);edgeEls.set(k,e);}
|
|
24
|
+
const a=model.nodes.find(n=>n.id===edge.from),b=model.nodes.find(n=>n.id===edge.to);if(!a||!b)return;
|
|
25
|
+
const dx=b.x-a.x,dy=b.y-a.y,t=1/Math.max(Math.abs(dx)/110,Math.abs(dy)/52,2);
|
|
26
|
+
const line=e.querySelector('line');for(const[k,v]of Object.entries({x1:a.x+dx*t,y1:a.y+dy*t,x2:b.x-dx*t,y2:b.y-dy*t}))line.setAttribute(k,v);if(model.directed)line.setAttribute('marker-end',`url(#${markerId})`);
|
|
27
|
+
const text=e.querySelector('text');text.setAttribute('x',(a.x+b.x)/2);text.setAttribute('y',(a.y+b.y)/2-12);text.textContent=`${edge.label?edge.label+' · ':''}${edge.weight}${model.directed?' →':''}`;
|
|
28
|
+
const active=route.some((n,j)=>j&&((route[j-1]===edge.from&&n===edge.to)||(!model.directed&&route[j-1]===edge.to&&n===edge.from)));
|
|
29
|
+
e.classList.toggle('gl-path',active);e.classList.toggle('gl-selected',selected?.edge===i);e.classList.toggle('gl-neighbor',!!selected?.node&&(edge.from===selected.node||edge.to===selected.node));e.style.setProperty('--gl-color',edge.color||'');
|
|
30
|
+
});
|
|
31
|
+
for(const[k,e]of edgeEls)if(!edgeLive.has(k)){e.remove();edgeEls.delete(k);}
|
|
32
|
+
for(const n of model.nodes){let e=nodeEls.get(n.id);
|
|
33
|
+
if(!e){e=make('g',{'class':'gl-node',tabindex:0,role:'button','aria-label':n.label||n.id,'data-node':n.id});e.append(make('rect',{x:-100,y:-43,width:200,height:86,rx:18}));
|
|
34
|
+
const icon=make('g',{transform:'translate(-83 -14)'}),tpl=[...root.querySelectorAll('template[data-gl-icon]')].find(t=>t.dataset.glIcon===n.id);if(tpl)icon.append(tpl.content.cloneNode(true));e.append(icon,make('text',{x:0,y:7,'text-anchor':'middle'}));
|
|
35
|
+
e.addEventListener('click',()=>select({node:n.id}));e.addEventListener('keydown',ev=>{if(ev.key==='Enter'){ev.stopPropagation();select({node:n.id});}});
|
|
36
|
+
e.addEventListener('pointerdown',ev=>{ev.stopPropagation();select({node:n.id});const at=point(ev),start=[n.x,n.y];e.setPointerCapture(ev.pointerId);e.classList.add('gl-dragging');e.onpointermove=p=>{const q=point(p);n.x=start[0]+(q.x-at.x)/zoom;n.y=start[1]+(q.y-at.y)/zoom;paint();};e.onpointerup=()=>{e.onpointermove=null;e.classList.remove('gl-dragging');};});
|
|
37
|
+
nodeLayer.append(e);nodeEls.set(n.id,e);}
|
|
38
|
+
e.setAttribute('transform',`translate(${n.x} ${n.y})`);const text=e.querySelector('text'),words=String(n.label||n.id).split(/\s+/),lines=[''];for(const w of words){if(lines.at(-1).length+w.length>17&&lines.at(-1))lines.push(w);else lines[lines.length-1]+=(lines.at(-1)?' ':'')+w;}text.replaceChildren(...lines.map((l,i)=>{const t=make('tspan',{x:-45,y:(i-(lines.length-1)/2)*20+6});t.textContent=(i?' ':'')+l;if(l.length>20){t.setAttribute('textLength',130);t.setAttribute('lengthAdjust','spacingAndGlyphs');}return t;}));text.setAttribute('text-anchor','start');e.setAttribute('aria-label',n.label||n.id);
|
|
39
|
+
e.classList.toggle('gl-selected',selected?.node===n.id);e.classList.toggle('gl-neighbor',!!selected?.node&&neighbors(selected.node).some(e=>e.to===n.id));e.classList.toggle('gl-visited',visited.includes(n.id));e.classList.toggle('gl-path',route.includes(n.id));e.style.setProperty('--gl-color',n.color||'');
|
|
40
|
+
}
|
|
41
|
+
world.setAttribute('transform',`translate(${pan[0]} ${pan[1]}) scale(${zoom})`);root.dataset.graphlabReady='true';
|
|
42
|
+
}
|
|
43
|
+
function point(e){return new DOMPoint(e.clientX,e.clientY).matrixTransform(svg.getScreenCTM().inverse());}
|
|
44
|
+
function select(s){selected=s;$('.gl-edit-panel').open=true;const n=model.nodes.find(n=>n.id===s.node),e=model.edges[s.edge];$('[data-gl-label]').disabled=!n;$('[data-gl-weight]').disabled=!e;$('[data-gl-label]').value=n?.label||n?.id||'';$('[data-gl-weight]').value=e?.weight??'';$('[data-gl-details]').textContent=n?`${n.label||n.id} · ${model.edges.filter(e=>e.from===n.id||e.to===n.id).length} ligações`:e?`${e.from} → ${e.to} · custo ${e.weight}`:'Explore a rede';paint();}
|
|
45
|
+
function neighbors(id){return model.edges.flatMap((e,i)=>e.from===id?[{to:e.to,cost:e.weight,i}]:!model.directed&&e.to===id?[{to:e.from,cost:e.weight,i}]:[]);}
|
|
46
|
+
function shortest(){if(!model.nodes.length){route=[];report('Adicione um nó para explorar a rede.');paint();return;}const start=$('[data-gl-start]').value,goal=$('[data-gl-goal]').value,dist=new Map([[start,0]]),prev=new Map(),todo=new Set(model.nodes.map(n=>n.id));
|
|
47
|
+
while(todo.size){const current=[...todo].sort((a,b)=>(dist.get(a)??Infinity)-(dist.get(b)??Infinity))[0];if(!Number.isFinite(dist.get(current)))break;todo.delete(current);if(current===goal)break;
|
|
48
|
+
for(const n of neighbors(current)){const cost=dist.get(current)+n.cost;if(cost<(dist.get(n.to)??Infinity)){dist.set(n.to,cost);prev.set(n.to,current);}}}
|
|
49
|
+
route=[];if(!dist.has(goal)){report('Não existe caminho entre esses nós.');paint();return;}for(let n=goal;n!==undefined;n=prev.get(n))route.unshift(n);report(`Rota: ${route.map(id=>model.nodes.find(n=>n.id===id)?.label||id).join(' → ')} · custo ${dist.get(goal)}`);paint();}
|
|
50
|
+
function clearResult(){route=[];sequence=[];visited=[];report('Rede alterada. Calcule novamente para comparar.');}
|
|
51
|
+
function action(a){
|
|
52
|
+
if(a==='route')shortest();
|
|
53
|
+
if(a==='walk'){const seen=new Set(),q=[$('[data-gl-start]').value];sequence=[];while(q.length){const n=q.shift();if(seen.has(n))continue;seen.add(n);sequence.push(n);q.push(...neighbors(n).map(e=>e.to));}visited=[];report('Busca em largura preparada. Avance uma visita por vez.');}
|
|
54
|
+
if(a==='step'){const n=sequence[visited.length];if(n!==undefined){visited.push(n);select({node:n});report(`Visita ${visited.length}/${sequence.length}: ${n}. Próximos: ${sequence.slice(visited.length).join(', ')||'fim'}`);}else report('Visitas concluídas. Use Visitar vizinhos para recomeçar.');}
|
|
55
|
+
if(a==='in'||a==='out'){zoom=Math.max(.35,Math.min(3,zoom*(a==='in'?1.25:.8)));}
|
|
56
|
+
if(a==='focus'&&selected?.node){const n=model.nodes.find(n=>n.id===selected.node);zoom=1.8;pan=[500-n.x*zoom,310-n.y*zoom];}
|
|
57
|
+
if(a==='fit'){zoom=1;pan=[0,0];}
|
|
58
|
+
if(a==='reset'){model=clone(initial);positions();selected=null;zoom=1;pan=[0,0];options();clearResult();}
|
|
59
|
+
if(a==='add'){let id;do{id=`novo-${nextId++}`;}while(model.nodes.some(n=>n.id===id));model.nodes.push({id,label:'Novo nó',x:(500-pan[0])/zoom,y:(310-pan[1])/zoom});options();clearResult();select({node:id});}
|
|
60
|
+
if(a==='connect'&&selected?.node){const from=$('[data-gl-start]').value,to=selected.node;if(from!==to&&!model.edges.some(e=>e.from===from&&e.to===to)){model.edges.push({from,to,weight:1});clearResult();select({edge:model.edges.length-1});}}
|
|
61
|
+
if(a==='remove'&&selected){if(selected.node){model.nodes=model.nodes.filter(n=>n.id!==selected.node);model.edges=model.edges.filter(e=>e.from!==selected.node&&e.to!==selected.node);}else model.edges.splice(selected.edge,1);selected=null;options();clearResult();}
|
|
62
|
+
paint();
|
|
63
|
+
}
|
|
64
|
+
root.querySelectorAll('[data-gl-action]').forEach(b=>b.onclick=()=>action(b.dataset.glAction));
|
|
65
|
+
$('[data-gl-weight]').onchange=e=>{const v=Number(e.target.value);if(selected?.edge!==undefined&&Number.isFinite(v)&&v>=0){model.edges[selected.edge].weight=v;clearResult();paint();}};
|
|
66
|
+
$('[data-gl-label]').onchange=e=>{const n=model.nodes.find(n=>n.id===selected?.node);if(n){n.label=e.target.value;options();paint();}};
|
|
67
|
+
$('[data-gl-color]').oninput=e=>{const n=model.nodes.find(n=>n.id===selected?.node)||model.edges[selected?.edge];if(n){n.color=e.target.value;paint();}};
|
|
68
|
+
svg.addEventListener('wheel',e=>{e.preventDefault();const p=point(e),old=zoom;zoom=Math.max(.35,Math.min(3,zoom*(e.deltaY<0?1.12:1/1.12)));pan=[p.x-(p.x-pan[0])*zoom/old,p.y-(p.y-pan[1])*zoom/old];paint();},{passive:false});
|
|
69
|
+
svg.addEventListener('pointerdown',e=>{if(e.target.closest('.gl-node,.gl-edge'))return;const p=point(e),old=[...pan];svg.setPointerCapture(e.pointerId);svg.onpointermove=v=>{const q=point(v);pan=[old[0]+q.x-p.x,old[1]+q.y-p.y];paint();};svg.onpointerup=()=>svg.onpointermove=null;});
|
|
70
|
+
positions();options();paint();root.addEventListener('keydown',e=>{if(e.target.matches('input,select,textarea'))return;if(['Delete','Backspace'].includes(e.key)){e.preventDefault();e.stopPropagation();action('remove');}});
|
|
71
|
+
}
|
|
72
|
+
})();
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
.L-meeting{display:flex;flex-direction:column;height:100%;gap:20px}.meeting-context{font-size:24px;opacity:.75}.meeting-options{display:grid;gap:18px;flex:1;min-height:0}.meeting-option{display:grid;grid-template-columns:1fr 120px;gap:10px;padding:20px 26px;background:color-mix(in srgb,var(--fg) 6%,transparent);border-radius:18px;font-size:32px;align-content:center}.meeting-option input,.meeting-actions input{font:inherit;color:inherit;background:transparent;border:1px solid currentColor;border-radius:8px;padding:5px 10px;width:110px}.meeting-bar{grid-column:1/-1;height:7px;background:color-mix(in srgb,var(--fg) 12%,transparent);border-radius:6px;overflow:hidden}.meeting-bar i{display:block;height:100%;background:var(--accent);transition:width .25s}.meeting-actions{display:flex;flex-wrap:wrap;align-items:center;gap:18px;font-size:22px}.meeting-actions button{font:inherit;padding:10px 18px;color:inherit;background:transparent;border:1px solid currentColor;border-radius:10px}.meeting-actions output{flex-basis:100%;font-size:24px}.meeting-actions button:disabled{opacity:.45}
|
|
2
|
+
.L-meeting{min-height:0;gap:16px}
|
|
3
|
+
.L-meeting>.hd,.meeting-context,.meeting-actions{flex-shrink:0}
|
|
4
|
+
.meeting-context{margin:0}
|
|
5
|
+
.meeting-options{grid-auto-rows:minmax(0,1fr);gap:12px}
|
|
6
|
+
.meeting-option{min-height:0;padding:12px 20px;font-size:30px}
|
|
7
|
+
.safe.with-motion-accent .L-meeting .ttl{font-size:64px}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
(()=>{
|
|
2
|
+
for(const root of document.querySelectorAll('[data-meeting]')){
|
|
3
|
+
let state=JSON.parse(root.querySelector('.meeting-state').textContent),confirmed=structuredClone(state),timer,chain=Promise.resolve();const votes=[...root.querySelectorAll('[data-vote]')],abstain=root.querySelector('[data-abstain]'),status=root.querySelector('[data-meeting-status]');
|
|
4
|
+
const read=()=>({id:root.dataset.meeting,votes:votes.map(e=>Number(e.value)),abstentions:Number(abstain.value),approved:!!state.approved});
|
|
5
|
+
function paint(){const b=read(),total=b.votes.reduce((a,v)=>a+v,0),max=Math.max(...b.votes),winners=b.votes.flatMap((n,i)=>n===max?[i]:[]);votes.forEach((e,i)=>{e.closest('label').querySelector('i').style.width=(total?100*b.votes[i]/total:0)+'%';e.disabled=!!state.approved});abstain.disabled=!!state.approved;root.querySelector('[data-meeting-approve]').disabled=state.approved||max===0||winners.length!==1;status.textContent=state.approved?'Decisão aprovada · '+votes[state.selected]?.getAttribute('aria-label').replace('Votos: ',''):total+' votos + '+b.abstentions+' abstenções · '+(max===0?'Aguardando votos':winners.length>1?'Empate; decisão aberta':'Resultado provisório');}
|
|
6
|
+
function save(){const b=read();chain=chain.then(async()=>{if(location.protocol==='file:'){status.textContent='Para salvar decisões na apresentação, abra pelo Studio.';return;}try{const r=await fetch('/api/meeting',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(b)}),data=await r.json();if(!r.ok)throw Error(data.error);state=data.decision;confirmed=structuredClone(state);if(Number.isFinite(data.value))for(const e of document.querySelectorAll("[data-decision-input]"))if(e.dataset.decisionInput===b.id){e.value=data.value;e.dispatchEvent(new Event("input",{bubbles:true}))}paint();}catch(e){state=structuredClone(confirmed);paint();status.textContent='Não foi salvo: '+e.message;}});}
|
|
7
|
+
root.addEventListener('keydown',e=>e.stopPropagation());root.addEventListener('input',()=>{state.approved=false;paint();clearTimeout(timer);timer=setTimeout(save,300)});
|
|
8
|
+
root.querySelector('[data-meeting-approve]').onclick=()=>{clearTimeout(timer);const b=read(),max=Math.max(...b.votes);state={...state,approved:true,selected:b.votes.indexOf(max)};save()};root.querySelector('[data-meeting-reopen]').onclick=()=>{state.approved=false;state.selected=null;paint();save()};paint();
|
|
9
|
+
}
|
|
10
|
+
})();
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
for(const frame of document.querySelectorAll('iframe[data-motion]')){
|
|
2
|
+
const slide=frame.closest('.slide');let started=false,done=false;
|
|
3
|
+
const send=(kind,active)=>frame.contentWindow?.postMessage({sagaMotion:kind,active},'*');
|
|
4
|
+
const finish=()=>{if(done||!slide?.classList.contains('current'))return;done=true;
|
|
5
|
+
if(frame.dataset.motionFinish==='next'){const i=[...document.querySelectorAll('.slide')].indexOf(slide);window.sagadeck.goto(i+1);}
|
|
6
|
+
else if(frame.dataset.motionFinish==='video'){frame.style.visibility='hidden';slide.querySelector('[data-video-start]')?.click();}
|
|
7
|
+
};
|
|
8
|
+
if(frame.dataset.motion==='chat'&&frame.dataset.motionManual==='true'){
|
|
9
|
+
const begin=e=>{if(!slide?.classList.contains('current')||done||e.target.closest('input,textarea,select,[contenteditable=true]'))return;if(e.type==='keydown'&&![' ','Enter','ArrowRight','PageDown'].includes(e.key))return;e.preventDefault();e.stopImmediatePropagation();if(started){finish();return;}started=true;send('start');};
|
|
10
|
+
document.addEventListener('keydown',begin,true);slide.addEventListener('click',begin,true);
|
|
11
|
+
}
|
|
12
|
+
window.addEventListener('message',e=>{if(e.source!==frame.contentWindow)return;if(e.data?.sagaMotion==='done')finish();if(e.data?.sagaMotion==='start-request'&&slide?.classList.contains('current')&&!done){if(started)finish();else{started=true;send('start');}}});
|
|
13
|
+
const activate=()=>{const active=slide?.classList.contains('current');send('active',active);if(document.documentElement.classList.contains('export')||document.documentElement.dataset.motion==='none'||matchMedia('(prefers-reduced-motion: reduce)').matches)send('poster');if(!active){started=false;done=false;frame.style.visibility='';send('reset');}};
|
|
14
|
+
frame.addEventListener('load',activate);if(slide)new MutationObserver(activate).observe(slide,{attributes:true,attributeFilter:['class']});
|
|
15
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
for (const root of document.querySelectorAll('[data-playground]')) {
|
|
2
|
+
const frame = root.querySelector('iframe'), original = frame.srcdoc;
|
|
3
|
+
root.querySelector('[data-pg-reset]').onclick = () => { frame.srcdoc = original; root.querySelector('[data-pg-status]').textContent = ''; };
|
|
4
|
+
const slide=root.closest('.slide'),sync=()=>frame.contentWindow?.postMessage({sagaActive:!slide||slide.classList.contains('current')},'*');
|
|
5
|
+
frame.addEventListener('load',sync);
|
|
6
|
+
if(slide)new MutationObserver(sync).observe(slide,{attributes:true,attributeFilter:['class']});
|
|
7
|
+
window.addEventListener('message', e => {
|
|
8
|
+
if (e.source !== frame.contentWindow || !e.data?.sagaPlayground) return;
|
|
9
|
+
root.querySelector('[data-pg-status]').textContent = `${e.data.kind === 'error' ? 'Erro: ' : ''}${String(e.data.text || '').slice(0,4000)}`;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Morph da figura de pontos: cada luzinha viaja da forma A para a B (clique ou Enter/Espaço).
|
|
2
|
+
for (const root of document.querySelectorAll("[data-points-morph]")) {
|
|
3
|
+
const dots = [...root.querySelectorAll(".pts-dot")];
|
|
4
|
+
const model = JSON.parse(root.querySelector(".pts-model").textContent);
|
|
5
|
+
const legend = root.querySelector(".pts-legend");
|
|
6
|
+
let morphed = false;
|
|
7
|
+
const apply = () => {
|
|
8
|
+
const to = morphed ? model.b : model.a;
|
|
9
|
+
dots.forEach((d, i) => {
|
|
10
|
+
const p = to[i % to.length];
|
|
11
|
+
d.style.transform = `translate(${(p.x - +d.getAttribute("cx")).toFixed(2)}px,${(p.y - +d.getAttribute("cy")).toFixed(2)}px)`;
|
|
12
|
+
});
|
|
13
|
+
root.dataset.morphed = String(morphed);
|
|
14
|
+
if (legend) legend.textContent = morphed ? legend.dataset.legendaB : legend.dataset.legendaA;
|
|
15
|
+
};
|
|
16
|
+
const toggle = () => { morphed = !morphed; apply(); };
|
|
17
|
+
root.addEventListener("click", toggle);
|
|
18
|
+
root.addEventListener("keydown", (e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); toggle(); } });
|
|
19
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
.L-portal{height:100%;display:flex;flex-direction:column;gap:18px;min-height:0}.portal-stage{position:relative;flex:1;min-height:0;overflow:hidden;isolation:isolate;border:1px solid #6070a955;border-radius:24px;color:#ecf4ff;background:radial-gradient(ellipse at 65% 40%,#20396d,#0b1027 70%);font-family:system-ui}.portal-atmosphere{position:absolute;inset:0;pointer-events:none;transform:translate(var(--px,0px),var(--py,0px));transition:transform .15s}.portal-orbit{position:absolute;width:65%;aspect-ratio:1;top:-35%;left:30%;border:2px solid #64b5ff55;border-radius:50%;box-shadow:0 0 70px #437aff44,inset 0 0 60px #417cff33}.portal-orbit:before,.portal-orbit:after{content:"";position:absolute;inset:10%;border:1px solid #a288ff55;border-radius:50%}.portal-orbit:after{inset:23%}.portal-grid{position:absolute;inset:20% -30% -60%;background:linear-gradient(#7299ff22 1px,transparent 1px),linear-gradient(90deg,#7299ff22 1px,transparent 1px);background-size:65px 65px;transform:perspective(550px) rotateX(55deg);mask-image:linear-gradient(transparent,#000 40%)}.portal-catalog{position:relative;height:100%;display:flex;flex-direction:column;justify-content:center;padding:32px 50px;gap:28px}.portal-sign{font-size:20px;letter-spacing:.22em;color:#a6c9ff}.portal-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:28px;min-height:0;overflow:auto;padding:12px 4px 24px}.portal-card{min-width:0;display:flex;flex-direction:column;gap:18px;text-align:left;font:inherit;color:inherit;border:1px solid #8ca5ff66;border-radius:20px;padding:28px;background:linear-gradient(140deg,#4c649a77,#182440bb);box-shadow:0 16px 45px #0005;cursor:pointer;transition:transform .25s,border-color .25s;backdrop-filter:blur(8px)}.portal-card:hover,.portal-card:focus-visible{transform:perspective(900px) rotateY(-5deg) translateY(-8px);border-color:#91e7ff;outline:3px solid #91e7ff55}.portal-card strong{font-size:30px;line-height:1.15}.portal-card>span:not(.portal-card-art){font-size:21px;line-height:1.4;color:#c4d2ef}.portal-card small{display:flex;gap:8px;align-items:center;font-size:18px;color:#a8e6ff;margin-top:auto}.portal-card-art{height:92px;display:flex;align-items:center;color:#94dfff}.portal-card-art .img{width:100%;height:100%;object-fit:cover;border-radius:12px}.portal-flight{position:absolute!important;z-index:10;pointer-events:none;transition:all .68s cubic-bezier(.6,.05,.15,1)!important;transform-origin:center}.portal-flight-in{left:-40%!important;top:-40%!important;width:180%!important;height:180%!important;transform:scale(1.2);filter:blur(6px);opacity:0}.portal-travelling .portal-catalog{opacity:.25;transition:opacity .5s}.portal-inside{position:absolute;inset:0;overflow:hidden}.portal-inside[hidden],.portal-catalog[hidden]{display:none}.portal-scene-title{position:absolute;top:24px;left:32px;font-size:25px;color:#b5d1ff;z-index:3}.portal-floor-word{position:absolute;inset:auto 0 1%;text-align:center;font-size:clamp(40px,8vw,150px);font-weight:900;letter-spacing:.07em;line-height:1;color:#75b8ff;opacity:.42;text-shadow:0 0 40px #3896ff99;transform:perspective(600px) rotateX(47deg);transform-origin:bottom;pointer-events:none;transition:color 1s,text-shadow 1s}.portal-objects{position:absolute;inset:0}.portal-object{position:absolute;display:flex;flex-direction:column;gap:12px;width:21%;min-height:94px;padding:18px;border:1px solid #6d8ca899;border-radius:14px;background:linear-gradient(135deg,#2d395f,#151d35);box-shadow:0 16px 22px #0005;transform:translate(-50%,-50%) rotate(var(--tilt));transition:left 1.2s cubic-bezier(.2,.8,.2,1),top 1.2s cubic-bezier(.2,.8,.2,1),transform 1.2s,background 1s,border-color 1s;transition-delay:calc(var(--order)*.035s)}.portal-object small{font-size:15px;color:#9ab3cf}.portal-object strong{font-size:24px;line-height:1.2;overflow-wrap:anywhere}.portal-paths{position:absolute;inset:0;width:100%;height:100%}.portal-paths path{fill:none;stroke:#79eece;stroke-width:2;stroke-dasharray:12 7;animation:portal-flow 1.4s linear infinite}.L-portal[data-transformed=true] .portal-object{border-color:#74ecce;background:linear-gradient(135deg,#1f615f,#152f49)}.L-portal[data-transformed=true] .portal-floor-word{color:#88ffdd;text-shadow:0 0 45px #48dbafaa}.portal-controls{display:flex;align-items:center;flex-wrap:wrap;gap:12px;font:20px system-ui}.portal-controls button{display:flex;align-items:center;gap:8px;padding:10px 16px;border-radius:9px;border:1px solid var(--line);background:var(--bg);color:var(--fg);font:inherit;cursor:pointer}.portal-controls button[hidden]{display:none}.portal-controls output{flex:1;min-width:240px;font-size:20px;line-height:1.4;color:var(--muted)}@keyframes portal-flow{to{stroke-dashoffset:-38}}@media(prefers-reduced-motion:reduce){.L-portal *{animation:none!important;transition:none!important}.portal-card:hover{transform:none}}@media(max-width:800px){.portal-catalog{padding:20px}.portal-cards{gap:16px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.portal-card{padding:18px}.portal-card strong{font-size:24px}.portal-object{padding:12px}.portal-object strong{font-size:20px}}
|
|
2
|
+
|
|
3
|
+
.portal-controls svg,.portal-card small svg{width:20px;height:20px;flex:none}.portal-card-art>svg{width:64px;height:64px}.portal-object small{display:flex;align-items:center;gap:12px}.portal-object small svg{width:30px;height:30px;flex:none}.portal-object[data-shape=sheet]{color:#263459;background:repeating-linear-gradient(transparent 0 24px,#708dc918 24px 25px),linear-gradient(135deg,#fff,#dae6ff);border-radius:4px 20px 4px 4px;box-shadow:5px 7px 0 #8499ba,12px 20px 25px #0006}.portal-object[data-shape=sheet] small{color:#526b92}.portal-object[data-shape=column]{border-radius:40% / 18%;background:linear-gradient(90deg,#23416f,#658bc2 45%,#264574);box-shadow:0 20px 35px #0006}.portal-object[data-shape=orb]{border-radius:50%;text-align:center;align-items:center;background:radial-gradient(circle at 30% 20%,#c2beff,#554590 50%,#172944);box-shadow:inset -10px -12px 30px #0005,0 20px 35px #0006}.L-portal[data-transformed=true] .portal-object[data-shape=sheet]{background:repeating-linear-gradient(transparent 0 24px,#52ab8818 24px 25px),linear-gradient(135deg,#fff,#d9fff0)}.L-portal[data-transformed=true] .portal-object[data-shape=orb]{background:radial-gradient(circle at 30% 20%,#caffee,#247c73 50%,#172944)}.L-portal[data-skin=editorial] .portal-stage{background:radial-gradient(ellipse at 60% 35%,#ead6c6,#f7f0e8);color:#26303e;border-color:#c9b9ac}.L-portal[data-skin=editorial] .portal-sign,.L-portal[data-skin=editorial] .portal-scene-title{color:#675244}.L-portal[data-skin=editorial] .portal-card{background:linear-gradient(140deg,#fff,#edddd0);border-color:#c5b5a7;box-shadow:0 16px 40px #73614e25}.L-portal[data-skin=editorial] .portal-card>span:not(.portal-card-art){color:#655b55}.L-portal[data-skin=editorial] .portal-card small,.L-portal[data-skin=editorial] .portal-card-art{color:#765344}.L-portal[data-skin=editorial] .portal-floor-word{color:#8a5340;text-shadow:none}.L-portal[data-skin=industrial] .portal-stage{background:radial-gradient(ellipse at 65% 40%,#433d31,#1a1b1c 70%)}.L-portal[data-skin=industrial] .portal-card{background:linear-gradient(140deg,#5b5442,#26292c);border-color:#d2a34d}.L-portal[data-skin=industrial] .portal-floor-word,.L-portal[data-skin=industrial] .portal-card-art{color:#ffce6b}
|
|
4
|
+
.portal-inside{opacity:0;transform:translateY(20px) scale(.98);transition:opacity .68s cubic-bezier(.2,.7,.2,1),transform .9s cubic-bezier(.2,.7,.2,1)}.portal-inside.portal-revealed{opacity:1;transform:none}.portal-catalog{transition:opacity .5s,transform .7s cubic-bezier(.2,.7,.2,1)}.portal-catalog.portal-departing{opacity:0;transform:translateY(-24px) scale(1.03);pointer-events:none}
|
|
5
|
+
.L-portal[data-skin=aurora] .portal-stage{background:radial-gradient(ellipse at 8% 0%,#e7eaff 0,transparent 45%),radial-gradient(ellipse at 94% 100%,#dcf7ee 0,transparent 48%),#fafbff;color:#182642;border:1px solid #e4e8f3;border-radius:28px;box-shadow:none}.L-portal[data-skin=aurora] .portal-atmosphere{opacity:.35}.L-portal[data-skin=aurora] .portal-orbit,.L-portal[data-skin=aurora] .portal-grid{display:none}.L-portal[data-skin=aurora] .portal-sign{color:#7356bd;letter-spacing:.14em}.L-portal[data-skin=aurora] .portal-card{background:#fff;color:#182642;border:1px solid #dce3ef;border-radius:24px;box-shadow:0 12px 32px #22345b09;backdrop-filter:none}.L-portal[data-skin=aurora] .portal-card:hover{transform:translateY(-8px);box-shadow:0 18px 40px #355ed017}.L-portal[data-skin=aurora] .portal-card-art{color:#3769e8;background:#edf2ff;border-radius:20px;width:106px;height:106px;display:grid;place-items:center}.L-portal[data-skin=aurora] .portal-card:nth-child(2) .portal-card-art{color:#0b9475;background:#e5f7f0}.L-portal[data-skin=aurora] .portal-card:nth-child(3) .portal-card-art{color:#ca3577;background:#fceaf2}.L-portal[data-skin=aurora] .portal-card span{color:#64728b}.L-portal[data-skin=aurora] .portal-card small{color:#3769e8}.L-portal[data-skin=aurora] .portal-flight{background:#fff;box-shadow:none}.L-portal[data-skin=aurora] .portal-floor-word{font-size:100px;transform:none;color:#e0e7f3;bottom:3%;letter-spacing:-.05em}.L-portal[data-skin=aurora] .portal-object,.L-portal[data-skin=aurora][data-transformed=true] .portal-object{border-radius:20px;background:#fff;color:#182642;border:1px solid #dce3ef;box-shadow:0 12px 24px #22345b0a}.L-portal[data-skin=aurora] .portal-object:before,.L-portal[data-skin=aurora] .portal-object:after{display:none}.L-portal[data-skin=aurora] .portal-object small{color:#3769e8}.L-portal[data-skin=aurora] .portal-object:nth-child(3n+2) small{color:#0b9475}.L-portal[data-skin=aurora] .portal-object:nth-child(3n) small{color:#e47b28}.L-portal[data-skin=aurora] .portal-object:nth-child(5n) small{color:#ca3577}.L-portal[data-skin=aurora] .portal-paths path{stroke:#8aacec;stroke-width:3;stroke-dasharray:0;animation:none}.L-portal[data-skin=aurora] .portal-controls button{background:#fff;border-color:#dce3ef;color:#315bca}.L-portal[data-skin=aurora] .portal-controls output{color:#58677f}
|
|
6
|
+
@media(prefers-reduced-motion:reduce){.portal-inside,.portal-catalog{transition:none}}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
for(const root of document.querySelectorAll('[data-portal]')){
|
|
2
|
+
const $=s=>root.querySelector(s),items=JSON.parse($('.portal-model').textContent),reduced=matchMedia('(prefers-reduced-motion: reduce)'),stage=$('.portal-stage');let current=-1,after=false,timer;
|
|
3
|
+
function controls(inside){$('[data-portal-back]').hidden=!inside;$('[data-portal-transform]').hidden=!inside;}
|
|
4
|
+
function scene(){
|
|
5
|
+
const item=items[current];$('.portal-scene-title').textContent=item.title;$('.portal-floor-word').textContent=(after?item.afterWord:item.beforeWord)||item.title;
|
|
6
|
+
$('[data-portal-description]').textContent=(after?item.after:item.before)||item.text||'';$('[data-portal-transform]').textContent=after?'Ver cenário anterior':'Transformar cenário';
|
|
7
|
+
const nodes=Array.isArray(item.objects)&&item.objects.length?item.objects:[{label:item.title||'Elemento'}];
|
|
8
|
+
const box=$('.portal-objects');if(box.children.length!==nodes.length){box.replaceChildren(...nodes.map((node,i)=>{const e=document.createElement('div');e.className='portal-object';const number=document.createElement('small');number.textContent=String(i+1).padStart(2,'0');const label=document.createElement('strong');label.textContent=node.label||'Elemento';e.append(number,label);return e;}));}
|
|
9
|
+
const rows=Math.ceil(nodes.length/3),positions=nodes.map((_,i)=>after?{x:20+(Math.floor(i/3)%2?2-i%3:i%3)*30,y:26+Math.floor(i/3)*(48/Math.max(1,rows-1)),r:0}:{x:15+((i*43)%72),y:23+((i*29)%51),r:root.dataset.skin==='aurora'?0:(i%2?1:-1)*(8+i%4*3)});
|
|
10
|
+
[...box.children].forEach((e,i)=>{e.dataset.shape=nodes[i].shape||'panel';e.querySelector('strong').textContent=nodes[i].label||'Elemento';e.querySelector('small').innerHTML=(nodes[i].glyph||'')+' '+String(i+1).padStart(2,'0');e.style.left=positions[i].x+'%';e.style.top=positions[i].y+'%';e.style.setProperty('--tilt',positions[i].r+'deg');e.style.setProperty('--order',i);});
|
|
11
|
+
const svg=$('.portal-paths');svg.replaceChildren();if(after)for(let i=1;i<positions.length;i++){const p=document.createElementNS('http://www.w3.org/2000/svg','path'),a=positions[i-1],b=positions[i];p.setAttribute('d',`M ${a.x*10} ${a.y*6} L ${b.x*10} ${b.y*6}`);svg.append(p);}
|
|
12
|
+
root.dataset.transformed=String(after);
|
|
13
|
+
}
|
|
14
|
+
function clear(){clearTimeout(timer);stage.querySelector('.portal-flight')?.remove();root.classList.remove('portal-travelling');}
|
|
15
|
+
function back(){clear();current=-1;after=false;root.dataset.view='catalog';root.dataset.transformed='false';$('.portal-catalog').hidden=false;$('.portal-inside').hidden=true;$('.portal-inside').classList.remove('portal-revealed');$('.portal-catalog').classList.remove('portal-departing');controls(false);$('[data-portal-description]').textContent='Escolha um elemento para entrar na cena.';}
|
|
16
|
+
function enter(index){if(root.classList.contains('portal-travelling'))return;clear();current=index;after=false;scene();const button=$(`[data-portal-enter="${index}"]`),r=button.getBoundingClientRect(),s=stage.getBoundingClientRect(),clone=button.cloneNode(true);clone.className='portal-card portal-flight';clone.removeAttribute('data-portal-enter');clone.setAttribute('aria-hidden','true');clone.tabIndex=-1;Object.assign(clone.style,{left:((r.left-s.left)/s.width*100)+'%',top:((r.top-s.top)/s.height*100)+'%',width:(r.width/s.width*100)+'%',height:(r.height/s.height*100)+'%'});stage.append(clone);root.classList.add('portal-travelling');$('.portal-inside').hidden=false;$('.portal-inside').classList.remove('portal-revealed');requestAnimationFrame(()=>requestAnimationFrame(()=>{clone.classList.add('portal-flight-in');$('.portal-inside').classList.add('portal-revealed');$('.portal-catalog').classList.add('portal-departing')}));
|
|
17
|
+
timer=setTimeout(()=>{clear();root.dataset.view='inside';$('.portal-catalog').hidden=true;$('.portal-inside').hidden=false;controls(true);$('[data-portal-transform]').focus({preventScroll:true});},reduced.matches?0:680);
|
|
18
|
+
}
|
|
19
|
+
root.querySelectorAll('[data-portal-enter]').forEach(b=>b.onclick=()=>enter(Number(b.dataset.portalEnter)));
|
|
20
|
+
$('[data-portal-transform]').onclick=()=>{after=!after;scene()};$('[data-portal-back]').onclick=back;$('[data-portal-reset]').onclick=back;
|
|
21
|
+
stage.onpointermove=e=>{if(reduced.matches)return;const r=stage.getBoundingClientRect();stage.style.setProperty('--px',((e.clientX-r.left)/r.width-.5)*12+'px');stage.style.setProperty('--py',((e.clientY-r.top)/r.height-.5)*12+'px')};stage.onpointerleave=()=>{stage.style.setProperty('--px','0px');stage.style.setProperty('--py','0px')};root.dataset.portalReady='true';
|
|
22
|
+
}
|