@launchsecure/launch-kit 0.0.24 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -0
- package/dist/beacon/beacon.mjs +1016 -0
- package/dist/beacon/beacon.mjs.map +1 -0
- package/dist/beacon/beacon.umd.js +87 -0
- package/dist/beacon/beacon.umd.js.map +1 -0
- package/dist/beacon/index-DAIDnjfR.mjs +513 -0
- package/dist/beacon/index-DAIDnjfR.mjs.map +1 -0
- package/dist/beacon/types/capture/element.d.ts +3 -0
- package/dist/beacon/types/capture/element.d.ts.map +1 -0
- package/dist/beacon/types/capture/framework.d.ts +3 -0
- package/dist/beacon/types/capture/framework.d.ts.map +1 -0
- package/dist/beacon/types/capture/metadata.d.ts +3 -0
- package/dist/beacon/types/capture/metadata.d.ts.map +1 -0
- package/dist/beacon/types/capture/overlay.d.ts +7 -0
- package/dist/beacon/types/capture/overlay.d.ts.map +1 -0
- package/dist/beacon/types/capture/picker.d.ts +12 -0
- package/dist/beacon/types/capture/picker.d.ts.map +1 -0
- package/dist/beacon/types/capture/screenshot.d.ts +7 -0
- package/dist/beacon/types/capture/screenshot.d.ts.map +1 -0
- package/dist/beacon/types/capture/selector.d.ts +2 -0
- package/dist/beacon/types/capture/selector.d.ts.map +1 -0
- package/dist/beacon/types/element.d.ts +50 -0
- package/dist/beacon/types/element.d.ts.map +1 -0
- package/dist/beacon/types/index.d.ts +4 -0
- package/dist/beacon/types/index.d.ts.map +1 -0
- package/dist/beacon/types/transport/submit.d.ts +3 -0
- package/dist/beacon/types/transport/submit.d.ts.map +1 -0
- package/dist/beacon/types/types.d.ts +88 -0
- package/dist/beacon/types/types.d.ts.map +1 -0
- package/dist/beacon/types/ui/button.d.ts +2 -0
- package/dist/beacon/types/ui/button.d.ts.map +1 -0
- package/dist/beacon/types/ui/drawer.d.ts +31 -0
- package/dist/beacon/types/ui/drawer.d.ts.map +1 -0
- package/dist/beacon/types/ui/icons.d.ts +9 -0
- package/dist/beacon/types/ui/icons.d.ts.map +1 -0
- package/dist/beacon/types/ui/pick-mode-overlay.d.ts +25 -0
- package/dist/beacon/types/ui/pick-mode-overlay.d.ts.map +1 -0
- package/dist/beacon/types/ui/pin-popover.d.ts +14 -0
- package/dist/beacon/types/ui/pin-popover.d.ts.map +1 -0
- package/dist/chart-client/assets/{index-C8ANseEa.js → index-Bk1hawjD.js} +63 -58
- package/dist/chart-client/assets/index-DpaGa3bY.css +1 -0
- package/dist/chart-client/index.html +2 -2
- package/dist/client/assets/index-Bfel4OQ5.css +32 -0
- package/dist/client/assets/{index-Ds9UP_cj.js → index-eC-WuUWB.js} +58 -58
- package/dist/client/index.html +2 -2
- package/dist/council-client/assets/{index-Dc41S-R2.js → index-Cs_MVXHf.js} +14 -14
- package/dist/council-client/assets/index-P5kMsT5a.css +1 -0
- package/dist/council-client/index.html +2 -2
- package/dist/deck-client/assets/{_baseUniq-2gclQXo7.js → _baseUniq-C2xT_eYu.js} +1 -1
- package/dist/deck-client/assets/{arc-DcMY5Wm0.js → arc-CmVL9pGd.js} +1 -1
- package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-B8iirmmJ.js → architectureDiagram-Q4EWVU46-BSFgdjve.js} +1 -1
- package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-B4JBLjmJ.js → blockDiagram-DXYQGD6D-DuLzscvP.js} +1 -1
- package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-CojrJAk8.js → c4Diagram-AHTNJAMY-CfCJB8eY.js} +1 -1
- package/dist/deck-client/assets/channel-B4aNO8ZB.js +1 -0
- package/dist/deck-client/assets/{chunk-4BX2VUAB-Bmb_BMDo.js → chunk-4BX2VUAB-DxmLYTWZ.js} +1 -1
- package/dist/deck-client/assets/{chunk-4TB4RGXK-CumBy8qe.js → chunk-4TB4RGXK-CCnf7GFE.js} +1 -1
- package/dist/deck-client/assets/{chunk-55IACEB6-Ka8Hb1wD.js → chunk-55IACEB6-Db9DApcj.js} +1 -1
- package/dist/deck-client/assets/{chunk-EDXVE4YY-B3sIPiQo.js → chunk-EDXVE4YY-DmYDq8ZI.js} +1 -1
- package/dist/deck-client/assets/{chunk-FMBD7UC4-C1tYkaqu.js → chunk-FMBD7UC4-BGhUlF20.js} +1 -1
- package/dist/deck-client/assets/{chunk-OYMX7WX6-D7Wacbky.js → chunk-OYMX7WX6-CpEnicQZ.js} +1 -1
- package/dist/deck-client/assets/{chunk-QZHKN3VN-ChXI0vO3.js → chunk-QZHKN3VN-Doa7LKwf.js} +1 -1
- package/dist/deck-client/assets/{chunk-YZCP3GAM-BXhiqf8u.js → chunk-YZCP3GAM-CpkIlH6V.js} +1 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-BHTI0yWz.js +1 -0
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-BHTI0yWz.js +1 -0
- package/dist/deck-client/assets/clone-HduFm7qU.js +1 -0
- package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-Bqp3p68D.js → cose-bilkent-S5V4N54A-Bkh8Bfcb.js} +1 -1
- package/dist/deck-client/assets/{dagre-KV5264BT-BS-rtyhZ.js → dagre-KV5264BT-Bp0XpTgH.js} +1 -1
- package/dist/deck-client/assets/{diagram-5BDNPKRD-BIrj9YGI.js → diagram-5BDNPKRD-ZHiyGYPQ.js} +1 -1
- package/dist/deck-client/assets/{diagram-G4DWMVQ6-noHWPIg4.js → diagram-G4DWMVQ6-BW-Q8_H5.js} +1 -1
- package/dist/deck-client/assets/{diagram-MMDJMWI5-C2qHxvqV.js → diagram-MMDJMWI5-6I3LTafu.js} +1 -1
- package/dist/deck-client/assets/{diagram-TYMM5635-BytnGQr-.js → diagram-TYMM5635-CyM5YK28.js} +1 -1
- package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BfK5m2YQ.js → erDiagram-SMLLAGMA-CjNxVJHk.js} +1 -1
- package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-Cq925G1Z.js → flowDiagram-DWJPFMVM-BDQHuAJR.js} +1 -1
- package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-DhhHPAmj.js → ganttDiagram-T4ZO3ILL-B7MnkpbP.js} +1 -1
- package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-B3Lc0h9q.js → gitGraphDiagram-UUTBAWPF-C9dZAcYD.js} +1 -1
- package/dist/deck-client/assets/{graph-RTawgVWm.js → graph-CjdBnzUy.js} +1 -1
- package/dist/deck-client/assets/{index-BfIfJXmS.js → index-DeIVPW63.js} +68 -68
- package/dist/deck-client/assets/index-LKZDAS9S.css +1 -0
- package/dist/deck-client/assets/{infoDiagram-42DDH7IO-BlR584kX.js → infoDiagram-42DDH7IO-C7d3iRC3.js} +1 -1
- package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-DygKoNGY.js → ishikawaDiagram-UXIWVN3A-BcYGKj09.js} +1 -1
- package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-BnaiYp9N.js → journeyDiagram-VCZTEJTY-DqFlRrOL.js} +1 -1
- package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-BQBUBzJC.js → kanban-definition-6JOO6SKY-BJhPp1NR.js} +1 -1
- package/dist/deck-client/assets/{layout-DeZ8HI1T.js → layout-DIeS6GvK.js} +1 -1
- package/dist/deck-client/assets/{linear-C6roLi_9.js → linear-He_yJy5H.js} +1 -1
- package/dist/deck-client/assets/{min-CbUksbuI.js → min-DQ6Kx06t.js} +1 -1
- package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-iNxV62yN.js → mindmap-definition-QFDTVHPH-sQ62L8T2.js} +1 -1
- package/dist/deck-client/assets/{pieDiagram-DEJITSTG-DHVA0jaG.js → pieDiagram-DEJITSTG-BqCWmU2K.js} +1 -1
- package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-DBeKKLUQ.js → quadrantDiagram-34T5L4WZ-rQ1TJOoe.js} +1 -1
- package/dist/deck-client/assets/{requirementDiagram-MS252O5E-CBwITx7p.js → requirementDiagram-MS252O5E-BO2MPBOM.js} +1 -1
- package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-BtE-1YTU.js → sankeyDiagram-XADWPNL6-BgsHEVex.js} +1 -1
- package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-DN96yPP2.js → sequenceDiagram-FGHM5R23-B3j1yMLU.js} +1 -1
- package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-VUkKC2uJ.js → stateDiagram-FHFEXIEX-C8jFlZou.js} +1 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BoqepHW0.js +1 -0
- package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-oUeZhRns.js → timeline-definition-GMOUNBTQ-tM-qo4Zk.js} +1 -1
- package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D87fK90n.js → vennDiagram-DHZGUBPP-B0-6kOEu.js} +1 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-HpBk07P-.js +162 -0
- package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-Ca_i0QRA.js → wardleyDiagram-NUSXRM2D-BkA1NLDE.js} +1 -1
- package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-CUOJVIvq.js → xychartDiagram-5P7HB3ND-CEKGSuI-.js} +1 -1
- package/dist/deck-client/index.html +2 -2
- package/dist/server/chart-serve.js +1336 -141
- package/dist/server/cli.js +28423 -6671
- package/dist/server/council-entry.js +0 -0
- package/dist/server/deck-mcp-entry.js +332 -3
- package/dist/server/deck-serve.js +288 -0
- package/dist/server/fb-wizard.js +0 -0
- package/dist/server/graph/queries/classify.scm +8 -0
- package/dist/server/graph/queries/exports.scm +7 -0
- package/dist/server/graph-mcp-entry.js +1987 -224
- package/dist/server/recall-entry.js +1112 -0
- package/package.json +47 -21
- package/dist/chart-client/assets/index--120d9P9.css +0 -1
- package/dist/client/assets/index-Bf8zdL3x.css +0 -32
- package/dist/council-client/assets/index-CofZh7pS.css +0 -1
- package/dist/deck-client/assets/channel-ERh5jKXV.js +0 -1
- package/dist/deck-client/assets/classDiagram-6PBFFD2Q-CMi1Gaev.js +0 -1
- package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-CMi1Gaev.js +0 -1
- package/dist/deck-client/assets/clone-DfWhlD4X.js +0 -1
- package/dist/deck-client/assets/index-765AIQ9z.css +0 -1
- package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-CA0IjulK.js +0 -1
- package/dist/deck-client/assets/wardley-RL74JXVD-DYbYcpDp.js +0 -162
- package/dist/server/deck-server/deck-mcp-entry.js +0 -1789
- package/dist/server/deck-server/deck-serve.js +0 -1275
- package/dist/server/server/chart-serve.js +0 -4643
- package/dist/server/server/cli.js +0 -13360
- package/dist/server/server/fb-wizard.js +0 -136
- package/dist/server/server/graph-mcp-entry.js +0 -6776
|
@@ -881,6 +881,271 @@ function contractToMarkdown(contract) {
|
|
|
881
881
|
return md;
|
|
882
882
|
}
|
|
883
883
|
|
|
884
|
+
// src/server/rich-html-render.ts
|
|
885
|
+
var WIRED_CDN = "https://unpkg.com/wired-elements?module";
|
|
886
|
+
var REVEAL_VER = "5.1.0";
|
|
887
|
+
var REVEAL_CSS = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/dist/reveal.css`;
|
|
888
|
+
var REVEAL_THEME = (t) => `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/dist/theme/${t === "dark" ? "black" : "white"}.css`;
|
|
889
|
+
var REVEAL_JS = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/dist/reveal.js`;
|
|
890
|
+
var REVEAL_MD = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/plugin/markdown/markdown.js`;
|
|
891
|
+
var REVEAL_HL = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/plugin/highlight/highlight.js`;
|
|
892
|
+
var REVEAL_NOTES = `https://cdn.jsdelivr.net/npm/reveal.js@${REVEAL_VER}/plugin/notes/notes.js`;
|
|
893
|
+
function renderRichHtml(opts) {
|
|
894
|
+
const theme = opts.theme ?? "light";
|
|
895
|
+
const title = escapeHtml(opts.title ?? "LaunchDeck");
|
|
896
|
+
if (opts.framework === "wired") {
|
|
897
|
+
return renderWired(opts.content, theme, title);
|
|
898
|
+
}
|
|
899
|
+
if (opts.framework === "reveal") {
|
|
900
|
+
return renderReveal(opts.content, theme, title);
|
|
901
|
+
}
|
|
902
|
+
return opts.content;
|
|
903
|
+
}
|
|
904
|
+
function themeResolverScript(initial) {
|
|
905
|
+
return `<script>
|
|
906
|
+
(function () {
|
|
907
|
+
function applyTheme(t) {
|
|
908
|
+
if (t !== 'light' && t !== 'dark') return;
|
|
909
|
+
var prev = document.documentElement.dataset.theme;
|
|
910
|
+
document.documentElement.dataset.theme = t;
|
|
911
|
+
if (prev !== t) {
|
|
912
|
+
document.dispatchEvent(new CustomEvent('deck-theme', { detail: t }));
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
// 1) initial preference: URL > prefers-color-scheme (standalone) > baked-in default
|
|
916
|
+
var url = new URL(window.location.href);
|
|
917
|
+
var fromUrl = url.searchParams.get('theme');
|
|
918
|
+
if (fromUrl === 'light' || fromUrl === 'dark') {
|
|
919
|
+
applyTheme(fromUrl);
|
|
920
|
+
} else if (window.parent === window) {
|
|
921
|
+
var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
922
|
+
applyTheme(prefersDark ? 'dark' : 'light');
|
|
923
|
+
} else {
|
|
924
|
+
applyTheme(${JSON.stringify(initial)});
|
|
925
|
+
}
|
|
926
|
+
// 2) live updates from parent deck
|
|
927
|
+
window.addEventListener('message', function (e) {
|
|
928
|
+
if (e.data && e.data.type === 'deck-theme') applyTheme(e.data.theme);
|
|
929
|
+
});
|
|
930
|
+
// 3) tell parent we are ready so it can push the current theme back
|
|
931
|
+
if (window.parent !== window) {
|
|
932
|
+
window.parent.postMessage({ type: 'deck-iframe-ready' }, '*');
|
|
933
|
+
}
|
|
934
|
+
})();
|
|
935
|
+
</script>`;
|
|
936
|
+
}
|
|
937
|
+
function renderWired(body, initialTheme, title) {
|
|
938
|
+
const LIGHT = { bg: "#ffffff", fg: "#18181b", accent: "#7c3aed", cardBg: "#ffffff" };
|
|
939
|
+
const DARK = { bg: "#0e0e10", fg: "#e4e4e7", accent: "#a78bfa", cardBg: "#1a1a1d" };
|
|
940
|
+
const wiredVarsBlock = (vars) => `
|
|
941
|
+
--wired-card-background-fill: ${vars.cardBg};
|
|
942
|
+
--wired-button-color: ${vars.fg};
|
|
943
|
+
--wired-combo-popup-bg: ${vars.cardBg};
|
|
944
|
+
--wired-progress-color: ${vars.accent};
|
|
945
|
+
--wired-progress-label-background: ${vars.cardBg};
|
|
946
|
+
--wired-progress-label-color: ${vars.fg};
|
|
947
|
+
`;
|
|
948
|
+
return `<!DOCTYPE html>
|
|
949
|
+
<html lang="en" data-theme="${initialTheme}">
|
|
950
|
+
<head>
|
|
951
|
+
<meta charset="utf-8">
|
|
952
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
953
|
+
<title>${title}</title>
|
|
954
|
+
<script type="module" src="${WIRED_CDN}"></script>
|
|
955
|
+
<link href="https://fonts.googleapis.com/css2?family=Gloria+Hallelujah&family=DM+Sans:wght@400;600;700&display=swap" rel="stylesheet">
|
|
956
|
+
<style>
|
|
957
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
958
|
+
html, body {
|
|
959
|
+
margin: 0;
|
|
960
|
+
min-height: 100%;
|
|
961
|
+
font-family: 'Gloria Hallelujah', 'DM Sans', system-ui, sans-serif;
|
|
962
|
+
background: var(--page-bg);
|
|
963
|
+
color: var(--page-fg);
|
|
964
|
+
transition: background 0.15s, color 0.15s;
|
|
965
|
+
}
|
|
966
|
+
body { padding: 24px; }
|
|
967
|
+
h1, h2, h3, h4 { font-family: 'Gloria Hallelujah', cursive; margin: 0.5em 0; color: var(--page-fg); }
|
|
968
|
+
a { color: var(--page-accent); }
|
|
969
|
+
.row { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin: 8px 0; }
|
|
970
|
+
.col { display: flex; flex-direction: column; gap: 12px; align-items: stretch; }
|
|
971
|
+
.card { padding: 16px; }
|
|
972
|
+
|
|
973
|
+
/* Light theme */
|
|
974
|
+
:root[data-theme="light"] {
|
|
975
|
+
--page-bg: ${LIGHT.bg};
|
|
976
|
+
--page-fg: ${LIGHT.fg};
|
|
977
|
+
--page-accent: ${LIGHT.accent};
|
|
978
|
+
${wiredVarsBlock(LIGHT)}
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
/* Dark theme */
|
|
982
|
+
:root[data-theme="dark"] {
|
|
983
|
+
--page-bg: ${DARK.bg};
|
|
984
|
+
--page-fg: ${DARK.fg};
|
|
985
|
+
--page-accent: ${DARK.accent};
|
|
986
|
+
${wiredVarsBlock(DARK)}
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
/* Hosts: text color inherits via component "color: inherit" rules.
|
|
990
|
+
Transparent background lets the page bg show through where the
|
|
991
|
+
rough.js rectangle leaves space. */
|
|
992
|
+
wired-button, wired-card, wired-checkbox, wired-radio, wired-toggle,
|
|
993
|
+
wired-input, wired-textarea, wired-search-input, wired-combo, wired-item,
|
|
994
|
+
wired-listbox, wired-link, wired-tabs, wired-tab, wired-fab,
|
|
995
|
+
wired-icon-button, wired-divider, wired-progress, wired-slider,
|
|
996
|
+
wired-calendar, wired-dialog {
|
|
997
|
+
color: var(--page-fg);
|
|
998
|
+
background: transparent;
|
|
999
|
+
}
|
|
1000
|
+
</style>
|
|
1001
|
+
</head>
|
|
1002
|
+
<body>
|
|
1003
|
+
${body}
|
|
1004
|
+
${themeResolverScript(initialTheme)}
|
|
1005
|
+
<script type="module">
|
|
1006
|
+
// wired-input / wired-textarea / wired-search-input render their native
|
|
1007
|
+
// <input>/<textarea> INSIDE shadow DOM. Outer CSS cannot reach those, and
|
|
1008
|
+
// the native control has appearance:auto which the UA repaints over any
|
|
1009
|
+
// "background: transparent" rule. We must set inline styles directly on
|
|
1010
|
+
// the inner element with !important.
|
|
1011
|
+
//
|
|
1012
|
+
// We register one applier per theme. Re-runs when theme changes or new
|
|
1013
|
+
// nodes are added so the page reacts live to the deck sun/moon toggle.
|
|
1014
|
+
const FG = { light: ${JSON.stringify(LIGHT.fg)}, dark: ${JSON.stringify(DARK.fg)} };
|
|
1015
|
+
const TAGS = ['wired-input', 'wired-textarea', 'wired-search-input'];
|
|
1016
|
+
const DARK_PROPS = [
|
|
1017
|
+
'appearance', '-webkit-appearance',
|
|
1018
|
+
'background', 'background-color',
|
|
1019
|
+
'color', '-webkit-text-fill-color', 'caret-color',
|
|
1020
|
+
'border', 'outline',
|
|
1021
|
+
];
|
|
1022
|
+
|
|
1023
|
+
function applyDark(node) {
|
|
1024
|
+
const s = node.style;
|
|
1025
|
+
s.setProperty('appearance', 'none', 'important');
|
|
1026
|
+
s.setProperty('-webkit-appearance', 'none', 'important');
|
|
1027
|
+
s.setProperty('background', 'transparent', 'important');
|
|
1028
|
+
s.setProperty('background-color', 'transparent', 'important');
|
|
1029
|
+
s.setProperty('color', FG.dark, 'important');
|
|
1030
|
+
s.setProperty('-webkit-text-fill-color', FG.dark, 'important');
|
|
1031
|
+
s.setProperty('caret-color', FG.dark, 'important');
|
|
1032
|
+
s.setProperty('border', 'none', 'important');
|
|
1033
|
+
s.setProperty('outline', 'none', 'important');
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
function applyLight(node) {
|
|
1037
|
+
DARK_PROPS.forEach((p) => node.style.removeProperty(p));
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
function placeholderStyle(host, theme) {
|
|
1041
|
+
const existing = host.shadowRoot.querySelector('style[data-deck-theme]');
|
|
1042
|
+
if (existing) existing.remove();
|
|
1043
|
+
if (theme !== 'dark') return;
|
|
1044
|
+
const style = document.createElement('style');
|
|
1045
|
+
style.dataset.deckTheme = '1';
|
|
1046
|
+
style.textContent =
|
|
1047
|
+
'::placeholder{color:' + FG.dark + '99 !important;' +
|
|
1048
|
+
'-webkit-text-fill-color:' + FG.dark + '99 !important;}';
|
|
1049
|
+
host.shadowRoot.appendChild(style);
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
function sweepOnce() {
|
|
1053
|
+
const theme = document.documentElement.dataset.theme;
|
|
1054
|
+
for (const tag of TAGS) {
|
|
1055
|
+
for (const host of document.querySelectorAll(tag)) {
|
|
1056
|
+
if (!host.shadowRoot) continue;
|
|
1057
|
+
const inner = host.shadowRoot.querySelector('input, textarea');
|
|
1058
|
+
if (!inner) continue;
|
|
1059
|
+
if (theme === 'dark') applyDark(inner);
|
|
1060
|
+
else applyLight(inner);
|
|
1061
|
+
placeholderStyle(host, theme);
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
// Initial + late-upgrade catch (CDN script loads async).
|
|
1067
|
+
sweepOnce();
|
|
1068
|
+
let elapsed = 0;
|
|
1069
|
+
function tick() {
|
|
1070
|
+
sweepOnce();
|
|
1071
|
+
elapsed += 100;
|
|
1072
|
+
if (elapsed < 3000) setTimeout(tick, 100);
|
|
1073
|
+
}
|
|
1074
|
+
setTimeout(tick, 100);
|
|
1075
|
+
|
|
1076
|
+
// Re-sweep on theme change.
|
|
1077
|
+
document.addEventListener('deck-theme', sweepOnce);
|
|
1078
|
+
// Re-sweep when new nodes are added.
|
|
1079
|
+
new MutationObserver(sweepOnce).observe(document.body, { subtree: true, childList: true });
|
|
1080
|
+
|
|
1081
|
+
// whenDefined fires when each tag is registered \u2014 allSettled-style, never hangs.
|
|
1082
|
+
TAGS.forEach((tag) => {
|
|
1083
|
+
customElements.whenDefined(tag).then(sweepOnce).catch(() => {});
|
|
1084
|
+
});
|
|
1085
|
+
</script>
|
|
1086
|
+
</body>
|
|
1087
|
+
</html>`;
|
|
1088
|
+
}
|
|
1089
|
+
function renderReveal(content, initialTheme, title) {
|
|
1090
|
+
const slides = content.includes("<section") ? content : content.split(/\n\s*---\s*\n/).map((md) => `<section data-markdown><textarea data-template>
|
|
1091
|
+
${md.trim()}
|
|
1092
|
+
</textarea></section>`).join("\n");
|
|
1093
|
+
return `<!DOCTYPE html>
|
|
1094
|
+
<html lang="en" data-theme="${initialTheme}">
|
|
1095
|
+
<head>
|
|
1096
|
+
<meta charset="utf-8">
|
|
1097
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
1098
|
+
<title>${title}</title>
|
|
1099
|
+
<link rel="stylesheet" href="${REVEAL_CSS}">
|
|
1100
|
+
<link id="reveal-theme-light" rel="stylesheet" href="${REVEAL_THEME("light")}" ${initialTheme === "dark" ? "disabled" : ""}>
|
|
1101
|
+
<link id="reveal-theme-dark" rel="stylesheet" href="${REVEAL_THEME("dark")}" ${initialTheme === "dark" ? "" : "disabled"}>
|
|
1102
|
+
<style>
|
|
1103
|
+
html, body { margin: 0; height: 100%; }
|
|
1104
|
+
.reveal .slides { text-align: left; }
|
|
1105
|
+
.reveal .slides section { padding: 0 32px; }
|
|
1106
|
+
</style>
|
|
1107
|
+
</head>
|
|
1108
|
+
<body>
|
|
1109
|
+
<div class="reveal">
|
|
1110
|
+
<div class="slides">
|
|
1111
|
+
${slides}
|
|
1112
|
+
</div>
|
|
1113
|
+
</div>
|
|
1114
|
+
<script src="${REVEAL_JS}"></script>
|
|
1115
|
+
<script src="${REVEAL_MD}"></script>
|
|
1116
|
+
<script src="${REVEAL_HL}"></script>
|
|
1117
|
+
<script src="${REVEAL_NOTES}"></script>
|
|
1118
|
+
<script>
|
|
1119
|
+
Reveal.initialize({
|
|
1120
|
+
hash: true,
|
|
1121
|
+
slideNumber: 'c/t',
|
|
1122
|
+
controls: true,
|
|
1123
|
+
progress: true,
|
|
1124
|
+
transition: 'slide',
|
|
1125
|
+
plugins: [RevealMarkdown, RevealHighlight, RevealNotes],
|
|
1126
|
+
});
|
|
1127
|
+
// React to theme changes: flip which stylesheet is enabled.
|
|
1128
|
+
function syncRevealTheme() {
|
|
1129
|
+
var dark = document.documentElement.dataset.theme === 'dark';
|
|
1130
|
+
var lightLink = document.getElementById('reveal-theme-light');
|
|
1131
|
+
var darkLink = document.getElementById('reveal-theme-dark');
|
|
1132
|
+
if (lightLink) lightLink.disabled = dark;
|
|
1133
|
+
if (darkLink) darkLink.disabled = !dark;
|
|
1134
|
+
}
|
|
1135
|
+
document.addEventListener('deck-theme', syncRevealTheme);
|
|
1136
|
+
syncRevealTheme();
|
|
1137
|
+
</script>
|
|
1138
|
+
${themeResolverScript(initialTheme)}
|
|
1139
|
+
</body>
|
|
1140
|
+
</html>`;
|
|
1141
|
+
}
|
|
1142
|
+
function escapeHtml(s) {
|
|
1143
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
1144
|
+
}
|
|
1145
|
+
function slugify(label) {
|
|
1146
|
+
return label.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "block";
|
|
1147
|
+
}
|
|
1148
|
+
|
|
884
1149
|
// src/server/deck-serve.ts
|
|
885
1150
|
var DEFAULT_PORT = 52829;
|
|
886
1151
|
var MAX_PORT_SCAN = 3;
|
|
@@ -1063,6 +1328,29 @@ async function startDeckServer(opts = {}) {
|
|
|
1063
1328
|
console.error("Failed to generate blast radius HTML:", err);
|
|
1064
1329
|
}
|
|
1065
1330
|
}
|
|
1331
|
+
if (block.type === "rich-html" && block.content) {
|
|
1332
|
+
try {
|
|
1333
|
+
const html = renderRichHtml({
|
|
1334
|
+
framework: block.framework ?? "raw",
|
|
1335
|
+
content: block.content,
|
|
1336
|
+
theme: block.theme,
|
|
1337
|
+
title: block.label
|
|
1338
|
+
});
|
|
1339
|
+
const sessionEncoded = encodeURIComponent(body.session);
|
|
1340
|
+
const baseUrl = `/deck-files/${sessionEncoded}`;
|
|
1341
|
+
const filename = `${slugify(block.label)}.html`;
|
|
1342
|
+
const dir = import_node_path3.default.join(cwd, ".launchsecure", "deck-files", body.session);
|
|
1343
|
+
import_node_fs3.default.mkdirSync(dir, { recursive: true });
|
|
1344
|
+
import_node_fs3.default.writeFileSync(import_node_path3.default.join(dir, filename), html);
|
|
1345
|
+
block.type = "iframe";
|
|
1346
|
+
block.src = `${baseUrl}/${filename}`;
|
|
1347
|
+
delete block.content;
|
|
1348
|
+
delete block.framework;
|
|
1349
|
+
delete block.theme;
|
|
1350
|
+
} catch (err) {
|
|
1351
|
+
console.error("Failed to generate rich-html:", err);
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1066
1354
|
}
|
|
1067
1355
|
broadcastToClients({
|
|
1068
1356
|
type: "session",
|
package/dist/server/fb-wizard.js
CHANGED
|
File without changes
|
|
@@ -40,6 +40,14 @@
|
|
|
40
40
|
name: (identifier) @http_export_fn
|
|
41
41
|
(#match? @http_export_fn "^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)$")))
|
|
42
42
|
|
|
43
|
+
; export const { GET, POST } = handlers (Auth.js v5 / NextAuth pattern)
|
|
44
|
+
(export_statement
|
|
45
|
+
declaration: (lexical_declaration
|
|
46
|
+
(variable_declarator
|
|
47
|
+
name: (object_pattern
|
|
48
|
+
(shorthand_property_identifier_pattern) @http_export
|
|
49
|
+
(#match? @http_export "^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)$")))))
|
|
50
|
+
|
|
43
51
|
; Detect Next.js Server Action directive: 'use server' at file top.
|
|
44
52
|
; Tree-sitter represents the directive as an expression_statement whose only
|
|
45
53
|
; child is a string literal — and it must be at program level.
|
|
@@ -31,6 +31,13 @@
|
|
|
31
31
|
(variable_declarator
|
|
32
32
|
name: (identifier) @export.named.const)))
|
|
33
33
|
|
|
34
|
+
; export const { Foo, Bar } = ... (destructured re-export — Auth.js v5 pattern)
|
|
35
|
+
(export_statement
|
|
36
|
+
declaration: (lexical_declaration
|
|
37
|
+
(variable_declarator
|
|
38
|
+
name: (object_pattern
|
|
39
|
+
(shorthand_property_identifier_pattern) @export.named.const))))
|
|
40
|
+
|
|
34
41
|
; export type Foo = ...
|
|
35
42
|
(export_statement
|
|
36
43
|
declaration: (type_alias_declaration
|