@neo4j-ndl/react-graph 2.1.23 → 2.2.4

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.
@@ -35,7 +35,42 @@ import { color, rgbToHex, validHex } from '@uiw/react-color';
35
35
  import { clampNumericValue, compareNumericValues, getNumericWeight, isBigintLiteral, lerpColor, numericValuesEqual, parseDateString, parseLocalDateString, parseTimeString, resolveNumericLiteral, resolveRangeLiteral, } from '../_generated/style-rules';
36
36
  export const DEFAULT_REL_COLOR = tokens.palette.neutral['40'];
37
37
  const NO_LABEL_FALLBACK_COLOR = tokens.palette.neutral['40'];
38
- export const UNIQUE_COLORS_PALETTE = Object.values(tokens.graph).filter(validHex);
38
+ // Positions 12-33 of Bloom's legacy unique-values palette, ported so that
39
+ // assignment order matches Bloom. Positions 1-11 come from tokens.graph, whose
40
+ // first 11 values are the same hues. tokens.graph['12'] (#579380) is left out
41
+ // because Bloom has no color at that position and including it would shift
42
+ // every later assignment out of alignment.
43
+ const BLOOM_PALETTE_TAIL = [
44
+ '#ffffa3',
45
+ '#edb2e3',
46
+ '#ffb987',
47
+ '#7febff',
48
+ '#ff8987',
49
+ '#fdebd1',
50
+ '#aff0b5',
51
+ '#ffd8ec',
52
+ '#73affe',
53
+ '#ffe776',
54
+ '#ff93b6',
55
+ '#ffffc6',
56
+ '#ffd5ff',
57
+ '#ffdda9',
58
+ '#a5ffff',
59
+ '#ffaca8',
60
+ '#fffff4',
61
+ '#d3ffd8',
62
+ '#fffcff',
63
+ '#99d2ff',
64
+ '#ffff98',
65
+ '#ffb6d8',
66
+ ];
67
+ const GRAPH_TOKENS_IN_BLOOM_PALETTE = 11;
68
+ export const UNIQUE_COLORS_PALETTE = [
69
+ ...Object.values(tokens.graph)
70
+ .filter(validHex)
71
+ .slice(0, GRAPH_TOKENS_IN_BLOOM_PALETTE),
72
+ ...BLOOM_PALETTE_TAIL,
73
+ ];
39
74
  function compareByPriorityAscending(firstRule, secondRule) {
40
75
  return firstRule.priority - secondRule.priority;
41
76
  }
@@ -672,8 +707,7 @@ function evaluateNodeStyle(style, node, uniqueColorsCache) {
672
707
  }
673
708
  return result;
674
709
  }
