svelte-tweakpane-ui 1.0.0 → 1.0.2

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.
Files changed (59) hide show
  1. package/dist/control/ButtonGrid.svelte +6 -7
  2. package/dist/control/ButtonGrid.svelte.d.ts +6 -4
  3. package/dist/control/Checkbox.svelte.d.ts +2 -4
  4. package/dist/control/Color.svelte.d.ts +2 -4
  5. package/dist/control/CubicBezier.svelte +13 -21
  6. package/dist/control/CubicBezier.svelte.d.ts +5 -2
  7. package/dist/control/Image.svelte.d.ts +7 -9
  8. package/dist/control/IntervalSlider.svelte.d.ts +2 -4
  9. package/dist/control/List.svelte +14 -20
  10. package/dist/control/List.svelte.d.ts +3 -5
  11. package/dist/control/Point.svelte.d.ts +29 -31
  12. package/dist/control/RadioGrid.svelte.d.ts +2 -4
  13. package/dist/control/Ring.svelte.d.ts +2 -4
  14. package/dist/control/RotationEuler.svelte.d.ts +66 -4
  15. package/dist/control/RotationQuaternion.svelte.d.ts +2 -4
  16. package/dist/control/Slider.svelte.d.ts +2 -4
  17. package/dist/control/Text.svelte +1 -1
  18. package/dist/control/Text.svelte.d.ts +2 -4
  19. package/dist/control/Textarea.svelte +1 -1
  20. package/dist/control/Textarea.svelte.d.ts +2 -4
  21. package/dist/control/Wheel.svelte.d.ts +2 -4
  22. package/dist/core/Blade.svelte +1 -1
  23. package/dist/core/TabGroup.svelte +3 -5
  24. package/dist/core/TabPage.svelte +2 -2
  25. package/dist/extra/AutoObject.svelte +7 -7
  26. package/dist/extra/AutoValue.svelte.d.ts +6 -4
  27. package/dist/extra/Element.svelte +2 -4
  28. package/dist/extra/Element.svelte.d.ts +30 -23
  29. package/dist/index.js +5 -5
  30. package/dist/internal/ClsPad.svelte +3 -7
  31. package/dist/internal/ClsPad.svelte.d.ts +10 -0
  32. package/dist/internal/GenericBinding.svelte.d.ts +2 -4
  33. package/dist/internal/GenericBladeFolding.svelte +5 -5
  34. package/dist/internal/GenericInput.svelte.d.ts +2 -4
  35. package/dist/internal/GenericInputFolding.svelte +5 -5
  36. package/dist/internal/GenericInputFolding.svelte.d.ts +2 -4
  37. package/dist/internal/GenericMonitor.svelte +1 -1
  38. package/dist/internal/GenericMonitor.svelte.d.ts +2 -4
  39. package/dist/internal/GenericPane.svelte +4 -7
  40. package/dist/internal/GenericSlider.svelte.d.ts +2 -4
  41. package/dist/internal/InternalMonitorBoolean.svelte.d.ts +2 -4
  42. package/dist/internal/InternalMonitorNumber.svelte.d.ts +2 -4
  43. package/dist/internal/InternalMonitorString.svelte.d.ts +2 -4
  44. package/dist/internal/InternalPaneDraggable.svelte +72 -64
  45. package/dist/internal/InternalPaneFixed.svelte +1 -3
  46. package/dist/internal/InternalPaneInline.svelte +3 -3
  47. package/dist/monitor/FpsGraph.svelte +6 -3
  48. package/dist/monitor/FpsGraph.svelte.d.ts +2 -2
  49. package/dist/monitor/Monitor.svelte.d.ts +24 -32
  50. package/dist/monitor/Profiler.svelte +10 -7
  51. package/dist/monitor/Profiler.svelte.d.ts +8 -5
  52. package/dist/monitor/WaveformMonitor.svelte.d.ts +2 -4
  53. package/dist/theme.d.ts +1 -3
  54. package/dist/theme.js +30 -39
  55. package/dist/utils.d.ts +10 -7
  56. package/dist/utils.js +53 -46
  57. package/package.json +26 -43
  58. package/{README.md → readme.md} +10 -3
  59. /package/{LICENSE → license.txt} +0 -0
package/dist/utils.d.ts CHANGED
@@ -8,7 +8,7 @@ export type SimplifyDeep<Type> = Type extends Theme
8
8
  ? Type
