@unovis/ts 1.5.1-ql.2 → 1.5.1-xplg.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/components/annotations/style.js.map +1 -1
  2. package/components/area/index.js +1 -1
  3. package/components/area/index.js.map +1 -1
  4. package/components/area/style.js.map +1 -1
  5. package/components/axis/config.d.ts +1 -1
  6. package/components/axis/config.js.map +1 -1
  7. package/components/axis/index.d.ts +0 -1
  8. package/components/axis/index.js +2 -10
  9. package/components/axis/index.js.map +1 -1
  10. package/components/axis/style.js.map +1 -1
  11. package/components/brush/config.d.ts +1 -1
  12. package/components/brush/config.js.map +1 -1
  13. package/components/brush/style.js.map +1 -1
  14. package/components/bullet-legend/style.js.map +1 -1
  15. package/components/chord-diagram/style.js.map +1 -1
  16. package/components/crosshair/style.js.map +1 -1
  17. package/components/donut/config.d.ts +4 -0
  18. package/components/donut/config.js +1 -1
  19. package/components/donut/config.js.map +1 -1
  20. package/components/donut/constants.d.ts +2 -0
  21. package/components/donut/constants.js +8 -0
  22. package/components/donut/constants.js.map +1 -0
  23. package/components/donut/index.js +35 -5
  24. package/components/donut/index.js.map +1 -1
  25. package/components/donut/style.js.map +1 -1
  26. package/components/flow-legend/style.js.map +1 -1
  27. package/components/free-brush/style.js.map +1 -1
  28. package/components/graph/config.d.ts +24 -3
  29. package/components/graph/config.js +5 -2
  30. package/components/graph/config.js.map +1 -1
  31. package/components/graph/index.d.ts +12 -9
  32. package/components/graph/index.js +39 -25
  33. package/components/graph/index.js.map +1 -1
  34. package/components/graph/modules/layout-helpers.js +1 -1
  35. package/components/graph/modules/layout-helpers.js.map +1 -1
  36. package/components/graph/modules/layout.js +1 -1
  37. package/components/graph/modules/layout.js.map +1 -1
  38. package/components/graph/modules/link/index.d.ts +3 -2
  39. package/components/graph/modules/link/index.js +53 -28
  40. package/components/graph/modules/link/index.js.map +1 -1
  41. package/components/graph/modules/link/style.js +0 -2
  42. package/components/graph/modules/link/style.js.map +1 -1
  43. package/components/graph/modules/node/index.d.ts +2 -0
  44. package/components/graph/modules/node/index.js +7 -4
  45. package/components/graph/modules/node/index.js.map +1 -1
  46. package/components/graph/modules/node/style.js.map +1 -1
  47. package/components/graph/modules/panel/index.js +2 -2
  48. package/components/graph/modules/panel/index.js.map +1 -1
  49. package/components/graph/modules/panel/style.js.map +1 -1
  50. package/components/graph/style.js.map +1 -1
  51. package/components/graph/types.d.ts +5 -0
  52. package/components/graph/types.js.map +1 -1
  53. package/components/grouped-bar/style.js.map +1 -1
  54. package/components/leaflet-flow-map/config.js +1 -0
  55. package/components/leaflet-flow-map/config.js.map +1 -1
  56. package/components/leaflet-flow-map/shaders.js.map +1 -1
  57. package/components/leaflet-map/config.js +1 -0
  58. package/components/leaflet-map/config.js.map +1 -1
  59. package/components/leaflet-map/modules/map.js +3 -3
  60. package/components/leaflet-map/modules/map.js.map +1 -1
  61. package/components/leaflet-map/renderer/leaflet-maplibre-gl.js.map +1 -1
  62. package/components/leaflet-map/style.js.map +1 -1
  63. package/components/line/style.js.map +1 -1
  64. package/components/nested-donut/config.d.ts +1 -1
  65. package/components/nested-donut/config.js.map +1 -1
  66. package/components/nested-donut/style.js.map +1 -1
  67. package/components/sankey/modules/label.js.map +1 -1
  68. package/components/sankey/modules/link.js.map +1 -1
  69. package/components/sankey/style.js.map +1 -1
  70. package/components/scatter/style.js.map +1 -1
  71. package/components/stacked-bar/index.js +7 -5
  72. package/components/stacked-bar/index.js.map +1 -1
  73. package/components/stacked-bar/style.js.map +1 -1
  74. package/components/stacked-bar/types.d.ts +1 -1
  75. package/components/timeline/config.d.ts +65 -14
  76. package/components/timeline/config.js +15 -1
  77. package/components/timeline/config.js.map +1 -1
  78. package/components/timeline/constants.d.ts +3 -0
  79. package/components/timeline/constants.js +6 -0
  80. package/components/timeline/constants.js.map +1 -0
  81. package/components/timeline/index.d.ts +21 -10
  82. package/components/timeline/index.js +373 -93
  83. package/components/timeline/index.js.map +1 -1
  84. package/components/timeline/style.d.ts +7 -0
  85. package/components/timeline/style.js +40 -1
  86. package/components/timeline/style.js.map +1 -1
  87. package/components/timeline/types.d.ts +62 -0
  88. package/components/timeline/types.js +2 -0
  89. package/components/timeline/types.js.map +1 -0
  90. package/components/timeline/utils.d.ts +2 -0
  91. package/components/timeline/utils.js +16 -0
  92. package/components/timeline/utils.js.map +1 -0
  93. package/components/tooltip/style.js.map +1 -1
  94. package/components/topojson-map/index.js.map +1 -1
  95. package/components/topojson-map/style.js.map +1 -1
  96. package/components/treemap/config.d.ts +44 -0
  97. package/components/treemap/config.js +6 -0
  98. package/components/treemap/config.js.map +1 -0
  99. package/components/treemap/index.d.ts +16 -0
  100. package/components/treemap/index.js +263 -0
  101. package/components/treemap/index.js.map +1 -0
  102. package/components/treemap/style.d.ts +22 -0
  103. package/components/treemap/style.js +62 -0
  104. package/components/treemap/style.js.map +1 -0
  105. package/components/treemap/types.d.ts +11 -0
  106. package/components/treemap/types.js +2 -0
  107. package/components/treemap/types.js.map +1 -0
  108. package/components/vis-controls/style.js.map +1 -1
  109. package/components/xy-labels/style.js.map +1 -1
  110. package/components.d.ts +3 -0
  111. package/components.js +2 -0
  112. package/components.js.map +1 -1
  113. package/containers/single-container/config.d.ts +3 -0
  114. package/containers/single-container/config.js.map +1 -1
  115. package/containers/single-container/index.js +2 -1
  116. package/containers/single-container/index.js.map +1 -1
  117. package/containers/xy-container/config.d.ts +5 -0
  118. package/containers/xy-container/config.js +1 -1
  119. package/containers/xy-container/config.js.map +1 -1
  120. package/containers/xy-container/index.d.ts +1 -0
  121. package/containers/xy-container/index.js +15 -11
  122. package/containers/xy-container/index.js.map +1 -1
  123. package/core/container/config.js +1 -0
  124. package/core/container/config.js.map +1 -1
  125. package/data-models/graph.d.ts +3 -2
  126. package/data-models/graph.js +15 -6
  127. package/data-models/graph.js.map +1 -1
  128. package/data-models/index.d.ts +4 -0
  129. package/data-models/index.js +5 -0
  130. package/data-models/index.js.map +1 -0
  131. package/index.d.ts +1 -0
  132. package/index.js +10 -3
  133. package/index.js.map +1 -1
  134. package/maps/ind-regions.json.js +1 -1
  135. package/maps/us-counties.json.js +8 -8
  136. package/package.json +4 -5
  137. package/styles/index.js.map +1 -1
  138. package/styles/patterns.js.map +1 -1
  139. package/styles/sizes.js.map +1 -1
  140. package/types/data.d.ts +1 -2
  141. package/types/graph.d.ts +4 -0
  142. package/types/position.d.ts +2 -1
  143. package/types/position.js +1 -0
  144. package/types/position.js.map +1 -1
  145. package/types.d.ts +2 -0
  146. package/types.js +4 -1
  147. package/types.js.map +1 -1
  148. package/utils/color.d.ts +14 -0
  149. package/utils/color.js +26 -2
  150. package/utils/color.js.map +1 -1
  151. package/utils/data.d.ts +2 -2
  152. package/utils/data.js +10 -17
  153. package/utils/data.js.map +1 -1
  154. package/utils/index.js +3 -3
  155. package/utils/path.d.ts +8 -0
  156. package/utils/path.js +104 -1
  157. package/utils/path.js.map +1 -1
  158. package/utils/text.d.ts +10 -9
  159. package/utils/text.js +26 -10
  160. package/utils/text.js.map +1 -1
