@sgummalla-works/sketchon 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +40 -4
  2. package/dist/adapters/assets.browser.d.ts +4 -0
  3. package/dist/adapters/assets.browser.d.ts.map +1 -0
  4. package/dist/adapters/assets.browser.js +64 -0
  5. package/dist/adapters/assets.browser.js.map +1 -0
  6. package/dist/adapters/assets.d.ts +34 -0
  7. package/dist/adapters/assets.d.ts.map +1 -0
  8. package/dist/adapters/assets.js +36 -0
  9. package/dist/adapters/assets.js.map +1 -0
  10. package/dist/adapters/assets.node.d.ts +4 -0
  11. package/dist/adapters/assets.node.d.ts.map +1 -0
  12. package/dist/adapters/assets.node.js +16 -0
  13. package/dist/adapters/assets.node.js.map +1 -0
  14. package/dist/adapters/baseline.d.ts.map +1 -1
  15. package/dist/adapters/baseline.js +9 -7
  16. package/dist/adapters/baseline.js.map +1 -1
  17. package/dist/adapters/elk.d.ts.map +1 -1
  18. package/dist/adapters/elk.js +11 -9
  19. package/dist/adapters/elk.js.map +1 -1
  20. package/dist/adapters/emoji-code.d.ts +8 -0
  21. package/dist/adapters/emoji-code.d.ts.map +1 -0
  22. package/dist/adapters/emoji-code.js +41 -0
  23. package/dist/adapters/emoji-code.js.map +1 -0
  24. package/dist/adapters/emoji.d.ts +2 -4
  25. package/dist/adapters/emoji.d.ts.map +1 -1
  26. package/dist/adapters/emoji.js +8 -34
  27. package/dist/adapters/emoji.js.map +1 -1
  28. package/dist/adapters/fonts.d.ts +3 -8
  29. package/dist/adapters/fonts.d.ts.map +1 -1
  30. package/dist/adapters/fonts.js +7 -4
  31. package/dist/adapters/fonts.js.map +1 -1
  32. package/dist/adapters/satori.d.ts.map +1 -1
  33. package/dist/adapters/satori.js +36 -33
  34. package/dist/adapters/satori.js.map +1 -1
  35. package/dist/adapters/sequence.d.ts.map +1 -1
  36. package/dist/adapters/sequence.js +19 -13
  37. package/dist/adapters/sequence.js.map +1 -1
  38. package/dist/adapters/svg.d.ts +7 -6
  39. package/dist/adapters/svg.d.ts.map +1 -1
  40. package/dist/adapters/svg.js +12 -11
  41. package/dist/adapters/svg.js.map +1 -1
  42. package/dist/composition.d.ts +54 -0
  43. package/dist/composition.d.ts.map +1 -0
  44. package/dist/composition.js +68 -0
  45. package/dist/composition.js.map +1 -0
  46. package/dist/constants.d.ts +3 -0
  47. package/dist/constants.d.ts.map +1 -1
  48. package/dist/constants.js +12 -0
  49. package/dist/constants.js.map +1 -1
  50. package/dist/domain/theme.d.ts +26 -0
  51. package/dist/domain/theme.d.ts.map +1 -1
  52. package/dist/domain/theme.js +52 -0
  53. package/dist/domain/theme.js.map +1 -1
  54. package/dist/index.browser.d.ts +15 -0
  55. package/dist/index.browser.d.ts.map +1 -0
  56. package/dist/index.browser.js +19 -0
  57. package/dist/index.browser.js.map +1 -0
  58. package/dist/index.d.ts +13 -55
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +18 -76
  61. package/dist/index.js.map +1 -1
  62. package/dist/ports/AssetProvider.d.ts +45 -0
  63. package/dist/ports/AssetProvider.d.ts.map +1 -0
  64. package/dist/ports/AssetProvider.js +14 -0
  65. package/dist/ports/AssetProvider.js.map +1 -0
  66. package/package.json +16 -4
