| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- /**
- * Get balanced dash-strokearray and dash-strokeoffset properties for a path of a given length.
- * @param length The length of the path.
- * @param strokeWidth The shape's stroke-width property.
- * @param style The stroke's style: "dashed" or "dotted" (default "dashed").
- * @param snap An interval for dashes (e.g. 4 will produce arrays with 4, 8, 16, etc dashes).
- */
- export function getPerfectDashProps(
- length: number,
- strokeWidth: number,
- style: 'dashed' | 'dotted' = 'dashed',
- snap = 1
- ): {
- strokeDasharray: string
- strokeDashoffset: string
- } {
- let dashLength: number
- let strokeDashoffset: string
- let ratio: number
-
- if (style === 'dashed') {
- dashLength = strokeWidth * 2
- ratio = 1
- strokeDashoffset = (dashLength / 2).toString()
- } else {
- dashLength = strokeWidth / 4
- ratio = 4
- strokeDashoffset = '0'
- }
-
- let dashes = Math.floor(length / dashLength / (2 * ratio))
- dashes -= dashes % snap
- if (dashes === 0) dashes = 1
-
- const gapLength = (length - dashes * dashLength) / dashes
-
- return {
- strokeDasharray: [dashLength, gapLength].join(' '),
- strokeDashoffset,
- }
- }
|