@sgummalla-works/sketchon 0.1.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 (89) hide show
  1. package/LICENSE +34 -0
  2. package/README.md +197 -0
  3. package/assets/emoji/1f4a1.svg +1 -0
  4. package/assets/emoji/1f4c8.svg +1 -0
  5. package/assets/emoji/1f4ca.svg +1 -0
  6. package/assets/emoji/1f4cb.svg +1 -0
  7. package/assets/emoji/1f4da.svg +1 -0
  8. package/assets/emoji/1f4dd.svg +1 -0
  9. package/assets/emoji/1f4e5.svg +1 -0
  10. package/assets/emoji/1f501.svg +1 -0
  11. package/assets/emoji/1f50d.svg +1 -0
  12. package/assets/emoji/1f517.svg +1 -0
  13. package/assets/emoji/1f525.svg +1 -0
  14. package/assets/emoji/1f5c4.svg +1 -0
  15. package/assets/emoji/1f9e0.svg +1 -0
  16. package/assets/emoji/1f9ee.svg +1 -0
  17. package/assets/emoji/23f8.svg +1 -0
  18. package/assets/emoji/2699.svg +1 -0
  19. package/assets/emoji/26a1.svg +1 -0
  20. package/assets/emoji/2705.svg +1 -0
  21. package/assets/emoji/2753.svg +1 -0
  22. package/assets/inter-400.ttf +0 -0
  23. package/assets/inter-600.ttf +0 -0
  24. package/assets/inter-700.ttf +0 -0
  25. package/dist/adapters/baseline.d.ts +3 -0
  26. package/dist/adapters/baseline.d.ts.map +1 -0
  27. package/dist/adapters/baseline.js +196 -0
  28. package/dist/adapters/baseline.js.map +1 -0
  29. package/dist/adapters/elk.d.ts +3 -0
  30. package/dist/adapters/elk.d.ts.map +1 -0
  31. package/dist/adapters/elk.js +230 -0
  32. package/dist/adapters/elk.js.map +1 -0
  33. package/dist/adapters/emoji.d.ts +10 -0
  34. package/dist/adapters/emoji.d.ts.map +1 -0
  35. package/dist/adapters/emoji.js +80 -0
  36. package/dist/adapters/emoji.js.map +1 -0
  37. package/dist/adapters/fonts.d.ts +13 -0
  38. package/dist/adapters/fonts.d.ts.map +1 -0
  39. package/dist/adapters/fonts.js +27 -0
  40. package/dist/adapters/fonts.js.map +1 -0
  41. package/dist/adapters/satori-helpers.d.ts +48 -0
  42. package/dist/adapters/satori-helpers.d.ts.map +1 -0
  43. package/dist/adapters/satori-helpers.js +43 -0
  44. package/dist/adapters/satori-helpers.js.map +1 -0
  45. package/dist/adapters/satori.d.ts +3 -0
  46. package/dist/adapters/satori.d.ts.map +1 -0
  47. package/dist/adapters/satori.js +269 -0
  48. package/dist/adapters/satori.js.map +1 -0
  49. package/dist/adapters/sequence.d.ts +3 -0
  50. package/dist/adapters/sequence.d.ts.map +1 -0
  51. package/dist/adapters/sequence.js +136 -0
  52. package/dist/adapters/sequence.js.map +1 -0
  53. package/dist/adapters/svg.d.ts +43 -0
  54. package/dist/adapters/svg.d.ts.map +1 -0
  55. package/dist/adapters/svg.js +92 -0
  56. package/dist/adapters/svg.js.map +1 -0
  57. package/dist/application/registry.d.ts +43 -0
  58. package/dist/application/registry.d.ts.map +1 -0
  59. package/dist/application/registry.js +45 -0
  60. package/dist/application/registry.js.map +1 -0
  61. package/dist/application/router.d.ts +56 -0
  62. package/dist/application/router.d.ts.map +1 -0
  63. package/dist/application/router.js +59 -0
  64. package/dist/application/router.js.map +1 -0
  65. package/dist/constants.d.ts +25 -0
  66. package/dist/constants.d.ts.map +1 -0
  67. package/dist/constants.js +35 -0
  68. package/dist/constants.js.map +1 -0
  69. package/dist/domain/spec.d.ts +163 -0
  70. package/dist/domain/spec.d.ts.map +1 -0
  71. package/dist/domain/spec.js +17 -0
  72. package/dist/domain/spec.js.map +1 -0
  73. package/dist/domain/theme.d.ts +68 -0
  74. package/dist/domain/theme.d.ts.map +1 -0
  75. package/dist/domain/theme.js +60 -0
  76. package/dist/domain/theme.js.map +1 -0
  77. package/dist/domain/validate.d.ts +19 -0
  78. package/dist/domain/validate.d.ts.map +1 -0
  79. package/dist/domain/validate.js +69 -0
  80. package/dist/domain/validate.js.map +1 -0
  81. package/dist/index.d.ts +62 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +83 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/ports/Technique.d.ts +69 -0
  86. package/dist/ports/Technique.d.ts.map +1 -0
  87. package/dist/ports/Technique.js +2 -0
  88. package/dist/ports/Technique.js.map +1 -0
  89. package/package.json +52 -0