@@ -1 +1 @@
1
- {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/adapters/svg.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../src/adapters/svg.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAqB,MAAM,oBAAoB,CAAC;AAEpE,yEAAyE;AACzE,MAAM,UAAU,GAAG,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,QAAQ,GAAG,oBAAoB;IAC7E,OAAO,IAAI,CAAC,MAAM,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AACpD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,QAAgB,EAAE,QAAQ,GAAG,oBAAoB;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,IAAI,IAAI,IAAI,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAqE;IACvF,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/D,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAChE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/D,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC9D,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/D,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;CACjE,CAAC;AAEF,mFAAmF;AACnF,MAAM,UAAU,OAAO,CAAC,QAA8B,EAAE,QAAsB,WAAW;IACvF,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,SAAS,CAAC,QAAsB,WAAW;IACzD,OAAO;;yCAEgC,KAAK,CAAC,KAAK;;;qDAGC,KAAK,CAAC,KAAK;;QAExD,CAAC;AACT,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,MAAc,EAAE,IAAY,EAAE,QAAsB,WAAW;IACxG,OAAO,kDAAkD,KAAK,aAAa,MAAM,kBAAkB,KAAK,IAAI,MAAM;2BACzF,KAAK,aAAa,MAAM,WAAW,KAAK,CAAC,EAAE;EACpE,SAAS,CAAC,KAAK,CAAC;EAChB,IAAI;OACC,CAAC;AACR,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Shared COMPOSITION ROOT — wires the engine registry + router and re-exports
3
+ * the environment-agnostic public API.
4
+ *
5
+ * ── HEXAGONAL ARCHITECTURE — COMPOSITION ROOT RULES ──────────────────────────
6
+ * This module (together with the thin entry points that import it) is the ONLY
7
+ * place that may import concrete adapters. All other application/domain files
8
+ * stay free of adapter imports — enforced by the architecture guard tests
9
+ * (src/application/architecture.test.ts).
10
+ *
11
+ * Dependency flow (all arrows point inward):
12
+ * adapters/ ──► application/ ──► domain/
13
+ * adapters/ ──► ports/
14
+ *
15
+ * It deliberately does NOT bind an AssetProvider. Each entry point binds the
16
+ * one for its environment:
17
+ * - index.ts → Node: disk-backed provider
18
+ * - index.browser.ts → browser: fetch-backed provider
19
+ * Keeping the binding out of here is what lets the browser entry stay free of
20
+ * any `node:` import.
21
+ */
22
+ export * from './domain/spec.js';
23
+ export * from './domain/validate.js';
24
+ export * from './domain/theme.js';
25
+ export type { Technique, RenderResult, PlacedBox, PlacedEdge, StructuralFeatures, } from './ports/Technique.js';
26
+ export type { AssetProvider, SketchonFont } from './ports/AssetProvider.js';
27
+ export { TechniqueRegistry } from './application/registry.js';
28
+ export { type EngineKey } from './application/router.js';
29
+ export * from './constants.js';
30
+ export { esc, estimateTextWidth, wrapText, palette, PALETTE, arrowDefs, svgDocument, } from './adapters/svg.js';
31
+ export { emojiCode } from './adapters/emoji-code.js';
32
+ export { configureAssets, setAssetProvider } from './adapters/assets.js';
33
+ export { satoriTechnique } from './adapters/satori.js';
34
+ export { elkTechnique } from './adapters/elk.js';
35
+ export { sequenceTechnique } from './adapters/sequence.js';
36
+ export { baselineTechnique } from './adapters/baseline.js';
37
+ import { TechniqueRegistry } from './application/registry.js';
38
+ /**
39
+ * The application-wide registry, pre-populated with all built-in engines.
40
+ * Consumers may call `.register()` to add custom engines.
41
+ */
42
+ export declare const REGISTRY: TechniqueRegistry;
43
+ /** All registered techniques — used by the lab harness. */
44
+ export declare const TECHNIQUES: import("./ports/Technique.js").Technique[];
45
+ /** Select the engine key that would render a spec (logging / debugging). */
46
+ export declare const selectEngineKey: (spec: import("./domain/spec.js").DiagramSpec) => import("./application/router.js").EngineKey;
47
+ /** Resolve the Technique that will render a spec. */
48
+ export declare const selectEngine: (spec: import("./domain/spec.js").DiagramSpec) => import("./ports/Technique.js").Technique;
49
+ /**
50
+ * Production render entry point. Validates routing and delegates to the chosen
51
+ * layout engine. Fonts + emoji come from the entry-bound AssetProvider.
52
+ */
53
+ export declare const renderDiagram: (spec: import("./domain/spec.js").DiagramSpec) => import("./ports/Technique.js").RenderResult | Promise<import("./ports/Technique.js").RenderResult>;
54
+ //# sourceMappingURL=composition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAGlC,YAAY,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,UAAU,EACV,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,GAAG,EACH,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGzE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAO9D;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,iBAImB,CAAC;AAI3C,2DAA2D;AAC3D,eAAO,MAAM,UAAU,4CAAwB,CAAC;AAEhD,4EAA4E;AAC5E,eAAO,MAAM,eAAe,+FAAsC,CAAC;AAEnE,qDAAqD;AACrD,eAAO,MAAM,YAAY,4FAAmC,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,aAAa,sJAAoC,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Shared COMPOSITION ROOT — wires the engine registry + router and re-exports
3
+ * the environment-agnostic public API.
4
+ *
5
+ * ── HEXAGONAL ARCHITECTURE — COMPOSITION ROOT RULES ──────────────────────────
6
+ * This module (together with the thin entry points that import it) is the ONLY
7
+ * place that may import concrete adapters. All other application/domain files
8
+ * stay free of adapter imports — enforced by the architecture guard tests
9
+ * (src/application/architecture.test.ts).
10
+ *
11
+ * Dependency flow (all arrows point inward):
12
+ * adapters/ ──► application/ ──► domain/
13
+ * adapters/ ──► ports/
14
+ *
15
+ * It deliberately does NOT bind an AssetProvider. Each entry point binds the
16
+ * one for its environment:
17
+ * - index.ts → Node: disk-backed provider
18
+ * - index.browser.ts → browser: fetch-backed provider
19
+ * Keeping the binding out of here is what lets the browser entry stay free of
20
+ * any `node:` import.
21
+ */
22
+ // ── Domain (pure — zero external deps) ───────────────────────────────────────
23
+ export * from './domain/spec.js';
24
+ export * from './domain/validate.js';
25
+ export * from './domain/theme.js';
26
+ // ── Application (registry + router — no adapter imports) ──────────────────────
27
+ export { TechniqueRegistry } from './application/registry.js';
28
+ export {} from './application/router.js';
29
+ // ── Constants + shared render helpers ────────────────────────────────────────
30
+ export * from './constants.js';
31
+ export { esc, estimateTextWidth, wrapText, palette, PALETTE, arrowDefs, svgDocument, } from './adapters/svg.js';
32
+ // ── Browser-safe helpers + the public asset-injection point ───────────────────
33
+ export { emojiCode } from './adapters/emoji-code.js';
34
+ export { configureAssets, setAssetProvider } from './adapters/assets.js';
35
+ // ── Concrete adapters (exported for advanced use + the lab) ───────────────────
36
+ export { satoriTechnique } from './adapters/satori.js';
37
+ export { elkTechnique } from './adapters/elk.js';
38
+ export { sequenceTechnique } from './adapters/sequence.js';
39
+ export { baselineTechnique } from './adapters/baseline.js';
40
+ // ── Registry + router wiring ──────────────────────────────────────────────────
41
+ import { TechniqueRegistry } from './application/registry.js';
42
+ import { Router } from './application/router.js';
43
+ import { satoriTechnique } from './adapters/satori.js';
44
+ import { elkTechnique } from './adapters/elk.js';
45
+ import { sequenceTechnique } from './adapters/sequence.js';
46
+ import { baselineTechnique } from './adapters/baseline.js';
47
+ /**
48
+ * The application-wide registry, pre-populated with all built-in engines.
49
+ * Consumers may call `.register()` to add custom engines.
50
+ */
51
+ export const REGISTRY = new TechniqueRegistry()
52
+ .register('baseline', baselineTechnique)
53
+ .register('satori', satoriTechnique)
54
+ .register('elk', elkTechnique)
55
+ .register('sequence', sequenceTechnique);
56
+ const router = new Router(REGISTRY);
57
+ /** All registered techniques — used by the lab harness. */
58
+ export const TECHNIQUES = REGISTRY.techniques();
59
+ /** Select the engine key that would render a spec (logging / debugging). */
60
+ export const selectEngineKey = router.selectEngineKey.bind(router);
61
+ /** Resolve the Technique that will render a spec. */
62
+ export const selectEngine = router.selectEngine.bind(router);
63
+ /**
64
+ * Production render entry point. Validates routing and delegates to the chosen
65
+ * layout engine. Fonts + emoji come from the entry-bound AssetProvider.
66
+ */
67
+ export const renderDiagram = router.renderDiagram.bind(router);
68
+ //# sourceMappingURL=composition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.js","sourceRoot":"","sources":["../src/composition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,gFAAgF;AAChF,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAYlC,iFAAiF;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAkB,MAAM,yBAAyB,CAAC;AAEzD,gFAAgF;AAChF,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,GAAG,EACH,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,iFAAiF;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEzE,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,iFAAiF;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAsB,IAAI,iBAAiB,EAAE;KAC/D,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;KACvC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;KACnC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;KAC7B,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAE3C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;AAEhD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEnE,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAE7D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC"}
@@ -16,6 +16,9 @@ export declare const NODE_MAX_WIDTH = 240;
16
16
  export declare const LAYER_GAP = 90;
17
17
  export declare const NODE_GAP = 36;
18
18
  export declare const CANVAS_PADDING = 40;
19
+ export declare const INTER_FONT_CDN_BASE = "https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.1/files";
20
+ export declare const INTER_FONT_WEIGHTS: readonly [400, 600, 700];
21
+ export declare const TWEMOJI_SVG_CDN_BASE = "https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg";
19
22
  export declare const SCORE_START = 100;
20
23
  export declare const PENALTY_PER_OVERLAP_PAIR = 12;
21
24
  export declare const PENALTY_PER_OFFCANVAS_BOX = 10;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAGvC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,cAAc,MAAM,CAAC;AAGlC,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,cAAc,KAAK,CAAC;AAKjC,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,0BAA0B,IAAI,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAGvC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,cAAc,MAAM,CAAC;AAGlC,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,cAAc,KAAK,CAAC;AASjC,eAAO,MAAM,mBAAmB,+DAA+D,CAAC;AAChG,eAAO,MAAM,kBAAkB,0BAA2B,CAAC;AAG3D,eAAO,MAAM,oBAAoB,kEAAkE,CAAC;AAKpG,eAAO,MAAM,WAAW,MAAM,CAAC;AAC/B,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,0BAA0B,IAAI,CAAC"}
package/dist/constants.js CHANGED
@@ -23,6 +23,18 @@ export const NODE_MAX_WIDTH = 240;
23
23
  export const LAYER_GAP = 90; // gap between layers (rank direction)
24
24
  export const NODE_GAP = 36; // gap between siblings within a layer
25
25
  export const CANVAS_PADDING = 40; // margin around the whole drawing
26
+ // ── Browser asset sources (CDN) ─────────────────────────────────────────────
27
+ // The browser AssetProvider has no disk, so it fetches the same assets the Node
28
+ // provider reads from `assets/`. Pinned to specific versions so a CDN change
29
+ // cannot silently alter rendering. Consumers go fully offline by injecting
30
+ // bundled fonts via `configureAssets()`.
31
+ // - @fontsource ships Satori-compatible `.woff` (NOT `.woff2`, which Satori
32
+ // cannot decode); file names follow `inter-latin-<weight>-normal.woff`.
33
+ export const INTER_FONT_CDN_BASE = 'https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.1/files';
34
+ export const INTER_FONT_WEIGHTS = [400, 600, 700];
35
+ // jdecked's maintained Twemoji fork — shared by the Node disk provider and the
36
+ // browser fetch provider so the asset code is derived identically.
37
+ export const TWEMOJI_SVG_CDN_BASE = 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg';
26
38
  // ── Eval thresholds + scoring weights ───────────────────────────────────────
27
39
  // Composite score starts at 100; each problem subtracts its weight (clamped
28
40
  // at 0). Weights encode "how bad is this for a reader."
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+EAA+E;AAC/E,4EAA4E;AAC5E,gFAAgF;AAChF,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,sCAAsC;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,sCAAsC;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,kCAAkC;AAEpE,+EAA+E;AAC/E,4EAA4E;AAC5E,wDAAwD;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC/B,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC,CAAC,+BAA+B;AAC3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC,CAAC,0BAA0B;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,CAAC,2BAA2B;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,CAAC,qBAAqB;AACjE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,CAAC,4BAA4B"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+EAA+E;AAC/E,4EAA4E;AAC5E,gFAAgF;AAChF,2EAA2E;AAC3E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,sCAAsC;AACnE,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,sCAAsC;AAClE,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,kCAAkC;AAEpE,+EAA+E;AAC/E,gFAAgF;AAChF,6EAA6E;AAC7E,2EAA2E;AAC3E,yCAAyC;AACzC,8EAA8E;AAC9E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,4DAA4D,CAAC;AAChG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAC3D,+EAA+E;AAC/E,mEAAmE;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,+DAA+D,CAAC;AAEpG,+EAA+E;AAC/E,4EAA4E;AAC5E,wDAAwD;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC/B,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC,CAAC,+BAA+B;AAC3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC,CAAC,0BAA0B;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,CAAC,2BAA2B;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,CAAC,qBAAqB;AACjE,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,CAAC,4BAA4B"}
@@ -65,4 +65,30 @@ export declare const CHECKPOINT_TEXT = "#ffd98a";
65
65
  export declare const CONNECTOR_COLOR = "#cbd5e1";
