@solidports/recharts 0.1.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.
- package/LICENSE +22 -0
- package/NOTICE +19 -0
- package/README.md +102 -0
- package/dist/dev.js +28564 -0
- package/dist/index.d.ts +7859 -0
- package/dist/index.js +28546 -0
- package/package.json +98 -0
- package/src/animation/AnimatedItems.tsx +183 -0
- package/src/animation/AnimationController.ts +33 -0
- package/src/animation/AnimationControllerImpl.ts +36 -0
- package/src/animation/AnimationHandle.ts +307 -0
- package/src/animation/CSSTransitionAnimate.tsx +170 -0
- package/src/animation/JavascriptAnimate.tsx +119 -0
- package/src/animation/easing.ts +221 -0
- package/src/animation/matchBy.ts +164 -0
- package/src/animation/timeoutController.ts +70 -0
- package/src/animation/useAnimationController.tsx +34 -0
- package/src/animation/useAnimationStartSnapshot.ts +118 -0
- package/src/animation/util.ts +41 -0
- package/src/cartesian/Area.tsx +915 -0
- package/src/cartesian/AreaRevealShape.tsx +190 -0
- package/src/cartesian/Bar.tsx +1369 -0
- package/src/cartesian/BarStack.tsx +152 -0
- package/src/cartesian/Brush.tsx +951 -0
- package/src/cartesian/CartesianAxis.tsx +722 -0
- package/src/cartesian/CartesianGrid.tsx +711 -0
- package/src/cartesian/ErrorBar.tsx +361 -0
- package/src/cartesian/Funnel.tsx +803 -0
- package/src/cartesian/GraphicalItemClipPath.tsx +67 -0
- package/src/cartesian/Line.tsx +863 -0
- package/src/cartesian/LineDrawShape.tsx +89 -0
- package/src/cartesian/ReferenceArea.tsx +331 -0
- package/src/cartesian/ReferenceDot.tsx +304 -0
- package/src/cartesian/ReferenceLine.tsx +474 -0
- package/src/cartesian/Scatter.tsx +888 -0
- package/src/cartesian/XAxis.tsx +433 -0
- package/src/cartesian/YAxis.tsx +443 -0
- package/src/cartesian/ZAxis.tsx +155 -0
- package/src/cartesian/cartesianPositionToCSSTranslate.tsx +29 -0
- package/src/cartesian/cartesianViewBoxToTrapezoid.tsx +21 -0
- package/src/cartesian/getCartesianPosition.tsx +267 -0
- package/src/cartesian/getEquidistantTicks.ts +144 -0
- package/src/cartesian/getTicks.ts +225 -0
- package/src/cartesian/isOutsidePosition.ts +15 -0
- package/src/cartesian/useAnimatedLineLength.ts +54 -0
- package/src/chart/AreaChart.tsx +29 -0
- package/src/chart/BarChart.tsx +29 -0
- package/src/chart/CartesianChart.tsx +131 -0
- package/src/chart/CategoricalChart.tsx +94 -0
- package/src/chart/ComposedChart.tsx +29 -0
- package/src/chart/FunnelChart.tsx +29 -0
- package/src/chart/LineChart.tsx +29 -0
- package/src/chart/PieChart.tsx +50 -0
- package/src/chart/PolarChart.tsx +164 -0
- package/src/chart/RadarChart.tsx +70 -0
- package/src/chart/RadialBarChart.tsx +46 -0
- package/src/chart/RechartsWrapper.tsx +551 -0
- package/src/chart/Sankey.tsx +1534 -0
- package/src/chart/ScatterChart.tsx +29 -0
- package/src/chart/SunburstChart.tsx +504 -0
- package/src/chart/Treemap.tsx +1223 -0
- package/src/chart/createInitialRootProps.ts +24 -0
- package/src/chart/types.ts +53 -0
- package/src/component/ActivePoints.tsx +144 -0
- package/src/component/Cell.tsx +37 -0
- package/src/component/Cursor.tsx +185 -0
- package/src/component/Customized.tsx +50 -0
- package/src/component/DefaultLegendContent.tsx +348 -0
- package/src/component/DefaultTooltipContent.tsx +224 -0
- package/src/component/Dots.tsx +157 -0
- package/src/component/Label.tsx +636 -0
- package/src/component/LabelList.tsx +375 -0
- package/src/component/Legend.tsx +512 -0
- package/src/component/ResponsiveContainer.tsx +348 -0
- package/src/component/Text.tsx +541 -0
- package/src/component/Tooltip.tsx +470 -0
- package/src/component/TooltipBoundingBox.tsx +146 -0
- package/src/component/responsiveContainerUtils.ts +134 -0
- package/src/container/ClipPathProvider.tsx +51 -0
- package/src/container/Layer.tsx +38 -0
- package/src/container/RootSurface.tsx +120 -0
- package/src/container/Surface.tsx +61 -0
- package/src/context/CellsContext.tsx +54 -0
- package/src/context/ErrorBarContext.tsx +146 -0
- package/src/context/GraphicalItemChildrenScope.tsx +18 -0
- package/src/context/PanoramaContext.tsx +9 -0
- package/src/context/RegisterGraphicalItemId.tsx +30 -0
- package/src/context/accessibilityContext.tsx +6 -0
- package/src/context/brushUpdateContext.tsx +9 -0
- package/src/context/chartDataContext.tsx +97 -0
- package/src/context/chartLayoutContext.tsx +201 -0
- package/src/context/legendPayloadContext.tsx +20 -0
- package/src/context/legendPortalContext.tsx +12 -0
- package/src/context/tooltipContext.tsx +89 -0
- package/src/context/tooltipPortalContext.tsx +12 -0
- package/src/context/useTooltipAxis.ts +22 -0
- package/src/hooks.ts +476 -0
- package/src/index.ts +280 -0
- package/src/polar/Pie.tsx +1360 -0
- package/src/polar/PolarAngleAxis.tsx +616 -0
- package/src/polar/PolarGrid.tsx +312 -0
- package/src/polar/PolarRadiusAxis.tsx +547 -0
- package/src/polar/Radar.tsx +734 -0
- package/src/polar/RadialBar.tsx +917 -0
- package/src/polar/defaultPolarAngleAxisProps.tsx +27 -0
- package/src/polar/defaultPolarRadiusAxisProps.tsx +25 -0
- package/src/shape/Cross.tsx +89 -0
- package/src/shape/Curve.tsx +343 -0
- package/src/shape/Dot.tsx +70 -0
- package/src/shape/Polygon.tsx +195 -0
- package/src/shape/Rectangle.tsx +470 -0
- package/src/shape/Sector.tsx +347 -0
- package/src/shape/Symbols.tsx +139 -0
- package/src/shape/Trapezoid.tsx +280 -0
- package/src/state/RechartsStateContext.tsx +12 -0
- package/src/state/RechartsStateProvider.tsx +87 -0
- package/src/state/RechartsStoreContext.tsx +25 -0
- package/src/state/RechartsStoreProvider.tsx +35 -0
- package/src/state/ReportChartProps.tsx +40 -0
- package/src/state/ReportEventSettings.tsx +30 -0
- package/src/state/ReportMainChartProps.tsx +61 -0
- package/src/state/ReportPolarOptions.tsx +35 -0
- package/src/state/SetGraphicalItem.ts +79 -0
- package/src/state/SetLegendPayload.ts +134 -0
- package/src/state/SetTooltipEntrySettings.tsx +72 -0
- package/src/state/actions.ts +464 -0
- package/src/state/brushSlice.ts +13 -0
- package/src/state/cartesianAxisSlice.ts +141 -0
- package/src/state/chartDataSlice.ts +50 -0
- package/src/state/chartState.ts +297 -0
- package/src/state/errorBarSlice.ts +29 -0
- package/src/state/eventSettingsSlice.ts +8 -0
- package/src/state/events.ts +76 -0
- package/src/state/externalEventsMiddleware.ts +255 -0
- package/src/state/graphicalItemsSlice.ts +74 -0
- package/src/state/hooks/useChartSelectors.tsx +45 -0
- package/src/state/keyboardEventsMiddleware.ts +228 -0
- package/src/state/layoutSlice.ts +21 -0
- package/src/state/legendSlice.ts +57 -0
- package/src/state/mouseEventsMiddleware.ts +185 -0
- package/src/state/optionsSlice.ts +47 -0
- package/src/state/polarAxisSlice.ts +10 -0
- package/src/state/polarOptionsSlice.ts +12 -0
- package/src/state/rawData.ts +26 -0
- package/src/state/referenceElementsSlice.ts +40 -0
- package/src/state/renderedTicksSlice.ts +15 -0
- package/src/state/rootPropsSlice.ts +47 -0
- package/src/state/selectors/areaSelectors.ts +240 -0
- package/src/state/selectors/arrayEqualityCheck.ts +29 -0
- package/src/state/selectors/axisSelectors.ts +2157 -0
- package/src/state/selectors/barSelectors.ts +310 -0
- package/src/state/selectors/barStackSelectors.ts +77 -0
- package/src/state/selectors/brushSelectors.ts +33 -0
- package/src/state/selectors/chartSelector.ts +185 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +16 -0
- package/src/state/selectors/combiners/combineActiveTooltipIndex.ts +95 -0
- package/src/state/selectors/combiners/combineAllBarPositions.ts +122 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +16 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +23 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +80 -0
- package/src/state/selectors/combiners/combineCheckedDomain.ts +48 -0
- package/src/state/selectors/combiners/combineConfiguredScale.ts +111 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +45 -0
- package/src/state/selectors/combiners/combineDisplayedStackedData.ts +50 -0
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +16 -0
- package/src/state/selectors/combiners/combineRealScaleType.ts +44 -0
- package/src/state/selectors/combiners/combineStackedData.ts +27 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +205 -0
- package/src/state/selectors/combiners/combineTooltipPayloadConfigurations.ts +58 -0
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/dataSelectors.ts +88 -0
- package/src/state/selectors/funnelSelectors.ts +75 -0
- package/src/state/selectors/graphicalItemSelectors.ts +30 -0
- package/src/state/selectors/legendSelectors.ts +29 -0
- package/src/state/selectors/lineSelectors.ts +134 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +14 -0
- package/src/state/selectors/pickAxisId.ts +5 -0
- package/src/state/selectors/pickAxisType.ts +3 -0
- package/src/state/selectors/pieSelectors.ts +97 -0
- package/src/state/selectors/polarAxisSelectors.ts +201 -0
- package/src/state/selectors/polarGridSelectors.ts +28 -0
- package/src/state/selectors/polarScaleSelectors.ts +133 -0
- package/src/state/selectors/polarSelectors.ts +219 -0
- package/src/state/selectors/radarSelectors.ts +191 -0
- package/src/state/selectors/radialBarSelectors.ts +435 -0
- package/src/state/selectors/rootPropsSelectors.ts +25 -0
- package/src/state/selectors/scatterSelectors.ts +96 -0
- package/src/state/selectors/selectActivePropsFromChartPointer.ts +26 -0
- package/src/state/selectors/selectAllAxes.ts +17 -0
- package/src/state/selectors/selectChartOffset.ts +16 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +136 -0
- package/src/state/selectors/selectLegendArea.ts +20 -0
- package/src/state/selectors/selectPlotArea.ts +22 -0
- package/src/state/selectors/selectTooltipAxisId.ts +7 -0
- package/src/state/selectors/selectTooltipAxisType.ts +32 -0
- package/src/state/selectors/selectTooltipEventType.ts +48 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +6 -0
- package/src/state/selectors/selectTooltipSettings.ts +39 -0
- package/src/state/selectors/selectTooltipState.ts +8 -0
- package/src/state/selectors/selectors.ts +271 -0
- package/src/state/selectors/tooltipSelectors.ts +578 -0
- package/src/state/selectors/touchSelectors.ts +31 -0
- package/src/state/store.ts +29 -0
- package/src/state/storeIdentity.ts +9 -0
- package/src/state/teardownWrite.ts +10 -0
- package/src/state/tooltipInteraction.ts +23 -0
- package/src/state/tooltipSlice.ts +334 -0
- package/src/state/touchEventsMiddleware.ts +214 -0
- package/src/state/types/AnimationSettings.ts +20 -0
- package/src/state/types/AreaSettings.ts +14 -0
- package/src/state/types/BarSettings.ts +15 -0
- package/src/state/types/LineSettings.ts +9 -0
- package/src/state/types/PieSettings.ts +34 -0
- package/src/state/types/RadarSettings.ts +5 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +12 -0
- package/src/state/types/StackedGraphicalItem.ts +34 -0
- package/src/state/useChartState.ts +17 -0
- package/src/state/zIndexSlice.ts +39 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +44 -0
- package/src/synchronisation/useChartSynchronisation.tsx +404 -0
- package/src/theme/RechartsTheme.ts +16 -0
- package/src/theme/RechartsThemeContext.ts +19 -0
- package/src/theme/darkTheme.ts +13 -0
- package/src/theme/graphicalItemIdentity.ts +70 -0
- package/src/theme/legacyTheme.ts +17 -0
- package/src/theme/lightTheme.ts +13 -0
- package/src/types.ts +54 -0
- package/src/util/ActiveShapeUtils.tsx +162 -0
- package/src/util/BarUtils.tsx +62 -0
- package/src/util/BarePortal.tsx +50 -0
- package/src/util/CamelCaseSVGAttrs.ts +34 -0
- package/src/util/CartesianUtils.ts +48 -0
- package/src/util/ChartUtils.ts +802 -0
- package/src/util/Constants.ts +42 -0
- package/src/util/CssPrefixUtils.ts +20 -0
- package/src/util/DOMUtils.ts +129 -0
- package/src/util/DataUtils.ts +216 -0
- package/src/util/Events.ts +16 -0
- package/src/util/FunnelUtils.tsx +15 -0
- package/src/util/Global.ts +12 -0
- package/src/util/IfOverflow.ts +15 -0
- package/src/util/LRUCache.ts +41 -0
- package/src/util/LogUtils.ts +22 -0
- package/src/util/PolarUtils.ts +132 -0
- package/src/util/RadialBarUtils.tsx +24 -0
- package/src/util/ReactUtils.ts +95 -0
- package/src/util/ReduceCSSCalc.ts +187 -0
- package/src/util/ScatterUtils.tsx +52 -0
- package/src/util/ShapeElementProps.tsx +87 -0
- package/src/util/TickUtils.ts +60 -0
- package/src/util/XAxisUtils.ts +48 -0
- package/src/util/YAxisUtils.ts +48 -0
- package/src/util/axisPropsAreEqual.ts +48 -0
- package/src/util/createCartesianCharts.tsx +150 -0
- package/src/util/createEventProxy.ts +20 -0
- package/src/util/createPolarCharts.tsx +112 -0
- package/src/util/cursor/getCursorPoints.ts +46 -0
- package/src/util/cursor/getCursorRectangle.ts +28 -0
- package/src/util/cursor/getRadialCursorPoints.ts +32 -0
- package/src/util/excludeEventProps.ts +171 -0
- package/src/util/getActiveCoordinate.ts +213 -0
- package/src/util/getAxisTypeBasedOnLayout.ts +21 -0
- package/src/util/getClassNameFromUnknown.ts +6 -0
- package/src/util/getEveryNth.ts +27 -0
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +35 -0
- package/src/util/getRelativeCoordinate.ts +80 -0
- package/src/util/getSliced.ts +13 -0
- package/src/util/hoverDedupe.ts +41 -0
- package/src/util/isDomainSpecifiedByUser.ts +219 -0
- package/src/util/isWellBehavedNumber.ts +7 -0
- package/src/util/pathTotalLength.ts +25 -0
- package/src/util/payload/getUniqPayload.ts +28 -0
- package/src/util/propsAreEqual.ts +121 -0
- package/src/util/resolveDefaultProps.ts +161 -0
- package/src/util/round.ts +32 -0
- package/src/util/scale/CartesianScaleHelper.ts +72 -0
- package/src/util/scale/CustomScaleDefinition.ts +81 -0
- package/src/util/scale/RechartsScale.ts +130 -0
- package/src/util/scale/createCategoricalInverse.ts +72 -0
- package/src/util/scale/getNiceTickValues.ts +311 -0
- package/src/util/scale/index.ts +2 -0
- package/src/util/scale/util/arithmetic.ts +54 -0
- package/src/util/solid-1-compat.ts +310 -0
- package/src/util/solidJsxCamelAugment.d.ts +84 -0
- package/src/util/stacks/getStackSeriesIdentifier.ts +21 -0
- package/src/util/stacks/stackTypes.ts +60 -0
- package/src/util/structurallyEqual.ts +31 -0
- package/src/util/svgPropertiesAndEvents.ts +53 -0
- package/src/util/svgPropertiesNoEvents.ts +571 -0
- package/src/util/tooltip/translate.ts +171 -0
- package/src/util/typedDataKey.ts +48 -0
- package/src/util/types.ts +1560 -0
- package/src/util/useAnimationId.ts +31 -0
- package/src/util/useElementOffset.ts +110 -0
- package/src/util/useId.ts +8 -0
- package/src/util/usePrefersReducedMotion.ts +48 -0
- package/src/util/useReportScale.ts +24 -0
- package/src/util/useUniqueId.ts +30 -0
- package/src/zIndex/DefaultZIndexes.ts +84 -0
- package/src/zIndex/ZIndexLayer.tsx +121 -0
- package/src/zIndex/ZIndexPortal.tsx +79 -0
- package/src/zIndex/getZIndexFromUnknown.ts +14 -0
- package/src/zIndex/zIndexSelectors.ts +48 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createStore as createStore2,
|
|
3
|
+
omit,
|
|
4
|
+
untrack,
|
|
5
|
+
type Accessor,
|
|
6
|
+
type Store,
|
|
7
|
+
type StoreSetter,
|
|
8
|
+
} from "solid-js"
|
|
9
|
+
import { storePath } from "@solidjs/signals"
|
|
10
|
+
|
|
11
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
12
|
+
k: infer I,
|
|
13
|
+
) => void
|
|
14
|
+
? I
|
|
15
|
+
: never
|
|
16
|
+
|
|
17
|
+
type MergePropsResult<T extends unknown[]> = UnionToIntersection<
|
|
18
|
+
Exclude<T[number], null | undefined>
|
|
19
|
+
>
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Solid 2 compiles `ref={props.ref}` to `props.ref = el` when the value is not a
|
|
23
|
+
* function. Getter-only merge/split views throw; keep a local override bag.
|
|
24
|
+
*/
|
|
25
|
+
function defineWritableProp(
|
|
26
|
+
target: object,
|
|
27
|
+
key: PropertyKey,
|
|
28
|
+
getValue: () => unknown,
|
|
29
|
+
overrides: Record<PropertyKey, unknown>,
|
|
30
|
+
) {
|
|
31
|
+
Object.defineProperty(target, key, {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
get() {
|
|
35
|
+
return Object.prototype.hasOwnProperty.call(overrides, key)
|
|
36
|
+
? overrides[key]
|
|
37
|
+
: getValue()
|
|
38
|
+
},
|
|
39
|
+
set(value: unknown) {
|
|
40
|
+
overrides[key] = value
|
|
41
|
+
},
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Call a Solid 2 ref without assigning onto getter-only merge/split props.
|
|
47
|
+
*/
|
|
48
|
+
export function bindRef<T>(ref: unknown, el: T): void {
|
|
49
|
+
if (typeof ref === "function") {
|
|
50
|
+
;(ref as (node: T) => void)(el)
|
|
51
|
+
return
|
|
52
|
+
}
|
|
53
|
+
if (Array.isArray(ref)) {
|
|
54
|
+
for (const item of ref) bindRef(item, el)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Solid 1.x mergeProps: later sources win, `undefined` is skipped.
|
|
60
|
+
* Solid 2 `merge` treats `undefined` as a real override.
|
|
61
|
+
*/
|
|
62
|
+
export function mergeProps<T extends (object | null | undefined)[]>(
|
|
63
|
+
...sources: T
|
|
64
|
+
): MergePropsResult<T> {
|
|
65
|
+
const keys = new Set<string>()
|
|
66
|
+
untrack(() => {
|
|
67
|
+
for (const source of sources) {
|
|
68
|
+
if (!source) continue
|
|
69
|
+
/* Reflect.ownKeys: Object.keys on a props/merge proxy pays a descriptor trap per
|
|
70
|
+
key, and this runs per element for every shape. Props views expose only
|
|
71
|
+
enumerable string keys, so the key set is the same. */
|
|
72
|
+
for (const key of Reflect.ownKeys(source)) {
|
|
73
|
+
if (typeof key === "string") keys.add(key)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
const overrides: Record<PropertyKey, unknown> = {}
|
|
78
|
+
const target: Record<string, unknown> = {}
|
|
79
|
+
for (const key of keys) {
|
|
80
|
+
defineWritableProp(
|
|
81
|
+
target,
|
|
82
|
+
key,
|
|
83
|
+
() => {
|
|
84
|
+
for (let i = sources.length - 1; i >= 0; i--) {
|
|
85
|
+
const source = sources[i]
|
|
86
|
+
if (!source) continue
|
|
87
|
+
const value = (source as Record<string, unknown>)[key]
|
|
88
|
+
if (value !== undefined) return value
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
overrides,
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
return target as MergePropsResult<T>
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function pickProps<T extends object>(props: T, keys: readonly (keyof T)[]) {
|
|
98
|
+
const picked: Partial<T> = {}
|
|
99
|
+
const overrides: Record<PropertyKey, unknown> = {}
|
|
100
|
+
for (const key of keys) {
|
|
101
|
+
defineWritableProp(picked, key, () => props[key], overrides)
|
|
102
|
+
}
|
|
103
|
+
return picked as Pick<T, (typeof keys)[number]>
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export type SplitProps<T, K extends (readonly (keyof T)[])[]> = [
|
|
107
|
+
...{
|
|
108
|
+
[P in keyof K]: P extends `${number}`
|
|
109
|
+
? Pick<T, Extract<K[P], readonly (keyof T)[]>[number]>
|
|
110
|
+
: never
|
|
111
|
+
},
|
|
112
|
+
Omit<T, K[number][number]>,
|
|
113
|
+
]
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Solid 1.x splitProps: returns `[...pickedGroups, rest]`.
|
|
117
|
+
*/
|
|
118
|
+
export function splitProps<T extends object, const K extends (readonly (keyof T)[])[]>(
|
|
119
|
+
props: T,
|
|
120
|
+
...groups: K
|
|
121
|
+
): SplitProps<T, K> {
|
|
122
|
+
return untrack(() => {
|
|
123
|
+
const claimed = new Set<PropertyKey>()
|
|
124
|
+
const result: unknown[] = []
|
|
125
|
+
for (const group of groups) {
|
|
126
|
+
const owned = group.filter((key) => {
|
|
127
|
+
if (claimed.has(key)) return false
|
|
128
|
+
claimed.add(key)
|
|
129
|
+
return true
|
|
130
|
+
})
|
|
131
|
+
result.push(pickProps(props, owned))
|
|
132
|
+
}
|
|
133
|
+
result.push(omit(props, ...(claimed as unknown as (keyof T)[])))
|
|
134
|
+
return result as SplitProps<T, K>
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
type AccessorValue<A> = A extends () => infer V ? V : A
|
|
139
|
+
type OnDepsValue<D> = D extends readonly unknown[]
|
|
140
|
+
? { [K in keyof D]: AccessorValue<D[K]> }
|
|
141
|
+
: AccessorValue<D>
|
|
142
|
+
|
|
143
|
+
type EffectApply<T> = (value: T, prev?: T) => void | (() => void)
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Solid 1.x `on()` as a 2.0 `createEffect(...on(deps, fn))` spread.
|
|
147
|
+
*/
|
|
148
|
+
export function on<const D extends Accessor<unknown> | readonly Accessor<unknown>[]>(
|
|
149
|
+
deps: D,
|
|
150
|
+
fn: EffectApply<OnDepsValue<D>>,
|
|
151
|
+
options: { defer?: boolean },
|
|
152
|
+
): [() => OnDepsValue<D>, EffectApply<OnDepsValue<D>>, { defer?: boolean }]
|
|
153
|
+
export function on<const D extends Accessor<unknown> | readonly Accessor<unknown>[]>(
|
|
154
|
+
deps: D,
|
|
155
|
+
fn: EffectApply<OnDepsValue<D>>,
|
|
156
|
+
): [() => OnDepsValue<D>, EffectApply<OnDepsValue<D>>]
|
|
157
|
+
export function on(
|
|
158
|
+
deps: Accessor<unknown> | readonly Accessor<unknown>[],
|
|
159
|
+
fn: EffectApply<any>,
|
|
160
|
+
options?: { defer?: boolean },
|
|
161
|
+
): [() => any, EffectApply<any>, { defer?: boolean }?] {
|
|
162
|
+
const compute = () => {
|
|
163
|
+
if (Array.isArray(deps)) {
|
|
164
|
+
return (deps as readonly Accessor<unknown>[]).map(dep =>
|
|
165
|
+
typeof dep === "function" ? dep() : dep,
|
|
166
|
+
)
|
|
167
|
+
}
|
|
168
|
+
return (deps as Accessor<unknown>)()
|
|
169
|
+
}
|
|
170
|
+
return options ? [compute, fn, options] : [compute, fn]
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** Solid 1.x createSelector. Fine-grained key isolation is not preserved. */
|
|
174
|
+
export function createSelector<T, U>(
|
|
175
|
+
source: Accessor<T>,
|
|
176
|
+
fn: (a: T, b: U) => boolean = (a, b) => a === (b as unknown as T),
|
|
177
|
+
): (key: U) => boolean {
|
|
178
|
+
return (key: U) => fn(source(), key)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
type PathValue<T> = T | Partial<T> | ((prev: T) => T | Partial<T> | void)
|
|
182
|
+
type At<T, K> = K extends keyof NonNullable<T> ? NonNullable<T>[K] : never
|
|
183
|
+
|
|
184
|
+
/** 1.x path-style store setter. Solid 2 `StoreSetter` is draft-only. */
|
|
185
|
+
export interface SetStoreFunction<T> {
|
|
186
|
+
(setter: (draft: T) => void): void
|
|
187
|
+
<K1 extends keyof T>(k1: K1, value: PathValue<T[K1]>): void
|
|
188
|
+
<K1 extends keyof T, K2 extends keyof NonNullable<T[K1]>>(
|
|
189
|
+
k1: K1,
|
|
190
|
+
k2: K2,
|
|
191
|
+
value: PathValue<At<T[K1], K2>>,
|
|
192
|
+
): void
|
|
193
|
+
<K1 extends keyof T, K2 extends keyof NonNullable<T[K1]>, K3 extends keyof NonNullable<At<T[K1], K2>>>(
|
|
194
|
+
k1: K1,
|
|
195
|
+
k2: K2,
|
|
196
|
+
k3: K3,
|
|
197
|
+
value: PathValue<At<At<T[K1], K2>, K3>>,
|
|
198
|
+
): void
|
|
199
|
+
<
|
|
200
|
+
K1 extends keyof T,
|
|
201
|
+
K2 extends keyof NonNullable<T[K1]>,
|
|
202
|
+
K3 extends keyof NonNullable<At<T[K1], K2>>,
|
|
203
|
+
K4 extends keyof NonNullable<At<At<T[K1], K2>, K3>>,
|
|
204
|
+
>(
|
|
205
|
+
k1: K1,
|
|
206
|
+
k2: K2,
|
|
207
|
+
k3: K3,
|
|
208
|
+
k4: K4,
|
|
209
|
+
value: PathValue<At<At<At<T[K1], K2>, K3>, K4>>,
|
|
210
|
+
): void
|
|
211
|
+
<
|
|
212
|
+
K1 extends keyof T,
|
|
213
|
+
K2 extends keyof NonNullable<T[K1]>,
|
|
214
|
+
K3 extends keyof NonNullable<At<T[K1], K2>>,
|
|
215
|
+
K4 extends keyof NonNullable<At<At<T[K1], K2>, K3>>,
|
|
216
|
+
K5 extends keyof NonNullable<At<At<At<T[K1], K2>, K3>, K4>>,
|
|
217
|
+
>(
|
|
218
|
+
k1: K1,
|
|
219
|
+
k2: K2,
|
|
220
|
+
k3: K3,
|
|
221
|
+
k4: K4,
|
|
222
|
+
k5: K5,
|
|
223
|
+
value: PathValue<At<At<At<At<T[K1], K2>, K3>, K4>, K5>>,
|
|
224
|
+
): void
|
|
225
|
+
<
|
|
226
|
+
K1 extends keyof T,
|
|
227
|
+
K2 extends keyof NonNullable<T[K1]>,
|
|
228
|
+
K3 extends keyof NonNullable<At<T[K1], K2>>,
|
|
229
|
+
K4 extends keyof NonNullable<At<At<T[K1], K2>, K3>>,
|
|
230
|
+
K5 extends keyof NonNullable<At<At<At<T[K1], K2>, K3>, K4>>,
|
|
231
|
+
K6 extends keyof NonNullable<At<At<At<At<T[K1], K2>, K3>, K4>, K5>>,
|
|
232
|
+
>(
|
|
233
|
+
k1: K1,
|
|
234
|
+
k2: K2,
|
|
235
|
+
k3: K3,
|
|
236
|
+
k4: K4,
|
|
237
|
+
k5: K5,
|
|
238
|
+
k6: K6,
|
|
239
|
+
value: PathValue<At<At<At<At<At<T[K1], K2>, K3>, K4>, K5>, K6>>,
|
|
240
|
+
): void
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function pathHasFilter(args: unknown[]): boolean {
|
|
244
|
+
return args.some(
|
|
245
|
+
arg =>
|
|
246
|
+
typeof arg === "function" ||
|
|
247
|
+
(arg !== null &&
|
|
248
|
+
typeof arg === "object" &&
|
|
249
|
+
!Array.isArray(arg) &&
|
|
250
|
+
("from" in (arg as object) ||
|
|
251
|
+
"to" in (arg as object) ||
|
|
252
|
+
"by" in (arg as object))),
|
|
253
|
+
)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function applyPath(set: StoreSetter<any>, args: any[]) {
|
|
257
|
+
if (args.length === 0) return
|
|
258
|
+
if (args.length === 1) {
|
|
259
|
+
const arg = args[0]
|
|
260
|
+
if (typeof arg === "function") {
|
|
261
|
+
set(arg)
|
|
262
|
+
return
|
|
263
|
+
}
|
|
264
|
+
if (arg && typeof arg === "object" && !Array.isArray(arg)) {
|
|
265
|
+
set((draft: any) => {
|
|
266
|
+
Object.assign(draft, arg)
|
|
267
|
+
})
|
|
268
|
+
return
|
|
269
|
+
}
|
|
270
|
+
set(storePath(arg as never) as never)
|
|
271
|
+
return
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const last = args[args.length - 1]
|
|
275
|
+
const path = args.slice(0, -1)
|
|
276
|
+
|
|
277
|
+
if (typeof last === "function" && !pathHasFilter(path)) {
|
|
278
|
+
set((draft: any) => {
|
|
279
|
+
let parent = draft
|
|
280
|
+
for (let i = 0; i < path.length; i++) {
|
|
281
|
+
const key = path[i]
|
|
282
|
+
if (i === path.length - 1) {
|
|
283
|
+
const current = parent[key]
|
|
284
|
+
const result = last(current)
|
|
285
|
+
if (result !== undefined) parent[key] = result
|
|
286
|
+
return
|
|
287
|
+
}
|
|
288
|
+
parent = parent[key]
|
|
289
|
+
}
|
|
290
|
+
})
|
|
291
|
+
return
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
set((storePath as any)(...args))
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Solid 1.x `createStore` with path setters (`set("a", "b", value)`).
|
|
299
|
+
* Native Solid 2 setters only accept a draft function.
|
|
300
|
+
*/
|
|
301
|
+
export function createStore<T extends object>(
|
|
302
|
+
initialValue: T,
|
|
303
|
+
options?: { name?: string; shallow?: boolean },
|
|
304
|
+
): [Store<T>, SetStoreFunction<T>] {
|
|
305
|
+
const [store, set] = createStore2(initialValue as any, options)
|
|
306
|
+
const setCompat = ((...args: any[]) => {
|
|
307
|
+
applyPath(set as unknown as StoreSetter<any>, args)
|
|
308
|
+
}) as SetStoreFunction<T>
|
|
309
|
+
return [store, setCompat]
|
|
310
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 1:1 React parity — upstream recharts API uses camelCase SVG attrs
|
|
3
|
+
* (`fillOpacity`, `strokeWidth`, ...). Solid's `JSX.SvgSVGAttributes` and
|
|
4
|
+
* the per-element interfaces (`PathSVGAttributes`, `LineSVGAttributes`,
|
|
5
|
+
* `GSVGAttributes`, etc.) only declare kebab-case. Module-augment the
|
|
6
|
+
* shared base interfaces so every SVG element shape accepts both forms
|
|
7
|
+
* at the type level. Runtime rekeys camel → kebab via `SVG_CAMEL_TO_KEBAB`
|
|
8
|
+
* in `svgPropertiesNoEvents.ts`.
|
|
9
|
+
*
|
|
10
|
+
* Augmenting `ShapeElementSVGAttributes` covers Path/Line/Rect/Circle/Ellipse/Polygon/Polyline.
|
|
11
|
+
* Augmenting `TextContentElementSVGAttributes` covers `<text>`/`<tspan>`.
|
|
12
|
+
* Augmenting `StylableSVGAttributes` covers `class` → `className`.
|
|
13
|
+
* Augmenting `ContainerElementSVGAttributes` covers `<g>` (and any container).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { JSX as SolidJSX } from '@solidjs/web';
|
|
17
|
+
declare module "solid-js" {
|
|
18
|
+
namespace JSX {
|
|
19
|
+
interface StylableSVGAttributes {
|
|
20
|
+
className?: string
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface ShapeElementSVGAttributes<T> {
|
|
24
|
+
fillOpacity?: number | string
|
|
25
|
+
fillRule?: "nonzero" | "evenodd" | "inherit"
|
|
26
|
+
strokeDasharray?: string
|
|
27
|
+
strokeDashoffset?: number | string
|
|
28
|
+
strokeLinecap?: "butt" | "round" | "square" | "inherit"
|
|
29
|
+
strokeLinejoin?: "miter" | "round" | "bevel" | "inherit"
|
|
30
|
+
strokeMiterlimit?: number | string
|
|
31
|
+
strokeOpacity?: number | string
|
|
32
|
+
strokeWidth?: number | string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface TextContentElementSVGAttributes<T> {
|
|
36
|
+
dominantBaseline?: string
|
|
37
|
+
fillOpacity?: number | string
|
|
38
|
+
fillRule?: "nonzero" | "evenodd" | "inherit"
|
|
39
|
+
fontFamily?: string
|
|
40
|
+
fontSize?: number | string
|
|
41
|
+
fontStyle?: string
|
|
42
|
+
fontWeight?: number | string
|
|
43
|
+
letterSpacing?: number | string
|
|
44
|
+
strokeDasharray?: string
|
|
45
|
+
strokeDashoffset?: number | string
|
|
46
|
+
strokeLinecap?: "butt" | "round" | "square" | "inherit"
|
|
47
|
+
strokeLinejoin?: "miter" | "round" | "bevel" | "inherit"
|
|
48
|
+
strokeMiterlimit?: number | string
|
|
49
|
+
strokeOpacity?: number | string
|
|
50
|
+
strokeWidth?: number | string
|
|
51
|
+
textAnchor?: "start" | "middle" | "end" | "inherit"
|
|
52
|
+
textDecoration?: string
|
|
53
|
+
wordSpacing?: number | string
|
|
54
|
+
writingMode?: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface ContainerElementSVGAttributes<T> {
|
|
58
|
+
clipPath?: string
|
|
59
|
+
pointerEvents?: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* `<svg>` element — inherits via SvgSVGAttributes; covers root chart Surface. */
|
|
63
|
+
interface SvgSVGAttributes<T> {
|
|
64
|
+
clipPath?: string
|
|
65
|
+
fillOpacity?: number | string
|
|
66
|
+
fillRule?: "nonzero" | "evenodd" | "inherit"
|
|
67
|
+
pointerEvents?: string
|
|
68
|
+
strokeDasharray?: string
|
|
69
|
+
strokeDashoffset?: number | string
|
|
70
|
+
strokeLinecap?: "butt" | "round" | "square" | "inherit"
|
|
71
|
+
strokeLinejoin?: "miter" | "round" | "bevel" | "inherit"
|
|
72
|
+
strokeMiterlimit?: number | string
|
|
73
|
+
strokeOpacity?: number | string
|
|
74
|
+
strokeWidth?: number | string
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Re-export to keep the file referenced when imported solely for side-effect
|
|
81
|
+
* type augmentation; consumers do `import "@solidports/recharts"` and the
|
|
82
|
+
* augmentation flows transitively through `src/index.ts`'s reference.
|
|
83
|
+
*/
|
|
84
|
+
export type _SolidJSXCamelAugmentMarker = SolidJSX.Element
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* eslint-disable import/no-cycle */
|
|
2
|
+
import { StackSeriesIdentifier } from "./stackTypes"
|
|
3
|
+
import { MaybeStackedGraphicalItem } from "../../state/types/StackedGraphicalItem"
|
|
4
|
+
|
|
5
|
+
export function getStackSeriesIdentifier(
|
|
6
|
+
graphicalItem: MaybeStackedGraphicalItem,
|
|
7
|
+
): StackSeriesIdentifier
|
|
8
|
+
export function getStackSeriesIdentifier(graphicalItem: undefined): undefined
|
|
9
|
+
export function getStackSeriesIdentifier(
|
|
10
|
+
graphicalItem: MaybeStackedGraphicalItem | undefined,
|
|
11
|
+
): StackSeriesIdentifier | undefined
|
|
12
|
+
/**
|
|
13
|
+
* Returns identifier for stack series which is one individual graphical item in the stack.
|
|
14
|
+
* @param graphicalItem - The graphical item representing the series in the stack.
|
|
15
|
+
* @return The identifier for the series in the stack
|
|
16
|
+
*/
|
|
17
|
+
export function getStackSeriesIdentifier(
|
|
18
|
+
graphicalItem: MaybeStackedGraphicalItem | undefined,
|
|
19
|
+
): StackSeriesIdentifier | undefined {
|
|
20
|
+
return graphicalItem?.id
|
|
21
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Series } from "victory-vendor/d3-shape"
|
|
2
|
+
import type { StackId } from "../ChartUtils"
|
|
3
|
+
import type { GraphicalItemId } from "../../state/graphicalItemsSlice"
|
|
4
|
+
import type { MaybeStackedGraphicalItem } from "../../state/types/StackedGraphicalItem"
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* So chart stacks come in layers:
|
|
8
|
+
*
|
|
9
|
+
* - The top layer is the stack itself, which is a collection of series. The stack is identified by the `StackId` of the stack.
|
|
10
|
+
* The StackId is defined by the `stackId` prop of the graphical items.
|
|
11
|
+
* A typical stacked chart will have a single stack, but Recharts allows for multiple stacks.
|
|
12
|
+
*
|
|
13
|
+
* - One stack will have multiple series, which are the individual data series that make up the stack.
|
|
14
|
+
* This is the second layer of the stack.
|
|
15
|
+
* One series is represented by a single `GraphicalItem` in the stack.
|
|
16
|
+
* This function returns the identifier for the series.
|
|
17
|
+
*
|
|
18
|
+
* - Finally the third layer is the data point itself, which is a tuple of two numbers.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Collection of all stacks in the chart.
|
|
23
|
+
* A simple stacked chart will have a single stack. Recharts allows for multiple stacks.
|
|
24
|
+
* In a chart without stacks, this will be an empty object.
|
|
25
|
+
*/
|
|
26
|
+
export type AllStackGroups = Record<StackId, StackGroup>
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* One stack group is a collection of series that are stacked together.
|
|
30
|
+
* The stack series and graphical items are joined by the StackSeriesIdentifier.
|
|
31
|
+
*/
|
|
32
|
+
export type StackGroup = {
|
|
33
|
+
readonly graphicalItems: ReadonlyArray<MaybeStackedGraphicalItem>
|
|
34
|
+
readonly stackedData: ReadonlyArray<StackSeries>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Stack series is a collection of data points. This represents one individual graphical item in the stack.
|
|
39
|
+
* There are presumably other series in the stack, which are represented by other `StackSeries` objects
|
|
40
|
+
* that this object will not know about.
|
|
41
|
+
* The coordinates of the data points in the series already include the baseline of the previous series in the stack.
|
|
42
|
+
*
|
|
43
|
+
* The Datum generic is `Record<string, unknown>` because d3 keeps a reference to the original input data
|
|
44
|
+
* in each SeriesPoint.data property.
|
|
45
|
+
*/
|
|
46
|
+
export type StackSeries = Series<Record<string, unknown>, StackSeriesIdentifier>
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Stack data point is a tuple of two numbers:
|
|
50
|
+
* first, where the previous stack series ended,
|
|
51
|
+
* and second, where the current stack series ends.
|
|
52
|
+
* This allows for setting the baseline of the next series in the stack.
|
|
53
|
+
*/
|
|
54
|
+
export type StackDataPoint = [number, number]
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Identifier for a series in the stack.
|
|
58
|
+
* Used to join the stack series with the graphical items in the stack.
|
|
59
|
+
*/
|
|
60
|
+
export type StackSeriesIdentifier = GraphicalItemId
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function isPlainContainer(value: unknown): value is Record<string, unknown> | unknown[] {
|
|
2
|
+
if (Array.isArray(value)) return true
|
|
3
|
+
if (value == null || typeof value !== "object") return false
|
|
4
|
+
const proto = Object.getPrototypeOf(value)
|
|
5
|
+
return proto === Object.prototype || proto === null
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* Structural equality over plain objects and arrays; anything else (functions, DOM nodes,
|
|
9
|
+
class instances, Dates) compares by identity. Selectors rebuild nested objects such as
|
|
10
|
+
`payload` / `tooltipPayload` on every recompute, where upstream's memoized selectors keep
|
|
11
|
+
the references stable, so identity alone would restart animations needlessly. */
|
|
12
|
+
export function structurallyEqual(a: unknown, b: unknown, depth: number = 0): boolean {
|
|
13
|
+
if (Object.is(a, b)) return true
|
|
14
|
+
if (depth > 6 || !isPlainContainer(a) || !isPlainContainer(b)) return false
|
|
15
|
+
if (Array.isArray(a) !== Array.isArray(b)) return false
|
|
16
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
17
|
+
if (a.length !== b.length) return false
|
|
18
|
+
for (let i = 0; i < a.length; i++) {
|
|
19
|
+
if (!structurallyEqual(a[i], b[i], depth + 1)) return false
|
|
20
|
+
}
|
|
21
|
+
return true
|
|
22
|
+
}
|
|
23
|
+
const aRecord = a as Record<string, unknown>
|
|
24
|
+
const bRecord = b as Record<string, unknown>
|
|
25
|
+
const aKeys = Object.keys(aRecord)
|
|
26
|
+
if (aKeys.length !== Object.keys(bRecord).length) return false
|
|
27
|
+
for (const key of aKeys) {
|
|
28
|
+
if (!structurallyEqual(aRecord[key], bRecord[key], depth + 1)) return false
|
|
29
|
+
}
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { isEventKey } from "./excludeEventProps"
|
|
2
|
+
import { ownStringKeys, svgPropCanonicalKey } from "./svgPropertiesNoEvents"
|
|
3
|
+
import type { DataAttributeKeyType, SVGElementPropKeysType } from "./svgPropertiesNoEvents"
|
|
4
|
+
import type { EventKeysType } from "./excludeEventProps"
|
|
5
|
+
|
|
6
|
+
type SVGElementPropsAndEventsType = SVGElementPropKeysType | EventKeysType | DataAttributeKeyType
|
|
7
|
+
|
|
8
|
+
export type SVGPropsAndEvents<T> = Pick<T, Extract<keyof T, SVGElementPropsAndEventsType>>
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Filters an object to only include SVG properties, data attributes, and event handlers.
|
|
12
|
+
* @param obj - The object to filter.
|
|
13
|
+
* @returns A new object containing only valid SVG properties, data attributes, and event handlers.
|
|
14
|
+
*/
|
|
15
|
+
export function svgPropertiesAndEvents<T extends object>(obj: T): SVGPropsAndEvents<T> {
|
|
16
|
+
const result: Record<PropertyKey, unknown> = {}
|
|
17
|
+
for (const key of ownStringKeys(obj)) {
|
|
18
|
+
const canonical = svgPropCanonicalKey(key)
|
|
19
|
+
if (canonical !== undefined) {
|
|
20
|
+
result[canonical] = (obj as Record<string, unknown>)[key]
|
|
21
|
+
} else if (isEventKey(key)) {
|
|
22
|
+
/* Event handler keys (onClick etc.) keep their camelCase — Solid uses
|
|
23
|
+
* delegation via the original prop name. */
|
|
24
|
+
result[key] = (obj as Record<string, unknown>)[key]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result as SVGPropsAndEvents<T>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Function to filter SVG properties from various input types.
|
|
32
|
+
* The input types can be:
|
|
33
|
+
* - A record of string keys to any values, in which case it returns a record of only SVG properties
|
|
34
|
+
* - Anything else, in which case it returns null
|
|
35
|
+
*
|
|
36
|
+
* This function has a wide-open return type, because it will read and filter the props of an arbitrary element.
|
|
37
|
+
*
|
|
38
|
+
* If you wish to have a type-safe version, use svgPropertiesNoEvents directly with a typed object.
|
|
39
|
+
*
|
|
40
|
+
* @param input - The input to filter, which can be a record or other types.
|
|
41
|
+
* @returns A record of SVG properties if the input is a record, otherwise null.
|
|
42
|
+
*/
|
|
43
|
+
export function svgPropertiesAndEventsFromUnknown(input: unknown): Record<string, unknown> | null {
|
|
44
|
+
if (input == null) {
|
|
45
|
+
return null
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (typeof input === "object" && !Array.isArray(input)) {
|
|
49
|
+
return svgPropertiesAndEvents(input as Record<PropertyKey, unknown>)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return null
|
|
53
|
+
}
|