agentic-mermaid 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_NATIVE.md +155 -91
- package/CHANGELOG.md +163 -4
- package/Instructions_for_agents.md +10 -10
- package/LICENSES/Apache-2.0.txt +202 -0
- package/README.md +31 -38
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/assets/hero.png +0 -0
- package/dist/agent-core.d.ts +463 -0
- package/dist/agent-core.js +397 -0
- package/dist/agent.d.ts +73 -1868
- package/dist/agent.js +336 -37325
- package/dist/agentic-mermaid-mcp.js +7 -38399
- package/dist/am.js +33626 -40446
- package/dist/chunk-2P5FKUQC.js +3485 -0
- package/dist/chunk-2S3VSS6I.js +149 -0
- package/dist/chunk-2SILJDW2.js +37 -0
- package/dist/chunk-BJYMBT4I.js +61963 -0
- package/dist/chunk-FDM43XU7.js +615 -0
- package/dist/chunk-MYPDVZCO.js +4702 -0
- package/dist/index-DWPa2MJs.d.ts +6780 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +310 -33014
- package/dist/mcp-cli-5J47WEY3.js +17 -0
- package/docs/README.md +39 -31
- package/docs/agent-api-cookbook.md +44 -35
- package/docs/agent-mutation-policy.md +1 -1
- package/docs/agent-workflow-examples.md +2 -2
- package/docs/api.md +284 -77
- package/docs/ascii.md +26 -16
- package/docs/code-mode-impact.md +214 -0
- package/docs/comparison.md +23 -11
- package/docs/computational-aesthetics-prototype-plan.md +252 -0
- package/docs/config.md +26 -10
- package/docs/custom-fonts.md +265 -0
- package/docs/custom-style-cookbook.md +130 -9
- package/docs/diagram-families.md +48 -23
- package/docs/features.md +59 -52
- package/docs/fork-differences.md +6 -3
- package/docs/getting-started.md +23 -16
- package/docs/issue-derived-test-cases.md +29 -22
- package/docs/mcp-code-mode-rationale.md +13 -6
- package/docs/mcp-http-transport.md +20 -13
- package/docs/mermaid-layout-complaints.md +66 -52
- package/docs/mutation-testing.md +145 -66
- package/docs/quality.md +23 -14
- package/docs/react.md +2 -2
- package/docs/schemas/style-spec.schema.json +1221 -30
- package/docs/style-authoring.md +241 -38
- package/docs/svg-semantic-contract.md +49 -0
- package/docs/testing-strategy.md +166 -58
- package/docs/theming.md +19 -32
- package/examples/styles/catalog.json +54 -0
- package/examples/styles/cloudflare-workers-inspired-prototype.mmd +9 -0
- package/examples/styles/cloudflare-workers-inspired-prototype.style.json +110 -0
- package/examples/styles/cupertino-prototype.mmd +10 -0
- package/examples/styles/cupertino-prototype.style.json +63 -0
- package/examples/styles/mid-century-report.style.json +2 -2
- package/examples/styles/star-chart-atlas.style.json +2 -1
- package/examples/styles/transit-route-map.style.json +2 -2
- package/examples/styles/vercel-inspired-prototype.mmd +6 -0
- package/examples/styles/vercel-inspired-prototype.style.json +87 -0
- package/package.json +85 -45
- package/server.json +2 -2
- package/skills/agentic-mermaid-diagram-workflow/SKILL.md +17 -36
- package/skills/agentic-mermaid-diagram-workflow/references/cli.md +4 -5
- package/skills/agentic-mermaid-diagram-workflow/references/code-mode.md +15 -31
- package/skills/agentic-mermaid-diagram-workflow/references/sequence.md +10 -14
- package/skills/agentic-mermaid-live-editor/SKILL.md +100 -206
- package/TODO.md +0 -684
- package/dist/index-wjRjbsP-.d.ts +0 -1102
- package/docs/assets/improvements/box-start-connector.png +0 -0
- package/docs/assets/improvements/comment-dropped-lint.png +0 -0
- package/docs/assets/improvements/er-content-loss.png +0 -0
- package/docs/assets/improvements/fan-in-trunks.png +0 -0
- package/docs/assets/improvements/gantt-family.png +0 -0
- package/docs/assets/improvements/gantt-milestone-clamp.png +0 -0
- package/docs/assets/improvements/gantt-verify-seam.png +0 -0
- package/docs/assets/improvements/subgraph-container-edges.png +0 -0
- package/docs/assets/improvements/wrapper-frontmatter.png +0 -0
- package/docs/assets/improvements/wrapper-init-directive.png +0 -0
- package/docs/assets/improvements/wrapper-leading-comment.png +0 -0
- package/docs/assets/style-cookbook/mid-century-report.png +0 -0
- package/docs/assets/style-cookbook/star-chart-atlas.png +0 -0
- package/docs/assets/style-cookbook/transit-route-map.png +0 -0
- package/docs/contributing/adding-diagram-types.md +0 -144
- package/docs/contributing/diagram-family-citizenship.matrix.json +0 -2127
- package/docs/contributing/diagram-family-citizenship.md +0 -82
- package/docs/contributing/harvesting-upstream-tests.md +0 -126
- package/docs/contributing/lessons-learned.md +0 -276
- package/docs/contributing/releasing.md +0 -82
- package/docs/contributing/visual-review-evidence.md +0 -53
- package/docs/design/families/README.md +0 -26
- package/docs/design/families/architecture-beta.md +0 -48
- package/docs/design/families/flowchart-parser-conformance.md +0 -22
- package/docs/design/families/gantt-research.md +0 -137
- package/docs/design/families/gantt.md +0 -329
- package/docs/design/families/journey-agentic-cards-before.png +0 -0
- package/docs/design/families/journey-experience-curve-implementation.png +0 -0
- package/docs/design/families/journey-mermaid-classic-implementation.png +0 -0
- package/docs/design/families/journey-mermaid-classic-prototype.png +0 -0
- package/docs/design/families/journey-mermaid-classic-prototype.svg +0 -163
- package/docs/design/families/journey-mermaid-classic-prototype.svg.png +0 -0
- package/docs/design/families/journey-migration-parity.md +0 -439
- package/docs/design/families/journey-section-overlap-after.png +0 -0
- package/docs/design/families/journey-section-overlap-before.png +0 -0
- package/docs/design/families/journey-usage-research.md +0 -423
- package/docs/design/families/journey.md +0 -153
- package/docs/design/families/xychart.md +0 -85
- package/docs/design/system/README.md +0 -45
- package/docs/design/system/abstraction-audit.md +0 -224
- package/docs/design/system/abstraction-recommendations.md +0 -655
- package/docs/design/system/architecture.mmd +0 -29
- package/docs/design/system/architecture.svg +0 -137
- package/docs/design/system/layout-guarantees-and-robustness.md +0 -351
- package/docs/design/system/layout-rubric.md +0 -138
- package/docs/design/system/route-contracts.md +0 -848
- package/docs/design/system/source-preservation-ladder.md +0 -52
- package/docs/design/system/styles-rollout.md +0 -216
- package/docs/design/system/ugly-layouts.md +0 -119
- package/docs/layout-characterization/README.md +0 -245
- package/docs/layout-characterization/contact-sheet-families.md +0 -498
- package/docs/layout-characterization/contact-sheet.md +0 -638
- package/docs/layout-characterization/properties.md +0 -281
- package/docs/layout-characterization/visual-quality.md +0 -160
- package/docs/layout-characterization/visual-snapshots/architecture.svg +0 -79
- package/docs/layout-characterization/visual-snapshots/class.svg +0 -60
- package/docs/layout-characterization/visual-snapshots/er.svg +0 -61
- package/docs/layout-characterization/visual-snapshots/flowchart.svg +0 -58
- package/docs/layout-characterization/visual-snapshots/gantt.svg +0 -52
- package/docs/layout-characterization/visual-snapshots/journey.svg +0 -98
- package/docs/layout-characterization/visual-snapshots/pie.svg +0 -36
- package/docs/layout-characterization/visual-snapshots/quadrant.svg +0 -47
- package/docs/layout-characterization/visual-snapshots/sequence.svg +0 -59
- package/docs/layout-characterization/visual-snapshots/state.svg +0 -52
- package/docs/layout-characterization/visual-snapshots/timeline.svg +0 -64
- package/docs/layout-characterization/visual-snapshots/xychart.svg +0 -97
- package/docs/project/divergences.md +0 -98
- package/docs/project/dogfooding-docs-strategy.md +0 -66
- package/docs/project/hosted-mcp-cloudflare-plan.md +0 -338
- package/docs/project/lessons-learned.md +0 -1019
- package/docs/project/remove-role-styling-plan.md +0 -176
- package/examples/agent-improve-auth-flow.ts +0 -206
- package/examples/agent-loop.ts +0 -53
- package/examples/mcp-vs-cli-complex-diagrams.ts +0 -133
- package/llms.txt +0 -104
- package/skill-evals/README.md +0 -77
- package/skill-evals/fixtures/architecture-cache/input.mmd +0 -5
- package/skill-evals/fixtures/class-payment/input.mmd +0 -4
- package/skill-evals/fixtures/er-orders/input.mmd +0 -10
- package/skill-evals/fixtures/flowchart-cache/input.mmd +0 -3
- package/skill-evals/fixtures/gantt-release/input.mmd +0 -7
- package/skill-evals/fixtures/journey-checkout/input.mmd +0 -6
- package/skill-evals/fixtures/pie-exports/input.mmd +0 -5
- package/skill-evals/fixtures/quadrant-priorities/input.mmd +0 -11
- package/skill-evals/fixtures/sequence-retry/input.mmd +0 -8
- package/skill-evals/fixtures/state-lifecycle/input.mmd +0 -5
- package/skill-evals/fixtures/timeline-release/input.mmd +0 -6
- package/skill-evals/fixtures/xychart-growth/input.mmd +0 -5
- package/skill-evals/shared-benchmark.json +0 -510
- package/src/agent/analyze.ts +0 -157
- package/src/agent/apply.ts +0 -146
- package/src/agent/architecture-body.ts +0 -458
- package/src/agent/certificates.ts +0 -110
- package/src/agent/class-body.ts +0 -319
- package/src/agent/core.ts +0 -207
- package/src/agent/create.ts +0 -106
- package/src/agent/describe.ts +0 -368
- package/src/agent/er-body.ts +0 -224
- package/src/agent/facts.ts +0 -360
- package/src/agent/families-builtin.ts +0 -920
- package/src/agent/families.ts +0 -232
- package/src/agent/family-layouts.ts +0 -832
- package/src/agent/flowchart-body.ts +0 -372
- package/src/agent/flowchart-unsupported.ts +0 -243
- package/src/agent/font-coverage.ts +0 -288
- package/src/agent/gantt-body.ts +0 -495
- package/src/agent/index.ts +0 -10
- package/src/agent/journey-body.ts +0 -374
- package/src/agent/label-metrics.ts +0 -28
- package/src/agent/layout-to-rendered.ts +0 -63
- package/src/agent/mutate.ts +0 -97
- package/src/agent/mutation-ops.ts +0 -51
- package/src/agent/op-schema.ts +0 -443
- package/src/agent/parse.ts +0 -223
- package/src/agent/pie-body.ts +0 -270
- package/src/agent/png.ts +0 -171
- package/src/agent/quadrant-body.ts +0 -336
- package/src/agent/quality.ts +0 -363
- package/src/agent/readability-audit.ts +0 -92
- package/src/agent/rendered-route-audit.ts +0 -61
- package/src/agent/sequence-body.ts +0 -345
- package/src/agent/serialize.ts +0 -214
- package/src/agent/state-body.ts +0 -589
- package/src/agent/structural-count.ts +0 -150
- package/src/agent/timeline-body.ts +0 -280
- package/src/agent/trace-log.ts +0 -43
- package/src/agent/types.ts +0 -995
- package/src/agent/verify.ts +0 -603
- package/src/agent/xychart-body.ts +0 -472
- package/src/architecture/config.ts +0 -282
- package/src/architecture/layout.ts +0 -496
- package/src/architecture/parser.ts +0 -375
- package/src/architecture/renderer.ts +0 -611
- package/src/architecture/types.ts +0 -113
- package/src/ascii/ansi.ts +0 -423
- package/src/ascii/architecture.ts +0 -210
- package/src/ascii/canvas.ts +0 -443
- package/src/ascii/class-diagram.ts +0 -697
- package/src/ascii/converter.ts +0 -475
- package/src/ascii/draw.ts +0 -1693
- package/src/ascii/edge-bundling.ts +0 -328
- package/src/ascii/edge-routing.ts +0 -330
- package/src/ascii/er-diagram.ts +0 -439
- package/src/ascii/gantt.ts +0 -276
- package/src/ascii/grid.ts +0 -747
- package/src/ascii/index.ts +0 -196
- package/src/ascii/journey.ts +0 -169
- package/src/ascii/meta.ts +0 -244
- package/src/ascii/multiline-utils.ts +0 -80
- package/src/ascii/pathfinder.ts +0 -301
- package/src/ascii/pie.ts +0 -67
- package/src/ascii/quadrant.ts +0 -158
- package/src/ascii/reverse.ts +0 -216
- package/src/ascii/sequence.ts +0 -499
- package/src/ascii/shapes/circle.ts +0 -27
- package/src/ascii/shapes/corners.ts +0 -143
- package/src/ascii/shapes/diamond.ts +0 -27
- package/src/ascii/shapes/hexagon.ts +0 -27
- package/src/ascii/shapes/index.ts +0 -106
- package/src/ascii/shapes/rectangle.ts +0 -168
- package/src/ascii/shapes/rounded.ts +0 -27
- package/src/ascii/shapes/special.ts +0 -332
- package/src/ascii/shapes/stadium.ts +0 -110
- package/src/ascii/shapes/state.ts +0 -192
- package/src/ascii/shapes/types.ts +0 -73
- package/src/ascii/timeline.ts +0 -141
- package/src/ascii/types.ts +0 -312
- package/src/ascii/validate.ts +0 -120
- package/src/ascii/width.ts +0 -81
- package/src/ascii/wrap.ts +0 -131
- package/src/ascii/xychart.ts +0 -919
- package/src/browser.ts +0 -29
- package/src/class/layout.ts +0 -240
- package/src/class/parser.ts +0 -332
- package/src/class/renderer.ts +0 -638
- package/src/class/types.ts +0 -129
- package/src/cli/agent-instructions.ts +0 -1
- package/src/cli/am-bin.ts +0 -6
- package/src/cli/exit-codes.ts +0 -18
- package/src/cli/index.ts +0 -1132
- package/src/cli/init-agent.ts +0 -147
- package/src/cli/run-entrypoint.ts +0 -10
- package/src/color-resolver.ts +0 -152
- package/src/elk-instance.ts +0 -114
- package/src/er/layout.ts +0 -187
- package/src/er/parser.ts +0 -226
- package/src/er/renderer.ts +0 -792
- package/src/er/types.ts +0 -99
- package/src/family-rubric.ts +0 -425
- package/src/font-manifest.ts +0 -31
- package/src/gantt/layout.ts +0 -365
- package/src/gantt/parser.ts +0 -282
- package/src/gantt/pipeline.ts +0 -27
- package/src/gantt/renderer.ts +0 -414
- package/src/gantt/schedule.ts +0 -513
- package/src/gantt/types.ts +0 -255
- package/src/index.ts +0 -368
- package/src/journey/layout.ts +0 -554
- package/src/journey/parse-core.ts +0 -251
- package/src/journey/parser.ts +0 -101
- package/src/journey/renderer.ts +0 -917
- package/src/journey/types.ts +0 -144
- package/src/layout/geometry.ts +0 -182
- package/src/layout/pass.ts +0 -142
- package/src/layout/passes/index.ts +0 -3916
- package/src/layout-engine.ts +0 -1565
- package/src/layout-rubric.ts +0 -659
- package/src/mcp/artifacts.ts +0 -137
- package/src/mcp/dynamic-harness.ts +0 -31
- package/src/mcp/dynamic-modules.d.ts +0 -7
- package/src/mcp/facade.ts +0 -608
- package/src/mcp/harness-runtime.ts +0 -203
- package/src/mcp/hosted-server.ts +0 -468
- package/src/mcp/mcp-bin.ts +0 -3
- package/src/mcp/mcp-cli.ts +0 -82
- package/src/mcp/protocol.ts +0 -13
- package/src/mcp/sandbox.ts +0 -195
- package/src/mcp/sdk-decl.ts +0 -391
- package/src/mcp/server.ts +0 -362
- package/src/mcp/tool-surface.ts +0 -146
- package/src/mermaid-source.ts +0 -655
- package/src/multiline-utils.ts +0 -228
- package/src/parser.ts +0 -1031
- package/src/pie/layout.ts +0 -168
- package/src/pie/parser.ts +0 -136
- package/src/pie/renderer.ts +0 -234
- package/src/pie/types.ts +0 -82
- package/src/quadrant/layout.ts +0 -191
- package/src/quadrant/parser.ts +0 -183
- package/src/quadrant/renderer.ts +0 -322
- package/src/quadrant/types.ts +0 -113
- package/src/render-family-hooks.ts +0 -244
- package/src/renderer.ts +0 -1099
- package/src/route-contracts.ts +0 -2723
- package/src/scene/backend.ts +0 -76
- package/src/scene/fidelity.ts +0 -183
- package/src/scene/hybrid-backend.ts +0 -174
- package/src/scene/ir.ts +0 -181
- package/src/scene/marks.ts +0 -127
- package/src/scene/rough-backend.ts +0 -378
- package/src/scene/seed.ts +0 -46
- package/src/scene/style-registry.ts +0 -556
- package/src/sequence/layout.ts +0 -456
- package/src/sequence/parser.ts +0 -255
- package/src/sequence/renderer.ts +0 -604
- package/src/sequence/types.ts +0 -154
- package/src/shape-clipping.ts +0 -351
- package/src/shared/accessibility-directives.ts +0 -22
- package/src/shared/batched.ts +0 -61
- package/src/shared/color-math.ts +0 -93
- package/src/shared/svg-a11y.ts +0 -29
- package/src/shared/syntax-error.ts +0 -17
- package/src/shared/unicode-ranges.ts +0 -135
- package/src/styles.ts +0 -318
- package/src/svg-paths.ts +0 -28
- package/src/text-metrics.ts +0 -248
- package/src/theme.ts +0 -710
- package/src/timeline/layout.ts +0 -381
- package/src/timeline/parser.ts +0 -215
- package/src/timeline/renderer.ts +0 -538
- package/src/timeline/types.ts +0 -105
- package/src/types.ts +0 -462
- package/src/website-worker-modules.d.ts +0 -18
- package/src/xychart/axis-utils.ts +0 -109
- package/src/xychart/colors.ts +0 -124
- package/src/xychart/config.ts +0 -88
- package/src/xychart/layout.ts +0 -656
- package/src/xychart/parser.ts +0 -504
- package/src/xychart/renderer.ts +0 -640
- package/src/xychart/types.ts +0 -282
package/src/xychart/colors.ts
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// XY Chart — shared color palette
|
|
3
|
-
//
|
|
4
|
-
// Generates monochromatic shades from the theme accent color.
|
|
5
|
-
// Series 0 = accent (or blue fallback). Series 1+ are darker/lighter
|
|
6
|
-
// shades of the same hue with subtle hue drift to stay in the same
|
|
7
|
-
// color family (like navy ↔ cyan from blue).
|
|
8
|
-
//
|
|
9
|
-
// Used by both the SVG and ASCII renderers.
|
|
10
|
-
// ============================================================================
|
|
11
|
-
|
|
12
|
-
/** Default accent for charts when the theme doesn't provide one. */
|
|
13
|
-
import { parseHex, toHex, mixHex, isSixDigitHex } from '../shared/color-math.ts'
|
|
14
|
-
export const CHART_ACCENT_FALLBACK = '#3b82f6' // blue-500
|
|
15
|
-
|
|
16
|
-
// ---------------------------------------------------------------------------
|
|
17
|
-
// HSL ↔ Hex conversion
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
|
|
20
|
-
export function hexToHsl(hex: string): [number, number, number] {
|
|
21
|
-
const [r8, g8, b8] = parseHex(hex)
|
|
22
|
-
const ri = r8 / 255
|
|
23
|
-
const gi = g8 / 255
|
|
24
|
-
const bi = b8 / 255
|
|
25
|
-
|
|
26
|
-
const max = Math.max(ri, gi, bi)
|
|
27
|
-
const min = Math.min(ri, gi, bi)
|
|
28
|
-
const l = (max + min) / 2
|
|
29
|
-
|
|
30
|
-
if (max === min) return [0, 0, l * 100]
|
|
31
|
-
|
|
32
|
-
const d = max - min
|
|
33
|
-
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
|
|
34
|
-
|
|
35
|
-
let hue: number
|
|
36
|
-
if (max === ri) hue = ((gi - bi) / d + (gi < bi ? 6 : 0)) / 6
|
|
37
|
-
else if (max === gi) hue = ((bi - ri) / d + 2) / 6
|
|
38
|
-
else hue = ((ri - gi) / d + 4) / 6
|
|
39
|
-
|
|
40
|
-
return [hue * 360, s * 100, l * 100]
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function hslToHex(h: number, s: number, l: number): string {
|
|
44
|
-
const si = s / 100
|
|
45
|
-
const li = l / 100
|
|
46
|
-
|
|
47
|
-
const c = (1 - Math.abs(2 * li - 1)) * si
|
|
48
|
-
const x = c * (1 - Math.abs(((h / 60) % 2) - 1))
|
|
49
|
-
const m = li - c / 2
|
|
50
|
-
|
|
51
|
-
let r: number, g: number, b: number
|
|
52
|
-
if (h < 60) { r = c; g = x; b = 0 }
|
|
53
|
-
else if (h < 120) { r = x; g = c; b = 0 }
|
|
54
|
-
else if (h < 180) { r = 0; g = c; b = x }
|
|
55
|
-
else if (h < 240) { r = 0; g = x; b = c }
|
|
56
|
-
else if (h < 300) { r = x; g = 0; b = c }
|
|
57
|
-
else { r = c; g = 0; b = x }
|
|
58
|
-
|
|
59
|
-
const toHex = (v: number) => Math.round((v + m) * 255).toString(16).padStart(2, '0')
|
|
60
|
-
return `#${toHex(r)}${toHex(g)}${toHex(b)}`
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
// Hex ↔ RGB conversion
|
|
65
|
-
// ---------------------------------------------------------------------------
|
|
66
|
-
|
|
67
|
-
// ---------------------------------------------------------------------------
|
|
68
|
-
// Public API
|
|
69
|
-
// ---------------------------------------------------------------------------
|
|
70
|
-
|
|
71
|
-
/** Check whether a string is a valid 6-digit hex color (e.g. "#3b82f6"). */
|
|
72
|
-
export function isValidHex(color: string): boolean {
|
|
73
|
-
return isSixDigitHex(color)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Detect whether a background color is dark (lightness < 50%).
|
|
78
|
-
*/
|
|
79
|
-
export function isDarkBackground(bgHex: string): boolean {
|
|
80
|
-
return hexToHsl(bgHex)[2] < 50
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Mix two hex colors in RGB space.
|
|
85
|
-
* `ratio` controls how much of `fgHex` shows: 0 = pure bg, 1 = pure fg.
|
|
86
|
-
* Equivalent to alpha-compositing fg over bg at the given opacity.
|
|
87
|
-
*/
|
|
88
|
-
export function mixHexColors(bgHex: string, fgHex: string, ratio: number): string {
|
|
89
|
-
return mixHex(fgHex, bgHex, ratio * 100)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Get the hex color for a series index.
|
|
94
|
-
* Index 0 returns the accent color as-is.
|
|
95
|
-
* Index 1+ alternate between darker and lighter shades of the same hue
|
|
96
|
-
* with subtle hue drift (±8-12° per tier) to stay in the same family.
|
|
97
|
-
*
|
|
98
|
-
* When `bgColor` is provided, shade direction adapts to the background:
|
|
99
|
-
* - Light bg: odd = darker, even = lighter (default)
|
|
100
|
-
* - Dark bg: odd = lighter, even = darker (so shades stay visible)
|
|
101
|
-
*/
|
|
102
|
-
export function getSeriesColor(index: number, accentColor: string, bgColor?: string): string {
|
|
103
|
-
if (index === 0) return accentColor
|
|
104
|
-
// Fall back to defaults when inputs aren't valid hex (e.g. CSS variable refs like "var(--accent)")
|
|
105
|
-
const safeAccent = isValidHex(accentColor) ? accentColor : CHART_ACCENT_FALLBACK
|
|
106
|
-
const safeBg = bgColor && isValidHex(bgColor) ? bgColor : undefined
|
|
107
|
-
const [h, s] = hexToHsl(safeAccent)
|
|
108
|
-
const chartS = Math.max(55, Math.min(85, s))
|
|
109
|
-
|
|
110
|
-
const tier = Math.ceil(index / 2)
|
|
111
|
-
const oddIndex = index % 2 === 1
|
|
112
|
-
|
|
113
|
-
// On dark backgrounds, flip: odd = lighter, even = darker
|
|
114
|
-
const dark = safeBg && isDarkBackground(safeBg) ? !oddIndex : oddIndex
|
|
115
|
-
const l = dark
|
|
116
|
-
? Math.max(25, 48 - tier * 13)
|
|
117
|
-
: Math.min(78, 55 + tier * 11)
|
|
118
|
-
|
|
119
|
-
// Subtle hue drift: darker shades shift slightly negative, lighter shift positive
|
|
120
|
-
const hShift = (dark ? -8 : 12) * tier
|
|
121
|
-
const newH = ((h + hShift) % 360 + 360) % 360
|
|
122
|
-
|
|
123
|
-
return hslToHex(newH, chartS, l)
|
|
124
|
-
}
|
package/src/xychart/config.ts
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ResolvedXYAxisRenderConfig,
|
|
3
|
-
ResolvedXYChartConfig,
|
|
4
|
-
XYAxisRenderConfig,
|
|
5
|
-
XYChartConfig,
|
|
6
|
-
} from './types.ts'
|
|
7
|
-
|
|
8
|
-
export const DEFAULT_XY_AXIS_CONFIG: ResolvedXYAxisRenderConfig = {
|
|
9
|
-
showLabel: true,
|
|
10
|
-
labelFontSize: 14,
|
|
11
|
-
labelPadding: 5,
|
|
12
|
-
showTitle: true,
|
|
13
|
-
titleFontSize: 16,
|
|
14
|
-
titlePadding: 5,
|
|
15
|
-
showTick: true,
|
|
16
|
-
tickLength: 5,
|
|
17
|
-
tickWidth: 2,
|
|
18
|
-
showAxisLine: true,
|
|
19
|
-
axisLineWidth: 2,
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const DEFAULT_XY_CHART_CONFIG: ResolvedXYChartConfig = {
|
|
23
|
-
width: 700,
|
|
24
|
-
height: 500,
|
|
25
|
-
useMaxWidth: true,
|
|
26
|
-
useWidth: undefined,
|
|
27
|
-
titleFontSize: 20,
|
|
28
|
-
titlePadding: 10,
|
|
29
|
-
chartOrientation: 'vertical',
|
|
30
|
-
plotReservedSpacePercent: 50,
|
|
31
|
-
showDataLabel: false,
|
|
32
|
-
showTitle: true,
|
|
33
|
-
xAxis: { ...DEFAULT_XY_AXIS_CONFIG },
|
|
34
|
-
yAxis: { ...DEFAULT_XY_AXIS_CONFIG },
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function resolveXYAxisRenderConfig(config?: XYAxisRenderConfig): ResolvedXYAxisRenderConfig {
|
|
38
|
-
return {
|
|
39
|
-
showLabel: config?.showLabel ?? DEFAULT_XY_AXIS_CONFIG.showLabel,
|
|
40
|
-
labelFontSize: getPositiveNumber(config?.labelFontSize, DEFAULT_XY_AXIS_CONFIG.labelFontSize),
|
|
41
|
-
labelPadding: getNonNegativeNumber(config?.labelPadding, DEFAULT_XY_AXIS_CONFIG.labelPadding),
|
|
42
|
-
showTitle: config?.showTitle ?? DEFAULT_XY_AXIS_CONFIG.showTitle,
|
|
43
|
-
titleFontSize: getPositiveNumber(config?.titleFontSize, DEFAULT_XY_AXIS_CONFIG.titleFontSize),
|
|
44
|
-
titlePadding: getNonNegativeNumber(config?.titlePadding, DEFAULT_XY_AXIS_CONFIG.titlePadding),
|
|
45
|
-
showTick: config?.showTick ?? DEFAULT_XY_AXIS_CONFIG.showTick,
|
|
46
|
-
tickLength: getNonNegativeNumber(config?.tickLength, DEFAULT_XY_AXIS_CONFIG.tickLength),
|
|
47
|
-
tickWidth: getPositiveNumber(config?.tickWidth, DEFAULT_XY_AXIS_CONFIG.tickWidth),
|
|
48
|
-
showAxisLine: config?.showAxisLine ?? DEFAULT_XY_AXIS_CONFIG.showAxisLine,
|
|
49
|
-
axisLineWidth: getPositiveNumber(config?.axisLineWidth, DEFAULT_XY_AXIS_CONFIG.axisLineWidth),
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function resolveXYChartRenderConfig(config: XYChartConfig): ResolvedXYChartConfig {
|
|
54
|
-
return {
|
|
55
|
-
width: getPositiveNumber(config.width, DEFAULT_XY_CHART_CONFIG.width),
|
|
56
|
-
height: getPositiveNumber(config.height, DEFAULT_XY_CHART_CONFIG.height),
|
|
57
|
-
useMaxWidth: config.useMaxWidth ?? DEFAULT_XY_CHART_CONFIG.useMaxWidth,
|
|
58
|
-
useWidth: getOptionalPositiveNumber(config.useWidth),
|
|
59
|
-
titleFontSize: getPositiveNumber(config.titleFontSize, DEFAULT_XY_CHART_CONFIG.titleFontSize),
|
|
60
|
-
titlePadding: getNonNegativeNumber(config.titlePadding, DEFAULT_XY_CHART_CONFIG.titlePadding),
|
|
61
|
-
chartOrientation: config.chartOrientation ?? DEFAULT_XY_CHART_CONFIG.chartOrientation,
|
|
62
|
-
plotReservedSpacePercent: clamp(
|
|
63
|
-
getPositiveNumber(config.plotReservedSpacePercent, DEFAULT_XY_CHART_CONFIG.plotReservedSpacePercent),
|
|
64
|
-
10,
|
|
65
|
-
100,
|
|
66
|
-
),
|
|
67
|
-
showDataLabel: config.showDataLabel ?? DEFAULT_XY_CHART_CONFIG.showDataLabel,
|
|
68
|
-
showTitle: config.showTitle ?? DEFAULT_XY_CHART_CONFIG.showTitle,
|
|
69
|
-
xAxis: resolveXYAxisRenderConfig(config.xAxis),
|
|
70
|
-
yAxis: resolveXYAxisRenderConfig(config.yAxis),
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function getPositiveNumber(value: number | undefined, fallback: number): number {
|
|
75
|
-
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function getNonNegativeNumber(value: number | undefined, fallback: number): number {
|
|
79
|
-
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : fallback
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function getOptionalPositiveNumber(value: number | undefined): number | undefined {
|
|
83
|
-
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : undefined
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function clamp(value: number, min: number, max: number): number {
|
|
87
|
-
return Math.min(max, Math.max(min, value))
|
|
88
|
-
}
|