66
66
  export declare const ARROW_FILL = "#475569";
67
67
  export declare const ARROW_STROKE = "#475569";
68
+ import type { Emphasis } from './spec.js';
69
+ /** The resolved colour set for one render, selected from `spec.theme.mode`. */
70
+ export interface DiagramTheme {
71
+ mode: 'light' | 'dark';
72
+ bg: string;
73
+ textPrimary: string;
74
+ textBody: string;
75
+ textMuted: string;
76
+ textWhite: string;
77
+ borderLight: string;
78
+ borderDefault: string;
79
+ edgeDefault: string;
80
+ edgeDashed: string;
81
+ connector: string;
82
+ arrow: string;
83
+ /** Node fill + border per emphasis. `text` is always the mono colour. */
84
+ palette: Record<Emphasis, {
85
+ fill: string;
86
+ stroke: string;
87
+ text: string;
88
+ }>;
89
+ }
90
+ export declare const LIGHT_THEME: DiagramTheme;
91
+ export declare const DARK_THEME: DiagramTheme;
92
+ /** Resolve the colour set for a render. Defaults to light when unset. */
93
+ export declare function resolveTheme(mode: 'light' | 'dark' | undefined): DiagramTheme;
68
94
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/domain/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,eAAO,MAAM,kBAAkB,YAAe,CAAC;AAC/C,eAAO,MAAM,eAAe,YAAkB,CAAC;AAC/C,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAC/C,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAE/C,eAAO,MAAM,kBAAkB,YAAe,CAAC;AAC/C,eAAO,MAAM,oBAAoB,YAAa,CAAC;AAC/C,eAAO,MAAM,kBAAkB,YAAe,CAAC;AAC/C,eAAO,MAAM,iBAAiB,YAAgB,CAAC;AAI/C,eAAO,MAAM,cAAc;;;;CAAoE,CAAC;AAChG,eAAO,MAAM,eAAe;;;;CAA0D,CAAC;AACvF,eAAO,MAAM,cAAc;;;;CAA2D,CAAC;AACvF,eAAO,MAAM,aAAa;;;;CAA4D,CAAC;AACvF,eAAO,MAAM,cAAc;;;;CAA2D,CAAC;AACvF,eAAO,MAAM,eAAe;;;;CAA0D,CAAC;AAGvF,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,WAAW,YAAa,CAAC;AACtC,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,WAAW,YAAa,CAAC;AACtC,eAAO,MAAM,WAAW,YAAa,CAAC;AACtC,eAAO,MAAM,UAAU,YAAc,CAAC;AAGtC,eAAO,MAAM,iBAAiB,6EAOpB,CAAC;AAGX,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,YAAa,CAAC;AAC9C,eAAO,MAAM,mBAAmB,YAAa,CAAC;AAC9C,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,YAAa,CAAC;AAC9C,eAAO,MAAM,kBAAkB,YAAc,CAAC;AAG9C,eAAO,MAAM,eAAe,YAAc,CAAC;AAC3C,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,eAAO,MAAM,eAAe,YAAc,CAAC;AAG3C,eAAO,MAAM,eAAe,YAAY,CAAC;AAGzC,eAAO,MAAM,UAAU,YAAc,CAAC;AACtC,eAAO,MAAM,YAAY,YAAY,CAAC"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/domain/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,eAAO,MAAM,kBAAkB,YAAe,CAAC;AAC/C,eAAO,MAAM,eAAe,YAAkB,CAAC;AAC/C,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAC/C,eAAO,MAAM,gBAAgB,YAAiB,CAAC;AAE/C,eAAO,MAAM,kBAAkB,YAAe,CAAC;AAC/C,eAAO,MAAM,oBAAoB,YAAa,CAAC;AAC/C,eAAO,MAAM,kBAAkB,YAAe,CAAC;AAC/C,eAAO,MAAM,iBAAiB,YAAgB,CAAC;AAI/C,eAAO,MAAM,cAAc;;;;CAAoE,CAAC;AAChG,eAAO,MAAM,eAAe;;;;CAA0D,CAAC;AACvF,eAAO,MAAM,cAAc;;;;CAA2D,CAAC;AACvF,eAAO,MAAM,aAAa;;;;CAA4D,CAAC;AACvF,eAAO,MAAM,cAAc;;;;CAA2D,CAAC;AACvF,eAAO,MAAM,eAAe;;;;CAA0D,CAAC;AAGvF,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,WAAW,YAAa,CAAC;AACtC,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,WAAW,YAAa,CAAC;AACtC,eAAO,MAAM,WAAW,YAAa,CAAC;AACtC,eAAO,MAAM,UAAU,YAAc,CAAC;AAGtC,eAAO,MAAM,iBAAiB,6EAOpB,CAAC;AAGX,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,YAAa,CAAC;AAC9C,eAAO,MAAM,mBAAmB,YAAa,CAAC;AAC9C,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,eAAO,MAAM,mBAAmB,YAAa,CAAC;AAC9C,eAAO,MAAM,kBAAkB,YAAc,CAAC;AAG9C,eAAO,MAAM,eAAe,YAAc,CAAC;AAC3C,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAC3C,eAAO,MAAM,eAAe,YAAc,CAAC;AAG3C,eAAO,MAAM,eAAe,YAAY,CAAC;AAGzC,eAAO,MAAM,UAAU,YAAc,CAAC;AACtC,eAAO,MAAM,YAAY,YAAY,CAAC;AAOtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAK1C,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED,eAAO,MAAM,WAAW,EAAE,YAsBzB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,YAsBxB,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAE7E"}
@@ -57,4 +57,56 @@ export const CONNECTOR_COLOR = '#cbd5e1';
57
57
  // ── Arrow markers (graph edges) ───────────────────────────────────────────────
