angular-three-tweakpane 4.2.3 → 4.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-three-tweakpane-curve.mjs","sources":["../../../../libs/tweakpane/curve/src/lib/curve.ts","../../../../libs/tweakpane/curve/src/angular-three-tweakpane-curve.ts"],"sourcesContent":["import { computed, DestroyRef, Directive, effect, inject, input, model, untracked } from '@angular/core';\nimport {\n\tBaseBladeParams,\n\tBladeApi,\n\tBladeController,\n\ttype BladePlugin,\n\tcreatePlugin,\n\tEmitter,\n\ttype View,\n\ttype ViewProps,\n} from '@tweakpane/core';\nimport { TweakpaneBlade, TweakpaneFolder, TweakpanePane } from 'angular-three-tweakpane';\nimport type { TpPluginBundle } from 'tweakpane';\n\nexport interface TweakpaneCurvePoint {\n\tx: number;\n\ty: number;\n\tr_in?: number;\n\tr_out?: number;\n\tw_in?: number;\n\tw_out?: number;\n}\n\n/** Structurally compatible with `NgteEcctrlCurveData` without depending on Ecctrl. */\nexport interface TweakpaneCurveData {\n\tpoints: ReadonlyArray<TweakpaneCurvePoint>;\n\tsamples?: number;\n}\n\nexport interface TweakpaneCurveParams {\n\tminX?: number;\n\tmaxX?: number;\n\tminY?: number;\n\tmaxY?: number;\n}\n\ninterface CurveBladeParams extends BaseBladeParams, Required<TweakpaneCurveParams> {\n\tview: 'angular-three-curve';\n\tvalue: TweakpaneCurveData;\n\tlabel?: string;\n}\n\ninterface CurveEvents {\n\tchange: { value: TweakpaneCurveData; last: boolean };\n}\n\ntype CurveSelectionKind = 'point' | 'in' | 'out';\n\ninterface CurveSelection {\n\tindex: number;\n\tkind: CurveSelectionKind;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst VIEW_WIDTH = 220;\nconst VIEW_HEIGHT = 112;\nconst VIEW_PADDING = 10;\nconst TANGENT_LENGTH = 0.18;\nconst CURVE_X_EPSILON = 1e-6;\nconst MIN_TANGENT_ANGLE = -Math.PI / 2;\nconst MAX_TANGENT_ANGLE = Math.PI / 2;\nconst MAX_TANGENT_WEIGHT = 3;\nconst DEFAULT_CURVE_PARAMS: Required<TweakpaneCurveParams> = {\n\tminX: 0,\n\tmaxX: 1,\n\tminY: 0,\n\tmaxY: 1,\n};\n\nclass CurveView implements View {\n\treadonly element: HTMLElement;\n\treadonly svg: SVGSVGElement;\n\treadonly path: SVGPathElement;\n\treadonly tangents: SVGGElement;\n\treadonly points: SVGGElement;\n\treadonly label: HTMLDivElement;\n\n\tconstructor(document: Document, viewProps: ViewProps) {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.classList.add('tweakpane-curve');\n\t\tviewProps.bindClassModifiers(this.element);\n\n\t\tthis.label = document.createElement('div');\n\t\tthis.label.classList.add('tweakpane-curve__label');\n\t\tthis.element.appendChild(this.label);\n\n\t\tthis.svg = document.createElementNS(SVG_NS, 'svg');\n\t\tthis.svg.classList.add('tweakpane-curve__editor');\n\t\tthis.svg.setAttribute('viewBox', `0 0 ${VIEW_WIDTH} ${VIEW_HEIGHT}`);\n\t\tthis.svg.setAttribute('role', 'application');\n\t\tthis.svg.setAttribute('aria-label', 'Curve editor');\n\t\tthis.svg.setAttribute('tabindex', '0');\n\t\tthis.svg.setAttribute('preserveAspectRatio', 'none');\n\t\tthis.element.appendChild(this.svg);\n\n\t\tconst grid = document.createElementNS(SVG_NS, 'path');\n\t\tgrid.classList.add('tweakpane-curve__grid');\n\t\tgrid.setAttribute(\n\t\t\t'd',\n\t\t\t`M ${VIEW_PADDING} ${VIEW_HEIGHT / 2} H ${VIEW_WIDTH - VIEW_PADDING} M ${VIEW_WIDTH / 2} ${VIEW_PADDING} V ${VIEW_HEIGHT - VIEW_PADDING}`,\n\t\t);\n\t\tthis.svg.appendChild(grid);\n\n\t\tthis.path = document.createElementNS(SVG_NS, 'path');\n\t\tthis.path.classList.add('tweakpane-curve__path');\n\t\tthis.svg.appendChild(this.path);\n\n\t\tthis.tangents = document.createElementNS(SVG_NS, 'g');\n\t\tthis.svg.appendChild(this.tangents);\n\n\t\tthis.points = document.createElementNS(SVG_NS, 'g');\n\t\tthis.svg.appendChild(this.points);\n\t}\n\n\trender(value: TweakpaneCurveData, params: Required<TweakpaneCurveParams>, selected: CurveSelection | null) {\n\t\tconst points = normalizeCurveData(value, params).points;\n\t\tconst commands: string[] = [];\n\t\tfor (let index = 0; index < 64; index++) {\n\t\t\tconst x = params.minX + ((params.maxX - params.minX) * index) / 63;\n\t\t\tconst y = evaluateCurve(points, x);\n\t\t\tconst screen = toScreen({ x, y }, params);\n\t\t\tcommands.push(`${index === 0 ? 'M' : 'L'} ${screen.x.toFixed(2)} ${screen.y.toFixed(2)}`);\n\t\t}\n\t\tthis.path.setAttribute('d', commands.join(' '));\n\t\tthis.tangents.replaceChildren();\n\t\tthis.points.replaceChildren();\n\t\tfor (const [index, point] of points.entries()) {\n\t\t\tif (index > 0) this.renderTangent(points, index, 'in', params, selected);\n\t\t\tif (index < points.length - 1) this.renderTangent(points, index, 'out', params, selected);\n\n\t\t\tconst screen = toScreen(point, params);\n\t\t\tconst circle = this.svg.ownerDocument.createElementNS(SVG_NS, 'circle');\n\t\t\tcircle.classList.add('tweakpane-curve__point');\n\t\t\tif (selected?.index === index && selected.kind === 'point') {\n\t\t\t\tcircle.classList.add('tweakpane-curve__point--selected');\n\t\t\t}\n\t\t\tcircle.dataset['index'] = String(index);\n\t\t\tcircle.setAttribute('cx', String(screen.x));\n\t\t\tcircle.setAttribute('cy', String(screen.y));\n\t\t\tcircle.setAttribute('r', selected?.index === index && selected.kind === 'point' ? '5' : '4');\n\t\t\tthis.points.appendChild(circle);\n\t\t}\n\t}\n\n\tprivate renderTangent(\n\t\tpoints: ReadonlyArray<TweakpaneCurvePoint>,\n\t\tindex: number,\n\t\tkind: 'in' | 'out',\n\t\tparams: Required<TweakpaneCurveParams>,\n\t\tselected: CurveSelection | null,\n\t) {\n\t\tconst point = points[index];\n\t\tconst handle = getTangentHandle(point, kind, params);\n\t\tconst pointScreen = toScreen(point, params);\n\t\tconst handleScreen = toScreen(handle, params);\n\t\tconst line = this.svg.ownerDocument.createElementNS(SVG_NS, 'line');\n\t\tline.classList.add('tweakpane-curve__tangent-line');\n\t\tline.setAttribute('x1', String(pointScreen.x));\n\t\tline.setAttribute('y1', String(pointScreen.y));\n\t\tline.setAttribute('x2', String(handleScreen.x));\n\t\tline.setAttribute('y2', String(handleScreen.y));\n\t\tthis.tangents.appendChild(line);\n\n\t\tconst circle = this.svg.ownerDocument.createElementNS(SVG_NS, 'circle');\n\t\tcircle.classList.add('tweakpane-curve__tangent');\n\t\tif (selected?.index === index && selected.kind === kind) {\n\t\t\tcircle.classList.add('tweakpane-curve__tangent--selected');\n\t\t}\n\t\tcircle.dataset['index'] = String(index);\n\t\tcircle.dataset['tangent'] = kind;\n\t\tcircle.setAttribute('cx', String(handleScreen.x));\n\t\tcircle.setAttribute('cy', String(handleScreen.y));\n\t\tcircle.setAttribute('r', selected?.index === index && selected.kind === kind ? '4' : '3');\n\t\tthis.tangents.appendChild(circle);\n\t}\n}\n\nclass CurveController extends BladeController<CurveView> {\n\treadonly emitter = new Emitter<CurveEvents>();\n\tprivate curveData: TweakpaneCurveData;\n\tprivate selected: CurveSelection | null = null;\n\tprivate pointerId: number | null = null;\n\n\tconstructor(\n\t\tdocument: Document,\n\t\treadonly params: CurveBladeParams,\n\t\tblade: ConstructorParameters<typeof BladeController>[0]['blade'],\n\t\tviewProps: ViewProps,\n\t) {\n\t\tconst view = new CurveView(document, viewProps);\n\t\tsuper({ blade, view, viewProps });\n\t\tthis.curveData = normalizeCurveData(params.value, params);\n\t\tthis.view.label.textContent = params.label ?? '';\n\t\tthis.view.label.hidden = !params.label;\n\t\tthis.render();\n\n\t\tthis.onPointerDown = this.onPointerDown.bind(this);\n\t\tthis.onPointerMove = this.onPointerMove.bind(this);\n\t\tthis.onPointerEnd = this.onPointerEnd.bind(this);\n\t\tthis.onDoubleClick = this.onDoubleClick.bind(this);\n\t\tthis.onContextMenu = this.onContextMenu.bind(this);\n\t\tthis.onKeyDown = this.onKeyDown.bind(this);\n\t\tview.svg.addEventListener('pointerdown', this.onPointerDown);\n\t\tview.svg.addEventListener('pointermove', this.onPointerMove);\n\t\tview.svg.addEventListener('pointerup', this.onPointerEnd);\n\t\tview.svg.addEventListener('pointercancel', this.onPointerEnd);\n\t\tview.svg.addEventListener('lostpointercapture', this.onPointerEnd);\n\t\tview.svg.addEventListener('dblclick', this.onDoubleClick);\n\t\tview.svg.addEventListener('contextmenu', this.onContextMenu);\n\t\tview.svg.addEventListener('keydown', this.onKeyDown);\n\t\tviewProps.handleDispose(() => this.disposeListeners());\n\t}\n\n\tgetValue() {\n\t\treturn cloneCurveData(this.curveData);\n\t}\n\n\tsetValue(value: TweakpaneCurveData, emit = false, last = true) {\n\t\tthis.curveData = normalizeCurveData(value, this.params);\n\t\tthis.render();\n\t\tif (emit) this.emitter.emit('change', { value: this.getValue(), last });\n\t}\n\n\tprivate onPointerDown(event: PointerEvent) {\n\t\tif (this.viewProps.globalDisabled.rawValue || this.pointerId !== null) return;\n\t\tconst target = event.target as SVGElement;\n\t\tconst index = target.dataset['index'];\n\t\tif (index === undefined) return;\n\t\tevent.preventDefault();\n\t\tconst tangent = target.dataset['tangent'];\n\t\tthis.selected = {\n\t\t\tindex: Number(index),\n\t\t\tkind: tangent === 'in' || tangent === 'out' ? tangent : 'point',\n\t\t};\n\t\tthis.pointerId = event.pointerId;\n\t\tthis.view.svg.setPointerCapture?.(event.pointerId);\n\t\tthis.render();\n\t}\n\n\tprivate onPointerMove(event: PointerEvent) {\n\t\tif (event.pointerId !== this.pointerId || this.selected === null) return;\n\t\tevent.preventDefault();\n\t\tthis.moveSelected(event, false);\n\t}\n\n\tprivate onPointerEnd(event: PointerEvent) {\n\t\tif (event.pointerId !== this.pointerId) return;\n\t\tif (this.selected !== null) this.moveSelected(event, true);\n\t\tif (this.view.svg.hasPointerCapture?.(event.pointerId)) this.view.svg.releasePointerCapture?.(event.pointerId);\n\t\tthis.pointerId = null;\n\t}\n\n\tprivate onDoubleClick(event: MouseEvent) {\n\t\tif (this.viewProps.globalDisabled.rawValue) return;\n\t\tevent.preventDefault();\n\t\tconst point = fromClient(event, this.view.svg, this.params);\n\t\tconst added = { ...point, r_in: 0, r_out: 0, w_in: 1, w_out: 1 };\n\t\tconst points = [...this.curveData.points, added].sort((a, b) => a.x - b.x);\n\t\tthis.selected = { index: points.indexOf(added), kind: 'point' };\n\t\tthis.setValue({ ...this.curveData, points }, true, true);\n\t}\n\n\tprivate onContextMenu(event: MouseEvent) {\n\t\tif (this.viewProps.globalDisabled.rawValue || this.curveData.points.length <= 2) return;\n\t\tconst target = event.target as SVGElement;\n\t\tif (target.dataset['tangent']) return;\n\t\tconst index = target.dataset['index'];\n\t\tif (index === undefined) return;\n\t\tevent.preventDefault();\n\t\tconst points = this.curveData.points.filter((_, pointIndex) => pointIndex !== Number(index));\n\t\tthis.selected = null;\n\t\tthis.setValue({ ...this.curveData, points }, true, true);\n\t}\n\n\tprivate onKeyDown(event: KeyboardEvent) {\n\t\tif (this.viewProps.globalDisabled.rawValue || this.selected === null) return;\n\t\tif (event.key === 'Delete' || event.key === 'Backspace') {\n\t\t\tevent.preventDefault();\n\t\t\tif (this.selected.kind === 'point') {\n\t\t\t\tif (this.curveData.points.length <= 2) return;\n\t\t\t\tconst points = this.curveData.points.filter((_, index) => index !== this.selected?.index);\n\t\t\t\tthis.selected = null;\n\t\t\t\tthis.setValue({ ...this.curveData, points }, true, true);\n\t\t\t} else {\n\t\t\t\tconst angleKey = this.selected.kind === 'in' ? 'r_in' : 'r_out';\n\t\t\t\tconst weightKey = this.selected.kind === 'in' ? 'w_in' : 'w_out';\n\t\t\t\tconst selectedIndex = this.selected.index;\n\t\t\t\tconst points = this.curveData.points.map((point, index) => {\n\t\t\t\t\tif (index !== selectedIndex) return point;\n\t\t\t\t\tconst reset = { ...point };\n\t\t\t\t\tdelete reset[angleKey];\n\t\t\t\t\tdelete reset[weightKey];\n\t\t\t\t\treturn reset;\n\t\t\t\t});\n\t\t\t\tthis.setValue({ ...this.curveData, points }, true, true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst direction =\n\t\t\tevent.key === 'ArrowLeft' || event.key === 'ArrowDown'\n\t\t\t\t? -1\n\t\t\t\t: event.key === 'ArrowRight' || event.key === 'ArrowUp'\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0;\n\t\tif (direction === 0) return;\n\t\tevent.preventDefault();\n\t\tif (this.selected.kind !== 'point') {\n\t\t\tconst current = this.curveData.points[this.selected.index];\n\t\t\tconst angleKey = this.selected.kind === 'in' ? 'r_in' : 'r_out';\n\t\t\tconst weightKey = this.selected.kind === 'in' ? 'w_in' : 'w_out';\n\t\t\tconst points = this.curveData.points.map((point, index) => {\n\t\t\t\tif (index !== this.selected?.index) return point;\n\t\t\t\tif (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...point,\n\t\t\t\t\t\t[angleKey]: clamp(\n\t\t\t\t\t\t\t(current[angleKey] ?? 0) + direction * 0.02,\n\t\t\t\t\t\t\tMIN_TANGENT_ANGLE,\n\t\t\t\t\t\t\tMAX_TANGENT_ANGLE,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...point,\n\t\t\t\t\t[weightKey]: clamp((current[weightKey] ?? 1) + direction * 0.05, 0, MAX_TANGENT_WEIGHT),\n\t\t\t\t};\n\t\t\t});\n\t\t\tthis.setValue({ ...this.curveData, points }, true, true);\n\t\t\treturn;\n\t\t}\n\t\tconst xStep = (this.params.maxX - this.params.minX) / 100;\n\t\tconst yStep = (this.params.maxY - this.params.minY) / 100;\n\t\tconst current = this.curveData.points[this.selected.index];\n\t\tconst next = {\n\t\t\t...current,\n\t\t\tx: current.x + (event.key === 'ArrowLeft' || event.key === 'ArrowRight' ? direction * xStep : 0),\n\t\t\ty: current.y + (event.key === 'ArrowDown' || event.key === 'ArrowUp' ? direction * yStep : 0),\n\t\t};\n\t\tthis.updateSelectedPoint(next, true);\n\t}\n\n\tprivate moveSelected(event: PointerEvent, last: boolean) {\n\t\tif (this.selected?.kind === 'point') {\n\t\t\tthis.updateSelectedPoint(fromClient(event, this.view.svg, this.params), last);\n\t\t\treturn;\n\t\t}\n\t\tif (this.selected) {\n\t\t\tthis.updateSelectedTangent(fromClient(event, this.view.svg, this.params, false), last);\n\t\t}\n\t}\n\n\tprivate updateSelectedPoint(point: Pick<TweakpaneCurvePoint, 'x' | 'y'>, last: boolean) {\n\t\tif (this.selected === null) return;\n\t\tconst selectedIndex = this.selected.index;\n\t\tconst epsilon = Math.abs(this.params.maxX - this.params.minX) * CURVE_X_EPSILON;\n\t\tconst minX = selectedIndex > 0 ? this.curveData.points[selectedIndex - 1].x + epsilon : this.params.minX;\n\t\tconst maxX =\n\t\t\tselectedIndex < this.curveData.points.length - 1\n\t\t\t\t? this.curveData.points[selectedIndex + 1].x - epsilon\n\t\t\t\t: this.params.maxX;\n\t\tconst points = this.curveData.points.map((candidate, index) =>\n\t\t\tindex === selectedIndex\n\t\t\t\t? {\n\t\t\t\t\t\t...candidate,\n\t\t\t\t\t\tx: clamp(point.x, minX, maxX),\n\t\t\t\t\t\ty: clamp(point.y, this.params.minY, this.params.maxY),\n\t\t\t\t\t}\n\t\t\t\t: candidate,\n\t\t);\n\t\tthis.setValue({ ...this.curveData, points }, true, last);\n\t}\n\n\tprivate updateSelectedTangent(cursor: Pick<TweakpaneCurvePoint, 'x' | 'y'>, last: boolean) {\n\t\tif (this.selected === null || this.selected.kind === 'point') return;\n\t\tconst points = updateCurveTangent(\n\t\t\tthis.curveData.points,\n\t\t\tthis.selected.index,\n\t\t\tthis.selected.kind,\n\t\t\tcursor,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.setValue({ ...this.curveData, points }, true, last);\n\t}\n\n\tprivate render() {\n\t\tthis.view.render(this.curveData, this.params, this.selected);\n\t}\n\n\tprivate disposeListeners() {\n\t\tconst view = this.view.svg;\n\t\tview.removeEventListener('pointerdown', this.onPointerDown);\n\t\tview.removeEventListener('pointermove', this.onPointerMove);\n\t\tview.removeEventListener('pointerup', this.onPointerEnd);\n\t\tview.removeEventListener('pointercancel', this.onPointerEnd);\n\t\tview.removeEventListener('lostpointercapture', this.onPointerEnd);\n\t\tview.removeEventListener('dblclick', this.onDoubleClick);\n\t\tview.removeEventListener('contextmenu', this.onContextMenu);\n\t\tview.removeEventListener('keydown', this.onKeyDown);\n\t}\n}\n\nexport interface TweakpaneCurveApiEvents {\n\tchange: { value: TweakpaneCurveData; last: boolean };\n}\n\nexport class TweakpaneCurveApi extends BladeApi<CurveController> {\n\tget value() {\n\t\treturn this.controller.getValue();\n\t}\n\n\tset value(value: TweakpaneCurveData) {\n\t\tthis.controller.setValue(value);\n\t}\n\n\ton(eventName: 'change', handler: (event: TweakpaneCurveApiEvents['change']) => void) {\n\t\tthis.controller.emitter.on(eventName, handler);\n\t\treturn this;\n\t}\n\n\toff(eventName: 'change', handler: (event: TweakpaneCurveApiEvents['change']) => void) {\n\t\tthis.controller.emitter.off(eventName, handler);\n\t\treturn this;\n\t}\n}\n\nconst CurvePlugin: BladePlugin<CurveBladeParams> = createPlugin({\n\tid: 'angular-three-curve',\n\ttype: 'blade',\n\taccept(params) {\n\t\tif (params['view'] !== 'angular-three-curve' || !isCurveData(params['value'])) return null;\n\t\treturn {\n\t\t\tparams: {\n\t\t\t\tview: 'angular-three-curve',\n\t\t\t\tvalue: params['value'],\n\t\t\t\tlabel: typeof params['label'] === 'string' ? params['label'] : undefined,\n\t\t\t\tminX: numberParam(params['minX'], 0),\n\t\t\t\tmaxX: numberParam(params['maxX'], 1),\n\t\t\t\tminY: numberParam(params['minY'], 0),\n\t\t\t\tmaxY: numberParam(params['maxY'], 1),\n\t\t\t},\n\t\t};\n\t},\n\tcontroller(args) {\n\t\treturn new CurveController(args.document, args.params, args.blade, args.viewProps);\n\t},\n\tapi(args) {\n\t\treturn args.controller instanceof CurveController ? new TweakpaneCurveApi(args.controller) : null;\n\t},\n});\n\nexport const TWEAKPANE_CURVE_PLUGIN: TpPluginBundle = {\n\tid: 'angular-three-tweakpane-curve',\n\tplugins: [CurvePlugin],\n\tcss: `\n\t\t.tweakpane-curve { padding: 4px 0; }\n\t\t.tweakpane-curve__label { color: var(--lbl-fg); font-size: 11px; margin-bottom: 4px; }\n\t\t.tweakpane-curve__editor { background: var(--in-bg); border-radius: var(--bld-br); display: block; height: 112px; touch-action: none; width: 100%; }\n\t\t.tweakpane-curve__grid { fill: none; stroke: var(--in-fg); stroke-opacity: .12; stroke-width: 1; }\n\t\t.tweakpane-curve__path { fill: none; stroke: var(--btn-bg-a); stroke-width: 2; }\n\t\t.tweakpane-curve__tangent-line { pointer-events: none; stroke: var(--in-fg); stroke-opacity: .45; stroke-width: 1; }\n\t\t.tweakpane-curve__tangent { cursor: crosshair; fill: var(--in-bg); stroke: var(--btn-fg); stroke-width: 1.5; }\n\t\t.tweakpane-curve__tangent--selected { fill: var(--btn-bg-a); stroke: var(--btn-fg); }\n\t\t.tweakpane-curve__point { cursor: grab; fill: var(--btn-fg); stroke: var(--btn-bg-a); stroke-width: 2; }\n\t\t.tweakpane-curve__point--selected { fill: var(--btn-bg-a); stroke: var(--btn-fg); }\n\t`,\n};\n\n/** A two-way Tweakpane curve editor compatible with Ecctrl's curve DTO. */\n@Directive({\n\tselector: 'tweakpane-curve',\n\thostDirectives: [{ directive: TweakpaneBlade, inputs: ['hidden', 'disabled'] }],\n})\nexport class TweakpaneCurve {\n\tvalue = model.required<TweakpaneCurveData>();\n\tlabel = input<string>();\n\tparams = input<TweakpaneCurveParams>({});\n\n\tprivate readonly folder = inject(TweakpaneFolder);\n\tprivate readonly pane = inject(TweakpanePane);\n\tprivate readonly blade = inject(TweakpaneBlade);\n\n\tprivate readonly api = computed(() => {\n\t\tconst folder = this.folder.folder();\n\t\tif (!folder) return null;\n\t\tconst params = this.params();\n\t\treturn folder.addBlade({\n\t\t\tview: 'angular-three-curve',\n\t\t\tvalue: untracked(this.value),\n\t\t\tlabel: this.label(),\n\t\t\t...params,\n\t\t}) as TweakpaneCurveApi;\n\t});\n\n\tconstructor() {\n\t\tthis.pane.registerPlugin(TWEAKPANE_CURVE_PLUGIN);\n\t\tthis.blade.sync(this.api);\n\n\t\teffect((onCleanup) => {\n\t\t\tconst api = this.api();\n\t\t\tif (!api) return;\n\t\t\tconst onChange = (event: TweakpaneCurveApiEvents['change']) => this.value.set(event.value);\n\t\t\tapi.on('change', onChange);\n\t\t\tonCleanup(() => {\n\t\t\t\tapi.off('change', onChange);\n\t\t\t\tapi.dispose();\n\t\t\t});\n\t\t});\n\n\t\teffect(() => {\n\t\t\tconst api = this.api();\n\t\t\tif (api) api.value = this.value();\n\t\t});\n\n\t\tinject(DestroyRef).onDestroy(() => this.api()?.dispose());\n\t}\n}\n\nexport function normalizeCurveData(\n\tvalue: TweakpaneCurveData,\n\tparams: TweakpaneCurveParams = DEFAULT_CURVE_PARAMS,\n): TweakpaneCurveData {\n\tconst resolvedParams = {\n\t\tminX: numberParam(params.minX, DEFAULT_CURVE_PARAMS.minX),\n\t\tmaxX: numberParam(params.maxX, DEFAULT_CURVE_PARAMS.maxX),\n\t\tminY: numberParam(params.minY, DEFAULT_CURVE_PARAMS.minY),\n\t\tmaxY: numberParam(params.maxY, DEFAULT_CURVE_PARAMS.maxY),\n\t};\n\tconst points = value.points\n\t\t.map((point) => ({\n\t\t\t...point,\n\t\t\tx: clamp(point.x, resolvedParams.minX, resolvedParams.maxX),\n\t\t\ty: clamp(point.y, resolvedParams.minY, resolvedParams.maxY),\n\t\t}))\n\t\t.sort((a, b) => a.x - b.x)\n\t\t.map((point, index, sorted) => {\n\t\t\tconst normalized = { ...point };\n\t\t\tif (index === 0) {\n\t\t\t\tdelete normalized.r_in;\n\t\t\t\tdelete normalized.w_in;\n\t\t\t}\n\t\t\tif (index === sorted.length - 1) {\n\t\t\t\tdelete normalized.r_out;\n\t\t\t\tdelete normalized.w_out;\n\t\t\t}\n\t\t\treturn normalized;\n\t\t});\n\treturn {\n\t\t...value,\n\t\tpoints,\n\t};\n}\n\n/** @internal Pure tangent update used by the blade controller and focused tests. */\nexport function updateCurveTangent(\n\tpoints: ReadonlyArray<TweakpaneCurvePoint>,\n\tindex: number,\n\tkind: 'in' | 'out',\n\tcursor: Pick<TweakpaneCurvePoint, 'x' | 'y'>,\n\tparams: Required<TweakpaneCurveParams>,\n): ReadonlyArray<TweakpaneCurvePoint> {\n\tconst point = points[index];\n\tif (!point) return points;\n\tconst direction = kind === 'out' ? 1 : -1;\n\tconst dx = (cursor.x - point.x) * direction;\n\tconst dy = (cursor.y - point.y) * direction;\n\tconst angle = clamp(Math.atan2(dy, dx), MIN_TANGENT_ANGLE, MAX_TANGENT_ANGLE);\n\tconst weight = clamp(Math.hypot(dx, dy) / tangentUnitLength(params), 0, MAX_TANGENT_WEIGHT);\n\tconst angleKey = kind === 'in' ? 'r_in' : 'r_out';\n\tconst weightKey = kind === 'in' ? 'w_in' : 'w_out';\n\treturn points.map((candidate, candidateIndex) =>\n\t\tcandidateIndex === index ? { ...candidate, [angleKey]: angle, [weightKey]: weight } : candidate,\n\t);\n}\n\nfunction getTangentHandle(point: TweakpaneCurvePoint, kind: 'in' | 'out', params: Required<TweakpaneCurveParams>) {\n\tconst direction = kind === 'out' ? 1 : -1;\n\tconst angle = kind === 'in' ? (point.r_in ?? 0) : (point.r_out ?? 0);\n\tconst weight = kind === 'in' ? (point.w_in ?? 1) : (point.w_out ?? 1);\n\tconst length = tangentUnitLength(params) * weight * direction;\n\treturn {\n\t\tx: point.x + Math.cos(angle) * length,\n\t\ty: point.y + Math.sin(angle) * length,\n\t};\n}\n\nfunction tangentUnitLength(params: Required<TweakpaneCurveParams>) {\n\tconst xRange = Math.abs(params.maxX - params.minX);\n\tconst yRange = Math.abs(params.maxY - params.minY);\n\tconst ranges = [xRange, yRange].filter((range) => range > 1e-9);\n\treturn (ranges.length > 0 ? Math.min(...ranges) : 1) * TANGENT_LENGTH;\n}\n\nfunction isCurveData(value: unknown): value is TweakpaneCurveData {\n\treturn !!value && typeof value === 'object' && Array.isArray((value as TweakpaneCurveData).points);\n}\n\nfunction cloneCurveData(value: TweakpaneCurveData): TweakpaneCurveData {\n\treturn { ...value, points: value.points.map((point) => ({ ...point })) };\n}\n\nfunction numberParam(value: unknown, fallback: number) {\n\treturn typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n\treturn Math.min(Math.max(value, Math.min(min, max)), Math.max(min, max));\n}\n\nfunction toScreen(point: Pick<TweakpaneCurvePoint, 'x' | 'y'>, params: Required<TweakpaneCurveParams>) {\n\tconst width = VIEW_WIDTH - VIEW_PADDING * 2;\n\tconst height = VIEW_HEIGHT - VIEW_PADDING * 2;\n\treturn {\n\t\tx: VIEW_PADDING + ((point.x - params.minX) / Math.max(params.maxX - params.minX, 1e-9)) * width,\n\t\ty: VIEW_HEIGHT - VIEW_PADDING - ((point.y - params.minY) / Math.max(params.maxY - params.minY, 1e-9)) * height,\n\t};\n}\n\nfunction fromClient(\n\tevent: Pick<MouseEvent, 'clientX' | 'clientY'>,\n\telement: SVGSVGElement,\n\tparams: Required<TweakpaneCurveParams>,\n\tclampToBounds = true,\n) {\n\tconst rect = element.getBoundingClientRect();\n\tconst viewX = ((event.clientX - rect.left) / Math.max(rect.width, 1)) * VIEW_WIDTH;\n\tconst viewY = ((event.clientY - rect.top) / Math.max(rect.height, 1)) * VIEW_HEIGHT;\n\tconst rawX = (viewX - VIEW_PADDING) / (VIEW_WIDTH - VIEW_PADDING * 2);\n\tconst rawY = (viewY - VIEW_PADDING) / (VIEW_HEIGHT - VIEW_PADDING * 2);\n\tconst x = clampToBounds ? clamp(rawX, 0, 1) : rawX;\n\tconst y = clampToBounds ? clamp(rawY, 0, 1) : rawY;\n\treturn {\n\t\tx: params.minX + x * (params.maxX - params.minX),\n\t\ty: params.maxY - y * (params.maxY - params.minY),\n\t};\n}\n\nfunction evaluateCurve(points: ReadonlyArray<TweakpaneCurvePoint>, value: number) {\n\tif (points.length === 0) return 0;\n\tif (points.length === 1 || value <= points[0].x) return points[0].y;\n\tfor (let index = 1; index < points.length; index++) {\n\t\tconst previous = points[index - 1];\n\t\tconst next = points[index];\n\t\tif (value > next.x) continue;\n\t\tconst width = next.x - previous.x;\n\t\tif (width <= 0) return previous.y;\n\t\tconst t = clamp((value - previous.x) / width, 0, 1);\n\t\tconst t2 = t * t;\n\t\tconst t3 = t2 * t;\n\t\tconst linearSlope = (next.y - previous.y) / width;\n\t\tconst outgoingSlope =\n\t\t\tlinearSlope +\n\t\t\t((previous.r_out === undefined ? 0 : Math.tan(previous.r_out)) - linearSlope) * (previous.w_out ?? 1);\n\t\tconst incomingSlope =\n\t\t\tlinearSlope + ((next.r_in === undefined ? 0 : Math.tan(next.r_in)) - linearSlope) * (next.w_in ?? 1);\n\t\treturn (\n\t\t\t(2 * t3 - 3 * t2 + 1) * previous.y +\n\t\t\t(t3 - 2 * t2 + t) * width * outgoingSlope +\n\t\t\t(-2 * t3 + 3 * t2) * next.y +\n\t\t\t(t3 - t2) * width * incomingSlope\n\t\t);\n\t}\n\treturn points[points.length - 1].y;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -887,6 +887,8 @@ class TweakpanePane {
887
887
  this.folder = inject(TweakpaneFolder, { host: true });
888
888
  this.tweakpaneAnchor = inject(TweakpaneAnchor, { optional: true });
889
889
  this.pane = signal(null, ...(ngDevMode ? [{ debugName: "pane" }] : /* istanbul ignore next */ []));
890
+ this.pendingPlugins = new Map();
891
+ this.registeredPluginIds = new Set();
890
892
  this.folder.isSelf = false;
891
893
  afterNextRender(() => {
892
894
  const container = this.container();
@@ -904,6 +906,11 @@ class TweakpanePane {
904
906
  }
905
907
  }
906
908
  const pane = new Pane(paneOptions);
909
+ for (const plugin of this.pendingPlugins.values()) {
910
+ pane.registerPlugin(plugin);
911
+ this.registeredPluginIds.add(plugin.id);
912
+ }
913
+ this.pendingPlugins.clear();
907
914
  this.pane.set(pane);
908
915
  this.folder.parentFolder.set(pane);
909
916
  // Set the pane's folder for tweaks() to use
@@ -936,6 +943,18 @@ class TweakpanePane {
936
943
  this.updateStyleEffect('width');
937
944
  });
938
945
  }
946
+ /** Registers a custom Tweakpane plugin before or after the pane is mounted. */
947
+ registerPlugin(plugin) {
948
+ if (this.registeredPluginIds.has(plugin.id) || this.pendingPlugins.has(plugin.id))
949
+ return;
950
+ const pane = this.pane();
951
+ if (!pane) {
952
+ this.pendingPlugins.set(plugin.id, plugin);
953
+ return;
954
+ }
955
+ pane.registerPlugin(plugin);
956
+ this.registeredPluginIds.add(plugin.id);
957
+ }
939
958
  /**
940
959
  * Updates a CSS style property on the pane's parent element.
941
960
  * @param propertyName - The name of the style property to update