angular-three-tweakpane 4.0.0-next.115 → 4.0.0-next.118

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,975 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Signal, ViewContainerRef, ComponentRef, InjectionToken, ElementRef, WritableSignal, Injector } from '@angular/core';
3
+ import { BladeApi, FolderApi, TpChangeEvent, ButtonApi, BooleanInputParams, ColorInputParams, NumberInputParams, Point2dInputParams, Point3dInputParams, Point4dInputParams, StringInputParams } from 'tweakpane';
4
+ import { BindingParams, TpMouseEvent } from '@tweakpane/core';
5
+
6
+ /**
7
+ * Directive that provides title functionality for Tweakpane components.
8
+ *
9
+ * This is a base directive used by other Tweakpane components (like `TweakpaneFolder`,
10
+ * `TweakpanePane`, `TweakpaneButton`) to manage their titles reactively.
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <tweakpane-folder title="Settings">
15
+ * <!-- folder contents -->
16
+ * </tweakpane-folder>
17
+ * ```
18
+ */
19
+ declare class TweakpaneTitle {
20
+ /**
21
+ * The title text to display.
22
+ * @default 'TweakPane Title'
23
+ */
24
+ title: i0.InputSignal<string>;
25
+ private injector;
26
+ /**
27
+ * Gets the current title value without tracking signal dependencies.
28
+ * Useful for initial configuration when creating Tweakpane components.
29
+ * @returns The current title string value
30
+ */
31
+ get snapshot(): string;
32
+ /**
33
+ * Synchronizes the title property with a Tweakpane API object.
34
+ * Creates a reactive effect that updates the API's title whenever
35
+ * the input title changes.
36
+ *
37
+ * @param api - A function that returns the Tweakpane API object (or null if not ready)
38
+ * @returns The created effect reference
39
+ */
40
+ sync(api: () => {
41
+ title: string | undefined;
42
+ } | null): i0.EffectRef;
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneTitle, never>;
44
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneTitle, never, never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
45
+ }
46
+
47
+ /**
48
+ * Directive that provides hidden and disabled state management for Tweakpane blades.
49
+ *
50
+ * This is a base directive used by other Tweakpane components to control
51
+ * visibility and interactivity of controls.
52
+ *
53
+ * @example
54
+ * ```html
55
+ * <tweakpane-number [hidden]="isHidden" [disabled]="isDisabled" [(value)]="speed" />
56
+ * ```
57
+ */
58
+ declare class TweakpaneBlade {
59
+ /**
60
+ * Whether the blade is hidden.
61
+ * @default false
62
+ */
63
+ hidden: i0.InputSignalWithTransform<boolean, unknown>;
64
+ /**
65
+ * Whether the blade is disabled (non-interactive).
66
+ * @default false
67
+ */
68
+ disabled: i0.InputSignalWithTransform<boolean, unknown>;
69
+ private injector;
70
+ /**
71
+ * Gets the current hidden and disabled values without tracking signal dependencies.
72
+ * Useful for initial configuration when creating Tweakpane components.
73
+ * @returns An object containing the current hidden and disabled states
74
+ */
75
+ get snapshot(): {
76
+ hidden: boolean;
77
+ disabled: boolean;
78
+ };
79
+ /**
80
+ * Synchronizes the hidden and disabled properties with a Tweakpane BladeApi.
81
+ * Creates a reactive effect that updates the API's state whenever
82
+ * the input values change.
83
+ *
84
+ * @param api - A function that returns the Tweakpane BladeApi (or null if not ready)
85
+ * @returns The created effect reference
86
+ */
87
+ sync(api: () => BladeApi | null): i0.EffectRef;
88
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneBlade, never>;
89
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneBlade, "tweakpane-blade", never, { "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
90
+ }
91
+
92
+ /**
93
+ * Directive for creating collapsible folders within a Tweakpane.
94
+ *
95
+ * Folders are used to organize controls into logical groups. They can be
96
+ * nested within other folders or directly within a pane.
97
+ *
98
+ * @example
99
+ * ```html
100
+ * <tweakpane-pane>
101
+ * <tweakpane-folder title="Physics" [expanded]="true">
102
+ * <tweakpane-number label="Gravity" [(value)]="gravity" />
103
+ * <tweakpane-number label="Friction" [(value)]="friction" />
104
+ * </tweakpane-folder>
105
+ *
106
+ * <tweakpane-folder title="Appearance">
107
+ * <tweakpane-color label="Color" [(value)]="color" />
108
+ * </tweakpane-folder>
109
+ * </tweakpane-pane>
110
+ * ```
111
+ */
112
+ declare class TweakpaneFolder {
113
+ /**
114
+ * Whether the folder is expanded (open) or collapsed.
115
+ * Supports two-way binding with `[(expanded)]`.
116
+ * @default false
117
+ */
118
+ expanded: i0.ModelSignal<boolean>;
119
+ private title;
120
+ private blade;
121
+ private parent;
122
+ /**
123
+ * Signal containing the parent folder API.
124
+ * Automatically links to the parent folder in the component hierarchy.
125
+ */
126
+ parentFolder: i0.WritableSignal<FolderApi | null | undefined>;
127
+ /**
128
+ * Computed signal containing the Tweakpane FolderApi for this folder.
129
+ * Returns null if the parent folder is not yet available.
130
+ */
131
+ folder: Signal<FolderApi | null>;
132
+ /**
133
+ * Internal flag indicating whether this directive creates its own folder
134
+ * or reuses the parent folder. Set to `false` by `TweakpanePane`.
135
+ * @internal
136
+ */
137
+ isSelf: boolean;
138
+ constructor();
139
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneFolder, never>;
140
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneFolder, "tweakpane-folder", never, { "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, never, never, true, [{ directive: typeof TweakpaneTitle; inputs: { "title": "title"; }; outputs: {}; }, { directive: typeof TweakpaneBlade; inputs: { "hidden": "hidden"; "disabled": "disabled"; }; outputs: {}; }]>;
141
+ }
142
+
143
+ /**
144
+ * Directive that provides an anchor point for the `tweaks()` function to dynamically create Tweakpane controls.
145
+ *
146
+ * Add this directive to your `ngt-canvas` element to enable the `tweaks()` API:
147
+ *
148
+ * ```html
149
+ * <ngt-canvas tweakpaneAnchor>
150
+ * <ng-template #sceneGraph>
151
+ * <!-- your scene -->
152
+ * </ng-template>
153
+ * </ngt-canvas>
154
+ * ```
155
+ *
156
+ * Then use `tweaks()` in any component within the canvas:
157
+ *
158
+ * ```typescript
159
+ * const controls = tweaks('Physics', {
160
+ * gravity: { value: 9.8, min: 0, max: 20 },
161
+ * debug: this.debugMode, // two-way binding with existing signal
162
+ * });
163
+ * ```
164
+ */
165
+ declare class TweakpaneAnchor {
166
+ /**
167
+ * The ViewContainerRef where dynamic components will be created.
168
+ * Injected from the host element.
169
+ */
170
+ vcr: ViewContainerRef;
171
+ /**
172
+ * Reference to the pane's TweakpaneFolder, set by TweakpanePane when it initializes.
173
+ * This is used as the parent folder for dynamically created folders.
174
+ */
175
+ paneFolder: i0.WritableSignal<TweakpaneFolder | null>;
176
+ /**
177
+ * Registry of folder ComponentRefs by folder name.
178
+ * Used to reuse existing folders when multiple `tweaks()` calls use the same folder name.
179
+ */
180
+ folders: Record<string, ComponentRef<TweakpaneAnchorHost>>;
181
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneAnchor, never>;
182
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneAnchor, "[tweakpaneAnchor]", never, {}, {}, never, never, true, never>;
183
+ }
184
+ /**
185
+ * A minimal host component used for dynamically creating Tweakpane controls.
186
+ * This component serves as a host for directives like TweakpaneFolder, TweakpaneNumber, etc.
187
+ * when using the `tweaks()` function.
188
+ *
189
+ * @internal
190
+ */
191
+ declare class TweakpaneAnchorHost {
192
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneAnchorHost, never>;
193
+ static ɵcmp: i0.ɵɵComponentDeclaration<TweakpaneAnchorHost, "tweakpane-anchor-host", never, {}, {}, never, never, true, never>;
194
+ }
195
+
196
+ /**
197
+ * Directive that provides debounced change event handling for Tweakpane controls.
198
+ *
199
+ * This is a base directive used by binding-based controls to prevent
200
+ * excessive updates when values change rapidly (e.g., during slider dragging).
201
+ *
202
+ * @example
203
+ * ```html
204
+ * <!-- Debounce value updates by 300ms -->
205
+ * <tweakpane-number [debounce]="300" [(value)]="speed" />
206
+ * ```
207
+ */
208
+ declare class TweakpaneDebounce {
209
+ /**
210
+ * The debounce delay in milliseconds before emitting value changes.
211
+ * @default 150
212
+ */
213
+ debounce: i0.InputSignalWithTransform<number, unknown>;
214
+ private injector;
215
+ /**
216
+ * Synchronizes debounced change events from a Tweakpane API with a callback.
217
+ * Creates a reactive effect that subscribes to change events and debounces them.
218
+ *
219
+ * @typeParam T - The type of value being tracked
220
+ * @param api - A function that returns the Tweakpane API object with on/off methods (or null if not ready)
221
+ * @param cb - Callback function invoked with the change event after debounce delay
222
+ * @returns The created effect reference
223
+ */
224
+ sync<T>(api: () => {
225
+ on: (evName: 'change', cb: (ev: TpChangeEvent<T>) => void) => void;
226
+ off: (evName: 'change', cb: (ev: TpChangeEvent<T>) => void) => void;
227
+ } | null, cb: (ev: TpChangeEvent<T>) => void): i0.EffectRef;
228
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneDebounce, never>;
229
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneDebounce, never, never, { "debounce": { "alias": "debounce"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
230
+ }
231
+
232
+ /**
233
+ * Directive that provides label and tag functionality for Tweakpane controls.
234
+ *
235
+ * This is a base directive used by binding-based controls (like `TweakpaneNumber`,
236
+ * `TweakpaneText`, `TweakpaneCheckbox`) to manage their labels and optional tags.
237
+ *
238
+ * @example
239
+ * ```html
240
+ * <tweakpane-number label="Speed" tag="m/s" [(value)]="speed" />
241
+ * ```
242
+ */
243
+ declare class TweakpaneLabel {
244
+ /**
245
+ * The label text displayed next to the control.
246
+ * @default ''
247
+ */
248
+ label: i0.InputSignal<string>;
249
+ /**
250
+ * An optional tag displayed alongside the label (e.g., units like "px", "m/s").
251
+ * @default ''
252
+ */
253
+ tag: i0.InputSignal<string>;
254
+ private injector;
255
+ /**
256
+ * Gets the current label and tag values without tracking signal dependencies.
257
+ * Useful for initial configuration when creating Tweakpane controls.
258
+ * @returns An object containing the current label and tag values
259
+ */
260
+ get snapshot(): {
261
+ label: string;
262
+ tag: string;
263
+ };
264
+ /**
265
+ * Synchronizes the label and tag properties with a Tweakpane API object.
266
+ * Creates a reactive effect that updates the API's label and tag
267
+ * whenever the input values change.
268
+ *
269
+ * @param api - A function that returns the Tweakpane API object (or null if not ready)
270
+ * @returns The created effect reference
271
+ */
272
+ sync(api: () => {
273
+ label?: string | null;
274
+ tag?: string | null;
275
+ } | null): i0.EffectRef;
276
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneLabel, never>;
277
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneLabel, never, never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "tag": { "alias": "tag"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
278
+ }
279
+
280
+ /**
281
+ * Injection token used to configure value transformation when TweakpaneBinding
282
+ * is used as a host directive.
283
+ *
284
+ * When set to `true`, values pass through unchanged.
285
+ * When set to an object with `in` and `out` functions, values are transformed:
286
+ * - `in`: Transforms the input value before binding to Tweakpane
287
+ * - `out`: Transforms the Tweakpane value before emitting to the model
288
+ *
289
+ * @internal
290
+ */
291
+ declare const NGT_TWEAK_BINDING_AS_HOST: InjectionToken<true | {
292
+ in: (value: unknown) => unknown;
293
+ out: (value: unknown) => unknown;
294
+ } | null>;
295
+ /**
296
+ * Provides configuration for TweakpaneBinding when used as a host directive.
297
+ *
298
+ * @typeParam TIn - The input value type (from the component)
299
+ * @typeParam TOut - The output value type (for Tweakpane)
300
+ * @param inOut - Optional object containing `in` and `out` transformation functions
301
+ * @returns A provider configuration object
302
+ *
303
+ * @example
304
+ * ```typescript
305
+ * // Simple passthrough (no transformation)
306
+ * providers: [provideTweakBindingAsHost()]
307
+ *
308
+ * // With value transformation (e.g., array to object)
309
+ * providers: [provideTweakBindingAsHost({
310
+ * in: (value) => ({ x: value[0], y: value[1] }),
311
+ * out: (value) => [value.x, value.y]
312
+ * })]
313
+ * ```
314
+ */
315
+ declare function provideTweakBindingAsHost<TIn, TOut>(inOut?: {
316
+ in: (value: TIn) => TOut;
317
+ out: (value: TOut) => TIn;
318
+ }): {
319
+ provide: InjectionToken<true | {
320
+ in: (value: unknown) => unknown;
321
+ out: (value: unknown) => unknown;
322
+ } | null>;
323
+ useValue: boolean | {
324
+ in: (value: TIn) => TOut;
325
+ out: (value: TOut) => TIn;
326
+ };
327
+ };
328
+ /**
329
+ * Base directive for creating Tweakpane bindings (two-way data binding controls).
330
+ *
331
+ * This directive provides the core functionality for binding Angular values to
332
+ * Tweakpane controls. It handles:
333
+ * - Creating the binding on the parent folder
334
+ * - Syncing label, blade, and debounce settings
335
+ * - Value transformation when used as a host directive
336
+ * - Automatic cleanup on destroy
337
+ *
338
+ * Most commonly used as a host directive by specific control types like
339
+ * `TweakpaneNumber`, `TweakpaneText`, `TweakpaneCheckbox`, etc.
340
+ *
341
+ * @typeParam TValue - The type of value being bound
342
+ *
343
+ * @example
344
+ * ```html
345
+ * <!-- Direct usage (rarely needed) -->
346
+ * <tweakpane-binding [(value)]="myValue" label="My Value" />
347
+ *
348
+ * <!-- More commonly used via specific controls -->
349
+ * <tweakpane-number [(value)]="speed" label="Speed" />
350
+ * ```
351
+ */
352
+ declare class TweakpaneBinding<TValue> {
353
+ /**
354
+ * The bound value. Supports two-way binding with `[(value)]`.
355
+ */
356
+ value: i0.ModelSignal<any>;
357
+ private debounce;
358
+ private label;
359
+ private blade;
360
+ private parent;
361
+ private injector;
362
+ private asHostDirective;
363
+ private bindingBaseParams;
364
+ private bindingParams;
365
+ /**
366
+ * Gets the bindable object with optional value transformation.
367
+ * @returns An object with a `value` property suitable for Tweakpane binding
368
+ */
369
+ private get bindableObject();
370
+ private bindingApi;
371
+ constructor();
372
+ /**
373
+ * Synchronizes additional binding parameters with the Tweakpane binding.
374
+ * Called by specific control directives to add control-specific parameters
375
+ * (e.g., min/max for numbers, options for lists).
376
+ *
377
+ * @param params - A function that returns the binding parameters
378
+ * @returns The created effect reference
379
+ */
380
+ syncBindingParams(params: () => BindingParams): i0.EffectRef;
381
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneBinding<any>, never>;
382
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneBinding<any>, "tweakpane-binding", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, [{ directive: typeof TweakpaneBlade; inputs: { "disabled": "disabled"; "hidden": "hidden"; }; outputs: {}; }, { directive: typeof TweakpaneDebounce; inputs: { "debounce": "debounce"; }; outputs: {}; }, { directive: typeof TweakpaneLabel; inputs: { "label": "label"; "tag": "tag"; }; outputs: {}; }]>;
383
+ }
384
+
385
+ /**
386
+ * Directive for creating a clickable button in Tweakpane.
387
+ *
388
+ * Buttons are used to trigger actions (like reset, randomize, etc.)
389
+ * and emit click events when pressed.
390
+ *
391
+ * @example
392
+ * ```html
393
+ * <tweakpane-pane>
394
+ * <tweakpane-button title="Reset" (click)="onReset()" />
395
+ * <tweakpane-button title="Randomize" label="Action" (click)="onRandomize()" />
396
+ * <tweakpane-button title="Save" [disabled]="!canSave" (click)="onSave()" />
397
+ * </tweakpane-pane>
398
+ * ```
399
+ */
400
+ declare class TweakpaneButton {
401
+ /**
402
+ * Event emitted when the button is clicked.
403
+ * Provides the Tweakpane mouse event with the ButtonApi.
404
+ */
405
+ click: i0.OutputEmitterRef<TpMouseEvent<ButtonApi>>;
406
+ private title;
407
+ private label;
408
+ private blade;
409
+ private parent;
410
+ private buttonApi;
411
+ constructor();
412
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneButton, never>;
413
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneButton, "tweakpane-button", never, {}, { "click": "click"; }, never, never, true, [{ directive: typeof TweakpaneTitle; inputs: { "title": "title"; }; outputs: {}; }, { directive: typeof TweakpaneLabel; inputs: { "label": "label"; }; outputs: {}; }, { directive: typeof TweakpaneBlade; inputs: { "hidden": "hidden"; "disabled": "disabled"; }; outputs: {}; }]>;
414
+ }
415
+
416
+ /**
417
+ * Directive for creating a boolean checkbox control in Tweakpane.
418
+ *
419
+ * Provides two-way binding for boolean values with a checkbox UI.
420
+ *
421
+ * @example
422
+ * ```html
423
+ * <tweakpane-pane>
424
+ * <tweakpane-checkbox label="Debug Mode" [(value)]="debugMode" />
425
+ * <tweakpane-checkbox label="Wireframe" [(value)]="showWireframe" [disabled]="!debugMode()" />
426
+ * </tweakpane-pane>
427
+ * ```
428
+ */
429
+ declare class TweakpaneCheckbox {
430
+ /**
431
+ * Additional Tweakpane boolean input parameters.
432
+ * @default {}
433
+ */
434
+ params: i0.InputSignal<BooleanInputParams>;
435
+ private binding;
436
+ constructor();
437
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneCheckbox, never>;
438
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneCheckbox, "tweakpane-checkbox", never, { "params": { "alias": "params"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof TweakpaneBinding; inputs: { "value": "value"; }; outputs: { "valueChange": "valueChange"; }; }]>;
439
+ }
440
+
441
+ /**
442
+ * Directive for creating a color picker control in Tweakpane.
443
+ *
444
+ * Provides two-way binding for color values (as hex strings) with a
445
+ * color picker UI that supports RGB, HSL, and alpha.
446
+ *
447
+ * @example
448
+ * ```html
449
+ * <tweakpane-pane>
450
+ * <tweakpane-color label="Background" [(value)]="backgroundColor" />
451
+ * <tweakpane-color label="Accent" [(value)]="accentColor" [params]="{ alpha: true }" />
452
+ * </tweakpane-pane>
453
+ * ```
454
+ */
455
+ declare class TweakpaneColor {
456
+ /**
457
+ * Additional Tweakpane color input parameters.
458
+ * Can include options like `alpha`, `color.type`, etc.
459
+ * @default {}
460
+ */
461
+ params: i0.InputSignal<ColorInputParams>;
462
+ private binding;
463
+ constructor();
464
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneColor, never>;
465
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneColor, "tweakpane-color", never, { "params": { "alias": "params"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof TweakpaneBinding; inputs: { "value": "value"; }; outputs: { "valueChange": "valueChange"; }; }]>;
466
+ }
467
+
468
+ /**
469
+ * Directive for creating a dropdown list/select control in Tweakpane.
470
+ *
471
+ * Provides two-way binding for selecting from a list of options.
472
+ * Options can be provided as an array or as a key-value object.
473
+ *
474
+ * @typeParam TOptionValue - The type of values in the list
475
+ *
476
+ * @example
477
+ * ```html
478
+ * <tweakpane-pane>
479
+ * <!-- Options as array -->
480
+ * <tweakpane-list
481
+ * label="Mode"
482
+ * [(value)]="mode"
483
+ * [options]="['normal', 'debug', 'performance']"
484
+ * />
485
+ *
486
+ * <!-- Options as object (label: value mapping) -->
487
+ * <tweakpane-list
488
+ * label="Quality"
489
+ * [(value)]="quality"
490
+ * [options]="{ 'Low': 1, 'Medium': 2, 'High': 3, 'Ultra': 4 }"
491
+ * />
492
+ * </tweakpane-pane>
493
+ * ```
494
+ */
495
+ declare class TweakpaneList<TOptionValue> {
496
+ /**
497
+ * The currently selected value. Supports two-way binding with `[(value)]`.
498
+ */
499
+ value: i0.ModelSignal<TOptionValue>;
500
+ /**
501
+ * The list options. Can be:
502
+ * - An array of values (labels will be stringified values)
503
+ * - An object mapping display labels to values
504
+ */
505
+ options: i0.InputSignal<Record<string, TOptionValue> | TOptionValue[]>;
506
+ private blade;
507
+ private debounce;
508
+ private label;
509
+ private parent;
510
+ private listOptions;
511
+ private listApi;
512
+ constructor();
513
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneList<any>, never>;
514
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneList<any>, "tweakpane-list", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, [{ directive: typeof TweakpaneBlade; inputs: { "hidden": "hidden"; "disabled": "disabled"; }; outputs: {}; }, { directive: typeof TweakpaneDebounce; inputs: { "debounce": "debounce"; }; outputs: {}; }, { directive: typeof TweakpaneLabel; inputs: { "label": "label"; }; outputs: {}; }]>;
515
+ }
516
+
517
+ /**
518
+ * Directive for creating a numeric input control in Tweakpane.
519
+ *
520
+ * Provides two-way binding for number values with optional min/max/step
521
+ * constraints. Displays as a text input with increment buttons, or as
522
+ * a slider if min and max are specified.
523
+ *
524
+ * @example
525
+ * ```html
526
+ * <tweakpane-pane>
527
+ * <!-- Simple number input -->
528
+ * <tweakpane-number label="Count" [(value)]="count" />
529
+ *
530
+ * <!-- With slider (min/max defined) -->
531
+ * <tweakpane-number
532
+ * label="Speed"
533
+ * [(value)]="speed"
534
+ * [params]="{ min: 0, max: 100, step: 0.1 }"
535
+ * />
536
+ *
537
+ * <!-- With custom format -->
538
+ * <tweakpane-number
539
+ * label="Angle"
540
+ * [(value)]="angle"
541
+ * [params]="{ min: 0, max: 360, format: (v) => v.toFixed(0) + '°' }"
542
+ * />
543
+ * </tweakpane-pane>
544
+ * ```
545
+ */
546
+ declare class TweakpaneNumber {
547
+ /**
548
+ * Additional Tweakpane number input parameters.
549
+ * Can include `min`, `max`, `step`, `format`, etc.
550
+ * @default {}
551
+ */
552
+ params: i0.InputSignal<NumberInputParams>;
553
+ private binding;
554
+ constructor();
555
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneNumber, never>;
556
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneNumber, "tweakpane-number", never, { "params": { "alias": "params"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof TweakpaneBinding; inputs: { "value": "value"; }; outputs: { "valueChange": "valueChange"; }; }]>;
557
+ }
558
+
559
+ /**
560
+ * Main Tweakpane container directive that creates the root pane element.
561
+ *
562
+ * This directive creates a floating Tweakpane panel that can be positioned
563
+ * anywhere on the screen. It serves as the root container for all
564
+ * Tweakpane controls (folders, bindings, buttons, etc.).
565
+ *
566
+ * @example
567
+ * ```html
568
+ * <!-- Basic usage with default positioning (top-right) -->
569
+ * <tweakpane-pane title="Settings">
570
+ * <tweakpane-number label="Speed" [(value)]="speed" />
571
+ * <tweakpane-checkbox label="Debug" [(value)]="debug" />
572
+ * </tweakpane-pane>
573
+ *
574
+ * <!-- Custom positioning -->
575
+ * <tweakpane-pane title="Controls" left="8px" bottom="8px" [right]="undefined">
576
+ * <tweakpane-folder title="Physics">
577
+ * <tweakpane-number label="Gravity" [(value)]="gravity" />
578
+ * </tweakpane-folder>
579
+ * </tweakpane-pane>
580
+ *
581
+ * <!-- Embedded in a container element -->
582
+ * <div #container></div>
583
+ * <tweakpane-pane [container]="container">
584
+ * <!-- controls -->
585
+ * </tweakpane-pane>
586
+ * ```
587
+ */
588
+ declare class TweakpanePane {
589
+ /**
590
+ * CSS top position of the pane.
591
+ * @default '8px'
592
+ */
593
+ top: i0.InputSignal<string | number>;
594
+ /**
595
+ * CSS right position of the pane.
596
+ * @default '8px'
597
+ */
598
+ right: i0.InputSignal<string | number>;
599
+ /**
600
+ * CSS left position of the pane.
601
+ * @default undefined
602
+ */
603
+ left: i0.InputSignal<string | number | undefined>;
604
+ /**
605
+ * CSS bottom position of the pane.
606
+ * @default undefined
607
+ */
608
+ bottom: i0.InputSignal<string | number | undefined>;
609
+ /**
610
+ * CSS width of the pane.
611
+ * @default '256px'
612
+ */
613
+ width: i0.InputSignal<string | number>;
614
+ /**
615
+ * Optional container element to embed the pane into.
616
+ * If not provided, the pane floats freely in the document.
617
+ * Can be an HTMLElement or an Angular ElementRef.
618
+ */
619
+ container: i0.InputSignal<HTMLElement | ElementRef<HTMLElement | undefined> | undefined>;
620
+ private document;
621
+ private title;
622
+ private folder;
623
+ private tweakpaneAnchor;
624
+ private pane;
625
+ private paneContainer?;
626
+ constructor();
627
+ /**
628
+ * Updates a CSS style property on the pane's parent element.
629
+ * @param propertyName - The name of the style property to update
630
+ */
631
+ private updateStyleEffect;
632
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpanePane, never>;
633
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpanePane, "tweakpane-pane", never, { "top": { "alias": "top"; "required": false; "isSignal": true; }; "right": { "alias": "right"; "required": false; "isSignal": true; }; "left": { "alias": "left"; "required": false; "isSignal": true; }; "bottom": { "alias": "bottom"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "container": { "alias": "container"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof TweakpaneFolder; inputs: { "expanded": "expanded"; }; outputs: { "expandedChange": "expandedChange"; }; }]>;
634
+ }
635
+
636
+ /**
637
+ * Directive for creating a 2D/3D/4D point input control in Tweakpane.
638
+ *
639
+ * Provides two-way binding for point values (as tuple arrays or objects).
640
+ * The control displays input fields for each dimension and optionally
641
+ * shows a 2D picker for x/y values.
642
+ *
643
+ * Values are accepted as arrays `[x, y, z?, w?]` and emitted in the same format.
644
+ *
645
+ * @example
646
+ * ```html
647
+ * <tweakpane-pane>
648
+ * <!-- 2D point -->
649
+ * <tweakpane-point label="Position" [(value)]="position2D" />
650
+ *
651
+ * <!-- 3D point with custom ranges -->
652
+ * <tweakpane-point
653
+ * label="Position"
654
+ * [(value)]="position3D"
655
+ * [params]="{
656
+ * x: { min: -10, max: 10 },
657
+ * y: { min: 0, max: 100 },
658
+ * z: { min: -10, max: 10 }
659
+ * }"
660
+ * />
661
+ *
662
+ * <!-- 4D point (e.g., quaternion) -->
663
+ * <tweakpane-point label="Rotation" [(value)]="quaternion" />
664
+ * </tweakpane-pane>
665
+ * ```
666
+ */
667
+ declare class TweakpanePoint {
668
+ /**
669
+ * Additional Tweakpane point input parameters.
670
+ * Can include per-axis configuration like `{ x: { min, max }, y: { min, max } }`.
671
+ * @default {}
672
+ */
673
+ params: i0.InputSignal<Point2dInputParams | Point3dInputParams | Point4dInputParams>;
674
+ private binding;
675
+ constructor();
676
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpanePoint, never>;
677
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpanePoint, "tweakpane-point", never, { "params": { "alias": "params"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof TweakpaneBinding; inputs: { "value": "value"; }; outputs: { "valueChange": "valueChange"; }; }]>;
678
+ }
679
+
680
+ /**
681
+ * Directive for creating a text input control in Tweakpane.
682
+ *
683
+ * Provides two-way binding for string values with a text input UI.
684
+ *
685
+ * @example
686
+ * ```html
687
+ * <tweakpane-pane>
688
+ * <tweakpane-text label="Name" [(value)]="objectName" />
689
+ * <tweakpane-text label="Description" [(value)]="description" />
690
+ * </tweakpane-pane>
691
+ * ```
692
+ */
693
+ declare class TweakpaneText {
694
+ /**
695
+ * Additional Tweakpane string input parameters.
696
+ * @default {}
697
+ */
698
+ params: i0.InputSignal<StringInputParams>;
699
+ private binding;
700
+ constructor();
701
+ static ɵfac: i0.ɵɵFactoryDeclaration<TweakpaneText, never>;
702
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TweakpaneText, "tweakpane-text", never, { "params": { "alias": "params"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof TweakpaneBinding; inputs: { "value": "value"; }; outputs: { "valueChange": "valueChange"; }; }]>;
703
+ }
704
+
705
+ /**
706
+ * Configuration for a number input control.
707
+ *
708
+ * @example
709
+ * ```typescript
710
+ * const config = {
711
+ * gravity: { value: 9.8, min: 0, max: 20, step: 0.1 }
712
+ * };
713
+ * ```
714
+ */
715
+ interface TweakNumberConfig {
716
+ /** The initial value or a writable signal for two-way binding */
717
+ value: number | WritableSignal<number>;
718
+ /** Minimum allowed value (enables slider display) */
719
+ min?: number;
720
+ /** Maximum allowed value (enables slider display) */
721
+ max?: number;
722
+ /** Step increment for the value */
723
+ step?: number;
724
+ }
725
+ /**
726
+ * Configuration for a text input control.
727
+ *
728
+ * @example
729
+ * ```typescript
730
+ * const config = {
731
+ * name: { value: 'Object 1' }
732
+ * };
733
+ * ```
734
+ */
735
+ interface TweakTextConfig {
736
+ /** The initial value or a writable signal for two-way binding */
737
+ value: string | WritableSignal<string>;
738
+ }
739
+ /**
740
+ * Configuration for a color picker control.
741
+ *
742
+ * @example
743
+ * ```typescript
744
+ * const config = {
745
+ * background: { value: '#ff0000', color: true }
746
+ * };
747
+ * ```
748
+ */
749
+ interface TweakColorConfig {
750
+ /** The initial color value (as hex string) or a writable signal */
751
+ value: string | WritableSignal<string>;
752
+ /** Marker to identify this as a color input (must be `true`) */
753
+ color: true;
754
+ }
755
+ /**
756
+ * Configuration for a checkbox/boolean control.
757
+ *
758
+ * @example
759
+ * ```typescript
760
+ * const config = {
761
+ * enabled: { value: true }
762
+ * };
763
+ * ```
764
+ */
765
+ interface TweakCheckboxConfig {
766
+ /** The initial value or a writable signal for two-way binding */
767
+ value: boolean | WritableSignal<boolean>;
768
+ }
769
+ /**
770
+ * Configuration for a dropdown list/select control.
771
+ *
772
+ * @typeParam T - The type of option values
773
+ *
774
+ * @example
775
+ * ```typescript
776
+ * // With array of options
777
+ * const config = {
778
+ * mode: { value: 'normal', options: ['normal', 'debug', 'performance'] }
779
+ * };
780
+ *
781
+ * // With labeled options
782
+ * const config = {
783
+ * quality: { value: 2, options: { 'Low': 1, 'Medium': 2, 'High': 3 } }
784
+ * };
785
+ * ```
786
+ */
787
+ interface TweakListConfig<T> {
788
+ /** The initial value or a writable signal for two-way binding */
789
+ value: T | WritableSignal<T>;
790
+ /** Array of options or object mapping labels to values */
791
+ options: T[] | Record<string, T>;
792
+ }
793
+ /**
794
+ * Configuration for a 2D/3D/4D point input control.
795
+ *
796
+ * @typeParam TVector - The tuple type for the point dimensions
797
+ *
798
+ * @example
799
+ * ```typescript
800
+ * // 2D point
801
+ * const config = {
802
+ * position: { value: [0, 0] as [number, number] }
803
+ * };
804
+ *
805
+ * // 3D point with axis constraints
806
+ * const config = {
807
+ * position: {
808
+ * value: [0, 0, 0] as [number, number, number],
809
+ * x: { min: -10, max: 10 },
810
+ * y: { min: 0, max: 100 },
811
+ * z: { min: -10, max: 10 }
812
+ * }
813
+ * };
814
+ * ```
815
+ */
816
+ interface TweakPointConfig<TVector extends [number, number] | [number, number, number] | [number, number, number, number] = [number, number] | [number, number, number] | [number, number, number, number]> {
817
+ /** The initial point value or a writable signal for two-way binding */
818
+ value: TVector | WritableSignal<TVector>;
819
+ /** Configuration for the X axis (min, max, step, etc.) */
820
+ x?: Point2dInputParams['x'];
821
+ /** Configuration for the Y axis */
822
+ y?: Point2dInputParams['y'];
823
+ /** Configuration for the Z axis (3D/4D points only) */
824
+ z?: Point3dInputParams['z'];
825
+ /** Configuration for the W axis (4D points only) */
826
+ w?: Point4dInputParams['w'];
827
+ }
828
+ /**
829
+ * Configuration for a button/action control.
830
+ *
831
+ * @example
832
+ * ```typescript
833
+ * const config = {
834
+ * reset: { action: () => this.resetSettings(), label: 'Actions' }
835
+ * };
836
+ * ```
837
+ */
838
+ interface TweakButtonConfig {
839
+ /** The callback function to execute when the button is clicked */
840
+ action: () => void;
841
+ /** Optional label displayed next to the button */
842
+ label?: string;
843
+ }
844
+ /**
845
+ * Configuration for a nested folder within the tweaks.
846
+ * Created using the `tweaks.folder()` helper function.
847
+ *
848
+ * @typeParam T - The config type for the folder's contents
849
+ *
850
+ * @example
851
+ * ```typescript
852
+ * const config = {
853
+ * advanced: tweaks.folder('Advanced Settings', {
854
+ * iterations: { value: 4, min: 1, max: 10 },
855
+ * tolerance: { value: 0.001, min: 0, max: 1 }
856
+ * })
857
+ * };
858
+ * ```
859
+ */
860
+ interface TweakFolderConfig<T extends TweakConfig> {
861
+ /** Internal marker to identify folder configs */
862
+ __folder: true;
863
+ /** The folder title displayed in the UI */
864
+ name: string;
865
+ /** The configuration object for controls within the folder */
866
+ config: T;
867
+ /** Whether the folder is initially expanded */
868
+ expanded?: boolean;
869
+ }
870
+ /**
871
+ * Union of all possible configuration value types for `tweaks()`.
872
+ *
873
+ * Includes:
874
+ * - Primitive values (number, string, boolean)
875
+ * - Writable signals for two-way binding
876
+ * - Typed config objects for each control type
877
+ */
878
+ type TweakConfigValue = number | string | boolean | WritableSignal<number> | WritableSignal<string> | WritableSignal<boolean> | TweakNumberConfig | TweakTextConfig | TweakColorConfig | TweakCheckboxConfig | TweakListConfig<unknown> | TweakPointConfig | TweakButtonConfig | TweakFolderConfig<TweakConfig>;
879
+ /**
880
+ * A configuration object for `tweaks()`.
881
+ * Maps control names to their configuration values.
882
+ */
883
+ type TweakConfig = Record<string, TweakConfigValue>;
884
+ /**
885
+ * Infer the signal type from a config value.
886
+ * Always returns Signal<T> (readonly) - never WritableSignal.
887
+ * Users can use their original WritableSignal if they need write access.
888
+ */
889
+ type InferSignalType<T> = T extends WritableSignal<infer U> ? Signal<U> : T extends number ? Signal<number> : T extends string ? Signal<string> : T extends boolean ? Signal<boolean> : T extends TweakNumberConfig ? Signal<number> : T extends TweakTextConfig ? Signal<string> : T extends TweakColorConfig ? Signal<string> : T extends TweakCheckboxConfig ? Signal<boolean> : T extends TweakListConfig<infer U> ? Signal<U> : T extends TweakPointConfig<infer VectorType> ? Signal<VectorType> : T extends TweakButtonConfig ? never : T extends TweakFolderConfig<infer C> ? TweakResult<C> : never;
890
+ /**
891
+ * The result type returned by `tweaks()` for a given configuration.
892
+ *
893
+ * Maps each config key to a readonly Signal of the appropriate type.
894
+ * Button configs are excluded (they don't return values).
895
+ *
896
+ * @typeParam T - The configuration object type
897
+ */
898
+ type TweakResult<T extends TweakConfig> = {
899
+ [K in keyof T as T[K] extends TweakButtonConfig ? never : K]: InferSignalType<T[K]>;
900
+ };
901
+ /**
902
+ * Options for configuring a `tweaks()` folder.
903
+ */
904
+ interface TweakFolderOptions {
905
+ /**
906
+ * Whether the folder is expanded by default.
907
+ * @default false
908
+ */
909
+ expanded?: boolean;
910
+ /**
911
+ * Optional injector for use outside an injection context.
912
+ * Required when calling `tweaks()` from outside a constructor or field initializer.
913
+ */
914
+ injector?: Injector;
915
+ }
916
+ /**
917
+ * Creates Tweakpane controls declaratively from any component within an `ngt-canvas`.
918
+ *
919
+ * **Prerequisites:**
920
+ * 1. Add `tweakpaneAnchor` directive to your `ngt-canvas`:
921
+ * ```html
922
+ * <ngt-canvas tweakpaneAnchor>
923
+ * ```
924
+ * 2. Add `<tweakpane-pane>` somewhere in your scene
925
+ *
926
+ * @param folderName - The name of the folder to create/use
927
+ * @param config - Configuration object defining the controls
928
+ * @param options - Optional folder options (expanded, etc.)
929
+ * @returns An object with signals for each control value
930
+ *
931
+ * @example
932
+ * ```typescript
933
+ * // Basic usage with primitives (creates new signals)
934
+ * const controls = tweaks('Physics', {
935
+ * gravity: 9.8,
936
+ * debug: false,
937
+ * name: 'World',
938
+ * });
939
+ *
940
+ * // With config objects for more control
941
+ * const controls = tweaks('Physics', {
942
+ * gravity: { value: 9.8, min: 0, max: 20, step: 0.1 },
943
+ * color: { value: '#ff0000', color: true },
944
+ * mode: { value: 'normal', options: ['normal', 'debug', 'verbose'] },
945
+ * });
946
+ *
947
+ * // Two-way binding with existing signals
948
+ * filteringEnabled = signal(true);
949
+ * const controls = tweaks('Settings', {
950
+ * filteringEnabled: this.filteringEnabled, // two-way binding
951
+ * });
952
+ *
953
+ * // Buttons (actions)
954
+ * const controls = tweaks('Actions', {
955
+ * reset: { action: () => this.reset() },
956
+ * });
957
+ *
958
+ * // Nested folders
959
+ * const controls = tweaks('Settings', {
960
+ * basic: 42,
961
+ * advanced: tweaks.folder('Advanced', {
962
+ * iterations: { value: 4, min: 1, max: 10 },
963
+ * }),
964
+ * });
965
+ * ```
966
+ */
967
+ declare function tweaks<T extends TweakConfig>(folderName: string, config: T, { injector, ...options }?: TweakFolderOptions): TweakResult<T>;
968
+ declare namespace tweaks {
969
+ var folder: <T extends TweakConfig>(name: string, config: T, options?: {
970
+ expanded?: boolean;
971
+ }) => TweakFolderConfig<T>;
972
+ }
973
+
974
+ export { NGT_TWEAK_BINDING_AS_HOST, TweakpaneAnchor, TweakpaneAnchorHost, TweakpaneBinding, TweakpaneBlade, TweakpaneButton, TweakpaneCheckbox, TweakpaneColor, TweakpaneDebounce, TweakpaneFolder, TweakpaneLabel, TweakpaneList, TweakpaneNumber, TweakpanePane, TweakpanePoint, TweakpaneText, TweakpaneTitle, provideTweakBindingAsHost, tweaks };
975
+ export type { TweakButtonConfig, TweakCheckboxConfig, TweakColorConfig, TweakConfig, TweakConfigValue, TweakFolderConfig, TweakFolderOptions, TweakListConfig, TweakNumberConfig, TweakPointConfig, TweakResult, TweakTextConfig };