58
58
  export const ARROW_FILL = '#475569'; // filled arrowhead
59
59
  export const ARROW_STROKE = '#475569'; // open arrowhead stroke
60
+ const TEXT_DARK_ON_LIGHT = COLOR_TEXT_PRIMARY; // near-black, light mode
61
+ const TEXT_WHITE_ON_DARK = '#ffffff'; // white, dark mode
62
+ export const LIGHT_THEME = {
63
+ mode: 'light',
64
+ bg: '#ffffff',
65
+ textPrimary: TEXT_DARK_ON_LIGHT,
66
+ textBody: COLOR_TEXT_BODY,
67
+ textMuted: COLOR_TEXT_MUTED,
68
+ textWhite: COLOR_TEXT_WHITE,
69
+ borderLight: COLOR_BORDER_LIGHT, // subtle dividers stay light
70
+ borderDefault: '#1e293b', // lifelines — mono (black-ish) in light mode
71
+ edgeDefault: '#1e293b', // connectors/edges — black in light mode
72
+ edgeDashed: '#475569', // dashed/return edges — a softer mono grey
73
+ connector: '#1e293b', // satori connector — black in light mode
74
+ arrow: '#1e293b', // arrowheads — black in light mode
75
+ // Light pastel fills so black text reads; emphasis lives in fill+border hue.
76
+ palette: {
77
+ normal: { fill: '#f1f5f9', stroke: '#94a3b8', text: TEXT_DARK_ON_LIGHT },
78
+ primary: { fill: '#dbeafe', stroke: '#3b82f6', text: TEXT_DARK_ON_LIGHT },
79
+ accent: { fill: '#ede9fe', stroke: '#8b5cf6', text: TEXT_DARK_ON_LIGHT },
80
+ muted: { fill: '#f8fafc', stroke: '#cbd5e1', text: TEXT_DARK_ON_LIGHT },
81
+ danger: { fill: '#fee2e2', stroke: '#ef4444', text: TEXT_DARK_ON_LIGHT },
82
+ success: { fill: '#dcfce7', stroke: '#22c55e', text: TEXT_DARK_ON_LIGHT },
83
+ },
84
+ };
85
+ export const DARK_THEME = {
86
+ mode: 'dark',
87
+ bg: '#0f172a', // slate-900 — the diagram surface in dark mode
88
+ textPrimary: TEXT_WHITE_ON_DARK,
89
+ textBody: '#cbd5e1', // slate-300 (still monochrome — a lighter shade)
90
+ textMuted: '#94a3b8', // slate-400
91
+ textWhite: TEXT_WHITE_ON_DARK,
92
+ borderLight: '#334155', // subtle dividers (slate-700)
93
+ borderDefault: '#e2e8f0', // lifelines — mono (white-ish) in dark mode
94
+ edgeDefault: '#e2e8f0', // connectors/edges — white in dark mode
95
+ edgeDashed: '#94a3b8', // dashed/return edges — a softer mono grey
96
+ connector: '#e2e8f0', // satori connector — white in dark mode
97
+ arrow: '#e2e8f0', // arrowheads — white in dark mode
98
+ // Dark fills so white text reads; emphasis lives in fill+border hue.
99
+ palette: {
100
+ normal: { fill: '#1e293b', stroke: '#475569', text: TEXT_WHITE_ON_DARK },
101
+ primary: { fill: '#1e3a5f', stroke: '#3b82f6', text: TEXT_WHITE_ON_DARK },
102
+ accent: { fill: '#3730a3', stroke: '#8b5cf6', text: TEXT_WHITE_ON_DARK },
103
+ muted: { fill: '#1e293b', stroke: '#334155', text: TEXT_WHITE_ON_DARK },
104
+ danger: { fill: '#7f1d1d', stroke: '#f87171', text: TEXT_WHITE_ON_DARK },
105
+ success: { fill: '#14532d', stroke: '#4ade80', text: TEXT_WHITE_ON_DARK },
106
+ },
107
+ };
108
+ /** Resolve the colour set for a render. Defaults to light when unset. */
109
+ export function resolveTheme(mode) {
110
+ return mode === 'dark' ? DARK_THEME : LIGHT_THEME;
111
+ }
60
112
  //# sourceMappingURL=theme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/domain/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/domain/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @sgummalla-works/sketchon — BROWSER entry point.
