@zukhruf/diagram 0.3.31 → 0.3.32

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.
@@ -56,7 +56,15 @@ export function gridAreas(ir) {
56
56
  };
57
57
  }
58
58
  function explicitArea(group) {
59
- if (group.row === undefined && group.col === undefined) return undefined;
59
+ const {
60
+ row,
61
+ col,
62
+ rowSpan,
63
+ colSpan
64
+ } = group;
65
+ if ([row, col, rowSpan, colSpan].every(value => value === undefined)) {
66
+ return undefined;
67
+ }
60
68
  return checkedArea(`group "${group.id}"`, group);
61
69
  }
62
70
  function checkedArea(what, cell) {
@@ -66,18 +74,19 @@ function checkedArea(what, cell) {
66
74
  throw new Error(`Diagram ${what} ${key} ${value} must be a non-negative integer.`);
67
75
  }
68
76
  }
69
- for (const key of ['rowSpan', 'colSpan']) {
70
- const value = cell[key] ?? 1;
71
- if (!Number.isInteger(value) || value < 1) {
72
- throw new Error(`Diagram ${what} ${key} ${value} must be an integer of at least 1.`);
73
- }
74
- }
75
- return {
77
+ // An area without a span covers one track, as a CSS Grid item does.
78
+ const area = {
76
79
  row: cell.row,
77
80
  col: cell.col,
78
81
  rowSpan: cell.rowSpan ?? 1,
79
82
  colSpan: cell.colSpan ?? 1
80
83
  };
84
+ for (const key of ['rowSpan', 'colSpan']) {
85
+ if (!Number.isInteger(area[key]) || area[key] < 1) {
86
+ throw new Error(`Diagram ${what} ${key} ${area[key]} must be an integer of at least 1.`);
87
+ }
88
+ }
89
+ return area;
81
90
  }
