svelte-tweakpane-ui 1.2.6 → 1.3.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.
@@ -5,6 +5,7 @@
5
5
  import GenericSlider from '../internal/GenericSlider.svelte';
6
6
  export let value;
7
7
  export let meanValue = void 0;
8
+ export let wide = void 0;
8
9
  let internalValue;
9
10
  function updateInternalValue() {
10
11
  if (Array.isArray(value)) {
@@ -28,10 +29,26 @@
28
29
  internalValue = { min: meanValue - r / 2, max: meanValue + r / 2 };
29
30
  }
30
31
  }
32
+ let ref;
33
+ function updateWide(wide2) {
34
+ const inputField = ref?.element.querySelector('div.tp-rsltxtv_t');
35
+ if (wide2) {
36
+ inputField?.style.setProperty('display', 'none');
37
+ } else {
38
+ inputField?.style.removeProperty('display');
39
+ }
40
+ }
41
+ $: ref && wide !== void 0 && updateWide(wide);
31
42
  $: value, updateInternalValue();
32
43
  $: internalValue, updateValue();
33
44
  $: meanValue = (internalValue.min + internalValue.max) / 2;
34
45
  $: meanValue, updateValueFromMean();
35
46
  </script>
36
47
 
37
- <GenericSlider bind:value={internalValue} on:change plugin={pluginModule} {...$$restProps} />
48
+ <GenericSlider
49
+ bind:value={internalValue}
50
+ bind:ref
51
+ on:change
52
+ plugin={pluginModule}
53
+ {...$$restProps}
54
+ />
@@ -1,6 +1,7 @@
1
1
  import { SvelteComponent } from 'svelte';
2
2
  import type { Simplify } from '../utils';
3
3
  import type { ValueChangeEvent } from '../utils.js';
4
+ import type { SliderInputBindingApi as GenericSliderRef } from 'tweakpane';
4
5
  export type IntervalSliderValueTuple = [min: number, max: number];