3
+ *
4
+ * Re-exports the shared public API (see composition.ts) and binds the
5
+ * fetch-backed AssetProvider (Inter weights + Twemoji SVGs from a CDN, cached in
6
+ * memory). NO `node:` import is reachable from here, so this entry is safe to
7
+ * bundle for the browser. Bundlers pick it automatically via the package's
8
+ * "browser" export condition.
9
+ *
10
+ * To avoid the network at render time, inject bundled fonts:
11
+ * import { configureAssets } from '@sgummalla-works/sketchon';
12
+ * configureAssets({ loadFonts: () => myBundledInterFaces });
13
+ */
14
+ export * from './composition.js';
15
+ //# sourceMappingURL=index.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @sgummalla-works/sketchon — BROWSER entry point.
3
+ *
4
+ * Re-exports the shared public API (see composition.ts) and binds the
5
+ * fetch-backed AssetProvider (Inter weights + Twemoji SVGs from a CDN, cached in
6
+ * memory). NO `node:` import is reachable from here, so this entry is safe to
7
+ * bundle for the browser. Bundlers pick it automatically via the package's
8
+ * "browser" export condition.
9
+ *
10
+ * To avoid the network at render time, inject bundled fonts:
11
+ * import { configureAssets } from '@sgummalla-works/sketchon';
12
+ * configureAssets({ loadFonts: () => myBundledInterFaces });
13
+ */
14
+ export * from './composition.js';
15
+ // ── Bind the fetch-backed provider as the default for this environment ────────
16
+ import { setAssetProvider } from './adapters/assets.js';
17
+ import { browserAssetProvider } from './adapters/assets.browser.js';
18
+ setAssetProvider(browserAssetProvider);
19
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,kBAAkB,CAAC;AAEjC,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,62 +1,20 @@
1
1
  /**
2
- * @sgummalla-works/sketchon — public API + COMPOSITION ROOT.
2
+ * @sgummalla-works/sketchon — NODE entry point.
3
3
  *
4
- * ── HEXAGONAL ARCHITECTURE COMPOSITION ROOT RULES ──────────────────────────
5
- * This file is the ONLY place in the package that may import concrete adapters.
6
- * All other application/domain files must be free of adapter imports.
7
- * The dependency rules are enforced by architecture guard tests
8
- * (src/application/architecture.test.ts).
4
+ * Re-exports the shared public API (see composition.ts) and binds the
5
+ * disk-backed AssetProvider (bundled Inter fonts + disk-cached Twemoji). This is
6
+ * the default entry for Node + the lab. The browser build is index.browser.ts.
9
7
  *
10
- * Dependency flow (all arrows point inward):
11
- * adapters/ ──► application/ ──► domain/
12
- * adapters/ ──► ports/
13
- * index.ts (composition root) wires all layers together.
14
- *
15
- * ── STABLE PUBLIC API ────────────────────────────────────────────────────────
16
- * renderDiagram(spec) SVG + metadata (auto-routes engine)
17
- * validateSpec(spec) → ValidationIssue[] (pure, zero deps)
18
- * selectEngineKey(spec) → EngineKey
19
- * selectEngine(spec) → Technique
20
- * TECHNIQUES → all registered engines (for the lab)
8
+ * ── STABLE PUBLIC API (shared by both entries) ───────────────────────────────
9
+ * renderDiagram(spec) → SVG + metadata (auto-routes engine)
10
+ * validateSpec(spec) → ValidationIssue[] (pure, zero deps)
11
+ * selectEngineKey(spec) EngineKey
12
+ * selectEngine(spec) → Technique
13
+ * configureAssets(over) → override fonts/emoji (dependency injection)
14
+ * TECHNIQUES all registered engines (for the lab)
21
15
  * DiagramSpec + all spec types
22
16
  */