9
9
  : {
10
10
  [TypeKey in keyof Type]: SimplifyDeep<Type[TypeKey]>;
11
- };
11
+ };
12
12
  export type HasKey<U, V extends PropertyKey> = V extends keyof U ? U[V] : unknown;
13
13
  import type { Bindable, BladeApi, BladeController, TpPluginBundle, View } from '@tweakpane/core';
14
14
  export type BindingObject = Bindable;
@@ -65,13 +65,16 @@ export declare function enforceReadonly(
65
65
  internal: unknown,
66
66
  external: unknown,
67
67
  componentName?: string,
68
- propName?: string,
68
+ propertyName?: string,
69
69
  allowAssignmentToUndefined?: boolean
70
70
  ): void;
71
71
  export declare function isRootPane(container: Container): boolean;
72
72
  export declare function clamp(value: number, min: number, max: number): number;
73
73
  export declare function getElementIndex(element: HTMLElement): number;
74
- export declare function removeKeys<T extends object>(obj: T, ...keys: string[]): T;
74
+ export declare function removeKeys<T extends Record<string, unknown>>(
75
+ object: T,
76
+ ...keys: string[]
77
+ ): T;
75
78
  export declare function updateCollapsibility(
76
79
  isUserExpandableEnabled: boolean,
77
80
  element: HTMLElement,
@@ -103,19 +106,19 @@ export declare function tupleToObject<
103
106
  }
104
107
  >(tuple: number[], keys: T[]): O;
105
108
  export declare function objectToTuple<T extends string, O extends Record<T, number>>(
106
- obj: O,
109
+ object: O,
107
110
  keys: [T]
108
111
  ): [number];
109
112
  export declare function objectToTuple<T extends string, O extends Record<T, number>>(
110
- obj: O,
113
+ object: O,
111
114
  keys: [T, T]
112
115
  ): [number, number];
113
116
  export declare function objectToTuple<T extends string, O extends Record<T, number>>(
114
- obj: O,
117
+ object: O,
115
118
  keys: [T, T, T]
116
119
  ): [number, number, number];
117
120
  export declare function objectToTuple<T extends string, O extends Record<T, number>>(
118
- obj: O,
121
+ object: O,
119
122
  keys: [T, T, T, T]
120
123
  ): [number, number, number, number];
121
124
  export declare function pickerIsOpen(blade: BladeApi<BladeController<View>>): boolean;
package/dist/utils.js CHANGED
@@ -1,29 +1,32 @@
1
- // type aliases and utility functions
2
- // utility functions
1
+ /* eslint-disable @typescript-eslint/no-unnecessary-type-arguments */
2
+ // Utility functions
3
3
  /**
4
4
  * For CLS SSR calculation
5
5
  */