5
6
  export type IntervalSliderValueObject = {
6
7
  min: number;
@@ -63,6 +64,12 @@ declare const __propDef: {
63
64
  * No step constraint.
64
65
  */
65
66
  step?: number | undefined;
67
+ /**
68
+ * When `true`, expand the width of the control at the expense of the numeric input
69
+ * field.
70
+ * @default `false`
71
+ */
72
+ wide?: boolean | undefined;
66
73
  } & {
67
74
  /**
68
75
  * Interval value to control.
@@ -124,7 +131,7 @@ declare const __propDef: {
124
131
  * @bindable
125
132
  * @readonly
126
133
  */
127
- ref?: import('tweakpane').SliderInputBindingApi | undefined;
134
+ ref?: GenericSliderRef | undefined;
128
135
  /**
129
136
  * Imported Tweakpane `TpPluginBundle` (aliased as `Plugin`) module to automatically register in
130
137
  * the `<Binding>`'s containing `<Pane>`.
@@ -53,7 +53,10 @@
53
53
  ? options2
54
54
  : isObjectStyleListOptions(options2)
55
55
  ? options2
56
- : options2.map((value2) => ({ value: value2, text: JSON.stringify(value2) }));
56
+ : options2.map((value2) => ({
57
+ value: value2,
58
+ text: typeof value2 === 'object' ? JSON.stringify(value2) : String(value2)
59
+ }));
57
60
  }
58
61
  function setValue() {
59
62
  if (!shallowEqual(listBlade.value, value)) {
@@ -44,12 +44,6 @@ declare const __propDef: {
44
44
  * @default `{ ticks: 5, pixels: 40, value: 10 }`
45
45
  * */
46
46
  unit?: RingUnit | undefined;
47
- /**
48
- * When `true`, expand the width of the ring control at the expense of the numeric input
49
- * field.
50
- * @default `false`
51
- * */
52
- wide?: boolean | undefined;
53
47
  } & Omit<
54
48
  {
55
49
  /**
@@ -91,6 +85,12 @@ declare const __propDef: {
91
85
  * No step constraint.
92
86
  */
93
87
  step?: number | undefined;
88
+ /**
89
+ * When `true`, expand the width of the control at the expense of the numeric input
90
+ * field.
91
+ * @default `false`
92
+ */
93
+ wide?: boolean | undefined;
94
94
  } & {
95
95
  /**
96
96
  * A `number` value to control.
@@ -3,6 +3,17 @@
3
3
  <script>
4
4
  import GenericSlider from '../internal/GenericSlider.svelte';
5
5
  export let value;
6
+ export let wide = void 0;
7
+ let ref;
8
+ function updateWide(wide2) {
9
+ const inputField = ref?.element.querySelector('div.tp-sldtxtv_t');
10
+ if (wide2) {
11
+ inputField?.style.setProperty('display', 'none');
12
+ } else {
13
+ inputField?.style.removeProperty('display');
14
+ }
15
+ }
16
+ $: ref && wide !== void 0 && updateWide(wide);
6
17
  </script>
7
18
 
8
- <GenericSlider bind:value on:change {...$$restProps} />
19
+ <GenericSlider bind:value bind:ref bind:wide on:change {...$$restProps} />
@@ -1,5 +1,6 @@
1
1
  import { SvelteComponent } from 'svelte';
2
2
  import type { ValueChangeEvent } from '../utils.js';
3
+ import type { SliderInputBindingApi as GenericSliderRef } from 'tweakpane';
3
4
  export type SliderChangeEvent = ValueChangeEvent<number>;
4
5
  declare const __propDef: {
5
6
  props: {
@@ -49,6 +50,12 @@ declare const __propDef: {
49
50
  * No step constraint.
50
51
  */
51
52
  step?: number | undefined;
53
+ /**
54
+ * When `true`, expand the width of the control at the expense of the numeric input
55
+ * field.
56
+ * @default `false`
57
+ */
58
+ wide?: boolean | undefined;
52
59
  } & {
53
60
  /**
54
61
  * A `number` value to control.
@@ -108,7 +115,7 @@ declare const __propDef: {
108
115
  * @bindable
109
116
  * @readonly
110
117
  */
111
- ref?: import('tweakpane').SliderInputBindingApi | undefined;
118
+ ref?: GenericSliderRef | undefined;
112
119
  /**
113
120
  * Imported Tweakpane `TpPluginBundle` (aliased as `Plugin`) module to automatically register in
114
121
  * the `<Binding>`'s containing `<Pane>`.
@@ -14,12 +14,6 @@ declare const __propDef: {
14
14
  * `value`](https://github.com/cocopon/tweakpane/blob/66dfbea04bfe9b7f031673c955ceda1f92356e75/packages/core/src/common/number/util.ts#L54).
15
15
  */
16
16
  amount?: number | undefined;
17
- /**
18
- * When `true`, expand the width of the wheel control at the expense of the numeric input
19
- * field.
20
- * @default `false`
21
- * */
22
- wide?: boolean | undefined;
23
17
  } & Omit<
24
18
  {
25
19
  /**
@@ -61,6 +55,12 @@ declare const __propDef: {
61
55
  * No step constraint.
62
56
  */
63
57
  step?: number | undefined;
58
+ /**
59
+ * When `true`, expand the width of the control at the expense of the numeric input
60
+ * field.
61
+ * @default `false`
62
+ */
63
+ wide?: boolean | undefined;
64
64
  } & {
65
65
  /**
66
66
  * A `number` value to control.
@@ -44,9 +44,13 @@
44
44
  _ref?.dispose();
45
45
  });
46
46
  const dispatch = createEventDispatcher();
47
+ let lastObject = object;
47
48
  let lastValue = copy(object[key]);
48
49
  let internalChange = false;
49
50
  function onBoundValueChange(object2) {
51
+ if (lastObject !== object2) {
52
+ internalChange = false;
53
+ }
50
54
  if (!shallowEqual(object2[key], lastValue)) {
51
55
  lastValue = copy(object2[key]);
52
56
  dispatch('change', {
@@ -60,6 +64,10 @@
60
64
  }
61
65
  }
62
66
  internalChange = false;
67
+ if (lastObject !== object2) {
68
+ lastObject = object2;
69
+ create();
70
+ }
63
71
  }
64
72
  function onTweakpaneChange() {
65
73
  internalChange = true;
@@ -31,10 +31,7 @@ declare const __propDef: {
31
31
  * set with `setGlobalDefaultTheme()`.
32
32
  * */ theme?: Theme | undefined;
33
33
  };
34
- /**
35
- * Prevent interactivity and gray out the control.
36
- * @default `false`
37
- * */ events: {
34
+ events: {
38
35
  [evt: string]: CustomEvent<any>;
39
36
  };
40
37
  slots: {
@@ -43,6 +40,8 @@ declare const __propDef: {
43
40
  */
44
41
  default: {};
45
42
  };
43
+ exports?: {} | undefined;
44
+ bindings?: string | undefined;
46
45
  };
47
46
  export type FolderProps = typeof __propDef.props;
48
47
  export type FolderEvents = typeof __propDef.events;
@@ -446,6 +446,8 @@ declare const __propDef: {
446
446
  */
447
447
  default: {};
448
448
  };
449
+ exports?: {} | undefined;
450
+ bindings?: string | undefined;
449
451
  };
450
452
  export type PaneProps = typeof __propDef.props;
451
453
  export type PaneEvents = typeof __propDef.events;
@@ -56,6 +56,8 @@ declare const __propDef: {
56
56
  [evt: string]: CustomEvent<any>;
57
57
  };
58
58
  slots: {};
59
+ exports?: {} | undefined;
60
+ bindings?: string | undefined;
59
61
  };
