@furystack/shades
Version:
A lightweight UI framework for FuryStack with JSX support
438 lines (391 loc) • 12.4 kB
text/typescript
/**
* SVG element attribute types for JSX support.
*
* Unlike HTML elements where JSX props map to DOM properties, SVG elements
* use XML attributes set via `setAttribute`. These types describe the
* attribute-based API rather than the DOM property interfaces.
*/
import type { RefObject } from './models/render-options.js'
/**
* Common event handlers available on SVG elements.
*/
export type SvgEventHandlers = {
onclick?: (ev: MouseEvent) => void
ondblclick?: (ev: MouseEvent) => void
onmousedown?: (ev: MouseEvent) => void
onmouseup?: (ev: MouseEvent) => void
onmousemove?: (ev: MouseEvent) => void
onmouseenter?: (ev: MouseEvent) => void
onmouseleave?: (ev: MouseEvent) => void
onmouseover?: (ev: MouseEvent) => void
onmouseout?: (ev: MouseEvent) => void
onfocus?: (ev: FocusEvent) => void
onblur?: (ev: FocusEvent) => void
onkeydown?: (ev: KeyboardEvent) => void
onkeyup?: (ev: KeyboardEvent) => void
ontouchstart?: (ev: TouchEvent) => void
ontouchmove?: (ev: TouchEvent) => void
ontouchend?: (ev: TouchEvent) => void
}
/**
* SVG presentation attributes shared by most SVG elements.
* @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Presentation
*/
export type SvgPresentationAttributes = {
'clip-path'?: string
'clip-rule'?: 'nonzero' | 'evenodd'
color?: string
cursor?: string
display?: string
fill?: string
'fill-opacity'?: string | number
'fill-rule'?: 'nonzero' | 'evenodd'
filter?: string
'flood-color'?: string
'flood-opacity'?: string | number
'font-family'?: string
'font-size'?: string | number
'font-style'?: 'normal' | 'italic' | 'oblique'
'font-weight'?: string | number
'letter-spacing'?: string | number
'lighting-color'?: string
marker?: string
'marker-end'?: string
'marker-mid'?: string
'marker-start'?: string
mask?: string
opacity?: string | number
overflow?: string
'pointer-events'?: string
'shape-rendering'?: 'auto' | 'optimizeSpeed' | 'crispEdges' | 'geometricPrecision'
'stop-color'?: string
'stop-opacity'?: string | number
stroke?: string
'stroke-dasharray'?: string
'stroke-dashoffset'?: string | number
'stroke-linecap'?: 'butt' | 'round' | 'square'
'stroke-linejoin'?: 'arcs' | 'bevel' | 'miter' | 'miter-clip' | 'round'
'stroke-miterlimit'?: string | number
'stroke-opacity'?: string | number
'stroke-width'?: string | number
'text-anchor'?: 'start' | 'middle' | 'end'
'text-decoration'?: string
'dominant-baseline'?: string
'alignment-baseline'?: string
transform?: string
'transform-origin'?: string
visibility?: 'visible' | 'hidden' | 'collapse'
'word-spacing'?: string | number
}
/**
* Core attributes available on all SVG elements.
*/
export type SvgCoreAttributes = {
id?: string
className?: string
style?: Partial<CSSStyleDeclaration>
tabIndex?: number
ref?: RefObject<Element>
} & SvgPresentationAttributes &
SvgEventHandlers
// ---------------------------------------------------------------------------
// Element-specific attribute types
// ---------------------------------------------------------------------------
/** Attributes for the `<svg>` element. */
export type SvgSvgAttributes = SvgCoreAttributes & {
viewBox?: string
width?: string | number
height?: string | number
xmlns?: string
preserveAspectRatio?: string
x?: string | number
y?: string | number
}
/** Attributes for the `<g>` element. */
export type SvgGAttributes = SvgCoreAttributes
/** Attributes for the `<defs>` element. */
export type SvgDefsAttributes = SvgCoreAttributes
/** Attributes for the `<symbol>` element. */
export type SvgSymbolAttributes = SvgCoreAttributes & {
viewBox?: string
preserveAspectRatio?: string
x?: string | number
y?: string | number
width?: string | number
height?: string | number
refX?: string | number
refY?: string | number
}
/** Attributes for the `<use>` element. */
export type SvgUseAttributes = SvgCoreAttributes & {
href?: string
x?: string | number
y?: string | number
width?: string | number
height?: string | number
}
/** Attributes for the `<path>` element. */
export type SvgPathAttributes = SvgCoreAttributes & {
d: string
pathLength?: number
}
/** Attributes for the `<rect>` element. */
export type SvgRectAttributes = SvgCoreAttributes & {
x?: string | number
y?: string | number
width?: string | number
height?: string | number
rx?: string | number
ry?: string | number
pathLength?: number
}
/** Attributes for the `<circle>` element. */
export type SvgCircleAttributes = SvgCoreAttributes & {
cx?: string | number
cy?: string | number
r?: string | number
pathLength?: number
}
/** Attributes for the `<ellipse>` element. */
export type SvgEllipseAttributes = SvgCoreAttributes & {
cx?: string | number
cy?: string | number
rx?: string | number
ry?: string | number
pathLength?: number
}
/** Attributes for the `<line>` element. */
export type SvgLineAttributes = SvgCoreAttributes & {
x1?: string | number
y1?: string | number
x2?: string | number
y2?: string | number
pathLength?: number
}
/** Attributes for the `<polyline>` element. */
export type SvgPolylineAttributes = SvgCoreAttributes & {
points?: string
pathLength?: number
}
/** Attributes for the `<polygon>` element. */
export type SvgPolygonAttributes = SvgCoreAttributes & {
points?: string
pathLength?: number
}
/** Attributes for the `<text>` element. */
export type SvgTextAttributes = SvgCoreAttributes & {
x?: string | number
y?: string | number
dx?: string | number
dy?: string | number
rotate?: string
textLength?: string | number
lengthAdjust?: 'spacing' | 'spacingAndGlyphs'
}
/** Attributes for the `<tspan>` element. */
export type SvgTspanAttributes = SvgCoreAttributes & {
x?: string | number
y?: string | number
dx?: string | number
dy?: string | number
rotate?: string
textLength?: string | number
lengthAdjust?: 'spacing' | 'spacingAndGlyphs'
}
/** Attributes for the `<textPath>` element. */
export type SvgTextPathAttributes = SvgCoreAttributes & {
href?: string
method?: 'align' | 'stretch'
spacing?: 'auto' | 'exact'
startOffset?: string | number
textLength?: string | number
lengthAdjust?: 'spacing' | 'spacingAndGlyphs'
}
/** Attributes for the `<clipPath>` element. */
export type SvgClipPathAttributes = SvgCoreAttributes & {
clipPathUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
}
/** Attributes for the `<mask>` element. */
export type SvgMaskAttributes = SvgCoreAttributes & {
maskUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
maskContentUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
x?: string | number
y?: string | number
width?: string | number
height?: string | number
}
/** Attributes for the `<linearGradient>` element. */
export type SvgLinearGradientAttributes = SvgCoreAttributes & {
x1?: string | number
y1?: string | number
x2?: string | number
y2?: string | number
gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
gradientTransform?: string
spreadMethod?: 'pad' | 'reflect' | 'repeat'
href?: string
}
/** Attributes for the `<radialGradient>` element. */
export type SvgRadialGradientAttributes = SvgCoreAttributes & {
cx?: string | number
cy?: string | number
r?: string | number
fx?: string | number
fy?: string | number
fr?: string | number
gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
gradientTransform?: string
spreadMethod?: 'pad' | 'reflect' | 'repeat'
href?: string
}
/** Attributes for the `<stop>` element. */
export type SvgStopAttributes = SvgCoreAttributes & {
offset?: string | number
'stop-color'?: string
'stop-opacity'?: string | number
}
/** Attributes for the `<pattern>` element. */
export type SvgPatternAttributes = SvgCoreAttributes & {
x?: string | number
y?: string | number
width?: string | number
height?: string | number
patternUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
patternContentUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
patternTransform?: string
viewBox?: string
preserveAspectRatio?: string
href?: string
}
/** Attributes for the `<marker>` element. */
export type SvgMarkerAttributes = SvgCoreAttributes & {
viewBox?: string
preserveAspectRatio?: string
refX?: string | number
refY?: string | number
markerUnits?: 'strokeWidth' | 'userSpaceOnUse'
markerWidth?: string | number
markerHeight?: string | number
orient?: string
}
/** Attributes for the `<filter>` element. */
export type SvgFilterAttributes = SvgCoreAttributes & {
x?: string | number
y?: string | number
width?: string | number
height?: string | number
filterUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
primitiveUnits?: 'userSpaceOnUse' | 'objectBoundingBox'
}
/** Common attributes for SVG filter primitive elements. */
type SvgFilterPrimitiveAttributes = SvgCoreAttributes & {
x?: string | number
y?: string | number
width?: string | number
height?: string | number
result?: string
}
/** Attributes for the `<feGaussianBlur>` element. */
export type SvgFeGaussianBlurAttributes = SvgFilterPrimitiveAttributes & {
in?: string
stdDeviation?: string | number
edgeMode?: 'duplicate' | 'wrap' | 'none'
}
/** Attributes for the `<feBlend>` element. */
export type SvgFeBlendAttributes = SvgFilterPrimitiveAttributes & {
in?: string
in2?: string
mode?: 'normal' | 'multiply' | 'screen' | 'overlay' | 'darken' | 'lighten'
}
/** Attributes for the `<feColorMatrix>` element. */
export type SvgFeColorMatrixAttributes = SvgFilterPrimitiveAttributes & {
in?: string
type?: 'matrix' | 'saturate' | 'hueRotate' | 'luminanceToAlpha'
values?: string
}
/** Attributes for the `<feOffset>` element. */
export type SvgFeOffsetAttributes = SvgFilterPrimitiveAttributes & {
in?: string
dx?: string | number
dy?: string | number
}
/** Attributes for the `<feFlood>` element. */
export type SvgFeFloodAttributes = SvgFilterPrimitiveAttributes & {
'flood-color'?: string
'flood-opacity'?: string | number
}
/** Attributes for the `<feMerge>` element. */
export type SvgFeMergeAttributes = SvgFilterPrimitiveAttributes
/** Attributes for the `<feMergeNode>` element. */
export type SvgFeMergeNodeAttributes = SvgCoreAttributes & {
in?: string
}
/** Attributes for the `<feComposite>` element. */
export type SvgFeCompositeAttributes = SvgFilterPrimitiveAttributes & {
in?: string
in2?: string
operator?: 'over' | 'in' | 'out' | 'atop' | 'xor' | 'lighter' | 'arithmetic'
k1?: number
k2?: number
k3?: number
k4?: number
}
/** Attributes for the `<image>` element (SVG). */
export type SvgImageAttributes = SvgCoreAttributes & {
href?: string
x?: string | number
y?: string | number
width?: string | number
height?: string | number
preserveAspectRatio?: string
crossorigin?: 'anonymous' | 'use-credentials'
}
/** Attributes for the `<foreignObject>` element. */
export type SvgForeignObjectAttributes = SvgCoreAttributes & {
x?: string | number
y?: string | number
width?: string | number
height?: string | number
}
/** Common attributes for SVG animation elements. */
type SvgAnimationAttributes = SvgCoreAttributes & {
attributeName?: string
begin?: string
dur?: string
end?: string
repeatCount?: string | number
repeatDur?: string
fill?: 'freeze' | 'remove'
from?: string
to?: string
by?: string
values?: string
keyTimes?: string
keySplines?: string
calcMode?: 'discrete' | 'linear' | 'paced' | 'spline'
}
/** Attributes for the `<animate>` element. */
export type SvgAnimateAttributes = SvgAnimationAttributes
/** Attributes for the `<animateMotion>` element. */
export type SvgAnimateMotionAttributes = SvgAnimationAttributes & {
path?: string
rotate?: string
}
/** Attributes for the `<animateTransform>` element. */
export type SvgAnimateTransformAttributes = SvgAnimationAttributes & {
type?: 'translate' | 'scale' | 'rotate' | 'skewX' | 'skewY'
}
/** Attributes for the `<set>` element. */
export type SvgSetAttributes = SvgCoreAttributes & {
attributeName?: string
to?: string
begin?: string
dur?: string
end?: string
repeatCount?: string | number
fill?: 'freeze' | 'remove'
}
/** Attributes for the `<title>` element (SVG). */
export type SvgTitleAttributes = SvgCoreAttributes
/** Attributes for the `<desc>` element. */
export type SvgDescAttributes = SvgCoreAttributes