23
- export * from './domain/spec.js';
24
- export * from './domain/validate.js';
25
- export * from './domain/theme.js';
26
- export type { Technique, RenderResult, PlacedBox, PlacedEdge, StructuralFeatures, } from './ports/Technique.js';
27
- export { TechniqueRegistry } from './application/registry.js';
28
- export { type EngineKey } from './application/router.js';
29
- export * from './constants.js';
30
- export { esc, estimateTextWidth, wrapText, palette, PALETTE, arrowDefs, svgDocument, } from './adapters/svg.js';
17
+ export * from './composition.js';
31
18
  export { loadFonts } from './adapters/fonts.js';
32
- export { emojiToDataUri, emojiCode } from './adapters/emoji.js';
33
- export { satoriTechnique } from './adapters/satori.js';
34
- export { elkTechnique } from './adapters/elk.js';
35
- export { sequenceTechnique } from './adapters/sequence.js';
36
- export { baselineTechnique } from './adapters/baseline.js';
37
- import { TechniqueRegistry } from './application/registry.js';
38
- /**
39
- * The application-wide registry. Pre-populated with all built-in engines.
40
- * Consumers may call `.register()` to add custom engines.
41
- */
42
- export declare const REGISTRY: TechniqueRegistry;
43
- /** All registered techniques — used by the lab harness. */
44
- export declare const TECHNIQUES: import("./ports/Technique.js").Technique[];
45
- /**
46
- * Select the engine key that would render a spec.
47
- * Useful for logging / debugging which engine was chosen.
48
- */
49
- export declare const selectEngineKey: (spec: import("./domain/spec.js").DiagramSpec) => import("./application/router.js").EngineKey;
50
- /**
51
- * Resolve the Technique that will render a spec.
52
- */
53
- export declare const selectEngine: (spec: import("./domain/spec.js").DiagramSpec) => import("./ports/Technique.js").Technique;
54
- /**
55
- * Production render entry point.
56
- * Validates routing and delegates to the chosen layout engine.
57
- *
58
- * @param spec the coordinate-free diagram spec
59
- * @returns the rendered SVG + width/height/metadata
60
- */
61
- export declare const renderDiagram: (spec: import("./domain/spec.js").DiagramSpec) => import("./ports/Technique.js").RenderResult | Promise<import("./ports/Technique.js").RenderResult>;
19
+ export { emojiToDataUri } from './adapters/emoji.js';
62
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAGlC,YAAY,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,UAAU,EACV,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,GAAG,EACH,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAsB,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAQ,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAW,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAK3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAO9D;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,iBAImB,CAAC;AAQ3C,2DAA2D;AAC3D,eAAO,MAAM,UAAU,4CAAwB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,eAAe,+FAAsC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,YAAY,4FAAmC,CAAC;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,sJAAoC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,83 +1,25 @@
1
1
  /**
2
- * @sgummalla-works/sketchon — public API + COMPOSITION ROOT.
2
+ * @sgummalla-works/sketchon — NODE entry point.
3
3
  *
4
- * ── HEXAGONAL ARCHITECTURE COMPOSITION ROOT RULES ──────────────────────────
5
- * This file is the ONLY place in the package that may import concrete adapters.
6
- * All other application/domain files must be free of adapter imports.
7
- * The dependency rules are enforced by architecture guard tests
8
- * (src/application/architecture.test.ts).
4
+ * Re-exports the shared public API (see composition.ts) and binds the
5
+ * disk-backed AssetProvider (bundled Inter fonts + disk-cached Twemoji). This is
6
+ * the default entry for Node + the lab. The browser build is index.browser.ts.
9
7
  *
10
- * Dependency flow (all arrows point inward):
11
- * adapters/ ──► application/ ──► domain/
12
- * adapters/ ──► ports/
13
- * index.ts (composition root) wires all layers together.
14
- *
15
- * ── STABLE PUBLIC API ────────────────────────────────────────────────────────
16
- * renderDiagram(spec) SVG + metadata (auto-routes engine)
17
- * validateSpec(spec) → ValidationIssue[] (pure, zero deps)
18
- * selectEngineKey(spec) → EngineKey
19
- * selectEngine(spec) → Technique
20
- * TECHNIQUES → all registered engines (for the lab)
8
+ * ── STABLE PUBLIC API (shared by both entries) ───────────────────────────────
9
+ * renderDiagram(spec) → SVG + metadata (auto-routes engine)
10
+ * validateSpec(spec) → ValidationIssue[] (pure, zero deps)
11
+ * selectEngineKey(spec) EngineKey
12
+ * selectEngine(spec) → Technique
13
+ * configureAssets(over) → override fonts/emoji (dependency injection)
14
+ * TECHNIQUES all registered engines (for the lab)
21
15
  * DiagramSpec + all spec types
22
16
  */