82
91
  function boundingArea(group, members) {
83
92
  if (members.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"areas.js","names":["gridAreas","ir","nodes","Map","map","node","id","checkedArea","rejectSharedCells","groupsById","groups","group","undefined","has","Error","depth","parent","get","areas","areaOf","known","members","filter","what","area","child","explicitArea","boundingArea","member","covers","formatArea","set","sort","a","b","rejectSiblingOverlap","rejectStrangers","rejectSingleCellDividers","all","values","rows","Math","max","row","rowSpan","cols","col","colSpan","cell","key","value","Number","isInteger","length","min","occupant","cellsOf","other","index","entries","slice","firstSharedCell","ancestors","ids","Set","add","memberOf","groupArea","dividers","outer","inner","shared","range","start","span"],"sources":["../../../../src/lib/layouts/graph/areas.ts"],"sourcesContent":["import type {\n DiagramGraphIR,\n DiagramGroup,\n DiagramNode,\n} from '../../model/diagram-ir.ts';\n\n/** A rectangle of grid cells: rows `[row, row + rowSpan)` and columns `[col, col + colSpan)`. */\nexport type CellArea = {\n row: number;\n col: number;\n rowSpan: number;\n colSpan: number;\n};\n\nexport type GroupArea = {\n group: DiagramGroup;\n /** The nesting level; a top-level group is depth 0. */\n depth: number;\n area: CellArea;\n};\n\nexport type GridAreas = {\n rows: number;\n cols: number;\n nodes: Map<string, CellArea>;\n /** Parents before their children. */\n groups: GroupArea[];\n};\n\n/**\n * Gives every node and group its cell area and rejects a grid that cannot be\n * drawn without overlap. Each error names the elements and the cells.\n */\nexport function gridAreas(ir: DiagramGraphIR): GridAreas {\n const nodes = new Map(\n ir.nodes.map(\n (node) => [node.id, checkedArea(`node \"${node.id}\"`, node)] as const,\n ),\n );\n rejectSharedCells(ir.nodes, nodes);\n\n const groupsById = new Map(ir.groups.map((group) => [group.id, group]));\n for (const node of ir.nodes) {\n if (node.group !== undefined && !groupsById.has(node.group)) {\n throw new Error(\n `Diagram node \"${node.id}\" names group \"${node.group}\", which does not exist.`,\n );\n }\n }\n const depth = (group: DiagramGroup): number => {\n const parent = group.parent && groupsById.get(group.parent);\n return parent ? depth(parent) + 1 : 0;\n };\n\n const areas = new Map<string, CellArea>();\n const areaOf = (group: DiagramGroup): CellArea => {\n const known = areas.get(group.id);\n if (known) return known;\n const members = [\n ...ir.nodes\n .filter((node) => node.group === group.id)\n .map((node) => ({\n what: `node \"${node.id}\"`,\n area: nodes.get(node.id)!,\n })),\n ...ir.groups\n .filter((child) => child.parent === group.id)\n .map((child) => ({ what: `group \"${child.id}\"`, area: areaOf(child) })),\n ];\n const area = explicitArea(group) ?? boundingArea(group, members);\n for (const member of members) {\n if (!covers(area, member.area)) {\n throw new Error(\n `Diagram group \"${group.id}\" area ${formatArea(area)} misses its member ${member.what} at ${formatArea(member.area)}.`,\n );\n }\n }\n areas.set(group.id, area);\n return area;\n };\n\n const groups = ir.groups\n .map((group) => ({ group, depth: depth(group), area: areaOf(group) }))\n .sort((a, b) => a.depth - b.depth);\n rejectSiblingOverlap(groups);\n rejectStrangers(ir.nodes, nodes, groups, groupsById);\n rejectSingleCellDividers(groups);\n\n const all = [...nodes.values(), ...groups.map(({ area }) => area)];\n return {\n rows: Math.max(0, ...all.map((area) => area.row + area.rowSpan)),\n cols: Math.max(0, ...all.map((area) => area.col + area.colSpan)),\n nodes,\n groups,\n };\n}\n\nfunction explicitArea(group: DiagramGroup): CellArea | undefined {\n if (group.row === undefined && group.col === undefined) return undefined;\n return checkedArea(`group \"${group.id}\"`, group);\n}\n\nfunction checkedArea(\n what: string,\n cell: {\n row?: number | undefined;\n col?: number | undefined;\n rowSpan?: number | undefined;\n colSpan?: number | undefined;\n },\n): CellArea {\n for (const key of ['row', 'col'] as const) {\n const value = cell[key];\n if (value === undefined || !Number.isInteger(value) || value < 0) {\n throw new Error(\n `Diagram ${what} ${key} ${value} must be a non-negative integer.`,\n );\n }\n }\n for (const key of ['rowSpan', 'colSpan'] as const) {\n const value = cell[key] ?? 1;\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(\n `Diagram ${what} ${key} ${value} must be an integer of at least 1.`,\n );\n }\n }\n return {\n row: cell.row!,\n col: cell.col!,\n rowSpan: cell.rowSpan ?? 1,\n colSpan: cell.colSpan ?? 1,\n };\n}\n\nfunction boundingArea(\n group: DiagramGroup,\n members: { area: CellArea }[],\n): CellArea {\n if (members.length === 0) {\n throw new Error(\n `Diagram group \"${group.id}\" has no members and no area. Give it members or row, col, rowSpan and colSpan.`,\n );\n }\n const areas = members.map(({ area }) => area);\n const row = Math.min(...areas.map((area) => area.row));\n const col = Math.min(...areas.map((area) => area.col));\n return {\n row,\n col,\n rowSpan: Math.max(...areas.map((area) => area.row + area.rowSpan)) - row,\n colSpan: Math.max(...areas.map((area) => area.col + area.colSpan)) - col,\n };\n}\n\nfunction rejectSharedCells(\n nodes: DiagramNode[],\n areas: Map<string, CellArea>,\n): void {\n const occupant = new Map<string, string>();\n for (const node of nodes) {\n for (const { row, col } of cellsOf(areas.get(node.id)!)) {\n const key = `${row},${col}`;\n const other = occupant.get(key);\n if (other !== undefined) {\n throw new Error(\n `Diagram nodes \"${other}\" and \"${node.id}\" both occupy cell (row ${row}, col ${col}).`,\n );\n }\n occupant.set(key, node.id);\n }\n }\n}\n\nfunction rejectSiblingOverlap(groups: GroupArea[]): void {\n for (const [index, a] of groups.entries()) {\n for (const b of groups.slice(index + 1)) {\n if (a.group.parent !== b.group.parent) continue;\n const cell = firstSharedCell(a.area, b.area);\n if (cell) {\n throw new Error(\n `Diagram groups \"${a.group.id}\" and \"${b.group.id}\" overlap at cell (row ${cell.row}, col ${cell.col}). Sibling groups need disjoint areas.`,\n );\n }\n }\n }\n}\n\n/** A node inside a group's area must belong to the group, or its border would cut through the node. */\nfunction rejectStrangers(\n nodes: DiagramNode[],\n areas: Map<string, CellArea>,\n groups: GroupArea[],\n groupsById: Map<string, DiagramGroup>,\n): void {\n const ancestors = (node: DiagramNode) => {\n const ids = new Set<string>();\n for (\n let id = node.group;\n id !== undefined && !ids.has(id);\n id = groupsById.get(id)?.parent\n ) {\n ids.add(id);\n }\n return ids;\n };\n for (const node of nodes) {\n const memberOf = ancestors(node);\n const area = areas.get(node.id)!;\n for (const { group, area: groupArea } of groups) {\n if (memberOf.has(group.id) || !firstSharedCell(area, groupArea)) continue;\n throw new Error(\n `Diagram node \"${node.id}\" lies inside the area of group \"${group.id}\" ${formatArea(groupArea)} but is not its member. Move it into the group or out of the area.`,\n );\n }\n }\n}\n\nfunction rejectSingleCellDividers(groups: GroupArea[]): void {\n for (const { group, area } of groups) {\n if (group.dividers && area.rowSpan === 1 && area.colSpan === 1) {\n throw new Error(\n `Diagram group \"${group.id}\" has dividers, but its area is the one cell (row ${area.row}, col ${area.col}). Dividers need two rows or two columns.`,\n );\n }\n }\n}\n\nfunction covers(outer: CellArea, inner: CellArea): boolean {\n return (\n inner.row >= outer.row &&\n inner.col >= outer.col &&\n inner.row + inner.rowSpan <= outer.row + outer.rowSpan &&\n inner.col + inner.colSpan <= outer.col + outer.colSpan\n );\n}\n\nfunction firstSharedCell(\n a: CellArea,\n b: CellArea,\n): { row: number; col: number } | undefined {\n const row = Math.max(a.row, b.row);\n const col = Math.max(a.col, b.col);\n const shared =\n row < Math.min(a.row + a.rowSpan, b.row + b.rowSpan) &&\n col < Math.min(a.col + a.colSpan, b.col + b.colSpan);\n return shared ? { row, col } : undefined;\n}\n\nfunction* cellsOf(area: CellArea) {\n for (let row = area.row; row < area.row + area.rowSpan; row++) {\n for (let col = area.col; col < area.col + area.colSpan; col++) {\n yield { row, col };\n }\n }\n}\n\n/** Inclusive ranges, as an author reads them: `(rows 2–6, cols 3–6)`. */\nfunction formatArea(area: CellArea): string {\n const range = (start: number, span: number) =>\n span === 1 ? `${start}` : `${start}–${start + span - 1}`;\n const rows = `${area.rowSpan === 1 ? 'row' : 'rows'} ${range(area.row, area.rowSpan)}`;\n const cols = `${area.colSpan === 1 ? 'col' : 'cols'} ${range(area.col, area.colSpan)}`;\n return `(${rows}, ${cols})`;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"areas.js","names":["gridAreas","ir","nodes","Map","map","node","id","checkedArea","rejectSharedCells","groupsById","groups","group","undefined","has","Error","depth","parent","get","areas","areaOf","known","members","filter","what","area","child","explicitArea","boundingArea","member","covers","formatArea","set","sort","a","b","rejectSiblingOverlap","rejectStrangers","rejectSingleCellDividers","all","values","rows","Math","max","row","rowSpan","cols","col","colSpan","every","value","cell","key","Number","isInteger","length","min","occupant","cellsOf","other","index","entries","slice","firstSharedCell","ancestors","ids","Set","add","memberOf","groupArea","dividers","outer","inner","shared","range","start","span"],"sources":["../../../../src/lib/layouts/graph/areas.ts"],"sourcesContent":["import type {\n DiagramGraphIR,\n DiagramGroup,\n DiagramNode,\n} from '../../model/diagram-ir.ts';\n\n/** A rectangle of grid cells: rows `[row, row + rowSpan)` and columns `[col, col + colSpan)`. */\nexport type CellArea = {\n row: number;\n col: number;\n rowSpan: number;\n colSpan: number;\n};\n\nexport type GroupArea = {\n group: DiagramGroup;\n /** The nesting level; a top-level group is depth 0. */\n depth: number;\n area: CellArea;\n};\n\nexport type GridAreas = {\n rows: number;\n cols: number;\n nodes: Map<string, CellArea>;\n /** Parents before their children. */\n groups: GroupArea[];\n};\n\n/**\n * Gives every node and group its cell area and rejects a grid that cannot be\n * drawn without overlap. Each error names the elements and the cells.\n */\nexport function gridAreas(ir: DiagramGraphIR): GridAreas {\n const nodes = new Map(\n ir.nodes.map(\n (node) => [node.id, checkedArea(`node \"${node.id}\"`, node)] as const,\n ),\n );\n rejectSharedCells(ir.nodes, nodes);\n\n const groupsById = new Map(ir.groups.map((group) => [group.id, group]));\n for (const node of ir.nodes) {\n if (node.group !== undefined && !groupsById.has(node.group)) {\n throw new Error(\n `Diagram node \"${node.id}\" names group \"${node.group}\", which does not exist.`,\n );\n }\n }\n const depth = (group: DiagramGroup): number => {\n const parent = group.parent && groupsById.get(group.parent);\n return parent ? depth(parent) + 1 : 0;\n };\n\n const areas = new Map<string, CellArea>();\n const areaOf = (group: DiagramGroup): CellArea => {\n const known = areas.get(group.id);\n if (known) return known;\n const members = [\n ...ir.nodes\n .filter((node) => node.group === group.id)\n .map((node) => ({\n what: `node \"${node.id}\"`,\n area: nodes.get(node.id)!,\n })),\n ...ir.groups\n .filter((child) => child.parent === group.id)\n .map((child) => ({ what: `group \"${child.id}\"`, area: areaOf(child) })),\n ];\n const area = explicitArea(group) ?? boundingArea(group, members);\n for (const member of members) {\n if (!covers(area, member.area)) {\n throw new Error(\n `Diagram group \"${group.id}\" area ${formatArea(area)} misses its member ${member.what} at ${formatArea(member.area)}.`,\n );\n }\n }\n areas.set(group.id, area);\n return area;\n };\n\n const groups = ir.groups\n .map((group) => ({ group, depth: depth(group), area: areaOf(group) }))\n .sort((a, b) => a.depth - b.depth);\n rejectSiblingOverlap(groups);\n rejectStrangers(ir.nodes, nodes, groups, groupsById);\n rejectSingleCellDividers(groups);\n\n const all = [...nodes.values(), ...groups.map(({ area }) => area)];\n return {\n rows: Math.max(0, ...all.map((area) => area.row + area.rowSpan)),\n cols: Math.max(0, ...all.map((area) => area.col + area.colSpan)),\n nodes,\n groups,\n };\n}\n\nfunction explicitArea(group: DiagramGroup): CellArea | undefined {\n const { row, col, rowSpan, colSpan } = group;\n if ([row, col, rowSpan, colSpan].every((value) => value === undefined)) {\n return undefined;\n }\n return checkedArea(`group \"${group.id}\"`, group);\n}\n\nfunction checkedArea(\n what: string,\n cell: {\n row?: number | undefined;\n col?: number | undefined;\n rowSpan?: number | undefined;\n colSpan?: number | undefined;\n },\n): CellArea {\n for (const key of ['row', 'col'] as const) {\n const value = cell[key];\n if (value === undefined || !Number.isInteger(value) || value < 0) {\n throw new Error(\n `Diagram ${what} ${key} ${value} must be a non-negative integer.`,\n );\n }\n }\n // An area without a span covers one track, as a CSS Grid item does.\n const area: CellArea = {\n row: cell.row!,\n col: cell.col!,\n rowSpan: cell.rowSpan ?? 1,\n colSpan: cell.colSpan ?? 1,\n };\n for (const key of ['rowSpan', 'colSpan'] as const) {\n if (!Number.isInteger(area[key]) || area[key] < 1) {\n throw new Error(\n `Diagram ${what} ${key} ${area[key]} must be an integer of at least 1.`,\n );\n }\n }\n return area;\n}\n\nfunction boundingArea(\n group: DiagramGroup,\n members: { area: CellArea }[],\n): CellArea {\n if (members.length === 0) {\n throw new Error(\n `Diagram group \"${group.id}\" has no members and no area. Give it members or row, col, rowSpan and colSpan.`,\n );\n }\n const areas = members.map(({ area }) => area);\n const row = Math.min(...areas.map((area) => area.row));\n const col = Math.min(...areas.map((area) => area.col));\n return {\n row,\n col,\n rowSpan: Math.max(...areas.map((area) => area.row + area.rowSpan)) - row,\n colSpan: Math.max(...areas.map((area) => area.col + area.colSpan)) - col,\n };\n}\n\nfunction rejectSharedCells(\n nodes: DiagramNode[],\n areas: Map<string, CellArea>,\n): void {\n const occupant = new Map<string, string>();\n for (const node of nodes) {\n for (const { row, col } of cellsOf(areas.get(node.id)!)) {\n const key = `${row},${col}`;\n const other = occupant.get(key);\n if (other !== undefined) {\n throw new Error(\n `Diagram nodes \"${other}\" and \"${node.id}\" both occupy cell (row ${row}, col ${col}).`,\n );\n }\n occupant.set(key, node.id);\n }\n }\n}\n\nfunction rejectSiblingOverlap(groups: GroupArea[]): void {\n for (const [index, a] of groups.entries()) {\n for (const b of groups.slice(index + 1)) {\n if (a.group.parent !== b.group.parent) continue;\n const cell = firstSharedCell(a.area, b.area);\n if (cell) {\n throw new Error(\n `Diagram groups \"${a.group.id}\" and \"${b.group.id}\" overlap at cell (row ${cell.row}, col ${cell.col}). Sibling groups need disjoint areas.`,\n );\n }\n }\n }\n}\n\n/** A node inside a group's area must belong to the group, or its border would cut through the node. */\nfunction rejectStrangers(\n nodes: DiagramNode[],\n areas: Map<string, CellArea>,\n groups: GroupArea[],\n groupsById: Map<string, DiagramGroup>,\n): void {\n const ancestors = (node: DiagramNode) => {\n const ids = new Set<string>();\n for (\n let id = node.group;\n id !== undefined && !ids.has(id);\n id = groupsById.get(id)?.parent\n ) {\n ids.add(id);\n }\n return ids;\n };\n for (const node of nodes) {\n const memberOf = ancestors(node);\n const area = areas.get(node.id)!;\n for (const { group, area: groupArea } of groups) {\n if (memberOf.has(group.id) || !firstSharedCell(area, groupArea)) continue;\n throw new Error(\n `Diagram node \"${node.id}\" lies inside the area of group \"${group.id}\" ${formatArea(groupArea)} but is not its member. Move it into the group or out of the area.`,\n );\n }\n }\n}\n\nfunction rejectSingleCellDividers(groups: GroupArea[]): void {\n for (const { group, area } of groups) {\n if (group.dividers && area.rowSpan === 1 && area.colSpan === 1) {\n throw new Error(\n `Diagram group \"${group.id}\" has dividers, but its area is the one cell (row ${area.row}, col ${area.col}). Dividers need two rows or two columns.`,\n );\n }\n }\n}\n\nfunction covers(outer: CellArea, inner: CellArea): boolean {\n return (\n inner.row >= outer.row &&\n inner.col >= outer.col &&\n inner.row + inner.rowSpan <= outer.row + outer.rowSpan &&\n inner.col + inner.colSpan <= outer.col + outer.colSpan\n );\n}\n\nfunction firstSharedCell(\n a: CellArea,\n b: CellArea,\n): { row: number; col: number } | undefined {\n const row = Math.max(a.row, b.row);\n const col = Math.max(a.col, b.col);\n const shared =\n row < Math.min(a.row + a.rowSpan, b.row + b.rowSpan) &&\n col < Math.min(a.col + a.colSpan, b.col + b.colSpan);\n return shared ? { row, col } : undefined;\n}\n\nfunction* cellsOf(area: CellArea) {\n for (let row = area.row; row < area.row + area.rowSpan; row++) {\n for (let col = area.col; col < area.col + area.colSpan; col++) {\n yield { row, col };\n }\n }\n}\n\n/** Inclusive ranges, as an author reads them: `(rows 2–6, cols 3–6)`. */\nfunction formatArea(area: CellArea): string {\n const range = (start: number, span: number) =>\n span === 1 ? `${start}` : `${start}–${start + span - 1}`;\n const rows = `${area.rowSpan === 1 ? 'row' : 'rows'} ${range(area.row, area.rowSpan)}`;\n const cols = `${area.colSpan === 1 ? 'col' : 'cols'} ${range(area.col, area.colSpan)}`;\n return `(${rows}, ${cols})`;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,5 @@
1
1
  import type { DiagramEdge } from '../../model/diagram-ir.ts';
2
2
  import type { GridAreas } from './areas.ts';
3
- import type { LayoutTokens } from './tokens.ts';
4
3
  export type Axis = 'row' | 'col';
5
4
  /**
6
5
  * The space at one track boundary. Boundary b lies before track b, so
@@ -22,5 +21,5 @@ export type GridGutters = Record<Axis, Gutter[]>;
22
21
  * Each depth's slot is as wide as its widest group anywhere along the
23
22
  * boundary, so every group border stays a straight line.
24
23
  */
25
- export declare function gridGutters(areas: GridAreas, titleHeights: Map<string, number>, edges: DiagramEdge[], tokens: LayoutTokens): GridGutters;
24
+ export declare function gridGutters(areas: GridAreas, titleHeights: Map<string, number>, edges: DiagramEdge[]): GridGutters;
26
25
  //# sourceMappingURL=gutters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gutters.d.ts","sourceRoot":"","sources":["../../../../src/lib/layouts/graph/gutters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjC;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+FAA+F;IAC/F,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAajD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,KAAK,EAAE,WAAW,EAAE,EACpB,MAAM,EAAE,YAAY,GACnB,WAAW,CAqBb"}
1
+ {"version":3,"file":"gutters.d.ts","sourceRoot":"","sources":["../../../../src/lib/layouts/graph/gutters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,YAAY,CAAC;AAItD,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjC;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+FAA+F;IAC/F,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAajD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,KAAK,EAAE,WAAW,EAAE,GACnB,WAAW,CAqBb"}
@@ -1,5 +1,6 @@
1
1
  import { parseEndpointRef } from "../../model/endpoint-ref.js";
2
2
  import { measureEdgeLabel } from "./measure.js";
3
+ import { LAYOUT_TOKENS } from "./tokens.js";
3
4
 
4
5
  /**
5
6
  * The space at one track boundary. Boundary b lies before track b, so
@@ -16,16 +17,16 @@ const STROKE = 1;
16
17
  * Each depth's slot is as wide as its widest group anywhere along the
17
18
  * boundary, so every group border stays a straight line.
18
19
  */
19
- export function gridGutters(areas, titleHeights, edges, tokens) {
20
- const minimums = labelMinimums(edges, areas.nodes, tokens);
21
- const chrome = tokens.GROUP_PAD + STROKE;
20
+ export function gridGutters(areas, titleHeights, edges) {
21
+ const minimums = labelMinimums(edges, areas.nodes);
22
+ const chrome = LAYOUT_TOKENS.GROUP_PAD + STROKE;
22
23
  const spans = axis => areas.groups.map(({
23
24
  group,
24
25
  depth,
25
26
  area
26
27
  }) => {
27
28
  const [start, span] = axis === 'row' ? [area.row, area.rowSpan] : [area.col, area.colSpan];
28
- const title = axis === 'row' ? titleHeights.get(group.id) ?? 0 : 0;
29
+ const title = axis === 'row' ? titleHeights.get(group.id) : 0;
29
30
  const titleAtEnd = group.labelSide === 'bottom';
30
31
  return {
31
32
  depth,
@@ -36,19 +37,19 @@ export function gridGutters(areas, titleHeights, edges, tokens) {
36
37
  };
37
38
  });
38
39
  return {
39
- row: axisGutters(areas.rows, spans('row'), minimums.row, tokens),
40
- col: axisGutters(areas.cols, spans('col'), minimums.col, tokens)
40
+ row: axisGutters(areas.rows, spans('row'), minimums.row),
41
+ col: axisGutters(areas.cols, spans('col'), minimums.col)
41
42
  };
42
43
  }
43
- function axisGutters(count, spans, minimums, tokens) {
44
+ function axisGutters(count, spans, minimums) {
44
45
  return Array.from({
45
46
  length: count + 1
46
47
  }, (_, boundary) => {
47
- const closing = slotWidths(spans.filter(span => span.end === boundary), span => span.closingChrome, tokens);
48
- const opening = slotWidths(spans.filter(span => span.start === boundary), span => span.openingChrome, tokens);
48
+ const closing = slotWidths(spans.filter(span => span.end === boundary), span => span.closingChrome);
49
+ const opening = slotWidths(spans.filter(span => span.start === boundary), span => span.openingChrome);
49
50
  const slots = [...closing.values(), ...opening.values()].reduce((total, width) => total + width, 0);
50
51
  const outer = boundary === 0 || boundary === count;
51
- const middle = Math.max(outer ? 0 : tokens.GAP, (minimums.get(boundary) ?? 0) - slots);
52
+ const middle = Math.max(outer ? 0 : LAYOUT_TOKENS.GAP, (minimums.get(boundary) ?? 0) - slots);
52
53
  const closingEdges = new Map();
53
54
  let offset = 0;
54
55
  for (const [depth, width] of [...closing].sort(([a], [b]) => b - a)) {
@@ -70,10 +71,10 @@ function axisGutters(count, spans, minimums, tokens) {
70
71
  }
71
72
 
72
73
  /** The width of each depth's slot: its widest chrome plus a channel for edges. */
73
- function slotWidths(spans, chromeOf, tokens) {
74
+ function slotWidths(spans, chromeOf) {
74
75
  const widths = new Map();
75
76
  for (const span of spans) {
76
- const width = chromeOf(span) + tokens.CHANNEL;
77
+ const width = chromeOf(span) + LAYOUT_TOKENS.CHANNEL;
77
78
  widths.set(span.depth, Math.max(widths.get(span.depth) ?? 0, width));
78
79
  }
79
80
  return widths;
@@ -84,7 +85,7 @@ function slotWidths(spans, chromeOf, tokens) {
84
85
  * them for its label, so that gutter must hold the label and a stub on each
85
86
  * side of it.
86
87
  */
87
- function labelMinimums(edges, nodes, tokens) {
88
+ function labelMinimums(edges, nodes) {
88
89
  const minimums = {
89
90
  row: new Map(),
90
91
  col: new Map()
@@ -95,11 +96,11 @@ function labelMinimums(edges, nodes, tokens) {
95
96
  const from = nodes.get(parseEndpointRef(edge.from).nodeId);
96
97
  const to = nodes.get(parseEndpointRef(edge.to).nodeId);
97
98
  if (!from || !to) continue;
98
- const label = measureEdgeLabel(edge, tokens);
99
+ const label = measureEdgeLabel(edge, LAYOUT_TOKENS);
99
100
  const side = sideBySide(from, to);
100
- if (side) raise('col', side, label.w + 2 * tokens.STUB);
101
+ if (side) raise('col', side, label.w + 2 * LAYOUT_TOKENS.STUB);
101
102
  const stacked = sideBySide(transpose(from), transpose(to));
102
- if (stacked) raise('row', stacked, label.h + 2 * tokens.STUB);
103
+ if (stacked) raise('row', stacked, label.h + 2 * LAYOUT_TOKENS.STUB);
103
104
  }
104
105
  return minimums;
105
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gutters.js","names":["parseEndpointRef","measureEdgeLabel","STROKE","gridGutters","areas","titleHeights","edges","tokens","minimums","labelMinimums","nodes","chrome","GROUP_PAD","spans","axis","groups","map","group","depth","area","start","span","row","rowSpan","col","colSpan","title","get","id","titleAtEnd","labelSide","end","openingChrome","closingChrome","axisGutters","rows","cols","count","Array","from","length","_","boundary","closing","slotWidths","filter","opening","slots","values","reduce","total","width","outer","middle","Math","max","GAP","closingEdges","Map","offset","sort","a","b","set","openingEdges","size","chromeOf","widths","CHANNEL","raise","need","edge","label","nodeId","to","side","sideBySide","w","STUB","stacked","transpose","h","shareRows","min","undefined"],"sources":["../../../../src/lib/layouts/graph/gutters.ts"],"sourcesContent":["import type { DiagramEdge } from '../../model/diagram-ir.ts';\nimport { parseEndpointRef } from '../../model/endpoint-ref.ts';\nimport type { CellArea, GridAreas } from './areas.ts';\nimport { measureEdgeLabel } from './measure.ts';\nimport type { LayoutTokens } from './tokens.ts';\n\nexport type Axis = 'row' | 'col';\n\n/**\n * The space at one track boundary. Boundary b lies before track b, so\n * boundaries 0 and N are the outer edges of the grid.\n */\nexport type Gutter = {\n size: number;\n /** For each depth, how far from the gutter's start the border of a group closing here lies. */\n closing: Map<number, number>;\n /** For each depth, how far from the gutter's start the border of a group opening here lies. */\n opening: Map<number, number>;\n};\n\nexport type GridGutters = Record<Axis, Gutter[]>;\n\n/** The border stroke a group draws, which its chrome must hold. */\nconst STROKE = 1;\n\ntype GroupSpan = {\n depth: number;\n start: number;\n end: number;\n openingChrome: number;\n closingChrome: number;\n};\n\n/**\n * Sizes every gutter before the tracks, because no gutter depends on a\n * track's size. A gutter holds, in order: the chrome of the groups closing\n * there (deepest first, next to the track before), a middle gap, and the\n * chrome of the groups opening there (deepest last, next to the track after).\n * Each depth's slot is as wide as its widest group anywhere along the\n * boundary, so every group border stays a straight line.\n */\nexport function gridGutters(\n areas: GridAreas,\n titleHeights: Map<string, number>,\n edges: DiagramEdge[],\n tokens: LayoutTokens,\n): GridGutters {\n const minimums = labelMinimums(edges, areas.nodes, tokens);\n const chrome = tokens.GROUP_PAD + STROKE;\n const spans = (axis: Axis): GroupSpan[] =>\n areas.groups.map(({ group, depth, area }) => {\n const [start, span] =\n axis === 'row' ? [area.row, area.rowSpan] : [area.col, area.colSpan];\n const title = axis === 'row' ? (titleHeights.get(group.id) ?? 0) : 0;\n const titleAtEnd = group.labelSide === 'bottom';\n return {\n depth,\n start,\n end: start + span,\n openingChrome: chrome + (titleAtEnd ? 0 : title),\n closingChrome: chrome + (titleAtEnd ? title : 0),\n };\n });\n return {\n row: axisGutters(areas.rows, spans('row'), minimums.row, tokens),\n col: axisGutters(areas.cols, spans('col'), minimums.col, tokens),\n };\n}\n\nfunction axisGutters(\n count: number,\n spans: GroupSpan[],\n minimums: Map<number, number>,\n tokens: LayoutTokens,\n): Gutter[] {\n return Array.from({ length: count + 1 }, (_, boundary) => {\n const closing = slotWidths(\n spans.filter((span) => span.end === boundary),\n (span) => span.closingChrome,\n tokens,\n );\n const opening = slotWidths(\n spans.filter((span) => span.start === boundary),\n (span) => span.openingChrome,\n tokens,\n );\n const slots = [...closing.values(), ...opening.values()].reduce(\n (total, width) => total + width,\n 0,\n );\n const outer = boundary === 0 || boundary === count;\n const middle = Math.max(\n outer ? 0 : tokens.GAP,\n (minimums.get(boundary) ?? 0) - slots,\n );\n\n const closingEdges = new Map<number, number>();\n let offset = 0;\n for (const [depth, width] of [...closing].sort(([a], [b]) => b - a)) {\n offset += width;\n closingEdges.set(depth, offset);\n }\n offset += middle;\n const openingEdges = new Map<number, number>();\n for (const [depth, width] of [...opening].sort(([a], [b]) => a - b)) {\n openingEdges.set(depth, offset);\n offset += width;\n }\n return { size: offset, closing: closingEdges, opening: openingEdges };\n });\n}\n\n/** The width of each depth's slot: its widest chrome plus a channel for edges. */\nfunction slotWidths(\n spans: GroupSpan[],\n chromeOf: (span: GroupSpan) => number,\n tokens: LayoutTokens,\n): Map<number, number> {\n const widths = new Map<number, number>();\n for (const span of spans) {\n const width = chromeOf(span) + tokens.CHANNEL;\n widths.set(span.depth, Math.max(widths.get(span.depth) ?? 0, width));\n }\n return widths;\n}\n\n/**\n * A labelled edge between two neighbouring cells has only the gutter between\n * them for its label, so that gutter must hold the label and a stub on each\n * side of it.\n */\nfunction labelMinimums(\n edges: DiagramEdge[],\n nodes: Map<string, CellArea>,\n tokens: LayoutTokens,\n): Record<Axis, Map<number, number>> {\n const minimums: Record<Axis, Map<number, number>> = {\n row: new Map(),\n col: new Map(),\n };\n const raise = (axis: Axis, boundary: number, need: number) =>\n minimums[axis].set(\n boundary,\n Math.max(minimums[axis].get(boundary) ?? 0, need),\n );\n for (const edge of edges) {\n if (!edge.label?.length) continue;\n const from = nodes.get(parseEndpointRef(edge.from).nodeId);\n const to = nodes.get(parseEndpointRef(edge.to).nodeId);\n if (!from || !to) continue;\n const label = measureEdgeLabel(edge, tokens);\n const side = sideBySide(from, to);\n if (side) raise('col', side, label.w + 2 * tokens.STUB);\n const stacked = sideBySide(transpose(from), transpose(to));\n if (stacked) raise('row', stacked, label.h + 2 * tokens.STUB);\n }\n return minimums;\n}\n\n/** The column boundary between two areas that share rows and touch across it. */\nfunction sideBySide(a: CellArea, b: CellArea): number | undefined {\n const shareRows =\n Math.max(a.row, b.row) < Math.min(a.row + a.rowSpan, b.row + b.rowSpan);\n if (!shareRows) return undefined;\n if (a.col + a.colSpan === b.col) return b.col;\n if (b.col + b.colSpan === a.col) return a.col;\n return undefined;\n}\n\nfunction transpose(area: CellArea): CellArea {\n return {\n row: area.col,\n col: area.row,\n rowSpan: area.colSpan,\n colSpan: area.rowSpan,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"gutters.js","names":["parseEndpointRef","measureEdgeLabel","LAYOUT_TOKENS","STROKE","gridGutters","areas","titleHeights","edges","minimums","labelMinimums","nodes","chrome","GROUP_PAD","spans","axis","groups","map","group","depth","area","start","span","row","rowSpan","col","colSpan","title","get","id","titleAtEnd","labelSide","end","openingChrome","closingChrome","axisGutters","rows","cols","count","Array","from","length","_","boundary","closing","slotWidths","filter","opening","slots","values","reduce","total","width","outer","middle","Math","max","GAP","closingEdges","Map","offset","sort","a","b","set","openingEdges","size","chromeOf","widths","CHANNEL","raise","need","edge","label","nodeId","to","side","sideBySide","w","STUB","stacked","transpose","h","shareRows","min","undefined"],"sources":["../../../../src/lib/layouts/graph/gutters.ts"],"sourcesContent":["import type { DiagramEdge } from '../../model/diagram-ir.ts';\nimport { parseEndpointRef } from '../../model/endpoint-ref.ts';\nimport type { CellArea, GridAreas } from './areas.ts';\nimport { measureEdgeLabel } from './measure.ts';\nimport { LAYOUT_TOKENS } from './tokens.ts';\n\nexport type Axis = 'row' | 'col';\n\n/**\n * The space at one track boundary. Boundary b lies before track b, so\n * boundaries 0 and N are the outer edges of the grid.\n */\nexport type Gutter = {\n size: number;\n /** For each depth, how far from the gutter's start the border of a group closing here lies. */\n closing: Map<number, number>;\n /** For each depth, how far from the gutter's start the border of a group opening here lies. */\n opening: Map<number, number>;\n};\n\nexport type GridGutters = Record<Axis, Gutter[]>;\n\n/** The border stroke a group draws, which its chrome must hold. */\nconst STROKE = 1;\n\ntype GroupSpan = {\n depth: number;\n start: number;\n end: number;\n openingChrome: number;\n closingChrome: number;\n};\n\n/**\n * Sizes every gutter before the tracks, because no gutter depends on a\n * track's size. A gutter holds, in order: the chrome of the groups closing\n * there (deepest first, next to the track before), a middle gap, and the\n * chrome of the groups opening there (deepest last, next to the track after).\n * Each depth's slot is as wide as its widest group anywhere along the\n * boundary, so every group border stays a straight line.\n */\nexport function gridGutters(\n areas: GridAreas,\n titleHeights: Map<string, number>,\n edges: DiagramEdge[],\n): GridGutters {\n const minimums = labelMinimums(edges, areas.nodes);\n const chrome = LAYOUT_TOKENS.GROUP_PAD + STROKE;\n const spans = (axis: Axis): GroupSpan[] =>\n areas.groups.map(({ group, depth, area }) => {\n const [start, span] =\n axis === 'row' ? [area.row, area.rowSpan] : [area.col, area.colSpan];\n const title = axis === 'row' ? titleHeights.get(group.id)! : 0;\n const titleAtEnd = group.labelSide === 'bottom';\n return {\n depth,\n start,\n end: start + span,\n openingChrome: chrome + (titleAtEnd ? 0 : title),\n closingChrome: chrome + (titleAtEnd ? title : 0),\n };\n });\n return {\n row: axisGutters(areas.rows, spans('row'), minimums.row),\n col: axisGutters(areas.cols, spans('col'), minimums.col),\n };\n}\n\nfunction axisGutters(\n count: number,\n spans: GroupSpan[],\n minimums: Map<number, number>,\n): Gutter[] {\n return Array.from({ length: count + 1 }, (_, boundary) => {\n const closing = slotWidths(\n spans.filter((span) => span.end === boundary),\n (span) => span.closingChrome,\n );\n const opening = slotWidths(\n spans.filter((span) => span.start === boundary),\n (span) => span.openingChrome,\n );\n const slots = [...closing.values(), ...opening.values()].reduce(\n (total, width) => total + width,\n 0,\n );\n const outer = boundary === 0 || boundary === count;\n const middle = Math.max(\n outer ? 0 : LAYOUT_TOKENS.GAP,\n (minimums.get(boundary) ?? 0) - slots,\n );\n\n const closingEdges = new Map<number, number>();\n let offset = 0;\n for (const [depth, width] of [...closing].sort(([a], [b]) => b - a)) {\n offset += width;\n closingEdges.set(depth, offset);\n }\n offset += middle;\n const openingEdges = new Map<number, number>();\n for (const [depth, width] of [...opening].sort(([a], [b]) => a - b)) {\n openingEdges.set(depth, offset);\n offset += width;\n }\n return { size: offset, closing: closingEdges, opening: openingEdges };\n });\n}\n\n/** The width of each depth's slot: its widest chrome plus a channel for edges. */\nfunction slotWidths(\n spans: GroupSpan[],\n chromeOf: (span: GroupSpan) => number,\n): Map<number, number> {\n const widths = new Map<number, number>();\n for (const span of spans) {\n const width = chromeOf(span) + LAYOUT_TOKENS.CHANNEL;\n widths.set(span.depth, Math.max(widths.get(span.depth) ?? 0, width));\n }\n return widths;\n}\n\n/**\n * A labelled edge between two neighbouring cells has only the gutter between\n * them for its label, so that gutter must hold the label and a stub on each\n * side of it.\n */\nfunction labelMinimums(\n edges: DiagramEdge[],\n nodes: Map<string, CellArea>,\n): Record<Axis, Map<number, number>> {\n const minimums: Record<Axis, Map<number, number>> = {\n row: new Map(),\n col: new Map(),\n };\n const raise = (axis: Axis, boundary: number, need: number) =>\n minimums[axis].set(\n boundary,\n Math.max(minimums[axis].get(boundary) ?? 0, need),\n );\n for (const edge of edges) {\n if (!edge.label?.length) continue;\n const from = nodes.get(parseEndpointRef(edge.from).nodeId);\n const to = nodes.get(parseEndpointRef(edge.to).nodeId);\n if (!from || !to) continue;\n const label = measureEdgeLabel(edge, LAYOUT_TOKENS);\n const side = sideBySide(from, to);\n if (side) raise('col', side, label.w + 2 * LAYOUT_TOKENS.STUB);\n const stacked = sideBySide(transpose(from), transpose(to));\n if (stacked) raise('row', stacked, label.h + 2 * LAYOUT_TOKENS.STUB);\n }\n return minimums;\n}\n\n/** The column boundary between two areas that share rows and touch across it. */\nfunction sideBySide(a: CellArea, b: CellArea): number | undefined {\n const shareRows =\n Math.max(a.row, b.row) < Math.min(a.row + a.rowSpan, b.row + b.rowSpan);\n if (!shareRows) return undefined;\n if (a.col + a.colSpan === b.col) return b.col;\n if (b.col + b.colSpan === a.col) return a.col;\n return undefined;\n}\n\nfunction transpose(area: CellArea): CellArea {\n return {\n row: area.col,\n col: area.row,\n rowSpan: area.colSpan,\n colSpan: area.rowSpan,\n };\n}\n"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,6BAA6B;AAE9D,SAASC,gBAAgB,QAAQ,cAAc;AAC/C,SAASC,aAAa,QAAQ,aAAa;;AAI3C;AACA;AACA;AACA;;AAWA;AACA,MAAMC,MAAM,GAAG,CAAC;AAUhB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,WAAWA,CACzBC,KAAgB,EAChBC,YAAiC,EACjCC,KAAoB,EACP;EACb,MAAMC,QAAQ,GAAGC,aAAa,CAACF,KAAK,EAAEF,KAAK,CAACK,KAAK,CAAC;EAClD,MAAMC,MAAM,GAAGT,aAAa,CAACU,SAAS,GAAGT,MAAM;EAC/C,MAAMU,KAAK,GAAIC,IAAU,IACvBT,KAAK,CAACU,MAAM,CAACC,GAAG,CAAC,CAAC;IAAEC,KAAK;IAAEC,KAAK;IAAEC;EAAK,CAAC,KAAK;IAC3C,MAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GACjBP,IAAI,KAAK,KAAK,GAAG,CAACK,IAAI,CAACG,GAAG,EAAEH,IAAI,CAACI,OAAO,CAAC,GAAG,CAACJ,IAAI,CAACK,GAAG,EAAEL,IAAI,CAACM,OAAO,CAAC;IACtE,MAAMC,KAAK,GAAGZ,IAAI,KAAK,KAAK,GAAGR,YAAY,CAACqB,GAAG,CAACV,KAAK,CAACW,EAAE,CAAC,GAAI,CAAC;IAC9D,MAAMC,UAAU,GAAGZ,KAAK,CAACa,SAAS,KAAK,QAAQ;IAC/C,OAAO;MACLZ,KAAK;MACLE,KAAK;MACLW,GAAG,EAAEX,KAAK,GAAGC,IAAI;MACjBW,aAAa,EAAErB,MAAM,IAAIkB,UAAU,GAAG,CAAC,GAAGH,KAAK,CAAC;MAChDO,aAAa,EAAEtB,MAAM,IAAIkB,UAAU,GAAGH,KAAK,GAAG,CAAC;IACjD,CAAC;EACH,CAAC,CAAC;EACJ,OAAO;IACLJ,GAAG,EAAEY,WAAW,CAAC7B,KAAK,CAAC8B,IAAI,EAAEtB,KAAK,CAAC,KAAK,CAAC,EAAEL,QAAQ,CAACc,GAAG,CAAC;IACxDE,GAAG,EAAEU,WAAW,CAAC7B,KAAK,CAAC+B,IAAI,EAAEvB,KAAK,CAAC,KAAK,CAAC,EAAEL,QAAQ,CAACgB,GAAG;EACzD,CAAC;AACH;AAEA,SAASU,WAAWA,CAClBG,KAAa,EACbxB,KAAkB,EAClBL,QAA6B,EACnB;EACV,OAAO8B,KAAK,CAACC,IAAI,CAAC;IAAEC,MAAM,EAAEH,KAAK,GAAG;EAAE,CAAC,EAAE,CAACI,CAAC,EAAEC,QAAQ,KAAK;IACxD,MAAMC,OAAO,GAAGC,UAAU,CACxB/B,KAAK,CAACgC,MAAM,CAAExB,IAAI,IAAKA,IAAI,CAACU,GAAG,KAAKW,QAAQ,CAAC,EAC5CrB,IAAI,IAAKA,IAAI,CAACY,aACjB,CAAC;IACD,MAAMa,OAAO,GAAGF,UAAU,CACxB/B,KAAK,CAACgC,MAAM,CAAExB,IAAI,IAAKA,IAAI,CAACD,KAAK,KAAKsB,QAAQ,CAAC,EAC9CrB,IAAI,IAAKA,IAAI,CAACW,aACjB,CAAC;IACD,MAAMe,KAAK,GAAG,CAAC,GAAGJ,OAAO,CAACK,MAAM,CAAC,CAAC,EAAE,GAAGF,OAAO,CAACE,MAAM,CAAC,CAAC,CAAC,CAACC,MAAM,CAC7D,CAACC,KAAK,EAAEC,KAAK,KAAKD,KAAK,GAAGC,KAAK,EAC/B,CACF,CAAC;IACD,MAAMC,KAAK,GAAGV,QAAQ,KAAK,CAAC,IAAIA,QAAQ,KAAKL,KAAK;IAClD,MAAMgB,MAAM,GAAGC,IAAI,CAACC,GAAG,CACrBH,KAAK,GAAG,CAAC,GAAGlD,aAAa,CAACsD,GAAG,EAC7B,CAAChD,QAAQ,CAACmB,GAAG,CAACe,QAAQ,CAAC,IAAI,CAAC,IAAIK,KAClC,CAAC;IAED,MAAMU,YAAY,GAAG,IAAIC,GAAG,CAAiB,CAAC;IAC9C,IAAIC,MAAM,GAAG,CAAC;IACd,KAAK,MAAM,CAACzC,KAAK,EAAEiC,KAAK,CAAC,IAAI,CAAC,GAAGR,OAAO,CAAC,CAACiB,IAAI,CAAC,CAAC,CAACC,CAAC,CAAC,EAAE,CAACC,CAAC,CAAC,KAAKA,CAAC,GAAGD,CAAC,CAAC,EAAE;MACnEF,MAAM,IAAIR,KAAK;MACfM,YAAY,CAACM,GAAG,CAAC7C,KAAK,EAAEyC,MAAM,CAAC;IACjC;IACAA,MAAM,IAAIN,MAAM;IAChB,MAAMW,YAAY,GAAG,IAAIN,GAAG,CAAiB,CAAC;IAC9C,KAAK,MAAM,CAACxC,KAAK,EAAEiC,KAAK,CAAC,IAAI,CAAC,GAAGL,OAAO,CAAC,CAACc,IAAI,CAAC,CAAC,CAACC,CAAC,CAAC,EAAE,CAACC,CAAC,CAAC,KAAKD,CAAC,GAAGC,CAAC,CAAC,EAAE;MACnEE,YAAY,CAACD,GAAG,CAAC7C,KAAK,EAAEyC,MAAM,CAAC;MAC/BA,MAAM,IAAIR,KAAK;IACjB;IACA,OAAO;MAAEc,IAAI,EAAEN,MAAM;MAAEhB,OAAO,EAAEc,YAAY;MAAEX,OAAO,EAAEkB;IAAa,CAAC;EACvE,CAAC,CAAC;AACJ;;AAEA;AACA,SAASpB,UAAUA,CACjB/B,KAAkB,EAClBqD,QAAqC,EAChB;EACrB,MAAMC,MAAM,GAAG,IAAIT,GAAG,CAAiB,CAAC;EACxC,KAAK,MAAMrC,IAAI,IAAIR,KAAK,EAAE;IACxB,MAAMsC,KAAK,GAAGe,QAAQ,CAAC7C,IAAI,CAAC,GAAGnB,aAAa,CAACkE,OAAO;IACpDD,MAAM,CAACJ,GAAG,CAAC1C,IAAI,CAACH,KAAK,EAAEoC,IAAI,CAACC,GAAG,CAACY,MAAM,CAACxC,GAAG,CAACN,IAAI,CAACH,KAAK,CAAC,IAAI,CAAC,EAAEiC,KAAK,CAAC,CAAC;EACtE;EACA,OAAOgB,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS1D,aAAaA,CACpBF,KAAoB,EACpBG,KAA4B,EACO;EACnC,MAAMF,QAA2C,GAAG;IAClDc,GAAG,EAAE,IAAIoC,GAAG,CAAC,CAAC;IACdlC,GAAG,EAAE,IAAIkC,GAAG,CAAC;EACf,CAAC;EACD,MAAMW,KAAK,GAAGA,CAACvD,IAAU,EAAE4B,QAAgB,EAAE4B,IAAY,KACvD9D,QAAQ,CAACM,IAAI,CAAC,CAACiD,GAAG,CAChBrB,QAAQ,EACRY,IAAI,CAACC,GAAG,CAAC/C,QAAQ,CAACM,IAAI,CAAC,CAACa,GAAG,CAACe,QAAQ,CAAC,IAAI,CAAC,EAAE4B,IAAI,CAClD,CAAC;EACH,KAAK,MAAMC,IAAI,IAAIhE,KAAK,EAAE;IACxB,IAAI,CAACgE,IAAI,CAACC,KAAK,EAAEhC,MAAM,EAAE;IACzB,MAAMD,IAAI,GAAG7B,KAAK,CAACiB,GAAG,CAAC3B,gBAAgB,CAACuE,IAAI,CAAChC,IAAI,CAAC,CAACkC,MAAM,CAAC;IAC1D,MAAMC,EAAE,GAAGhE,KAAK,CAACiB,GAAG,CAAC3B,gBAAgB,CAACuE,IAAI,CAACG,EAAE,CAAC,CAACD,MAAM,CAAC;IACtD,IAAI,CAAClC,IAAI,IAAI,CAACmC,EAAE,EAAE;IAClB,MAAMF,KAAK,GAAGvE,gBAAgB,CAACsE,IAAI,EAAErE,aAAa,CAAC;IACnD,MAAMyE,IAAI,GAAGC,UAAU,CAACrC,IAAI,EAAEmC,EAAE,CAAC;IACjC,IAAIC,IAAI,EAAEN,KAAK,CAAC,KAAK,EAAEM,IAAI,EAAEH,KAAK,CAACK,CAAC,GAAG,CAAC,GAAG3E,aAAa,CAAC4E,IAAI,CAAC;IAC9D,MAAMC,OAAO,GAAGH,UAAU,CAACI,SAAS,CAACzC,IAAI,CAAC,EAAEyC,SAAS,CAACN,EAAE,CAAC,CAAC;IAC1D,IAAIK,OAAO,EAAEV,KAAK,CAAC,KAAK,EAAEU,OAAO,EAAEP,KAAK,CAACS,CAAC,GAAG,CAAC,GAAG/E,aAAa,CAAC4E,IAAI,CAAC;EACtE;EACA,OAAOtE,QAAQ;AACjB;;AAEA;AACA,SAASoE,UAAUA,CAACf,CAAW,EAAEC,CAAW,EAAsB;EAChE,MAAMoB,SAAS,GACb5B,IAAI,CAACC,GAAG,CAACM,CAAC,CAACvC,GAAG,EAAEwC,CAAC,CAACxC,GAAG,CAAC,GAAGgC,IAAI,CAAC6B,GAAG,CAACtB,CAAC,CAACvC,GAAG,GAAGuC,CAAC,CAACtC,OAAO,EAAEuC,CAAC,CAACxC,GAAG,GAAGwC,CAAC,CAACvC,OAAO,CAAC;EACzE,IAAI,CAAC2D,SAAS,EAAE,OAAOE,SAAS;EAChC,IAAIvB,CAAC,CAACrC,GAAG,GAAGqC,CAAC,CAACpC,OAAO,KAAKqC,CAAC,CAACtC,GAAG,EAAE,OAAOsC,CAAC,CAACtC,GAAG;EAC7C,IAAIsC,CAAC,CAACtC,GAAG,GAAGsC,CAAC,CAACrC,OAAO,KAAKoC,CAAC,CAACrC,GAAG,EAAE,OAAOqC,CAAC,CAACrC,GAAG;EAC7C,OAAO4D,SAAS;AAClB;AAEA,SAASJ,SAASA,CAAC7D,IAAc,EAAY;EAC3C,OAAO;IACLG,GAAG,EAAEH,IAAI,CAACK,GAAG;IACbA,GAAG,EAAEL,IAAI,CAACG,GAAG;IACbC,OAAO,EAAEJ,IAAI,CAACM,OAAO;IACrBA,OAAO,EAAEN,IAAI,CAACI;EAChB,CAAC;AACH","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import { gridAreas } from "./areas.js";
2
2
  import { gridGutters } from "./gutters.js";
3
3
  import { measureGroupTitle, measureNode } from "./measure.js";
4
- import { layoutTokens } from "./tokens.js";
4
+ import { LAYOUT_TOKENS } from "./tokens.js";
5
5
  import { sizeTracks } from "./tracks.js";
6
6
 
7
7
  /**
@@ -11,11 +11,10 @@ import { sizeTracks } from "./tracks.js";
11
11
  * drawn without overlap.
12
12
  */
13
13
  export function layoutGraph(ir) {
14
- const tokens = layoutTokens(ir.density);
15
- const measured = new Map(ir.nodes.map(node => [node.id, measureNode(node, tokens)]));
16
- const titles = new Map(ir.groups.map(group => [group.id, measureGroupTitle(group, tokens)]));
14
+ const measured = new Map(ir.nodes.map(node => [node.id, measureNode(node, LAYOUT_TOKENS)]));
15
+ const titles = new Map(ir.groups.map(group => [group.id, measureGroupTitle(group, LAYOUT_TOKENS)]));
17
16
  const areas = gridAreas(ir);
18
- const gutters = gridGutters(areas, new Map([...titles].map(([id, title]) => [id, title.height])), ir.edges, tokens);
17
+ const gutters = gridGutters(areas, new Map([...titles].map(([id, title]) => [id, title.height])), ir.edges);
19
18
  const items = axis => ir.nodes.map(node => {
20
19
  const area = areas.nodes.get(node.id);
21
20
  const {
@@ -51,7 +50,7 @@ export function layoutGraph(ir) {
51
50
  groups,
52
51
  edges: [],
53
52
  leaders: [],
54
- viewBox: viewBoxOf(nodes, groups, tokens)
53
+ viewBox: viewBoxOf(nodes, groups)
55
54
  };
56
55
  }
57
56
  function areaBox(area, lines) {
@@ -142,9 +141,9 @@ function dividers(rect, area, title, labelSide, lines, gutters) {
142
141
  }];
143
142
  })];
144
143
  }
145
- function viewBoxOf(nodes, groups, tokens) {
144
+ function viewBoxOf(nodes, groups) {
146
145
  const boxes = [...nodes.map(nodeLayout => nodeLayout.visual), ...groups.map(groupLayout => groupLayout.rect)];
147
- const pad = tokens.CONTENT_PAD;
146
+ const pad = LAYOUT_TOKENS.CONTENT_PAD;
148
147
  if (boxes.length === 0) return {
149
148
  x: -pad,
150
149
  y: -pad,
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","names":["gridAreas","gridGutters","measureGroupTitle","measureNode","layoutTokens","sizeTracks","layoutGraph","ir","tokens","density","measured","Map","nodes","map","node","id","titles","groups","group","areas","gutters","title","height","edges","items","axis","area","get","frame","overhang","start","row","span","rowSpan","size","h","top","bottom","col","colSpan","w","left","right","line","count","gutter","lines","rows","cols","measuredNode","areaBox","place","nodeFrame","groupArea","placeGroup","leaders","viewBox","viewBoxOf","x","trackStart","y","trackEnd","stretch","visualW","visualH","depth","border","boundary","side","gutterStart","rect","dividers","labelSide","centre","titleAtBottom","inner","Array","from","length","_","index","boxes","nodeLayout","visual","groupLayout","pad","CONTENT_PAD","Math","min","box","max"],"sources":["../../../../src/lib/layouts/graph/layout.ts"],"sourcesContent":["import type { Box, DiagramGraphIR, Point } from '../../model/diagram-ir.ts';\nimport { type CellArea, type GroupArea, gridAreas } from './areas.ts';\nimport type {\n GraphLayout,\n GroupLayout,\n NodeLayout,\n} from './graph-layout-result.ts';\nimport { type Axis, type GridGutters, gridGutters } from './gutters.ts';\nimport {\n type MeasuredGroupTitle,\n type MeasuredNode,\n measureGroupTitle,\n measureNode,\n} from './measure.ts';\nimport { type LayoutTokens, layoutTokens } from './tokens.ts';\nimport { type TrackLine, sizeTracks } from './tracks.ts';\n\n/**\n * Lays out a graph on a content-sized grid: it measures every node, sizes\n * each row and column to the content in it, and reserves the chrome of the\n * groups in the gutters between them. It throws when the grid cannot be\n * drawn without overlap.\n */\nexport function layoutGraph(ir: DiagramGraphIR): GraphLayout {\n const tokens = layoutTokens(ir.density);\n const measured = new Map(\n ir.nodes.map((node) => [node.id, measureNode(node, tokens)] as const),\n );\n const titles = new Map(\n ir.groups.map(\n (group) => [group.id, measureGroupTitle(group, tokens)] as const,\n ),\n );\n const areas = gridAreas(ir);\n const gutters = gridGutters(\n areas,\n new Map([...titles].map(([id, title]) => [id, title.height])),\n ir.edges,\n tokens,\n );\n\n const items = (axis: Axis) =>\n ir.nodes.map((node) => {\n const area = areas.nodes.get(node.id)!;\n const { frame, overhang } = measured.get(node.id)!;\n return axis === 'row'\n ? {\n start: area.row,\n span: area.rowSpan,\n size: frame.h + overhang.top + overhang.bottom,\n }\n : {\n start: area.col,\n span: area.colSpan,\n size: frame.w + overhang.left + overhang.right,\n };\n });\n const line = (axis: Axis, count: number) =>\n sizeTracks(\n count,\n items(axis),\n gutters[axis].map((gutter) => gutter.size),\n );\n const lines: Record<Axis, TrackLine> = {\n row: line('row', areas.rows),\n col: line('col', areas.cols),\n };\n\n const nodes: NodeLayout[] = ir.nodes.map((node) => {\n const measuredNode = measured.get(node.id)!;\n const area = areaBox(areas.nodes.get(node.id)!, lines);\n return { node, ...measuredNode.place(nodeFrame(measuredNode, area)) };\n });\n const groups = areas.groups.map((groupArea) =>\n placeGroup(groupArea, titles.get(groupArea.group.id)!, lines, gutters),\n );\n\n return {\n nodes,\n groups,\n edges: [],\n leaders: [],\n viewBox: viewBoxOf(nodes, groups, tokens),\n };\n}\n\nfunction areaBox(area: CellArea, lines: Record<Axis, TrackLine>): Box {\n const x = lines.col.trackStart(area.col);\n const y = lines.row.trackStart(area.row);\n return {\n x,\n y,\n w: lines.col.trackEnd(area.col + area.colSpan - 1) - x,\n h: lines.row.trackEnd(area.row + area.rowSpan - 1) - y,\n };\n}\n\n/** A stretching node fills its area; any other node keeps its measured frame, centred in the area. */\nfunction nodeFrame(measured: MeasuredNode, area: Box): Box {\n const { frame, overhang, stretch } = measured;\n if (stretch) {\n return {\n x: area.x + overhang.left,\n y: area.y + overhang.top,\n w: area.w - overhang.left - overhang.right,\n h: area.h - overhang.top - overhang.bottom,\n };\n }\n const visualW = frame.w + overhang.left + overhang.right;\n const visualH = frame.h + overhang.top + overhang.bottom;\n return {\n x: area.x + (area.w - visualW) / 2 + overhang.left,\n y: area.y + (area.h - visualH) / 2 + overhang.top,\n ...frame,\n };\n}\n\n/** Each side of a group lies on the outer edge of its chrome slot in the gutter where the group opens or closes. */\nfunction placeGroup(\n { group, depth, area }: GroupArea,\n title: MeasuredGroupTitle,\n lines: Record<Axis, TrackLine>,\n gutters: GridGutters,\n): GroupLayout {\n const border = (axis: Axis, boundary: number, side: 'opening' | 'closing') =>\n lines[axis].gutterStart(boundary) +\n gutters[axis][boundary]![side].get(depth)!;\n const x = border('col', area.col, 'opening');\n const y = border('row', area.row, 'opening');\n const rect = {\n x,\n y,\n w: border('col', area.col + area.colSpan, 'closing') - x,\n h: border('row', area.row + area.rowSpan, 'closing') - y,\n };\n return {\n group,\n depth,\n rect,\n ...title.place(rect),\n dividers: group.dividers\n ? dividers(rect, area, title, group.labelSide, lines, gutters)\n : [],\n };\n}\n\n/** A line through the middle of every gutter inside the group, clear of its title. */\nfunction dividers(\n rect: Box,\n area: CellArea,\n title: MeasuredGroupTitle,\n labelSide: 'top' | 'bottom' | undefined,\n lines: Record<Axis, TrackLine>,\n gutters: GridGutters,\n): [Point, Point][] {\n const centre = (axis: Axis, boundary: number) =>\n lines[axis].gutterStart(boundary) + gutters[axis][boundary]!.size / 2;\n const titleAtBottom = labelSide === 'bottom';\n const top = rect.y + (titleAtBottom ? 0 : title.height);\n const bottom = rect.y + rect.h - (titleAtBottom ? title.height : 0);\n const inner = (start: number, span: number) =>\n Array.from({ length: span - 1 }, (_, index) => start + index + 1);\n return [\n ...inner(area.col, area.colSpan).map((boundary): [Point, Point] => {\n const x = centre('col', boundary);\n return [\n { x, y: top },\n { x, y: bottom },\n ];\n }),\n ...inner(area.row, area.rowSpan).map((boundary): [Point, Point] => {\n const y = centre('row', boundary);\n return [\n { x: rect.x, y },\n { x: rect.x + rect.w, y },\n ];\n }),\n ];\n}\n\nfunction viewBoxOf(\n nodes: NodeLayout[],\n groups: GroupLayout[],\n tokens: LayoutTokens,\n): Box {\n const boxes = [\n ...nodes.map((nodeLayout) => nodeLayout.visual),\n ...groups.map((groupLayout) => groupLayout.rect),\n ];\n const pad = tokens.CONTENT_PAD;\n if (boxes.length === 0) return { x: -pad, y: -pad, w: 2 * pad, h: 2 * pad };\n const left = Math.min(...boxes.map((box) => box.x));\n const top = Math.min(...boxes.map((box) => box.y));\n const right = Math.max(...boxes.map((box) => box.x + box.w));\n const bottom = Math.max(...boxes.map((box) => box.y + box.h));\n return {\n x: left - pad,\n y: top - pad,\n w: right - left + 2 * pad,\n h: bottom - top + 2 * pad,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"layout.js","names":["gridAreas","gridGutters","measureGroupTitle","measureNode","LAYOUT_TOKENS","sizeTracks","layoutGraph","ir","measured","Map","nodes","map","node","id","titles","groups","group","areas","gutters","title","height","edges","items","axis","area","get","frame","overhang","start","row","span","rowSpan","size","h","top","bottom","col","colSpan","w","left","right","line","count","gutter","lines","rows","cols","measuredNode","areaBox","place","nodeFrame","groupArea","placeGroup","leaders","viewBox","viewBoxOf","x","trackStart","y","trackEnd","stretch","visualW","visualH","depth","border","boundary","side","gutterStart","rect","dividers","labelSide","centre","titleAtBottom","inner","Array","from","length","_","index","boxes","nodeLayout","visual","groupLayout","pad","CONTENT_PAD","Math","min","box","max"],"sources":["../../../../src/lib/layouts/graph/layout.ts"],"sourcesContent":["import type { Box, DiagramGraphIR, Point } from '../../model/diagram-ir.ts';\nimport { type CellArea, type GroupArea, gridAreas } from './areas.ts';\nimport type {\n GraphLayout,\n GroupLayout,\n NodeLayout,\n} from './graph-layout-result.ts';\nimport { type Axis, type GridGutters, gridGutters } from './gutters.ts';\nimport {\n type MeasuredGroupTitle,\n type MeasuredNode,\n measureGroupTitle,\n measureNode,\n} from './measure.ts';\nimport { LAYOUT_TOKENS } from './tokens.ts';\nimport { type TrackLine, sizeTracks } from './tracks.ts';\n\n/**\n * Lays out a graph on a content-sized grid: it measures every node, sizes\n * each row and column to the content in it, and reserves the chrome of the\n * groups in the gutters between them. It throws when the grid cannot be\n * drawn without overlap.\n */\nexport function layoutGraph(ir: DiagramGraphIR): GraphLayout {\n const measured = new Map(\n ir.nodes.map(\n (node) => [node.id, measureNode(node, LAYOUT_TOKENS)] as const,\n ),\n );\n const titles = new Map(\n ir.groups.map(\n (group) => [group.id, measureGroupTitle(group, LAYOUT_TOKENS)] as const,\n ),\n );\n const areas = gridAreas(ir);\n const gutters = gridGutters(\n areas,\n new Map([...titles].map(([id, title]) => [id, title.height])),\n ir.edges,\n );\n\n const items = (axis: Axis) =>\n ir.nodes.map((node) => {\n const area = areas.nodes.get(node.id)!;\n const { frame, overhang } = measured.get(node.id)!;\n return axis === 'row'\n ? {\n start: area.row,\n span: area.rowSpan,\n size: frame.h + overhang.top + overhang.bottom,\n }\n : {\n start: area.col,\n span: area.colSpan,\n size: frame.w + overhang.left + overhang.right,\n };\n });\n const line = (axis: Axis, count: number) =>\n sizeTracks(\n count,\n items(axis),\n gutters[axis].map((gutter) => gutter.size),\n );\n const lines: Record<Axis, TrackLine> = {\n row: line('row', areas.rows),\n col: line('col', areas.cols),\n };\n\n const nodes: NodeLayout[] = ir.nodes.map((node) => {\n const measuredNode = measured.get(node.id)!;\n const area = areaBox(areas.nodes.get(node.id)!, lines);\n return { node, ...measuredNode.place(nodeFrame(measuredNode, area)) };\n });\n const groups = areas.groups.map((groupArea) =>\n placeGroup(groupArea, titles.get(groupArea.group.id)!, lines, gutters),\n );\n\n return {\n nodes,\n groups,\n edges: [],\n leaders: [],\n viewBox: viewBoxOf(nodes, groups),\n };\n}\n\nfunction areaBox(area: CellArea, lines: Record<Axis, TrackLine>): Box {\n const x = lines.col.trackStart(area.col);\n const y = lines.row.trackStart(area.row);\n return {\n x,\n y,\n w: lines.col.trackEnd(area.col + area.colSpan - 1) - x,\n h: lines.row.trackEnd(area.row + area.rowSpan - 1) - y,\n };\n}\n\n/** A stretching node fills its area; any other node keeps its measured frame, centred in the area. */\nfunction nodeFrame(measured: MeasuredNode, area: Box): Box {\n const { frame, overhang, stretch } = measured;\n if (stretch) {\n return {\n x: area.x + overhang.left,\n y: area.y + overhang.top,\n w: area.w - overhang.left - overhang.right,\n h: area.h - overhang.top - overhang.bottom,\n };\n }\n const visualW = frame.w + overhang.left + overhang.right;\n const visualH = frame.h + overhang.top + overhang.bottom;\n return {\n x: area.x + (area.w - visualW) / 2 + overhang.left,\n y: area.y + (area.h - visualH) / 2 + overhang.top,\n ...frame,\n };\n}\n\n/** Each side of a group lies on the outer edge of its chrome slot in the gutter where the group opens or closes. */\nfunction placeGroup(\n { group, depth, area }: GroupArea,\n title: MeasuredGroupTitle,\n lines: Record<Axis, TrackLine>,\n gutters: GridGutters,\n): GroupLayout {\n const border = (axis: Axis, boundary: number, side: 'opening' | 'closing') =>\n lines[axis].gutterStart(boundary) +\n gutters[axis][boundary]![side].get(depth)!;\n const x = border('col', area.col, 'opening');\n const y = border('row', area.row, 'opening');\n const rect = {\n x,\n y,\n w: border('col', area.col + area.colSpan, 'closing') - x,\n h: border('row', area.row + area.rowSpan, 'closing') - y,\n };\n return {\n group,\n depth,\n rect,\n ...title.place(rect),\n dividers: group.dividers\n ? dividers(rect, area, title, group.labelSide, lines, gutters)\n : [],\n };\n}\n\n/** A line through the middle of every gutter inside the group, clear of its title. */\nfunction dividers(\n rect: Box,\n area: CellArea,\n title: MeasuredGroupTitle,\n labelSide: 'top' | 'bottom' | undefined,\n lines: Record<Axis, TrackLine>,\n gutters: GridGutters,\n): [Point, Point][] {\n const centre = (axis: Axis, boundary: number) =>\n lines[axis].gutterStart(boundary) + gutters[axis][boundary]!.size / 2;\n const titleAtBottom = labelSide === 'bottom';\n const top = rect.y + (titleAtBottom ? 0 : title.height);\n const bottom = rect.y + rect.h - (titleAtBottom ? title.height : 0);\n const inner = (start: number, span: number) =>\n Array.from({ length: span - 1 }, (_, index) => start + index + 1);\n return [\n ...inner(area.col, area.colSpan).map((boundary): [Point, Point] => {\n const x = centre('col', boundary);\n return [\n { x, y: top },\n { x, y: bottom },\n ];\n }),\n ...inner(area.row, area.rowSpan).map((boundary): [Point, Point] => {\n const y = centre('row', boundary);\n return [\n { x: rect.x, y },\n { x: rect.x + rect.w, y },\n ];\n }),\n ];\n}\n\nfunction viewBoxOf(nodes: NodeLayout[], groups: GroupLayout[]): Box {\n const boxes = [\n ...nodes.map((nodeLayout) => nodeLayout.visual),\n ...groups.map((groupLayout) => groupLayout.rect),\n ];\n const pad = LAYOUT_TOKENS.CONTENT_PAD;\n if (boxes.length === 0) return { x: -pad, y: -pad, w: 2 * pad, h: 2 * pad };\n const left = Math.min(...boxes.map((box) => box.x));\n const top = Math.min(...boxes.map((box) => box.y));\n const right = Math.max(...boxes.map((box) => box.x + box.w));\n const bottom = Math.max(...boxes.map((box) => box.y + box.h));\n return {\n x: left - pad,\n y: top - pad,\n w: right - left + 2 * pad,\n h: bottom - top + 2 * pad,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,3 @@
1
- import type { DiagramDensity } from '../../model/diagram-ir.ts';
2
1
  import type { Font } from '../text/font.ts';
3
2
  export type LayoutFonts = {
4
3
  /** The title of a Card, or of a Box with an icon. */
@@ -49,10 +48,6 @@ export type LayoutTokens = {
49
48
  FLAT_RADIUS: number;
50
49
  fonts: LayoutFonts;
51
50
  };
52
- /**
53
- * The sizes the engine lays out with. Density scales only the space between
54
- * elements (gaps, channels, group and diagram padding); node content and
55
- * fonts keep their size, so text never shrinks to fit.
56
- */
57
- export declare function layoutTokens(density?: DiagramDensity): LayoutTokens;
51
+ /** The sizes the engine lays out with. */
52
+ export declare const LAYOUT_TOKENS: LayoutTokens;
58
53
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/lib/layouts/graph/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG;IACxB,qDAAqD;IACrD,KAAK,EAAE,IAAI,CAAC;IACZ,sCAAsC;IACtC,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,IAAI,CAAC;IACd,2CAA2C;IAC3C,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,IAAI,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAQF;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,GAAE,cAA0B,GAClC,YAAY,CAyCd"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../../../src/lib/layouts/graph/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG;IACxB,qDAAqD;IACrD,KAAK,EAAE,IAAI,CAAC;IACZ,sCAAsC;IACtC,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,IAAI,CAAC;IACd,2CAA2C;IAC3C,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,IAAI,CAAC;IACb,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,IAAI,CAAC;IACZ,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,aAAa,EAAE,YAsC3B,CAAC"}
@@ -1,108 +1,95 @@
1
- const SPACING_SCALE = {
2
- compact: 0.75,
3
- regular: 1,
4
- spacious: 1.5
5
- };
6
-
7
- /**
8
- * The sizes the engine lays out with. Density scales only the space between
9
- * elements (gaps, channels, group and diagram padding); node content and
10
- * fonts keep their size, so text never shrinks to fit.
11
- */
12
- export function layoutTokens(density = 'regular') {
13
- const scale = SPACING_SCALE[density];
14
- return {
15
- PAD_X: 16,
16
- PAD_Y: 12,
17
- ICON: 28,
18
- ICON_GAP: 12,
19
- GAP: 24 * scale,
20
- CHANNEL: 8 * scale,
21
- STUB: 16,
22
- LABEL_GAP: 4,
23
- CONTENT_PAD: 40 * scale,
24
- GROUP_PAD: 12 * scale,
25
- BAND_PAD: 6,
26
- BULLET_INDENT: 12,
27
- BLOCK_GAP: 8,
28
- CAPTION_GAP: 8,
29
- PORT_SPACING: 24,
30
- STACK_STEP: {
31
- x: 12,
32
- y: 8
1
+ /** The sizes the engine lays out with. */
2
+ export const LAYOUT_TOKENS = {
3
+ PAD_X: 16,
4
+ PAD_Y: 12,
5
+ ICON: 28,
6
+ ICON_GAP: 12,
7
+ GAP: 24,
8
+ CHANNEL: 8,
9
+ STUB: 16,
10
+ LABEL_GAP: 4,
11
+ CONTENT_PAD: 40,
12
+ GROUP_PAD: 12,
13
+ BAND_PAD: 6,
14
+ BULLET_INDENT: 12,
15
+ BLOCK_GAP: 8,
16
+ CAPTION_GAP: 8,
17
+ PORT_SPACING: 24,
18
+ STACK_STEP: {
19
+ x: 12,
20
+ y: 8
21
+ },
22
+ MARKER_ICON: 34,
23
+ CONNECTOR_ICON: 16,
24
+ BADGE_ICON: 22,
25
+ JUNCTION: 16,
26
+ APPLIANCE: {
27
+ w: 112,
28
+ h: 72
29
+ },
30
+ RADIUS: 16,
31
+ FLAT_RADIUS: 4,
32
+ fonts: {
33
+ title: {
34
+ face: 'sans',
35
+ size: 14,
36
+ weight: 600
37
+ },
38
+ body: {
39
+ face: 'sans',
40
+ size: 11,
41
+ weight: 400
42
+ },
43
+ caption: {
44
+ face: 'sans',
45
+ size: 11,
46
+ weight: 500
47
+ },
48
+ boxLabel: {
49
+ face: 'mono',
50
+ size: 12,
51
+ weight: 500
52
+ },
53
+ note: {
54
+ face: 'sans',
55
+ size: 10,
56
+ weight: 600
57
+ },
58
+ marker: {
59
+ face: 'sans',
60
+ size: 11,
61
+ weight: 700
33
62
  },
34
- MARKER_ICON: 34,
35
- CONNECTOR_ICON: 16,
36
- BADGE_ICON: 22,
37
- JUNCTION: 16,
38
- APPLIANCE: {
39
- w: 112,
40
- h: 72
63
+ connector: {
64
+ face: 'sans',
65
+ size: 10,
66
+ weight: 700
41
67
  },
42
- RADIUS: 16,
43
- FLAT_RADIUS: 4,
44
- fonts: {
45
- title: {
46
- face: 'sans',
47
- size: 14,
48
- weight: 600
49
- },
50
- body: {
51
- face: 'sans',
52
- size: 11,
53
- weight: 400
54
- },
55
- caption: {
56
- face: 'sans',
57
- size: 11,
58
- weight: 500
59
- },
60
- boxLabel: {
61
- face: 'mono',
62
- size: 12,
63
- weight: 500
64
- },
65
- note: {
66
- face: 'sans',
67
- size: 10,
68
- weight: 600
69
- },
70
- marker: {
71
- face: 'sans',
72
- size: 11,
73
- weight: 700
74
- },
75
- connector: {
76
- face: 'sans',
77
- size: 10,
78
- weight: 700
79
- },
80
- appliance: {
81
- face: 'sans',
82
- size: 12,
83
- weight: 600
84
- },
85
- groupLabel: {
86
- face: 'sans',
87
- size: 12,
88
- weight: 600
89
- },
90
- edgeLabel: {
91
- face: 'mono',
92
- size: 10,
93
- weight: 400
94
- },
95
- badge: {
96
- face: 'sans',
97
- size: 10,
98
- weight: 600
99
- },
100
- portLabel: {
101
- face: 'sans',
102
- size: 9,
103
- weight: 600
104
- }
68
+ appliance: {
69
+ face: 'sans',
70
+ size: 12,
71
+ weight: 600
72
+ },
73
+ groupLabel: {
74
+ face: 'sans',
75
+ size: 12,
76
+ weight: 600
77
+ },
78
+ edgeLabel: {
79
+ face: 'mono',
80
+ size: 10,
81
+ weight: 400
82
+ },
83
+ badge: {
84
+ face: 'sans',
85
+ size: 10,
86
+ weight: 600
87
+ },
88
+ portLabel: {
89
+ face: 'sans',
90
+ size: 9,
91
+ weight: 600
105
92
  }
106
- };
107
- }
93
+ }
94
+ };
108
95
  //# sourceMappingURL=tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","names":["SPACING_SCALE","compact","regular","spacious","layoutTokens","density","scale","PAD_X","PAD_Y","ICON","ICON_GAP","GAP","CHANNEL","STUB","LABEL_GAP","CONTENT_PAD","GROUP_PAD","BAND_PAD","BULLET_INDENT","BLOCK_GAP","CAPTION_GAP","PORT_SPACING","STACK_STEP","x","y","MARKER_ICON","CONNECTOR_ICON","BADGE_ICON","JUNCTION","APPLIANCE","w","h","RADIUS","FLAT_RADIUS","fonts","title","face","size","weight","body","caption","boxLabel","note","marker","connector","appliance","groupLabel","edgeLabel","badge","portLabel"],"sources":["../../../../src/lib/layouts/graph/tokens.ts"],"sourcesContent":["import type { DiagramDensity } from '../../model/diagram-ir.ts';\nimport type { Font } from '../text/font.ts';\n\nexport type LayoutFonts = {\n /** The title of a Card, or of a Box with an icon. */\n title: Font;\n /** A Card's description and items. */\n body: Font;\n caption: Font;\n /** A centred Box label without an icon. */\n boxLabel: Font;\n note: Font;\n marker: Font;\n connector: Font;\n appliance: Font;\n groupLabel: Font;\n edgeLabel: Font;\n badge: Font;\n portLabel: Font;\n};\n\nexport type LayoutTokens = {\n PAD_X: number;\n PAD_Y: number;\n ICON: number;\n ICON_GAP: number;\n GAP: number;\n CHANNEL: number;\n STUB: number;\n LABEL_GAP: number;\n CONTENT_PAD: number;\n GROUP_PAD: number;\n BAND_PAD: number;\n BULLET_INDENT: number;\n BLOCK_GAP: number;\n CAPTION_GAP: number;\n PORT_SPACING: number;\n STACK_STEP: { x: number; y: number };\n MARKER_ICON: number;\n CONNECTOR_ICON: number;\n BADGE_ICON: number;\n JUNCTION: number;\n APPLIANCE: { w: number; h: number };\n RADIUS: number;\n FLAT_RADIUS: number;\n fonts: LayoutFonts;\n};\n\nconst SPACING_SCALE: Record<DiagramDensity, number> = {\n compact: 0.75,\n regular: 1,\n spacious: 1.5,\n};\n\n/**\n * The sizes the engine lays out with. Density scales only the space between\n * elements (gaps, channels, group and diagram padding); node content and\n * fonts keep their size, so text never shrinks to fit.\n */\nexport function layoutTokens(\n density: DiagramDensity = 'regular',\n): LayoutTokens {\n const scale = SPACING_SCALE[density];\n return {\n PAD_X: 16,\n PAD_Y: 12,\n ICON: 28,\n ICON_GAP: 12,\n GAP: 24 * scale,\n CHANNEL: 8 * scale,\n STUB: 16,\n LABEL_GAP: 4,\n CONTENT_PAD: 40 * scale,\n GROUP_PAD: 12 * scale,\n BAND_PAD: 6,\n BULLET_INDENT: 12,\n BLOCK_GAP: 8,\n CAPTION_GAP: 8,\n PORT_SPACING: 24,\n STACK_STEP: { x: 12, y: 8 },\n MARKER_ICON: 34,\n CONNECTOR_ICON: 16,\n BADGE_ICON: 22,\n JUNCTION: 16,\n APPLIANCE: { w: 112, h: 72 },\n RADIUS: 16,\n FLAT_RADIUS: 4,\n fonts: {\n title: { face: 'sans', size: 14, weight: 600 },\n body: { face: 'sans', size: 11, weight: 400 },\n caption: { face: 'sans', size: 11, weight: 500 },\n boxLabel: { face: 'mono', size: 12, weight: 500 },\n note: { face: 'sans', size: 10, weight: 600 },\n marker: { face: 'sans', size: 11, weight: 700 },\n connector: { face: 'sans', size: 10, weight: 700 },\n appliance: { face: 'sans', size: 12, weight: 600 },\n groupLabel: { face: 'sans', size: 12, weight: 600 },\n edgeLabel: { face: 'mono', size: 10, weight: 400 },\n badge: { face: 'sans', size: 10, weight: 600 },\n portLabel: { face: 'sans', size: 9, weight: 600 },\n },\n };\n}\n"],"mappings":"AAgDA,MAAMA,aAA6C,GAAG;EACpDC,OAAO,EAAE,IAAI;EACbC,OAAO,EAAE,CAAC;EACVC,QAAQ,EAAE;AACZ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,OAAuB,GAAG,SAAS,EACrB;EACd,MAAMC,KAAK,GAAGN,aAAa,CAACK,OAAO,CAAC;EACpC,OAAO;IACLE,KAAK,EAAE,EAAE;IACTC,KAAK,EAAE,EAAE;IACTC,IAAI,EAAE,EAAE;IACRC,QAAQ,EAAE,EAAE;IACZC,GAAG,EAAE,EAAE,GAAGL,KAAK;IACfM,OAAO,EAAE,CAAC,GAAGN,KAAK;IAClBO,IAAI,EAAE,EAAE;IACRC,SAAS,EAAE,CAAC;IACZC,WAAW,EAAE,EAAE,GAAGT,KAAK;IACvBU,SAAS,EAAE,EAAE,GAAGV,KAAK;IACrBW,QAAQ,EAAE,CAAC;IACXC,aAAa,EAAE,EAAE;IACjBC,SAAS,EAAE,CAAC;IACZC,WAAW,EAAE,CAAC;IACdC,YAAY,EAAE,EAAE;IAChBC,UAAU,EAAE;MAAEC,CAAC,EAAE,EAAE;MAAEC,CAAC,EAAE;IAAE,CAAC;IAC3BC,WAAW,EAAE,EAAE;IACfC,cAAc,EAAE,EAAE;IAClBC,UAAU,EAAE,EAAE;IACdC,QAAQ,EAAE,EAAE;IACZC,SAAS,EAAE;MAAEC,CAAC,EAAE,GAAG;MAAEC,CAAC,EAAE;IAAG,CAAC;IAC5BC,MAAM,EAAE,EAAE;IACVC,WAAW,EAAE,CAAC;IACdC,KAAK,EAAE;MACLC,KAAK,EAAE;QAAEC,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAC9CC,IAAI,EAAE;QAAEH,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAC7CE,OAAO,EAAE;QAAEJ,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAChDG,QAAQ,EAAE;QAAEL,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MACjDI,IAAI,EAAE;QAAEN,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAC7CK,MAAM,EAAE;QAAEP,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAC/CM,SAAS,EAAE;QAAER,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAClDO,SAAS,EAAE;QAAET,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAClDQ,UAAU,EAAE;QAAEV,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MACnDS,SAAS,EAAE;QAAEX,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAClDU,KAAK,EAAE;QAAEZ,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAI,CAAC;MAC9CW,SAAS,EAAE;QAAEb,IAAI,EAAE,MAAM;QAAEC,IAAI,EAAE,CAAC;QAAEC,MAAM,EAAE;MAAI;IAClD;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"tokens.js","names":["LAYOUT_TOKENS","PAD_X","PAD_Y","ICON","ICON_GAP","GAP","CHANNEL","STUB","LABEL_GAP","CONTENT_PAD","GROUP_PAD","BAND_PAD","BULLET_INDENT","BLOCK_GAP","CAPTION_GAP","PORT_SPACING","STACK_STEP","x","y","MARKER_ICON","CONNECTOR_ICON","BADGE_ICON","JUNCTION","APPLIANCE","w","h","RADIUS","FLAT_RADIUS","fonts","title","face","size","weight","body","caption","boxLabel","note","marker","connector","appliance","groupLabel","edgeLabel","badge","portLabel"],"sources":["../../../../src/lib/layouts/graph/tokens.ts"],"sourcesContent":["import type { Font } from '../text/font.ts';\n\nexport type LayoutFonts = {\n /** The title of a Card, or of a Box with an icon. */\n title: Font;\n /** A Card's description and items. */\n body: Font;\n caption: Font;\n /** A centred Box label without an icon. */\n boxLabel: Font;\n note: Font;\n marker: Font;\n connector: Font;\n appliance: Font;\n groupLabel: Font;\n edgeLabel: Font;\n badge: Font;\n portLabel: Font;\n};\n\nexport type LayoutTokens = {\n PAD_X: number;\n PAD_Y: number;\n ICON: number;\n ICON_GAP: number;\n GAP: number;\n CHANNEL: number;\n STUB: number;\n LABEL_GAP: number;\n CONTENT_PAD: number;\n GROUP_PAD: number;\n BAND_PAD: number;\n BULLET_INDENT: number;\n BLOCK_GAP: number;\n CAPTION_GAP: number;\n PORT_SPACING: number;\n STACK_STEP: { x: number; y: number };\n MARKER_ICON: number;\n CONNECTOR_ICON: number;\n BADGE_ICON: number;\n JUNCTION: number;\n APPLIANCE: { w: number; h: number };\n RADIUS: number;\n FLAT_RADIUS: number;\n fonts: LayoutFonts;\n};\n\n/** The sizes the engine lays out with. */\nexport const LAYOUT_TOKENS: LayoutTokens = {\n PAD_X: 16,\n PAD_Y: 12,\n ICON: 28,\n ICON_GAP: 12,\n GAP: 24,\n CHANNEL: 8,\n STUB: 16,\n LABEL_GAP: 4,\n CONTENT_PAD: 40,\n GROUP_PAD: 12,\n BAND_PAD: 6,\n BULLET_INDENT: 12,\n BLOCK_GAP: 8,\n CAPTION_GAP: 8,\n PORT_SPACING: 24,\n STACK_STEP: { x: 12, y: 8 },\n MARKER_ICON: 34,\n CONNECTOR_ICON: 16,\n BADGE_ICON: 22,\n JUNCTION: 16,\n APPLIANCE: { w: 112, h: 72 },\n RADIUS: 16,\n FLAT_RADIUS: 4,\n fonts: {\n title: { face: 'sans', size: 14, weight: 600 },\n body: { face: 'sans', size: 11, weight: 400 },\n caption: { face: 'sans', size: 11, weight: 500 },\n boxLabel: { face: 'mono', size: 12, weight: 500 },\n note: { face: 'sans', size: 10, weight: 600 },\n marker: { face: 'sans', size: 11, weight: 700 },\n connector: { face: 'sans', size: 10, weight: 700 },\n appliance: { face: 'sans', size: 12, weight: 600 },\n groupLabel: { face: 'sans', size: 12, weight: 600 },\n edgeLabel: { face: 'mono', size: 10, weight: 400 },\n badge: { face: 'sans', size: 10, weight: 600 },\n portLabel: { face: 'sans', size: 9, weight: 600 },\n },\n};\n"],"mappings":"AA+CA;AACA,OAAO,MAAMA,aAA2B,GAAG;EACzCC,KAAK,EAAE,EAAE;EACTC,KAAK,EAAE,EAAE;EACTC,IAAI,EAAE,EAAE;EACRC,QAAQ,EAAE,EAAE;EACZC,GAAG,EAAE,EAAE;EACPC,OAAO,EAAE,CAAC;EACVC,IAAI,EAAE,EAAE;EACRC,SAAS,EAAE,CAAC;EACZC,WAAW,EAAE,EAAE;EACfC,SAAS,EAAE,EAAE;EACbC,QAAQ,EAAE,CAAC;EACXC,aAAa,EAAE,EAAE;EACjBC,SAAS,EAAE,CAAC;EACZC,WAAW,EAAE,CAAC;EACdC,YAAY,EAAE,EAAE;EAChBC,UAAU,EAAE;IAAEC,CAAC,EAAE,EAAE;IAAEC,CAAC,EAAE;EAAE,CAAC;EAC3BC,WAAW,EAAE,EAAE;EACfC,cAAc,EAAE,EAAE;EAClBC,UAAU,EAAE,EAAE;EACdC,QAAQ,EAAE,EAAE;EACZC,SAAS,EAAE;IAAEC,CAAC,EAAE,GAAG;IAAEC,CAAC,EAAE;EAAG,CAAC;EAC5BC,MAAM,EAAE,EAAE;EACVC,WAAW,EAAE,CAAC;EACdC,KAAK,EAAE;IACLC,KAAK,EAAE;MAAEC,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAC9CC,IAAI,EAAE;MAAEH,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAC7CE,OAAO,EAAE;MAAEJ,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAChDG,QAAQ,EAAE;MAAEL,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IACjDI,IAAI,EAAE;MAAEN,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAC7CK,MAAM,EAAE;MAAEP,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAC/CM,SAAS,EAAE;MAAER,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAClDO,SAAS,EAAE;MAAET,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAClDQ,UAAU,EAAE;MAAEV,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IACnDS,SAAS,EAAE;MAAEX,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAClDU,KAAK,EAAE;MAAEZ,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,EAAE;MAAEC,MAAM,EAAE;IAAI,CAAC;IAC9CW,SAAS,EAAE;MAAEb,IAAI,EAAE,MAAM;MAAEC,IAAI,EAAE,CAAC;MAAEC,MAAM,EAAE;IAAI;EAClD;AACF,CAAC","ignoreList":[]}
@@ -73,8 +73,6 @@ export type DiagramViewport = {
73
73
  fit?: DiagramViewportFit;
74
74
  zoom?: number;
75
75
  };
76
- /** How much space the graph engine leaves between elements. */
77
- export type DiagramDensity = 'compact' | 'regular' | 'spacious';
78
76
  export type DiagramPaperFill = 'background' | 'surface';
79
77
  export type DiagramPaper = boolean | {
80
78
  fill?: DiagramPaperFill;
@@ -283,7 +281,6 @@ export type DiagramGraphSpec = {
283
281
  annotations?: DiagramAnnotation[];
284
282
  guides?: DiagramGuide[];
285
283
  layout?: DiagramGraphLayout | undefined;
286
- density?: DiagramDensity | undefined;
287
284
  };
288
285
  export type GraphLayoutSpec = DiagramGraphSpec & {
289
286
  title?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"diagram-ir.d.ts","sourceRoot":"","sources":["../../../src/lib/model/diagram-ir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagram-ir.d.ts","sourceRoot":"","sources":["../../../src/lib/model/diagram-ir.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diagram-ir.js","names":[],"sources":["../../../src/lib/model/diagram-ir.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type DiagramTextColor = 'accent' | 'neutral' | 'dim';\n\nexport type DiagramTone =\n 'neutral' | 'green' | 'blue' | 'amber' | 'rose' | 'purple' | 'slate';\n\nexport type DiagramTexture = 'dots' | 'hatch' | 'none';\n\nexport type DiagramNodeIcon =\n | 'certificate'\n | 'cloudflare'\n | 'dashboard'\n | 'file'\n | 'git'\n | 'gpu'\n | 'user'\n | 'brain'\n | 'internet'\n | 'istio'\n | 'kubernetes'\n | 'logs'\n | 'metrics'\n | 'router'\n | 'server'\n | 'shield'\n | 'storage'\n | 'trace'\n | 'tunnel'\n | 'eye'\n | 'eye-off'\n | 'ellipsis';\n\nexport type DiagramLabelLine =\n | string\n | {\n text: string;\n textColor?: DiagramTextColor;\n fontWeight?: number;\n };\n\nexport type DiagramSide = 'top' | 'bottom' | 'left' | 'right';\nexport type DiagramAnchor = DiagramSide | 'center';\nexport type DiagramLabelAlign = 'start' | 'center' | 'end';\nexport type DiagramTextAlign = 'start' | 'middle' | 'end';\nexport type DiagramEdgeLabelSide =\n 'auto' | 'above' | 'below' | 'left' | 'right';\nexport type DiagramEdgeLineStyle = 'solid' | 'dashed' | 'dotted';\nexport type DiagramEdgeDirection = 'forward' | 'both' | 'none';\nexport type DiagramEdgeLayer = 'background' | 'foreground';\nexport type DiagramEdgeRoute = 'orthogonal' | 'straight';\nexport type DiagramGuideOrientation = 'vertical' | 'horizontal';\nexport type DiagramStackDirection =\n 'up-left' | 'up-right' | 'down-left' | 'down-right';\n\nexport type DiagramNodePort = {\n id: string;\n side: DiagramSide;\n offset?: number;\n label?: string;\n accent?: boolean;\n};\n\nexport type Point = { x: number; y: number };\nexport type DiagramWaypoint =\n | Point\n | { row: number; col: number; dx?: number; dy?: number }\n | {\n guide: string;\n target?: string;\n anchor?: DiagramAnchor;\n gap?: number;\n row?: number;\n col?: number;\n x?: number;\n y?: number;\n dx?: number;\n dy?: number;\n }\n | {\n target: string;\n anchor?: DiagramAnchor;\n gap?: number;\n dx?: number;\n dy?: number;\n };\nexport type Box = { x: number; y: number; w: number; h: number };\n\nexport type DiagramGraphLayout = {\n colWidth?: number;\n rowHeight?: number;\n columns?: number[];\n rows?: number[];\n padX?: number;\n padY?: number;\n titleTopPad?: number;\n};\n\nexport type DiagramViewportFit = 'width' | 'contain' | 'natural';\n\nexport type DiagramViewport = {\n fit?: DiagramViewportFit;\n zoom?: number;\n};\n\n/** How much space the graph engine leaves between elements. */\nexport type DiagramDensity = 'compact' | 'regular' | 'spacious';\n\nexport type DiagramPaperFill = 'background' | 'surface';\n\nexport type DiagramPaper =\n | boolean\n | {\n fill?: DiagramPaperFill;\n stroke?: boolean;\n rx?: number;\n };\n\nexport type DiagramNode = {\n id: string;\n label: string | DiagramLabelLine[];\n /** React content drawn inside the box; only HtmlGraphDiagram draws it. */\n content?: ReactNode;\n kind?: 'node' | 'appliance' | 'connector' | 'junction' | 'marker' | 'note';\n row?: number | undefined;\n col?: number | undefined;\n colSpan?: number | undefined;\n rowSpan?: number | undefined;\n /** Whether a Box or Card fills its grid area; other kinds keep their measured size. */\n stretch?: boolean | undefined;\n /** The id of the node or group a note explains. */\n target?: string | undefined;\n width?: number;\n height?: number;\n frame?: 'solid' | 'transparent' | 'flat' | 'filled' | 'none';\n textColor?: DiagramTextColor | undefined;\n tone?: DiagramTone | undefined;\n texture?: DiagramTexture | undefined;\n fontWeight?: number | undefined;\n fontSize?: number | undefined;\n bodyFontSize?: number;\n bodyLineGap?: number;\n accent?: boolean | undefined;\n description?: string | string[];\n items?: string[];\n caption?: string | string[] | undefined;\n captionSide?: DiagramSide | undefined;\n captionFrame?: boolean;\n captionOffset?: number | undefined;\n captionColor?: DiagramTextColor | undefined;\n captionFontSize?: number | undefined;\n captionFontWeight?: number | undefined;\n group?: string;\n icon?: DiagramNodeIcon | undefined;\n iconSize?: number | undefined;\n ports?: DiagramNodePort[] | undefined;\n rx?: number;\n textAlign?: 'center' | 'start' | undefined;\n hidden?: boolean | undefined;\n connectable?: boolean | undefined;\n stack?: number;\n stackOffset?: number;\n stackDirection?: DiagramStackDirection;\n stackDx?: number;\n stackDy?: number;\n stackWidthStep?: number;\n stackHeightStep?: number;\n appliancePorts?: number | undefined;\n antenna?: boolean | undefined;\n slant?: number | undefined;\n};\n\nexport type DiagramEdge = {\n from: string;\n to: string;\n label?: string[];\n badgeIcon?: DiagramNodeIcon;\n badgeLabel?: string[];\n badgeSide?: DiagramEdgeLabelSide;\n badgeOffset?: number;\n badgeDx?: number;\n badgeDy?: number;\n badgeT?: number;\n labelSide?: DiagramEdgeLabelSide;\n labelFontSize?: number;\n labelOffset?: number;\n labelT?: number;\n labelSegment?: number;\n labelDx?: number;\n labelDy?: number;\n labelAlign?: DiagramTextAlign;\n labelFrame?: boolean;\n labelFramePadding?: number;\n labelLineGap?: number;\n channel?: string;\n lineStyle?: DiagramEdgeLineStyle;\n direction?: DiagramEdgeDirection;\n layer?: DiagramEdgeLayer;\n route?: DiagramEdgeRoute;\n strokeWidth?: number;\n waypoints?: DiagramWaypoint[];\n exitSide?: DiagramSide;\n exitOffset?: number;\n entrySide?: DiagramSide;\n entryOffset?: number;\n entryGap?: number;\n stubDistance?: number;\n accent?: boolean;\n dim?: boolean;\n headless?: boolean | undefined;\n};\n\nexport type DiagramGroup = {\n id: string;\n label: string | string[];\n labelAlign?: DiagramLabelAlign | undefined;\n labelSide?: 'top' | 'bottom' | undefined;\n accent?: boolean | undefined;\n tone?: DiagramTone | undefined;\n texture?: DiagramTexture | undefined;\n rx?: number | undefined;\n frame?: 'solid' | 'dashed' | 'none' | undefined;\n fill?: 'surface' | 'none' | undefined;\n ports?: DiagramNodePort[] | undefined;\n parent?: string | undefined;\n /** An explicit grid area; without one the group covers the bounding box of its members. */\n row?: number | undefined;\n col?: number | undefined;\n rowSpan?: number | undefined;\n colSpan?: number | undefined;\n tight?: boolean | undefined;\n tightX?: boolean | undefined;\n tightY?: boolean | undefined;\n titleBand?: boolean | undefined;\n titleGap?: number | undefined;\n padding?: number | Partial<Record<DiagramSide, number>> | undefined;\n dividers?:\n | {\n rows?: number[];\n cols?: number[];\n }\n | undefined;\n bounds?:\n | {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n }\n | undefined;\n};\n\nexport type DiagramAnnotationLeaderRoute = 'straight' | 'elbow';\n\nexport type DiagramAnnotationLeader = {\n target: string;\n anchor: DiagramAnchor;\n route: DiagramAnnotationLeaderRoute;\n from: Point;\n to: Point;\n points: Point[];\n};\n\nexport type DiagramAnnotation = {\n x?: number;\n y?: number;\n target?: string;\n targets?: string[];\n anchor?: DiagramAnchor;\n guide?: string;\n offset?: number;\n dx?: number;\n dy?: number;\n text: string[];\n align?: DiagramTextAlign;\n color?: DiagramTextColor;\n fontWeight?: number;\n fontSize?: number;\n lineGap?: number;\n leader?: boolean;\n leaderGap?: number;\n leaderRoute?: DiagramAnnotationLeaderRoute;\n};\n\nexport type DiagramLane = {\n id: string;\n label: string[];\n accent?: boolean | undefined;\n};\n\nexport type DiagramSignalBox = 'source' | 'center' | 'target';\n\nexport type DiagramSignal = {\n from: string;\n to: string;\n label: string[];\n accent?: boolean;\n dim?: boolean;\n boxed?: DiagramSignalBox;\n stub?: number;\n bordered?: boolean;\n filled?: boolean;\n};\n\nexport type DiagramFrameElement = {\n label: string;\n signals: DiagramSignal[];\n};\n\nexport type DiagramGuide = {\n id?: string;\n orientation?: DiagramGuideOrientation;\n lane?: string;\n x?: number;\n y?: number;\n row?: number;\n col?: number;\n target?: string;\n anchor?: DiagramAnchor;\n gap?: number;\n dx?: number;\n dy?: number;\n yStart?: number;\n yEnd?: number;\n accent?: boolean;\n};\n\nexport type DiagramMarker = DiagramNode;\n\nexport type DiagramGraphSpec = {\n nodes: DiagramNode[];\n edges: DiagramEdge[];\n groups?: DiagramGroup[] | undefined;\n annotations?: DiagramAnnotation[];\n guides?: DiagramGuide[];\n layout?: DiagramGraphLayout | undefined;\n density?: DiagramDensity | undefined;\n};\n\nexport type GraphLayoutSpec = DiagramGraphSpec & { title?: string[] };\n\nexport type DiagramTimelineSpec = {\n lanes: DiagramLane[];\n signals: DiagramSignal[];\n frame?: DiagramFrameElement | undefined;\n};\n\nexport type DiagramGraphIR = DiagramGraphSpec & {\n groups: DiagramGroup[];\n annotations: DiagramAnnotation[];\n guides: DiagramGuide[];\n};\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"diagram-ir.js","names":[],"sources":["../../../src/lib/model/diagram-ir.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type DiagramTextColor = 'accent' | 'neutral' | 'dim';\n\nexport type DiagramTone =\n 'neutral' | 'green' | 'blue' | 'amber' | 'rose' | 'purple' | 'slate';\n\nexport type DiagramTexture = 'dots' | 'hatch' | 'none';\n\nexport type DiagramNodeIcon =\n | 'certificate'\n | 'cloudflare'\n | 'dashboard'\n | 'file'\n | 'git'\n | 'gpu'\n | 'user'\n | 'brain'\n | 'internet'\n | 'istio'\n | 'kubernetes'\n | 'logs'\n | 'metrics'\n | 'router'\n | 'server'\n | 'shield'\n | 'storage'\n | 'trace'\n | 'tunnel'\n | 'eye'\n | 'eye-off'\n | 'ellipsis';\n\nexport type DiagramLabelLine =\n | string\n | {\n text: string;\n textColor?: DiagramTextColor;\n fontWeight?: number;\n };\n\nexport type DiagramSide = 'top' | 'bottom' | 'left' | 'right';\nexport type DiagramAnchor = DiagramSide | 'center';\nexport type DiagramLabelAlign = 'start' | 'center' | 'end';\nexport type DiagramTextAlign = 'start' | 'middle' | 'end';\nexport type DiagramEdgeLabelSide =\n 'auto' | 'above' | 'below' | 'left' | 'right';\nexport type DiagramEdgeLineStyle = 'solid' | 'dashed' | 'dotted';\nexport type DiagramEdgeDirection = 'forward' | 'both' | 'none';\nexport type DiagramEdgeLayer = 'background' | 'foreground';\nexport type DiagramEdgeRoute = 'orthogonal' | 'straight';\nexport type DiagramGuideOrientation = 'vertical' | 'horizontal';\nexport type DiagramStackDirection =\n 'up-left' | 'up-right' | 'down-left' | 'down-right';\n\nexport type DiagramNodePort = {\n id: string;\n side: DiagramSide;\n offset?: number;\n label?: string;\n accent?: boolean;\n};\n\nexport type Point = { x: number; y: number };\nexport type DiagramWaypoint =\n | Point\n | { row: number; col: number; dx?: number; dy?: number }\n | {\n guide: string;\n target?: string;\n anchor?: DiagramAnchor;\n gap?: number;\n row?: number;\n col?: number;\n x?: number;\n y?: number;\n dx?: number;\n dy?: number;\n }\n | {\n target: string;\n anchor?: DiagramAnchor;\n gap?: number;\n dx?: number;\n dy?: number;\n };\nexport type Box = { x: number; y: number; w: number; h: number };\n\nexport type DiagramGraphLayout = {\n colWidth?: number;\n rowHeight?: number;\n columns?: number[];\n rows?: number[];\n padX?: number;\n padY?: number;\n titleTopPad?: number;\n};\n\nexport type DiagramViewportFit = 'width' | 'contain' | 'natural';\n\nexport type DiagramViewport = {\n fit?: DiagramViewportFit;\n zoom?: number;\n};\n\nexport type DiagramPaperFill = 'background' | 'surface';\n\nexport type DiagramPaper =\n | boolean\n | {\n fill?: DiagramPaperFill;\n stroke?: boolean;\n rx?: number;\n };\n\nexport type DiagramNode = {\n id: string;\n label: string | DiagramLabelLine[];\n /** React content drawn inside the box; only HtmlGraphDiagram draws it. */\n content?: ReactNode;\n kind?: 'node' | 'appliance' | 'connector' | 'junction' | 'marker' | 'note';\n row?: number | undefined;\n col?: number | undefined;\n colSpan?: number | undefined;\n rowSpan?: number | undefined;\n /** Whether a Box or Card fills its grid area; other kinds keep their measured size. */\n stretch?: boolean | undefined;\n /** The id of the node or group a note explains. */\n target?: string | undefined;\n width?: number;\n height?: number;\n frame?: 'solid' | 'transparent' | 'flat' | 'filled' | 'none';\n textColor?: DiagramTextColor | undefined;\n tone?: DiagramTone | undefined;\n texture?: DiagramTexture | undefined;\n fontWeight?: number | undefined;\n fontSize?: number | undefined;\n bodyFontSize?: number;\n bodyLineGap?: number;\n accent?: boolean | undefined;\n description?: string | string[];\n items?: string[];\n caption?: string | string[] | undefined;\n captionSide?: DiagramSide | undefined;\n captionFrame?: boolean;\n captionOffset?: number | undefined;\n captionColor?: DiagramTextColor | undefined;\n captionFontSize?: number | undefined;\n captionFontWeight?: number | undefined;\n group?: string;\n icon?: DiagramNodeIcon | undefined;\n iconSize?: number | undefined;\n ports?: DiagramNodePort[] | undefined;\n rx?: number;\n textAlign?: 'center' | 'start' | undefined;\n hidden?: boolean | undefined;\n connectable?: boolean | undefined;\n stack?: number;\n stackOffset?: number;\n stackDirection?: DiagramStackDirection;\n stackDx?: number;\n stackDy?: number;\n stackWidthStep?: number;\n stackHeightStep?: number;\n appliancePorts?: number | undefined;\n antenna?: boolean | undefined;\n slant?: number | undefined;\n};\n\nexport type DiagramEdge = {\n from: string;\n to: string;\n label?: string[];\n badgeIcon?: DiagramNodeIcon;\n badgeLabel?: string[];\n badgeSide?: DiagramEdgeLabelSide;\n badgeOffset?: number;\n badgeDx?: number;\n badgeDy?: number;\n badgeT?: number;\n labelSide?: DiagramEdgeLabelSide;\n labelFontSize?: number;\n labelOffset?: number;\n labelT?: number;\n labelSegment?: number;\n labelDx?: number;\n labelDy?: number;\n labelAlign?: DiagramTextAlign;\n labelFrame?: boolean;\n labelFramePadding?: number;\n labelLineGap?: number;\n channel?: string;\n lineStyle?: DiagramEdgeLineStyle;\n direction?: DiagramEdgeDirection;\n layer?: DiagramEdgeLayer;\n route?: DiagramEdgeRoute;\n strokeWidth?: number;\n waypoints?: DiagramWaypoint[];\n exitSide?: DiagramSide;\n exitOffset?: number;\n entrySide?: DiagramSide;\n entryOffset?: number;\n entryGap?: number;\n stubDistance?: number;\n accent?: boolean;\n dim?: boolean;\n headless?: boolean | undefined;\n};\n\nexport type DiagramGroup = {\n id: string;\n label: string | string[];\n labelAlign?: DiagramLabelAlign | undefined;\n labelSide?: 'top' | 'bottom' | undefined;\n accent?: boolean | undefined;\n tone?: DiagramTone | undefined;\n texture?: DiagramTexture | undefined;\n rx?: number | undefined;\n frame?: 'solid' | 'dashed' | 'none' | undefined;\n fill?: 'surface' | 'none' | undefined;\n ports?: DiagramNodePort[] | undefined;\n parent?: string | undefined;\n /** An explicit grid area; without one the group covers the bounding box of its members. */\n row?: number | undefined;\n col?: number | undefined;\n rowSpan?: number | undefined;\n colSpan?: number | undefined;\n tight?: boolean | undefined;\n tightX?: boolean | undefined;\n tightY?: boolean | undefined;\n titleBand?: boolean | undefined;\n titleGap?: number | undefined;\n padding?: number | Partial<Record<DiagramSide, number>> | undefined;\n dividers?:\n | {\n rows?: number[];\n cols?: number[];\n }\n | undefined;\n bounds?:\n | {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n }\n | undefined;\n};\n\nexport type DiagramAnnotationLeaderRoute = 'straight' | 'elbow';\n\nexport type DiagramAnnotationLeader = {\n target: string;\n anchor: DiagramAnchor;\n route: DiagramAnnotationLeaderRoute;\n from: Point;\n to: Point;\n points: Point[];\n};\n\nexport type DiagramAnnotation = {\n x?: number;\n y?: number;\n target?: string;\n targets?: string[];\n anchor?: DiagramAnchor;\n guide?: string;\n offset?: number;\n dx?: number;\n dy?: number;\n text: string[];\n align?: DiagramTextAlign;\n color?: DiagramTextColor;\n fontWeight?: number;\n fontSize?: number;\n lineGap?: number;\n leader?: boolean;\n leaderGap?: number;\n leaderRoute?: DiagramAnnotationLeaderRoute;\n};\n\nexport type DiagramLane = {\n id: string;\n label: string[];\n accent?: boolean | undefined;\n};\n\nexport type DiagramSignalBox = 'source' | 'center' | 'target';\n\nexport type DiagramSignal = {\n from: string;\n to: string;\n label: string[];\n accent?: boolean;\n dim?: boolean;\n boxed?: DiagramSignalBox;\n stub?: number;\n bordered?: boolean;\n filled?: boolean;\n};\n\nexport type DiagramFrameElement = {\n label: string;\n signals: DiagramSignal[];\n};\n\nexport type DiagramGuide = {\n id?: string;\n orientation?: DiagramGuideOrientation;\n lane?: string;\n x?: number;\n y?: number;\n row?: number;\n col?: number;\n target?: string;\n anchor?: DiagramAnchor;\n gap?: number;\n dx?: number;\n dy?: number;\n yStart?: number;\n yEnd?: number;\n accent?: boolean;\n};\n\nexport type DiagramMarker = DiagramNode;\n\nexport type DiagramGraphSpec = {\n nodes: DiagramNode[];\n edges: DiagramEdge[];\n groups?: DiagramGroup[] | undefined;\n annotations?: DiagramAnnotation[];\n guides?: DiagramGuide[];\n layout?: DiagramGraphLayout | undefined;\n};\n\nexport type GraphLayoutSpec = DiagramGraphSpec & { title?: string[] };\n\nexport type DiagramTimelineSpec = {\n lanes: DiagramLane[];\n signals: DiagramSignal[];\n frame?: DiagramFrameElement | undefined;\n};\n\nexport type DiagramGraphIR = DiagramGraphSpec & {\n groups: DiagramGroup[];\n annotations: DiagramAnnotation[];\n guides: DiagramGuide[];\n};\n"],"mappings":"","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zukhruf/diagram",
3
- "version": "0.3.31",
3
+ "version": "0.3.32",
4
4
  "description": "Architecture and sequence diagrams as React components: declare nodes, edges, lanes and signals, and render them as SVG, HTML or canvas.",
5
5
  "license": "MIT",
6
6
  "repository": {