60
62
  export type SeparatorProps = typeof __propDef.props;
61
63
  export type SeparatorEvents = typeof __propDef.events;
@@ -30,6 +30,8 @@ declare const __propDef: {
30
30
  */
31
31
  default: {};
32
32
  };
33
+ exports?: {} | undefined;
34
+ bindings?: string | undefined;
33
35
  };
34
36
  export type TabGroupProps = typeof __propDef.props;
35
37
  export type TabGroupEvents = typeof __propDef.events;
@@ -33,6 +33,8 @@ declare const __propDef: {
33
33
  */
34
34
  default: {};
35
35
  };
36
+ exports?: {} | undefined;
37
+ bindings?: string | undefined;
36
38
  };
37
39
  export type TabPageProps = typeof __propDef.props;
38
40
  export type TabPageEvents = typeof __propDef.events;
@@ -79,6 +79,8 @@ declare const __propDef: {
79
79
  */
80
80
  default: {};
81
81
  };
82
+ exports?: {} | undefined;
83
+ bindings?: string | undefined;
82
84
  };
83
85
  export type ElementProps = typeof __propDef.props;
84
86
  export type ElementEvents = typeof __propDef.events;
@@ -87,6 +87,8 @@ declare const __propDef: {
87
87
  [evt: string]: CustomEvent<any>;
88
88
  };
89
89
  slots: {};
90
+ exports?: {} | undefined;
91
+ bindings?: string | undefined;
90
92
  };
91
93
  export type ClsPadProps = typeof __propDef.props;
92
94
  export type ClsPadEvents = typeof __propDef.events;
@@ -76,6 +76,8 @@ declare const __propDef: {
76
76
  */
77
77
  default: {};
78
78
  };
79
+ exports?: {} | undefined;
80
+ bindings?: string | undefined;
79
81
  };
80
82
  export type GenericPaneProps = typeof __propDef.props;
81
83
  export type GenericPaneEvents = typeof __propDef.events;
@@ -8,6 +8,7 @@
8
8
  export let pointerScale = void 0;
9
9
  export let keyScale = void 0;
10
10
  export let format = void 0;
11
+ export let ref = void 0;
11
12
  let formatProxy = format;
12
13
  $: formatProxy !== format && (formatProxy = format);
13
14
  let optionsInternal;
@@ -22,4 +23,4 @@
22
23
  };
23
24
  </script>
24
25
 