6
- export function rowsForMonitor(buffer = undefined, rows = undefined, graph = undefined) {
6
+ export function rowsForMonitor(buffer, rows, graph) {
7
7
  if (graph) {
8
8
  return Math.max(rows ?? 3, 3);
9
- } else if (buffer === undefined && rows === undefined) {
9
+ }
10
+ if (buffer === undefined && rows === undefined) {
10
11
  return 1;
11
- } else if (buffer === undefined && rows !== undefined) {
12
+ }
13
+ if (buffer === undefined && rows !== undefined) {
12
14
  return 1;
13
- } else if (buffer !== undefined && rows === undefined) {
15
+ }
16
+ if (buffer !== undefined && rows === undefined) {
14
17
  return buffer > 1 ? 3 : 1;
15
- } else if (buffer === 1) {
18
+ }
19
+ if (buffer === 1) {
16
20
  return 1;
17
- } else {
18
- // both defined
19
- return rows ?? 1; // TODO
20
21
  }
22
+ // Both defined
23
+ return rows ?? 1; // TODO
21
24
  }
22
25
  /**
23
26
  * Fills an array of length `quantity` with a `value`
24
27
  */
25
28
  export function fillWith(value, quantity) {
26
- return [...Array(quantity).fill(value)];
29
+ return Array.from({ length: quantity }, () => value);
27
30
  }
28
31
  /**
29
32
  * There's no way to enforce readonly properties in Svelte components, so this is a workaround. See
@@ -52,7 +55,7 @@ export function enforceReadonly(
52
55
  internal,
53
56
  external,
54
57
  componentName,
55
- propName,
58
+ propertyName,
56
59
  allowAssignmentToUndefined
57
60
  ) {
58
61
  allowAssignmentToUndefined ??= false;
@@ -63,9 +66,11 @@ export function enforceReadonly(
63
66
  )
64
67
  ) {
65
68
  const componentString = componentName ? `<${componentName}> ` : '';
66
- const propString = propName ? `property "${propName}" ` : '';
69
+ const propertyString = propertyName ? `property "${propertyName}" ` : '';
67
70
  console.error(
68
- `Svelte component ${componentString}property ${propString}is intended for readonly use.\nAssigning\n"${external}"\nto\n"${internal}"\nis not allowed.`
71
+ `Svelte component "${componentString}" property "${propertyString}" is intended for readonly use.\nAssigning\n"${String(
72
+ external
73
+ )}"\nto\n"${String(internal)}"\nis not allowed.`
69
74
  );
70
75
  }
71
76
  }
@@ -73,43 +78,45 @@ export function isRootPane(container) {
73
78
  return container.constructor.name === 'Pane';
74
79
  }
75
80
  export function clamp(value, min, max) {
76
- // prioritize min over max
81
+ // Prioritize min over max
77
82
  return Math.min(Math.max(value, min), max);
78
83
  }
79
84
  export function getElementIndex(element) {
80
85
  let index = 0;
86
+ // eslint-disable-next-line @typescript-eslint/ban-types
81
87
  let sibling = element;
82
88
  while ((sibling = sibling.previousElementSibling) !== null) {
83
89
  index++;
84
90
  }
85
91
  return index;
86
92
  }
87
- // doesn't create a new object, only works with string keys
88
- export function removeKeys(obj, ...keys) {
89
- keys.forEach((key) => {
90
- if (key in obj) {
91
- delete obj[key];
93
+ // Doesn't create a new object, only works with string keys
94
+ export function removeKeys(object, ...keys) {
95
+ for (const key of keys) {
96
+ if (key in object) {
97
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
98
+ delete object[key];
92
99
  }
93
- });
94
- return obj;
100
+ }
101
+ return object;
95
102
  }
96
- function clickBlocker(e) {
97
- // only block user clicks, not programmatic ones
98
- console.log(e.detail);
99
- if (e.isTrusted) e.stopPropagation();
103
+ function clickBlocker(event) {
104
+ // Only block user clicks, not programmatic ones
105
+ console.log(event.detail);
106
+ if (event.isTrusted) event.stopPropagation();
100
107
  }
101
- // used by folder and pane TODO rewrite to use getSwatchButton etc.
108
+ // Used by folder and pane TODO rewrite to use getSwatchButton etc.
102
109
  export function updateCollapsibility(isUserExpandableEnabled, element, titleBarClass, iconClass) {
103
110
  if (element) {
104
- const titleBarElement = element.getElementsByClassName(titleBarClass)[0];
105
- if (titleBarElement !== undefined) {
106
- const iconElement = iconClass ? element.getElementsByClassName(iconClass)[0] : undefined;
111
+ const titleBarElement = element.querySelector(`.${titleBarClass}`);
112
+ if (titleBarElement) {
113
+ const iconElement = iconClass ? element.querySelector(`.${iconClass}`) : undefined;
107
114
  if (isUserExpandableEnabled) {
108
115
  titleBarElement.removeEventListener('click', clickBlocker, { capture: true });
109
116
  titleBarElement.style.cursor = 'pointer';
110
117
  if (iconElement) iconElement.style.display = 'block';
111
118
  } else {
112
- //expanded = true;
119
+ // Expanded = true;
113
120
  titleBarElement.addEventListener('click', clickBlocker, { capture: true });
114
121
  titleBarElement.style.cursor = 'default';
115
122
  if (iconElement) iconElement.style.display = 'none';
@@ -130,7 +137,8 @@ export function updateCollapsibility(isUserExpandableEnabled, element, titleBarC
130
137
  * If both constraints are provided, values may be clipped.
131
138
  */
132
139
  export function getGridDimensions(itemCount, maxColumns, maxRows) {
133
- let rows, columns;
140
+ let rows;
141
+ let columns;
134
142
  if (maxColumns && maxRows) {
135
143
  // No flexing; items can exceed the available slots
136
144
  rows = Math.min(Math.ceil(itemCount / maxColumns), maxRows);
@@ -151,17 +159,18 @@ export function getGridDimensions(itemCount, maxColumns, maxRows) {
151
159
  return { columns, rows };
152
160
  }
153
161
  export function tupleToObject(tuple, keys) {
162
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
154
163
  const result = {};
155
- keys.forEach((key, index) => {
164
+ for (const [index, key] of keys.entries()) {
156
165
  // Assert that the assignment is safe
157
166
  result[key] = tuple[index];
158
- });
167
+ }
159
168
  return result;
160
169
  }
161
- export function objectToTuple(obj, keys) {
162
- return keys.map((key) => obj[key]);
170
+ export function objectToTuple(object, keys) {
171
+ return keys.map((key) => object[key]);
163
172
  }
164
- // tweakpane helpers
173
+ // Tweakpane helpers
165
174
  export function pickerIsOpen(blade) {
166
175
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
167
176
  return blade.controller.valueController?.foldable_?.valMap_?.expanded?.value_;
@@ -174,7 +183,7 @@ export function getSwatchButton(blade) {
174
183
  blade.controller?.valueController?.view?.buttonElement;
175
184
  return swatch;
176
185
  }
177
- // utility functions
186
+ // Utility functions
178
187
  function quaternionToCssTransform(quaternion) {
179
188
  const [x, y, z, w] = Array.isArray(quaternion)
180
189
  ? quaternion
@@ -197,22 +206,20 @@ function quaternionToCssTransform(quaternion) {
197
206
  }
198
207
  function eulerToCssTransform(
199
208
  rotation,
200
- units = 'rad' // rad is component default
209
+ units = 'rad' // Rad is component default
201
210
  ) {
202
211
  const [x, y, z] = Array.isArray(rotation) ? rotation : [rotation.x, rotation.y, rotation.z];
203
- // note negative z
212
+ // Note negative z
204
213
  return `rotateX(${x}${units}) rotateY(${y}${units}) rotateZ(${-z}${units})`;
205
214
  }
206
215
  function cubicBezierToEaseFunction(cubicBezier) {
207
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
208
- const [x1, y1, x2, y2] = Array.isArray(cubicBezier)
216
+ const [_x1, y1, _x2, y2] = Array.isArray(cubicBezier)
209
217
  ? cubicBezier
210
218
  : [cubicBezier.x1, cubicBezier.y1, cubicBezier.x2, cubicBezier.y2];
211
- return (t) => {
212
- return (1 - t) ** 3 * 0 + (1 - t) ** 2 * t * 3 * y1 + (1 - t) * t ** 2 * 3 * y2 + t ** 3 * 1;
213
- };
219
+ return (t) =>
220
+ (1 - t) ** 3 * 0 + (1 - t) ** 2 * t * 3 * y1 + (1 - t) * t ** 2 * 3 * y2 + t ** 3 * 1;
214
221
  }
215
- // library exports
222
+ // Library exports
216
223
  export default {
217
224
  /**
218
225
  * Convenience function for creating easing functions ready for Svelte's tween and animation
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "svelte-tweakpane-ui",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/kitschpatrol/svelte-tweakpane-ui"
7
+ "url": "git+https://github.com/kitschpatrol/svelte-tweakpane-ui.git"
8
8
  },
9
9
  "homepage": "https:///kitschpatrol.com/svelte-tweakpane-ui",
10
10
  "bugs": {
@@ -187,57 +187,46 @@
187
187
  "@0b5vr/tweakpane-plugin-rotation": "^0.2.0",
188
188
  "@kitschpatrol/tweakpane-image-plugin": "^2.0.0",
189
189
  "@kitschpatrol/tweakpane-textarea-plugin": "^2.0.1",
190
- "@tweakpane/core": "^2.0.1",
190
+ "@tweakpane/core": "^2.0.2",
191
191
  "@tweakpane/plugin-camerakit": "^0.3.0",
192
192
  "@tweakpane/plugin-essentials": "^0.2.0",
193
+ "bumpp": "^9.2.1",
193
194
  "esm-env": "^1.0.0",
194
- "nanoid": "^5.0.3",
195
+ "nanoid": "^5.0.4",
195
196
  "svelte-local-storage-store": "^0.6.4",
196
- "tweakpane": "^4.0.1",
197
+ "tweakpane": "^4.0.2",
197
198
  "tweakpane-plugin-waveform": "^1.0.0"
198
199
  },
199
200
  "devDependencies": {
201
+ "@kitschpatrol/shared-config": "^4.0.0",
200
202
  "@phenomnomnominal/tsquery": "^6.1.3",
201
203
  "@stkb/rewrap": "^0.1.0",
202
204
  "@sveltejs/adapter-static": "^2.0.3",
203
- "@sveltejs/kit": "^1.27.6",
205
+ "@sveltejs/kit": "^1.30.3",
204
206
  "@sveltejs/package": "^2.2.3",
205
- "@types/eslint": "^8.44.8",
207
+ "@types/eslint": "^8.44.9",
206
208
  "@types/fs-extra": "^11.0.4",
207
- "@types/node": "^20.10.2",
208
- "@typescript-eslint/eslint-plugin": "^6.13.1",
209
- "@typescript-eslint/parser": "^6.13.1",
210
- "cspell": "^8.1.0",
211
- "eslint": "^8.55.0",
212
- "eslint-config-prettier": "^9.0.0",
213
- "eslint-plugin-perfectionist": "^2.5.0",
214
- "eslint-plugin-svelte": "^2.35.1",
209
+ "@types/node": "^20.10.4",
210
+ "eslint": "^8.56.0",
215
211
  "fs-extra": "^11.2.0",
216
212
  "glob": "^10.3.10",
217
- "markdownlint": "^0.32.1",
218
- "markdownlint-cli": "^0.37.0",
219
213
  "npm-run-all": "^4.1.5",
220
214
  "postcss-html": "^1.5.0",
221
- "prettier": "^3.1.0",
222
- "prettier-plugin-astro": "^0.12.2",
223
- "prettier-plugin-pkg": "^0.18.0",
224
- "prettier-plugin-svelte": "^3.1.2",
225
215
  "publint": "^0.2.6",
226
- "stylelint": "^15.11.0",
227
- "stylelint-config-clean-order": "^5.2.0",
228
- "stylelint-config-html": "^1.1.0",
229
- "stylelint-config-standard": "^34.0.0",
216
+ "read-package-up": "^11.0.0",
230
217
  "svelte": "^4.2.8",
231
218
  "svelte-check": "^3.6.2",
232
219
  "svelte-language-server": "^0.16.1",
233
220
  "svelte2tsx": "^0.6.27",
234
- "ts-morph": "^20.0.0",
221
+ "ts-morph": "^21.0.1",
235
222
  "tslib": "^2.6.2",
236
- "tsx": "^4.6.1",
237
- "typescript": "^5.3.2",
238
- "vite": "^4.5.0",
223
+ "tsx": "^4.6.2",
224
+ "typescript": "^5.3.3",
225
+ "vite": "^4.5.1",
239
226
  "yaml": "^2.3.4"
240
227
  },
228
+ "_id": "svelte-tweakpane-ui@1.0.2",
229
+ "readme": "ERROR: No README data found!",
241
230
  "scripts": {
242
231
  "build": "run-s --print-label build:*",
243
232
  "build:01-sync": "pnpm run check",
@@ -246,9 +235,9 @@
246
235
  "build:04-format": "pnpm run format",
247
236
  "build:05-package": "svelte-package && publint",
248
237
  "build:06-heal-dts-comments": "tsx ./scripts/heal-dts-comments.ts",
249
- "build:07-strip-component-docs": "tsx ./scripts/strip-component-docs.ts",
238
+ "build:07-strip-component-documentation": "tsx ./scripts/strip-component-documentation.ts",
250
239
  "build:08-format-library": "prettier --ignore-path --plugin prettier-plugin-svelte --write ./dist",
251
- "build:09-doc-data": "tsx ./scripts/generate-doc-data.ts",
240
+ "build:09-doc-data": "tsx ./scripts/generate-documentation-data.ts",
252
241
  "build:10-examples-to-kit": "tsx ./scripts/generate-kit-examples.ts",
253
242
  "build:11-examples-to-docs": "tsx ./scripts/generate-example-components.ts",
254
243
  "build:12-acknowledgments-data": "mkdir -p ./docs/src/content/acknowledgments && pnpm licenses list --json > ./docs/src/content/acknowledgments/acknowledgments-lib.json",
@@ -260,21 +249,15 @@
260
249
  "docs-dev": "pnpm -C ./docs run dev",
261
250
  "docs-preview": "pnpm -C ./docs run preview",
262
251
  "format": "run-s --print-label format:*",
263
- "format:1-eslint": "eslint --fix ./src ./scripts ./docs/src",
264
- "format:2-stylelint": "stylelint --fix './src/**/*.{css,svelte,html}'",
265
- "format:3-rewrap": "rewrap -i --column 100 `find src \\( -name '*.svelte' -o -name '*.ts' -o -name '*.html' \\) -type f | grep -v src/examples`",
266
- "format:4-prettier": "prettier --plugin=prettier-plugin-svelte --plugin=prettier-plugin-astro --write .",
267
- "format:5-embedded": "tsx ./scripts/format-embedded-code.ts",
252
+ "format:1-shared": "shared-config --fix",
253
+ "format:2-embedded": "tsx ./scripts/format-embedded-code.ts",
268
254
  "kit-build": "pnpm run kit-examples && vite build",
269
255
  "kit-dev": " pnpm run kit-examples && vite dev",
270
256
  "kit-examples": "tsx ./scripts/generate-kit-examples.ts",
271
257
  "kit-preview": "vite preview",
272
- "lint": "run-p --print-label lint:*",
273
- "lint:eslint": "eslint ./src ./scripts ./docs/src",
274
- "lint:markdown": "markdownlint **/*.{md,mdx} --ignore node_modules",
275
- "lint:prettier": "prettier --plugin=prettier-plugin-svelte --plugin=prettier-plugin-astro --check .",
276
- "lint:spelling": "cspell --quiet .",
277
- "lint:stylelint": "stylelint './src/**/*.{css,svelte,html}'",
278
- "lint:typescript": "tsc --noEmit"
258
+ "lint": "shared-config --check",
259
+ "release": "pnpm bumpp --commit 'Release: %s' --tag '%s' && pnpm publish --otp $(op read 'op://Personal/Npmjs/one-time password?attribute=otp')",
260
+ "rewrap": "rewrap -i --column 100 `find src \\( -name '*.svelte' -o -name '*.ts' -o -name '*.html' \\) -type f | grep -v src/examples`",
261
+ "type-check": "tsc --noEmit"
279
262
  }
280
263
  }
@@ -1,13 +1,20 @@
1
1
  # svelte-tweakpane-ui
2
2
 
3
+ [![NPM Package](https://img.shields.io/npm/v/svelte-tweakpane-ui.svg)](https://npmjs.com/package/svelte-tweakpane-ui)
4
+ [![Documentation](https://img.shields.io/badge/-documentation-ffdd00?logo=readthedocs&logoColor=222222)](https://kitschpatrol.com/svelte-tweakpane-ui)
5
+
3
6
  ## Overview
4
7
 
5
- 🎛️ **_Svelte Tweakpane UI_** wraps user-interface elements from the excellent [Tweakpane](https://cocopon.github.io/tweakpane/) library in a collection of 31 idiomatic, reactive, type-safe, carefully-crafted [Svelte](https://svelte.dev) components.
8
+ 🎛️ **_Svelte Tweakpane UI_** wraps user-interface elements from the excellent [Tweakpane](https://cocopon.github.io/tweakpane/) library in a collection of 31 idiomatic, reactive, type-safe, carefully-crafted, and obsessively-documented [Svelte](https://svelte.dev) components.
6
9
 
7
- The library makes it easy to quickly and declaratively add knobs and dials to your projects using components that feel like they belong in the DOM. It also augments Tweakpane with a few [extra features](https://kitschpatrol.com/svelte-tweakpane-ui/docs/features) for your convenience and enjoyment.
10
+ 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.
8
11
 
9
12
  [The components](https://kitschpatrol.com/svelte-tweakpane-ui/docs#components) should be useful for integrating controls and value monitoring in parametrically driven artworks or simulations.
10
13
 
14
+ ## Demo
15
+
16
+ ![Svelte Tweakpane UI quick demo](./docs/public/quick-demo.gif)
17
+
11
18
  ## Documentation
12
19
 
13
20
  **_Please see the documentation site for much more information:_**
@@ -28,7 +35,7 @@ npm install svelte-tweakpane-ui
28
35
  import { Button } from 'svelte-tweakpane-ui';
29
36
  </script>
30
37
 
31
- <Button on:click={() => alert('Hi from STUI')} />
38
+ <Button on:click={() => alert('🎛️')} />
32
39
  ```
33
40
 
34
41
  ---
File without changes