675
- function createRelStyleFunction(rules) {
676
- const uniqueColorsCache = new Map();
710
+ function createRelStyleFunction(rules, uniqueColorsCache) {
677
711
  return (rel) => {
678
712
  const style = {};
679
713
  for (const rule of rules) {
@@ -685,11 +719,10 @@ function createRelStyleFunction(rules) {
685
719
  return evaluateRelStyle(style, rel, uniqueColorsCache);
686
720
  };
687
721
  }
688
- function createByLabelSetFunction(styleMatchers) {
722
+ function createByLabelSetFunction(styleMatchers, uniqueColorsCache) {
689
723
  const defaultColorCache = new Map();
690
724
  const sortedRulesCache = new Map();
691
725
  const mergedStyleCache = new Map();
692
- const uniqueColorsCache = new Map();
693
726
  return (node) => {
694
727
  var _a;
695
728
  const labelSetKey = node.labelsSorted.join('\0');
@@ -758,6 +791,10 @@ const DEFAULT_REL_STYLE = {
758
791
  };
759
792
  export function compileGraphStyleRules(styleRules) {
760
793
  const styleMatchers = collectStyleMatchers(styleRules);
794
+ // Shared across nodes and every relationship type so each rule keeps a single
795
+ // value-to-color counter. Keyed by UniqueColors object identity, and a rule
796
+ // matches either labels or reltypes, so rules stay isolated from each other.
797
+ const uniqueColorsCache = new Map();
761
798
  // Lazily build and cache a style function per relationship type
762
799
  const cache = new Map();
763
800
  const byType = (type) => {
@@ -771,12 +808,12 @@ export function compileGraphStyleRules(styleRules) {
771
808
  fn = createRelStyleFunction([
772
809
  DEFAULT_REL_STYLE,
773
810
  ...[...styleMatchers.globalReltypeRules, ...rules].toSorted(compareByPriorityAscending),
774
- ]);
811
+ ], uniqueColorsCache);
775
812
  cache.set(type, fn);
776
813
  }
777
814
  return fn;
778
815
  };
779
- const byLabelSet = createByLabelSetFunction(styleMatchers);
816
+ const byLabelSet = createByLabelSetFunction(styleMatchers, uniqueColorsCache);
780
817
  return { byLabelSet, byType, styleMatchers };
781
818
  }
782
819
  //# sourceMappingURL=compile-graph-styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compile-graph-styles.js","sourceRoot":"","sources":["../../../src/styling/compile-graph-styles.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { calculateDefaultNodeColors } from '@neo4j-devtools/word-color';\nimport { tokens } from '@neo4j-ndl/base';\nimport { color, type RgbColor, rgbToHex, validHex } from '@uiw/react-color';\n\nimport {\n clampNumericValue,\n compareNumericValues,\n getNumericWeight,\n isBigintLiteral,\n lerpColor,\n numericValuesEqual,\n parseDateString,\n parseLocalDateString,\n parseTimeString,\n type RangeLiteral,\n resolveNumericLiteral,\n resolveRangeLiteral,\n} from '../_generated/style-rules';\nimport {\n type NodeData,\n type PortableProperty,\n type RelData,\n} from '../graph-visualization-context';\nimport {\n type Caption,\n type ColorRange,\n type EvaluatedNvlNodeStyle,\n type EvaluatedNvlRelationshipStyle,\n type GraphStyleRule,\n type NonStaticStyles,\n type Style,\n type UniqueColors,\n type Value,\n type Where,\n} from './style-types';\n\nexport const DEFAULT_REL_COLOR = tokens.palette.neutral['40'];\nconst NO_LABEL_FALLBACK_COLOR = tokens.palette.neutral['40'];\n\nexport const UNIQUE_COLORS_PALETTE = Object.values(tokens.graph).filter(\n validHex,\n);\n\ntype StyleMatchers = {\n globalLabelRules: GraphStyleRule[];\n globalReltypeRules: GraphStyleRule[];\n rulesByLabel: Map<string, GraphStyleRule[]>;\n rulesByType: Map<string, GraphStyleRule[]>;\n};\n\nfunction compareByPriorityAscending(\n firstRule: GraphStyleRule,\n secondRule: GraphStyleRule,\n): number {\n return firstRule.priority! - secondRule.priority!;\n}\n\nfunction collectStyleMatchers(\n styles: GraphStyleRule[] | null | undefined,\n): StyleMatchers {\n const rulesByLabel = new Map<string, GraphStyleRule[]>();\n const rulesByType = new Map<string, GraphStyleRule[]>();\n const globalLabelRules: GraphStyleRule[] = [];\n const globalReltypeRules: GraphStyleRule[] = [];\n\n // Handle null/undefined styles gracefully\n if (!styles || styles.length === 0) {\n return {\n globalLabelRules,\n globalReltypeRules,\n rulesByLabel,\n rulesByType,\n };\n }\n\n const totalRules = styles.length;\n\n styles.forEach((style, index) => {\n if (style.isDisabled ?? false) {\n return;\n }\n\n if (style.priority !== undefined && style.priority < 0) {\n throw new Error(\n `GraphStyleRule priority must be >= 0, got ${style.priority}. Negative values are reserved for internal use.`,\n );\n }\n\n // Fill in priority if not set (negative values preserve original order)\n const { priority, ...rest } = style;\n const ruleWithPriority: GraphStyleRule = {\n ...rest,\n priority: priority ?? index - totalRules,\n };\n\n // style for nodes\n if ('label' in style.match) {\n // if the label is null, it's a global rule (matches any node)\n if (style.match.label === null) {\n globalLabelRules.push(ruleWithPriority);\n } else {\n // Specific label rule\n const existing = rulesByLabel.get(style.match.label) ?? [];\n rulesByLabel.set(style.match.label, [...existing, ruleWithPriority]);\n }\n }\n\n // style for relationships\n if ('reltype' in style.match) {\n if (style.match.reltype === null) {\n // Global reltype rule (matches any relationship)\n globalReltypeRules.push(ruleWithPriority);\n } else {\n // Specific reltype rule\n const existing = rulesByType.get(style.match.reltype) ?? [];\n rulesByType.set(style.match.reltype, [...existing, ruleWithPriority]);\n }\n }\n });\n\n return {\n globalLabelRules,\n globalReltypeRules,\n rulesByLabel,\n rulesByType,\n };\n}\n\n/**\n * Interpolates a color from a ColorRange based on a graph item's property value.\n * Returns a #rrggbb hex string, or null if the colorRange config is invalid\n * (bad hex colors, invalid value range, missing/non-numeric property).\n */\nfunction getInterpolatedColor(\n colorRange: ColorRange,\n graphItem: NodeData | RelData,\n): string | null {\n const {\n onProperty,\n minValue,\n minColor,\n maxValue,\n maxColor,\n midValue,\n midColor,\n } = colorRange;\n\n if (!validHex(minColor) || !validHex(maxColor)) {\n return null;\n }\n const minRgb = color(minColor).rgb;\n const maxRgb = color(maxColor).rgb;\n const resolvedMinValue = resolveRangeLiteral(minValue);\n const resolvedMaxValue = resolveRangeLiteral(maxValue);\n if (resolvedMinValue === null || resolvedMaxValue === null) {\n return null;\n }\n const boundsOrder = compareNumericValues(resolvedMinValue, resolvedMaxValue);\n if (boundsOrder === null) {\n return null;\n }\n const actualMinValue = boundsOrder <= 0 ? resolvedMinValue : resolvedMaxValue;\n const actualMaxValue = boundsOrder <= 0 ? resolvedMaxValue : resolvedMinValue;\n\n // Validate mid stop if provided\n let midRgb: RgbColor | undefined = undefined;\n const resolvedMidValue =\n midValue === undefined ? undefined : resolveRangeLiteral(midValue);\n if (resolvedMidValue === null) {\n return null;\n }\n if (midValue !== undefined && midColor !== undefined) {\n const minToMid = compareNumericValues(actualMinValue, resolvedMidValue!);\n const midToMax = compareNumericValues(resolvedMidValue!, actualMaxValue);\n const isMidInRange =\n minToMid !== null && midToMax !== null && minToMid <= 0 && midToMax <= 0;\n if (!isMidInRange || !validHex(midColor)) {\n return null;\n }\n midRgb = color(midColor).rgb;\n }\n\n const prop = graphItem.properties[onProperty];\n if (prop === undefined) {\n return null;\n }\n const rawValue = extractPropertyValue(prop);\n if (typeof rawValue !== 'number' && typeof rawValue !== 'bigint') {\n return null;\n }\n\n const clampedValue = clampNumericValue(\n rawValue,\n actualMinValue,\n actualMaxValue,\n );\n if (clampedValue === null) {\n return null;\n }\n\n let rgb: RgbColor;\n\n if (midRgb !== undefined && resolvedMidValue !== undefined) {\n const weight = getNumericWeight(\n resolvedMinValue,\n resolvedMidValue,\n clampedValue,\n );\n if (weight === null) {\n return null;\n }\n const isBetweenMinAndMid = weight <= 1;\n if (isBetweenMinAndMid) {\n rgb = lerpColor(minRgb, midRgb, weight);\n } else {\n const secondWeight = getNumericWeight(\n resolvedMidValue,\n resolvedMaxValue,\n clampedValue,\n );\n if (secondWeight === null) {\n return null;\n }\n rgb = lerpColor(midRgb, maxRgb, secondWeight);\n }\n } else {\n const weight = getNumericWeight(\n resolvedMinValue,\n resolvedMaxValue,\n clampedValue,\n );\n if (weight === null) {\n return null;\n }\n rgb = lerpColor(minRgb, maxRgb, weight);\n }\n\n return rgbToHex(rgb);\n}\n\n/**\n * Interpolates a numeric size/width from a range based on a graph item's property value.\n * Returns the interpolated number, or null if the property is missing or non-numeric.\n */\nfunction getInterpolatedSize(\n prop: PortableProperty | undefined,\n minValue: RangeLiteral,\n maxValue: RangeLiteral,\n minOut: number,\n maxOut: number,\n): number | null {\n if (prop === undefined) {\n return null;\n }\n const rawValue = extractPropertyValue(prop);\n if (typeof rawValue !== 'number' && typeof rawValue !== 'bigint') {\n return null;\n }\n\n const resolvedMinValue = resolveRangeLiteral(minValue);\n const resolvedMaxValue = resolveRangeLiteral(maxValue);\n if (resolvedMinValue === null || resolvedMaxValue === null) {\n return null;\n }\n const clampedValue = clampNumericValue(\n rawValue,\n resolvedMinValue,\n resolvedMaxValue,\n );\n if (clampedValue === null) {\n return null;\n }\n const weight = getNumericWeight(\n resolvedMinValue,\n resolvedMaxValue,\n clampedValue,\n );\n if (weight === null) {\n return null;\n }\n return minOut * (1 - weight) + maxOut * weight;\n}\n\nfunction extractPropertyValue(\n prop: PortableProperty,\n): string | number | bigint | boolean | null {\n switch (prop.type) {\n case 'string':\n return JSON.parse(prop.stringified);\n case 'number':\n case 'integer':\n case 'Integer':\n case 'float':\n return Number(prop.stringified);\n case 'bigint':\n case 'BigInt': {\n try {\n const value = prop.stringified.startsWith('\"')\n ? (JSON.parse(prop.stringified) as string)\n : prop.stringified;\n return BigInt(value);\n } catch {\n return null;\n }\n }\n case 'boolean':\n case 'Boolean':\n return prop.stringified === 'true';\n case 'null':\n return null;\n // Neo4j temporal types — parse to a number for comparison with\n // { datetime } and { time } rule literals. An unparseable value resolves to\n // null (treated as missing) rather than leaking a raw string into numeric\n // comparisons, matching Cypher null semantics.\n //\n // DateTime / Date → Unix milliseconds (epoch ms), UTC-based.\n case 'DateTime':\n case 'Date': {\n const dateString = JSON.parse(prop.stringified) as string;\n return parseDateString(dateString);\n }\n // LocalDateTime → Unix milliseconds in the browser's local timezone,\n // matching { localdatetime } rule literals. Zoned strings are rejected\n // (resolve to null), as LocalDateTime has no associated timezone.\n case 'LocalDateTime': {\n const dateString = JSON.parse(prop.stringified) as string;\n return parseLocalDateString(dateString);\n }\n // Time (ZonedTime) / LocalTime → UTC-normalised ms since midnight\n // LocalTime has no offset; treated as UTC.\n case 'Time':\n case 'LocalTime': {\n const timeString = JSON.parse(prop.stringified) as string;\n return parseTimeString(timeString);\n }\n default:\n return prop.stringified;\n }\n}\n\n/**\n * Three-valued logic type matching Cypher/SQL semantics.\n * - `true`: condition is satisfied\n * - `false`: condition is not satisfied\n * - `null`: condition is unknown (e.g., comparing with null/missing property)\n *\n * @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n */\ntype Ternary = boolean | null;\ntype ResolvedCypherValue = string | number | bigint | boolean | null;\n\n/**\n * Evaluates a WHERE clause using three-valued logic matching Cypher semantics.\n *\n * From Neo4j Cypher Manual:\n * - Comparing any value to `null` results in `null`, not `true` or `false`\n * - Accessing a non-existent property returns `null`\n * - In WHERE clauses, only `true` passes; both `false` and `null` exclude the row\n *\n * Three-valued logic rules:\n * - NOT null → null\n * - true AND null → null, false AND null → false\n * - true OR null → true, false OR null → null\n *\n * @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n */\nfunction evaluateWhere(node: NodeData | RelData, where?: Where): Ternary {\n if (!where) {\n return true;\n }\n\n if ('equal' in where) {\n const [left, right] = where.equal;\n const leftVal = evaluateValue(left, node);\n const rightVal = evaluateValue(right, node);\n // In Cypher, null = null → null (not true)\n if (leftVal === null || rightVal === null) {\n return null;\n }\n if (\n (typeof leftVal === 'number' || typeof leftVal === 'bigint') &&\n (typeof rightVal === 'number' || typeof rightVal === 'bigint')\n ) {\n return numericValuesEqual(leftVal, rightVal);\n }\n return leftVal === rightVal;\n }\n\n if ('not' in where) {\n // Cypher: NOT null → null\n const isMatch = evaluateWhere(node, where.not);\n return isMatch === null ? null : !isMatch;\n }\n\n if ('lessThan' in where) {\n const [left, right] = where.lessThan;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue < rightValue,\n );\n }\n\n if ('lessThanOrEqual' in where) {\n const [left, right] = where.lessThanOrEqual;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue <= rightValue,\n );\n }\n\n if ('greaterThan' in where) {\n const [left, right] = where.greaterThan;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue > rightValue,\n );\n }\n\n if ('greaterThanOrEqual' in where) {\n const [left, right] = where.greaterThanOrEqual;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue >= rightValue,\n );\n }\n\n if ('contains' in where) {\n const [left, right] = where.contains;\n return safeStringCompare(left, right, node, (leftValue, rightValue) =>\n leftValue.includes(rightValue),\n );\n }\n\n if ('startsWith' in where) {\n const [left, right] = where.startsWith;\n return safeStringCompare(left, right, node, (leftValue, rightValue) =>\n leftValue.startsWith(rightValue),\n );\n }\n\n if ('endsWith' in where) {\n const [left, right] = where.endsWith;\n return safeStringCompare(left, right, node, (leftValue, rightValue) =>\n leftValue.endsWith(rightValue),\n );\n }\n\n if ('isNull' in where) {\n // IS NULL returns true/false (never null)\n const value = evaluateValue(where.isNull, node);\n return value === null;\n }\n\n if ('and' in where) {\n // Cypher three-valued AND:\n // - If any is false → false\n // - Else if any is null → null\n // - Else → true\n let hasNull = false;\n for (const whereClause of where.and) {\n const isMatch = evaluateWhere(node, whereClause);\n if (isMatch === false) {\n return false;\n }\n if (isMatch === null) {\n hasNull = true;\n }\n }\n return hasNull ? null : true;\n }\n\n if ('or' in where) {\n // Cypher three-valued OR:\n // - If any is true → true\n // - Else if any is null → null\n // - Else → false\n let hasNull = false;\n for (const whereClause of where.or) {\n const isMatch = evaluateWhere(node, whereClause);\n if (isMatch === true) {\n return true;\n }\n if (isMatch === null) {\n hasNull = true;\n }\n }\n return hasNull ? null : false;\n }\n\n if ('label' in where) {\n if ('labelsSorted' in node) {\n return where.label === null || node.labelsSorted.includes(where.label);\n }\n return false;\n }\n\n if ('reltype' in where) {\n if ('type' in node) {\n return where.reltype === null || (node as RelData).type === where.reltype;\n }\n return false;\n }\n\n if ('property' in where) {\n return where.property === null || where.property in node.properties;\n }\n\n return false;\n}\n\n/**\n * Returns whether a graph item is targeted by a single style rule.\n *\n * This evaluates both the rule's node label or relationship type selector and\n * its optional `where` clause. Disabled rules never match. Cypher-style\n * three-valued logic is reduced to a boolean: only `true` matches, while\n * `false` and `null` do not.\n *\n * Use {@link compileGraphStyleRules} to evaluate the final style produced by a\n * cascade of rules.\n */\nexport function doesGraphStyleRuleMatch(\n item: NodeData | RelData,\n rule: GraphStyleRule,\n): boolean {\n if (rule.isDisabled === true) {\n return false;\n }\n\n if ('label' in rule.match) {\n if (!('labelsSorted' in item)) {\n return false;\n }\n if (\n rule.match.label !== null &&\n !item.labelsSorted.includes(rule.match.label)\n ) {\n return false;\n }\n } else if ('reltype' in rule.match) {\n if (!('type' in item)) {\n return false;\n }\n if (rule.match.reltype !== null && item.type !== rule.match.reltype) {\n return false;\n }\n } else {\n return false;\n }\n\n return evaluateWhere(item, rule.where) === true;\n}\n\n/**\n * Resolves a color for the given property value, using the uniqueColors object\n * reference as the per-rule key in uniqueColorsCache. Assigns a new palette color\n * on first encounter (first-come, first-served). Returns null if the property is\n * missing or null.\n */\nfunction resolveUniqueColor(\n uniqueColors: UniqueColors,\n properties: Record<string, PortableProperty | undefined>,\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): string | null {\n const prop = properties[uniqueColors.onProperty];\n if (prop === undefined) {\n return null;\n }\n const rawValue = extractPropertyValue(prop);\n if (rawValue === null) {\n return null;\n }\n const valueKey = String(rawValue);\n\n let valueMap = uniqueColorsCache.get(uniqueColors);\n if (valueMap === undefined) {\n valueMap = new Map();\n uniqueColorsCache.set(uniqueColors, valueMap);\n }\n\n let assignedColor = valueMap.get(valueKey);\n if (assignedColor === undefined) {\n assignedColor =\n UNIQUE_COLORS_PALETTE[valueMap.size % UNIQUE_COLORS_PALETTE.length]!;\n valueMap.set(valueKey, assignedColor);\n }\n\n return assignedColor;\n}\n\nfunction shouldUseProperty(\n prop: { isDisabled?: boolean } | undefined,\n): boolean {\n return prop !== undefined && prop.isDisabled !== true;\n}\n\nfunction evaluateStaticStyle({\n overlayIcon,\n ...scalarStyle\n}: Omit<Style, NonStaticStyles>) {\n const result: Record<string, unknown> = {};\n\n for (const [key, prop] of Object.entries(scalarStyle)) {\n if (shouldUseProperty(prop)) {\n result[key] = prop.value;\n }\n }\n\n if (shouldUseProperty(overlayIcon)) {\n const { ...overlayIconProps } = overlayIcon!;\n result.overlayIcon = overlayIconProps;\n }\n\n return result;\n}\n\nfunction evaluateRelStyle(\n style: Style,\n rel: RelData,\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): EvaluatedNvlRelationshipStyle {\n const { captions, colorRange, widthRange, uniqueColors, ...staticStyle } =\n style;\n const result: EvaluatedNvlRelationshipStyle =\n evaluateStaticStyle(staticStyle);\n\n if (shouldUseProperty(captions) && captions!.text) {\n result.captions = captions!.text.map((caption) => {\n const { value, styles } = caption;\n\n if (typeof value === 'string' || value === undefined) {\n return { styles, value };\n }\n\n if ('useType' in value) {\n return { styles, value: rel.type };\n }\n\n if ('property' in value) {\n const prop = rel.properties[value.property];\n if (prop === undefined) {\n return { styles, value: '' };\n }\n\n const resolvedValue =\n prop.type === 'string'\n ? prop.stringified.slice(1, -1)\n : prop.stringified;\n\n return { styles, value: resolvedValue };\n }\n\n return { styles, value: rel.id };\n });\n\n if (captions?.align !== undefined) {\n result.captionAlign = captions.align;\n }\n if (captions?.size !== undefined) {\n result.captionSize = captions.size;\n }\n }\n\n if (shouldUseProperty(colorRange)) {\n const interpolated = getInterpolatedColor(colorRange!, rel);\n if (interpolated !== null) {\n result.color = interpolated;\n }\n }\n\n if (shouldUseProperty(widthRange)) {\n const { onProperty, minValue, maxValue, minWidth, maxWidth } = widthRange!;\n const interpolated = getInterpolatedSize(\n rel.properties[onProperty],\n minValue,\n maxValue,\n minWidth,\n maxWidth,\n );\n if (interpolated !== null) {\n result.width = interpolated;\n }\n }\n\n if (shouldUseProperty(uniqueColors)) {\n const color = resolveUniqueColor(\n uniqueColors!,\n rel.properties,\n uniqueColorsCache,\n );\n if (color !== null) {\n result.color = color;\n }\n }\n\n return result;\n}\n\n/**\n * Safely compare two values using Cypher's three-valued logic.\n * Returns `null` if either operand is null (matching Cypher semantics).\n *\n * From Neo4j Cypher Manual:\n * \"Comparing any value to `null` using `=` or `<>` results in `null`\"\n *\n * @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n */\nfunction safeCompare(\n left: Value,\n right: Value,\n graphItem: NodeData | RelData,\n compareFn: (\n a: NonNullable<ResolvedCypherValue>,\n b: NonNullable<ResolvedCypherValue>,\n ) => boolean,\n): Ternary {\n const leftVal = evaluateValue(left, graphItem);\n const rightVal = evaluateValue(right, graphItem);\n if (leftVal === null || rightVal === null) {\n return null;\n }\n return compareFn(leftVal, rightVal);\n}\n\n/**\n * String comparison using Cypher semantics.\n * Returns `null` if either operand is null OR not a string.\n *\n * From Neo4j Cypher Manual:\n * \"When these operators are applied to non-string values, they return `null`\n * instead of attempting type coercion.\"\n *\n * @see https://neo4j.com/docs/cypher-manual/current/expressions/predicates/string-operators/\n */\nfunction safeStringCompare(\n left: Value,\n right: Value,\n graphItem: NodeData | RelData,\n compareFn: (a: string, b: string) => boolean,\n): Ternary {\n const leftVal = evaluateValue(left, graphItem);\n const rightVal = evaluateValue(right, graphItem);\n // Return null if either is null or not a string (no type coercion)\n if (\n leftVal === null ||\n rightVal === null ||\n typeof leftVal !== 'string' ||\n typeof rightVal !== 'string'\n ) {\n return null;\n }\n return compareFn(leftVal, rightVal);\n}\n\nfunction evaluateValue(\n value: Value,\n graphItem: NodeData | RelData,\n): ResolvedCypherValue {\n if (typeof value === 'object' && value !== null) {\n if ('property' in value) {\n if (value.property === null) {\n return null;\n }\n const prop = graphItem.properties[value.property];\n if (prop === undefined) {\n return null;\n }\n return extractPropertyValue(prop);\n }\n if ('label' in value) {\n if ('labelsSorted' in graphItem) {\n return (\n value.label === null || graphItem.labelsSorted.includes(value.label)\n );\n }\n return false;\n }\n if ('reltype' in value) {\n if ('type' in graphItem) {\n return (\n value.reltype === null ||\n (graphItem as RelData).type === value.reltype\n );\n }\n return false;\n }\n if ('datetime' in value) {\n return parseDateString(value.datetime);\n }\n if ('localdatetime' in value) {\n return parseLocalDateString(value.localdatetime);\n }\n if ('time' in value) {\n return parseTimeString(value.time);\n }\n if (isBigintLiteral(value)) {\n return resolveNumericLiteral(value);\n }\n }\n\n return value as ResolvedCypherValue;\n}\n\n// Default caption selection logic\nconst captionPriorityOrder = [\n /^name$/i,\n /^title$/i,\n /^label$/i,\n /name$/i,\n /description$/i,\n /^.+/,\n];\n\nfunction getDefaultNodeCaption(node: NodeData): Caption {\n const propertyKeys = Object.keys(node.properties);\n\n for (const regex of captionPriorityOrder) {\n const matchingKey = propertyKeys.find((key) => regex.test(key));\n if (matchingKey !== undefined) {\n const prop = node.properties[matchingKey];\n if (prop !== undefined) {\n return { value: { property: matchingKey } };\n }\n }\n }\n\n if (node.labelsSorted[0] !== undefined) {\n return { value: { useType: true } };\n }\n\n return { value: node.id };\n}\n\nfunction evaluateNodeStyle(\n style: Style,\n node: NodeData,\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): EvaluatedNvlNodeStyle {\n const { captions, colorRange, sizeRange, uniqueColors, ...staticStyle } =\n style;\n const result: EvaluatedNvlNodeStyle = evaluateStaticStyle(staticStyle);\n\n const captionSource =\n shouldUseProperty(captions) && captions!.text\n ? captions!.text\n : [getDefaultNodeCaption(node)];\n\n result.captions = captionSource.map((caption) => {\n const { value, styles } = caption;\n\n if (typeof value === 'string' || value === undefined) {\n return { styles, value };\n }\n\n if ('useType' in value) {\n return { styles, value: node.labelsSorted[0] };\n }\n\n if ('property' in value) {\n const prop = node.properties[value.property];\n if (prop === undefined) {\n return { styles, value: '' };\n }\n\n const resolvedValue =\n prop.type === 'string'\n ? prop.stringified.slice(1, -1)\n : prop.stringified;\n\n return { styles, value: resolvedValue };\n }\n\n return { styles, value: node.labelsSorted[0] };\n });\n\n if (shouldUseProperty(captions)) {\n if (captions?.align !== undefined) {\n result.captionAlign = captions.align;\n }\n if (captions?.size !== undefined) {\n result.captionSize = captions.size;\n }\n }\n\n if (shouldUseProperty(colorRange)) {\n const interpolated = getInterpolatedColor(colorRange!, node);\n if (interpolated !== null) {\n result.color = interpolated;\n }\n }\n\n if (shouldUseProperty(sizeRange)) {\n const { onProperty, minValue, maxValue, minSize, maxSize } = sizeRange!;\n const interpolated = getInterpolatedSize(\n node.properties[onProperty],\n minValue,\n maxValue,\n minSize,\n maxSize,\n );\n if (interpolated !== null) {\n result.size = interpolated;\n }\n }\n\n if (shouldUseProperty(uniqueColors)) {\n const color = resolveUniqueColor(\n uniqueColors!,\n node.properties,\n uniqueColorsCache,\n );\n if (color !== null) {\n result.color = color;\n }\n }\n\n return result;\n}\n\nfunction createRelStyleFunction(\n rules: GraphStyleRule[],\n): (rel: RelData) => EvaluatedNvlRelationshipStyle {\n const uniqueColorsCache = new Map<UniqueColors, Map<string, string>>();\n return (rel: RelData) => {\n const style: Style = {};\n\n for (const rule of rules) {\n if (doesGraphStyleRuleMatch(rel, rule)) {\n // Merge the style properties (later rules override earlier ones)\n Object.assign(style, rule.apply);\n }\n }\n\n return evaluateRelStyle(style, rel, uniqueColorsCache);\n };\n}\n\nexport type CompiledGraphStyleRules = {\n byType: (type: string) => (rel: RelData) => EvaluatedNvlRelationshipStyle;\n styleMatchers: StyleMatchers;\n byLabelSet: (node: NodeData) => EvaluatedNvlNodeStyle;\n};\n\nfunction createByLabelSetFunction(\n styleMatchers: StyleMatchers,\n): (node: NodeData) => EvaluatedNvlNodeStyle {\n const defaultColorCache = new Map<string, string>();\n const sortedRulesCache = new Map<string, GraphStyleRule[]>();\n const mergedStyleCache = new Map<string, Style>();\n const uniqueColorsCache = new Map<UniqueColors, Map<string, string>>();\n\n return (node: NodeData) => {\n const labelSetKey = node.labelsSorted.join('\\0');\n\n // Fast path: if all rules for this label set are where-free and none use\n // uniqueColors, the merged style is identical for every node with the same labels.\n const cachedStyle = mergedStyleCache.get(labelSetKey);\n if (cachedStyle !== undefined) {\n return evaluateNodeStyle(cachedStyle, node, uniqueColorsCache);\n }\n\n // Memoize default color by first label\n const labelForDefaultColor = node.labelsSorted[0] ?? null;\n let defaultColor: string;\n if (labelForDefaultColor === null) {\n defaultColor = NO_LABEL_FALLBACK_COLOR;\n } else {\n let cached = defaultColorCache.get(labelForDefaultColor);\n if (cached === undefined) {\n cached =\n calculateDefaultNodeColors(labelForDefaultColor).backgroundColor;\n defaultColorCache.set(labelForDefaultColor, cached);\n }\n defaultColor = cached;\n }\n\n // Cache sorted rules by label set (avoids repeated allocation + sort)\n let sortedRules = sortedRulesCache.get(labelSetKey);\n if (sortedRules === undefined) {\n const matchingRules: GraphStyleRule[] = [\n ...styleMatchers.globalLabelRules,\n ];\n for (const label of node.labelsSorted) {\n const labelRules = styleMatchers.rulesByLabel.get(label);\n if (labelRules) {\n matchingRules.push(...labelRules);\n }\n }\n sortedRules = matchingRules.toSorted(compareByPriorityAscending);\n sortedRulesCache.set(labelSetKey, sortedRules);\n }\n\n // Evaluate rules, tracking whether all are where-free and uniqueColors-free.\n const collectStyles: Style = { color: { value: defaultColor } };\n let isCacheable = true;\n for (const rule of sortedRules) {\n if (rule.where !== undefined || rule.apply.uniqueColors !== undefined) {\n isCacheable = false;\n }\n if (doesGraphStyleRuleMatch(node, rule)) {\n Object.assign(collectStyles, rule.apply);\n }\n }\n\n // When all rules are where-free and uniqueColors-free, the merged style\n // depends only on labels. Cache it so subsequent nodes with the same label\n // set skip rule iteration.\n if (isCacheable) {\n mergedStyleCache.set(labelSetKey, collectStyles);\n }\n\n return evaluateNodeStyle(collectStyles, node, uniqueColorsCache);\n };\n}\n\nconst DEFAULT_REL_STYLE: GraphStyleRule = {\n apply: {\n captions: { text: [{ value: { useType: true } }] },\n color: { value: DEFAULT_REL_COLOR },\n },\n match: { reltype: null },\n};\n\nexport function compileGraphStyleRules(\n styleRules: GraphStyleRule[] | null | undefined,\n): CompiledGraphStyleRules {\n const styleMatchers = collectStyleMatchers(styleRules);\n\n // Lazily build and cache a style function per relationship type\n const cache = new Map<\n string,\n (rel: RelData) => EvaluatedNvlRelationshipStyle\n >();\n const byType = (type: string) => {\n let fn = cache.get(type);\n if (fn === undefined) {\n const rules = styleMatchers.rulesByType.get(type) ?? [];\n // Sort global and type-specific rules together by priority, mirroring\n // the node path. The default style carries no priority and always\n // applies first.\n fn = createRelStyleFunction([\n DEFAULT_REL_STYLE,\n ...[...styleMatchers.globalReltypeRules, ...rules].toSorted(\n compareByPriorityAscending,\n ),\n ]);\n cache.set(type, fn);\n }\n return fn;\n };\n\n const byLabelSet = createByLabelSetFunction(styleMatchers);\n\n return { byLabelSet, byType, styleMatchers };\n}\n"]}
1
+ {"version":3,"file":"compile-graph-styles.js","sourceRoot":"","sources":["../../../src/styling/compile-graph-styles.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { calculateDefaultNodeColors } from '@neo4j-devtools/word-color';\nimport { tokens } from '@neo4j-ndl/base';\nimport { color, type RgbColor, rgbToHex, validHex } from '@uiw/react-color';\n\nimport {\n clampNumericValue,\n compareNumericValues,\n getNumericWeight,\n isBigintLiteral,\n lerpColor,\n numericValuesEqual,\n parseDateString,\n parseLocalDateString,\n parseTimeString,\n type RangeLiteral,\n resolveNumericLiteral,\n resolveRangeLiteral,\n} from '../_generated/style-rules';\nimport {\n type NodeData,\n type PortableProperty,\n type RelData,\n} from '../graph-visualization-context';\nimport {\n type Caption,\n type ColorRange,\n type EvaluatedNvlNodeStyle,\n type EvaluatedNvlRelationshipStyle,\n type GraphStyleRule,\n type NonStaticStyles,\n type Style,\n type UniqueColors,\n type Value,\n type Where,\n} from './style-types';\n\nexport const DEFAULT_REL_COLOR = tokens.palette.neutral['40'];\nconst NO_LABEL_FALLBACK_COLOR = tokens.palette.neutral['40'];\n\n// Positions 12-33 of Bloom's legacy unique-values palette, ported so that\n// assignment order matches Bloom. Positions 1-11 come from tokens.graph, whose\n// first 11 values are the same hues. tokens.graph['12'] (#579380) is left out\n// because Bloom has no color at that position and including it would shift\n// every later assignment out of alignment.\nconst BLOOM_PALETTE_TAIL = [\n '#ffffa3',\n '#edb2e3',\n '#ffb987',\n '#7febff',\n '#ff8987',\n '#fdebd1',\n '#aff0b5',\n '#ffd8ec',\n '#73affe',\n '#ffe776',\n '#ff93b6',\n '#ffffc6',\n '#ffd5ff',\n '#ffdda9',\n '#a5ffff',\n '#ffaca8',\n '#fffff4',\n '#d3ffd8',\n '#fffcff',\n '#99d2ff',\n '#ffff98',\n '#ffb6d8',\n];\n\nconst GRAPH_TOKENS_IN_BLOOM_PALETTE = 11;\n\nexport const UNIQUE_COLORS_PALETTE = [\n ...Object.values(tokens.graph)\n .filter(validHex)\n .slice(0, GRAPH_TOKENS_IN_BLOOM_PALETTE),\n ...BLOOM_PALETTE_TAIL,\n];\n\ntype StyleMatchers = {\n globalLabelRules: GraphStyleRule[];\n globalReltypeRules: GraphStyleRule[];\n rulesByLabel: Map<string, GraphStyleRule[]>;\n rulesByType: Map<string, GraphStyleRule[]>;\n};\n\nfunction compareByPriorityAscending(\n firstRule: GraphStyleRule,\n secondRule: GraphStyleRule,\n): number {\n return firstRule.priority! - secondRule.priority!;\n}\n\nfunction collectStyleMatchers(\n styles: GraphStyleRule[] | null | undefined,\n): StyleMatchers {\n const rulesByLabel = new Map<string, GraphStyleRule[]>();\n const rulesByType = new Map<string, GraphStyleRule[]>();\n const globalLabelRules: GraphStyleRule[] = [];\n const globalReltypeRules: GraphStyleRule[] = [];\n\n // Handle null/undefined styles gracefully\n if (!styles || styles.length === 0) {\n return {\n globalLabelRules,\n globalReltypeRules,\n rulesByLabel,\n rulesByType,\n };\n }\n\n const totalRules = styles.length;\n\n styles.forEach((style, index) => {\n if (style.isDisabled ?? false) {\n return;\n }\n\n if (style.priority !== undefined && style.priority < 0) {\n throw new Error(\n `GraphStyleRule priority must be >= 0, got ${style.priority}. Negative values are reserved for internal use.`,\n );\n }\n\n // Fill in priority if not set (negative values preserve original order)\n const { priority, ...rest } = style;\n const ruleWithPriority: GraphStyleRule = {\n ...rest,\n priority: priority ?? index - totalRules,\n };\n\n // style for nodes\n if ('label' in style.match) {\n // if the label is null, it's a global rule (matches any node)\n if (style.match.label === null) {\n globalLabelRules.push(ruleWithPriority);\n } else {\n // Specific label rule\n const existing = rulesByLabel.get(style.match.label) ?? [];\n rulesByLabel.set(style.match.label, [...existing, ruleWithPriority]);\n }\n }\n\n // style for relationships\n if ('reltype' in style.match) {\n if (style.match.reltype === null) {\n // Global reltype rule (matches any relationship)\n globalReltypeRules.push(ruleWithPriority);\n } else {\n // Specific reltype rule\n const existing = rulesByType.get(style.match.reltype) ?? [];\n rulesByType.set(style.match.reltype, [...existing, ruleWithPriority]);\n }\n }\n });\n\n return {\n globalLabelRules,\n globalReltypeRules,\n rulesByLabel,\n rulesByType,\n };\n}\n\n/**\n * Interpolates a color from a ColorRange based on a graph item's property value.\n * Returns a #rrggbb hex string, or null if the colorRange config is invalid\n * (bad hex colors, invalid value range, missing/non-numeric property).\n */\nfunction getInterpolatedColor(\n colorRange: ColorRange,\n graphItem: NodeData | RelData,\n): string | null {\n const {\n onProperty,\n minValue,\n minColor,\n maxValue,\n maxColor,\n midValue,\n midColor,\n } = colorRange;\n\n if (!validHex(minColor) || !validHex(maxColor)) {\n return null;\n }\n const minRgb = color(minColor).rgb;\n const maxRgb = color(maxColor).rgb;\n const resolvedMinValue = resolveRangeLiteral(minValue);\n const resolvedMaxValue = resolveRangeLiteral(maxValue);\n if (resolvedMinValue === null || resolvedMaxValue === null) {\n return null;\n }\n const boundsOrder = compareNumericValues(resolvedMinValue, resolvedMaxValue);\n if (boundsOrder === null) {\n return null;\n }\n const actualMinValue = boundsOrder <= 0 ? resolvedMinValue : resolvedMaxValue;\n const actualMaxValue = boundsOrder <= 0 ? resolvedMaxValue : resolvedMinValue;\n\n // Validate mid stop if provided\n let midRgb: RgbColor | undefined = undefined;\n const resolvedMidValue =\n midValue === undefined ? undefined : resolveRangeLiteral(midValue);\n if (resolvedMidValue === null) {\n return null;\n }\n if (midValue !== undefined && midColor !== undefined) {\n const minToMid = compareNumericValues(actualMinValue, resolvedMidValue!);\n const midToMax = compareNumericValues(resolvedMidValue!, actualMaxValue);\n const isMidInRange =\n minToMid !== null && midToMax !== null && minToMid <= 0 && midToMax <= 0;\n if (!isMidInRange || !validHex(midColor)) {\n return null;\n }\n midRgb = color(midColor).rgb;\n }\n\n const prop = graphItem.properties[onProperty];\n if (prop === undefined) {\n return null;\n }\n const rawValue = extractPropertyValue(prop);\n if (typeof rawValue !== 'number' && typeof rawValue !== 'bigint') {\n return null;\n }\n\n const clampedValue = clampNumericValue(\n rawValue,\n actualMinValue,\n actualMaxValue,\n );\n if (clampedValue === null) {\n return null;\n }\n\n let rgb: RgbColor;\n\n if (midRgb !== undefined && resolvedMidValue !== undefined) {\n const weight = getNumericWeight(\n resolvedMinValue,\n resolvedMidValue,\n clampedValue,\n );\n if (weight === null) {\n return null;\n }\n const isBetweenMinAndMid = weight <= 1;\n if (isBetweenMinAndMid) {\n rgb = lerpColor(minRgb, midRgb, weight);\n } else {\n const secondWeight = getNumericWeight(\n resolvedMidValue,\n resolvedMaxValue,\n clampedValue,\n );\n if (secondWeight === null) {\n return null;\n }\n rgb = lerpColor(midRgb, maxRgb, secondWeight);\n }\n } else {\n const weight = getNumericWeight(\n resolvedMinValue,\n resolvedMaxValue,\n clampedValue,\n );\n if (weight === null) {\n return null;\n }\n rgb = lerpColor(minRgb, maxRgb, weight);\n }\n\n return rgbToHex(rgb);\n}\n\n/**\n * Interpolates a numeric size/width from a range based on a graph item's property value.\n * Returns the interpolated number, or null if the property is missing or non-numeric.\n */\nfunction getInterpolatedSize(\n prop: PortableProperty | undefined,\n minValue: RangeLiteral,\n maxValue: RangeLiteral,\n minOut: number,\n maxOut: number,\n): number | null {\n if (prop === undefined) {\n return null;\n }\n const rawValue = extractPropertyValue(prop);\n if (typeof rawValue !== 'number' && typeof rawValue !== 'bigint') {\n return null;\n }\n\n const resolvedMinValue = resolveRangeLiteral(minValue);\n const resolvedMaxValue = resolveRangeLiteral(maxValue);\n if (resolvedMinValue === null || resolvedMaxValue === null) {\n return null;\n }\n const clampedValue = clampNumericValue(\n rawValue,\n resolvedMinValue,\n resolvedMaxValue,\n );\n if (clampedValue === null) {\n return null;\n }\n const weight = getNumericWeight(\n resolvedMinValue,\n resolvedMaxValue,\n clampedValue,\n );\n if (weight === null) {\n return null;\n }\n return minOut * (1 - weight) + maxOut * weight;\n}\n\nfunction extractPropertyValue(\n prop: PortableProperty,\n): string | number | bigint | boolean | null {\n switch (prop.type) {\n case 'string':\n return JSON.parse(prop.stringified);\n case 'number':\n case 'integer':\n case 'Integer':\n case 'float':\n return Number(prop.stringified);\n case 'bigint':\n case 'BigInt': {\n try {\n const value = prop.stringified.startsWith('\"')\n ? (JSON.parse(prop.stringified) as string)\n : prop.stringified;\n return BigInt(value);\n } catch {\n return null;\n }\n }\n case 'boolean':\n case 'Boolean':\n return prop.stringified === 'true';\n case 'null':\n return null;\n // Neo4j temporal types — parse to a number for comparison with\n // { datetime } and { time } rule literals. An unparseable value resolves to\n // null (treated as missing) rather than leaking a raw string into numeric\n // comparisons, matching Cypher null semantics.\n //\n // DateTime / Date → Unix milliseconds (epoch ms), UTC-based.\n case 'DateTime':\n case 'Date': {\n const dateString = JSON.parse(prop.stringified) as string;\n return parseDateString(dateString);\n }\n // LocalDateTime → Unix milliseconds in the browser's local timezone,\n // matching { localdatetime } rule literals. Zoned strings are rejected\n // (resolve to null), as LocalDateTime has no associated timezone.\n case 'LocalDateTime': {\n const dateString = JSON.parse(prop.stringified) as string;\n return parseLocalDateString(dateString);\n }\n // Time (ZonedTime) / LocalTime → UTC-normalised ms since midnight\n // LocalTime has no offset; treated as UTC.\n case 'Time':\n case 'LocalTime': {\n const timeString = JSON.parse(prop.stringified) as string;\n return parseTimeString(timeString);\n }\n default:\n return prop.stringified;\n }\n}\n\n/**\n * Three-valued logic type matching Cypher/SQL semantics.\n * - `true`: condition is satisfied\n * - `false`: condition is not satisfied\n * - `null`: condition is unknown (e.g., comparing with null/missing property)\n *\n * @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n */\ntype Ternary = boolean | null;\ntype ResolvedCypherValue = string | number | bigint | boolean | null;\n\n/**\n * Evaluates a WHERE clause using three-valued logic matching Cypher semantics.\n *\n * From Neo4j Cypher Manual:\n * - Comparing any value to `null` results in `null`, not `true` or `false`\n * - Accessing a non-existent property returns `null`\n * - In WHERE clauses, only `true` passes; both `false` and `null` exclude the row\n *\n * Three-valued logic rules:\n * - NOT null → null\n * - true AND null → null, false AND null → false\n * - true OR null → true, false OR null → null\n *\n * @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n */\nfunction evaluateWhere(node: NodeData | RelData, where?: Where): Ternary {\n if (!where) {\n return true;\n }\n\n if ('equal' in where) {\n const [left, right] = where.equal;\n const leftVal = evaluateValue(left, node);\n const rightVal = evaluateValue(right, node);\n // In Cypher, null = null → null (not true)\n if (leftVal === null || rightVal === null) {\n return null;\n }\n if (\n (typeof leftVal === 'number' || typeof leftVal === 'bigint') &&\n (typeof rightVal === 'number' || typeof rightVal === 'bigint')\n ) {\n return numericValuesEqual(leftVal, rightVal);\n }\n return leftVal === rightVal;\n }\n\n if ('not' in where) {\n // Cypher: NOT null → null\n const isMatch = evaluateWhere(node, where.not);\n return isMatch === null ? null : !isMatch;\n }\n\n if ('lessThan' in where) {\n const [left, right] = where.lessThan;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue < rightValue,\n );\n }\n\n if ('lessThanOrEqual' in where) {\n const [left, right] = where.lessThanOrEqual;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue <= rightValue,\n );\n }\n\n if ('greaterThan' in where) {\n const [left, right] = where.greaterThan;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue > rightValue,\n );\n }\n\n if ('greaterThanOrEqual' in where) {\n const [left, right] = where.greaterThanOrEqual;\n return safeCompare(\n left,\n right,\n node,\n (leftValue, rightValue) => leftValue >= rightValue,\n );\n }\n\n if ('contains' in where) {\n const [left, right] = where.contains;\n return safeStringCompare(left, right, node, (leftValue, rightValue) =>\n leftValue.includes(rightValue),\n );\n }\n\n if ('startsWith' in where) {\n const [left, right] = where.startsWith;\n return safeStringCompare(left, right, node, (leftValue, rightValue) =>\n leftValue.startsWith(rightValue),\n );\n }\n\n if ('endsWith' in where) {\n const [left, right] = where.endsWith;\n return safeStringCompare(left, right, node, (leftValue, rightValue) =>\n leftValue.endsWith(rightValue),\n );\n }\n\n if ('isNull' in where) {\n // IS NULL returns true/false (never null)\n const value = evaluateValue(where.isNull, node);\n return value === null;\n }\n\n if ('and' in where) {\n // Cypher three-valued AND:\n // - If any is false → false\n // - Else if any is null → null\n // - Else → true\n let hasNull = false;\n for (const whereClause of where.and) {\n const isMatch = evaluateWhere(node, whereClause);\n if (isMatch === false) {\n return false;\n }\n if (isMatch === null) {\n hasNull = true;\n }\n }\n return hasNull ? null : true;\n }\n\n if ('or' in where) {\n // Cypher three-valued OR:\n // - If any is true → true\n // - Else if any is null → null\n // - Else → false\n let hasNull = false;\n for (const whereClause of where.or) {\n const isMatch = evaluateWhere(node, whereClause);\n if (isMatch === true) {\n return true;\n }\n if (isMatch === null) {\n hasNull = true;\n }\n }\n return hasNull ? null : false;\n }\n\n if ('label' in where) {\n if ('labelsSorted' in node) {\n return where.label === null || node.labelsSorted.includes(where.label);\n }\n return false;\n }\n\n if ('reltype' in where) {\n if ('type' in node) {\n return where.reltype === null || (node as RelData).type === where.reltype;\n }\n return false;\n }\n\n if ('property' in where) {\n return where.property === null || where.property in node.properties;\n }\n\n return false;\n}\n\n/**\n * Returns whether a graph item is targeted by a single style rule.\n *\n * This evaluates both the rule's node label or relationship type selector and\n * its optional `where` clause. Disabled rules never match. Cypher-style\n * three-valued logic is reduced to a boolean: only `true` matches, while\n * `false` and `null` do not.\n *\n * Use {@link compileGraphStyleRules} to evaluate the final style produced by a\n * cascade of rules.\n */\nexport function doesGraphStyleRuleMatch(\n item: NodeData | RelData,\n rule: GraphStyleRule,\n): boolean {\n if (rule.isDisabled === true) {\n return false;\n }\n\n if ('label' in rule.match) {\n if (!('labelsSorted' in item)) {\n return false;\n }\n if (\n rule.match.label !== null &&\n !item.labelsSorted.includes(rule.match.label)\n ) {\n return false;\n }\n } else if ('reltype' in rule.match) {\n if (!('type' in item)) {\n return false;\n }\n if (rule.match.reltype !== null && item.type !== rule.match.reltype) {\n return false;\n }\n } else {\n return false;\n }\n\n return evaluateWhere(item, rule.where) === true;\n}\n\n/**\n * Resolves a color for the given property value, using the uniqueColors object\n * reference as the per-rule key in uniqueColorsCache. Assigns a new palette color\n * on first encounter (first-come, first-served). Returns null if the property is\n * missing or null.\n */\nfunction resolveUniqueColor(\n uniqueColors: UniqueColors,\n properties: Record<string, PortableProperty | undefined>,\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): string | null {\n const prop = properties[uniqueColors.onProperty];\n if (prop === undefined) {\n return null;\n }\n const rawValue = extractPropertyValue(prop);\n if (rawValue === null) {\n return null;\n }\n const valueKey = String(rawValue);\n\n let valueMap = uniqueColorsCache.get(uniqueColors);\n if (valueMap === undefined) {\n valueMap = new Map();\n uniqueColorsCache.set(uniqueColors, valueMap);\n }\n\n let assignedColor = valueMap.get(valueKey);\n if (assignedColor === undefined) {\n assignedColor =\n UNIQUE_COLORS_PALETTE[valueMap.size % UNIQUE_COLORS_PALETTE.length]!;\n valueMap.set(valueKey, assignedColor);\n }\n\n return assignedColor;\n}\n\nfunction shouldUseProperty(\n prop: { isDisabled?: boolean } | undefined,\n): boolean {\n return prop !== undefined && prop.isDisabled !== true;\n}\n\nfunction evaluateStaticStyle({\n overlayIcon,\n ...scalarStyle\n}: Omit<Style, NonStaticStyles>) {\n const result: Record<string, unknown> = {};\n\n for (const [key, prop] of Object.entries(scalarStyle)) {\n if (shouldUseProperty(prop)) {\n result[key] = prop.value;\n }\n }\n\n if (shouldUseProperty(overlayIcon)) {\n const { ...overlayIconProps } = overlayIcon!;\n result.overlayIcon = overlayIconProps;\n }\n\n return result;\n}\n\nfunction evaluateRelStyle(\n style: Style,\n rel: RelData,\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): EvaluatedNvlRelationshipStyle {\n const { captions, colorRange, widthRange, uniqueColors, ...staticStyle } =\n style;\n const result: EvaluatedNvlRelationshipStyle =\n evaluateStaticStyle(staticStyle);\n\n if (shouldUseProperty(captions) && captions!.text) {\n result.captions = captions!.text.map((caption) => {\n const { value, styles } = caption;\n\n if (typeof value === 'string' || value === undefined) {\n return { styles, value };\n }\n\n if ('useType' in value) {\n return { styles, value: rel.type };\n }\n\n if ('property' in value) {\n const prop = rel.properties[value.property];\n if (prop === undefined) {\n return { styles, value: '' };\n }\n\n const resolvedValue =\n prop.type === 'string'\n ? prop.stringified.slice(1, -1)\n : prop.stringified;\n\n return { styles, value: resolvedValue };\n }\n\n return { styles, value: rel.id };\n });\n\n if (captions?.align !== undefined) {\n result.captionAlign = captions.align;\n }\n if (captions?.size !== undefined) {\n result.captionSize = captions.size;\n }\n }\n\n if (shouldUseProperty(colorRange)) {\n const interpolated = getInterpolatedColor(colorRange!, rel);\n if (interpolated !== null) {\n result.color = interpolated;\n }\n }\n\n if (shouldUseProperty(widthRange)) {\n const { onProperty, minValue, maxValue, minWidth, maxWidth } = widthRange!;\n const interpolated = getInterpolatedSize(\n rel.properties[onProperty],\n minValue,\n maxValue,\n minWidth,\n maxWidth,\n );\n if (interpolated !== null) {\n result.width = interpolated;\n }\n }\n\n if (shouldUseProperty(uniqueColors)) {\n const color = resolveUniqueColor(\n uniqueColors!,\n rel.properties,\n uniqueColorsCache,\n );\n if (color !== null) {\n result.color = color;\n }\n }\n\n return result;\n}\n\n/**\n * Safely compare two values using Cypher's three-valued logic.\n * Returns `null` if either operand is null (matching Cypher semantics).\n *\n * From Neo4j Cypher Manual:\n * \"Comparing any value to `null` using `=` or `<>` results in `null`\"\n *\n * @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n */\nfunction safeCompare(\n left: Value,\n right: Value,\n graphItem: NodeData | RelData,\n compareFn: (\n a: NonNullable<ResolvedCypherValue>,\n b: NonNullable<ResolvedCypherValue>,\n ) => boolean,\n): Ternary {\n const leftVal = evaluateValue(left, graphItem);\n const rightVal = evaluateValue(right, graphItem);\n if (leftVal === null || rightVal === null) {\n return null;\n }\n return compareFn(leftVal, rightVal);\n}\n\n/**\n * String comparison using Cypher semantics.\n * Returns `null` if either operand is null OR not a string.\n *\n * From Neo4j Cypher Manual:\n * \"When these operators are applied to non-string values, they return `null`\n * instead of attempting type coercion.\"\n *\n * @see https://neo4j.com/docs/cypher-manual/current/expressions/predicates/string-operators/\n */\nfunction safeStringCompare(\n left: Value,\n right: Value,\n graphItem: NodeData | RelData,\n compareFn: (a: string, b: string) => boolean,\n): Ternary {\n const leftVal = evaluateValue(left, graphItem);\n const rightVal = evaluateValue(right, graphItem);\n // Return null if either is null or not a string (no type coercion)\n if (\n leftVal === null ||\n rightVal === null ||\n typeof leftVal !== 'string' ||\n typeof rightVal !== 'string'\n ) {\n return null;\n }\n return compareFn(leftVal, rightVal);\n}\n\nfunction evaluateValue(\n value: Value,\n graphItem: NodeData | RelData,\n): ResolvedCypherValue {\n if (typeof value === 'object' && value !== null) {\n if ('property' in value) {\n if (value.property === null) {\n return null;\n }\n const prop = graphItem.properties[value.property];\n if (prop === undefined) {\n return null;\n }\n return extractPropertyValue(prop);\n }\n if ('label' in value) {\n if ('labelsSorted' in graphItem) {\n return (\n value.label === null || graphItem.labelsSorted.includes(value.label)\n );\n }\n return false;\n }\n if ('reltype' in value) {\n if ('type' in graphItem) {\n return (\n value.reltype === null ||\n (graphItem as RelData).type === value.reltype\n );\n }\n return false;\n }\n if ('datetime' in value) {\n return parseDateString(value.datetime);\n }\n if ('localdatetime' in value) {\n return parseLocalDateString(value.localdatetime);\n }\n if ('time' in value) {\n return parseTimeString(value.time);\n }\n if (isBigintLiteral(value)) {\n return resolveNumericLiteral(value);\n }\n }\n\n return value as ResolvedCypherValue;\n}\n\n// Default caption selection logic\nconst captionPriorityOrder = [\n /^name$/i,\n /^title$/i,\n /^label$/i,\n /name$/i,\n /description$/i,\n /^.+/,\n];\n\nfunction getDefaultNodeCaption(node: NodeData): Caption {\n const propertyKeys = Object.keys(node.properties);\n\n for (const regex of captionPriorityOrder) {\n const matchingKey = propertyKeys.find((key) => regex.test(key));\n if (matchingKey !== undefined) {\n const prop = node.properties[matchingKey];\n if (prop !== undefined) {\n return { value: { property: matchingKey } };\n }\n }\n }\n\n if (node.labelsSorted[0] !== undefined) {\n return { value: { useType: true } };\n }\n\n return { value: node.id };\n}\n\nfunction evaluateNodeStyle(\n style: Style,\n node: NodeData,\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): EvaluatedNvlNodeStyle {\n const { captions, colorRange, sizeRange, uniqueColors, ...staticStyle } =\n style;\n const result: EvaluatedNvlNodeStyle = evaluateStaticStyle(staticStyle);\n\n const captionSource =\n shouldUseProperty(captions) && captions!.text\n ? captions!.text\n : [getDefaultNodeCaption(node)];\n\n result.captions = captionSource.map((caption) => {\n const { value, styles } = caption;\n\n if (typeof value === 'string' || value === undefined) {\n return { styles, value };\n }\n\n if ('useType' in value) {\n return { styles, value: node.labelsSorted[0] };\n }\n\n if ('property' in value) {\n const prop = node.properties[value.property];\n if (prop === undefined) {\n return { styles, value: '' };\n }\n\n const resolvedValue =\n prop.type === 'string'\n ? prop.stringified.slice(1, -1)\n : prop.stringified;\n\n return { styles, value: resolvedValue };\n }\n\n return { styles, value: node.labelsSorted[0] };\n });\n\n if (shouldUseProperty(captions)) {\n if (captions?.align !== undefined) {\n result.captionAlign = captions.align;\n }\n if (captions?.size !== undefined) {\n result.captionSize = captions.size;\n }\n }\n\n if (shouldUseProperty(colorRange)) {\n const interpolated = getInterpolatedColor(colorRange!, node);\n if (interpolated !== null) {\n result.color = interpolated;\n }\n }\n\n if (shouldUseProperty(sizeRange)) {\n const { onProperty, minValue, maxValue, minSize, maxSize } = sizeRange!;\n const interpolated = getInterpolatedSize(\n node.properties[onProperty],\n minValue,\n maxValue,\n minSize,\n maxSize,\n );\n if (interpolated !== null) {\n result.size = interpolated;\n }\n }\n\n if (shouldUseProperty(uniqueColors)) {\n const color = resolveUniqueColor(\n uniqueColors!,\n node.properties,\n uniqueColorsCache,\n );\n if (color !== null) {\n result.color = color;\n }\n }\n\n return result;\n}\n\nfunction createRelStyleFunction(\n rules: GraphStyleRule[],\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): (rel: RelData) => EvaluatedNvlRelationshipStyle {\n return (rel: RelData) => {\n const style: Style = {};\n\n for (const rule of rules) {\n if (doesGraphStyleRuleMatch(rel, rule)) {\n // Merge the style properties (later rules override earlier ones)\n Object.assign(style, rule.apply);\n }\n }\n\n return evaluateRelStyle(style, rel, uniqueColorsCache);\n };\n}\n\nexport type CompiledGraphStyleRules = {\n byType: (type: string) => (rel: RelData) => EvaluatedNvlRelationshipStyle;\n styleMatchers: StyleMatchers;\n byLabelSet: (node: NodeData) => EvaluatedNvlNodeStyle;\n};\n\nfunction createByLabelSetFunction(\n styleMatchers: StyleMatchers,\n uniqueColorsCache: Map<UniqueColors, Map<string, string>>,\n): (node: NodeData) => EvaluatedNvlNodeStyle {\n const defaultColorCache = new Map<string, string>();\n const sortedRulesCache = new Map<string, GraphStyleRule[]>();\n const mergedStyleCache = new Map<string, Style>();\n\n return (node: NodeData) => {\n const labelSetKey = node.labelsSorted.join('\\0');\n\n // Fast path: if all rules for this label set are where-free and none use\n // uniqueColors, the merged style is identical for every node with the same labels.\n const cachedStyle = mergedStyleCache.get(labelSetKey);\n if (cachedStyle !== undefined) {\n return evaluateNodeStyle(cachedStyle, node, uniqueColorsCache);\n }\n\n // Memoize default color by first label\n const labelForDefaultColor = node.labelsSorted[0] ?? null;\n let defaultColor: string;\n if (labelForDefaultColor === null) {\n defaultColor = NO_LABEL_FALLBACK_COLOR;\n } else {\n let cached = defaultColorCache.get(labelForDefaultColor);\n if (cached === undefined) {\n cached =\n calculateDefaultNodeColors(labelForDefaultColor).backgroundColor;\n defaultColorCache.set(labelForDefaultColor, cached);\n }\n defaultColor = cached;\n }\n\n // Cache sorted rules by label set (avoids repeated allocation + sort)\n let sortedRules = sortedRulesCache.get(labelSetKey);\n if (sortedRules === undefined) {\n const matchingRules: GraphStyleRule[] = [\n ...styleMatchers.globalLabelRules,\n ];\n for (const label of node.labelsSorted) {\n const labelRules = styleMatchers.rulesByLabel.get(label);\n if (labelRules) {\n matchingRules.push(...labelRules);\n }\n }\n sortedRules = matchingRules.toSorted(compareByPriorityAscending);\n sortedRulesCache.set(labelSetKey, sortedRules);\n }\n\n // Evaluate rules, tracking whether all are where-free and uniqueColors-free.\n const collectStyles: Style = { color: { value: defaultColor } };\n let isCacheable = true;\n for (const rule of sortedRules) {\n if (rule.where !== undefined || rule.apply.uniqueColors !== undefined) {\n isCacheable = false;\n }\n if (doesGraphStyleRuleMatch(node, rule)) {\n Object.assign(collectStyles, rule.apply);\n }\n }\n\n // When all rules are where-free and uniqueColors-free, the merged style\n // depends only on labels. Cache it so subsequent nodes with the same label\n // set skip rule iteration.\n if (isCacheable) {\n mergedStyleCache.set(labelSetKey, collectStyles);\n }\n\n return evaluateNodeStyle(collectStyles, node, uniqueColorsCache);\n };\n}\n\nconst DEFAULT_REL_STYLE: GraphStyleRule = {\n apply: {\n captions: { text: [{ value: { useType: true } }] },\n color: { value: DEFAULT_REL_COLOR },\n },\n match: { reltype: null },\n};\n\nexport function compileGraphStyleRules(\n styleRules: GraphStyleRule[] | null | undefined,\n): CompiledGraphStyleRules {\n const styleMatchers = collectStyleMatchers(styleRules);\n\n // Shared across nodes and every relationship type so each rule keeps a single\n // value-to-color counter. Keyed by UniqueColors object identity, and a rule\n // matches either labels or reltypes, so rules stay isolated from each other.\n const uniqueColorsCache = new Map<UniqueColors, Map<string, string>>();\n\n // Lazily build and cache a style function per relationship type\n const cache = new Map<\n string,\n (rel: RelData) => EvaluatedNvlRelationshipStyle\n >();\n const byType = (type: string) => {\n let fn = cache.get(type);\n if (fn === undefined) {\n const rules = styleMatchers.rulesByType.get(type) ?? [];\n // Sort global and type-specific rules together by priority, mirroring\n // the node path. The default style carries no priority and always\n // applies first.\n fn = createRelStyleFunction(\n [\n DEFAULT_REL_STYLE,\n ...[...styleMatchers.globalReltypeRules, ...rules].toSorted(\n compareByPriorityAscending,\n ),\n ],\n uniqueColorsCache,\n );\n cache.set(type, fn);\n }\n return fn;\n };\n\n const byLabelSet = createByLabelSetFunction(styleMatchers, uniqueColorsCache);\n\n return { byLabelSet, byType, styleMatchers };\n}\n"]}
@@ -93,25 +93,25 @@ export const CaptionValueSchema = z.union([
93
93
  ]);
94
94
  export const CaptionVariationSchema = z.enum(['bold', 'italic', 'underline']);
95
95
  export const NvlCaptionSchema = z.object({
96
+ key: z.string().optional(),
96
97
  styles: z.array(z.string()).optional(),
97
98
  value: CaptionValueSchema.optional(),
98
- key: z.string().optional(),
99
99
  });
100
100
  const CaptionsSchema = z.object({
101
- text: z.array(NvlCaptionSchema).optional(),
102
101
  align: z.enum(['top', 'bottom', 'center']).optional(),
103
- size: z.number().optional(),
104
102
  isDisabled: z.boolean().optional(),
103
+ size: z.number().optional(),
104
+ text: z.array(NvlCaptionSchema).optional(),
105
105
  });
106
106
  /**
107
107
  * OverlayIcon from NVL - icon displayed on top of a graph element.
108
108
  * @see `@neo4j-nvl/base` Node.overlayIcon.
109
109
  */
110
110
  const NvlOverlayIconSchema = z.object({
111
- url: z.string(),
111
+ isDisabled: z.boolean().optional(),
112
112
  position: z.array(z.number()).optional(),
113
113
  size: z.number().optional(),
114
- isDisabled: z.boolean().optional(),
114
+ url: z.string(),
115
115
  });
116
116
  /**
117
117
  * Gradient coloring based on a continuous orderable property value. Range
@@ -121,14 +121,14 @@ const NvlOverlayIconSchema = z.object({
121
121
  * colorRange is silently ignored — other style properties still apply.
122
122
  */
123
123
  export const ColorRangeSchema = z.object({
124
- onProperty: z.string(),
125
- minValue: GraphRangeLiteralSchema,
126
- minColor: z.string(),
127
- maxValue: GraphRangeLiteralSchema,
124
+ isDisabled: z.boolean().optional(),
128
125
  maxColor: z.string(),
129
- midValue: GraphRangeLiteralSchema.optional(),
126
+ maxValue: GraphRangeLiteralSchema,
130
127
  midColor: z.string().optional(),
131
- isDisabled: z.boolean().optional(),
128
+ midValue: GraphRangeLiteralSchema.optional(),
129
+ minColor: z.string(),
130
+ minValue: GraphRangeLiteralSchema,
131
+ onProperty: z.string(),
132
132
  });
133
133
  /**
134
134
  * Size interpolation for nodes based on a continuous orderable property value.
@@ -138,12 +138,12 @@ export const ColorRangeSchema = z.object({
138
138
  * other style properties still apply.
139
139
  */
140
140
  export const SizeRangeSchema = z.object({
141
- onProperty: z.string(),
142
- minValue: GraphRangeLiteralSchema,
141
+ isDisabled: z.boolean().optional(),
142
+ maxSize: z.number(),
143
143
  maxValue: GraphRangeLiteralSchema,
144
144
  minSize: z.number(),
145
- maxSize: z.number(),
146
- isDisabled: z.boolean().optional(),
145
+ minValue: GraphRangeLiteralSchema,
146
+ onProperty: z.string(),
147
147
  });
148
148
  /**
149
149
  * Width interpolation for relationships based on a continuous orderable
@@ -153,12 +153,12 @@ export const SizeRangeSchema = z.object({
153
153
  * other style properties still apply.
154
154
  */
155
155
  export const WidthRangeSchema = z.object({
156
- onProperty: z.string(),
157
- minValue: GraphRangeLiteralSchema,
156
+ isDisabled: z.boolean().optional(),
158
157
  maxValue: GraphRangeLiteralSchema,
159
- minWidth: z.number(),
160
158
  maxWidth: z.number(),
161
- isDisabled: z.boolean().optional(),
159
+ minValue: GraphRangeLiteralSchema,
160
+ minWidth: z.number(),
161
+ onProperty: z.string(),
162
162
  });
163
163
  /**
164
164
  * Assigns a unique color per distinct value of a property.
@@ -167,36 +167,36 @@ export const WidthRangeSchema = z.object({
167
167
  * other style properties still apply.
168
168
  */
169
169
  export const UniqueColorsSchema = z.object({
170
- onProperty: z.string(),
171
170
  isDisabled: z.boolean().optional(),
171
+ onProperty: z.string(),
172
172
  });
173
173
  const ColorSchema = z.object({
174
- value: z.string(),
175
174
  isDisabled: z.boolean().optional(),
175
+ value: z.string(),
176
176
  });
177
177
  const IconSchema = z.object({
178
- value: z.string(),
179
178
  isDisabled: z.boolean().optional(),
179
+ value: z.string(),
180
180
  });
181
181
  const SizeSchema = z.object({
182
- value: z.number(),
183
182
  isDisabled: z.boolean().optional(),
183
+ value: z.number(),
184
184
  });
185
185
  const WidthSchema = z.object({
186
- value: z.number(),
187
186
  isDisabled: z.boolean().optional(),
187
+ value: z.number(),
188
188
  });
189
189
  export const StyleSchema = z.object({
190
190
  captions: CaptionsSchema.optional(),
191
191
  color: ColorSchema.optional(),
192
192
  colorRange: ColorRangeSchema.optional(),
193
193
  icon: IconSchema.optional(),
194
- sizeRange: SizeRangeSchema.optional(),
195
194
  overlayIcon: NvlOverlayIconSchema.optional(),
196
- widthRange: WidthRangeSchema.optional(),
197
195
  size: SizeSchema.optional(),
196
+ sizeRange: SizeRangeSchema.optional(),
198
197
  uniqueColors: UniqueColorsSchema.optional(),
199
198
  width: WidthSchema.optional(),
199
+ widthRange: WidthRangeSchema.optional(),
200
200
  });
201
201
  /**
202
202
  * metaData is an free-form object that can be used to store additional information about a style rule.
@@ -204,12 +204,12 @@ export const StyleSchema = z.object({
204
204
  */
205
205
  const metaDataSchema = z.record(z.string(), z.unknown());
206
206
  export const GraphStyleRuleSchema = z.object({
207
- match: MatchSchema,
208
- where: WhereSchema.optional(),
209
207
  apply: StyleSchema,
210
208
  isDisabled: z.boolean().optional(),
211
- priority: z.number().nonnegative().optional(),
209
+ match: MatchSchema,
212
210
  metaData: metaDataSchema.optional(),
211
+ priority: z.number().nonnegative().optional(),
212
+ where: WhereSchema.optional(),
213
213
  });
214
214
  /**
215
215
  * Runtime type guard for {@link GraphStyleRule}, backed by the internal Zod
@@ -1 +1 @@
1
- {"version":3,"file":"style-types.js","sourceRoot":"","sources":["../../../src/styling/style-types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { type Node, type Relationship } from '@neo4j-nvl/base';\nimport { z } from 'zod';\n\nimport {\n type BigintLiteral,\n BigintLiteralSchema,\n type DatetimeLiteral,\n DatetimeLiteralSchema,\n type LocalDatetimeLiteral,\n LocalDatetimeLiteralSchema,\n type NumericLiteral,\n NumericLiteralSchema,\n type RangeLiteral,\n RangeLiteralSchema,\n type TimeLiteral,\n TimeLiteralSchema,\n} from '../_generated/style-rules';\n\n/*\n * Style types defined in Zod, so that we can use the schemas to generate JSON Schema.\n * This is useful for generating documentation, importing and for future integration into editors.\n *\n * Some simple examples of rules:\n * - Match all nodes with label \"Person\" and apply red color\n * { match: { label: \"Person\" }, apply: { color: \"red\" } }\n *\n * - Match all relationships with type \"KNOWS\" which have the property \"name\" equal to \"John\" and apply width 10\n * { match: { reltype: \"KNOWS\" }, where: { equal: [{ property: \"name\" }, \"John\"] }, apply: { width: 10 } }\n */\n\n// Selector schemas. This is what can go under the `match` key.\nconst LabelSelectorSchema = z.object({\n label: z.string().nullable(),\n});\n\nconst ReltypeSelectorSchema = z.object({\n reltype: z.string().nullable(),\n});\n\nconst PropertySelectorSchema = z.object({\n property: z.string(),\n});\n\nexport const SelectorSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\ntype Selector = z.infer<typeof SelectorSchema>;\n\nexport const MatchSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\n\n// Schemas for the values that can go under the `where` key. Starts with defining the literal values.\nexport const CypherValueSchema = z.union([\n z.string(),\n NumericLiteralSchema,\n z.boolean(),\n z.null(),\n DatetimeLiteralSchema,\n LocalDatetimeLiteralSchema,\n TimeLiteralSchema,\n]);\nexport type CypherValue = z.infer<typeof CypherValueSchema>;\n/** A JSON-safe bigint literal represented by a signed decimal string. */\nexport const GraphBigintLiteralSchema = BigintLiteralSchema;\n/** A number, native bigint, or JSON-safe bigint literal. */\nexport const GraphNumericLiteralSchema = NumericLiteralSchema;\n/** A numeric, datetime, localdatetime, or time literal used as a range boundary. */\nexport const GraphRangeLiteralSchema = RangeLiteralSchema;\nexport type GraphBigintLiteral = BigintLiteral;\nexport type GraphNumericLiteral = NumericLiteral;\nexport type GraphRangeLiteral = RangeLiteral;\n\nexport const ValueSchema = z\n .union([SelectorSchema, CypherValueSchema])\n .describe(\n 'Either a property/label/reltype selector (e.g., {property: \"name\"}), a literal value (string, number, bigint, {bigint: \"42\"}, boolean, null), or a datetime/time literal (e.g., {datetime: \"2024-01-01T00:00:00Z\"}, {time: \"14:30:00\"}).',\n );\nexport type Value = z.infer<typeof ValueSchema>;\n\nexport type { DatetimeLiteral, LocalDatetimeLiteral, TimeLiteral };\n\n/**\n * Where clause - recursive type for conditional expressions\n * The type is manually defined for the export, since zod doesn't support exporting inferred recursive types.\n */\nexport type Where =\n // Selector is useful for finding nodes with multiple labels.\n // for example: {match: {label: \"Person\"}, where: {label: \"Actor\"}}\n // matches nodes with label Person AND Actor\n | Selector\n | { not: Where }\n | { and: Where[] }\n | { or: Where[] }\n | { equal: [Value, Value] }\n | { lessThan: [Value, Value] }\n | { lessThanOrEqual: [Value, Value] }\n | { greaterThan: [Value, Value] }\n | { greaterThanOrEqual: [Value, Value] }\n | { contains: [Value, Value] }\n | { startsWith: [Value, Value] }\n | { endsWith: [Value, Value] }\n\n // Null check matching Cypher's IS NULL\n // Returns true/false (not null), making it safe for null checking\n // Use { not: { isNull: ... } } for IS NOT NULL\n // @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n | { isNull: Value };\n\nexport const WhereSchema: z.ZodType<Where> = z.lazy(() =>\n z.union([\n SelectorSchema,\n z.object({ not: WhereSchema }),\n z.object({ and: z.array(WhereSchema) }),\n z.object({ or: z.array(WhereSchema) }),\n z.object({ equal: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ contains: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ startsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ endsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ isNull: ValueSchema }),\n ]),\n);\n\n// Schemas that go under the `apply` key.\nexport const CaptionValueSchema = z.union([\n z.string(),\n z.object({ property: z.string() }),\n z.object({ useType: z.literal(true) }),\n]);\nexport type CaptionValue = z.infer<typeof CaptionValueSchema>;\n\nexport const CaptionVariationSchema = z.enum(['bold', 'italic', 'underline']);\nexport type CaptionVariation = z.infer<typeof CaptionVariationSchema>;\n\nexport const NvlCaptionSchema = z.object({\n styles: z.array(z.string()).optional(),\n value: CaptionValueSchema.optional(),\n key: z.string().optional(),\n});\nexport type Caption = z.infer<typeof NvlCaptionSchema>;\n\nconst CaptionsSchema = z.object({\n text: z.array(NvlCaptionSchema).optional(),\n align: z.enum(['top', 'bottom', 'center']).optional(),\n size: z.number().optional(),\n isDisabled: z.boolean().optional(),\n});\n\n/**\n * OverlayIcon from NVL - icon displayed on top of a graph element.\n * @see `@neo4j-nvl/base` Node.overlayIcon.\n */\nconst NvlOverlayIconSchema = z.object({\n url: z.string(),\n position: z.array(z.number()).optional(),\n size: z.number().optional(),\n isDisabled: z.boolean().optional(),\n});\n\n/**\n * Gradient coloring based on a continuous orderable property value. Range\n * boundaries accept numeric and temporal literals.\n * Colors must be a standard hex string (#rrggbb).\n * If the property is missing, non-orderable, or any color is invalid, the\n * colorRange is silently ignored — other style properties still apply.\n */\nexport const ColorRangeSchema = z.object({\n onProperty: z.string(),\n minValue: GraphRangeLiteralSchema,\n minColor: z.string(),\n maxValue: GraphRangeLiteralSchema,\n maxColor: z.string(),\n midValue: GraphRangeLiteralSchema.optional(),\n midColor: z.string().optional(),\n isDisabled: z.boolean().optional(),\n});\nexport type ColorRange = z.infer<typeof ColorRangeSchema>;\n\n/**\n * Size interpolation for nodes based on a continuous orderable property value.\n * Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a size in [minSize, maxSize].\n * If the property is missing or non-orderable, sizeRange is silently ignored —\n * other style properties still apply.\n */\nexport const SizeRangeSchema = z.object({\n onProperty: z.string(),\n minValue: GraphRangeLiteralSchema,\n maxValue: GraphRangeLiteralSchema,\n minSize: z.number(),\n maxSize: z.number(),\n isDisabled: z.boolean().optional(),\n});\nexport type SizeRange = z.infer<typeof SizeRangeSchema>;\n\n/**\n * Width interpolation for relationships based on a continuous orderable\n * property value. Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a width in [minWidth, maxWidth].\n * If the property is missing or non-orderable, widthRange is silently ignored —\n * other style properties still apply.\n */\nexport const WidthRangeSchema = z.object({\n onProperty: z.string(),\n minValue: GraphRangeLiteralSchema,\n maxValue: GraphRangeLiteralSchema,\n minWidth: z.number(),\n maxWidth: z.number(),\n isDisabled: z.boolean().optional(),\n});\nexport type WidthRange = z.infer<typeof WidthRangeSchema>;\n\n/**\n * Assigns a unique color per distinct value of a property.\n * Colors are assigned in first-come, first-served order from a categorical palette.\n * If the property is missing or null, uniqueColors is silently ignored —\n * other style properties still apply.\n */\nexport const UniqueColorsSchema = z.object({\n onProperty: z.string(),\n isDisabled: z.boolean().optional(),\n});\nexport type UniqueColors = z.infer<typeof UniqueColorsSchema>;\n\nconst ColorSchema = z.object({\n value: z.string(),\n isDisabled: z.boolean().optional(),\n});\n\nconst IconSchema = z.object({\n value: z.string(),\n isDisabled: z.boolean().optional(),\n});\n\nconst SizeSchema = z.object({\n value: z.number(),\n isDisabled: z.boolean().optional(),\n});\n\nconst WidthSchema = z.object({\n value: z.number(),\n isDisabled: z.boolean().optional(),\n});\n\nexport const StyleSchema = z.object({\n captions: CaptionsSchema.optional(),\n color: ColorSchema.optional(),\n colorRange: ColorRangeSchema.optional(),\n icon: IconSchema.optional(),\n sizeRange: SizeRangeSchema.optional(),\n overlayIcon: NvlOverlayIconSchema.optional(),\n widthRange: WidthRangeSchema.optional(),\n size: SizeSchema.optional(),\n uniqueColors: UniqueColorsSchema.optional(),\n width: WidthSchema.optional(),\n});\nexport type Style = z.infer<typeof StyleSchema>;\n\n/**\n * metaData is an free-form object that can be used to store additional information about a style rule.\n * The data is not taken into account when evaluationg the rule.\n */\nconst metaDataSchema = z.record(z.string(), z.unknown());\n\nexport const GraphStyleRuleSchema = z.object({\n match: MatchSchema,\n where: WhereSchema.optional(),\n apply: StyleSchema,\n isDisabled: z.boolean().optional(),\n priority: z.number().nonnegative().optional(),\n metaData: metaDataSchema.optional(),\n});\n// exporting this type with the graph prefix for clarity when used in the same context as other rules (grid, chart)\nexport type GraphStyleRule = z.infer<typeof GraphStyleRuleSchema>;\n\n/**\n * Runtime type guard for {@link GraphStyleRule}, backed by the internal Zod\n * schema. Narrows an `unknown` value to `GraphStyleRule` when it is a valid\n * style rule.\n *\n * This lets consumers validate values without taking a dependency on Zod or on\n * our schema export. For example, it can be passed to another validation\n * library's custom check:\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { isGraphStyleRule, type GraphStyleRule } from '@neo4j-ndl/react-graph';\n *\n * const formSchema = z.object({\n * rule: z.custom<GraphStyleRule>(isGraphStyleRule),\n * notes: z.string(),\n * });\n * ```\n */\nexport const isGraphStyleRule = (value: unknown): value is GraphStyleRule =>\n GraphStyleRuleSchema.safeParse(value).success;\n\nexport type NonStaticStyles =\n | 'captions'\n | 'colorRange'\n | 'sizeRange'\n | 'widthRange'\n | 'uniqueColors';\n\ntype NodeStyleKey =\n | 'icon'\n | 'overlayIcon'\n | 'color'\n | 'size'\n | 'captions'\n | 'captionSize'\n | 'captionAlign';\n\ntype RelStyleKey =\n | 'width'\n | 'color'\n | 'captions'\n | 'captionSize'\n | 'captionAlign'\n | 'overlayIcon';\n\nexport type EvaluatedNvlNodeStyle = Pick<Node, NodeStyleKey>;\nexport type EvaluatedNvlRelationshipStyle = Pick<Relationship, RelStyleKey>;\n\nconst NODE_STYLE_KEYS: readonly NodeStyleKey[] = [\n 'color',\n 'size',\n 'icon',\n 'overlayIcon',\n 'captions',\n 'captionSize',\n 'captionAlign',\n];\n\nconst REL_STYLE_KEYS: readonly RelStyleKey[] = [\n 'color',\n 'width',\n 'captions',\n 'captionSize',\n 'captionAlign',\n 'overlayIcon',\n];\n\n/**\n * Extract consumer-set style properties from a node.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerNodeStyles(\n node: Partial<EvaluatedNvlNodeStyle>,\n): Partial<EvaluatedNvlNodeStyle> {\n const result: Record<string, unknown> = {};\n for (const key of NODE_STYLE_KEYS) {\n if (node[key] !== undefined) {\n result[key] = node[key];\n }\n }\n return result as Partial<EvaluatedNvlNodeStyle>;\n}\n\n/**\n * Extract consumer-set style properties from a relationship.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerRelationshipStyles(\n rel: Partial<EvaluatedNvlRelationshipStyle>,\n): Partial<EvaluatedNvlRelationshipStyle> {\n const result: Record<string, unknown> = {};\n for (const key of REL_STYLE_KEYS) {\n if (rel[key] !== undefined) {\n result[key] = rel[key];\n }\n }\n return result as Partial<EvaluatedNvlRelationshipStyle>;\n}\n"]}
1
+ {"version":3,"file":"style-types.js","sourceRoot":"","sources":["../../../src/styling/style-types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { type Node, type Relationship } from '@neo4j-nvl/base';\nimport { z } from 'zod';\n\nimport {\n type BigintLiteral,\n BigintLiteralSchema,\n type DatetimeLiteral,\n DatetimeLiteralSchema,\n type LocalDatetimeLiteral,\n LocalDatetimeLiteralSchema,\n type NumericLiteral,\n NumericLiteralSchema,\n type RangeLiteral,\n RangeLiteralSchema,\n type TimeLiteral,\n TimeLiteralSchema,\n} from '../_generated/style-rules';\n\n/*\n * Style types defined in Zod, so that we can use the schemas to generate JSON Schema.\n * This is useful for generating documentation, importing and for future integration into editors.\n *\n * Some simple examples of rules:\n * - Match all nodes with label \"Person\" and apply red color\n * { match: { label: \"Person\" }, apply: { color: \"red\" } }\n *\n * - Match all relationships with type \"KNOWS\" which have the property \"name\" equal to \"John\" and apply width 10\n * { match: { reltype: \"KNOWS\" }, where: { equal: [{ property: \"name\" }, \"John\"] }, apply: { width: 10 } }\n */\n\n// Selector schemas. This is what can go under the `match` key.\nconst LabelSelectorSchema = z.object({\n label: z.string().nullable(),\n});\n\nconst ReltypeSelectorSchema = z.object({\n reltype: z.string().nullable(),\n});\n\nconst PropertySelectorSchema = z.object({\n property: z.string(),\n});\n\nexport const SelectorSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\ntype Selector = z.infer<typeof SelectorSchema>;\n\nexport const MatchSchema = z.union([\n LabelSelectorSchema,\n ReltypeSelectorSchema,\n PropertySelectorSchema,\n]);\n\n// Schemas for the values that can go under the `where` key. Starts with defining the literal values.\nexport const CypherValueSchema = z.union([\n z.string(),\n NumericLiteralSchema,\n z.boolean(),\n z.null(),\n DatetimeLiteralSchema,\n LocalDatetimeLiteralSchema,\n TimeLiteralSchema,\n]);\nexport type CypherValue = z.infer<typeof CypherValueSchema>;\n/** A JSON-safe bigint literal represented by a signed decimal string. */\nexport const GraphBigintLiteralSchema = BigintLiteralSchema;\n/** A number, native bigint, or JSON-safe bigint literal. */\nexport const GraphNumericLiteralSchema = NumericLiteralSchema;\n/** A numeric, datetime, localdatetime, or time literal used as a range boundary. */\nexport const GraphRangeLiteralSchema = RangeLiteralSchema;\nexport type GraphBigintLiteral = BigintLiteral;\nexport type GraphNumericLiteral = NumericLiteral;\nexport type GraphRangeLiteral = RangeLiteral;\n\nexport const ValueSchema = z\n .union([SelectorSchema, CypherValueSchema])\n .describe(\n 'Either a property/label/reltype selector (e.g., {property: \"name\"}), a literal value (string, number, bigint, {bigint: \"42\"}, boolean, null), or a datetime/time literal (e.g., {datetime: \"2024-01-01T00:00:00Z\"}, {time: \"14:30:00\"}).',\n );\nexport type Value = z.infer<typeof ValueSchema>;\n\nexport type { DatetimeLiteral, LocalDatetimeLiteral, TimeLiteral };\n\n/**\n * Where clause - recursive type for conditional expressions\n * The type is manually defined for the export, since zod doesn't support exporting inferred recursive types.\n */\nexport type Where =\n // Selector is useful for finding nodes with multiple labels.\n // for example: {match: {label: \"Person\"}, where: {label: \"Actor\"}}\n // matches nodes with label Person AND Actor\n | Selector\n | { not: Where }\n | { and: Where[] }\n | { or: Where[] }\n | { equal: [Value, Value] }\n | { lessThan: [Value, Value] }\n | { lessThanOrEqual: [Value, Value] }\n | { greaterThan: [Value, Value] }\n | { greaterThanOrEqual: [Value, Value] }\n | { contains: [Value, Value] }\n | { startsWith: [Value, Value] }\n | { endsWith: [Value, Value] }\n\n // Null check matching Cypher's IS NULL\n // Returns true/false (not null), making it safe for null checking\n // Use { not: { isNull: ... } } for IS NOT NULL\n // @see https://neo4j.com/docs/cypher-manual/current/values-and-types/working-with-null/\n | { isNull: Value };\n\nexport const WhereSchema: z.ZodType<Where> = z.lazy(() =>\n z.union([\n SelectorSchema,\n z.object({ not: WhereSchema }),\n z.object({ and: z.array(WhereSchema) }),\n z.object({ or: z.array(WhereSchema) }),\n z.object({ equal: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ lessThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThan: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ greaterThanOrEqual: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ contains: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ startsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ endsWith: z.tuple([ValueSchema, ValueSchema]) }),\n z.object({ isNull: ValueSchema }),\n ]),\n);\n\n// Schemas that go under the `apply` key.\nexport const CaptionValueSchema = z.union([\n z.string(),\n z.object({ property: z.string() }),\n z.object({ useType: z.literal(true) }),\n]);\nexport type CaptionValue = z.infer<typeof CaptionValueSchema>;\n\nexport const CaptionVariationSchema = z.enum(['bold', 'italic', 'underline']);\nexport type CaptionVariation = z.infer<typeof CaptionVariationSchema>;\n\nexport const NvlCaptionSchema = z.object({\n key: z.string().optional(),\n styles: z.array(z.string()).optional(),\n value: CaptionValueSchema.optional(),\n});\nexport type Caption = z.infer<typeof NvlCaptionSchema>;\n\nconst CaptionsSchema = z.object({\n align: z.enum(['top', 'bottom', 'center']).optional(),\n isDisabled: z.boolean().optional(),\n size: z.number().optional(),\n text: z.array(NvlCaptionSchema).optional(),\n});\n\n/**\n * OverlayIcon from NVL - icon displayed on top of a graph element.\n * @see `@neo4j-nvl/base` Node.overlayIcon.\n */\nconst NvlOverlayIconSchema = z.object({\n isDisabled: z.boolean().optional(),\n position: z.array(z.number()).optional(),\n size: z.number().optional(),\n url: z.string(),\n});\n\n/**\n * Gradient coloring based on a continuous orderable property value. Range\n * boundaries accept numeric and temporal literals.\n * Colors must be a standard hex string (#rrggbb).\n * If the property is missing, non-orderable, or any color is invalid, the\n * colorRange is silently ignored — other style properties still apply.\n */\nexport const ColorRangeSchema = z.object({\n isDisabled: z.boolean().optional(),\n maxColor: z.string(),\n maxValue: GraphRangeLiteralSchema,\n midColor: z.string().optional(),\n midValue: GraphRangeLiteralSchema.optional(),\n minColor: z.string(),\n minValue: GraphRangeLiteralSchema,\n onProperty: z.string(),\n});\nexport type ColorRange = z.infer<typeof ColorRangeSchema>;\n\n/**\n * Size interpolation for nodes based on a continuous orderable property value.\n * Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a size in [minSize, maxSize].\n * If the property is missing or non-orderable, sizeRange is silently ignored —\n * other style properties still apply.\n */\nexport const SizeRangeSchema = z.object({\n isDisabled: z.boolean().optional(),\n maxSize: z.number(),\n maxValue: GraphRangeLiteralSchema,\n minSize: z.number(),\n minValue: GraphRangeLiteralSchema,\n onProperty: z.string(),\n});\nexport type SizeRange = z.infer<typeof SizeRangeSchema>;\n\n/**\n * Width interpolation for relationships based on a continuous orderable\n * property value. Range boundaries accept numeric and temporal literals.\n * Maps a property value in [minValue, maxValue] to a width in [minWidth, maxWidth].\n * If the property is missing or non-orderable, widthRange is silently ignored —\n * other style properties still apply.\n */\nexport const WidthRangeSchema = z.object({\n isDisabled: z.boolean().optional(),\n maxValue: GraphRangeLiteralSchema,\n maxWidth: z.number(),\n minValue: GraphRangeLiteralSchema,\n minWidth: z.number(),\n onProperty: z.string(),\n});\nexport type WidthRange = z.infer<typeof WidthRangeSchema>;\n\n/**\n * Assigns a unique color per distinct value of a property.\n * Colors are assigned in first-come, first-served order from a categorical palette.\n * If the property is missing or null, uniqueColors is silently ignored —\n * other style properties still apply.\n */\nexport const UniqueColorsSchema = z.object({\n isDisabled: z.boolean().optional(),\n onProperty: z.string(),\n});\nexport type UniqueColors = z.infer<typeof UniqueColorsSchema>;\n\nconst ColorSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.string(),\n});\n\nconst IconSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.string(),\n});\n\nconst SizeSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.number(),\n});\n\nconst WidthSchema = z.object({\n isDisabled: z.boolean().optional(),\n value: z.number(),\n});\n\nexport const StyleSchema = z.object({\n captions: CaptionsSchema.optional(),\n color: ColorSchema.optional(),\n colorRange: ColorRangeSchema.optional(),\n icon: IconSchema.optional(),\n overlayIcon: NvlOverlayIconSchema.optional(),\n size: SizeSchema.optional(),\n sizeRange: SizeRangeSchema.optional(),\n uniqueColors: UniqueColorsSchema.optional(),\n width: WidthSchema.optional(),\n widthRange: WidthRangeSchema.optional(),\n});\nexport type Style = z.infer<typeof StyleSchema>;\n\n/**\n * metaData is an free-form object that can be used to store additional information about a style rule.\n * The data is not taken into account when evaluationg the rule.\n */\nconst metaDataSchema = z.record(z.string(), z.unknown());\n\nexport const GraphStyleRuleSchema = z.object({\n apply: StyleSchema,\n isDisabled: z.boolean().optional(),\n match: MatchSchema,\n metaData: metaDataSchema.optional(),\n priority: z.number().nonnegative().optional(),\n where: WhereSchema.optional(),\n});\n// exporting this type with the graph prefix for clarity when used in the same context as other rules (grid, chart)\nexport type GraphStyleRule = z.infer<typeof GraphStyleRuleSchema>;\n\n/**\n * Runtime type guard for {@link GraphStyleRule}, backed by the internal Zod\n * schema. Narrows an `unknown` value to `GraphStyleRule` when it is a valid\n * style rule.\n *\n * This lets consumers validate values without taking a dependency on Zod or on\n * our schema export. For example, it can be passed to another validation\n * library's custom check:\n *\n * @example\n * ```ts\n * import { z } from 'zod';\n * import { isGraphStyleRule, type GraphStyleRule } from '@neo4j-ndl/react-graph';\n *\n * const formSchema = z.object({\n * rule: z.custom<GraphStyleRule>(isGraphStyleRule),\n * notes: z.string(),\n * });\n * ```\n */\nexport const isGraphStyleRule = (value: unknown): value is GraphStyleRule =>\n GraphStyleRuleSchema.safeParse(value).success;\n\nexport type NonStaticStyles =\n | 'captions'\n | 'colorRange'\n | 'sizeRange'\n | 'widthRange'\n | 'uniqueColors';\n\ntype NodeStyleKey =\n | 'icon'\n | 'overlayIcon'\n | 'color'\n | 'size'\n | 'captions'\n | 'captionSize'\n | 'captionAlign';\n\ntype RelStyleKey =\n | 'width'\n | 'color'\n | 'captions'\n | 'captionSize'\n | 'captionAlign'\n | 'overlayIcon';\n\nexport type EvaluatedNvlNodeStyle = Pick<Node, NodeStyleKey>;\nexport type EvaluatedNvlRelationshipStyle = Pick<Relationship, RelStyleKey>;\n\nconst NODE_STYLE_KEYS: readonly NodeStyleKey[] = [\n 'color',\n 'size',\n 'icon',\n 'overlayIcon',\n 'captions',\n 'captionSize',\n 'captionAlign',\n];\n\nconst REL_STYLE_KEYS: readonly RelStyleKey[] = [\n 'color',\n 'width',\n 'captions',\n 'captionSize',\n 'captionAlign',\n 'overlayIcon',\n];\n\n/**\n * Extract consumer-set style properties from a node.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerNodeStyles(\n node: Partial<EvaluatedNvlNodeStyle>,\n): Partial<EvaluatedNvlNodeStyle> {\n const result: Record<string, unknown> = {};\n for (const key of NODE_STYLE_KEYS) {\n if (node[key] !== undefined) {\n result[key] = node[key];\n }\n }\n return result as Partial<EvaluatedNvlNodeStyle>;\n}\n\n/**\n * Extract consumer-set style properties from a relationship.\n * Only includes properties that are explicitly defined (not undefined),\n * so they can be spread over rule-derived styles to take precedence.\n */\nexport function pickConsumerRelationshipStyles(\n rel: Partial<EvaluatedNvlRelationshipStyle>,\n): Partial<EvaluatedNvlRelationshipStyle> {\n const result: Record<string, unknown> = {};\n for (const key of REL_STYLE_KEYS) {\n if (rel[key] !== undefined) {\n result[key] = rel[key];\n }\n }\n return result as Partial<EvaluatedNvlRelationshipStyle>;\n}\n"]}
@@ -21,7 +21,7 @@
21
21
  import { type NodeData, type RelData } from '../graph-visualization-context';
22
22
  import { type EvaluatedNvlNodeStyle, type EvaluatedNvlRelationshipStyle, type GraphStyleRule } from './style-types';
23
23
  export declare const DEFAULT_REL_COLOR: string;
24
- export declare const UNIQUE_COLORS_PALETTE: `#${string}`[];
24
+ export declare const UNIQUE_COLORS_PALETTE: string[];
25
25
  type StyleMatchers = {
26
26
  globalLabelRules: GraphStyleRule[];
27
27
  globalReltypeRules: GraphStyleRule[];