25
- <GenericInput bind:value on:change options={optionsInternal} {...$$restProps} />
26
+ <GenericInput bind:value bind:ref on:change options={optionsInternal} {...$$restProps} />
@@ -43,6 +43,12 @@ declare class __sveltets_Render<T extends number | IntervalSliderValue> {
43
43
  * No step constraint.
44
44
  * */
45
45
  step?: number | undefined;
46
+ /**
47
+ * When `true`, expand the width of the control at the expense of the numeric input
48
+ * field.
49
+ * @default `false`
50
+ * */
51
+ wide?: boolean | undefined;
46
52
  } & {
47
53
  /**
48
54
  * The value to control.
@@ -111,6 +111,8 @@ declare const __propDef: {
111
111
  [evt: string]: CustomEvent<any>;
112
112
  };
113
113
  slots: {};
114
+ exports?: {} | undefined;
115
+ bindings?: string | undefined;
114
116
  };
115
117
  export type InternalMonitorBooleanProps = typeof __propDef.props;
116
118
  export type InternalMonitorBooleanEvents = typeof __propDef.events;
@@ -132,6 +132,8 @@ declare const __propDef: {
132
132
  [evt: string]: CustomEvent<any>;
133
133
  };
134
134
  slots: {};
135
+ exports?: {} | undefined;
136
+ bindings?: string | undefined;
135
137
  };
136
138
  export type InternalMonitorNumberProps = typeof __propDef.props;
137
139
  export type InternalMonitorNumberEvents = typeof __propDef.events;
@@ -116,6 +116,8 @@ declare const __propDef: {
116
116
  [evt: string]: CustomEvent<any>;
117
117
  };
118
118
  slots: {};
119
+ exports?: {} | undefined;
120
+ bindings?: string | undefined;
119
121
  };
120
122
  export type InternalMonitorStringProps = typeof __propDef.props;
121
123
  export type InternalMonitorStringEvents = typeof __propDef.events;
@@ -169,6 +169,8 @@ declare const __propDef: {
169
169
  */
170
170
  default: {};
171
171
  };
172
+ exports?: {} | undefined;
173
+ bindings?: string | undefined;
172
174
  };
173
175
  export type InternalPaneDraggableProps = typeof __propDef.props;
174
176
  export type InternalPaneDraggableEvents = typeof __propDef.events;
@@ -108,6 +108,8 @@ declare const __propDef: {
108
108
  */
109
109
  default: {};
110
110
  };
111
+ exports?: {} | undefined;
112
+ bindings?: string | undefined;
111
113
  };
112
114
  export type InternalPaneFixedProps = typeof __propDef.props;
113
115
  export type InternalPaneFixedEvents = typeof __propDef.events;
@@ -94,6 +94,8 @@ declare const __propDef: {
94
94
  */
95
95
  default: {};
96
96
  };
97
+ exports?: {} | undefined;
98
+ bindings?: string | undefined;
97
99
  };
98
100
  export type InternalPaneInlineProps = typeof __propDef.props;
99
101
  export type InternalPaneInlineEvents = typeof __propDef.events;
@@ -134,6 +134,8 @@ declare const __propDef: {
134
134
  [evt: string]: CustomEvent<any>;
135
135
  };
136
136
  slots: {};
137
+ exports?: {} | undefined;
138
+ bindings?: string | undefined;
137
139
  };
138
140
  export type WaveformMonitorProps = typeof __propDef.props;
139
141
  export type WaveformMonitorEvents = typeof __propDef.events;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-tweakpane-ui",
3
- "version": "1.2.6",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "description": "A Svelte component library wrapping UI elements from Tweakpane, plus some additional functionality for convenience and flexibility.",
6
6
  "repository": {
@@ -200,34 +200,34 @@
200
200
  "tweakpane": "4.0.3"
201
201
  },