package/utils/data.js CHANGED
@@ -16,7 +16,7 @@ const isEmpty = (obj) => {
16
16
  !Object.entries((obj || {})).length;
17
17
  };
18
18
  // Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license
19
- const isEqual = (a, b, visited = new Set()) => {
19
+ const isEqual = (a, b, skipKeys = [], visited = new Set()) => {
20
20
  if (Array.isArray(a)) {
21
21
  if (!Array.isArray(b) || a.length !== b.length)
22
22
  return false;
@@ -25,7 +25,7 @@ const isEqual = (a, b, visited = new Set()) => {
25
25
  else
26
26
  visited.add(a);
27
27
  for (let i = 0; i < a.length; i++) {
28
- if (!isEqual(a[i], b[i], visited))
28
+ if (!isEqual(a[i], b[i], skipKeys, visited))
29
29
  return false;
30
30
  }
31
31
  return true;
@@ -38,15 +38,16 @@ const isEqual = (a, b, visited = new Set()) => {
38
38
  return false;
39
39
  if (a === b)
40
40
  return true;
41
- const keys = Object.keys(a);
42
- if (keys.length !== Object.keys(b).length)
41
+ const keysA = Object.keys(a).filter(key => !skipKeys.includes(key));
42
+ const keysB = Object.keys(b).filter(key => !skipKeys.includes(key));
43
+ if (keysA.length !== keysB.length)
43
44
  return false;
44
45
  if (visited.has(a))
45
46
  return true;
46
47
  else
47
48
  visited.add(a);
48
- for (const key in a) {
49
- if (!isEqual(a[key], b[key], visited))
49
+ for (const key of keysA) {
50
+ if (!isEqual(a[key], b[key], skipKeys, visited))
50
51
  return false;
51
52
  }
52
53
  return true;
@@ -121,7 +122,7 @@ const omit = (obj, props) => {
121
122
  return obj;
122
123
  };
123
124
  const groupBy = (arr, accessor) => {
124
- return arr.reduce((grouped, v, i, a, k = accessor(v)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)), {});
125
+ return arr.reduce((grouped, v, i, a, k = accessor(v, i)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)), {});
125
126
  };
126
127
  const sortBy = (arr, accessor) => {
127
128
  return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first
@@ -220,7 +221,7 @@ function getStackedData(data, baseline, acs, prevNegative // to help guessing th
220
221
  let negativeStack = baselineValues[i];
221
222
  acs.forEach((a, j) => {
222
223
  const value = getNumber(d, a, i) || 0;
223
- if (!isNegativeStack[j]) {
224
+ if (value >= 0) {
224
225
  stackedData[j].push([positiveStack, positiveStack += value]);
225
226
  }
226
227
  else {
@@ -230,15 +231,7 @@ function getStackedData(data, baseline, acs, prevNegative // to help guessing th
230
231
  });
231
232
  // Fill in additional stack information
232
233
  stackedData.forEach((stack, i) => {
233
- stack.negative = isNegativeStack[i];
234
- });
235
- stackedData.filter(s => s.negative)
236
- .forEach((s, i, arr) => {
237
- s.ending = i === arr.length - 1;
238
- });
239
- stackedData.filter(s => !s.negative)
240
- .forEach((s, i, arr) => {
241
- s.ending = i === arr.length - 1;
234
+ stack.isMostlyNegative = isNegativeStack[i];
242
235
  });
243
236
  return stackedData;
244
237
  }
package/utils/data.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sources":["../../src/utils/data.ts"],"sourcesContent":["import { max, min, mean, bisector } from 'd3-array'\nimport { throttle as _throttle } from 'throttle-debounce'\n\n// Types\nimport { NumericAccessor, StringAccessor, BooleanAccessor, ColorAccessor, GenericAccessor } from 'types/accessor'\nimport { StackValuesRecord } from 'types/data'\n\nexport const isNumber = <T>(a: T): a is T extends number ? T : never => typeof a === 'number'\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = <T>(a: T): a is T extends Function ? T : never => typeof a === 'function'\nexport const isUndefined = <T>(a: T): a is T extends undefined ? T : never => a === undefined\nexport const isNil = <T>(a: T): a is null | undefined => a == null\nexport const isString = <T>(a: T): a is T extends string ? T : never => typeof a === 'string'\nexport const isArray = <T>(a: T): a is T extends any[] ? T : never => Array.isArray(a)\nexport const isObject = <T>(a: T): boolean => (a instanceof Object)\nexport const isAClassInstance = <T>(a: T): boolean => a.constructor.name !== 'Function' && a.constructor.name !== 'Object'\nexport const isPlainObject = <T>(a: T): boolean => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a)\n\nexport const isEmpty = <T>(obj: T): boolean => {\n return [Object, Array].includes((obj || {}).constructor as ArrayConstructor | ObjectConstructor) &&\n !Object.entries((obj || {})).length\n}\n\n// Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license\nexport const isEqual = (a?: unknown | null, b?: unknown | null, visited: Set<any> = new Set()): boolean => {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i], visited)) return false\n }\n\n return true\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (typeof a === 'object' && a !== null && b !== null) {\n if (!(typeof b === 'object')) return false\n if (a === b) return true\n\n const keys = Object.keys(a)\n if (keys.length !== Object.keys(b).length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (const key in a) {\n if (!isEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], visited)) return false\n }\n\n return true\n }\n\n return a === b\n}\n\nexport const without = <T>(arr: Array<T>, ...args: T[]): Array<T> => arr.filter(item => !args.includes(item))\nexport const flatten = <T>(arr: Array<T | T[]>): Array<T> => arr.flat() as T[]\nexport const cloneDeep = <T>(obj: T, stack: Map<any, any> = new Map()): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T\n }\n\n if (obj instanceof Array) {\n const clone: unknown[] = []\n stack.set(obj, clone)\n for (const item of obj) {\n clone.push(stack.has(item) ? stack.get(item) : cloneDeep(item, stack))\n }\n return clone as unknown as T\n }\n\n // Class instances will be copied without cloning\n if (isAClassInstance(obj)) {\n const clone = obj\n return clone\n }\n\n if (obj instanceof Object) {\n const clone = {} as T\n stack.set(obj, clone)\n const objAsRecord = obj as Record<string | number, unknown>\n Object.keys(obj)\n .reduce((newObj: typeof objAsRecord, key: string | number): typeof objAsRecord => {\n newObj[key] = stack.has(objAsRecord[key]) ? stack.get(objAsRecord[key]) : cloneDeep(objAsRecord[key], stack)\n return newObj\n }, clone as typeof objAsRecord)\n\n return clone\n }\n\n return obj\n}\n\n\nexport const merge = <T, K>(obj1: T, obj2: K, visited: Map<any, any> = new Map()): T & K => {\n type Rec = Record<string | number, unknown>\n\n if (!obj1 || !obj2) return obj1 as T & K\n if ((obj1 as unknown) === (obj2 as unknown)) return obj1 as T & K\n\n const newObj = (isAClassInstance(obj1 as Rec) ? obj1 : cloneDeep(obj1)) as T & K\n\n // Taking care of recursive structures\n if (visited.has(obj2)) return visited.get(obj2)\n else visited.set(obj2, newObj)\n\n Object.keys(obj2 as Rec).forEach(key => {\n // Preventing prototype pollution\n if (key === '__proto__' || key === 'constructor') return\n\n if (isPlainObject((obj1 as Rec)[key]) && isPlainObject((obj2 as Rec)[key])) {\n (newObj as Rec)[key] = merge((obj1 as Rec)[key], (obj2 as Rec)[key], visited)\n } else if (isAClassInstance(obj2 as Rec)) {\n (newObj as Rec)[key] = obj2\n } else {\n (newObj as Rec)[key] = cloneDeep((obj2 as Rec)[key])\n }\n })\n\n return newObj\n}\n\nexport const omit = <T extends Record<string | number | symbol, unknown>>(obj: T, props: Array<keyof T>): Partial<T> => {\n obj = { ...obj }\n props.forEach(prop => delete obj[prop])\n return obj\n}\n\nexport const groupBy = <T extends Record<string | number, any>> (arr: T[], accessor: (a: T) => string | number): Record<string | number, T[]> => {\n return arr.reduce(\n (grouped, v, i, a, k = accessor(v)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)),\n {} as Record<string | number, T[]>\n )\n}\n\nexport const sortBy = <T>(arr: Array<T>, accessor: (a: T) => string | number): Array<T> => {\n return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first\n .sort((a, b): number => {\n return (accessor(a) > accessor(b)) ? 1 : ((accessor(b) > accessor(a)) ? -1 : 0)\n })\n}\n\nexport const throttle = <T extends (...args: any[]) => any>(\n f: T,\n delay: number,\n options?: {\n noTrailing?: boolean;\n noLeading?: boolean;\n debounceMode?: boolean;\n }\n): _throttle<T> => _throttle(delay, f, options)\n\nexport function getValue<T, ReturnType> (\n d: T,\n accessor: NumericAccessor<T> | StringAccessor<T> | BooleanAccessor<T> | ColorAccessor<T> | GenericAccessor<ReturnType, T>,\n index?: number\n): ReturnType {\n // eslint-disable-next-line @typescript-eslint/ban-types\n if (isFunction(accessor)) return (accessor as Function)(d, index) as (ReturnType | null | undefined)\n else return accessor as unknown as (ReturnType | null | undefined)\n}\n\nexport function getString<T> (d: T, accessor: StringAccessor<T>, i?: number): string | null | undefined {\n return getValue<T, string>(d, accessor, i)\n}\n\nexport function getNumber<T> (d: T, accessor: NumericAccessor<T>, i?: number): number | null | undefined {\n return getValue<T, number>(d, accessor, i)\n}\n\nexport function getBoolean<T> (d: T, accessor: BooleanAccessor<T>, i?: number): boolean | null | undefined {\n return getValue<T, boolean>(d, accessor, i)\n}\n\nexport function clean<T> (data: T[]): T[] {\n return data.filter(d => d && !isNumber(d))\n}\n\nexport function clamp (d: number, min: number, max: number): number {\n return Math.min(Math.max(d, min), max)\n}\n\nexport function unique<T> (array: T[]): T[] {\n return Array.from(new Set(array))\n}\n\nexport function countUnique<T> (array: T[], accessor = (d: unknown) => d): number {\n return new Set(array.map(d => accessor(d))).size\n}\n\nexport function arrayOfIndices (n: number): number[] {\n return [...Array(n).keys()]\n}\n\nexport function shallowDiff (o1: Record<string, unknown> = {}, o2: Record<string, unknown> = {}): Record<string, unknown> {\n return Object.keys(o2).reduce((diff, key) => {\n if (o1[key] === o2[key]) return diff\n return {\n ...diff,\n [key]: o2[key],\n }\n }, {})\n}\n\nexport function getStackedExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n if (!data) return [undefined, undefined]\n if (isArray(acs)) {\n let minValue = 0\n let maxValue = 0\n data.forEach((d, i) => {\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) positiveStack += value\n else negativeStack += value\n }\n\n if (positiveStack > maxValue) maxValue = positiveStack\n if (negativeStack < minValue) minValue = negativeStack\n })\n return [minValue, maxValue]\n }\n}\n\nexport function getStackedValues<Datum> (d: Datum, index: number, ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n const values = []\n\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, index) || 0\n if (value >= 0) {\n values.push(positiveStack += value)\n } else {\n values.push(negativeStack += value)\n }\n }\n\n return values\n}\n\nexport function getStackedData<Datum> (\n data: Datum[],\n baseline: NumericAccessor<Datum>,\n acs: NumericAccessor<Datum>[],\n prevNegative?: boolean[] // to help guessing the stack direction (positive/negative) when the values are 0 or null\n): StackValuesRecord[] {\n const baselineValues = data.map((d, i) => getNumber(d, baseline, i) || 0)\n const isNegativeStack = acs.map((a, j) => {\n const average = mean(data, (d, i) => getNumber(d, a, i) || 0)\n return (average === 0 && Array.isArray(prevNegative)) ? prevNegative[j] : average < 0\n })\n\n const stackedData: StackValuesRecord[] = acs.map(() => [])\n data.forEach((d, i) => {\n let positiveStack = baselineValues[i]\n let negativeStack = baselineValues[i]\n acs.forEach((a, j) => {\n const value = getNumber(d, a, i) || 0\n if (!isNegativeStack[j]) {\n stackedData[j].push([positiveStack, positiveStack += value])\n } else {\n stackedData[j].push([negativeStack, negativeStack += value])\n }\n })\n })\n\n // Fill in additional stack information\n stackedData.forEach((stack, i) => {\n stack.negative = isNegativeStack[i]\n })\n\n stackedData.filter(s => s.negative)\n .forEach((s, i, arr) => {\n s.ending = i === arr.length - 1\n })\n\n stackedData.filter(s => !s.negative)\n .forEach((s, i, arr) => {\n s.ending = i === arr.length - 1\n })\n\n return stackedData\n}\n\nexport function getMin<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const minValue = min(data, (d, i) => min(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return minValue\n}\n\nexport function getMax<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const maxValue = max(data, (d, i) => max(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return maxValue\n}\n\nexport function getExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n return [getMin(data, ...acs), getMax(data, ...acs)]\n}\n\nexport function getNearest<Datum> (data: Datum[], value: number, accessor: NumericAccessor<Datum>): Datum {\n if (data.length <= 1) return data[0]\n\n const values = data.map((d, i) => getNumber(d, accessor, i))\n values.sort((a, b) => a - b)\n\n const xBisector = bisector(d => d).left\n const index = xBisector(values, value, 1, data.length - 1)\n return value - values[index - 1] > values[index] - value ? data[index] : data[index - 1]\n}\n\nexport function filterDataByRange<Datum> (data: Datum[], range: [number, number], accessor: NumericAccessor<Datum>): Datum[] {\n const filteredData = data.filter((d, i) => {\n const value = getNumber(d, accessor, i)\n return (value >= range[0]) && (value <= range[1])\n })\n\n return filteredData\n}\n\nexport function isNumberWithinRange (value: number, range: [number, number]): boolean {\n return (value >= range[0]) && (value <= range[1])\n}\n\nexport const ensureArray = <T>(value: T | T[] | null): T[] => {\n if (value === null || value === undefined) {\n return []\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return [value]\n}\n"],"names":["_throttle"],"mappings":"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"}
1
+ {"version":3,"file":"data.js","sources":["../../src/utils/data.ts"],"sourcesContent":["import { max, min, mean, bisector } from 'd3-array'\nimport { throttle as _throttle } from 'throttle-debounce'\n\n// Types\nimport { NumericAccessor, StringAccessor, BooleanAccessor, ColorAccessor, GenericAccessor } from 'types/accessor'\nimport { StackValuesRecord } from 'types/data'\n\nexport const isNumber = <T>(a: T): a is T extends number ? T : never => typeof a === 'number'\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isFunction = <T>(a: T): a is T extends Function ? T : never => typeof a === 'function'\nexport const isUndefined = <T>(a: T): a is T extends undefined ? T : never => a === undefined\nexport const isNil = <T>(a: T): a is null | undefined => a == null\nexport const isString = <T>(a: T): a is T extends string ? T : never => typeof a === 'string'\nexport const isArray = <T>(a: T): a is T extends any[] ? T : never => Array.isArray(a)\nexport const isObject = <T>(a: T): boolean => (a instanceof Object)\nexport const isAClassInstance = <T>(a: T): boolean => a.constructor.name !== 'Function' && a.constructor.name !== 'Object'\nexport const isPlainObject = <T>(a: T): boolean => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a)\n\nexport const isEmpty = <T>(obj: T): boolean => {\n return [Object, Array].includes((obj || {}).constructor as ArrayConstructor | ObjectConstructor) &&\n !Object.entries((obj || {})).length\n}\n\n// Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license\nexport const isEqual = (\n a: unknown | null | undefined,\n b: unknown | null | undefined,\n skipKeys: string[] = [],\n visited: Set<any> = new Set()\n): boolean => {\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqual(a[i], b[i], skipKeys, visited)) return false\n }\n\n return true\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n }\n\n if (typeof a === 'object' && a !== null && b !== null) {\n if (!(typeof b === 'object')) return false\n if (a === b) return true\n\n const keysA = Object.keys(a).filter(key => !skipKeys.includes(key))\n const keysB = Object.keys(b).filter(key => !skipKeys.includes(key))\n\n if (keysA.length !== keysB.length) return false\n\n if (visited.has(a)) return true\n else visited.add(a)\n\n for (const key of keysA) {\n if (!isEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key], skipKeys, visited)) return false\n }\n\n return true\n }\n\n return a === b\n}\n\nexport const without = <T>(arr: Array<T>, ...args: T[]): Array<T> => arr.filter(item => !args.includes(item))\nexport const flatten = <T>(arr: Array<T | T[]>): Array<T> => arr.flat() as T[]\nexport const cloneDeep = <T>(obj: T, stack: Map<any, any> = new Map()): T => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T\n }\n\n if (obj instanceof Array) {\n const clone: unknown[] = []\n stack.set(obj, clone)\n for (const item of obj) {\n clone.push(stack.has(item) ? stack.get(item) : cloneDeep(item, stack))\n }\n return clone as unknown as T\n }\n\n // Class instances will be copied without cloning\n if (isAClassInstance(obj)) {\n const clone = obj\n return clone\n }\n\n if (obj instanceof Object) {\n const clone = {} as T\n stack.set(obj, clone)\n const objAsRecord = obj as Record<string | number, unknown>\n Object.keys(obj)\n .reduce((newObj: typeof objAsRecord, key: string | number): typeof objAsRecord => {\n newObj[key] = stack.has(objAsRecord[key]) ? stack.get(objAsRecord[key]) : cloneDeep(objAsRecord[key], stack)\n return newObj\n }, clone as typeof objAsRecord)\n\n return clone\n }\n\n return obj\n}\n\n\nexport const merge = <T, K>(obj1: T, obj2: K, visited: Map<any, any> = new Map()): T & K => {\n type Rec = Record<string | number, unknown>\n\n if (!obj1 || !obj2) return obj1 as T & K\n if ((obj1 as unknown) === (obj2 as unknown)) return obj1 as T & K\n\n const newObj = (isAClassInstance(obj1 as Rec) ? obj1 : cloneDeep(obj1)) as T & K\n\n // Taking care of recursive structures\n if (visited.has(obj2)) return visited.get(obj2)\n else visited.set(obj2, newObj)\n\n Object.keys(obj2 as Rec).forEach(key => {\n // Preventing prototype pollution\n if (key === '__proto__' || key === 'constructor') return\n\n if (isPlainObject((obj1 as Rec)[key]) && isPlainObject((obj2 as Rec)[key])) {\n (newObj as Rec)[key] = merge((obj1 as Rec)[key], (obj2 as Rec)[key], visited)\n } else if (isAClassInstance(obj2 as Rec)) {\n (newObj as Rec)[key] = obj2\n } else {\n (newObj as Rec)[key] = cloneDeep((obj2 as Rec)[key])\n }\n })\n\n return newObj\n}\n\nexport const omit = <T extends Record<string | number | symbol, unknown>>(obj: T, props: Array<keyof T>): Partial<T> => {\n obj = { ...obj }\n props.forEach(prop => delete obj[prop])\n return obj\n}\n\nexport const groupBy = <T extends Record<string | number, any>> (arr: T[], accessor: (a: T, index: number) => string | number): Record<string | number, T[]> => {\n return arr.reduce(\n (grouped, v, i, a, k = accessor(v, i)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)),\n {} as Record<string | number, T[]>\n )\n}\n\nexport const sortBy = <T>(arr: Array<T>, accessor: (a: T) => string | number): Array<T> => {\n return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first\n .sort((a, b): number => {\n return (accessor(a) > accessor(b)) ? 1 : ((accessor(b) > accessor(a)) ? -1 : 0)\n })\n}\n\nexport const throttle = <T extends (...args: any[]) => any>(\n f: T,\n delay: number,\n options?: {\n noTrailing?: boolean;\n noLeading?: boolean;\n debounceMode?: boolean;\n }\n): _throttle<T> => _throttle(delay, f, options)\n\nexport function getValue<T, ReturnType> (\n d: T,\n accessor: NumericAccessor<T> | StringAccessor<T> | BooleanAccessor<T> | ColorAccessor<T> | GenericAccessor<ReturnType, T>,\n index?: number\n): ReturnType {\n // eslint-disable-next-line @typescript-eslint/ban-types\n if (isFunction(accessor)) return (accessor as Function)(d, index) as (ReturnType | null | undefined)\n else return accessor as unknown as (ReturnType | null | undefined)\n}\n\nexport function getString<T> (d: T, accessor: StringAccessor<T>, i?: number): string | null | undefined {\n return getValue<T, string>(d, accessor, i)\n}\n\nexport function getNumber<T> (d: T, accessor: NumericAccessor<T>, i?: number): number | null | undefined {\n return getValue<T, number>(d, accessor, i)\n}\n\nexport function getBoolean<T> (d: T, accessor: BooleanAccessor<T>, i?: number): boolean | null | undefined {\n return getValue<T, boolean>(d, accessor, i)\n}\n\nexport function clean<T> (data: T[]): T[] {\n return data.filter(d => d && !isNumber(d))\n}\n\nexport function clamp (d: number, min: number, max: number): number {\n return Math.min(Math.max(d, min), max)\n}\n\nexport function unique<T> (array: T[]): T[] {\n return Array.from(new Set(array))\n}\n\nexport function countUnique<T> (array: T[], accessor = (d: unknown) => d): number {\n return new Set(array.map(d => accessor(d))).size\n}\n\nexport function arrayOfIndices (n: number): number[] {\n return [...Array(n).keys()]\n}\n\nexport function shallowDiff (o1: Record<string, unknown> = {}, o2: Record<string, unknown> = {}): Record<string, unknown> {\n return Object.keys(o2).reduce((diff, key) => {\n if (o1[key] === o2[key]) return diff\n return {\n ...diff,\n [key]: o2[key],\n }\n }, {})\n}\n\nexport function getStackedExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n if (!data) return [undefined, undefined]\n if (isArray(acs)) {\n let minValue = 0\n let maxValue = 0\n data.forEach((d, i) => {\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) positiveStack += value\n else negativeStack += value\n }\n\n if (positiveStack > maxValue) maxValue = positiveStack\n if (negativeStack < minValue) minValue = negativeStack\n })\n return [minValue, maxValue]\n }\n}\n\nexport function getStackedValues<Datum> (d: Datum, index: number, ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n const values = []\n\n let positiveStack = 0\n let negativeStack = 0\n for (const a of acs as NumericAccessor<Datum>[]) {\n const value = getNumber(d, a, index) || 0\n if (value >= 0) {\n values.push(positiveStack += value)\n } else {\n values.push(negativeStack += value)\n }\n }\n\n return values\n}\n\nexport function getStackedData<Datum> (\n data: Datum[],\n baseline: NumericAccessor<Datum>,\n acs: NumericAccessor<Datum>[],\n prevNegative?: boolean[] // to help guessing the stack direction (positive/negative) when the values are 0 or null\n): StackValuesRecord[] {\n const baselineValues = data.map((d, i) => getNumber(d, baseline, i) || 0)\n const isNegativeStack = acs.map((a, j) => {\n const average = mean(data, (d, i) => getNumber(d, a, i) || 0)\n return (average === 0 && Array.isArray(prevNegative)) ? prevNegative[j] : average < 0\n })\n\n const stackedData = acs.map(() => [] as StackValuesRecord)\n data.forEach((d, i) => {\n let positiveStack = baselineValues[i]\n let negativeStack = baselineValues[i]\n acs.forEach((a, j) => {\n const value = getNumber(d, a, i) || 0\n if (value >= 0) {\n stackedData[j].push([positiveStack, positiveStack += value])\n } else {\n stackedData[j].push([negativeStack, negativeStack += value])\n }\n })\n })\n\n // Fill in additional stack information\n stackedData.forEach((stack, i) => {\n stack.isMostlyNegative = isNegativeStack[i]\n })\n\n return stackedData\n}\n\nexport function getMin<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const minValue = min(data, (d, i) => min(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return minValue\n}\n\nexport function getMax<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): number | undefined {\n if (!data) return undefined\n const maxValue = max(data, (d, i) => max(acs as NumericAccessor<Datum>[], a => getNumber(d, a, i)))\n return maxValue\n}\n\nexport function getExtent<Datum> (data: Datum[], ...acs: NumericAccessor<Datum>[]): (number | undefined)[] {\n return [getMin(data, ...acs), getMax(data, ...acs)]\n}\n\nexport function getNearest<Datum> (data: Datum[], value: number, accessor: NumericAccessor<Datum>): Datum {\n if (data.length <= 1) return data[0]\n\n const values = data.map((d, i) => getNumber(d, accessor, i))\n values.sort((a, b) => a - b)\n\n const xBisector = bisector(d => d).left\n const index = xBisector(values, value, 1, data.length - 1)\n return value - values[index - 1] > values[index] - value ? data[index] : data[index - 1]\n}\n\nexport function filterDataByRange<Datum> (data: Datum[], range: [number, number], accessor: NumericAccessor<Datum>): Datum[] {\n const filteredData = data.filter((d, i) => {\n const value = getNumber(d, accessor, i)\n return (value >= range[0]) && (value <= range[1])\n })\n\n return filteredData\n}\n\nexport function isNumberWithinRange (value: number, range: [number, number]): boolean {\n return (value >= range[0]) && (value <= range[1])\n}\n\nexport const ensureArray = <T>(value: T | T[] | null): T[] => {\n if (value === null || value === undefined) {\n return []\n }\n\n if (Array.isArray(value)) {\n return value\n }\n\n return [value]\n}\n"],"names":["_throttle"],"mappings":"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"}
package/utils/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  export { arrayOfIndices, clamp, clean, cloneDeep, countUnique, ensureArray, filterDataByRange, flatten, getBoolean, getExtent, getMax, getMin, getNearest, getNumber, getStackedData, getStackedExtent, getStackedValues, getString, getValue, groupBy, isAClassInstance, isArray, isEmpty, isEqual, isFunction, isNil, isNumber, isNumberWithinRange, isObject, isPlainObject, isString, isUndefined, merge, omit, shallowDiff, sortBy, throttle, unique, without } from './data.js';
2
- export { allowedSvgTextTags, escapeStringKeepHash, estimateStringPixelLength, estimateTextSize, estimateWrappedTextHeight, getPreciseStringLengthPx, getWrappedText, kebabCase, kebabCaseToCamel, renderTextIntoFrame, renderTextToSvgTextElement, splitString, trimSVGText, trimString, trimStringEnd, trimStringMiddle, trimStringStart, wrapSVGText } from './text.js';
2
+ export { allowedSvgTextTags, escapeStringKeepHash, estimateStringPixelLength, estimateTextSize, estimateWrappedTextHeight, getPreciseStringLengthPx, getWrappedText, kebabCase, kebabCaseToCamel, renderTextIntoFrame, renderTextToSvgTextElement, splitString, textAlignToAnchor, trimSVGText, trimString, trimStringEnd, trimStringMiddle, trimStringStart, wrapSVGText } from './text.js';
3
3
  export { allowedSvgTags, getTransformValues, isStringSvg, sanitizeSvgString, transformValuesToString } from './svg.js';
4
- export { getColor, getHexValue, hexToBrightness, hexToRgb, rgbToBrightness, rgbaToRgb } from './color.js';
5
- export { circlePath, convertLineToArc, polygon, roundedRectPath, scoreRectPath } from './path.js';
4
+ export { brighter, getColor, getHexValue, hexToBrightness, hexToRgb, isDarkBackground, rgbToBrightness, rgbaToRgb } from './color.js';
5
+ export { arrowPolylinePath, circlePath, convertLineToArc, polygon, roundedRectPath, scoreRectPath } from './path.js';
6
6
  export { getCSSVariableValue, getCSSVariableValueInPixels, getHref, getPixelValue, guid, isStringCSSVariable, parseUnit, rectIntersect, stringToHtmlId } from './misc.js';
7
7
  import './type.js';
8
8
  export { DefaultRange } from './scale.js';
package/utils/path.d.ts CHANGED
@@ -23,3 +23,11 @@ export declare type ScoreRectPathOptions = {
23
23
  };
24
24
  export declare function scoreRectPath({ x, y, w, h, r, score }: ScoreRectPathOptions): string;
25
25
  export declare function convertLineToArc(path: Path | string, r: number): string;
26
+ /**
27
+ * Generate an SVG path string for an arrow that follows a polyline path.
28
+ * The arrow is composed of line segments between points and a triangular arrowhead at the end.
29
+ *
30
+ * @param opts - ArrowPolylinePathOptions object containing array of points and optional head dimensions.
31
+ * @returns SVG path string for the arrow.
32
+ */
33
+ export declare function arrowPolylinePath(points: [number, number][], arrowHeadLength?: number, arrowHeadWidth?: number, smoothing?: number): string;
package/utils/path.js CHANGED
@@ -147,7 +147,110 @@ function scoreRectPath({ x, y, w, h, r = 0, score = 1 }) {
147
147
  */
148
148
  function convertLineToArc(path, r) {
149
149
  return path.toString().replace(/L(?<x>-?\d*\.?\d*),(?<y>-?\d+\.?\d*)/gm, (_, x, y) => `A ${r} ${r} 0 0 0 ${x} ${y}`);
150
+ }
151
+ /**
152
+ * Generate an SVG path string for an arrow that follows a polyline path.
153
+ * The arrow is composed of line segments between points and a triangular arrowhead at the end.
154
+ *
155
+ * @param opts - ArrowPolylinePathOptions object containing array of points and optional head dimensions.
156
+ * @returns SVG path string for the arrow.
157
+ */
158
+ function arrowPolylinePath(points, arrowHeadLength = 10, arrowHeadWidth = 6, smoothing = 5) {
159
+ if (points.length < 2)
160
+ return '';
161
+ // Calculate total path length
162
+ let totalLength = 0;
163
+ for (let i = 0; i < points.length - 1; i++) {
164
+ const [x1, y1] = points[i];
165
+ const [x2, y2] = points[i + 1];
166
+ totalLength += Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
167
+ }
168
+ // If the total length is zero or nearly zero, don't draw anything
169
+ if (totalLength === 0)
170
+ return '';
171
+ // Let the default values be modifiable based on the line length
172
+ let headLength = arrowHeadLength;
173
+ let headWidth = arrowHeadWidth;
174
+ // If the line is very short, scale down the arrow head dimensions
175
+ const threshold = arrowHeadLength * 2;
176
+ if (totalLength < threshold) {
177
+ const scale = totalLength / threshold;
178
+ headLength *= scale;
179
+ headWidth *= scale;
180
+ }
181
+ // Ensure the arrow head length is never longer than the line itself
182
+ headLength = Math.min(headLength / 2, totalLength);
183
+ // Get the last two points for arrowhead calculation
184
+ const [lastX, lastY] = points[points.length - 1];
185
+ const [prevX, prevY] = points[points.length - 2];
186
+ // Calculate direction vector for the last segment
187
+ const dx = lastX - prevX;
188
+ const dy = lastY - prevY;
189
+ const segmentLength = Math.sqrt(dx * dx + dy * dy);
190
+ const ux = dx / segmentLength;
191
+ const uy = dy / segmentLength;
192
+ // Tail point of the arrow (where the arrowhead starts)
193
+ const tailX = lastX - headLength * ux;
194
+ const tailY = lastY - headLength * uy;
195
+ // Perpendicular vector for arrowhead width calculation
196
+ const perpX = -uy;
197
+ const perpY = ux;
198
+ // Calculate the two base points of the arrowhead triangle
199
+ const leftX = tailX + (headWidth / 2) * perpX;
200
+ const leftY = tailY + (headWidth / 2) * perpY;
201
+ const rightX = tailX - (headWidth / 2) * perpX;
202
+ const rightY = tailY - (headWidth / 2) * perpY;
203
+ // Build the path
204
+ const pathParts = [];
205
+ if (points.length === 2) {
206
+ // For a single segment, create a curved path
207
+ const [startX, startY] = points[0];
208
+ // Calculate control points for a cubic Bézier curve with absolute smoothing
209
+ const cp1x = startX + ux * smoothing;
210
+ const cp1y = startY + uy * smoothing + perpY * smoothing * 0.5;
211
+ const cp2x = tailX - ux * smoothing;
212
+ const cp2y = tailY - uy * smoothing + perpY * smoothing * 0.5;
213
+ // Start path and add cubic Bézier curve
214
+ pathParts.push(`M${startX},${startY}`);
215
+ pathParts.push(`C${cp1x},${cp1y} ${cp2x},${cp2y} ${lastX},${lastY}`);
216
+ }
217
+ else {
218
+ // For multiple segments, use smooth Bézier corners with absolute smoothing
219
+ pathParts.push(`M${points[0][0]},${points[0][1]}`);
220
+ for (let i = 0; i < points.length - 2; i++) {
221
+ const [x1, y1] = points[i];
222
+ const [x2, y2] = points[i + 1];
223
+ const [x3, y3] = points[i + 2];
224
+ // Calculate vectors for the current and next segment
225
+ const v1x = x2 - x1;
226
+ const v1y = y2 - y1;
227
+ const v2x = x3 - x2;
228
+ const v2y = y3 - y2;
229
+ // Calculate lengths of segments
230
+ const len1 = Math.sqrt(v1x * v1x + v1y * v1y);
231
+ const len2 = Math.sqrt(v2x * v2x + v2y * v2y);
232
+ // Calculate unit vectors
233
+ const u1x = v1x / len1;
234
+ const u1y = v1y / len1;
235
+ const u2x = v2x / len2;
236
+ const u2y = v2y / len2;
237
+ // Calculate the corner points and control points with absolute smoothing
238
+ const corner1x = x2 - u1x * smoothing;
239
+ const corner1y = y2 - u1y * smoothing;
240
+ const corner2x = x2 + u2x * smoothing;
241
+ const corner2y = y2 + u2y * smoothing;
242
+ // Add line to approach point
243
+ pathParts.push(`L${corner1x},${corner1y}`);
244
+ // Add cubic Bézier curve for the corner
245
+ pathParts.push(`C${x2},${y2} ${x2},${y2} ${corner2x},${corner2y}`);
246
+ }
247
+ // Add the final line segment to the tail point
248
+ pathParts.push(`L${lastX},${lastY}`);
249
+ }
250
+ // Add the arrowhead
251
+ pathParts.push(`M${leftX},${leftY} L${lastX},${lastY} L${rightX},${rightY}`);
252
+ return pathParts.join(' ');
150
253
  }
151
254
 
152
- export { circlePath, convertLineToArc, polygon, roundedRectPath, scoreRectPath };
255
+ export { arrowPolylinePath, circlePath, convertLineToArc, polygon, roundedRectPath, scoreRectPath };
153
256
  //# sourceMappingURL=path.js.map
package/utils/path.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"path.js","sources":["../../src/utils/path.ts"],"sourcesContent":["import { range, min, max } from 'd3-array'\nimport { line, curveCardinal, curveCardinalClosed } from 'd3-shape'\nimport { Path } from 'd3-path'\n\n// Utils\nimport { clamp } from 'utils/data'\n\nexport type RoundedRectPathOptions = {\n x: number;\n y: number;\n w: number;\n h: number;\n r: number;\n tl: boolean;\n tr: boolean;\n bl: boolean;\n br: boolean;\n}\n\n/*\n * Generate SVG path for rectangle with rounded corners\n *\n * @param {Object} props - Configuration object\n * @param {Number} props.x - Rect top left X coordinate\n * @param {Number} props.y - Rect top left Y coordinate\n * @param {Number} props.w - Rect width\n * @param {Number} props.h - Rect height\n * @param {Bool} [props.tl=false] - Round top left corner\n * @param {Bool} [props.tr=false] - Round top right corner\n * @param {Bool} [props.bl=false] - Round bottom left corner\n * @param {Bool} [props.br=false] - Round bottom right corner\n * @param {Number} [props.r=0] - Corner Radius\n * @return {String} Path string for the `d` attribute\n */\nexport function roundedRectPath ({\n x,\n y,\n w,\n h,\n tl = false,\n tr = false,\n bl = false,\n br = false,\n r = 0,\n}: RoundedRectPathOptions): string {\n let path\n path = `M${x + r},${y}h${w - 2 * r}`\n\n let roundedR = tr ? r : 0\n let angularR = tr ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${roundedR},${roundedR}`\n path += `h${angularR}v${angularR}`\n path += `v${h - 2 * r}`\n\n roundedR = br ? r : 0\n angularR = br ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${-roundedR},${roundedR}`\n path += `v${angularR}h${-angularR}`\n path += `h${2 * r - w}`\n\n roundedR = bl ? r : 0\n angularR = bl ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${-roundedR},${-roundedR}`\n path += `h${-angularR}v${-angularR}`\n path += `v${2 * r - h}`\n\n roundedR = tl ? r : 0\n angularR = tl ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${roundedR},${-roundedR}`\n path += `v${-angularR}h${angularR}`\n\n path += 'z'\n return path\n}\n\nexport function polygon (size: number, n = 6, endAngle = 2 * Math.PI, open = false): string {\n const r = n === 4 ? Math.sqrt(0.5) * size : size / 3.6 * 2\n const deltaAngle = n === 4 ? Math.PI / 4 : 0 // rotate to 45 grads if shape is a rectangle\n const shiftedEndAngle = endAngle - deltaAngle\n\n const completion = (shiftedEndAngle < 0 ? endAngle : shiftedEndAngle) / (2 * Math.PI)\n const nSegments = Math.ceil(n * completion)\n\n const centerAngle = 1 / n * Math.PI * 2 // /\\\n const baseAngle = (Math.PI - centerAngle) / 2 // /__\\\n\n const data = range(nSegments + (shiftedEndAngle >= 0 ? 1 : 0))\n .map((d, i) => {\n const isLastSegment = i === nSegments || (nSegments === 1 && shiftedEndAngle < 0)\n let mult = isLastSegment ? ((completion * n) % 1 || 1) : 1 // Handle partial shape\n if (shiftedEndAngle < 0) {\n mult += 0.5\n }\n const angle = centerAngle * (i - 1 + mult)\n\n let radius\n if (isLastSegment) {\n const thirdAngle = Math.PI - baseAngle - centerAngle * mult\n radius = r * Math.sin(baseAngle) / Math.sin(thirdAngle) // Law of sines\n } else {\n radius = r\n }\n\n return {\n x: Math.sin(angle + deltaAngle) * radius,\n y: -Math.cos(angle + deltaAngle) * radius,\n }\n })\n\n if (n === 4) {\n const angle = centerAngle * (-1 + 0.5)\n const thirdAngle = Math.PI * 0.5\n const radius = r * Math.sin(baseAngle) / Math.sin(thirdAngle) // Law of sines\n data.unshift({\n x: Math.sin(angle + deltaAngle) * radius,\n y: -Math.cos(angle + deltaAngle) * radius,\n })\n }\n\n const path = line<any>()\n /* eslint-disable-next-line dot-notation */\n .x(d => d['x'])\n /* eslint-disable-next-line dot-notation */\n .y(d => d['y'])\n .curve((open ? curveCardinal : curveCardinalClosed).tension(0.95))\n\n return path(data)\n}\n\nexport function circlePath (cx: number, cy: number, r: number): string {\n return `\n M ${cx} ${cy}\n m ${-r}, 0\n a ${r},${r} 0 1,1 ${r * 2},0\n a ${r},${r} 0 1,1 ${-r * 2},0`\n}\n\nexport type ScoreRectPathOptions = {\n x: number;\n y: number;\n w: number;\n h: number;\n r: number;\n score: number;\n}\n\nexport function scoreRectPath ({ x, y, w, h, r = 0, score = 1 }: ScoreRectPathOptions): string {\n let path\n const side = 1 / 4\n const halfSide = side / 2\n let part = score\n\n // 8 1\n // - -\n // 7 | | 2\n // 6 | | 3\n // - -\n // 5 4\n\n // 1\n const hLength = min([w * 0.5 * (part / halfSide) + r, w * 0.5 - r])\n path = `M${x + w * 0.5},${y}h${hLength}`\n\n // 2, 3\n part = score - 1 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${r},${r}`\n const vLength = clamp(h * (part / side) - r, 0, h - 2 * r)\n path += `v${vLength}`\n }\n\n // 4, 5\n part = score - 3 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${-r},${r}`\n const hLength = clamp(r - w * (part / side), 2 * r - w, 0)\n path += `h${hLength}`\n }\n\n // 6, 7\n part = score - 5 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${-r},${-r}`\n const vLength = clamp(r - h * (part / side), 2 * r - h, 0)\n path += `v${vLength}`\n }\n\n // 8\n part = score - 7 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${r},${-r}`\n const hLength = max([w * 0.5 * (part / halfSide) - r, 0])\n path += `h${hLength}`\n }\n\n return path\n}\n\n/*\n * Replace L path command with arc with specified radius\n * @param {String} path - the path string\n * @param {number} r - radius in pixels\n * @returns {String} new path string\n */\nexport function convertLineToArc (path: Path | string, r: number): string {\n return path.toString().replace(/L(?<x>-?\\d*\\.?\\d*),(?<y>-?\\d+\\.?\\d*)/gm, (_, x, y) => `A ${r} ${r} 0 0 0 ${x} ${y}`)\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"path.js","sources":["../../src/utils/path.ts"],"sourcesContent":["import { range, min, max } from 'd3-array'\nimport { line, curveCardinal, curveCardinalClosed } from 'd3-shape'\nimport { Path } from 'd3-path'\n\n// Utils\nimport { clamp } from 'utils/data'\n\nexport type RoundedRectPathOptions = {\n x: number;\n y: number;\n w: number;\n h: number;\n r: number;\n tl: boolean;\n tr: boolean;\n bl: boolean;\n br: boolean;\n}\n\n/*\n * Generate SVG path for rectangle with rounded corners\n *\n * @param {Object} props - Configuration object\n * @param {Number} props.x - Rect top left X coordinate\n * @param {Number} props.y - Rect top left Y coordinate\n * @param {Number} props.w - Rect width\n * @param {Number} props.h - Rect height\n * @param {Bool} [props.tl=false] - Round top left corner\n * @param {Bool} [props.tr=false] - Round top right corner\n * @param {Bool} [props.bl=false] - Round bottom left corner\n * @param {Bool} [props.br=false] - Round bottom right corner\n * @param {Number} [props.r=0] - Corner Radius\n * @return {String} Path string for the `d` attribute\n */\nexport function roundedRectPath ({\n x,\n y,\n w,\n h,\n tl = false,\n tr = false,\n bl = false,\n br = false,\n r = 0,\n}: RoundedRectPathOptions): string {\n let path\n path = `M${x + r},${y}h${w - 2 * r}`\n\n let roundedR = tr ? r : 0\n let angularR = tr ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${roundedR},${roundedR}`\n path += `h${angularR}v${angularR}`\n path += `v${h - 2 * r}`\n\n roundedR = br ? r : 0\n angularR = br ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${-roundedR},${roundedR}`\n path += `v${angularR}h${-angularR}`\n path += `h${2 * r - w}`\n\n roundedR = bl ? r : 0\n angularR = bl ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${-roundedR},${-roundedR}`\n path += `h${-angularR}v${-angularR}`\n path += `v${2 * r - h}`\n\n roundedR = tl ? r : 0\n angularR = tl ? 0 : r\n path += `a${roundedR},${roundedR} 0 0 1 ${roundedR},${-roundedR}`\n path += `v${-angularR}h${angularR}`\n\n path += 'z'\n return path\n}\n\nexport function polygon (size: number, n = 6, endAngle = 2 * Math.PI, open = false): string {\n const r = n === 4 ? Math.sqrt(0.5) * size : size / 3.6 * 2\n const deltaAngle = n === 4 ? Math.PI / 4 : 0 // rotate to 45 grads if shape is a rectangle\n const shiftedEndAngle = endAngle - deltaAngle\n\n const completion = (shiftedEndAngle < 0 ? endAngle : shiftedEndAngle) / (2 * Math.PI)\n const nSegments = Math.ceil(n * completion)\n\n const centerAngle = 1 / n * Math.PI * 2 // /\\\n const baseAngle = (Math.PI - centerAngle) / 2 // /__\\\n\n const data = range(nSegments + (shiftedEndAngle >= 0 ? 1 : 0))\n .map((d, i) => {\n const isLastSegment = i === nSegments || (nSegments === 1 && shiftedEndAngle < 0)\n let mult = isLastSegment ? ((completion * n) % 1 || 1) : 1 // Handle partial shape\n if (shiftedEndAngle < 0) {\n mult += 0.5\n }\n const angle = centerAngle * (i - 1 + mult)\n\n let radius\n if (isLastSegment) {\n const thirdAngle = Math.PI - baseAngle - centerAngle * mult\n radius = r * Math.sin(baseAngle) / Math.sin(thirdAngle) // Law of sines\n } else {\n radius = r\n }\n\n return {\n x: Math.sin(angle + deltaAngle) * radius,\n y: -Math.cos(angle + deltaAngle) * radius,\n }\n })\n\n if (n === 4) {\n const angle = centerAngle * (-1 + 0.5)\n const thirdAngle = Math.PI * 0.5\n const radius = r * Math.sin(baseAngle) / Math.sin(thirdAngle) // Law of sines\n data.unshift({\n x: Math.sin(angle + deltaAngle) * radius,\n y: -Math.cos(angle + deltaAngle) * radius,\n })\n }\n\n const path = line<any>()\n /* eslint-disable-next-line dot-notation */\n .x(d => d['x'])\n /* eslint-disable-next-line dot-notation */\n .y(d => d['y'])\n .curve((open ? curveCardinal : curveCardinalClosed).tension(0.95))\n\n return path(data)\n}\n\nexport function circlePath (cx: number, cy: number, r: number): string {\n return `\n M ${cx} ${cy}\n m ${-r}, 0\n a ${r},${r} 0 1,1 ${r * 2},0\n a ${r},${r} 0 1,1 ${-r * 2},0`\n}\n\nexport type ScoreRectPathOptions = {\n x: number;\n y: number;\n w: number;\n h: number;\n r: number;\n score: number;\n}\n\nexport function scoreRectPath ({ x, y, w, h, r = 0, score = 1 }: ScoreRectPathOptions): string {\n let path\n const side = 1 / 4\n const halfSide = side / 2\n let part = score\n\n // 8 1\n // - -\n // 7 | | 2\n // 6 | | 3\n // - -\n // 5 4\n\n // 1\n const hLength = min([w * 0.5 * (part / halfSide) + r, w * 0.5 - r])\n path = `M${x + w * 0.5},${y}h${hLength}`\n\n // 2, 3\n part = score - 1 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${r},${r}`\n const vLength = clamp(h * (part / side) - r, 0, h - 2 * r)\n path += `v${vLength}`\n }\n\n // 4, 5\n part = score - 3 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${-r},${r}`\n const hLength = clamp(r - w * (part / side), 2 * r - w, 0)\n path += `h${hLength}`\n }\n\n // 6, 7\n part = score - 5 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${-r},${-r}`\n const vLength = clamp(r - h * (part / side), 2 * r - h, 0)\n path += `v${vLength}`\n }\n\n // 8\n part = score - 7 / 8\n if (part > 0) {\n path += `a${r},${r} 0 0 1 ${r},${-r}`\n const hLength = max([w * 0.5 * (part / halfSide) - r, 0])\n path += `h${hLength}`\n }\n\n return path\n}\n\n/*\n * Replace L path command with arc with specified radius\n * @param {String} path - the path string\n * @param {number} r - radius in pixels\n * @returns {String} new path string\n */\nexport function convertLineToArc (path: Path | string, r: number): string {\n return path.toString().replace(/L(?<x>-?\\d*\\.?\\d*),(?<y>-?\\d+\\.?\\d*)/gm, (_, x, y) => `A ${r} ${r} 0 0 0 ${x} ${y}`)\n}\n\n/**\n * Generate an SVG path string for an arrow that follows a polyline path.\n * The arrow is composed of line segments between points and a triangular arrowhead at the end.\n *\n * @param opts - ArrowPolylinePathOptions object containing array of points and optional head dimensions.\n * @returns SVG path string for the arrow.\n */\nexport function arrowPolylinePath (\n points: [number, number][],\n arrowHeadLength = 10,\n arrowHeadWidth = 6,\n smoothing = 5\n): string {\n if (points.length < 2) return ''\n\n // Calculate total path length\n let totalLength = 0\n for (let i = 0; i < points.length - 1; i++) {\n const [x1, y1] = points[i]\n const [x2, y2] = points[i + 1]\n totalLength += Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2))\n }\n\n // If the total length is zero or nearly zero, don't draw anything\n if (totalLength === 0) return ''\n\n // Let the default values be modifiable based on the line length\n let headLength = arrowHeadLength\n let headWidth = arrowHeadWidth\n\n // If the line is very short, scale down the arrow head dimensions\n const threshold = arrowHeadLength * 2\n if (totalLength < threshold) {\n const scale = totalLength / threshold\n headLength *= scale\n headWidth *= scale\n }\n\n // Ensure the arrow head length is never longer than the line itself\n headLength = Math.min(headLength / 2, totalLength)\n\n // Get the last two points for arrowhead calculation\n const [lastX, lastY] = points[points.length - 1]\n const [prevX, prevY] = points[points.length - 2]\n\n // Calculate direction vector for the last segment\n const dx = lastX - prevX\n const dy = lastY - prevY\n const segmentLength = Math.sqrt(dx * dx + dy * dy)\n const ux = dx / segmentLength\n const uy = dy / segmentLength\n\n // Tail point of the arrow (where the arrowhead starts)\n const tailX = lastX - headLength * ux\n const tailY = lastY - headLength * uy\n\n // Perpendicular vector for arrowhead width calculation\n const perpX = -uy\n const perpY = ux\n\n // Calculate the two base points of the arrowhead triangle\n const leftX = tailX + (headWidth / 2) * perpX\n const leftY = tailY + (headWidth / 2) * perpY\n const rightX = tailX - (headWidth / 2) * perpX\n const rightY = tailY - (headWidth / 2) * perpY\n\n // Build the path\n const pathParts = []\n\n if (points.length === 2) {\n // For a single segment, create a curved path\n const [startX, startY] = points[0]\n\n // Calculate control points for a cubic Bézier curve with absolute smoothing\n const cp1x = startX + ux * smoothing\n const cp1y = startY + uy * smoothing + perpY * smoothing * 0.5\n\n const cp2x = tailX - ux * smoothing\n const cp2y = tailY - uy * smoothing + perpY * smoothing * 0.5\n\n // Start path and add cubic Bézier curve\n pathParts.push(`M${startX},${startY}`)\n pathParts.push(`C${cp1x},${cp1y} ${cp2x},${cp2y} ${lastX},${lastY}`)\n } else {\n // For multiple segments, use smooth Bézier corners with absolute smoothing\n pathParts.push(`M${points[0][0]},${points[0][1]}`)\n\n for (let i = 0; i < points.length - 2; i++) {\n const [x1, y1] = points[i]\n const [x2, y2] = points[i + 1]\n const [x3, y3] = points[i + 2]\n\n // Calculate vectors for the current and next segment\n const v1x = x2 - x1\n const v1y = y2 - y1\n const v2x = x3 - x2\n const v2y = y3 - y2\n\n // Calculate lengths of segments\n const len1 = Math.sqrt(v1x * v1x + v1y * v1y)\n const len2 = Math.sqrt(v2x * v2x + v2y * v2y)\n\n // Calculate unit vectors\n const u1x = v1x / len1\n const u1y = v1y / len1\n const u2x = v2x / len2\n const u2y = v2y / len2\n\n // Calculate the corner points and control points with absolute smoothing\n const corner1x = x2 - u1x * smoothing\n const corner1y = y2 - u1y * smoothing\n const corner2x = x2 + u2x * smoothing\n const corner2y = y2 + u2y * smoothing\n\n // Add line to approach point\n pathParts.push(`L${corner1x},${corner1y}`)\n\n // Add cubic Bézier curve for the corner\n pathParts.push(`C${x2},${y2} ${x2},${y2} ${corner2x},${corner2y}`)\n }\n\n // Add the final line segment to the tail point\n pathParts.push(`L${lastX},${lastY}`)\n }\n\n // Add the arrowhead\n pathParts.push(`M${leftX},${leftY} L${lastX},${lastY} L${rightX},${rightY}`)\n\n return pathParts.join(' ')\n}\n"],"names":[],"mappings":"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"}
package/utils/text.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Selection } from 'd3-selection';
2
- import { TrimMode, UnovisText, UnovisTextFrameOptions, UnovisTextOptions, UnovisWrappedText } from "../types/text";
2
+ import { TextAlign, TrimMode, UnovisText, UnovisTextFrameOptions, UnovisTextOptions, UnovisWrappedText } from "../types/text";
3
+ export declare const textAlignToAnchor: (textAlign: TextAlign) => string | null;
3
4
  /**
4
5
  * Converts a kebab-case string to camelCase.
5
6
  *
@@ -16,33 +17,33 @@ export declare function kebabCase(str: string): string;
16
17
  export declare function escapeStringKeepHash(str: string): string;
17
18
  /**
18
19
  * Trims the input string from the start, leaving only the specified maximum length.
19
- * @param {string} [str=''] - The input string to be trimmed.
20
+ * @param {string} str - The input string to be trimmed.
20
21
  * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.
21
22
  * @returns {string} - The trimmed string.
22
23
  */
23
- export declare function trimStringStart(str?: string, maxLength?: number): string;
24
+ export declare function trimStringStart(str: string | undefined, maxLength?: number): string;
24
25
  /**
25
26
  * Trims the input string from the middle, leaving only the specified maximum length.
26
- * @param {string} [str=''] - The input string to be trimmed.
27
+ * @param {string} str - The input string to be trimmed.
27
28
  * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.
28
29
  * @returns {string} - The trimmed string.
29
30
  */
30
- export declare function trimStringMiddle(str?: string, maxLength?: number): string;
31
+ export declare function trimStringMiddle(str: string | undefined, maxLength?: number): string;
31
32
  /**
32
33
  * Trims the input string from the end, leaving only the specified maximum length.
33
- * @param {string} [str=''] - The input string to be trimmed.
34
+ * @param {string} str - The input string to be trimmed.
34
35
  * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.
35
36
  * @returns {string} - The trimmed string.
36
37
  */
37
- export declare function trimStringEnd(str?: string, maxLength?: number): string;
38
+ export declare function trimStringEnd(str: string | undefined, maxLength?: number): string;
38
39
  /**
39
40
  * Trims the input string according to the specified trim mode.
40
- * @param {string} [str=''] - The input string to be trimmed.
41
+ * @param {string} str - The input string to be trimmed.
41
42
  * @param {number} [length=15] - The maximum allowed length of the trimmed string.
42
43
  * @param {TrimMode} [type=TrimMode.Middle] - The trim mode to be applied.
43
44
  * @returns {string} - The trimmed string.
44
45
  */
45
- export declare function trimString(str?: string, length?: number, type?: TrimMode): string;
46
+ export declare function trimString(str: string | undefined, length?: number, type?: TrimMode): string;
46
47
  /**
47
48
  * Splits the input string according to the specified separators.
48
49
  * @param {string} text - The input string to be split.
package/utils/text.js CHANGED
@@ -1,10 +1,18 @@
1
1
  import { sum } from 'd3-array';
2
2
  import striptags from 'striptags';
3
- import { TrimMode, VerticalAlign, TextAlign } from '../types/text.js';
3
+ import { TextAlign, TrimMode, VerticalAlign } from '../types/text.js';
4
4
  import { flatten, isArray, merge } from './data.js';
5
5
  import { getTextAnchorFromTextAlign } from '../types/svg.js';
6
6
  import { getFontWidthToHeightRatio, UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT, UNOVIS_TEXT_DEFAULT } from '../styles/index.js';
7
7
 
8
+ const textAlignToAnchor = (textAlign) => {
9
+ switch (textAlign) {
10
+ case TextAlign.Left: return 'start';
11
+ case TextAlign.Right: return 'end';
12
+ case TextAlign.Center: return 'middle';
13
+ default: return null;
14
+ }
15
+ };
8
16
  /**
9
17
  * Converts a kebab-case string to camelCase.
10
18
  *
@@ -36,40 +44,48 @@ function escapeStringKeepHash(str) {
36
44
  }
37
45
  /**
38
46
  * Trims the input string from the start, leaving only the specified maximum length.
39
- * @param {string} [str=''] - The input string to be trimmed.
47
+ * @param {string} str - The input string to be trimmed.
40
48
  * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.
41
49
  * @returns {string} - The trimmed string.
42
50
  */
43
- function trimStringStart(str = '', maxLength = 15) {
51
+ function trimStringStart(str, maxLength = 15) {
52
+ if (!str)
53
+ return '';
44
54
  return str.length > maxLength ? `…${str.substr(str.length - maxLength, maxLength)}` : str;
45
55
  }
46
56
  /**
47
57
  * Trims the input string from the middle, leaving only the specified maximum length.
48
- * @param {string} [str=''] - The input string to be trimmed.
58
+ * @param {string} str - The input string to be trimmed.
49
59
  * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.
50
60
  * @returns {string} - The trimmed string.
51
61
  */
52
- function trimStringMiddle(str = '', maxLength = 15) {
62
+ function trimStringMiddle(str, maxLength = 15) {
63
+ if (!str)
64
+ return '';
53
65
  const dist = Math.floor((maxLength - 3) / 2);
54
66
  return str.length > maxLength ? `${str.substr(0, dist)}…${str.substr(-dist, dist)}` : str;
55
67
  }
56
68
  /**
57
69
  * Trims the input string from the end, leaving only the specified maximum length.
58
- * @param {string} [str=''] - The input string to be trimmed.
70
+ * @param {string} str - The input string to be trimmed.
59
71
  * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.
60
72
  * @returns {string} - The trimmed string.
61
73
  */
62
- function trimStringEnd(str = '', maxLength = 15) {
74
+ function trimStringEnd(str, maxLength = 15) {
75
+ if (!str)
76
+ return '';
63
77
  return str.length > maxLength ? `${str.substr(0, maxLength)}…` : str;
64
78
  }
65
79
  /**
66
80
  * Trims the input string according to the specified trim mode.
67
- * @param {string} [str=''] - The input string to be trimmed.
81
+ * @param {string} str - The input string to be trimmed.
68
82
  * @param {number} [length=15] - The maximum allowed length of the trimmed string.
69
83
  * @param {TrimMode} [type=TrimMode.Middle] - The trim mode to be applied.
70
84
  * @returns {string} - The trimmed string.
71
85
  */
72
- function trimString(str = '', length = 15, type = TrimMode.Middle) {
86
+ function trimString(str, length = 15, type = TrimMode.Middle) {
87
+ if (!str)
88
+ return '';
73
89
  let result = trimStringEnd(str, length);
74
90
  if (type === TrimMode.Start)
75
91
  result = trimStringStart(str, length);
@@ -476,5 +492,5 @@ function renderTextIntoFrame(group, text, frameOptions) {
476
492
  group.appendChild(parsedSvgCode);
477
493
  }
478
494
 
479
- export { allowedSvgTextTags, escapeStringKeepHash, estimateStringPixelLength, estimateTextSize, estimateWrappedTextHeight, getPreciseStringLengthPx, getWrappedText, kebabCase, kebabCaseToCamel, renderTextIntoFrame, renderTextToSvgTextElement, splitString, trimSVGText, trimString, trimStringEnd, trimStringMiddle, trimStringStart, wrapSVGText };
495
+ export { allowedSvgTextTags, escapeStringKeepHash, estimateStringPixelLength, estimateTextSize, estimateWrappedTextHeight, getPreciseStringLengthPx, getWrappedText, kebabCase, kebabCaseToCamel, renderTextIntoFrame, renderTextToSvgTextElement, splitString, textAlignToAnchor, trimSVGText, trimString, trimStringEnd, trimStringMiddle, trimStringStart, wrapSVGText };
480
496
  //# sourceMappingURL=text.js.map