package/LICENSE ADDED
@@ -0,0 +1,34 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Suman Gummalla
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ Third-party attributions:
26
+
27
+ • elkjs (MIT) — https://github.com/kieler/elkjs
28
+ • satori (Mozilla Public License 2.0) — https://github.com/vercel/satori
29
+ Used without modification.
30
+ • Inter font (SIL Open Font License 1.1) — https://rsms.me/inter/
31
+ Copyright 2020 The Inter Project Authors.
32
+ • Twemoji emoji (CC BY 4.0) — https://twemoji.twitter.com/
33
+ Copyright 2019 Twitter, Inc and other contributors.
34
+ https://creativecommons.org/licenses/by/4.0/
package/README.md ADDED
@@ -0,0 +1,197 @@
1
+ # @sgummalla-works/sketchon
2
+
3
+ Coordinate-free diagram rendering. The model declares **what** the diagram is; a deterministic layout engine computes every pixel. No hand-coded coordinates, no overlapping labels.
4
+
5
+ ## Architecture
6
+
7
+ Ports & Adapters (Hexagonal Architecture) + Strategy pattern:
8
+
9
+ ```
10
+ domain/ — DiagramSpec types + validation (pure, zero external deps)
11
+ ports/ — Technique interface (the Strategy contract)
12
+ application/ — routing + registry (orchestration layer)
13
+ adapters/ — concrete engines: Satori, ELK, Sequence, Baseline
14
+ ```
15
+
16
+ Adding a new engine = implement `Technique`, register in `application/registry.ts`. No other file changes.
17
+
18
+ ## Install
19
+
20
+ ```bash
21
+ npm install @sgummalla-works/sketchon
22
+ ```
23
+
24
+ ## Quick start
25
+
26
+ ```typescript
27
+ import { renderDiagram, validateSpec } from '@sgummalla-works/sketchon';
28
+ import type { DiagramSpec } from '@sgummalla-works/sketchon';
29
+
30
+ const spec: DiagramSpec = {
31
+ id: 'my-flow',
32
+ kind: 'flow',
33
+ nodes: [
34
+ { id: 'a', label: 'Start', shape: 'pill', emphasis: 'muted' },
35
+ { id: 'b', label: 'Process', shape: 'rounded', emphasis: 'primary' },
36
+ { id: 'c', label: 'Done', shape: 'pill', emphasis: 'success' },
37
+ ],
38
+ edges: [
39
+ { from: 'a', to: 'b' },
40
+ { from: 'b', to: 'c', label: 'success' },
41
+ ],
42
+ };
43
+
44
+ // Validate before rendering
45
+ const issues = validateSpec(spec);
46
+ if (issues.length) throw new Error(issues.map(i => i.message).join(', '));
47
+
48
+ // Render — engine is chosen automatically from spec.kind
49
+ const { svg, width, height } = await renderDiagram(spec);
50
+ // svg is a standalone <svg> string, ready for display or rasterisation
51
+ ```
52
+
53
+ ## Diagram kinds and engines
54
+
55
+ | `kind` | Engine | Use for |
56
+ |----------------|-------------|---------|
57
+ | `concept` | Satori | Explainer / illustrative panels with rich cards, a "why" column, and a legend |
58
+ | `mindmap` | Satori | Central topic + radiating branches |
59
+ | `sequence` | Sequence | Actor lifelines + ordered message arrows |
60
+ | `flow` | ELK | Flowcharts, decision trees |
61
+ | `architecture` | ELK | System components + connections with group containers |
62
+ | `state` | ELK | State machines |
63
+ | `er` | ELK | Entity-relationship schemas |
64
+
65
+ Override the engine for a spec with `spec.renderer: 'satori' | 'elk' | 'sequence'`.
66
+
67
+ ## DiagramSpec reference
68
+
69
+ ```typescript
70
+ interface DiagramSpec {
71
+ id: string; // stable id (used in filenames + gallery)
72
+ kind: DiagramKind; // selects layout engine
73
+ title?: string; // optional heading
74
+ direction?: 'TB'|'BT'|'LR'|'RL'; // flow direction for graph kinds
75
+ nodes: DiagramNode[]; // at least one
76
+ edges: DiagramEdge[]; // may be empty
77
+ groups?: DiagramGroup[]; // visual containers / clusters
78
+ annotations?: DiagramAnnotation[]; // callout text beside nodes
79
+ categories?: DiagramCategory[]; // legend colour groups (concept diagrams)
80
+ columns?: ColumnHeaders; // left/right column headings (concept diagrams)
81
+ renderer?: 'satori'|'elk'|'sequence'; // override auto-routing
82
+ theme?: ThemeHints; // mode: 'light'|'dark', density
83
+ }
84
+ ```
85
+
86
+ ### Node
87
+
88
+ ```typescript
89
+ interface DiagramNode {
90
+ id: string;
91
+ label: string; // primary text
92
+ sublabel?: string; // second line
93
+ sublabelParts?: string[]; // dot-joined sub-line tokens (for card shape)
94
+ shape?: NodeShape; // box | rounded | pill | circle | diamond |
95
+ // cylinder | actor | note | icon | card | checkpoint
96
+ emphasis?: Emphasis; // normal | primary | muted | danger | success | accent
97
+ icon?: string; // emoji (e.g. '🔍') or semantic name
98
+ group?: string; // group id this node belongs to
99
+ category?: string; // colour category id (for legend)
100
+ }
101
+ ```
102
+
103
+ ### Edge
104
+
105
+ ```typescript
106
+ interface DiagramEdge {
107
+ from: string; // source node id
108
+ to: string; // target node id
109
+ label?: string; // edge text
110
+ style?: 'solid'|'dashed'|'dotted';
111
+ arrow?: 'none'|'open'|'filled';
112
+ semantic?: 'default'|'dependency'|'dataflow'|'message'|'return'|'association';
113
+ }
114
+ ```
115
+
116
+ ### Concept / panel diagram example
117
+
118
+ ```typescript
119
+ const spec: DiagramSpec = {
120
+ id: 'agent-tools',
121
+ kind: 'concept',
122
+ columns: { primary: 'Tool', annotation: 'Why it is mandatory' },
123
+ categories: [
124
+ { id: 'retrieval', label: 'Retrieval', emphasis: 'primary' },
125
+ { id: 'execution', label: 'Execution', emphasis: 'success' },
126
+ ],
127
+ nodes: [
128
+ { id: 'search', icon: '🔍', label: 'Web search',
129
+ sublabelParts: ['real-time lookup', 'citation'],
130
+ shape: 'card', category: 'retrieval' },
131
+ { id: 'exec', icon: '⚙️', label: 'Code execution',
132
+ sublabelParts: ['sandboxed', 'formula checking'],
133
+ shape: 'card', category: 'execution' },
134
+ ],
135
+ edges: [{ from: 'search', to: 'exec', arrow: 'filled' }],
136
+ annotations: [
137
+ { target: 'search', text: 'Prevents hallucinations by anchoring claims', placement: 'right' },
138
+ { target: 'exec', text: 'Validates numerical claims safely', placement: 'right' },
139
+ ],
140
+ };
141
+ ```
142
+
143
+ ### Sequence diagram example
144
+
145
+ ```typescript
146
+ const spec: DiagramSpec = {
147
+ id: 'oauth',
148
+ kind: 'sequence',
149
+ title: 'OAuth 2.0',
150
+ nodes: [
151
+ { id: 'u', label: 'User', emphasis: 'muted' },
152
+ { id: 'app', label: 'Client app', emphasis: 'primary' },
153
+ { id: 'auth', label: 'Auth server', emphasis: 'accent' },
154
+ ],
155
+ edges: [
156
+ { from: 'u', to: 'app', label: 'click login' },
157
+ { from: 'app', to: 'auth', label: 'redirect /authorize' },
158
+ { from: 'auth',to: 'app', label: 'auth code',
159
+ style: 'dashed', semantic: 'return' },
160
+ ],
161
+ };
162
+ ```
163
+
164
+ ## Public API
165
+
166
+ | Export | Description |
167
+ |--------|-------------|
168
+ | `renderDiagram(spec)` | Main entry point. Auto-routes to the right engine. Returns `Promise<RenderResult>`. |
169
+ | `validateSpec(spec)` | Pure validation. Returns `ValidationIssue[]` (empty = valid). |
170
+ | `selectEngineKey(spec)` | Returns which engine key would be chosen (`'satori'|'elk'|'sequence'|'baseline'`). |
171
+ | `selectEngine(spec)` | Returns the `Technique` that would render the spec. |
172
+ | `REGISTRY` | Map of all registered engines (`Record<EngineKey, Technique>`). |
173
+ | `TECHNIQUES` | Array of all registered engines (used by the lab harness). |
174
+ | `getTechnique(key)` | Look up a specific engine by key. |
175
+ | `DiagramSpec` + all spec types | Re-exported from `domain/spec.ts`. |
176
+ | `validateSpec` | Re-exported from `domain/validate.ts`. |
177
+ | `loadFonts` | Node-only: loads bundled Inter TTFs for Satori. |
178
+ | `emojiToDataUri` | Node-only: resolves an emoji to a Twemoji SVG data-URI. |
179
+
180
+ ## How to add a new layout engine
181
+
182
+ 1. Create `src/adapters/my-engine.ts` implementing the `Technique` interface.
183
+ 2. Add one entry to `src/application/registry.ts` — both `REGISTRY` and the `EngineKey` union.
184
+ 3. Add the new kind (if applicable) to `KIND_ENGINE` in `src/application/router.ts`.
185
+ 4. Write tests in `src/adapters/my-engine.test.ts`.
186
+
187
+ That is the **only** change required. The lab harness and all consumers pick up the new engine automatically.
188
+
189
+ ## Testing
190
+
191
+ ```bash
192
+ npm test # run all tests
193
+ npm run test:watch # watch mode
194
+ npm run test:coverage # with coverage report
195
+ ```
196
+
197
+ Tests: **75 unit tests** across domain validation, application routing/registry, the adapters, and the architecture guard.
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFD983" d="M29 11.06c0 6.439-5 7.439-5 13.44 0 3.098-3.123 3.359-5.5 3.359-2.053 0-6.586-.779-6.586-3.361C11.914 18.5 7 17.5 7 11.06 7 5.029 12.285.14 18.083.14 23.883.14 29 5.029 29 11.06z"/><path fill="#CCD6DD" d="M22.167 32.5c0 .828-2.234 2.5-4.167 2.5-1.933 0-4.167-1.672-4.167-2.5 0-.828 2.233-.5 4.167-.5 1.933 0 4.167-.328 4.167.5z"/><path fill="#FFCC4D" d="M22.707 10.293c-.391-.391-1.023-.391-1.414 0L18 13.586l-3.293-3.293c-.391-.391-1.023-.391-1.414 0s-.391 1.023 0 1.414L17 15.414V26c0 .553.448 1 1 1s1-.447 1-1V15.414l3.707-3.707c.391-.391.391-1.023 0-1.414z"/><path fill="#99AAB5" d="M24 31c0 1.104-.896 2-2 2h-8c-1.104 0-2-.896-2-2v-6h12v6z"/><path fill="#CCD6DD" d="M11.999 32c-.48 0-.904-.347-.985-.836-.091-.544.277-1.06.822-1.15l12-2c.544-.098 1.06.277 1.15.822.091.544-.277 1.06-.822 1.15l-12 2c-.055.01-.111.014-.165.014zm0-4c-.48 0-.904-.347-.985-.836-.091-.544.277-1.06.822-1.15l12-2c.544-.097 1.06.277 1.15.822.091.544-.277 1.06-.822 1.15l-12 2c-.055.01-.111.014-.165.014z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#CCD6DD" d="M31 2H5C3.343 2 2 3.343 2 5v26c0 1.657 1.343 3 3 3h26c1.657 0 3-1.343 3-3V5c0-1.657-1.343-3-3-3z"/><path fill="#E1E8ED" d="M31 1H5C2.791 1 1 2.791 1 5v26c0 2.209 1.791 4 4 4h26c2.209 0 4-1.791 4-4V5c0-2.209-1.791-4-4-4zm0 2c1.103 0 2 .897 2 2v4h-6V3h4zm-4 16h6v6h-6v-6zm0-2v-6h6v6h-6zM25 3v6h-6V3h6zm-6 8h6v6h-6v-6zm0 8h6v6h-6v-6zM17 3v6h-6V3h6zm-6 8h6v6h-6v-6zm0 8h6v6h-6v-6zM3 5c0-1.103.897-2 2-2h4v6H3V5zm0 6h6v6H3v-6zm0 8h6v6H3v-6zm2 14c-1.103 0-2-.897-2-2v-4h6v6H5zm6 0v-6h6v6h-6zm8 0v-6h6v6h-6zm12 0h-4v-6h6v4c0 1.103-.897 2-2 2z"/><path fill="#DD2E44" d="M4.998 33c-.32 0-.645-.076-.946-.239-.973-.523-1.336-1.736-.813-2.709l7-13c.299-.557.845-.939 1.47-1.031.626-.092 1.258.118 1.705.565l6.076 6.076 9.738-18.59c.512-.978 1.721-1.357 2.699-.843.979.512 1.356 1.721.844 2.7l-11 21c-.295.564-.841.953-1.47 1.05-.627.091-1.266-.113-1.716-.563l-6.1-6.099-5.724 10.631C6.4 32.619 5.71 33 4.998 33z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#CCD6DD" d="M31 2H5C3.343 2 2 3.343 2 5v26c0 1.657 1.343 3 3 3h26c1.657 0 3-1.343 3-3V5c0-1.657-1.343-3-3-3z"/><path fill="#E1E8ED" d="M31 1H5C2.791 1 1 2.791 1 5v26c0 2.209 1.791 4 4 4h26c2.209 0 4-1.791 4-4V5c0-2.209-1.791-4-4-4zm0 2c1.103 0 2 .897 2 2v4h-6V3h4zm-4 16h6v6h-6v-6zm0-2v-6h6v6h-6zM25 3v6h-6V3h6zm-6 8h6v6h-6v-6zm0 8h6v6h-6v-6zM17 3v6h-6V3h6zm-6 8h6v6h-6v-6zm0 8h6v6h-6v-6zM3 5c0-1.103.897-2 2-2h4v6H3V5zm0 6h6v6H3v-6zm0 8h6v6H3v-6zm2 14c-1.103 0-2-.897-2-2v-4h6v6H5zm6 0v-6h6v6h-6zm8 0v-6h6v6h-6zm12 0h-4v-6h6v4c0 1.103-.897 2-2 2z"/><path fill="#5C913B" d="M13 33H7V16c0-1.104.896-2 2-2h2c1.104 0 2 .896 2 2v17z"/><path fill="#3B94D9" d="M29 33h-6V9c0-1.104.896-2 2-2h2c1.104 0 2 .896 2 2v24z"/><path fill="#DD2E44" d="M21 33h-6V23c0-1.104.896-2 2-2h2c1.104 0 2 .896 2 2v10z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#C1694F" d="M32 34c0 1.104-.896 2-2 2H6c-1.104 0-2-.896-2-2V7c0-1.104.896-2 2-2h24c1.104 0 2 .896 2 2v27z"/><path fill="#FFF" d="M29 32c0 .553-.447 1-1 1H8c-.552 0-1-.447-1-1V9c0-.552.448-1 1-1h20c.553 0 1 .448 1 1v23z"/><path fill="#CCD6DD" d="M25 3h-4c0-1.657-1.343-3-3-3s-3 1.343-3 3h-4c-1.104 0-2 .896-2 2v5h18V5c0-1.104-.896-2-2-2z"/><circle fill="#292F33" cx="18" cy="3" r="2"/><path fill="#99AAB5" d="M20 14c0 .552-.447 1-1 1h-9c-.552 0-1-.448-1-1s.448-1 1-1h9c.553 0 1 .448 1 1zm7 4c0 .552-.447 1-1 1H10c-.552 0-1-.448-1-1s.448-1 1-1h16c.553 0 1 .448 1 1zm0 4c0 .553-.447 1-1 1H10c-.552 0-1-.447-1-1 0-.553.448-1 1-1h16c.553 0 1 .447 1 1zm0 4c0 .553-.447 1-1 1H10c-.552 0-1-.447-1-1 0-.553.448-1 1-1h16c.553 0 1 .447 1 1zm0 4c0 .553-.447 1-1 1h-9c-.552 0-1-.447-1-1 0-.553.448-1 1-1h9c.553 0 1 .447 1 1z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#553788" d="M15 31c0 2.209-.791 4-3 4H5c-4 0-4-14 0-14h7c2.209 0 3 1.791 3 4v6z"/><path fill="#9266CC" d="M34 33h-1V23h1c.553 0 1-.447 1-1s-.447-1-1-1H10c-4 0-4 14 0 14h24c.553 0 1-.447 1-1s-.447-1-1-1z"/><path fill="#CCD6DD" d="M34.172 33H11c-2 0-2-10 0-10h23.172c1.104 0 1.104 10 0 10z"/><path fill="#99AAB5" d="M11.5 25h23.35c-.135-1.175-.36-2-.678-2H11c-1.651 0-1.938 6.808-.863 9.188C9.745 29.229 10.199 25 11.5 25z"/><path fill="#269" d="M12 8c0 2.209-1.791 4-4 4H4C0 12 0 1 4 1h4c2.209 0 4 1.791 4 4v3z"/><path fill="#55ACEE" d="M31 10h-1V3h1c.553 0 1-.447 1-1s-.447-1-1-1H7C3 1 3 12 7 12h24c.553 0 1-.447 1-1s-.447-1-1-1z"/><path fill="#CCD6DD" d="M31.172 10H8c-2 0-2-7 0-7h23.172c1.104 0 1.104 7 0 7z"/><path fill="#99AAB5" d="M8 5h23.925c-.114-1.125-.364-2-.753-2H8C6.807 3 6.331 5.489 6.562 7.5 6.718 6.142 7.193 5 8 5z"/><path fill="#F4900C" d="M20 17c0 2.209-1.791 4-4 4H6c-4 0-4-9 0-9h10c2.209 0 4 1.791 4 4v1z"/><path fill="#FFAC33" d="M35 19h-1v-5h1c.553 0 1-.447 1-1s-.447-1-1-1H15c-4 0-4 9 0 9h20c.553 0 1-.447 1-1s-.447-1-1-1z"/><path fill="#CCD6DD" d="M35.172 19H16c-2 0-2-5 0-5h19.172c1.104 0 1.104 5 0 5z"/><path fill="#99AAB5" d="M16 16h19.984c-.065-1.062-.334-2-.812-2H16c-1.274 0-1.733 2.027-1.383 3.5.198-.839.657-1.5 1.383-1.5z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#CCD6DD" d="M31 32c0 2.209-1.791 4-4 4H5c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h22c2.209 0 4 1.791 4 4v28z"/><path fill="#99AAB5" d="M27 24c0 .553-.447 1-1 1H6c-.552 0-1-.447-1-1 0-.553.448-1 1-1h20c.553 0 1 .447 1 1zm-16 4c0 .553-.448 1-1 1H6c-.552 0-1-.447-1-1 0-.553.448-1 1-1h4c.552 0 1 .447 1 1zM27 8c0 .552-.447 1-1 1H6c-.552 0-1-.448-1-1s.448-1 1-1h20c.553 0 1 .448 1 1zm0 4c0 .553-.447 1-1 1H6c-.552 0-1-.447-1-1 0-.553.448-1 1-1h20c.553 0 1 .447 1 1zm0 4c0 .553-.447 1-1 1H6c-.552 0-1-.447-1-1 0-.553.448-1 1-1h20c.553 0 1 .447 1 1zm0 4c0 .553-.447 1-1 1H6c-.552 0-1-.447-1-1 0-.553.448-1 1-1h20c.553 0 1 .447 1 1z"/><path fill="#66757F" d="M31 6.272c-.827-.535-1.837-.579-2.521-.023l-.792.646-1.484 1.211-.1.08-2.376 1.938-11.878 9.686c-.437.357-.793 1.219-1.173 2.074-.378.85-.969 2.852-1.443 4.391-.148.25-1.065 1.846-.551 2.453.52.615 2.326.01 2.568-.076 1.626-.174 3.731-.373 4.648-.58.924-.211 1.854-.395 2.291-.752.008-.006.01-.018.017-.023l11.858-9.666.792-.646.144-.118V6.272z"/><path fill="#D99E82" d="M18.145 22.526s-1.274-1.881-2.117-2.553c-.672-.843-2.549-2.116-2.549-2.116-.448-.446-1.191-.48-1.629-.043-.437.438-.793 1.366-1.173 2.291-.472 1.146-1.276 4.154-1.768 5.752-.083.272.517-.45.503-.21-.01.187.027.394.074.581l-.146.159.208.067c.025.082.05.154.068.21l.159-.146c.187.047.394.084.58.074.24-.014-.483.587-.21.503 1.598-.493 4.607-1.296 5.752-1.768.924-.381 1.854-.736 2.291-1.174.439-.435.406-1.178-.043-1.627z"/><path fill="#EA596E" d="M25.312 4.351c-.876.875-.876 2.293 0 3.168l3.167 3.168c.876.874 2.294.874 3.168 0l3.169-3.168c.874-.875.874-2.293 0-3.168l-3.169-3.168c-.874-.875-2.292-.875-3.168 0l-3.167 3.168z"/><path fill="#FFCC4D" d="M11.849 17.815l3.17 3.17 3.165 3.166 11.881-11.879-6.337-6.336-11.879 11.879z"/><path fill="#292F33" d="M11.298 26.742s-2.06 1.133-2.616.576c-.557-.558.581-2.611.581-2.611s1.951.036 2.035 2.035z"/><path fill="#CCD6DD" d="M23.728 5.935l3.96-3.96 6.336 6.337-3.96 3.96z"/><path fill="#99AAB5" d="M26.103 3.558l.792-.792 6.336 6.335-.792.792zM24.52 5.142l.791-.791 6.336 6.335-.792.792z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D99E82" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4v-9c0-2.209.791-3 3-3h30c2.209 0 3 .791 3 3v9z"/><path fill="#662113" d="M25 20c0 3.866-3.134 7-7 7s-7-3.134-7-7h14z"/><path fill="#C1694F" d="M4 36h28c2.209 0 4-1.791 4-4H0c0 2.209 1.791 4 4 4z"/><path fill="#77B255" d="M26.716 8h-4.783V2c0-1.105-.896-2-2-2h-4.001c-1.104 0-1.999.896-1.999 2v6H9.148c-1.223 0-1.516.623-.651 1.489l7.863 7.863c.865.865 2.28.865 3.146 0l7.863-7.863C28.232 8.623 27.94 8 26.716 8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M30.2 10L23 4v4h-8C9.477 8 5 12.477 5 18c0 1.414.297 2.758.827 3.978l3.3-2.75C9.044 18.831 9 18.421 9 18c0-3.314 2.686-6 6-6h8v4l7.2-6zm-.026 4.023l-3.301 2.75c.083.396.127.806.127 1.227 0 3.313-2.687 6-6 6h-8v-4l-7.2 6 7.2 6v-4h8c5.522 0 10-4.478 10-10 0-1.414-.297-2.758-.826-3.977z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#9AAAB4" d="M27.388 24.642L24.56 27.47l-4.95-4.95 2.828-2.828z"/><path fill="#66757F" d="M34.683 29.11l-5.879-5.879c-.781-.781-2.047-.781-2.828 0l-2.828 2.828c-.781.781-.781 2.047 0 2.828l5.879 5.879c1.562 1.563 4.096 1.563 5.658 0 1.56-1.561 1.559-4.094-.002-5.656z"/><circle fill="#8899A6" cx="13.586" cy="13.669" r="13.5"/><circle fill="#BBDDF5" cx="13.586" cy="13.669" r="9.5"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#8899A6" d="M15 9l6-6s6-6 12 0 0 12 0 12l-8 8s-6 6-12 0c-1.125-1.125-1.822-2.62-1.822-2.62l3.353-3.348S14.396 18.396 16 20c0 0 3 3 6 0l8-8s3-3 0-6-6 0-6 0l-3.729 3.729s-1.854-1.521-5.646-.354L15 9z"/><path fill="#8899A6" d="M20.845 27l-6 6s-6 6-12 0 0-12 0-12l8-8s6-6 12 0c1.125 1.125 1.822 2.62 1.822 2.62l-3.354 3.349s.135-1.365-1.469-2.969c0 0-3-3-6 0l-8 8s-3 3 0 6 6 0 6 0l3.729-3.729s1.854 1.521 5.646.354l-.374.375z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F4900C" d="M35 19c0-2.062-.367-4.039-1.04-5.868-.46 5.389-3.333 8.157-6.335 6.868-2.812-1.208-.917-5.917-.777-8.164.236-3.809-.012-8.169-6.931-11.794 2.875 5.5.333 8.917-2.333 9.125-2.958.231-5.667-2.542-4.667-7.042-3.238 2.386-3.332 6.402-2.333 9 1.042 2.708-.042 4.958-2.583 5.208-2.84.28-4.418-3.041-2.963-8.333C2.52 10.965 1 14.805 1 19c0 9.389 7.611 17 17 17s17-7.611 17-17z"/><path fill="#FFCC4D" d="M28.394 23.999c.148 3.084-2.561 4.293-4.019 3.709-2.106-.843-1.541-2.291-2.083-5.291s-2.625-5.083-5.708-6c2.25 6.333-1.247 8.667-3.08 9.084-1.872.426-3.753-.001-3.968-4.007C7.352 23.668 6 26.676 6 30c0 .368.023.73.055 1.09C9.125 34.124 13.342 36 18 36s8.875-1.876 11.945-4.91c.032-.36.055-.722.055-1.09 0-2.187-.584-4.236-1.606-6.001z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#292F33" d="M30 34c0 1.104-.896 2-2 2H8c-1.104 0-2-.896-2-2V2c0-1.104.896-2 2-2h20c1.104 0 2 .896 2 2v32z"/><path fill="#66757F" d="M28 16c0 .552-.447 1-1 1H9c-.552 0-1-.448-1-1V3c0-.552.448-1 1-1h18c.553 0 1 .448 1 1v13zm0 17c0 .553-.447 1-1 1H9c-.552 0-1-.447-1-1V20c0-.553.448-1 1-1h18c.553 0 1 .447 1 1v13z"/><path fill="#292F33" d="M22 8c0 .552-.447 1-1 1h-6c-.552 0-1-.448-1-1V5c0-.552.448-1 1-1h6c.553 0 1 .448 1 1v3zm0 17c0 .553-.447 1-1 1h-6c-.552 0-1-.447-1-1v-3c0-.553.448-1 1-1h6c.553 0 1 .447 1 1v3z"/><path fill="#E1E8ED" d="M15 5h6v3h-6zm0 17h6v3h-6zm9-8.97c0 .536-.435.97-.97.97H12.97c-.536 0-.97-.435-.97-.97v-.06c0-.536.434-.97.97-.97h10.06c.535 0 .97.435.97.97v.06zm0 16.999c0 .536-.435.971-.97.971H12.97c-.536 0-.97-.435-.97-.971v-.059c0-.535.434-.97.97-.97h10.06c.535 0 .97.435.97.971v.058z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#EA596E" d="M29.896 26.667c.003.283-.07.653-.146.958-.531 2.145-2.889 4.552-6.208 4.333-3.008-.198-5.458-1.642-5.458-3.667s2.444-3.667 5.458-3.667 6.335.018 6.354 2.043z"/><path fill="#DD2E44" d="M23.542 24.964c-1.619 0-5.314.448-6.162.448-1.498 0-2.713.94-2.713 2.1 0 .558.286 1.062.744 1.438 0 0 1.006 1.009 2.818.525.793-.212 2.083-1.786 4.354-2.036 1.131-.125 3.25.75 6.974.771.16-.344.193-.583.193-.583 0-2.027-3.194-2.663-6.208-2.663z"/><path fill="#F4ABBA" d="M29.75 27.625s2.184-.443 3.542-2.229c1.583-2.083 1.375-4.312 1.375-4.312 1.604-3-.5-5.813-.5-5.813C33.958 12.104 32 10.792 32 10.792c-1.271-3.021-4.083-3.833-4.083-3.833-2.208-2.583-6.125-2.5-6.125-2.5s-3.67-1.345-8.708.167c-.833.25-3.625.833-5.667 2.083C.981 10.649.494 16.793.584 17.792 1.083 23.375 5 24.375 7.5 24.958c.583 1.583 2.729 4.5 6.583 3.417 4.75-.833 6.75-2.25 7.917-2.25s4.417 1.25 7.75 1.5z"/><g fill="#EA596E"><path d="M17.737 18.648c2.328-1.255 3.59-1.138 4.704-1.037.354.032.689.057 1.028.055 1.984-.045 3.591-.881 4.302-1.69.182-.208.161-.523-.046-.706-.206-.182-.521-.163-.706.045-.548.624-1.899 1.313-3.573 1.351-.3.009-.601-.021-.913-.05-1.195-.111-2.679-.247-5.271 1.152-.665.359-1.577.492-2.565.592-2.197-3.171-.875-5.933-.497-6.591.037.002.073.014.111.014.4 0 .802-.098 1.166-.304.24-.136.325-.441.189-.681s-.441-.325-.681-.189c-.64.362-1.482.153-1.88-.467-.149-.233-.458-.301-.69-.151-.232.149-.3.458-.151.69.237.371.571.65.948.837-.521 1.058-1.51 3.84.372 6.951-1.324.13-2.65.317-3.688.986-.67.432-1.355 1.064-1.878 1.791-.629-.108-2.932-.675-3.334-3.231.25-.194.452-.45.577-.766.102-.257-.024-.547-.281-.649s-.547.024-.649.281c-.089.225-.25.389-.454.461-.202.072-.431.048-.643-.07-.243-.135-.546-.046-.68.194-.134.241-.047.546.194.68.284.158.588.238.89.238.037 0 .072-.017.109-.019.476 2.413 2.383 3.473 3.732 3.794-.176.388-.295.788-.331 1.192-.024.274.179.518.454.542l.045.002c.256 0 .475-.195.498-.456.108-1.213 1.265-2.48 2.293-3.145.964-.621 2.375-.752 3.741-.879 1.325-.121 2.577-.237 3.558-.767zm12.866-1.504c-.131.242-.041.546.2.677.076.042.159.062.24.062.176 0 .347-.093.438-.259.019-.034 1.842-3.449-1.571-5.744-.228-.152-.539-.093-.694.136-.154.229-.093.54.136.694 2.644 1.778 1.309 4.326 1.251 4.434zM9.876 9.07c.156 0 .309-.072.406-.208 1.45-2.017 3.458-1.327 3.543-1.295.259.094.544-.038.64-.296.096-.259-.036-.546-.295-.642-.96-.356-3.177-.468-4.7 1.65-.161.223-.11.536.114.697.089.064.191.094.292.094zm13.072-1.888c2.225-.181 3.237 1.432 3.283 1.508.094.158.26.246.431.246.086 0 .174-.022.253-.069.238-.14.318-.446.179-.684-.054-.091-1.34-2.218-4.224-1.998-.275.021-.48.262-.459.538.022.275.271.484.537.459zm9.15 14.611c-.246-.014-.517.181-.539.457-.002.018-.161 1.719-1.91 2.294-.262.086-.405.368-.318.631.068.21.265.344.475.344.052 0 .104-.008.156-.025 2.372-.778 2.586-3.064 2.594-3.161.021-.276-.183-.518-.458-.54z"/><path d="M7.347 16.934c-.072.267.086.541.353.613.043.012.087.017.13.017.221 0 .422-.147.482-.37.19-.711.927-1.167 1.652-1.014.271.055.535-.116.592-.387.057-.27-.116-.535-.387-.592-.426-.09-.854-.048-1.248.086-1.166-1.994-.939-3.96-.936-3.981.036-.273-.156-.524-.429-.562-.272-.033-.524.154-.562.427-.013.097-.28 2.316 1.063 4.614-.334.301-.588.694-.71 1.149zm11.179-2.47c.407-.377 1.06-.37 1.455.015.098.094.223.141.349.141.131 0 .261-.051.358-.152.192-.198.188-.515-.01-.707-.23-.223-.505-.372-.797-.465.296-1.016.179-1.467-.096-2.312-.048-.147-.101-.311-.157-.498l-.03-.1c-.364-1.208-.605-2.005.087-3.13.145-.235.071-.543-.164-.688-.231-.144-.542-.073-.688.164-.928 1.508-.587 2.637-.192 3.944l.03.1c.059.194.113.364.163.517.247.761.322 1.016.02 1.936-.369.069-.722.236-1.01.504-.202.188-.213.505-.025.707.189.202.506.212.707.024zm6.365-2.985c.291 0 .585-.061.859-.191.25-.118.357-.416.239-.666-.117-.25-.419-.354-.665-.239-.502.236-1.121.031-1.384-.457-.131-.244-.436-.333-.677-.205-.243.13-.335.434-.204.677.18.336.448.601.76.785-.537 1.305-.232 2.691.017 3.426.07.209.265.34.474.34.053 0 .106-.008.16-.026.262-.088.402-.372.313-.633-.168-.498-.494-1.756-.002-2.826.038.002.073.015.11.015zm4.797 9.429c-.019-.275-.257-.492-.531-.467-1.014.072-1.878-.697-1.947-1.703-.02-.275-.265-.48-.533-.465-.275.019-.483.258-.465.533.041.59.266 1.122.608 1.555-.804.946-1.857 1.215-2.444 1.284-.519.062-.973.009-1.498-.053-.481-.055-1.025-.118-1.698-.098l-.005.001c-.02-.286-.088-.703-.305-1.05-.146-.233-.455-.304-.689-.158-.233.146-.305.455-.158.689.134.215.159.558.159.725-.504.181-.94.447-1.334.704-.704.458-1.259.82-2.094.632-.756-.173-1.513-.208-2.155-.118-.1-.251-.258-.551-.502-.782-.201-.19-.517-.182-.707.02-.189.2-.181.517.02.707.086.081.154.199.209.317-1.103.454-1.656 1.213-1.682 1.25-.16.224-.107.533.115.694.088.063.19.094.292.094.155 0 .308-.071.406-.205.005-.008.554-.743 1.637-1.04.56-.154 1.363-.141 2.146.037.219.05.422.067.619.07.093.218.129.477.134.573.016.266.236.472.499.472l.027-.001c.275-.015.486-.248.473-.523-.003-.05-.023-.346-.13-.686.461-.167.862-.428 1.239-.673.572-.373 1.113-.726 1.82-.749.592-.021 1.08.036 1.551.091.474.055.94.091 1.454.061.091.253.084.591.07.704-.033.273.16.523.434.559.021.003.042.004.063.004.247 0 .462-.183.495-.435.008-.062.059-.512-.059-.981.718-.193 1.608-.612 2.345-1.471.431.264.934.419 1.469.419.062 0 .125-.002.187-.006.275-.018.483-.255.465-.531z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#CCD6DD" d="M3 16v-2h30v2zm0 7v-2h30v2zm0 7v-2h30v2zM3 9V7h30v2z"/><path fill="#D5AB88" d="M35 33V1c0-.552-.448-1-1-1h-1c-.552 0-1 .448-1 1H4c0-.552-.448-1-1-1H2c-.552 0-1 .448-1 1v32h34zM4 4h28v29H4V4z"/><path fill="#3B94D9" d="M19 5.5c-.829 0-1.5.671-1.5 1.5 0-.829-.671-1.5-1.5-1.5s-1.5.671-1.5 1.5c0-.829-.671-1.5-1.5-1.5s-1.5.671-1.5 1.5c0-.829-.671-1.5-1.5-1.5S8.5 6.171 8.5 7c0-.829-.671-1.5-1.5-1.5S5.5 6.171 5.5 7v2c0 .829.671 1.5 1.5 1.5S8.5 9.829 8.5 9c0 .829.671 1.5 1.5 1.5s1.5-.671 1.5-1.5c0 .829.671 1.5 1.5 1.5s1.5-.671 1.5-1.5c0 .829.671 1.5 1.5 1.5s1.5-.671 1.5-1.5c0 .829.671 1.5 1.5 1.5.828 0 1.5-.671 1.5-1.5V7c0-.829-.672-1.5-1.5-1.5z"/><path fill="#BE1931" d="M19 12.5c-.829 0-1.5.671-1.5 1.5 0-.829-.671-1.5-1.5-1.5s-1.5.671-1.5 1.5c0-.829-.671-1.5-1.5-1.5s-1.5.671-1.5 1.5c0-.829-.671-1.5-1.5-1.5s-1.5.671-1.5 1.5c0-.829-.671-1.5-1.5-1.5s-1.5.671-1.5 1.5v2c0 .829.671 1.5 1.5 1.5s1.5-.671 1.5-1.5c0 .829.671 1.5 1.5 1.5s1.5-.671 1.5-1.5c0 .829.671 1.5 1.5 1.5s1.5-.671 1.5-1.5c0 .829.671 1.5 1.5 1.5s1.5-.671 1.5-1.5c0 .829.671 1.5 1.5 1.5.828 0 1.5-.671 1.5-1.5v-2c0-.829-.672-1.5-1.5-1.5z"/><path fill="#5C913B" d="M19 19.5c-.829 0-1.5.672-1.5 1.5 0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5c0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5c0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5c0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5v2c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5.828 0 1.5-.672 1.5-1.5v-2c0-.828-.672-1.5-1.5-1.5z"/><path fill="#FFAC33" d="M19 26.5c-.829 0-1.5.672-1.5 1.5 0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5c0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5c0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5c0-.828-.671-1.5-1.5-1.5s-1.5.672-1.5 1.5v2c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5s1.5-.672 1.5-1.5c0 .828.671 1.5 1.5 1.5.828 0 1.5-.672 1.5-1.5v-2c0-.828-.672-1.5-1.5-1.5z"/><path fill="#3B94D9" d="M29 10.5c-.828 0-1.5-.671-1.5-1.5V7c0-.829.672-1.5 1.5-1.5s1.5.671 1.5 1.5v2c0 .829-.672 1.5-1.5 1.5z"/><path fill="#BE1931" d="M29 17.5c-.828 0-1.5-.671-1.5-1.5v-2c0-.829.672-1.5 1.5-1.5s1.5.671 1.5 1.5v2c0 .829-.672 1.5-1.5 1.5z"/><path fill="#5C913B" d="M29 24.5c-.828 0-1.5-.672-1.5-1.5v-2c0-.828.672-1.5 1.5-1.5s1.5.672 1.5 1.5v2c0 .828-.672 1.5-1.5 1.5z"/><path fill="#FFAC33" d="M29 31.5c-.828 0-1.5-.672-1.5-1.5v-2c0-.828.672-1.5 1.5-1.5s1.5.672 1.5 1.5v2c0 .828-.672 1.5-1.5 1.5z"/><path fill="#BF6952" d="M35 33H1c-.552 0-1 .448-1 1v1c0 .552.448 1 1 1h34c.552 0 1-.448 1-1v-1c0-.552-.448-1-1-1z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M20 7h5v22h-5zm-9 0h5v22h-5z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#66757F" d="M34 15h-3.362c-.324-1.369-.864-2.651-1.582-3.814l2.379-2.379c.781-.781.781-2.048 0-2.829l-1.414-1.414c-.781-.781-2.047-.781-2.828 0l-2.379 2.379C23.65 6.225 22.369 5.686 21 5.362V2c0-1.104-.896-2-2-2h-2c-1.104 0-2 .896-2 2v3.362c-1.369.324-2.651.864-3.814 1.582L8.808 4.565c-.781-.781-2.048-.781-2.828 0L4.565 5.979c-.781.781-.781 2.048-.001 2.829l2.379 2.379C6.225 12.35 5.686 13.632 5.362 15H2c-1.104 0-2 .896-2 2v2c0 1.104.896 2 2 2h3.362c.324 1.368.864 2.65 1.582 3.813l-2.379 2.379c-.78.78-.78 2.048.001 2.829l1.414 1.414c.78.78 2.047.78 2.828 0l2.379-2.379c1.163.719 2.445 1.258 3.814 1.582V34c0 1.104.896 2 2 2h2c1.104 0 2-.896 2-2v-3.362c1.368-.324 2.65-.864 3.813-1.582l2.379 2.379c.781.781 2.047.781 2.828 0l1.414-1.414c.781-.781.781-2.048 0-2.829l-2.379-2.379c.719-1.163 1.258-2.445 1.582-3.814H34c1.104 0 2-.896 2-2v-2C36 15.896 35.104 15 34 15zM18 26c-4.418 0-8-3.582-8-8s3.582-8 8-8 8 3.582 8 8-3.582 8-8 8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFAC33" d="M32.938 15.651C32.792 15.26 32.418 15 32 15H19.925L26.89 1.458c.219-.426.106-.947-.271-1.243C26.437.071 26.218 0 26 0c-.233 0-.466.082-.653.243L18 6.588 3.347 19.243c-.316.273-.43.714-.284 1.105S3.582 21 4 21h12.075L9.11 34.542c-.219.426-.106.947.271 1.243.182.144.401.215.619.215.233 0 .466-.082.653-.243L18 29.412l14.653-12.655c.317-.273.43-.714.285-1.106z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#77B255" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M29.28 6.362c-1.156-.751-2.704-.422-3.458.736L14.936 23.877l-5.029-4.65c-1.014-.938-2.596-.875-3.533.138-.937 1.014-.875 2.596.139 3.533l7.209 6.666c.48.445 1.09.665 1.696.665.673 0 1.534-.282 2.099-1.139.332-.506 12.5-19.27 12.5-19.27.751-1.159.421-2.707-.737-3.458z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#BE1931" d="M17 27c-1.657 0-3-1.343-3-3v-4c0-1.657 1.343-3 3-3 .603-.006 6-1 6-5 0-2-2-4-5-4-2.441 0-4 2-4 3 0 1.657-1.343 3-3 3s-3-1.343-3-3c0-4.878 4.58-9 10-9 8 0 11 5.982 11 11 0 4.145-2.277 7.313-6.413 8.92-.9.351-1.79.587-2.587.747V24c0 1.657-1.343 3-3 3z"/><circle fill="#BE1931" cx="17" cy="32" r="3"/></svg>
Binary file
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ import type { Technique } from '../ports/Technique.js';
2
+ export declare const baselineTechnique: Technique;
3
+ //# sourceMappingURL=baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/adapters/baseline.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAuC,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAwI5F,eAAO,MAAM,iBAAiB,EAAE,SAsE/B,CAAC"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Baseline technique: a simple deterministic LAYERED layout.
3
+ *
4
+ * Purpose: give the harness one working end-to-end technique so Phase 0 runs on
5
+ * `npm run lab` with zero extra dependencies, AND establish the baseline the
6
+ * real engines must beat in Phase 2. It uses longest-path layering with naive
7
+ * within-layer spacing — deliberately unsophisticated. It will score well on
8
+ * small directed graphs and POORLY on dense graphs, sequence diagrams, and
9
+ * free-form concept layouts, which is exactly the signal that justifies bringing
10
+ * in Satori (flexbox→SVG) and elkjs (graph auto-layout) next.
11
+ *
12
+ * Critically, it does the coordinate math IN CODE from the semantic spec — the
13
+ * model never computes a pixel. That is the principle the whole lab exists to
14
+ * prove out.
15
+ */
16
+ import { CANVAS_PADDING, LAYER_GAP, NODE_GAP, NODE_LABEL_FONT_SIZE, NODE_MAX_WIDTH, NODE_MIN_HEIGHT, NODE_MIN_WIDTH, NODE_PADDING_X, NODE_PADDING_Y, NODE_SUBLABEL_FONT_SIZE, } from '../constants.js';
17
+ import { esc, estimateTextWidth, palette, svgDocument } from './svg.js';
18
+ /** Clamp helper. */
19
+ function clamp(v, lo, hi) {
20
+ return Math.max(lo, Math.min(hi, v));
21
+ }
22
+ /** Size a node box from its label/sublabel. */
23
+ function sizeNode(node) {
24
+ const labelW = estimateTextWidth(node.label, NODE_LABEL_FONT_SIZE);
25
+ const subW = node.sublabel ? estimateTextWidth(node.sublabel, NODE_SUBLABEL_FONT_SIZE) : 0;
26
+ const w = clamp(Math.max(labelW, subW) + NODE_PADDING_X * 2, NODE_MIN_WIDTH, NODE_MAX_WIDTH);
27
+ const h = NODE_MIN_HEIGHT + (node.sublabel ? NODE_SUBLABEL_FONT_SIZE + 4 : 0) + NODE_PADDING_Y;
28
+ return { w, h };
29
+ }
30
+ /**
31
+ * Longest-path layering. rank(v) = max(rank(u)+1) over edges u→v; roots get 0.
32
+ * Cycle-safe via an iteration cap.
33
+ */
34
+ function assignRanks(spec, sized) {
35
+ const incoming = new Map();
36
+ spec.nodes.forEach((n) => incoming.set(n.id, []));
37
+ spec.edges.forEach((e) => {
38
+ if (incoming.has(e.to))
39
+ incoming.get(e.to).push(e.from);
40
+ });
41
+ const maxIterations = spec.nodes.length + 1;
42
+ for (let iter = 0; iter < maxIterations; iter++) {
43
+ let changed = false;
44
+ for (const n of spec.nodes) {
45
+ const preds = incoming.get(n.id) ?? [];
46
+ let rank = 0;
47
+ for (const p of preds) {
48
+ const pr = sized.get(p).rank;
49
+ rank = Math.max(rank, pr + 1);
50
+ }
51
+ if (rank !== sized.get(n.id).rank) {
52
+ sized.get(n.id).rank = rank;
53
+ changed = true;
54
+ }
55
+ }
56
+ if (!changed)
57
+ break;
58
+ }
59
+ }
60
+ /** Is the primary axis horizontal? */
61
+ function isHorizontal(dir) {
62
+ return dir === 'LR' || dir === 'RL';
63
+ }
64
+ function layout(spec) {
65
+ const dir = spec.direction ?? (spec.kind === 'sequence' ? 'LR' : 'TB');
66
+ const horizontal = isHorizontal(dir);
67
+ const sized = new Map();
68
+ for (const node of spec.nodes) {
69
+ const { w, h } = sizeNode(node);
70
+ sized.set(node.id, { node, w, h, rank: 0, x: 0, y: 0 });
71
+ }
72
+ assignRanks(spec, sized);
73
+ // Bucket nodes by rank, preserving insertion order within a rank.
74
+ const byRank = new Map();
75
+ for (const node of spec.nodes) {
76
+ const s = sized.get(node.id);
77
+ if (!byRank.has(s.rank))
78
+ byRank.set(s.rank, []);
79
+ byRank.get(s.rank).push(s);
80
+ }
81
+ const ranks = [...byRank.keys()].sort((a, b) => a - b);
82
+ // Cross-axis extent of each layer (the dimension nodes are stacked along).
83
+ let maxCrossExtent = 0;
84
+ for (const r of ranks) {
85
+ const layer = byRank.get(r);
86
+ const cross = layer.reduce((sum, s) => sum + (horizontal ? s.h : s.w) + NODE_GAP, -NODE_GAP);
87
+ maxCrossExtent = Math.max(maxCrossExtent, cross);
88
+ }
89
+ // Place each layer along the rank axis; center within the cross axis.
90
+ let rankCursor = CANVAS_PADDING;
91
+ for (const r of ranks) {
92
+ const layer = byRank.get(r);
93
+ const layerThickness = layer.reduce((m, s) => Math.max(m, horizontal ? s.w : s.h), 0);
94
+ const cross = layer.reduce((sum, s) => sum + (horizontal ? s.h : s.w) + NODE_GAP, -NODE_GAP);
95
+ let crossCursor = CANVAS_PADDING + (maxCrossExtent - cross) / 2;
96
+ for (const s of layer) {
97
+ if (horizontal) {
98
+ s.x = rankCursor;
99
+ s.y = crossCursor;
100
+ crossCursor += s.h + NODE_GAP;
101
+ }
102
+ else {
103
+ s.x = crossCursor;
104
+ s.y = rankCursor;
105
+ crossCursor += s.w + NODE_GAP;
106
+ }
107
+ }
108
+ rankCursor += layerThickness + LAYER_GAP;
109
+ }
110
+ const width = horizontal
111
+ ? rankCursor - LAYER_GAP + CANVAS_PADDING
112
+ : maxCrossExtent + CANVAS_PADDING * 2;
113
+ const height = horizontal
114
+ ? maxCrossExtent + CANVAS_PADDING * 2
115
+ : rankCursor - LAYER_GAP + CANVAS_PADDING;
116
+ return { sized, width, height };
117
+ }
118
+ function renderNode(s) {
119
+ const p = palette(s.node.emphasis);
120
+ const rounded = s.node.shape === 'rounded' || s.node.shape === 'pill' ? 10 : 4;
121
+ const cx = s.x + s.w / 2;
122
+ const labelY = s.node.sublabel ? s.y + s.h / 2 - 4 : s.y + s.h / 2;
123
+ const sub = s.node.sublabel
124
+ ? `\n <text x="${cx}" y="${labelY + NODE_SUBLABEL_FONT_SIZE + 4}" font-size="${NODE_SUBLABEL_FONT_SIZE}" fill="${p.text}" text-anchor="middle" opacity="0.75">${esc(s.node.sublabel)}</text>`
125
+ : '';
126
+ return `<g>
127
+ <rect x="${s.x}" y="${s.y}" width="${s.w}" height="${s.h}" rx="${rounded}" fill="${p.fill}" stroke="${p.stroke}" stroke-width="1.5"/>
128
+ <text x="${cx}" y="${labelY}" font-size="${NODE_LABEL_FONT_SIZE}" fill="${p.text}" text-anchor="middle" dominant-baseline="middle" font-weight="500">${esc(s.node.label)}</text>${sub}
129
+ </g>`;
130
+ }
131
+ export const baselineTechnique = {
132
+ key: 'baseline',
133
+ name: 'Baseline (layered)',
134
+ blurb: 'Longest-path layering, naive spacing. The bar the real engines must clear.',
135
+ render(spec) {
136
+ const { sized, width, height } = layout(spec);
137
+ const boxes = [];
138
+ const nodeSvg = [];
139
+ for (const s of sized.values()) {
140
+ boxes.push({
141
+ id: s.node.id,
142
+ x: s.x,
143
+ y: s.y,
144
+ w: s.w,
145
+ h: s.h,
146
+ label: s.node.label,
147
+ fontSize: NODE_LABEL_FONT_SIZE,
148
+ role: 'node',
149
+ });
150
+ nodeSvg.push(renderNode(s));
151
+ }
152
+ const edges = [];
153
+ const edgeSvg = [];
154
+ for (const e of spec.edges) {
155
+ const a = sized.get(e.from);
156
+ const b = sized.get(e.to);
157
+ if (!a || !b)
158
+ continue;
159
+ const x1 = a.x + a.w / 2;
160
+ const y1 = a.y + a.h / 2;
161
+ const x2 = b.x + b.w / 2;
162
+ const y2 = b.y + b.h / 2;
163
+ edges.push({ x1, y1, x2, y2, fromId: e.from, toId: e.to });
164
+ const dash = e.style === 'dashed' ? ' stroke-dasharray="6 4"' : e.style === 'dotted' ? ' stroke-dasharray="2 4"' : '';
165
+ const marker = e.arrow === 'none' ? '' : ' marker-end="url(#arrow-filled)"';
166
+ edgeSvg.push(`<line x1="${x1.toFixed(1)}" y1="${y1.toFixed(1)}" x2="${x2.toFixed(1)}" y2="${y2.toFixed(1)}" stroke="#64748b" stroke-width="1.5"${dash}${marker}/>`);
167
+ if (e.label) {
168
+ edgeSvg.push(`<text x="${((x1 + x2) / 2).toFixed(1)}" y="${((y1 + y2) / 2 - 4).toFixed(1)}" font-size="12" fill="#475569" text-anchor="middle">${esc(e.label)}</text>`);
169
+ }
170
+ }
171
+ const title = spec.title
172
+ ? `<text x="${CANVAS_PADDING}" y="24" font-size="16" font-weight="600" fill="#0f172a">${esc(spec.title)}</text>`
173
+ : '';
174
+ // Edges first so nodes paint on top.
175
+ const body = [title, ...edgeSvg, ...nodeSvg].join('\n');
176
+ const svg = svgDocument(Math.ceil(width), Math.ceil(height), body);
177
+ // The baseline draws plain boxes — it renders NONE of the rich structural
178
+ // features (cards, columns, legend). Reporting all-false is the honest
179
+ // input the fidelity metric needs to expose the gap on case #11.
180
+ return {
181
+ svg,
182
+ width: Math.ceil(width),
183
+ height: Math.ceil(height),
184
+ boxes,
185
+ edges,
186
+ features: {
187
+ cards: false,
188
+ checkpoints: false,
189
+ twoColumn: false,
190
+ legend: false,
191
+ categoryColors: false,
192
+ },
193
+ };
194
+ },
195
+ };
196
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/adapters/baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Technique } from '../ports/Technique.js';
2
+ export declare const elkTechnique: Technique;
3
+ //# sourceMappingURL=elk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elk.d.ts","sourceRoot":"","sources":["../../src/adapters/elk.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAuC,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAqM5F,eAAO,MAAM,YAAY,EAAE,SAkE1B,CAAC"}