202
202
  "devDependencies": {
203
- "@kitschpatrol/shared-config": "^4.6.3",
203
+ "@kitschpatrol/shared-config": "^4.6.6",
204
204
  "@phenomnomnominal/tsquery": "^6.1.3",
205
- "@playwright/test": "^1.44.0",
205
+ "@playwright/test": "^1.44.1",
206
206
  "@stkb/rewrap": "^0.1.0",
207
207
  "@sveltejs/adapter-static": "^3.0.1",
208
- "@sveltejs/kit": "^2.5.8",
208
+ "@sveltejs/kit": "^2.5.10",
209
209
  "@sveltejs/package": "^2.3.1",
210
- "@sveltejs/vite-plugin-svelte": "^3.1.0",
210
+ "@sveltejs/vite-plugin-svelte": "^3.1.1",
211
211
  "@types/eslint": "^8.56.10",
212
212
  "@types/fs-extra": "^11.0.4",
213
- "@types/node": "^20.12.11",
213
+ "@types/node": "^20.12.13",
214
214
  "bumpp": "^9.4.1",
215
215
  "eslint": "^8.57.0",
216
216
  "fs-extra": "^11.2.0",
217
- "glob": "^10.3.15",
217
+ "glob": "^10.4.1",
218
218
  "npm-run-all": "^4.1.5",
219
219
  "postcss-html": "^1.7.0",
220
- "publint": "^0.2.7",
220
+ "publint": "^0.2.8",
221
221
  "read-package-up": "^11.0.0",
222
222
  "svelte": "^4.2.17",
223
- "svelte-check": "^3.7.1",
224
- "svelte-language-server": "^0.16.9",
225
- "svelte2tsx": "^0.7.8",
223
+ "svelte-check": "^3.8.0",
224
+ "svelte-language-server": "^0.16.10",
225
+ "svelte2tsx": "^0.7.9",
226
226
  "ts-morph": "^22.0.0",
227
227
  "tslib": "^2.6.2",
228
- "tsx": "^4.10.2",
228
+ "tsx": "^4.11.0",
229
229
  "typescript": "^5.4.5",
230
- "vite": "^5.2.11",
230
+ "vite": "^5.2.12",
231
231
  "yaml": "^2.4.2"
232
232
  },
