feat: add script to export training slides to PDF in 16:9 format

This commit is contained in:
Lucas Rayan committed 2026-08-24 10:36:05 -03:00
1 parent d530356101
commit f93e0fe460
31 files changed
+54144 -487

No files matched your search

-151
View File
@@ -1,151 +0,0 @@
import { execSync } from "node:child_process";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { NextResponse } from "next/server";
import puppeteer from "puppeteer";
export const runtime = "nodejs";
export const dynamic = "force-dynamic";
export async function GET(request) {
const { searchParams } = new URL(request.url);
const modulo = searchParams.get("modulo") || "1";
const publicDir = path.resolve(process.cwd(), "public/formacoes", modulo);
const htmlFile = path.join(publicDir, "index.html");
if (!fs.existsSync(htmlFile)) {
return NextResponse.json(
{ error: `Módulo ${modulo} não encontrado.` },
{ status: 404 }
);
}
const tmpDir = os.tmpdir();
const cachedCmykPdf = path.join(tmpDir, `espdocs-cached-cmyk-mod-${modulo}.pdf`);
const htmlMtime = fs.statSync(htmlFile).mtimeMs;
// Se já foi gerado no /tmp e o HTML não mudou, entrega instantaneamente
if (fs.existsSync(cachedCmykPdf)) {
const cachedMtime = fs.statSync(cachedCmykPdf).mtimeMs;
if (cachedMtime >= htmlMtime) {
const cachedBuffer = fs.readFileSync(cachedCmykPdf);
return new NextResponse(cachedBuffer, {
status: 200,
headers: {
"Content-Type": "application/pdf",
"Content-Disposition": `attachment; filename="LASER-ESP32-Modulo-${modulo}-CMYK.pdf"`,
"Content-Length": cachedBuffer.length.toString()
}
});
}
}
const tmpRgbPdf = path.join(tmpDir, `espdocs-tmp-${modulo}-${Date.now()}-rgb.pdf`);
let browser = null;
try {
browser = await puppeteer.launch({
headless: "new",
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-web-security",
"--allow-file-access-from-files"
]
});
const page = await browser.newPage();
await page.setViewport({ width: 1200, height: 1600, deviceScaleFactor: 2 });
await page.goto(`file://${htmlFile}`, { waitUntil: "load", timeout: 30000 });
// Aguarda o Paged.js concluir a montagem
await page.waitForFunction(() => {
const pages = document.querySelectorAll(".pagedjs_page");
return pages.length > 0 && !document.querySelector(".aviso-carregando");
}, { timeout: 25000 });
await new Promise((r) => setTimeout(r, 600));
await page.pdf({
path: tmpRgbPdf,
format: "A4",
printBackground: true,
preferCSSPageSize: true,
margin: { top: 0, right: 0, bottom: 0, left: 0 }
});
await browser.close();
browser = null;
// Converte para CMYK (DeviceCMYK / ISO Coated)
const gsCmd = `gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sColorConversionStrategy=CMYK -dProcessColorModel=/DeviceCMYK -dCompatibilityLevel=1.4 -sOutputFile="${cachedCmykPdf}" "${tmpRgbPdf}"`;
execSync(gsCmd, { stdio: "pipe" });
const pdfBuffer = fs.readFileSync(cachedCmykPdf);
return new NextResponse(pdfBuffer, {
status: 200,
headers: {
"Content-Type": "application/pdf",
"Content-Disposition": `attachment; filename="LASER-ESP32-Modulo-${modulo}-CMYK.pdf"`,
"Content-Length": pdfBuffer.length.toString()
}
});
} catch (error) {
console.error("Erro na conversão CMYK:", error);
return NextResponse.json(
{ error: "Falha ao gerar PDF CMYK", details: error.message },
{ status: 500 }
);
} finally {
if (browser) await browser.close();
if (fs.existsSync(tmpRgbPdf)) fs.unlinkSync(tmpRgbPdf);
}
}
export async function POST(request) {
try {
const formData = await request.formData();
const file = formData.get("pdf");
if (!file) {
return NextResponse.json({ error: "Nenhum arquivo PDF enviado." }, { status: 400 });
}
const bytes = await file.arrayBuffer();
const buffer = Buffer.from(bytes);
const tmpDir = os.tmpdir();
const inputPath = path.join(tmpDir, `input-${Date.now()}.pdf`);
const outputPath = path.join(tmpDir, `cmyk-${Date.now()}.pdf`);
fs.writeFileSync(inputPath, buffer);
// Converte com Ghostscript
const gsCmd = `gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sColorConversionStrategy=CMYK -dProcessColorModel=/DeviceCMYK -dCompatibilityLevel=1.4 -sOutputFile="${outputPath}" "${inputPath}"`;
execSync(gsCmd, { stdio: "pipe" });
const outputBuffer = fs.readFileSync(outputPath);
// Limpa temporários
if (fs.existsSync(inputPath)) fs.unlinkSync(inputPath);
if (fs.existsSync(outputPath)) fs.unlinkSync(outputPath);
return new NextResponse(outputBuffer, {
status: 200,
headers: {
"Content-Type": "application/pdf",
"Content-Disposition": `attachment; filename="documento-CMYK.pdf"`,
"Content-Length": outputBuffer.length.toString()
}
});
} catch (error) {
console.error("Erro ao converter PDF POST:", error);
return NextResponse.json(
{ error: "Erro ao converter PDF para CMYK", details: error.message },
{ status: 500 }
);
}
}
+84
View File
@@ -0,0 +1,84 @@
{
"0": "paged.polyfill.js",
"1": "Layout",
"2": "AtPage",
"3": "Page",
"4": ".push",
"5": "dependencies",
"6": ".replace",
"7": ".indexOf",
"8": "Sheet",
"9": "peek",
"10": "Breaks",
"11": "Queue",
"12": "allocateCursor",
"13": "ESPDocs - Documentação ESP32 em Português",
"14": "isNameStart",
"15": "Diretrizes de tema: claro e escuro",
"16": "internalMatch",
"17": "Previewer",
"18": "auditar-temas.mjs",
"19": "layout.jsx",
"20": "buildGroupMatchGraph",
"21": "getCharCode",
"22": "page.jsx",
"23": "PinRestrictions.jsx",
"24": "eslint.config.mjs",
"25": "compilerOptions",
"26": "requireKeys",
"27": "outOfRange",
"28": "testNode",
"29": "page.jsx",
"30": "page.jsx",
"31": "page.jsx",
"32": "esp-matter.c",
"33": "seo.js",
"34": "consumeB$1",
"35": "processStructure",
"36": "generate$2",
"37": "getVendorPrefix",
"38": "layout.jsx",
"39": "layout.jsx",
"40": "page.jsx",
"41": "page.jsx",
"42": "page.jsx",
"43": "layout.jsx",
"44": "layout.jsx",
"45": "page.jsx",
"46": "Header.jsx",
"47": "esp-nn.c",
"48": "esp-who.c",
"49": "matchSyntax",
"50": "consumeNumber$5",
"51": "strcmp",
"52": "readSequence",
"53": "patchAtrules",
"54": "route.js",
"55": "page.jsx",
"56": "robots.js",
"57": "page.jsx",
"58": "sitemap.js",
"59": "CLAUDE.md",
"60": "BoardCard.jsx",
"61": "Footer.jsx",
"62": "Providers.jsx",
"63": "SeriesTabMenu.jsx",
"64": "next.config.mjs",
"65": "postcss.config.mjs",
"66": "esp-adf.c",
"67": "esp-dsp.c",
"68": "esp-idf.c",
"69": "consumeDeclaration",
"70": "consumeRaw$4",
"71": "createParseContext",
"72": "dumpAtruleMapSyntax",
"73": "isProtoString",
"74": "getWalkersFromStructure",
"75": "isDelim",
"76": "isSelectorValid",
"77": "OverflowContentError",
"78": "RenderResult",
"79": "micropython.py",
"80": ".getSize",
"81": "start.config.js"
}
+1
View File
@@ -0,0 +1 @@
.
@@ -0,0 +1,84 @@
{
"0": "paged.polyfill.js",
"1": "Layout",
"2": "AtPage",
"3": "Page",
"4": ".push",
"5": "dependencies",
"6": ".replace",
"7": ".indexOf",
"8": "Sheet",
"9": "peek",
"10": "Breaks",
"11": "Queue",
"12": "allocateCursor",
"13": "ESPDocs - Documentação ESP32 em Português",
"14": "isNameStart",
"15": "Diretrizes de tema: claro e escuro",
"16": "internalMatch",
"17": "Previewer",
"18": "auditar-temas.mjs",
"19": "layout.jsx",
"20": "buildGroupMatchGraph",
"21": "getCharCode",
"22": "page.jsx",
"23": "PinRestrictions.jsx",
"24": "eslint.config.mjs",
"25": "compilerOptions",
"26": "requireKeys",
"27": "outOfRange",
"28": "testNode",
"29": "page.jsx",
"30": "page.jsx",
"31": "page.jsx",
"32": "esp-matter.c",
"33": "seo.js",
"34": "consumeB$1",
"35": "processStructure",
"36": "generate$2",
"37": "getVendorPrefix",
"38": "layout.jsx",
"39": "layout.jsx",
"40": "page.jsx",
"41": "page.jsx",
"42": "page.jsx",
"43": "layout.jsx",
"44": "layout.jsx",
"45": "page.jsx",
"46": "Header.jsx",
"47": "esp-nn.c",
"48": "esp-who.c",
"49": "matchSyntax",
"50": "consumeNumber$5",
"51": "strcmp",
"52": "readSequence",
"53": "patchAtrules",
"54": "route.js",
"55": "page.jsx",
"56": "robots.js",
"57": "page.jsx",
"58": "sitemap.js",
"59": "CLAUDE.md",
"60": "BoardCard.jsx",
"61": "Footer.jsx",
"62": "Providers.jsx",
"63": "SeriesTabMenu.jsx",
"64": "next.config.mjs",
"65": "postcss.config.mjs",
"66": "esp-adf.c",
"67": "esp-dsp.c",
"68": "esp-idf.c",
"69": "consumeDeclaration",
"70": "consumeRaw$4",
"71": "createParseContext",
"72": "dumpAtruleMapSyntax",
"73": "isProtoString",
"74": "getWalkersFromStructure",
"75": "isDelim",
"76": "isSelectorValid",
"77": "OverflowContentError",
"78": "RenderResult",
"79": "micropython.py",
"80": ".getSize",
"81": "start.config.js"
}
+283
View File
@@ -0,0 +1,283 @@
# Graph Report - ESPDocs (2026-08-24)
## Corpus Check
- 58 files · ~674,255 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 824 nodes · 1491 edges · 82 communities (58 shown, 24 thin omitted)
- Extraction: 99% EXTRACTED · 1% INFERRED · 0% AMBIGUOUS · INFERRED: 20 edges (avg confidence: 0.53)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `d5303561`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
## Community Hubs (Navigation)
- paged.polyfill.js
- Layout
- AtPage
- Page
- .push
- dependencies
- .replace
- .indexOf
- Sheet
- peek
- Breaks
- Queue
- allocateCursor
- ESPDocs - Documentação ESP32 em Português
- isNameStart
- Diretrizes de tema: claro e escuro
- internalMatch
- Previewer
- auditar-temas.mjs
- layout.jsx
- buildGroupMatchGraph
- getCharCode
- PinRestrictions.jsx
- eslint.config.mjs
- compilerOptions
- requireKeys
- outOfRange
- testNode
- page.jsx
- page.jsx
- esp-matter.c
- seo.js
- consumeB$1
- processStructure
- generate$2
- getVendorPrefix
- layout.jsx
- layout.jsx
- page.jsx
- page.jsx
- layout.jsx
- layout.jsx
- page.jsx
- esp-nn.c
- matchSyntax
- consumeNumber$5
- strcmp
- readSequence
- patchAtrules
- CLAUDE.md
- next.config.mjs
- postcss.config.mjs
- consumeDeclaration
- consumeRaw$4
- createParseContext
- dumpAtruleMapSyntax
- isProtoString
- getWalkersFromStructure
- isDelim
- isSelectorValid
- OverflowContentError
- RenderResult
## God Nodes (most connected - your core abstractions)
1. `AtPage` - 39 edges
2. `walk()` - 27 edges
3. `Layout` - 21 edges
4. `Page` - 18 edges
5. `Footnotes` - 18 edges
6. `Chunker` - 17 edges
7. `Counters` - 17 edges
8. `Sheet` - 16 edges
9. `createItem()` - 14 edges
10. `join()` - 14 edges
## Surprising Connections (you probably didn't know these)
- `nodeAfter()` --calls--> `nextSignificantNode()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 1 → community 10_
- `sourceFragment()` --calls--> `join()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 6 → community 4_
- `generateSequence()` --calls--> `join()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 36 → community 4_
- `number()` --calls--> `isPostfixIeHack()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 27 → community 4_
- `peek()` --calls--> `scanString()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 7 → community 9_
## Import Cycles
- None detected.
## Communities (82 total, 24 thin omitted)
### Community 0 - "paged.polyfill.js"
Cohesion: 0.02
Nodes (21): NOTE: The order of the mappings is NOT guaranteed., TODO: should consume block content as Raw?, TODO: fall back to mutation observer?, TODO: not sure we should support this hack, TODO: check value is an ident, TODO: produce a node with Delim node type, NOTE: Don't check more than a first argument is an ident, rest checks are for le, TODO: this isn't working right, needs to check what is in the prelude (+13 more)
### Community 1 - "Layout"
Cohesion: 0.06
Nodes (27): breakInsideAvoidParentNode(), BreakToken, cloneNode(), elementAfter(), findElement(), findRef(), Footnotes, getBoundingClientRect() (+19 more)
### Community 2 - "AtPage"
Cohesion: 0.08
Nodes (6): append(), AtPage, createItem(), CSSValueToString(), validate(), walk()
### Community 3 - "Page"
Cohesion: 0.06
Nodes (10): CodeExample(), ConnectionsDiagram(), FILTER_CATEGORIES, type_colors, Chunker, dump(), forEachToken(), Page (+2 more)
### Community 4 - ".push"
Cohesion: 0.06
Nodes (16): collectWarning(), computeSourceURL(), Counters, isAbsolute(), join(), normalize(), number(), PageCounterIncrement (+8 more)
### Community 5 - "dependencies"
Cohesion: 0.05
Nodes (43): @emotion/react, @emotion/styled, eslint, eslint-config-next, @eslint/eslintrc, framer-motion, googleapis, lucide-react (+35 more)
### Community 6 - ".replace"
Cohesion: 0.07
Nodes (19): attr(), calc(), child(), cleanPseudoContent(), consumeFunction(), customIdent(), defer(), eqStr() (+11 more)
### Community 7 - ".indexOf"
Cohesion: 0.09
Nodes (12): ArraySet$1(), calculateSpecificity(), cleanSelector(), compareByGeneratedPositionsInflated(), generatedPositionAfter(), getArg(), MappingList$1(), relative() (+4 more)
### Community 8 - "Sheet"
Cohesion: 0.10
Nodes (6): ContentParser, Handler, Hook, invokeForType(), Lists, Sheet
### Community 9 - "peek"
Cohesion: 0.13
Nodes (20): charCode(), customPropertyName(), idSelector(), maybeMultiplied(), maybeToken(), parse$2(), peek(), readGroup() (+12 more)
### Community 10 - "Breaks"
Cohesion: 0.10
Nodes (14): Breaks, CommentsFilter, displayedElementAfter(), displayedElementBefore(), elementBefore(), filterTree(), getNodeWithNamedPage(), isAllWhitespace() (+6 more)
### Community 11 - "Queue"
Cohesion: 0.12
Nodes (10): Queue, requireEs6Symbol(), requireIsArguments(), requireIsFunction(), requireIsImplemented(), requireIsString(), requireIsSymbol(), requirePolyfill() (+2 more)
### Community 12 - "allocateCursor"
Cohesion: 0.21
Nodes (9): allocateCursor(), appendOrAssign(), appendOrAssignOrNull(), copy(), createTypeIterator(), deepAssign(), isObject$2(), mix$1() (+1 more)
### Community 13 - "ESPDocs - Documentação ESP32 em Português"
Cohesion: 0.13
Nodes (14): 👤 Autor, Configuração do Marketplace (Opcional), 🤝 Contribuindo, 🚀 Deploy on Vercel, ⚠️ Disclaimer, ESPDocs - Documentação ESP32 em Português, 📁 Estrutura do Projeto, Executar em Desenvolvimento (+6 more)
### Community 14 - "isNameStart"
Cohesion: 0.15
Nodes (13): isDigit$5(), isHexDigit$4(), isIdentifierStart$2(), isLetter(), isLowercaseLetter(), isName$2(), isNameStart(), isNewline$1() (+5 more)
### Community 15 - "Diretrizes de tema: claro e escuro"
Cohesion: 0.17
Nodes (11): 1. Só existem os tons declarados, 2. A regra da simetria, 3. Pares canônicos por papel, 4.1. Botão nunca inverte preto ↔ branco, 4.2. Painel de destaque acompanha o tema, 4.3. Separação de superfície no tema claro, 4. Exceção: superfícies escuras nos dois temas, 5. Cor de série vem do dado, não da classe (+3 more)
### Community 16 - "internalMatch"
Cohesion: 0.20
Nodes (11): areStringsEqualCaseInsensitive(), buildLoc(), fromLoc(), internalMatch(), isCommaContextEnd(), isCommaContextStart(), isContextEdgeDelim(), locateMismatch() (+3 more)
### Community 18 - "auditar-temas.mjs"
Cohesion: 0.48
Nodes (6): arquivos(), contraste(), coresFixasInline(), ESCALA, luminancia(), main()
### Community 19 - "layout.jsx"
Cohesion: 0.33
Nodes (4): inter, metadata, outfit, viewport
### Community 20 - "buildGroupMatchGraph"
Cohesion: 0.53
Nodes (6): buildGroupMatchGraph(), buildMatchGraph$1(), buildMultiplierMatchGraph(), createCondition(), isEnumCapatible(), isFunctionType()
### Community 21 - "getCharCode"
Cohesion: 0.53
Nodes (6): consumeBadUrlRemnants$1(), consumeEscaped$1(), consumeName$1(), getCharCode(), getNewlineLength$1(), tokenize$3()
### Community 23 - "PinRestrictions.jsx"
Cohesion: 0.60
Nodes (4): derivarGrupos(), GRUPOS, PinRestrictions(), rotuloDoPino()
### Community 24 - "eslint.config.mjs"
Cohesion: 0.40
Nodes (4): compat, __dirname, eslintConfig, __filename
### Community 25 - "compilerOptions"
Cohesion: 0.40
Nodes (4): compilerOptions, paths, @/*, ./*
### Community 26 - "requireKeys"
Cohesion: 0.40
Nodes (5): assign(), requireIsImplemented$1(), requireKeys(), requireShim$4(), requireShim$5()
### Community 27 - "outOfRange"
Cohesion: 0.40
Nodes (5): dimension(), integer(), isPostfixIeHack(), outOfRange(), percentage()
### Community 28 - "testNode"
Cohesion: 0.40
Nodes (4): isKeyword(), isProperty(), isType(), testNode()
### Community 29 - "page.jsx"
Cohesion: 0.67
Nodes (3): categoryIcons, Comparacao(), valorDe()
### Community 31 - "page.jsx"
Cohesion: 0.67
Nodes (3): getOptionIcon(), iconMap, Seletor()
### Community 34 - "consumeB$1"
Cohesion: 0.50
Nodes (4): checkInteger$1(), consumeB$1(), isDelim$1(), skipSC()
### Community 35 - "processStructure"
Cohesion: 0.50
Nodes (4): createNodeStructureChecker(), isValidLocation(), isValidNumber(), processStructure()
### Community 36 - "generate$2"
Cohesion: 0.50
Nodes (4): generate$2(), generateMultiplier(), generateSequence(), generateTypeOpts()
### Community 37 - "getVendorPrefix"
Cohesion: 0.67
Nodes (4): getKeywordDescriptor(), getPropertyDescriptor(), getVendorPrefix(), isCustomProperty$1()
### Community 49 - "matchSyntax"
Cohesion: 0.67
Nodes (3): buildMatchResult(), matchSyntax(), valueHasVar()
### Community 50 - "consumeNumber$5"
Cohesion: 0.67
Nodes (3): cmpChar$5(), consumeNumber$5(), findDecimalNumberEnd()
### Community 51 - "strcmp"
Cohesion: 0.67
Nodes (3): compareByGeneratedPositionsDeflated(), compareByOriginalPositions(), strcmp()
### Community 52 - "readSequence"
Cohesion: 0.67
Nodes (3): consumeRaw(), parentheses(), readSequence()
### Community 53 - "patchAtrules"
Cohesion: 0.67
Nodes (3): patchAtrules(), patchDictionary(), unpackSyntaxes()
## Knowledge Gaps
- **71 isolated node(s):** `metadata`, `metadata`, `categoryIcons`, `metadata`, `metadata` (+66 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **24 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `AtPage` connect `AtPage` to `paged.polyfill.js`, `Page`?**
_High betweenness centrality (0.045) - this node is a cross-community bridge._
- **Why does `Page` connect `Page` to `paged.polyfill.js`, `.replace`?**
_High betweenness centrality (0.030) - this node is a cross-community bridge._
- **Why does `Chunker` connect `Page` to `paged.polyfill.js`?**
_High betweenness centrality (0.023) - this node is a cross-community bridge._
- **What connects `metadata`, `metadata`, `categoryIcons` to the rest of the system?**
_71 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `paged.polyfill.js` be split into smaller, more focused modules?**
_Cohesion score 0.022727272727272728 - nodes in this community are weakly interconnected._
- **Should `Layout` be split into smaller, more focused modules?**
_Cohesion score 0.05575065847234416 - nodes in this community are weakly interconnected._
- **Should `AtPage` be split into smaller, more focused modules?**
_Cohesion score 0.08240794856808883 - nodes in this community are weakly interconnected._
File diff suppressed because it is too large. Load diff
+467
View File
@@ -0,0 +1,467 @@
{
"app/api/placas/route.js": {
"mtime": 1787208875.1094453,
"ast_hash": "292fa5aae92458ae0098d7fa41ccba72",
"semantic_hash": ""
},
"app/catalogo/layout.jsx": {
"mtime": 1787492776.0956094,
"ast_hash": "f228a345868fa3e409f80133c29aa737",
"semantic_hash": ""
},
"app/catalogo/page.jsx": {
"mtime": 1787212450.0282295,
"ast_hash": "f1734aa31b6e84da295b6e2ee670b333",
"semantic_hash": ""
},
"app/comparacao/layout.jsx": {
"mtime": 1787492776.089609,
"ast_hash": "288273a48c04bbdc124c62848e9d7ca9",
"semantic_hash": ""
},
"app/comparacao/page.jsx": {
"mtime": 1787227734.6678472,
"ast_hash": "5e2c544715404ab174ce3d54c969f93b",
"semantic_hash": ""
},
"app/frameworks/[key]/page.jsx": {
"mtime": 1787492933.9300845,
"ast_hash": "a5ed16ece919880c8300d897424c49a2",
"semantic_hash": ""
},
"app/frameworks/page.jsx": {
"mtime": 1787493006.3313804,
"ast_hash": "f878cabb7d4a27e83262d95b769b8dc9",
"semantic_hash": ""
},
"app/glossario/page.jsx": {
"mtime": 1787493006.3354793,
"ast_hash": "6a02ace0ab551d91794fce1a0b19c753",
"semantic_hash": ""
},
"app/layout.jsx": {
"mtime": 1787499080.3362017,
"ast_hash": "78e4dcb798d3806a4a37071ecfc9ef0d",
"semantic_hash": ""
},
"app/page.jsx": {
"mtime": 1787212450.023114,
"ast_hash": "31690989ba2c2ed800f1fb7fb78a0ed8",
"semantic_hash": ""
},
"app/robots.js": {
"mtime": 1787492747.5210466,
"ast_hash": "75bc90966a10439d6485dd11454fccbd",
"semantic_hash": ""
},
"app/seletor/layout.jsx": {
"mtime": 1787492776.0926092,
"ast_hash": "73da1dea1a6b930897053dda83e27f4f",
"semantic_hash": ""
},
"app/seletor/page.jsx": {
"mtime": 1787227734.668592,
"ast_hash": "4ad52df27f6742b5a6302e694593164c",
"semantic_hash": ""
},
"app/series/[key]/page.jsx": {
"mtime": 1787493839.4458327,
"ast_hash": "ade633944e6605b43b3279859e5031c7",
"semantic_hash": ""
},
"app/series/layout.jsx": {
"mtime": 1787493098.9029381,
"ast_hash": "eb809632a02c5731c37fba793c2c6a4a",
"semantic_hash": ""
},
"app/series/page.jsx": {
"mtime": 1787227734.6664312,
"ast_hash": "a2271ce4a77e45d5e03feeec3196c496",
"semantic_hash": ""
},
"app/sitemap.js": {
"mtime": 1787492747.5170462,
"ast_hash": "906d69e855c533c8937646cfe386121e",
"semantic_hash": ""
},
"app/sobre/page.jsx": {
"mtime": 1787493098.9036343,
"ast_hash": "85a3aaa744cb6b2226616bc3c88d60a4",
"semantic_hash": ""
},
"components/BoardCard.jsx": {
"mtime": 1787212419.8479488,
"ast_hash": "50130a57d076ea247a341801685faf14",
"semantic_hash": ""
},
"components/CodeExample.jsx": {
"mtime": 1787227734.670659,
"ast_hash": "ed46db1f388eaf2170e383722cd988ec",
"semantic_hash": ""
},
"components/ConnectionsDiagram.jsx": {
"mtime": 1787212419.845745,
"ast_hash": "6898b8e25e23d506512e6a9f634a8424",
"semantic_hash": ""
},
"components/Footer.jsx": {
"mtime": 1787212419.85472,
"ast_hash": "bd7ffbe86c0b3815a27e5e90f56848c7",
"semantic_hash": ""
},
"components/Header.jsx": {
"mtime": 1787493839.49114,
"ast_hash": "65796747b210fb0313ea5e2b41234c0a",
"semantic_hash": ""
},
"components/PinRestrictions.jsx": {
"mtime": 1787227759.6538575,
"ast_hash": "10907f1e0fb249f497ed4fc365303ef9",
"semantic_hash": ""
},
"components/Providers.jsx": {
"mtime": 1787208875.111169,
"ast_hash": "d31db26b58629a807b7df4c4a3189772",
"semantic_hash": ""
},
"components/SeriesTabMenu.jsx": {
"mtime": 1787227734.6712155,
"ast_hash": "20947d45331bd3be7cb858246746f45c",
"semantic_hash": ""
},
"eslint.config.mjs": {
"mtime": 1787208875.111688,
"ast_hash": "cd28c192684b52caf16d8d1df068e272",
"semantic_hash": ""
},
"jsconfig.json": {
"mtime": 1787208875.115688,
"ast_hash": "21306b44064ae42bbbd715b1986abaf8",
"semantic_hash": ""
},
"lib/seo.js": {
"mtime": 1787492722.9508429,
"ast_hash": "12b829f0078d3fb18cb20f832f498c17",
"semantic_hash": ""
},
"next.config.mjs": {
"mtime": 1787208875.115688,
"ast_hash": "21958f5752add43cc47ab0ff5172cd46",
"semantic_hash": ""
},
"package.json": {
"mtime": 1787576412.64932,
"ast_hash": "0a1ab6540c39a42179b1f7de5322efd1",
"semantic_hash": ""
},
"postcss.config.mjs": {
"mtime": 1787208875.1166883,
"ast_hash": "675899342e765a4d16acd75a53389101",
"semantic_hash": ""
},
"public/conexoes/ESP32-C2.json": {
"mtime": 1787208875.11729,
"ast_hash": "aad3b4f175c3dd386adbf368f15073f7",
"semantic_hash": ""
},
"public/conexoes/ESP32-C3.json": {
"mtime": 1787208875.1173952,
"ast_hash": "5deecb15a45f0291802077cd24e4051b",
"semantic_hash": ""
},
"public/conexoes/ESP32-C5.json": {
"mtime": 1787208875.1173952,
"ast_hash": "949d8facf94a56f254872c185a88d2a1",
"semantic_hash": ""
},
"public/conexoes/ESP32-C6.json": {
"mtime": 1787208875.1173952,
"ast_hash": "84dceb481e501b68643300982832c8c7",
"semantic_hash": ""
},
"public/conexoes/ESP32-C61.json": {
"mtime": 1787208875.1173952,
"ast_hash": "88aa2cadabff6bbd1ba662531e904df6",
"semantic_hash": ""
},
"public/conexoes/ESP32-H2.json": {
"mtime": 1787208875.1173952,
"ast_hash": "61e9339e808c87642b618b322de424dd",
"semantic_hash": ""
},
"public/conexoes/ESP32-P4.json": {
"mtime": 1787208875.1173952,
"ast_hash": "aec6bfdf220455851dea0619fa3954e8",
"semantic_hash": ""
},
"public/conexoes/ESP32-S2.json": {
"mtime": 1787208875.1173952,
"ast_hash": "4b6b0c563a63a59756227ef096141cd5",
"semantic_hash": ""
},
"public/conexoes/ESP32-S3.json": {
"mtime": 1787208875.1176882,
"ast_hash": "7d877331595d2677894a926714590c04",
"semantic_hash": ""
},
"public/conexoes/ESP32-S31.json": {
"mtime": 1787208875.1176882,
"ast_hash": "0f3cd4f8f2741329ea93f18227b9f2a9",
"semantic_hash": ""
},
"public/conexoes/ESP32.json": {
"mtime": 1787208875.1176882,
"ast_hash": "0d111992e8707f75177cf8ec495519f1",
"semantic_hash": ""
},
"public/exemplos/esp-adf.c": {
"mtime": 1787208875.1497247,
"ast_hash": "189f598b93c1b130dedce25d07513a30",
"semantic_hash": ""
},
"public/exemplos/esp-dsp.c": {
"mtime": 1787208875.1497247,
"ast_hash": "f3406d15617cf415888b07d688cdaf34",
"semantic_hash": ""
},
"public/exemplos/esp-idf.c": {
"mtime": 1787208875.1497247,
"ast_hash": "28d7cf987af6c5d3a54ad1fe06571e91",
"semantic_hash": ""
},
"public/exemplos/esp-matter.c": {
"mtime": 1787208875.1497247,
"ast_hash": "332c82ce14230250fd828db6e22cae44",
"semantic_hash": ""
},
"public/exemplos/esp-nn.c": {
"mtime": 1787208875.1497247,
"ast_hash": "186d382f96347dbae8be3b13c0252ad3",
"semantic_hash": ""
},
"public/exemplos/esp-who.c": {
"mtime": 1787208875.1497247,
"ast_hash": "2abc563b2750f0a823438a3e9b1c56c1",
"semantic_hash": ""
},
"public/exemplos/micropython.py": {
"mtime": 1787208875.1497247,
"ast_hash": "99c3b78148eee8632bb7772db61bdfdd",
"semantic_hash": ""
},
"public/formacoes/assets/paged.polyfill.js": {
"mtime": 1787224680.399874,
"ast_hash": "28be5336e03f6072740a5cad2f787314",
"semantic_hash": ""
},
"public/frameworks.json": {
"mtime": 1787208875.1497247,
"ast_hash": "3595f7219f3fcfd1b8d59ea741fab869",
"semantic_hash": ""
},
"public/series.json": {
"mtime": 1787214110.9422739,
"ast_hash": "64ba3d2642c83040afda45cccc107736",
"semantic_hash": ""
},
"scripts/auditar-temas.mjs": {
"mtime": 1787247985.7048883,
"ast_hash": "ab177dc276098ee67cf39504c2c406df",
"semantic_hash": ""
},
"start.config.js": {
"mtime": 1787208875.1956916,
"ast_hash": "a6a5cda80ac9eea57d50f14872a739d2",
"semantic_hash": ""
},
"CLAUDE.md": {
"mtime": 1787208875.1086879,
"ast_hash": "0ea9488e278d2efd15e7c0b6e7cdca83",
"semantic_hash": ""
},
"DESIGN.md": {
"mtime": 1787227815.9607596,
"ast_hash": "227ededb587d6b60a08c9b653ffece7e",
"semantic_hash": ""
},
"README.md": {
"mtime": 1787208875.1086879,
"ast_hash": "e1c8b99e874c6cddc035c7ac900c9bbd",
"semantic_hash": ""
},
"public/formacoes/1/index.html": {
"mtime": 1787576388.0904403,
"ast_hash": "d885d27c8e0854573c7596f2f87d90e7",
"semantic_hash": ""
},
"public/formacoes/1/slide.html": {
"mtime": 1787577490.6546896,
"ast_hash": "76d50796d964b9bc5f0de4217eead660",
"semantic_hash": ""
},
"public/google21a790a2c23c0ec5.html": {
"mtime": 1787208875.1497247,
"ast_hash": "c8e349cbe0172dc98e26385e09d67cc3",
"semantic_hash": ""
},
"public/datasheets/ESP32-C2 (ESP8684).pdf": {
"mtime": 1787208875.1196883,
"ast_hash": "36e6ee1a52e7293510d60c7adfc0fbaf",
"semantic_hash": ""
},
"public/datasheets/ESP32-C3.pdf": {
"mtime": 1787208875.1226883,
"ast_hash": "25beb64276e6bc6c5d13d032e30847d9",
"semantic_hash": ""
},
"public/datasheets/ESP32-C5.pdf": {
"mtime": 1787208875.1246884,
"ast_hash": "c1083a9504a574282a09f557e0343d48",
"semantic_hash": ""
},
"public/datasheets/ESP32-C6.pdf": {
"mtime": 1787208875.1286886,
"ast_hash": "66a7b580c6afff5becf9bd326bb675d4",
"semantic_hash": ""
},
"public/datasheets/ESP32-C61.pdf": {
"mtime": 1787208875.1306887,
"ast_hash": "2f86d54475a006e9b0e41ba329560c5f",
"semantic_hash": ""
},
"public/datasheets/ESP32-H2.pdf": {
"mtime": 1787208875.1326888,
"ast_hash": "460ea57a62c32646d12ae0088eb1a073",
"semantic_hash": ""
},
"public/datasheets/ESP32-P4.pdf": {
"mtime": 1787208875.137689,
"ast_hash": "aa3fc8de7dfa4e7d3ff40dd9e19fdb35",
"semantic_hash": ""
},
"public/datasheets/ESP32-S2.pdf": {
"mtime": 1787208875.1406891,
"ast_hash": "1e912b14670dde07253da71147ea2ded",
"semantic_hash": ""
},
"public/datasheets/ESP32-S3.pdf": {
"mtime": 1787208875.1436894,
"ast_hash": "cdb8a18273a761aff071e6a665867205",
"semantic_hash": ""
},
"public/datasheets/ESP32-S31.pdf": {
"mtime": 1787208875.1466894,
"ast_hash": "b2f7aa8b2cc16c18815abc5a1ddd566a",
"semantic_hash": ""
},
"public/datasheets/ESP32.pdf": {
"mtime": 1787208875.1486895,
"ast_hash": "2354c04b871b3b6b294076c1fb953522",
"semantic_hash": ""
},
"app/icon.svg": {
"mtime": 1787493648.5160885,
"ast_hash": "ce4f06e06babeb3ff3c5f06373573625",
"semantic_hash": ""
},
"app/opengraph-image.png": {
"mtime": 1787493677.7188504,
"ast_hash": "a64c2620cabed2aface6819ea582e76d",
"semantic_hash": ""
},
"public/formacoes/1/esp32-s3-blocos.png": {
"mtime": 1787230391.7354066,
"ast_hash": "91caddfa7e957735efeeaf51252dd4c9",
"semantic_hash": ""
},
"public/formacoes/1/pratica.png": {
"mtime": 1787226071.9687011,
"ast_hash": "0041e888c91ab709794602e2a607532b",
"semantic_hash": ""
},
"public/formacoes/assets/capa-curvas.svg": {
"mtime": 1787226377.6237059,
"ast_hash": "aafa9bdfdede085b9d848684f6420ac6",
"semantic_hash": ""
},
"public/formacoes/assets/laser-escuro.svg": {
"mtime": 1787226338.6152956,
"ast_hash": "b4b66a35a74c18b6fcdd4e7b5aba60d9",
"semantic_hash": ""
},
"public/formacoes/assets/laser.svg": {
"mtime": 1787226268.1520822,
"ast_hash": "62d94dd326502e1b0afd280e1f465cf4",
"semantic_hash": ""
},
"public/logo.png": {
"mtime": 1787208875.1497247,
"ast_hash": "1c0eae14654c8f5427c7141029ecd29e",
"semantic_hash": ""
},
"public/marca/espdocs-lockup.svg": {
"mtime": 1787493648.5180027,
"ast_hash": "a95424a74b7d5dff1c0a16ee2981bb06",
"semantic_hash": ""
},
"public/marca/espdocs-marca.svg": {
"mtime": 1787493553.7360556,
"ast_hash": "ce4f06e06babeb3ff3c5f06373573625",
"semantic_hash": ""
},
"public/placas/esp32-c2.png": {
"mtime": 1787208875.1506896,
"ast_hash": "3480aadf17ef57e93ee5afdfd934d896",
"semantic_hash": ""
},
"public/placas/esp32-c3.png": {
"mtime": 1787208875.1516895,
"ast_hash": "85df0510a61dee5ffa581d912f5d68c9",
"semantic_hash": ""
},
"public/placas/esp32-c5.png": {
"mtime": 1787208875.1526897,
"ast_hash": "6a59f4e23ac9ec5e319a77a6600fa343",
"semantic_hash": ""
},
"public/placas/esp32-c6.png": {
"mtime": 1787208875.1536896,
"ast_hash": "0f836b438f62bb4b6237c9318346cdf2",
"semantic_hash": ""
},
"public/placas/esp32-c61.png": {
"mtime": 1787208875.1546898,
"ast_hash": "6734034067caa41374f2a4ca5064a7d3",
"semantic_hash": ""
},
"public/placas/esp32-h2.png": {
"mtime": 1787208875.1556897,
"ast_hash": "7dceb269eb019ce826ef336dd57ab52c",
"semantic_hash": ""
},
"public/placas/esp32-p4.png": {
"mtime": 1787208875.1626902,
"ast_hash": "c144c171692850ac257d00827dc674f5",
"semantic_hash": ""
},
"public/placas/esp32-s2.png": {
"mtime": 1787208875.1646903,
"ast_hash": "670c4a12339f32fb32af2eebdc575892",
"semantic_hash": ""
},
"public/placas/esp32-s3.png": {
"mtime": 1787208875.1686904,
"ast_hash": "52b96040d9c648f7c52aa4c8adac7e47",
"semantic_hash": ""
},
"public/placas/esp32-s31.png": {
"mtime": 1787208875.1926913,
"ast_hash": "5b970e68abce449015851cd5966525e3",
"semantic_hash": ""
},
"public/placas/esp32.png": {
"mtime": 1787208875.1946914,
"ast_hash": "6791837138c1c5400db2ee07c9025627",
"semantic_hash": ""
}
}
+283
View File
@@ -0,0 +1,283 @@
# Graph Report - ESPDocs (2026-08-24)
## Corpus Check
- 59 files · ~675,087 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 833 nodes · 1499 edges · 82 communities (58 shown, 24 thin omitted)
- Extraction: 99% EXTRACTED · 1% INFERRED · 0% AMBIGUOUS · INFERRED: 20 edges (avg confidence: 0.53)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `d5303561`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
## Community Hubs (Navigation)
- paged.polyfill.js
- Layout
- AtPage
- Page
- .push
- dependencies
- .replace
- .indexOf
- Sheet
- peek
- Breaks
- Queue
- allocateCursor
- ESPDocs - Documentação ESP32 em Português
- isNameStart
- Diretrizes de tema: claro e escuro
- internalMatch
- Previewer
- auditar-temas.mjs
- layout.jsx
- buildGroupMatchGraph
- getCharCode
- PinRestrictions.jsx
- eslint.config.mjs
- compilerOptions
- requireKeys
- outOfRange
- testNode
- page.jsx
- page.jsx
- esp-matter.c
- seo.js
- consumeB$1
- processStructure
- generate$2
- getVendorPrefix
- layout.jsx
- layout.jsx
- page.jsx
- page.jsx
- layout.jsx
- layout.jsx
- page.jsx
- esp-nn.c
- matchSyntax
- consumeNumber$5
- strcmp
- readSequence
- patchAtrules
- CLAUDE.md
- next.config.mjs
- postcss.config.mjs
- consumeDeclaration
- consumeRaw$4
- createParseContext
- dumpAtruleMapSyntax
- isProtoString
- getWalkersFromStructure
- isDelim
- isSelectorValid
- OverflowContentError
- RenderResult
## God Nodes (most connected - your core abstractions)
1. `AtPage` - 39 edges
2. `walk()` - 27 edges
3. `Layout` - 21 edges
4. `Page` - 18 edges
5. `Footnotes` - 18 edges
6. `Chunker` - 17 edges
7. `Counters` - 17 edges
8. `Sheet` - 16 edges
9. `createItem()` - 14 edges
10. `join()` - 14 edges
## Surprising Connections (you probably didn't know these)
- `nodeAfter()` --calls--> `nextSignificantNode()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 1 → community 10_
- `sourceFragment()` --calls--> `join()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 6 → community 4_
- `generateSequence()` --calls--> `join()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 36 → community 4_
- `peek()` --calls--> `scanString()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 7 → community 9_
- `readImplicitGroup()` --calls--> `regroupTerms()` [EXTRACTED]
public/formacoes/assets/paged.polyfill.js → public/formacoes/assets/paged.polyfill.js _Bridges community 6 → community 9_
## Import Cycles
- None detected.
## Communities (82 total, 24 thin omitted)
### Community 0 - "paged.polyfill.js"
Cohesion: 0.02
Nodes (25): consumeRaw$4(), consumeRule(), dumpAtruleMapSyntax(), dumpMapSyntax(), NOTE: The order of the mappings is NOT guaranteed., TODO: should consume block content as Raw?, TODO: fall back to mutation observer?, TODO: not sure we should support this hack (+17 more)
### Community 1 - "Layout"
Cohesion: 0.06
Nodes (27): breakInsideAvoidParentNode(), BreakToken, child(), cloneNode(), displayedElementAfter(), elementAfter(), findElement(), findRef() (+19 more)
### Community 2 - "AtPage"
Cohesion: 0.05
Nodes (8): append(), AtPage, createItem(), CSSValueToString(), PageCounterIncrement, PositionFixed, PrintMedia, ScriptsFilter
### Community 3 - "Page"
Cohesion: 0.06
Nodes (14): CodeExample(), ConnectionsDiagram(), FILTER_CATEGORIES, type_colors, Chunker, dump(), forEachToken(), Page (+6 more)
### Community 4 - ".push"
Cohesion: 0.11
Nodes (12): collectWarning(), computeSourceURL(), Counters, createNodeStructureChecker(), isAbsolute(), join(), normalize(), prepareTokens$1() (+4 more)
### Community 5 - "dependencies"
Cohesion: 0.04
Nodes (46): @emotion/react, @emotion/styled, eslint, eslint-config-next, @eslint/eslintrc, framer-motion, googleapis, lucide-react (+38 more)
### Community 6 - ".replace"
Cohesion: 0.05
Nodes (21): attr(), calc(), cleanPseudoContent(), consumeFunction(), ContentParser, customIdent(), defer(), eqStr() (+13 more)
### Community 7 - ".indexOf"
Cohesion: 0.09
Nodes (12): ArraySet$1(), calculateSpecificity(), cleanSelector(), compareByGeneratedPositionsInflated(), generatedPositionAfter(), getArg(), MappingList$1(), relative() (+4 more)
### Community 8 - "Sheet"
Cohesion: 0.13
Nodes (7): Handler, Hook, invokeForType(), Lists, Sheet, validate(), walk()
### Community 9 - "peek"
Cohesion: 0.22
Nodes (18): charCode(), customPropertyName(), idSelector(), maybeMultiplied(), maybeToken(), parse$2(), peek(), readGroup() (+10 more)
### Community 10 - "Breaks"
Cohesion: 0.09
Nodes (15): Breaks, CommentsFilter, displayedElementBefore(), elementBefore(), filterTree(), getNodeWithNamedPage(), isAllWhitespace(), isIgnorable() (+7 more)
### Community 12 - "allocateCursor"
Cohesion: 0.21
Nodes (9): allocateCursor(), appendOrAssign(), appendOrAssignOrNull(), copy(), createTypeIterator(), deepAssign(), isObject$2(), mix$1() (+1 more)
### Community 13 - "ESPDocs - Documentação ESP32 em Português"
Cohesion: 0.13
Nodes (14): 👤 Autor, Configuração do Marketplace (Opcional), 🤝 Contribuindo, 🚀 Deploy on Vercel, ⚠️ Disclaimer, ESPDocs - Documentação ESP32 em Português, 📁 Estrutura do Projeto, Executar em Desenvolvimento (+6 more)
### Community 14 - "isNameStart"
Cohesion: 0.15
Nodes (13): isDigit$5(), isHexDigit$4(), isIdentifierStart$2(), isLetter(), isLowercaseLetter(), isName$2(), isNameStart(), isNewline$1() (+5 more)
### Community 15 - "Diretrizes de tema: claro e escuro"
Cohesion: 0.17
Nodes (11): 1. Só existem os tons declarados, 2. A regra da simetria, 3. Pares canônicos por papel, 4.1. Botão nunca inverte preto ↔ branco, 4.2. Painel de destaque acompanha o tema, 4.3. Separação de superfície no tema claro, 4. Exceção: superfícies escuras nos dois temas, 5. Cor de série vem do dado, não da classe (+3 more)
### Community 16 - "internalMatch"
Cohesion: 0.20
Nodes (11): areStringsEqualCaseInsensitive(), buildLoc(), fromLoc(), internalMatch(), isCommaContextEnd(), isCommaContextStart(), isContextEdgeDelim(), locateMismatch() (+3 more)
### Community 18 - "auditar-temas.mjs"
Cohesion: 0.48
Nodes (6): arquivos(), contraste(), coresFixasInline(), ESCALA, luminancia(), main()
### Community 19 - "layout.jsx"
Cohesion: 0.33
Nodes (4): inter, metadata, outfit, viewport
### Community 20 - "buildGroupMatchGraph"
Cohesion: 0.53
Nodes (6): buildGroupMatchGraph(), buildMatchGraph$1(), buildMultiplierMatchGraph(), createCondition(), isEnumCapatible(), isFunctionType()
### Community 21 - "getCharCode"
Cohesion: 0.53
Nodes (6): consumeBadUrlRemnants$1(), consumeEscaped$1(), consumeName$1(), getCharCode(), getNewlineLength$1(), tokenize$3()
### Community 23 - "PinRestrictions.jsx"
Cohesion: 0.60
Nodes (4): derivarGrupos(), GRUPOS, PinRestrictions(), rotuloDoPino()
### Community 24 - "eslint.config.mjs"
Cohesion: 0.40
Nodes (4): compat, __dirname, eslintConfig, __filename
### Community 25 - "compilerOptions"
Cohesion: 0.40
Nodes (4): compilerOptions, paths, @/*, ./*
### Community 26 - "requireKeys"
Cohesion: 0.40
Nodes (5): assign(), requireIsImplemented$1(), requireKeys(), requireShim$4(), requireShim$5()
### Community 27 - "outOfRange"
Cohesion: 0.40
Nodes (6): dimension(), integer(), isPostfixIeHack(), number(), outOfRange(), percentage()
### Community 28 - "testNode"
Cohesion: 0.40
Nodes (4): isKeyword(), isProperty(), isType(), testNode()
### Community 29 - "page.jsx"
Cohesion: 0.67
Nodes (3): categoryIcons, Comparacao(), valorDe()
### Community 31 - "page.jsx"
Cohesion: 0.67
Nodes (3): getOptionIcon(), iconMap, Seletor()
### Community 34 - "consumeB$1"
Cohesion: 0.50
Nodes (4): checkInteger$1(), consumeB$1(), isDelim$1(), skipSC()
### Community 36 - "generate$2"
Cohesion: 0.50
Nodes (4): generate$2(), generateMultiplier(), generateSequence(), generateTypeOpts()
### Community 37 - "getVendorPrefix"
Cohesion: 0.67
Nodes (4): getKeywordDescriptor(), getPropertyDescriptor(), getVendorPrefix(), isCustomProperty$1()
### Community 49 - "matchSyntax"
Cohesion: 0.67
Nodes (3): buildMatchResult(), matchSyntax(), valueHasVar()
### Community 50 - "consumeNumber$5"
Cohesion: 0.67
Nodes (3): cmpChar$5(), consumeNumber$5(), findDecimalNumberEnd()
### Community 51 - "strcmp"
Cohesion: 0.67
Nodes (3): compareByGeneratedPositionsDeflated(), compareByOriginalPositions(), strcmp()
### Community 52 - "readSequence"
Cohesion: 0.67
Nodes (3): consumeRaw(), parentheses(), readSequence()
### Community 53 - "patchAtrules"
Cohesion: 0.67
Nodes (3): patchAtrules(), patchDictionary(), unpackSyntaxes()
### Community 70 - "consumeRaw$4"
Cohesion: 0.29
Nodes (6): requireEs6Symbol(), requireIsArguments(), requireIsFunction(), requireIsImplemented(), requireIsString(), requireShim$1()
### Community 72 - "dumpAtruleMapSyntax"
Cohesion: 0.33
Nodes (5): pastaModulo, raiz, saida, servidor, TIPOS
## Knowledge Gaps
- **78 isolated node(s):** `metadata`, `metadata`, `categoryIcons`, `metadata`, `metadata` (+73 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **24 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `AtPage` connect `AtPage` to `paged.polyfill.js`, `Page`, `.push`?**
_High betweenness centrality (0.044) - this node is a cross-community bridge._
- **Why does `Page` connect `Page` to `paged.polyfill.js`, `.replace`?**
_High betweenness centrality (0.029) - this node is a cross-community bridge._
- **Why does `Chunker` connect `Page` to `paged.polyfill.js`?**
_High betweenness centrality (0.023) - this node is a cross-community bridge._
- **What connects `metadata`, `metadata`, `categoryIcons` to the rest of the system?**
_78 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `paged.polyfill.js` be split into smaller, more focused modules?**
_Cohesion score 0.022216913521261348 - nodes in this community are weakly interconnected._
- **Should `Layout` be split into smaller, more focused modules?**
_Cohesion score 0.056535504296698326 - nodes in this community are weakly interconnected._
- **Should `AtPage` be split into smaller, more focused modules?**
_Cohesion score 0.05427905427905428 - nodes in this community are weakly interconnected._
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_design_md", "label": "DESIGN.md", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "label": "Diretrizes de tema: claro e escuro", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_1_s\u00f3_existem_os_tons_declarados", "label": "1. S\u00f3 existem os tons declarados", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L9"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_2_a_regra_da_simetria", "label": "2. A regra da simetria", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L36"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_3_pares_can\u00f4nicos_por_papel", "label": "3. Pares can\u00f4nicos por papel", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L50"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_4_exce\u00e7\u00e3o_superf\u00edcies_escuras_nos_dois_temas", "label": "4. Exce\u00e7\u00e3o: superf\u00edcies escuras nos dois temas", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L73"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_4_1_bot\u00e3o_nunca_inverte_preto_branco", "label": "4.1. Bot\u00e3o nunca inverte preto \u2194 branco", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L90"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_4_2_painel_de_destaque_acompanha_o_tema", "label": "4.2. Painel de destaque acompanha o tema", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L114"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_4_3_separa\u00e7\u00e3o_de_superf\u00edcie_no_tema_claro", "label": "4.3. Separa\u00e7\u00e3o de superf\u00edcie no tema claro", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L131"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_5_cor_de_s\u00e9rie_vem_do_dado_n\u00e3o_da_classe", "label": "5. Cor de s\u00e9rie vem do dado, n\u00e3o da classe", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L148"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_nunca_escreva_cor_fixa_em_style_inline", "label": "Nunca escreva cor fixa em `style` inline", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L161"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_design_6_auditar_antes_de_commitar", "label": "6. Auditar antes de commitar", "file_type": "document", "source_file": "DESIGN.md", "source_location": "L186"}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_design_md", "target": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "relation": "contains", "confidence": "EXTRACTED", "source_file": "DESIGN.md", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "target": "home_lucas_documents_pessoal_dev_espdocs_design_1_s\u00f3_existem_os_tons_declarados", "relation": "contains", "confidence": "EXTRACTED", "source_file": "DESIGN.md", "source_location": "L9", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "target": "home_lucas_documents_pessoal_dev_espdocs_design_2_a_regra_da_simetria", "relation": "contains", "confidence": "EXTRACTED", "source_file": "DESIGN.md", "source_location": "L36", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "target": "home_lucas_documents_pessoal_dev_espdocs_design_3_pares_can\u00f4nicos_por_papel", "relation": "contains", "confidence": "EXTRACTED", "source_file": "DESIGN.md", "source_location": "L50", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "target": "home_lucas_documents_pessoal_dev_espdocs_design_4_exce\u00e7\u00e3o_superf\u00edcies_escuras_nos_dois_temas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "DESIGN.md", "source_location": "L73", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "target": "home_lucas_documents_pessoal_dev_espdocs_design_4_1_bot\u00e3o_nunca_inverte_preto_branco", "relation": "contains", "confidence": "EXTRACTED", "source_file": "DESIGN.md", "source_location": "L90", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_de_tema_claro_e_escuro", "target": "home_lucas_documents_pessoal_dev_espdocs_design_4_2_painel_de_destaque_acompanha_o_tema", "relation": "contains", "confidence": "EXTRACTED", "source_file": "DESIGN.md", "source_location": "L114", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_design_diretrizes_deLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_claude_md", "label": "CLAUDE.md", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_claude_graphify", "label": "graphify", "file_type": "document", "source_file": "CLAUDE.md", "source_location": "L1"}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_claude_md", "target": "home_lucas_documents_pessoal_dev_espdocs_claude_graphify", "relation": "contains", "confidence": "EXTRACTED", "source_file": "CLAUDE.md", "source_location": "L1", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_c", "label": "esp-dsp.c", "file_type": "code", "source_file": "public/exemplos/esp-dsp.c", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "label": "app_main()", "file_type": "code", "source_file": "public/exemplos/esp-dsp.c", "source_location": "L6", "_callable": true}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_c", "target": "stdio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-dsp.c", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_c", "target": "esp_dsp", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-dsp.c", "source_location": "L2", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-dsp.c", "source_location": "L6", "weight": 1.0}], "raw_calls": [{"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "dsps_fft2r_init_fc32", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L13", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L15", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L19", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L21", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L23", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "dsps_mulc_f32", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L26", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "dsps_mul_f32", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L27", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "dsps_sum_f32", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L31", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "sqrtf", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L34", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_dsp_app_main", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-dsp.c", "source_location": "L36", "receiver": null}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "label": "esp-adf.c", "file_type": "code", "source_file": "public/exemplos/esp-adf.c", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "label": "app_main()", "file_type": "code", "source_file": "public/exemplos/esp-adf.c", "source_location": "L14", "_callable": true}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "esp_log", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "audio_pipeline", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L2", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "audio_element", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L3", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "audio_event_iface", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L4", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "audio_common", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L5", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "i2s_stream", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L6", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "mp3_decoder", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L7", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "fatfs_stream", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L8", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "esp_peripherals", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L9", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "periph_sdcard", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L10", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-adf.c", "source_location": "L14", "weight": 1.0}], "raw_calls": [{"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "callee": "DEFAULT_ESP_PERIPH_SET_CONFIG", "is_member_call": false, "source_file": "public/exemplos/esp-adf.c", "source_location": "L17", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "callee": "esp_periph_set_init", "is_member_call": false, "source_file": "public/exemplos/esp-adf.c", "source_location": "L18", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "callee": "periph_sdcard_init", "is_member_call": false, "source_file": "public/exemplos/esp-adf.c", "source_location": "L22", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "callee": "esp_periph_start", "is_member_call": false, "source_file": "public/exemplos/esp-adf.c", "source_location": "L23", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "callee": "periph_sdcard_wait_for_ready", "is_member_call": false, "source_file": "public/exemplos/esp-adf.c", "source_location": "L26", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "callee": "ESP_LOGI", "is_member_call": false, "source_file": "public/exemplos/esp-adf.c", "source_location": "L28", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_adf_app_main", "callee": "DEFAULT_AUDIO_PIPELINE_CONFIG", "is_member_call": false, "source_file": "Line truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "label": "esp-matter.c", "file_type": "code", "source_file": "public/exemplos/esp-matter.c", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_event_cb", "label": "app_event_cb()", "file_type": "code", "source_file": "public/exemplos/esp-matter.c", "source_location": "L9", "_callable": true}, {"id": "esp_matter_event_t", "label": "esp_matter_event_t", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/home/lucas/Documents/Pessoal/dev/ESPDocs/public/exemplos/esp-matter.c"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "label": "app_main()", "file_type": "code", "source_file": "public/exemplos/esp-matter.c", "source_location": "L27", "_callable": true}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "target": "stdio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "target": "esp_log", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L2", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "target": "esp_matter", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L3", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "target": "esp_matter_controller", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L4", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "target": "nvs_flash", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L5", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_event_cb", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L9", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_event_cb", "target": "esp_matter_event_t", "relation": "references", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L9", "weight": 1.0, "context": "parameter_type"}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-matter.c", "source_location": "L27", "weight": 1.0}], "raw_calls": [{"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_event_cb", "callee": "esp_matter_attribute_get", "is_member_call": false, "source_file": "public/exemplos/esp-matter.c", "source_location": "L16", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_event_cb", "callee": "ESP_LOGI", "is_member_call": false, "source_file": "public/exemplos/esp-matter.c", "source_location": "L18", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "callee": "nvs_flash_init", "is_member_call": false, "source_file": "public/exemplos/esp-matter.c", "source_location": "L30", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "callee": "ESP_ERROR_CHECK", "is_member_call": false, "source_file": "public/exemplos/esp-matter.c", "source_location": "L32", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "callee": "nvs_flash_erase", "is_member_call": false, "source_file": "public/exemplos/esp-matter.c", "source_location": "L32", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "callee": "ESP_ERROR_CHECK", "is_member_call": false, "source_file": "public/exemplos/esp-matter.c", "source_location": "L33", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "callee": "nvs_flash_init", "is_member_call": false, "source_file": "public/exemplos/esp-matter.c", "source_location": "L33", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_matter_app_main", "callee": "create", "is_member_call": faLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_c", "label": "esp-nn.c", "file_type": "code", "source_file": "public/exemplos/esp-nn.c", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_print_array", "label": "print_array()", "file_type": "code", "source_file": "public/exemplos/esp-nn.c", "source_location": "L8", "_callable": true}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_app_main", "label": "app_main()", "file_type": "code", "source_file": "public/exemplos/esp-nn.c", "source_location": "L16", "_callable": true}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_c", "target": "stdio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-nn.c", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_c", "target": "esp_nn", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-nn.c", "source_location": "L2", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_c", "target": "esp_nn_defs", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-nn.c", "source_location": "L3", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_print_array", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-nn.c", "source_location": "L8", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_app_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-nn.c", "source_location": "L16", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_app_main", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_print_array", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-nn.c", "source_location": "L38", "weight": 1.0}], "raw_calls": [{"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_print_array", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-nn.c", "source_location": "L9", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_print_array", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-nn.c", "source_location": "L11", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_print_array", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-nn.c", "source_location": "L13", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_app_main", "callee": "esp_nn_mul_mat_16x8_16", "is_member_call": false, "source_file": "public/exemplos/esp-nn.c", "source_location": "L35", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_nn_app_main", "callee": "esp_nn_relu_16", "is_member_call": false, "source_file": "public/exemplos/esp-nn.c", "source_location": "L41", "receiver": null}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_json", "label": "jsconfig.json", "file_type": "code", "source_file": "jsconfig.json", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_compileroptions", "label": "compilerOptions", "file_type": "code", "source_file": "jsconfig.json", "source_location": "L2"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_compileroptions_paths", "label": "paths", "file_type": "code", "source_file": "jsconfig.json", "source_location": "L3"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_paths", "label": "@/*", "file_type": "code", "source_file": "jsconfig.json", "source_location": "L4"}, {"id": "ref", "label": "./*", "file_type": "concept", "source_file": "jsconfig.json", "source_location": "L4"}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_json", "target": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_compileroptions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "jsconfig.json", "source_location": "L2", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_compileroptions", "target": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_compileroptions_paths", "relation": "contains", "confidence": "EXTRACTED", "source_file": "jsconfig.json", "source_location": "L3", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_compileroptions_paths", "target": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_paths", "relation": "contains", "confidence": "EXTRACTED", "source_file": "jsconfig.json", "source_location": "L4", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_jsconfig_paths", "target": "ref", "relation": "extends", "confidence": "EXTRACTED", "source_file": "jsconfig.json", "source_location": "L4", "weight": 1.0, "context": "import"}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_c", "label": "esp-idf.c", "file_type": "code", "source_file": "public/exemplos/esp-idf.c", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "label": "app_main()", "file_type": "code", "source_file": "public/exemplos/esp-idf.c", "source_location": "L8", "_callable": true}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_c", "target": "stdio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-idf.c", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_c", "target": "freertos", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-idf.c", "source_location": "L2", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_c", "target": "task", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-idf.c", "source_location": "L3", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_c", "target": "gpio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-idf.c", "source_location": "L4", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-idf.c", "source_location": "L8", "weight": 1.0}], "raw_calls": [{"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "gpio_reset_pin", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L11", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "gpio_set_direction", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L12", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "gpio_set_level", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L16", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L17", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "vTaskDelay", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L18", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "pdMS_TO_TICKS", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L18", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "gpio_set_level", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L21", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "printf", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L22", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "vTaskDelay", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L23", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_idf_app_main", "callee": "pdMS_TO_TICKS", "is_member_call": false, "source_file": "public/exemplos/esp-idf.c", "source_location": "L23", "receiver": null}]}
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_micropython_py", "label": "micropython.py", "file_type": "code", "source_file": "public/exemplos/micropython.py", "source_location": "L1"}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_micropython_py", "target": "machine", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/micropython.py", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_micropython_py", "target": "time", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/micropython.py", "source_location": "L2", "weight": 1.0}], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_package_json", "label": "package.json", "file_type": "code", "source_file": "package.json", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_name", "label": "name", "file_type": "code", "source_file": "package.json", "source_location": "L2"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_version", "label": "version", "file_type": "code", "source_file": "package.json", "source_location": "L3"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_private", "label": "private", "file_type": "code", "source_file": "package.json", "source_location": "L4"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts", "label": "scripts", "file_type": "code", "source_file": "package.json", "source_location": "L5"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_dev", "label": "dev", "file_type": "code", "source_file": "package.json", "source_location": "L6"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_build", "label": "build", "file_type": "code", "source_file": "package.json", "source_location": "L7"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_start", "label": "start", "file_type": "code", "source_file": "package.json", "source_location": "L8"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_lint", "label": "lint", "file_type": "code", "source_file": "package.json", "source_location": "L9"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_auditar_temas", "label": "auditar-temas", "file_type": "code", "source_file": "package.json", "source_location": "L10"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_slides_pdf", "label": "slides-pdf", "file_type": "code", "source_file": "package.json", "source_location": "L11"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies", "label": "dependencies", "file_type": "code", "source_file": "package.json", "source_location": "L13"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_emotion_react", "label": "@emotion/react", "file_type": "code", "source_file": "package.json", "source_location": "L14"}, {"id": "emotion_react", "label": "@emotion/react", "file_type": "concept", "source_file": "package.json", "source_location": "L14"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_emotion_styled", "label": "@emotion/styled", "file_type": "code", "source_file": "package.json", "source_location": "L15"}, {"id": "emotion_styled", "label": "@emotion/styled", "file_type": "concept", "source_file": "package.json", "source_location": "L15"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_mui_icons_material", "label": "@mui/icons-material", "file_type": "code", "source_file": "package.json", "source_location": "L16"}, {"id": "mui_icons_material", "label": "@mui/icons-material", "file_type": "concept", "source_file": "package.json", "source_location": "L16"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_mui_material", "label": "@mui/material", "file_type": "code", "source_file": "package.json", "source_location": "L17"}, {"id": "mui_material", "label": "@mui/material", "file_type": "concept", "source_file": "package.json", "source_location": "L17"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_framer_motion", "label": "framer-motion", "file_type": "code", "source_file": "package.json", "source_location": "L18"}, {"id": "framer_motion", "label": "framer-motion", "file_type": "concept", "source_file": "package.json", "source_location": "L18"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_googleapis", "label": "googleapis", "file_type": "code", "source_file": "package.json", "source_location": "L19"}, {"id": "googleapis", "label": "googleapis", "file_type": "concept", "source_file": "package.json", "source_location": "L19"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_lucide_react", "label": "lucide-react", "file_type": "code", "source_file": "package.json", "source_location": "L20"}, {"id": "lucide_react", "label": "lucide-react", "file_type": "concept", "source_file": "package.json", "source_location": "L20"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_next", "label": "next", "file_type": "code", "source_file": "package.json", "source_location": "L21"}, {"id": "next", "label": "next", "file_type": "concept", "source_file": "package.json", "source_location": "L21"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_next_themes", "label": "next-themes", "file_type": "code", "source_file": "package.json", "source_location": "L22"}, {"id": "next_themes", "label": "next-themes", "file_type": "concept", "source_file": "package.json", "source_location": "L22"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_react", "lLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "label": "esp-who.c", "file_type": "code", "source_file": "public/exemplos/esp-who.c", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "label": "setup()", "file_type": "code", "source_file": "public/exemplos/esp-who.c", "source_location": "L11", "_callable": true}, {"id": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_loop", "label": "loop()", "file_type": "code", "source_file": "public/exemplos/esp-who.c", "source_location": "L48", "_callable": true}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "esp_camera", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "fd_forward", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L2", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "fr_forward", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L3", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "human_face_detect_msr01", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L4", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "human_face_detect_mnp01", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L5", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "camera_pins", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L9", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L11", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_c", "target": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_loop", "relation": "contains", "confidence": "EXTRACTED", "source_file": "public/exemplos/esp-who.c", "source_location": "L48", "weight": 1.0}], "raw_calls": [{"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "callee": "begin", "is_member_call": true, "source_file": "public/exemplos/esp-who.c", "source_location": "L12", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "callee": "setDebugOutput", "is_member_call": true, "source_file": "public/exemplos/esp-who.c", "source_location": "L13", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "callee": "println", "is_member_call": true, "source_file": "public/exemplos/esp-who.c", "source_location": "L14", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "callee": "esp_camera_init", "is_member_call": false, "source_file": "public/exemplos/esp-who.c", "source_location": "L40", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "callee": "println", "is_member_call": true, "source_file": "public/exemplos/esp-who.c", "source_location": "L41", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_setup", "callee": "println", "is_member_call": true, "source_file": "public/exemplos/esp-who.c", "source_location": "L45", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_loop", "callee": "esp_camera_fb_get", "is_member_call": false, "source_file": "public/exemplos/esp-who.c", "source_location": "L49", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_loop", "callee": "println", "is_member_call": true, "source_file": "public/exemplos/esp-who.c", "source_location": "L51", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_loop", "callee": "face_detect_msr01", "is_member_call": false, "source_file": "public/exemplos/esp-who.c", "source_location": "L56", "receiver": null}, {"caller_nid": "home_lucas_documents_pessoal_dev_espdocs_public_exemplos_esp_who_loop", "callee": "printf", "is_meLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_package_json", "label": "package.json", "file_type": "code", "source_file": "package.json", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_name", "label": "name", "file_type": "code", "source_file": "package.json", "source_location": "L2"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_version", "label": "version", "file_type": "code", "source_file": "package.json", "source_location": "L3"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_private", "label": "private", "file_type": "code", "source_file": "package.json", "source_location": "L4"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts", "label": "scripts", "file_type": "code", "source_file": "package.json", "source_location": "L5"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_dev", "label": "dev", "file_type": "code", "source_file": "package.json", "source_location": "L6"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_build", "label": "build", "file_type": "code", "source_file": "package.json", "source_location": "L7"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_start", "label": "start", "file_type": "code", "source_file": "package.json", "source_location": "L8"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_lint", "label": "lint", "file_type": "code", "source_file": "package.json", "source_location": "L9"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_scripts_auditar_temas", "label": "auditar-temas", "file_type": "code", "source_file": "package.json", "source_location": "L10"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies", "label": "dependencies", "file_type": "code", "source_file": "package.json", "source_location": "L12"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_emotion_react", "label": "@emotion/react", "file_type": "code", "source_file": "package.json", "source_location": "L13"}, {"id": "emotion_react", "label": "@emotion/react", "file_type": "concept", "source_file": "package.json", "source_location": "L13"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_emotion_styled", "label": "@emotion/styled", "file_type": "code", "source_file": "package.json", "source_location": "L14"}, {"id": "emotion_styled", "label": "@emotion/styled", "file_type": "concept", "source_file": "package.json", "source_location": "L14"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_mui_icons_material", "label": "@mui/icons-material", "file_type": "code", "source_file": "package.json", "source_location": "L15"}, {"id": "mui_icons_material", "label": "@mui/icons-material", "file_type": "concept", "source_file": "package.json", "source_location": "L15"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_mui_material", "label": "@mui/material", "file_type": "code", "source_file": "package.json", "source_location": "L16"}, {"id": "mui_material", "label": "@mui/material", "file_type": "concept", "source_file": "package.json", "source_location": "L16"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_framer_motion", "label": "framer-motion", "file_type": "code", "source_file": "package.json", "source_location": "L17"}, {"id": "framer_motion", "label": "framer-motion", "file_type": "concept", "source_file": "package.json", "source_location": "L17"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_googleapis", "label": "googleapis", "file_type": "code", "source_file": "package.json", "source_location": "L18"}, {"id": "googleapis", "label": "googleapis", "file_type": "concept", "source_file": "package.json", "source_location": "L18"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_lucide_react", "label": "lucide-react", "file_type": "code", "source_file": "package.json", "source_location": "L19"}, {"id": "lucide_react", "label": "lucide-react", "file_type": "concept", "source_file": "package.json", "source_location": "L19"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_next", "label": "next", "file_type": "code", "source_file": "package.json", "source_location": "L20"}, {"id": "next", "label": "next", "file_type": "concept", "source_file": "package.json", "source_location": "L20"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_next_themes", "label": "next-themes", "file_type": "code", "source_file": "package.json", "source_location": "L21"}, {"id": "next_themes", "label": "next-themes", "file_type": "concept", "source_file": "package.json", "source_location": "L21"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_package_dependencies_react", "label": "react", "file_type": "code", "source_file": "package.json", "source_location": "L22"}, {"id": "react", "label": "react", "file_type": "concept", "source_file": "package.jsoLine truncated
@@ -0,0 +1 @@
{"nodes": [{"id": "home_lucas_documents_pessoal_dev_espdocs_readme_md", "label": "README.md", "file_type": "document", "source_file": "README.md", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_espdocs_documenta\u00e7\u00e3o_esp32_em_portugu\u00eas", "label": "ESPDocs - Documenta\u00e7\u00e3o ESP32 em Portugu\u00eas", "file_type": "document", "source_file": "README.md", "source_location": "L1"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_funcionalidades", "label": "\ud83d\ude80 Funcionalidades", "file_type": "document", "source_file": "README.md", "source_location": "L9"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_in\u00edcio_r\u00e1pido", "label": "\ud83c\udfc1 In\u00edcio R\u00e1pido", "file_type": "document", "source_file": "README.md", "source_location": "L18"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_instala\u00e7\u00e3o", "label": "Instala\u00e7\u00e3o", "file_type": "document", "source_file": "README.md", "source_location": "L20"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_configura\u00e7\u00e3o_do_marketplace_opcional", "label": "Configura\u00e7\u00e3o do Marketplace (Opcional)", "file_type": "document", "source_file": "README.md", "source_location": "L33"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_executar_em_desenvolvimento", "label": "Executar em Desenvolvimento", "file_type": "document", "source_file": "README.md", "source_location": "L43"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_estrutura_do_projeto", "label": "\ud83d\udcc1 Estrutura do Projeto", "file_type": "document", "source_file": "README.md", "source_location": "L55"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_tecnologias", "label": "\ud83d\udee0\ufe0f Tecnologias", "file_type": "document", "source_file": "README.md", "source_location": "L87"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_learn_more", "label": "\ud83d\udcda Learn More", "file_type": "document", "source_file": "README.md", "source_location": "L95"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_deploy_on_vercel", "label": "\ud83d\ude80 Deploy on Vercel", "file_type": "document", "source_file": "README.md", "source_location": "L104"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_licen\u00e7a", "label": "\ud83d\udcc4 Licen\u00e7a", "file_type": "document", "source_file": "README.md", "source_location": "L112"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_disclaimer", "label": "\u26a0\ufe0f Disclaimer", "file_type": "document", "source_file": "README.md", "source_location": "L116"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_autor", "label": "\ud83d\udc64 Autor", "file_type": "document", "source_file": "README.md", "source_location": "L120"}, {"id": "home_lucas_documents_pessoal_dev_espdocs_readme_contribuindo", "label": "\ud83e\udd1d Contribuindo", "file_type": "document", "source_file": "README.md", "source_location": "L126"}], "edges": [{"source": "home_lucas_documents_pessoal_dev_espdocs_readme_md", "target": "home_lucas_documents_pessoal_dev_espdocs_readme_espdocs_documenta\u00e7\u00e3o_esp32_em_portugu\u00eas", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L1", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_readme_espdocs_documenta\u00e7\u00e3o_esp32_em_portugu\u00eas", "target": "home_lucas_documents_pessoal_dev_espdocs_readme_funcionalidades", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L9", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_readme_espdocs_documenta\u00e7\u00e3o_esp32_em_portugu\u00eas", "target": "home_lucas_documents_pessoal_dev_espdocs_readme_in\u00edcio_r\u00e1pido", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L18", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_readme_in\u00edcio_r\u00e1pido", "target": "home_lucas_documents_pessoal_dev_espdocs_readme_instala\u00e7\u00e3o", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L20", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_readme_in\u00edcio_r\u00e1pido", "target": "home_lucas_documents_pessoal_dev_espdocs_readme_configura\u00e7\u00e3o_do_marketplace_opcional", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L33", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_readme_in\u00edcio_r\u00e1pido", "target": "home_lucas_documents_pessoal_dev_espdocs_readme_executar_em_desenvolvimento", "relation": "contains", "confidence": "EXTRACTED", "source_file": "README.md", "source_location": "L43", "weight": 1.0}, {"source": "home_lucas_documents_pessoal_dev_espdocs_readme_espdocs_documenta\u00e7\u00e3o_esp32_em_portugu\u00eas", "target": "home_lucas_documLine truncated
+1
View File
@@ -0,0 +1 @@
{"/home/lucas/Documents/Pessoal/dev/ESPDocs/CLAUDE.md":{"size":850,"mtime_ns":1787208875108687809,"word_count":118,"hash":"258e0dfcf55c0af2ab0875e4e88107b4a6750e03f282df21493a8e1c1ecea26e"},"/home/lucas/Documents/Pessoal/dev/ESPDocs/DESIGN.md":{"size":7458,"mtime_ns":1787227815960759566,"word_count":1139,"hash":"2408e701d9cd2a32eabfc9fab5a78c59639962ececd8a101f505782130bab20e"},"/home/lucas/Documents/Pessoal/dev/ESPDocs/README.md":{"size":4471,"mtime_ns":1787208875108687809,"word_count":510,"hash":"f024a922261e513412d492a32ff2e4aa2825835c9493bb9a050162297eb55a46"},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/api/placas/route.js":{"size":1675,"mtime_ns":1787208875109445427,"word_count":178},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/catalogo/layout.jsx":{"size":667,"mtime_ns":1787492776095609424,"word_count":99},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/catalogo/page.jsx":{"size":15277,"mtime_ns":1787212450028229413,"word_count":1247},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/comparacao/layout.jsx":{"size":749,"mtime_ns":1787492776089608886,"word_count":111},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/comparacao/page.jsx":{"size":17360,"mtime_ns":1787227734667847134,"word_count":1575},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/frameworks/[key]/page.jsx":{"size":12293,"mtime_ns":1787492933930084366,"word_count":986},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/frameworks/page.jsx":{"size":12949,"mtime_ns":1787493006331380408,"word_count":987},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/glossario/page.jsx":{"size":30172,"mtime_ns":1787493006335479271,"word_count":2541},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/icon.svg":{"size":1053,"mtime_ns":1787493648516088553,"word_count":101},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/layout.jsx":{"size":3230,"mtime_ns":1787499080336201729,"word_count":363},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/opengraph-image.png":{"size":189553,"mtime_ns":1787493677718850382,"word_count":6394},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/page.jsx":{"size":11570,"mtime_ns":1787212450023113942,"word_count":996},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/robots.js":{"size":467,"mtime_ns":1787492747521046621,"word_count":73},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/seletor/layout.jsx":{"size":758,"mtime_ns":1787492776092609155,"word_count":113},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/seletor/page.jsx":{"size":47737,"mtime_ns":1787227734668591914,"word_count":4307},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/series/[key]/page.jsx":{"size":30140,"mtime_ns":1787493839445832724,"word_count":2848},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/series/layout.jsx":{"size":1044,"mtime_ns":1787493098902938213,"word_count":169},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/series/page.jsx":{"size":11972,"mtime_ns":1787227734666431087,"word_count":919},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/sitemap.js":{"size":1548,"mtime_ns":1787492747517046262,"word_count":190},"/home/lucas/Documents/Pessoal/dev/ESPDocs/app/sobre/page.jsx":{"size":15635,"mtime_ns":1787493098903634352,"word_count":1391},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/BoardCard.jsx":{"size":3950,"mtime_ns":1787212419847948763,"word_count":340},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/CodeExample.jsx":{"size":6954,"mtime_ns":1787227734670658950,"word_count":662},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/ConnectionsDiagram.jsx":{"size":30118,"mtime_ns":1787212419845745061,"word_count":2538},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/Footer.jsx":{"size":7129,"mtime_ns":1787212419854720006,"word_count":600},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/Header.jsx":{"size":8885,"mtime_ns":1787493839491139968,"word_count":814},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/PinRestrictions.jsx":{"size":6702,"mtime_ns":1787227759653857376,"word_count":781},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/Providers.jsx":{"size":236,"mtime_ns":1787208875111169207,"word_count":25},"/home/lucas/Documents/Pessoal/dev/ESPDocs/components/SeriesTabMenu.jsx":{"size":4327,"mtime_ns":1787227734671215574,"word_count":408},"/home/lucas/Documents/Pessoal/dev/ESPDocs/eslint.config.mjs":{"size":505,"mtime_ns":1787208875111687936,"word_count":53},"/home/lucas/Documents/Pessoal/dev/ESPDocs/jsconfig.json":{"size":73,"mtime_ns":1787208875115688105,"word_count":10,"hash":"7bb1966576768c2921b8b0f30ee3c68796385e8b463095701d1d16f685fdac8f"},"/home/lucas/Documents/Pessoal/dev/ESPDocs/lib/seo.js":{"size":4474,"mtime_ns":1787492722950842956,"word_count":460},"/home/lucas/Documents/Pessoal/dev/ESPDocs/next.config.mjs":{"size":92,"mtime_ns":1787208875115688105,"word_count":11},"/home/lucas/Documents/Pessoal/dev/ESPDocs/package.json":{"size":868,"mtime_ns":1787577906317962132,"word_count":70,"hash":"94eab1d9ed9cf56eface235930b3e24a489c3f2c13fcb9fef288ca62bfcbf17d"},"/home/lucas/Documents/Pessoal/dev/ESPDocs/postcss.config.mjs":{"size"Line truncated
+320
View File
@@ -0,0 +1,320 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>graphify - graphify-out/graph.html</title>
<script src="https://unpkg.com/vis-network@9.1.6/standalone/umd/vis-network.min.js"
integrity="sha384-Ux6phic9PEHJ38YtrijhkzyJ8yQlH8i/+buBR8s3mAZOJrP1gwyvAcIYl3GWtpX1"
crossorigin="anonymous"></script>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { background: #0f0f1a; color: #e0e0e0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; display: flex; height: 100vh; overflow: hidden; }
#graph { flex: 1; }
#sidebar { width: 280px; background: #1a1a2e; border-left: 1px solid #2a2a4e; display: flex; flex-direction: column; overflow: hidden; }
#search-wrap { padding: 12px; border-bottom: 1px solid #2a2a4e; }
#search { width: 100%; background: #0f0f1a; border: 1px solid #3a3a5e; color: #e0e0e0; padding: 7px 10px; border-radius: 6px; font-size: 13px; outline: none; }
#search:focus { border-color: #4E79A7; }
#search-results { max-height: 140px; overflow-y: auto; padding: 4px 12px; border-bottom: 1px solid #2a2a4e; display: none; }
.search-item { padding: 4px 6px; cursor: pointer; border-radius: 4px; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.search-item:hover { background: #2a2a4e; }
#info-panel { padding: 14px; border-bottom: 1px solid #2a2a4e; min-height: 140px; }
#info-panel h3 { font-size: 13px; color: #aaa; margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.05em; }
#info-content { font-size: 13px; color: #ccc; line-height: 1.6; }
#info-content .field { margin-bottom: 5px; }
#info-content .field b { color: #e0e0e0; }
#info-content .empty { color: #555; font-style: italic; }
.neighbor-link { display: block; padding: 2px 6px; margin: 2px 0; border-radius: 3px; cursor: pointer; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid #333; }
.neighbor-link:hover { background: #2a2a4e; }
#neighbors-list { max-height: 160px; overflow-y: auto; margin-top: 4px; }
#legend-wrap { flex: 1; overflow-y: auto; padding: 12px; }
#legend-wrap h3 { font-size: 13px; color: #aaa; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 0.05em; }
.legend-item { display: flex; align-items: center; gap: 8px; padding: 4px 0; cursor: pointer; border-radius: 4px; font-size: 12px; }
.legend-item:hover { background: #2a2a4e; padding-left: 4px; }
.legend-item.dimmed { opacity: 0.35; }
.legend-dot { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; }
.legend-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.legend-count { color: #666; font-size: 11px; }
#stats { padding: 10px 14px; border-top: 1px solid #2a2a4e; font-size: 11px; color: #555; }
#legend-controls { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; padding: 4px 0; }
#legend-controls label { display: flex; align-items: center; gap: 6px; cursor: pointer; font-size: 12px; color: #aaa; user-select: none; }
#legend-controls label:hover { color: #e0e0e0; }
.legend-cb, #select-all-cb { appearance: none; -webkit-appearance: none; width: 14px; height: 14px; border: 1.5px solid #3a3a5e; border-radius: 3px; background: #0f0f1a; cursor: pointer; position: relative; flex-shrink: 0; }
.legend-cb:checked, #select-all-cb:checked { background: #4E79A7; border-color: #4E79A7; }
.legend-cb:checked::after, #select-all-cb:checked::after { content: ''; position: absolute; left: 3.5px; top: 1px; width: 4px; height: 7px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg); }
#select-all-cb:indeterminate { background: #4E79A7; border-color: #4E79A7; }
#select-all-cb:indeterminate::after { content: ''; position: absolute; left: 2px; top: 5px; width: 8px; height: 2px; background: #fff; border: none; transform: none; }
</style>
</head>
<body>
<div id="graph"></div>
<div id="sidebar">
<div id="search-wrap">
<input id="search" type="text" placeholder="Search nodes..." autocomplete="off">
<div id="search-results"></div>
</div>
<div id="info-panel">
<h3>Node Info</h3>
<div id="info-content"><span class="empty">Click a node to inspect it</span></div>
</div>
<div id="legend-wrap">
<h3>Communities</h3>
<div id="legend-controls">
<label><input type="checkbox" id="select-all-cb" checked onchange="toggleAllCommunities(!this.checked)">Select All</label>
</div>
<div id="legend"></div>
</div>
<div id="stats">833 nodes &middot; 1499 edges &middot; 82 communities</div>
</div>
<script>
const RAW_NODES = [{"id": "app_api_placas_route", "label": "route.js", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "route.js", "community": 54, "community_name": "route.js", "source_file": "app/api/placas/route.js", "file_type": "code", "degree": 1}, {"id": "app_api_placas_route_get", "label": "GET()", "color": {"background": "#59A14F", "border": "#59A14F", "highlight": {"background": "#ffffff", "border": "#59A14F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "GET()", "community": 54, "community_name": "route.js", "source_file": "app/api/placas/route.js", "file_type": "code", "degree": 1}, {"id": "app_catalogo_layout", "label": "layout.jsx", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "layout.jsx", "community": 38, "community_name": "layout.jsx", "source_file": "app/catalogo/layout.jsx", "file_type": "code", "degree": 2}, {"id": "app_catalogo_layout_metadata", "label": "metadata", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "metadata", "community": 38, "community_name": "layout.jsx", "source_file": "app/catalogo/layout.jsx", "file_type": "code", "degree": 1}, {"id": "app_catalogo_layout_layout", "label": "Layout()", "color": {"background": "#9C755F", "border": "#9C755F", "highlight": {"background": "#ffffff", "border": "#9C755F"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "Layout()", "community": 38, "community_name": "layout.jsx", "source_file": "app/catalogo/layout.jsx", "file_type": "code", "degree": 1}, {"id": "app_catalogo_page", "label": "page.jsx", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "page.jsx", "community": 55, "community_name": "page.jsx", "source_file": "app/catalogo/page.jsx", "file_type": "code", "degree": 1}, {"id": "app_catalogo_page_placaspage", "label": "PlacasPage()", "color": {"background": "#EDC948", "border": "#EDC948", "highlight": {"background": "#ffffff", "border": "#EDC948"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "PlacasPage()", "community": 55, "community_name": "page.jsx", "source_file": "app/catalogo/page.jsx", "file_type": "code", "degree": 1}, {"id": "app_comparacao_layout", "label": "layout.jsx", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "layout.jsx", "community": 39, "community_name": "layout.jsx", "source_file": "app/comparacao/layout.jsx", "file_type": "code", "degree": 2}, {"id": "app_comparacao_layout_metadata", "label": "metadata", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "metadata", "community": 39, "community_name": "layout.jsx", "source_file": "app/comparacao/layout.jsx", "file_type": "code", "degree": 1}, {"id": "app_comparacao_layout_layout", "label": "Layout()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "Layout()", "community": 39, "community_name": "layout.jsx", "source_file": "app/comparacao/layout.jsx", "file_type": "code", "degree": 1}, {"id": "app_comparacao_page", "label": "page.jsx", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.3, "font": {"size": 0, "color": "#ffffff"}, "title": "page.jsx", "community": 29, "community_name": "page.jsx", "source_file": "app/comparacao/page.jsx", "file_type": "code", "degree": 3}, {"id": "app_comparacao_page_categoryicons", "label": "categoryIcons", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.1, "font": {"size": 0, "color": "#ffffff"}, "title": "categoryIcons", "community": 29, "community_name": "page.jsx", "source_file": "app/comparacao/page.jsx", "file_type": "code", "degree": 1}, {"id": "app_comparacao_page_valorde", "label": "valorDe()", "color": {"background": "#BAB0AC", "border": "#BAB0AC", "highlight": {"background": "#ffffff", "border": "#BAB0AC"}}, "size": 10.2, "font": {"size": 0, "color": "#ffffff"}, "title": "valorDe()", "community": 29, "community_name": "page.jsx", "source_file": "app/comparacao/page.jsx", "file_type": "code", "degree": 2}, {"id": "app_comparacao_page_comparacao", "label": "Comparacao()", "color":Line truncated
const RAW_EDGES = [{"from": "app_api_placas_route", "to": "app_api_placas_route_get", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_catalogo_layout", "to": "app_catalogo_layout_layout", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_catalogo_layout", "to": "app_catalogo_layout_metadata", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_catalogo_page", "to": "app_catalogo_page_placaspage", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_comparacao_layout", "to": "app_comparacao_layout_layout", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_comparacao_layout", "to": "app_comparacao_layout_metadata", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_comparacao_page", "to": "app_comparacao_page_categoryicons", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_comparacao_page", "to": "app_comparacao_page_comparacao", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_comparacao_page", "to": "app_comparacao_page_valorde", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_comparacao_page_comparacao", "to": "app_comparacao_page_valorde", "label": "calls", "title": "calls [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_frameworks_key_page", "to": "app_frameworks_key_page_frameworkdetail", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_frameworks_key_page", "to": "app_frameworks_key_page_generatemetadata", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_frameworks_key_page", "to": "app_frameworks_key_page_generatestaticparams", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_frameworks_page", "to": "app_frameworks_page_frameworks", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_frameworks_page", "to": "app_frameworks_page_metadata", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_glossario_page", "to": "app_glossario_page_glossario", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_glossario_page", "to": "app_glossario_page_metadata", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_layout", "to": "app_layout_inter", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_layout", "to": "app_layout_metadata", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_layout", "to": "app_layout_outfit", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_layout", "to": "app_layout_rootlayout", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_layout", "to": "app_layout_viewport", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_page", "to": "app_page_externallinkicon", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_page", "to": "app_page_home", "label": "contains", "title": "contains [EXTRACTED]", "dashes": false, "width": 2, "color": {"opacity": 0.7}, "confidence": "EXTRACTED"}, {"from": "app_robots", "to": "app_robots_robots", "label": "coLine truncated
const LEGEND = [{"cid": 0, "color": "#4E79A7", "label": "paged.polyfill.js", "count": 92}, {"cid": 1, "color": "#F28E2B", "label": "Layout", "count": 67}, {"cid": 2, "color": "#E15759", "label": "AtPage", "count": 78}, {"cid": 3, "color": "#76B7B2", "label": "Page", "count": 60}, {"cid": 4, "color": "#59A14F", "label": ".push", "count": 33}, {"cid": 5, "color": "#EDC948", "label": "dependencies", "count": 47}, {"cid": 6, "color": "#B07AA1", "label": ".replace", "count": 52}, {"cid": 7, "color": "#FF9DA7", "label": ".indexOf", "count": 34}, {"cid": 8, "color": "#9C755F", "label": "Sheet", "count": 31}, {"cid": 9, "color": "#BAB0AC", "label": "peek", "count": 18}, {"cid": 10, "color": "#4E79A7", "label": "Breaks", "count": 28}, {"cid": 11, "color": "#F28E2B", "label": "Queue", "count": 10}, {"cid": 12, "color": "#E15759", "label": "allocateCursor", "count": 15}, {"cid": 13, "color": "#76B7B2", "label": "ESPDocs - Documenta\u00e7\u00e3o ESP32 em Portugu\u00eas", "count": 15}, {"cid": 14, "color": "#59A14F", "label": "isNameStart", "count": 13}, {"cid": 15, "color": "#EDC948", "label": "Diretrizes de tema: claro e escuro", "count": 12}, {"cid": 16, "color": "#B07AA1", "label": "internalMatch", "count": 12}, {"cid": 17, "color": "#FF9DA7", "label": "Previewer", "count": 11}, {"cid": 18, "color": "#9C755F", "label": "auditar-temas.mjs", "count": 7}, {"cid": 19, "color": "#BAB0AC", "label": "layout.jsx", "count": 6}, {"cid": 20, "color": "#4E79A7", "label": "buildGroupMatchGraph", "count": 6}, {"cid": 21, "color": "#F28E2B", "label": "getCharCode", "count": 6}, {"cid": 22, "color": "#E15759", "label": "page.jsx", "count": 5}, {"cid": 23, "color": "#76B7B2", "label": "PinRestrictions.jsx", "count": 5}, {"cid": 24, "color": "#59A14F", "label": "eslint.config.mjs", "count": 5}, {"cid": 25, "color": "#EDC948", "label": "compilerOptions", "count": 5}, {"cid": 26, "color": "#B07AA1", "label": "requireKeys", "count": 5}, {"cid": 27, "color": "#FF9DA7", "label": "outOfRange", "count": 6}, {"cid": 28, "color": "#9C755F", "label": "testNode", "count": 5}, {"cid": 29, "color": "#BAB0AC", "label": "page.jsx", "count": 4}, {"cid": 30, "color": "#4E79A7", "label": "page.jsx", "count": 4}, {"cid": 31, "color": "#F28E2B", "label": "page.jsx", "count": 4}, {"cid": 32, "color": "#E15759", "label": "esp-matter.c", "count": 4}, {"cid": 33, "color": "#76B7B2", "label": "seo.js", "count": 4}, {"cid": 34, "color": "#59A14F", "label": "consumeB$1", "count": 4}, {"cid": 35, "color": "#EDC948", "label": "processStructure", "count": 2}, {"cid": 36, "color": "#B07AA1", "label": "generate$2", "count": 4}, {"cid": 37, "color": "#FF9DA7", "label": "getVendorPrefix", "count": 4}, {"cid": 38, "color": "#9C755F", "label": "layout.jsx", "count": 3}, {"cid": 39, "color": "#BAB0AC", "label": "layout.jsx", "count": 3}, {"cid": 40, "color": "#4E79A7", "label": "page.jsx", "count": 3}, {"cid": 41, "color": "#F28E2B", "label": "page.jsx", "count": 3}, {"cid": 42, "color": "#E15759", "label": "page.jsx", "count": 3}, {"cid": 43, "color": "#76B7B2", "label": "layout.jsx", "count": 3}, {"cid": 44, "color": "#59A14F", "label": "layout.jsx", "count": 3}, {"cid": 45, "color": "#EDC948", "label": "page.jsx", "count": 3}, {"cid": 46, "color": "#B07AA1", "label": "Header.jsx", "count": 3}, {"cid": 47, "color": "#FF9DA7", "label": "esp-nn.c", "count": 3}, {"cid": 48, "color": "#9C755F", "label": "esp-who.c", "count": 3}, {"cid": 49, "color": "#BAB0AC", "label": "matchSyntax", "count": 3}, {"cid": 50, "color": "#4E79A7", "label": "consumeNumber$5", "count": 3}, {"cid": 51, "color": "#F28E2B", "label": "strcmp", "count": 3}, {"cid": 52, "color": "#E15759", "label": "readSequence", "count": 3}, {"cid": 53, "color": "#76B7B2", "label": "patchAtrules", "count": 3}, {"cid": 54, "color": "#59A14F", "label": "route.js", "count": 2}, {"cid": 55, "color": "#EDC948", "label": "page.jsx", "count": 2}, {"cid": 56, "color": "#B07AA1", "label": "robots.js", "count": 2}, {"cid": 57, "color": "#FF9DA7", "label": "page.jsx", "count": 2}, {"cid": 58, "color": "#9C755F", "label": "sitemap.js", "count": 2}, {"cid": 59, "color": "#BAB0AC", "label": "CLAUDE.md", "count": 2}, {"cid": 60, "color": "#4E79A7", "label": "BoardCard.jsx", "count": 2}, {"cid": 61, "color": "#F28E2B", "label": "Footer.jsx", "count": 2}, {"cid": 62, "color": "#E15759", "label": "Providers.jsx", "count": 2}, {"cid": 63, "color": "#76B7B2", "label": "SeriesTabMenu.jsx", "count": 2}, {"cid": 64, "color": "#59A14F", "label": "next.config.mjs", "count": 2}, {"cid": 65, "color": "#EDC948", "label": "postcss.config.mjs", "count": 2}, {"cid": 66, "color": "#B07AA1", "label": "esp-adf.c", "count": 2}, {"cid": 67, "color": "#FF9DA7", "label": "esp-dsp.c", "count": 2}, {"cid": 68, "color": "#9C755F", "label": "esp-idf.c", "count": 2}, {"cid": 69, "color": "#BAB0AC", "label": "consumeDeclaration", "count": 2}, {"cid": 70, "color": "#4E79A7", "label": "consumeRaw$4", "count": 7}, {"cid": 71, "color": "#F28E2B", "label": "creLine truncated
// HTML-escape helper — prevents XSS when injecting graph data into innerHTML
function esc(s) {
return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;').replace(/'/g,'&#39;');
}
// Build vis datasets
const nodesDS = new vis.DataSet(RAW_NODES.map(n => ({
id: n.id, label: n.label, color: n.color, size: n.size,
font: n.font, title: n.title,
_community: n.community, _community_name: n.community_name,
_source_file: n.source_file, _file_type: n.file_type, _degree: n.degree,
})));
const edgesDS = new vis.DataSet(RAW_EDGES.map((e, i) => ({
id: i, from: e.from, to: e.to,
label: '',
title: e.title,
dashes: e.dashes,
width: e.width,
color: e.color,
arrows: { to: { enabled: true, scaleFactor: 0.5 } },
})));
const container = document.getElementById('graph');
const network = new vis.Network(container, { nodes: nodesDS, edges: edgesDS }, {
physics: {
enabled: true,
solver: 'forceAtlas2Based',
forceAtlas2Based: {
gravitationalConstant: -60,
centralGravity: 0.005,
springLength: 120,
springConstant: 0.08,
damping: 0.4,
avoidOverlap: 0.8,
},
stabilization: { iterations: 200, fit: true },
},
interaction: {
hover: true,
tooltipDelay: 100,
hideEdgesOnDrag: true,
navigationButtons: false,
keyboard: false,
},
nodes: { shape: 'dot', borderWidth: 1.5 },
edges: { smooth: { type: 'continuous', roundness: 0.2 }, selectionWidth: 3 },
});
network.once('stabilizationIterationsDone', () => {
network.setOptions({ physics: { enabled: false } });
});
function showInfo(nodeId) {
const n = nodesDS.get(nodeId);
if (!n) return;
const neighborIds = network.getConnectedNodes(nodeId);
const neighborItems = neighborIds.map(nid => {
const nb = nodesDS.get(nid);
const color = nb ? nb.color.background : '#555';
return `<span class="neighbor-link" style="border-left-color:${esc(color)}" data-nid="${esc(nid)}">${esc(nb ? nb.label : nid)}</span>`;
}).join('');
document.getElementById('info-content').innerHTML = `
<div class="field"><b>${esc(n.label)}</b></div>
<div class="field">Type: ${esc(n._file_type || 'unknown')}</div>
<div class="field">Community: ${esc(n._community_name)}</div>
<div class="field">Source: ${esc(n._source_file || '-')}</div>
<div class="field">Degree: ${n._degree}</div>
${neighborIds.length ? `<div class="field" style="margin-top:8px;color:#aaa;font-size:11px">Neighbors (${neighborIds.length})</div><div id="neighbors-list">${neighborItems}</div>` : ''}
`;
}
function focusNode(nodeId) {
network.focus(nodeId, { scale: 1.4, animation: true });
network.selectNodes([nodeId]);
showInfo(nodeId);
}
// Neighbor links use a data attribute + one delegated listener rather than an
// inline onclick. A node id/label sourced from a document or a scraped URL
// (graphify add) can contain a double-quote; dropping the stringified id
// unescaped into a quoted onclick both broke every link and allowed a hostile
// source to inject an event handler into the local report (stored XSS, #1838).
// esc() on data-nid keeps the value inside the attribute; the listener reads it
// back verbatim. Bound to document so it survives the innerHTML rebuild that
// recreates #neighbors-list on each showInfo().
document.addEventListener('click', e => {
const el = e.target.closest('.neighbor-link');
if (el && el.dataset.nid !== undefined) focusNode(el.dataset.nid);
});
// Track hovered node — hover detection is more reliable than click params
let hoveredNodeId = null;
network.on('hoverNode', params => {
hoveredNodeId = params.node;
container.style.cursor = 'pointer';
});
network.on('blurNode', () => {
hoveredNodeId = null;
container.style.cursor = 'default';
});
container.addEventListener('click', () => {
if (hoveredNodeId !== null) {
showInfo(hoveredNodeId);
network.selectNodes([hoveredNodeId]);
}
});
network.on('click', params => {
if (params.nodes.length > 0) {
showInfo(params.nodes[0]);
} else if (hoveredNodeId === null) {
document.getElementById('info-content').innerHTML = '<span class="empty">Click a node to inspect it</span>';
}
});
const searchInput = document.getElementById('search');
const searchResults = document.getElementById('search-results');
searchInput.addEventListener('input', () => {
const q = searchInput.value.toLowerCase().trim();
searchResults.innerHTML = '';
if (!q) { searchResults.style.display = 'none'; return; }
const matches = RAW_NODES.filter(n => n.label.toLowerCase().includes(q)).slice(0, 20);
if (!matches.length) { searchResults.style.display = 'none'; return; }
searchResults.style.display = 'block';
matches.forEach(n => {
const el = document.createElement('div');
el.className = 'search-item';
el.textContent = n.label;
el.style.borderLeft = `3px solid ${n.color.background}`;
el.style.paddingLeft = '8px';
el.onclick = () => {
network.focus(n.id, { scale: 1.5, animation: true });
network.selectNodes([n.id]);
showInfo(n.id);
searchResults.style.display = 'none';
searchInput.value = '';
};
searchResults.appendChild(el);
});
});
document.addEventListener('click', e => {
if (!searchResults.contains(e.target) && e.target !== searchInput)
searchResults.style.display = 'none';
});
const hiddenCommunities = new Set();
const selectAllCb = document.getElementById('select-all-cb');
function updateSelectAllState() {
const total = LEGEND.length;
const hidden = hiddenCommunities.size;
selectAllCb.checked = hidden === 0;
selectAllCb.indeterminate = hidden > 0 && hidden < total;
}
function toggleAllCommunities(hide) {
document.querySelectorAll('.legend-item').forEach(item => {
hide ? item.classList.add('dimmed') : item.classList.remove('dimmed');
});
document.querySelectorAll('.legend-cb').forEach(cb => {
cb.checked = !hide;
});
LEGEND.forEach(c => {
if (hide) hiddenCommunities.add(c.cid); else hiddenCommunities.delete(c.cid);
});
const updates = RAW_NODES.map(n => ({ id: n.id, hidden: hide }));
nodesDS.update(updates);
updateSelectAllState();
}
const legendEl = document.getElementById('legend');
LEGEND.forEach(c => {
const item = document.createElement('div');
item.className = 'legend-item';
const cb = document.createElement('input');
cb.type = 'checkbox';
cb.className = 'legend-cb';
cb.checked = true;
cb.addEventListener('change', (e) => {
e.stopPropagation();
if (cb.checked) {
hiddenCommunities.delete(c.cid);
item.classList.remove('dimmed');
} else {
hiddenCommunities.add(c.cid);
item.classList.add('dimmed');
}
const updates = RAW_NODES
.filter(n => n.community === c.cid)
.map(n => ({ id: n.id, hidden: !cb.checked }));
nodesDS.update(updates);
updateSelectAllState();
});
item.innerHTML = `<div class="legend-dot" style="background:${c.color}"></div>
<span class="legend-label">${c.label}</span>
<span class="legend-count">${c.count}</span>`;
item.prepend(cb);
item.onclick = (e) => {
if (e.target === cb) return;
cb.checked = !cb.checked;
cb.dispatchEvent(new Event('change'));
};
legendEl.appendChild(item);
});
</script>
<script>
// Render hyperedges as shaded regions
const hyperedges = [];
// afterDrawing passes ctx already transformed to network coordinate space.
// Draw node positions raw — no manual pan/zoom/DPR math needed.
network.on('afterDrawing', function(ctx) {
hyperedges.forEach(h => {
const positions = h.nodes
.map(nid => network.getPositions([nid])[nid])
.filter(p => p !== undefined);
if (positions.length < 2) return;
ctx.save();
ctx.globalAlpha = 0.12;
ctx.fillStyle = '#6366f1';
ctx.strokeStyle = '#6366f1';
ctx.lineWidth = 2;
ctx.beginPath();
// Centroid and expanded hull in network coordinates
const cx = positions.reduce((s, p) => s + p.x, 0) / positions.length;
const cy = positions.reduce((s, p) => s + p.y, 0) / positions.length;
const expanded = positions.map(p => ({
x: cx + (p.x - cx) * 1.15,
y: cy + (p.y - cy) * 1.15
}));
ctx.moveTo(expanded[0].x, expanded[0].y);
expanded.slice(1).forEach(p => ctx.lineTo(p.x, p.y));
ctx.closePath();
ctx.fill();
ctx.globalAlpha = 0.4;
ctx.stroke();
// Label
ctx.globalAlpha = 0.8;
ctx.fillStyle = '#4f46e5';
ctx.font = 'bold 11px sans-serif';
ctx.textAlign = 'center';
ctx.fillText(h.label, cx, cy - 5);
ctx.restore();
});
});
</script>
</body>
</html>
File diff suppressed because it is too large. Load diff
+477
View File
@@ -0,0 +1,477 @@
{
"app/api/placas/route.js": {
"mtime": 1787208875.1094453,
"ast_hash": "292fa5aae92458ae0098d7fa41ccba72",
"semantic_hash": ""
},
"app/catalogo/layout.jsx": {
"mtime": 1787492776.0956094,
"ast_hash": "f228a345868fa3e409f80133c29aa737",
"semantic_hash": ""
},
"app/catalogo/page.jsx": {
"mtime": 1787212450.0282295,
"ast_hash": "f1734aa31b6e84da295b6e2ee670b333",
"semantic_hash": ""
},
"app/comparacao/layout.jsx": {
"mtime": 1787492776.089609,
"ast_hash": "288273a48c04bbdc124c62848e9d7ca9",
"semantic_hash": ""
},
"app/comparacao/page.jsx": {
"mtime": 1787227734.6678472,
"ast_hash": "5e2c544715404ab174ce3d54c969f93b",
"semantic_hash": ""
},
"app/frameworks/[key]/page.jsx": {
"mtime": 1787492933.9300845,
"ast_hash": "a5ed16ece919880c8300d897424c49a2",
"semantic_hash": ""
},
"app/frameworks/page.jsx": {
"mtime": 1787493006.3313804,
"ast_hash": "f878cabb7d4a27e83262d95b769b8dc9",
"semantic_hash": ""
},
"app/glossario/page.jsx": {
"mtime": 1787493006.3354793,
"ast_hash": "6a02ace0ab551d91794fce1a0b19c753",
"semantic_hash": ""
},
"app/layout.jsx": {
"mtime": 1787499080.3362017,
"ast_hash": "78e4dcb798d3806a4a37071ecfc9ef0d",
"semantic_hash": ""
},
"app/page.jsx": {
"mtime": 1787212450.023114,
"ast_hash": "31690989ba2c2ed800f1fb7fb78a0ed8",
"semantic_hash": ""
},
"app/robots.js": {
"mtime": 1787492747.5210466,
"ast_hash": "75bc90966a10439d6485dd11454fccbd",
"semantic_hash": ""
},
"app/seletor/layout.jsx": {
"mtime": 1787492776.0926092,
"ast_hash": "73da1dea1a6b930897053dda83e27f4f",
"semantic_hash": ""
},
"app/seletor/page.jsx": {
"mtime": 1787227734.668592,
"ast_hash": "4ad52df27f6742b5a6302e694593164c",
"semantic_hash": ""
},
"app/series/[key]/page.jsx": {
"mtime": 1787493839.4458327,
"ast_hash": "ade633944e6605b43b3279859e5031c7",
"semantic_hash": ""
},
"app/series/layout.jsx": {
"mtime": 1787493098.9029381,
"ast_hash": "eb809632a02c5731c37fba793c2c6a4a",
"semantic_hash": ""
},
"app/series/page.jsx": {
"mtime": 1787227734.6664312,
"ast_hash": "a2271ce4a77e45d5e03feeec3196c496",
"semantic_hash": ""
},
"app/sitemap.js": {
"mtime": 1787492747.5170462,
"ast_hash": "906d69e855c533c8937646cfe386121e",
"semantic_hash": ""
},
"app/sobre/page.jsx": {
"mtime": 1787493098.9036343,
"ast_hash": "85a3aaa744cb6b2226616bc3c88d60a4",
"semantic_hash": ""
},
"components/BoardCard.jsx": {
"mtime": 1787212419.8479488,
"ast_hash": "50130a57d076ea247a341801685faf14",
"semantic_hash": ""
},
"components/CodeExample.jsx": {
"mtime": 1787227734.670659,
"ast_hash": "ed46db1f388eaf2170e383722cd988ec",
"semantic_hash": ""
},
"components/ConnectionsDiagram.jsx": {
"mtime": 1787212419.845745,
"ast_hash": "6898b8e25e23d506512e6a9f634a8424",
"semantic_hash": ""
},
"components/Footer.jsx": {
"mtime": 1787212419.85472,
"ast_hash": "bd7ffbe86c0b3815a27e5e90f56848c7",
"semantic_hash": ""
},
"components/Header.jsx": {
"mtime": 1787493839.49114,
"ast_hash": "65796747b210fb0313ea5e2b41234c0a",
"semantic_hash": ""
},
"components/PinRestrictions.jsx": {
"mtime": 1787227759.6538575,
"ast_hash": "10907f1e0fb249f497ed4fc365303ef9",
"semantic_hash": ""
},
"components/Providers.jsx": {
"mtime": 1787208875.111169,
"ast_hash": "d31db26b58629a807b7df4c4a3189772",
"semantic_hash": ""
},
"components/SeriesTabMenu.jsx": {
"mtime": 1787227734.6712155,
"ast_hash": "20947d45331bd3be7cb858246746f45c",
"semantic_hash": ""
},
"eslint.config.mjs": {
"mtime": 1787208875.111688,
"ast_hash": "cd28c192684b52caf16d8d1df068e272",
"semantic_hash": ""
},
"jsconfig.json": {
"mtime": 1787208875.115688,
"ast_hash": "21306b44064ae42bbbd715b1986abaf8",
"semantic_hash": ""
},
"lib/seo.js": {
"mtime": 1787492722.9508429,
"ast_hash": "12b829f0078d3fb18cb20f832f498c17",
"semantic_hash": ""
},
"next.config.mjs": {
"mtime": 1787208875.115688,
"ast_hash": "21958f5752add43cc47ab0ff5172cd46",
"semantic_hash": ""
},
"package.json": {
"mtime": 1787577906.3179622,
"ast_hash": "4224d3570f8164a9291a49197c690114",
"semantic_hash": ""
},
"postcss.config.mjs": {
"mtime": 1787208875.1166883,
"ast_hash": "675899342e765a4d16acd75a53389101",
"semantic_hash": ""
},
"public/conexoes/ESP32-C2.json": {
"mtime": 1787208875.11729,
"ast_hash": "aad3b4f175c3dd386adbf368f15073f7",
"semantic_hash": ""
},
"public/conexoes/ESP32-C3.json": {
"mtime": 1787208875.1173952,
"ast_hash": "5deecb15a45f0291802077cd24e4051b",
"semantic_hash": ""
},
"public/conexoes/ESP32-C5.json": {
"mtime": 1787208875.1173952,
"ast_hash": "949d8facf94a56f254872c185a88d2a1",
"semantic_hash": ""
},
"public/conexoes/ESP32-C6.json": {
"mtime": 1787208875.1173952,
"ast_hash": "84dceb481e501b68643300982832c8c7",
"semantic_hash": ""
},
"public/conexoes/ESP32-C61.json": {
"mtime": 1787208875.1173952,
"ast_hash": "88aa2cadabff6bbd1ba662531e904df6",
"semantic_hash": ""
},
"public/conexoes/ESP32-H2.json": {
"mtime": 1787208875.1173952,
"ast_hash": "61e9339e808c87642b618b322de424dd",
"semantic_hash": ""
},
"public/conexoes/ESP32-P4.json": {
"mtime": 1787208875.1173952,
"ast_hash": "aec6bfdf220455851dea0619fa3954e8",
"semantic_hash": ""
},
"public/conexoes/ESP32-S2.json": {
"mtime": 1787208875.1173952,
"ast_hash": "4b6b0c563a63a59756227ef096141cd5",
"semantic_hash": ""
},
"public/conexoes/ESP32-S3.json": {
"mtime": 1787208875.1176882,
"ast_hash": "7d877331595d2677894a926714590c04",
"semantic_hash": ""
},
"public/conexoes/ESP32-S31.json": {
"mtime": 1787208875.1176882,
"ast_hash": "0f3cd4f8f2741329ea93f18227b9f2a9",
"semantic_hash": ""
},
"public/conexoes/ESP32.json": {
"mtime": 1787208875.1176882,
"ast_hash": "0d111992e8707f75177cf8ec495519f1",
"semantic_hash": ""
},
"public/exemplos/esp-adf.c": {
"mtime": 1787208875.1497247,
"ast_hash": "189f598b93c1b130dedce25d07513a30",
"semantic_hash": ""
},
"public/exemplos/esp-dsp.c": {
"mtime": 1787208875.1497247,
"ast_hash": "f3406d15617cf415888b07d688cdaf34",
"semantic_hash": ""
},
"public/exemplos/esp-idf.c": {
"mtime": 1787208875.1497247,
"ast_hash": "28d7cf987af6c5d3a54ad1fe06571e91",
"semantic_hash": ""
},
"public/exemplos/esp-matter.c": {
"mtime": 1787208875.1497247,
"ast_hash": "332c82ce14230250fd828db6e22cae44",
"semantic_hash": ""
},
"public/exemplos/esp-nn.c": {
"mtime": 1787208875.1497247,
"ast_hash": "186d382f96347dbae8be3b13c0252ad3",
"semantic_hash": ""
},
"public/exemplos/esp-who.c": {
"mtime": 1787208875.1497247,
"ast_hash": "2abc563b2750f0a823438a3e9b1c56c1",
"semantic_hash": ""
},
"public/exemplos/micropython.py": {
"mtime": 1787208875.1497247,
"ast_hash": "99c3b78148eee8632bb7772db61bdfdd",
"semantic_hash": ""
},
"public/formacoes/assets/paged.polyfill.js": {
"mtime": 1787224680.399874,
"ast_hash": "28be5336e03f6072740a5cad2f787314",
"semantic_hash": ""
},
"public/frameworks.json": {
"mtime": 1787208875.1497247,
"ast_hash": "3595f7219f3fcfd1b8d59ea741fab869",
"semantic_hash": ""
},
"public/series.json": {
"mtime": 1787214110.9422739,
"ast_hash": "64ba3d2642c83040afda45cccc107736",
"semantic_hash": ""
},
"scripts/auditar-temas.mjs": {
"mtime": 1787247985.7048883,
"ast_hash": "ab177dc276098ee67cf39504c2c406df",
"semantic_hash": ""
},
"start.config.js": {
"mtime": 1787208875.1956916,
"ast_hash": "a6a5cda80ac9eea57d50f14872a739d2",
"semantic_hash": ""
},
"CLAUDE.md": {
"mtime": 1787208875.1086879,
"ast_hash": "0ea9488e278d2efd15e7c0b6e7cdca83",
"semantic_hash": ""
},
"DESIGN.md": {
"mtime": 1787227815.9607596,
"ast_hash": "227ededb587d6b60a08c9b653ffece7e",
"semantic_hash": ""
},
"README.md": {
"mtime": 1787208875.1086879,
"ast_hash": "e1c8b99e874c6cddc035c7ac900c9bbd",
"semantic_hash": ""
},
"public/formacoes/1/index.html": {
"mtime": 1787576388.0904403,
"ast_hash": "d885d27c8e0854573c7596f2f87d90e7",
"semantic_hash": ""
},
"public/formacoes/1/slide.html": {
"mtime": 1787578115.8015034,
"ast_hash": "63c75c707f55eb060113fc26ad3efd56",
"semantic_hash": ""
},
"public/google21a790a2c23c0ec5.html": {
"mtime": 1787208875.1497247,
"ast_hash": "c8e349cbe0172dc98e26385e09d67cc3",
"semantic_hash": ""
},
"public/datasheets/ESP32-C2 (ESP8684).pdf": {
"mtime": 1787208875.1196883,
"ast_hash": "36e6ee1a52e7293510d60c7adfc0fbaf",
"semantic_hash": ""
},
"public/datasheets/ESP32-C3.pdf": {
"mtime": 1787208875.1226883,
"ast_hash": "25beb64276e6bc6c5d13d032e30847d9",
"semantic_hash": ""
},
"public/datasheets/ESP32-C5.pdf": {
"mtime": 1787208875.1246884,
"ast_hash": "c1083a9504a574282a09f557e0343d48",
"semantic_hash": ""
},
"public/datasheets/ESP32-C6.pdf": {
"mtime": 1787208875.1286886,
"ast_hash": "66a7b580c6afff5becf9bd326bb675d4",
"semantic_hash": ""
},
"public/datasheets/ESP32-C61.pdf": {
"mtime": 1787208875.1306887,
"ast_hash": "2f86d54475a006e9b0e41ba329560c5f",
"semantic_hash": ""
},
"public/datasheets/ESP32-H2.pdf": {
"mtime": 1787208875.1326888,
"ast_hash": "460ea57a62c32646d12ae0088eb1a073",
"semantic_hash": ""
},
"public/datasheets/ESP32-P4.pdf": {
"mtime": 1787208875.137689,
"ast_hash": "aa3fc8de7dfa4e7d3ff40dd9e19fdb35",
"semantic_hash": ""
},
"public/datasheets/ESP32-S2.pdf": {
"mtime": 1787208875.1406891,
"ast_hash": "1e912b14670dde07253da71147ea2ded",
"semantic_hash": ""
},
"public/datasheets/ESP32-S3.pdf": {
"mtime": 1787208875.1436894,
"ast_hash": "cdb8a18273a761aff071e6a665867205",
"semantic_hash": ""
},
"public/datasheets/ESP32-S31.pdf": {
"mtime": 1787208875.1466894,
"ast_hash": "b2f7aa8b2cc16c18815abc5a1ddd566a",
"semantic_hash": ""
},
"public/datasheets/ESP32.pdf": {
"mtime": 1787208875.1486895,
"ast_hash": "2354c04b871b3b6b294076c1fb953522",
"semantic_hash": ""
},
"app/icon.svg": {
"mtime": 1787493648.5160885,
"ast_hash": "ce4f06e06babeb3ff3c5f06373573625",
"semantic_hash": ""
},
"app/opengraph-image.png": {
"mtime": 1787493677.7188504,
"ast_hash": "a64c2620cabed2aface6819ea582e76d",
"semantic_hash": ""
},
"public/formacoes/1/esp32-s3-blocos.png": {
"mtime": 1787230391.7354066,
"ast_hash": "91caddfa7e957735efeeaf51252dd4c9",
"semantic_hash": ""
},
"public/formacoes/1/pratica.png": {
"mtime": 1787226071.9687011,
"ast_hash": "0041e888c91ab709794602e2a607532b",
"semantic_hash": ""
},
"public/formacoes/assets/capa-curvas.svg": {
"mtime": 1787226377.6237059,
"ast_hash": "aafa9bdfdede085b9d848684f6420ac6",
"semantic_hash": ""
},
"public/formacoes/assets/laser-escuro.svg": {
"mtime": 1787226338.6152956,
"ast_hash": "b4b66a35a74c18b6fcdd4e7b5aba60d9",
"semantic_hash": ""
},
"public/formacoes/assets/laser.svg": {
"mtime": 1787226268.1520822,
"ast_hash": "62d94dd326502e1b0afd280e1f465cf4",
"semantic_hash": ""
},
"public/logo.png": {
"mtime": 1787208875.1497247,
"ast_hash": "1c0eae14654c8f5427c7141029ecd29e",
"semantic_hash": ""
},
"public/marca/espdocs-lockup.svg": {
"mtime": 1787493648.5180027,
"ast_hash": "a95424a74b7d5dff1c0a16ee2981bb06",
"semantic_hash": ""
},
"public/marca/espdocs-marca.svg": {
"mtime": 1787493553.7360556,
"ast_hash": "ce4f06e06babeb3ff3c5f06373573625",
"semantic_hash": ""
},
"public/placas/esp32-c2.png": {
"mtime": 1787208875.1506896,
"ast_hash": "3480aadf17ef57e93ee5afdfd934d896",
"semantic_hash": ""
},
"public/placas/esp32-c3.png": {
"mtime": 1787208875.1516895,
"ast_hash": "85df0510a61dee5ffa581d912f5d68c9",
"semantic_hash": ""
},
"public/placas/esp32-c5.png": {
"mtime": 1787208875.1526897,
"ast_hash": "6a59f4e23ac9ec5e319a77a6600fa343",
"semantic_hash": ""
},
"public/placas/esp32-c6.png": {
"mtime": 1787208875.1536896,
"ast_hash": "0f836b438f62bb4b6237c9318346cdf2",
"semantic_hash": ""
},
"public/placas/esp32-c61.png": {
"mtime": 1787208875.1546898,
"ast_hash": "6734034067caa41374f2a4ca5064a7d3",
"semantic_hash": ""
},
"public/placas/esp32-h2.png": {
"mtime": 1787208875.1556897,
"ast_hash": "7dceb269eb019ce826ef336dd57ab52c",
"semantic_hash": ""
},
"public/placas/esp32-p4.png": {
"mtime": 1787208875.1626902,
"ast_hash": "c144c171692850ac257d00827dc674f5",
"semantic_hash": ""
},
"public/placas/esp32-s2.png": {
"mtime": 1787208875.1646903,
"ast_hash": "670c4a12339f32fb32af2eebdc575892",
"semantic_hash": ""
},
"public/placas/esp32-s3.png": {
"mtime": 1787208875.1686904,
"ast_hash": "52b96040d9c648f7c52aa4c8adac7e47",
"semantic_hash": ""
},
"public/placas/esp32-s31.png": {
"mtime": 1787208875.1926913,
"ast_hash": "5b970e68abce449015851cd5966525e3",
"semantic_hash": ""
},
"public/placas/esp32.png": {
"mtime": 1787208875.1946914,
"ast_hash": "6791837138c1c5400db2ee07c9025627",
"semantic_hash": ""
},
"scripts/slides-pdf.mjs": {
"mtime": 1787577906.2640111,
"ast_hash": "dbf8509a3083d40582dce9d8b29956a9",
"semantic_hash": ""
},
"public/formacoes/1/LASER-ESP32-Modulo-1-Slides.pdf": {
"mtime": 1787578140.9017217,
"ast_hash": "fe8398321d742b36d93c72b49678b16c",
"semantic_hash": ""
}
}
+1 -1
View File
@@ -8,7 +8,7 @@
"start": "next start", "start": "next start",
"lint": "eslint", "lint": "eslint",
"auditar-temas": "node scripts/auditar-temas.mjs", "auditar-temas": "node scripts/auditar-temas.mjs",
"exportar-cmyk": "node scripts/exportar-cmyk.mjs" "slides-pdf": "node scripts/slides-pdf.mjs"
}, },
"dependencies": { "dependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.14.0",
-101
View File
@@ -1965,108 +1965,7 @@ Temperatura: 26.1 C | Umidade: 62.0 %</code></pre>
window.PagedConfig = { window.PagedConfig = {
before: () => document.querySelector(".aviso-carregando")?.remove(), before: () => document.querySelector(".aviso-carregando")?.remove(),
}; };
function montarPainelFlutuante() {
if (document.getElementById("painelExportacao")) return;
// Injeta estilo para position fixed sem ser sanitizado pelo parser do Paged.js
const style = document.createElement("style");
style.textContent = `
#painelExportacao {
position: fixed !important;
top: 18px !important;
right: 20px !important;
z-index: 999999 !important;
display: flex !important;
}
#toastExportacao {
position: fixed !important;
bottom: 24px !important;
right: 24px !important;
z-index: 1000000 !important;
}
@media print {
#painelExportacao, #toastExportacao {
display: none !important;
}
}
`;
document.head.appendChild(style);
const painel = document.createElement("div");
painel.id = "painelExportacao";
painel.className = "painel-exportacao";
painel.innerHTML = `
<span class="painel-exportacao-titulo">
<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 6 2 18 2 18 9"></polyline><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path><rect x="6" y="14" width="12" height="8"></rect></svg>
Apostila:
</span>
<button type="button" class="btn-exportar btn-exportar-rgb" id="btnExportarRgb" title="Imprimir ou Salvar em PDF (padrão RGB)">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
<span>Exportar PDF</span>
</button>
<button type="button" class="btn-exportar btn-exportar-cmyk" id="btnExportarCmyk" title="Exportar PDF em CMYK (ISO Coated) para gráfica">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path><path d="M2 12h20"></path></svg>
<span>Exportar em CMYK</span>
</button>
`;
const toast = document.createElement("div");
toast.id = "toastExportacao";
toast.className = "toast-exportacao";
document.body.appendChild(painel);
document.body.appendChild(toast);
document.getElementById("btnExportarRgb").onclick = () => window.print();
document.getElementById("btnExportarCmyk").onclick = async () => {
const btn = document.getElementById("btnExportarCmyk");
const txt = btn.innerHTML;
btn.disabled = true;
btn.innerHTML = `<span class="spinner-exportar"></span><span>Baixando CMYK...</span>`;
exibirToast("Gerando PDF em CMYK (ISO Coated)... O download iniciará em instantes.", "info", 15000);
try {
const res = await fetch("/api/export-cmyk?modulo=1");
if (!res.ok) throw new Error("Erro no servidor (" + res.status + ")");
const blob = await res.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.style.display = "none";
a.href = url;
a.download = "LASER-ESP32-Modulo-1-CMYK.pdf";
document.body.appendChild(a);
a.click();
setTimeout(() => { a.remove(); URL.revokeObjectURL(url); }, 1000);
exibirToast("✅ PDF em CMYK baixado com sucesso!", "sucesso", 4000);
} catch (err) {
console.error("Erro CMYK:", err);
exibirToast("❌ Erro ao baixar PDF: " + err.message, "erro", 6000);
} finally {
btn.disabled = false;
btn.innerHTML = txt;
}
};
}
function exibirToast(msg, tipo = "info", dur = 4000) {
const t = document.getElementById("toastExportacao");
if (!t) return;
t.textContent = msg;
t.className = "toast-exportacao ativo " + tipo;
clearTimeout(t._timer);
t._timer = setTimeout(() => t.classList.remove("ativo"), dur);
}
</script> </script>
<script src="../assets/paged.polyfill.js"></script> <script src="../assets/paged.polyfill.js"></script>
<script>
class ExportHandler extends window.Paged.Handler {
afterRendered() {
montarPainelFlutuante();
}
}
window.Paged.registerHandlers(ExportHandler);
</script>
</body> </body>
</html> </html>
File diff suppressed because it is too large. Load diff
+1 -154
View File
@@ -666,160 +666,7 @@ figcaption {
} }
/* ------------------------------------------------------------------------- /* -------------------------------------------------------------------------
8. Barra Flutuante de Exportação e Impressão (Apenas em Tela) 8. Regras Especiais para Impressão Física e Geração de PDF (@media print)
------------------------------------------------------------------------- */
.painel-exportacao {
position: fixed !important;
top: 18px !important;
right: 20px !important;
z-index: 999999 !important;
display: flex !important;
align-items: center;
gap: 10px;
background: rgba(6, 38, 57, 0.92);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
padding: 6px 10px;
border-radius: 9999px;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow:
0 8px 30px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(0, 0, 0, 0.2);
transition: opacity 0.2s ease, transform 0.2s ease;
}
.painel-exportacao.oculto {
opacity: 0;
pointer-events: none;
transform: translateY(-8px);
}
.painel-exportacao-titulo {
font-family: "Inter", sans-serif;
font-size: 11px;
font-weight: 600;
color: #94a3b8;
padding: 0 4px 0 6px;
letter-spacing: 0.02em;
display: flex;
align-items: center;
gap: 5px;
}
.btn-exportar {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 13px;
border-radius: 9999px;
font-family: "Inter", sans-serif;
font-size: 11.5px;
font-weight: 600;
cursor: pointer;
border: none;
outline: none;
text-decoration: none;
transition: all 0.18s cubic-bezier(0.16, 1, 0.3, 1);
white-space: nowrap;
user-select: none;
}
.btn-exportar svg {
width: 14px;
height: 14px;
flex-shrink: 0;
}
.btn-exportar-rgb {
background: rgba(255, 255, 255, 0.12);
color: #f1f5f9;
border: 1px solid rgba(255, 255, 255, 0.18);
}
.btn-exportar-rgb:hover {
background: rgba(255, 255, 255, 0.2);
color: #ffffff;
transform: translateY(-1px);
}
.btn-exportar-rgb:active {
transform: translateY(0);
background: rgba(255, 255, 255, 0.1);
}
.btn-exportar-cmyk {
background: linear-gradient(135deg, #F77F00, #D62828);
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 2px 10px rgba(214, 40, 40, 0.35);
}
.btn-exportar-cmyk:hover {
background: linear-gradient(135deg, #ff911a, #e63939);
box-shadow: 0 4px 14px rgba(214, 40, 40, 0.5);
transform: translateY(-1px);
}
.btn-exportar-cmyk:active {
transform: translateY(0);
box-shadow: 0 1px 4px rgba(214, 40, 40, 0.3);
}
.btn-exportar:disabled,
.btn-exportar.carregando {
opacity: 0.75;
cursor: wait;
pointer-events: none;
}
.spinner-exportar {
width: 13px;
height: 13px;
border: 2px solid rgba(255, 255, 255, 0.35);
border-top-color: #ffffff;
border-radius: 50%;
animation: girar-spinner 0.75s linear infinite;
}
@keyframes girar-spinner {
to { transform: rotate(360deg); }
}
/* Toast de notificação de exportação */
.toast-exportacao {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 10001;
background: #062639;
color: #e2e8f0;
border: 1px solid #33566a;
padding: 10px 16px;
border-radius: 8px;
font-family: "Inter", sans-serif;
font-size: 12px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4);
display: flex;
align-items: center;
gap: 10px;
transition: all 0.3s ease;
opacity: 0;
transform: translateY(12px);
pointer-events: none;
}
.toast-exportacao.ativo {
opacity: 1;
transform: translateY(0);
pointer-events: auto;
}
.toast-exportacao.sucesso { border-color: #10b981; }
.toast-exportacao.erro { border-color: #ef4444; }
/* -------------------------------------------------------------------------
9. Regras Especiais para Impressão Física e Geração de PDF (@media print)
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
@media print { @media print {
-80
View File
@@ -1,80 +0,0 @@
import { execSync } from "node:child_process";
import fs from "node:fs";
import path from "node:path";
import puppeteer from "puppeteer";
const modulo = process.argv[2] || "1";
const publicDir = path.resolve("public/formacoes", modulo);
const htmlFile = path.join(publicDir, "index.html");
if (!fs.existsSync(htmlFile)) {
console.error(`❌ Erro: Apostila do módulo ${modulo} não encontrada em ${htmlFile}`);
process.exit(1);
}
const outputDir = path.resolve("dist/apostilas");
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
const tmpRgbPdf = path.join(outputDir, `modulo-${modulo}-rgb-temp.pdf`);
const finalCmykPdf = path.join(outputDir, `LASER-ESP32-Modulo-${modulo}-CMYK.pdf`);
console.log(`\n🚀 Iniciando exportação da Apostila (Módulo ${modulo})...`);
console.log(`📄 Arquivo fonte: ${htmlFile}`);
async function exportar() {
console.log("\n[1/3] Renderizando páginas no Puppeteer e aguardando Paged.js...");
const browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-web-security", "--allow-file-access-from-files"]
});
try {
const page = await browser.newPage();
await page.setViewport({ width: 1200, height: 1600, deviceScaleFactor: 2 });
await page.goto(`file://${htmlFile}`, { waitUntil: "networkidle0", timeout: 60000 });
// Aguarda o Paged.js concluir a montagem de todas as páginas
await page.waitForFunction(() => {
const pages = document.querySelectorAll(".pagedjs_page");
return pages.length > 0 && !document.querySelector(".aviso-carregando");
}, { timeout: 30000 });
// Aguarda 1 segundo adicional para renderização de fontes e SVG
await new Promise((r) => setTimeout(r, 1000));
console.log("[2/3] Gerando PDF em alta resolução...");
await page.pdf({
path: tmpRgbPdf,
format: "A4",
printBackground: true,
preferCSSPageSize: true,
margin: { top: 0, right: 0, bottom: 0, left: 0 }
});
console.log(`[3/3] Convertendo espaço de cor para CMYK (ISO Coated) via Ghostscript...`);
const gsCmd = `gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sColorConversionStrategy=CMYK -dProcessColorModel=/DeviceCMYK -dCompatibilityLevel=1.4 -sOutputFile="${finalCmykPdf}" "${tmpRgbPdf}"`;
execSync(gsCmd, { stdio: "pipe" });
if (fs.existsSync(tmpRgbPdf)) {
fs.unlinkSync(tmpRgbPdf);
}
const stats = fs.statSync(finalCmykPdf);
const tamanhoMB = (stats.size / (1024 * 1024)).toFixed(2);
console.log(`\n✅ PDF em CMYK gerado com sucesso!`);
console.log(`📂 Destino: ${finalCmykPdf}`);
console.log(`📊 Tamanho: ${tamanhoMB} MB\n`);
} catch (err) {
console.error("❌ Erro durante a geração:", err);
process.exit(1);
} finally {
await browser.close();
}
}
exportar();
+96
View File
@@ -0,0 +1,96 @@
/**
* Exporta os slides de uma formação para PDF em 16:9 exato.
*
* npm run slides-pdf → módulo 1
* npm run slides-pdf -- 2 → módulo 2
*
* A página do PDF tem 1280 x 720 px (338,667 x 190,5 mm), a mesma caixa do
* palco do slide.html, então nada é reescalado nem cortado. Sai um arquivo por
* formação, ao lado do próprio slide.html.
*
* Existe porque a caixa de impressão do navegador depende de o usuário lembrar
* de marcar "gráficos de segundo plano" e "margens: nenhuma". Aqui isso é fixo.
*/
import http from "node:http";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
import puppeteer from "puppeteer";
const raiz = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const modulo = (process.argv[2] || "1").replace(/\D/g, "") || "1";
const pastaModulo = path.join(raiz, "public", "formacoes", modulo);
const saida = path.join(pastaModulo, `LASER-ESP32-Modulo-${modulo}-Slides.pdf`);
if (!fs.existsSync(path.join(pastaModulo, "slide.html"))) {
console.error(`Não achei public/formacoes/${modulo}/slide.html`);
process.exit(1);
}
/* Um servidor estático efêmero: com file:// o Chrome bloqueia as fontes e as
imagens de pastas irmãs, e o PDF sai com o tipo errado. */
const TIPOS = {
".html": "text/html; charset=utf-8",
".css": "text/css; charset=utf-8",
".js": "text/javascript; charset=utf-8",
".svg": "image/svg+xml",
".png": "image/png",
".jpg": "image/jpeg",
".json": "application/json",
};
const servidor = http.createServer((req, res) => {
const rel = decodeURIComponent(req.url.split("?")[0]);
const arquivo = path.join(raiz, "public", path.normalize(rel).replace(/^(\.\.[/\\])+/, ""));
if (!arquivo.startsWith(path.join(raiz, "public")) || !fs.existsSync(arquivo) || fs.statSync(arquivo).isDirectory()) {
res.writeHead(404).end("não encontrado");
return;
}
res.writeHead(200, { "Content-Type": TIPOS[path.extname(arquivo)] || "application/octet-stream" });
fs.createReadStream(arquivo).pipe(res);
});
await new Promise((r) => servidor.listen(0, "127.0.0.1", r));
const porta = servidor.address().port;
const url = `http://127.0.0.1:${porta}/formacoes/${modulo}/slide.html`;
console.log(`[1/3] Abrindo ${url}`);
const navegador = await puppeteer.launch({ headless: "new", args: ["--no-sandbox"] });
try {
const pagina = await navegador.newPage();
await pagina.goto(url, { waitUntil: "networkidle0", timeout: 60000 });
await pagina.evaluate(() => document.fonts.ready);
console.log("[2/3] Conferindo o encaixe de cada slide no 16:9");
await pagina.emulateMediaType("print");
await new Promise((r) => setTimeout(r, 500));
const caixas = await pagina.evaluate(() =>
[...document.querySelectorAll("#palco .slide")].map((s) => {
const b = s.getBoundingClientRect();
return { t: s.dataset.titulo, w: Math.round(b.width), h: Math.round(b.height) };
})
);
const fora = caixas.filter((c) => c.w !== 1280 || c.h !== 720);
if (fora.length) {
console.warn(` atenção: ${fora.length} slide(s) fora de 1280x720:`, fora.slice(0, 5));
} else {
console.log(` ${caixas.length} slides, todos em 1280x720`);
}
console.log("[3/3] Gerando o PDF");
await pagina.pdf({
path: saida,
printBackground: true,
preferCSSPageSize: true,
margin: { top: 0, right: 0, bottom: 0, left: 0 },
});
const kb = (fs.statSync(saida).size / 1024).toFixed(0);
console.log(`\nPronto: ${path.relative(raiz, saida)} (${kb} KB, ${caixas.length} páginas em 16:9)`);
} finally {
await navegador.close();
servidor.close();
}