23
- // ── Domain (pure — zero external deps) ───────────────────────────────────────
24
- export * from './domain/spec.js';
25
- export * from './domain/validate.js';
26
- export * from './domain/theme.js';
27
- // ── Application (registry + router — no adapter imports) ──────────────────────
28
- export { TechniqueRegistry } from './application/registry.js';
29
- export {} from './application/router.js';
30
- // ── Constants + shared render helpers ────────────────────────────────────────
31
- export * from './constants.js';
32
- export { esc, estimateTextWidth, wrapText, palette, PALETTE, arrowDefs, svgDocument, } from './adapters/svg.js';
33
- // ── Node-only loaders (filesystem — not browser-safe) ────────────────────────
17
+ export * from './composition.js';
18
+ // ── Node-only loaders (filesystem — not available in the browser build) ───────
34
19
  export { loadFonts } from './adapters/fonts.js';
35
- export { emojiToDataUri, emojiCode } from './adapters/emoji.js';
36
- // ── Concrete adapters (exported for advanced use + the lab) ───────────────────
37
- export { satoriTechnique } from './adapters/satori.js';
38
- export { elkTechnique } from './adapters/elk.js';
39
- export { sequenceTechnique } from './adapters/sequence.js';
40
- export { baselineTechnique } from './adapters/baseline.js';
41
- // ── COMPOSITION ROOT ──────────────────────────────────────────────────────────
42
- // Wire all adapters into the registry. This is the only place that is allowed
43
- // to import adapters. Everything below is infrastructure glue.
44
- import { TechniqueRegistry } from './application/registry.js';
45
- import { Router } from './application/router.js';
46
- import { satoriTechnique } from './adapters/satori.js';
47
- import { elkTechnique } from './adapters/elk.js';
48
- import { sequenceTechnique } from './adapters/sequence.js';
49
- import { baselineTechnique } from './adapters/baseline.js';
50
- /**
51
- * The application-wide registry. Pre-populated with all built-in engines.
52
- * Consumers may call `.register()` to add custom engines.
53
- */
54
- export const REGISTRY = new TechniqueRegistry()
55
- .register('baseline', baselineTechnique)
56
- .register('satori', satoriTechnique)
57
- .register('elk', elkTechnique)
58
- .register('sequence', sequenceTechnique);
59
- /**
60
- * The application-wide router, wired to the shared registry.
61
- * Exposes the primary use-case functions as bound methods.
62
- */
63
- const router = new Router(REGISTRY);
64
- /** All registered techniques — used by the lab harness. */
65
- export const TECHNIQUES = REGISTRY.techniques();
66
- /**
67
- * Select the engine key that would render a spec.
68
- * Useful for logging / debugging which engine was chosen.
69
- */
70
- export const selectEngineKey = router.selectEngineKey.bind(router);
71
- /**
72
- * Resolve the Technique that will render a spec.
73
- */
74
- export const selectEngine = router.selectEngine.bind(router);
75
- /**
76
- * Production render entry point.
77
- * Validates routing and delegates to the chosen layout engine.
78
- *
79
- * @param spec the coordinate-free diagram spec
80
- * @returns the rendered SVG + width/height/metadata
81
- */
82
- export const renderDiagram = router.renderDiagram.bind(router);
20
+ export { emojiToDataUri } from './adapters/emoji.js';
21
+ // ── Bind the disk-backed provider as the default for this environment ─────────
22
+ import { setAssetProvider } from './adapters/assets.js';
23
+ import { nodeAssetProvider } from './adapters/assets.node.js';
24
+ setAssetProvider(nodeAssetProvider);
83
25
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gFAAgF;AAChF,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAWlC,iFAAiF;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAkB,MAAM,yBAAyB,CAAC;AAEzD,gFAAgF;AAChF,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,GAAG,EACH,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,gFAAgF;AAChF,OAAO,EAAE,SAAS,EAAE,MAAsB,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhE,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,MAAQ,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAW,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,iFAAiF;AACjF,8EAA8E;AAC9E,+DAA+D;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAQ,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAW,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAsB,IAAI,iBAAiB,EAAE;KAC/D,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;KACvC,QAAQ,CAAC,QAAQ,EAAI,eAAe,CAAC;KACrC,QAAQ,CAAC,KAAK,EAAO,YAAY,CAAC;KAClC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;AAEpC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEnE;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,cAAc,kBAAkB,CAAC;AAEjC,iFAAiF;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,gBAAgB,CAAC,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * AssetProvider — the port through which the Satori engine obtains the binary
3
+ * assets it cannot compute: font faces and emoji images.
4
+ *
5
+ * Satori has no filesystem and no font access of its own, so SOMETHING must
6
+ * hand it font bytes and resolve each emoji grapheme to an image. WHERE those
7
+ * bytes come from differs by environment — Node reads them off disk, the
8
+ * browser fetches them — so the source is inverted behind this interface and
9
+ * bound by the composition root (dependency inversion). Consumers may override
10
+ * it via `configureAssets` to supply their own fonts or emoji resolver (e.g. a
11
+ * bundled, fully-offline font set).
12
+ */
13
+ /** A font face handed to Satori. `data` is the raw font-file bytes. */
14
+ export interface SketchonFont {
15
+ /** Font-family name referenced by the rendered CSS (always "Inter" today). */
16
+ name: string;
17
+ /** Raw font bytes — ttf/otf/woff. NOT woff2 (Satori cannot decode it). */
18
+ data: ArrayBuffer | Uint8Array;
19
+ /** Weight this face provides. */
20
+ weight: 400 | 600 | 700;
21
+ /** Style this face provides. */
22
+ style: 'normal';
23
+ }
24
+ /**
25
+ * Supplies the fonts + emoji images the Satori engine needs. Bound per
26
+ * environment by the composition root; overridable by consumers.
27
+ */
28
+ export interface AssetProvider {
29
+ /**
30
+ * Load the font faces Satori renders text with.
31
+ *
32
+ * @returns the font faces — synchronous in Node (disk), async in the browser
33
+ * (fetch).
34
+ */
35
+ loadFonts(): SketchonFont[] | Promise<SketchonFont[]>;
36
+ /**
37
+ * Resolve a single emoji grapheme to an image data-URI for Satori.
38
+ *
39
+ * @param emoji a single emoji grapheme (e.g. "🔍").
40
+ * @returns an `image/svg+xml` data-URI, or a transparent pixel if the emoji
41
+ * cannot be resolved (offline / 404).
42
+ */
43
+ emojiToDataUri(emoji: string): string | Promise<string>;
44
+ }
45
+ //# sourceMappingURL=AssetProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetProvider.d.ts","sourceRoot":"","sources":["../../src/ports/AssetProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC;IAC/B,iCAAiC;IACjC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACxB,gCAAgC;IAChC,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,SAAS,IAAI,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEtD;;;;;;OAMG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACzD"}