233
233
  "scripts": {
@@ -247,7 +247,7 @@
247
247
  "build:13-build-docs": "pnpm run docs-build",
248
248
  "check": "svelte-kit sync && svelte-check --ignore ./scratch --tsconfig ./tsconfig.json",
249
249
  "check-watch": "svelte-kit sync && svelte-check --ignore ./scratch --tsconfig ./tsconfig.json --watch",
250
- "clean": "git clean -fdX",
250
+ "clean": "git clean -fdX && rm ./pnpm-lock.yaml",
251
251
  "docs-build": "pnpm -C ./docs run build",
252
252
  "docs-dev": "pnpm -C ./docs run dev",
253
253
  "docs-preview": "pnpm -C ./docs run preview",
package/readme.md CHANGED
@@ -35,7 +35,7 @@
35
35
 
36
36
  ## Overview
37
37
 
38
- 🎛️ **_Svelte Tweakpane UI_** wraps user-interface elements from the excellent [Tweakpane](https://tweakpane.github.io/docs/) library in a collection of 31 idiomatic, reactive, type-safe, carefully-crafted, and obsessively-documented [Svelte](https://svelte.dev) components.
38
+ 🎛️ **_Svelte Tweakpane UI_** wraps user-interface elements from the excellent [Tweakpane](https://tweakpane.github.io/docs/) library in a collection of <!-- component-count -->31<!-- /component-count --> idiomatic, reactive, type-safe, carefully-crafted, and obsessively-documented [Svelte](https://svelte.dev) components.
39
39
 
40
40
  The library makes it easy to quickly and declaratively add knobs and dials to your projects using components that feel like they were made for Svelte. It also augments Tweakpane with a few [extra features](https://kitschpatrol.com/svelte-tweakpane-ui/docs/features) for your convenience and enjoyment.
41
41
 
@@ -68,6 +68,86 @@ npm install svelte-tweakpane-ui
68
68
  <Button on:click={() => alert('🎛️')} />
69
69
  ```
70
70
 
71
+ ## Components
72
+
73
+ <!-- component-list -->
74
+
75
+ ### Core
76
+
77
+ - **[Binding](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/binding)**\
78
+ Wraps the Tweakpane [`addBinding`](https://tweakpane.github.io/docs/input-bindings/) method.
79
+ - **[Blade](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/blade)**\
80
+ Wraps the Tweakpane [`addBlade`](https://tweakpane.github.io/docs/blades/) method.
81
+ - **[Folder](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/folder)**\
82
+ Organize multiple controls into a collapsable folder.
83
+ - **[Pane](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/pane)**\
84
+ The root `<Pane>` component, used for organizing controls into a single group and controlling how and where the Tweakpane is displayed.
85
+ - **[Separator](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/separator)**\
86
+ A convenience component providing a subtle visual separator between controls, in the spirit of the HTML `<hr>` element.
87
+ - **[TabGroup](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/tabgroup)**\
88
+ Contains a collection of `<TabPage>` components to be presented as a tabs.
89
+ - **[TabPage](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/tabpage)**\
90
+ Contains a collection of Tweakpane controls to be presented as a single group inside a `<TabGroup>` component.
91
+
92
+ ### Control
93
+
94
+ - **[Button](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/button)**\
95
+ A humble but effective push button.
96
+ - **[ButtonGrid](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/buttongrid)**\
97
+ A grid of `<Button>` components.
98
+ - **[Checkbox](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/checkbox)**\
99
+ A checkbox.
100
+ - **[Color](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/color)**\
101
+ A color picker.
102
+ - **[CubicBezier](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/cubicbezier)**\
103
+ A control for editing a bezier curve. Ideal for tweaking animation easing values.
104
+ - **[Image](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/image)**\
105
+ An image input control.
106
+ - **[IntervalSlider](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/intervalslider)**\
107
+ A twin-handled slider control for specifying range values.
108
+ - **[List](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/list)**\
109
+ An option list picker, similar to an HTML `<select>` element.
110
+ - **[Point](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/point)**\
111
+ Wraps the Tweakpane [point bindings](https://tweakpane.github.io/docs/input-bindings/#point).
112
+ - **[RadioGrid](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/radiogrid)**\
113
+ A grid of radio buttons.
114
+ - **[Ring](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/ring)**\
115
+ A control evoking the focus ring on a proper camera lens.
116
+ - **[RotationEuler](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/rotationeuler)**\
117
+ Integrates the [euler rotation](https://github.com/0b5vr/tweakpane-plugin-rotation/blob/dev/src/RotationInputPluginEuler.ts) control from [0b5vr](https://0b5vr.com)'s [tweakpane-plugin-rotation](https://github.com/0b5vr/tweakpane-plugin-rotation).
118
+ - **[RotationQuaternion](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/rotationquaternion)**\
119
+ Integrates the [quaternion rotation](https://github.com/0b5vr/tweakpane-plugin-rotation/blob/dev/src/RotationInputPluginQuaternion.ts) control from [0b5vr](https://0b5vr.com)'s [tweakpane-plugin-rotation](https://github.com/0b5vr/tweakpane-plugin-rotation).
120
+ - **[Slider](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/slider)**\
121
+ A slider component providing fine-grained control over numeric values.
122
+ - **[Text](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/text)**\
123
+ A text field, in the spirit of the HTML `<input type="text">` element.
124
+ - **[Textarea](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/textarea)**\
125
+ A multi-line text input field, in the spirit of the HTML `<textarea>` element.
126
+ - **[Wheel](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/wheel)**\
127
+ A control evoking a dial on a proper camera body.
128
+
129
+ ### Monitor
130
+
131
+ - **[FpsGraph](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/fpsgraph)**\
132
+ A control for monitoring and graphing frame rates over time.
133
+ - **[Monitor](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/monitor)**\
134
+ Wraps the Tweakpane [monitor binding](https://tweakpane.github.io/docs/monitor-bindings/) functionality for `boolean`, `number`, and `string` values.
135
+ - **[Profiler](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/profiler)**\
136
+ Measure and visualize multiple quantities over time.
137
+ - **[WaveformMonitor](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/waveformmonitor)**\
138
+ Visualize multiple numeric values as a waveform.
139
+
140
+ ### Extra
141
+
142
+ - **[AutoObject](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/autoobject)**\
143
+ Rapid-development component which automatically creates a set of Tweakpane controls for an arbitrary object.
144
+ - **[AutoValue](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/autovalue)**\
145
+ Rapid-development component which automatically creates a Tweakpane control for an arbitrary value.
146
+ - **[Element](https://kitschpatrol.com/svelte-tweakpane-ui/docs/components/element)**\
147
+ A component for embedding arbitrary HTML elements into a pane.
148
+
149
+ <!-- /component-list -->
150
+
71
151
  ## Maintainers
72
152
 
73
153
  [@kitschpatrol](https://github.com/kitschpatrol)