@stanko/ctrls 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -373,9 +373,12 @@ Thank you for stopping by! If you end up using Ctrls, please let me know, I woul
373
373
 
374
374
  ## TODO
375
375
 
376
+ * [ ] Add `add/removeEventListener` instead of direct update of `onInput` and `onChange`
376
377
  * [ ] Allow users to pass a custom PRNG lib
377
378
  * [ ] Hash storage - check if there is an instance using hash storage already
378
379
  * [ ] Storage - local storage
380
+ * [x] Add `name` and `id` to inputs
381
+ * [x] TypeDef bug - easing presets should be optional
379
382
  * [x] Add title which collapses the controls
380
383
  * [x] Prefix input names' with `ctrl_${id}_${name}` to avoid collisions
381
384
  * [x] Demo - stop animation when not in viewport
@@ -1,4 +1,5 @@
1
1
  import { checkIcon } from "../utils/icons";
2
+ import { toHtmlId } from "../utils/string-utils";
2
3
  export class BooleanCtrl {
3
4
  constructor(config, onChange, onInput) {
4
5
  this.type = "boolean";
@@ -15,9 +16,12 @@ export class BooleanCtrl {
15
16
  return value.toString();
16
17
  };
17
18
  this.buildUI = () => {
19
+ const id = toHtmlId(this.name);
18
20
  const input = document.createElement("input");
19
21
  input.classList.add("ctrls__boolean-input");
20
22
  input.setAttribute("type", "checkbox");
23
+ input.setAttribute("id", id);
24
+ input.setAttribute("name", id);
21
25
  input.checked = this.value;
22
26
  input.addEventListener("change", () => {
23
27
  this.value = input.checked;
@@ -1,6 +1,7 @@
1
1
  import random from "../utils/random";
2
2
  import DualRangeInput from "@stanko/dual-range-input";
3
3
  import { roundToStep } from "../utils/round-to-step";
4
+ import { toHtmlId } from "../utils/string-utils";
4
5
  export class DualRangeCtrl {
5
6
  constructor(config, onChange, onInput) {
6
7
  this.type = "dual-range";
@@ -28,6 +29,7 @@ export class DualRangeCtrl {
28
29
  };
29
30
  this.buildUI = () => {
30
31
  const { min, max, step, value } = this;
32
+ const id = toHtmlId(this.name);
31
33
  const changeHandler = () => {
32
34
  this.value = {
33
35
  min: parseFloat(minInput.value),
@@ -46,6 +48,8 @@ export class DualRangeCtrl {
46
48
  };
47
49
  const minInput = document.createElement("input");
48
50
  minInput.setAttribute("type", "range");
51
+ minInput.setAttribute("name", `${id}-min`);
52
+ minInput.setAttribute("id", `${id}-min`);
49
53
  minInput.setAttribute("min", min.toString());
50
54
  minInput.setAttribute("max", max.toString());
51
55
  minInput.setAttribute("step", step.toString());
@@ -54,6 +58,8 @@ export class DualRangeCtrl {
54
58
  minInput.addEventListener("change", changeHandler);
55
59
  const maxInput = document.createElement("input");
56
60
  maxInput.setAttribute("type", "range");
61
+ maxInput.setAttribute("name", `${id}-max`);
62
+ maxInput.setAttribute("id", `${id}-max`);
57
63
  maxInput.setAttribute("min", min.toString());
58
64
  maxInput.setAttribute("max", max.toString());
59
65
  maxInput.setAttribute("step", step.toString());
@@ -1,5 +1,6 @@
1
1
  import random from "../utils/random";
2
2
  import BezierEasing from "bezier-easing";
3
+ import { toHtmlId } from "../utils/string-utils";
3
4
  const easings = {
4
5
  EASE: [0.25, 0.1, 0.25, 1],
5
6
  LINEAR: [0, 0, 1, 1],
@@ -51,6 +52,7 @@ export class EasingCtrl {
51
52
  };
52
53
  this.buildUI = () => {
53
54
  const { value } = this;
55
+ const id = toHtmlId(this.name);
54
56
  const line1 = document.createElementNS("http://www.w3.org/2000/svg", "line");
55
57
  line1.setAttribute("class", "ctrls__easing-line ctrls__easing-line--1");
56
58
  line1.setAttribute("x1", "0");
@@ -213,6 +215,7 @@ export class EasingCtrl {
213
215
  controlWrapper.classList.add("ctrls__easing-wrapper");
214
216
  controlWrapper.appendChild(ticks);
215
217
  controlWrapper.appendChild(control);
218
+ controlWrapper.setAttribute("id", id);
216
219
  const right = document.createElement("div");
217
220
  right.classList.add("ctrls__control-right");
218
221
  right.appendChild(controlWrapper);
@@ -24,6 +24,7 @@ export class RadioCtrl {
24
24
  const input = document.createElement("input");
25
25
  input.setAttribute("type", "radio");
26
26
  input.setAttribute("name", this.id);
27
+ input.setAttribute("id", `${this.id}-${toKebabCase(item.value)}`);
27
28
  input.setAttribute("value", item.value);
28
29
  input.checked = item.value === value;
29
30
  input.addEventListener("change", () => {
@@ -77,7 +78,7 @@ export class RadioCtrl {
77
78
  this.columns = config.columns || 3;
78
79
  this.name = config.name;
79
80
  this.label = config.label || config.name;
80
- this.id = `ctrls-${getRandomString()}-${toKebabCase(this.name)}`;
81
+ this.id = `ctrls__${toKebabCase(config.name)}-${getRandomString()}`;
81
82
  const defaultValue = this.items.find((item) => item.value === config.defaultValue);
82
83
  this.value = defaultValue?.value || this.getDefaultValue();
83
84
  this.isRandomizationDisabled = config.isRandomizationDisabled || false;
@@ -1,5 +1,6 @@
1
1
  import random from "../utils/random";
2
2
  import { roundToStep } from "../utils/round-to-step";
3
+ import { toHtmlId } from "../utils/string-utils";
3
4
  export class RangeCtrl {
4
5
  constructor(config, onChange, onInput) {
5
6
  this.type = "range";
@@ -19,9 +20,12 @@ export class RangeCtrl {
19
20
  };
20
21
  this.buildUI = () => {
21
22
  const { min, max, step, value } = this;
23
+ const id = toHtmlId(this.name);
22
24
  const input = document.createElement("input");
23
25
  input.classList.add("ctrls__range-input");
24
26
  input.setAttribute("type", "range");
27
+ input.setAttribute("id", id);
28
+ input.setAttribute("name", id);
25
29
  input.setAttribute("min", min.toString());
26
30
  input.setAttribute("max", max.toString());
27
31
  input.setAttribute("step", step.toString());
@@ -1,5 +1,6 @@
1
1
  import generateSeed from "../utils/generate-seed";
2
2
  import { refreshIcon } from "../utils/icons";
3
+ import { toHtmlId } from "../utils/string-utils";
3
4
  export class SeedCtrl {
4
5
  constructor(config, onChange, onInput) {
5
6
  this.type = "seed";
@@ -20,12 +21,13 @@ export class SeedCtrl {
20
21
  };
21
22
  this.buildUI = () => {
22
23
  const { value } = this;
23
- const id = `control-${this.name}`;
24
+ const id = toHtmlId(this.name);
24
25
  const input = document.createElement("input");
25
26
  input.classList.add("ctrls__seed-input");
26
27
  input.setAttribute("type", "text");
27
28
  input.setAttribute("value", value.toString());
28
29
  input.setAttribute("id", id);
30
+ input.setAttribute("name", id);
29
31
  input.addEventListener("change", () => {
30
32
  this.value = this.parse(input.value);
31
33
  this.onChange(this.name, this.value);
@@ -63,7 +63,7 @@ export interface CtrlTypeRegistry {
63
63
  };
64
64
  easing: {
65
65
  config: CtrlConfig<Easing> & {
66
- presets: Record<string, Easing>;
66
+ presets?: Record<string, Easing>;
67
67
  };
68
68
  instance: EasingCtrl;
69
69
  value: Easing;
package/dist/ctrls.css CHANGED
@@ -395,10 +395,6 @@
395
395
  font-size: var(--ctrls-value-font-size);
396
396
  }
397
397
 
398
- .ctrls__control-right {
399
- flex: auto 1 1;
400
- }
401
-
402
398
  .ctrls button:focus-visible {
403
399
  outline: 2px solid var(--ctrls-theme);
404
400
  outline-offset: 2px;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../node_modules/@stanko/dual-range-input/dist/index.css","../src/scss/_ctrls.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;;AC3IF;EACE;AAAA;AAAA;EAGA;EACA;EACA;EACA;EACA;EAGA;EACA;EAEA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EAGA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EAEA;EACA;EAEA;EACA;EAGA;EAGA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EAEA;EAEA;EACA;EAEA;EAGA;EAEA;EACA;;;AA+CF;EACE;IA3CA;IAEA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IAGA;IAGA;IACA;IACA;IAGA;IACA;IAGA;IAGA;IAEA;IAGA;IAGA;AAAA;AAAA;;;AAWF;EAhDE;EAEA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EAGA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EAEA;EAGA;EAGA;AAAA;AAAA;;;AAiBF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGE;EACA;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAGF;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAGF;EAEE;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EACE;;;AAKJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;;;AAOA;EACE;;AAGF;AAAA;AAAA;EAEE;;;AAKN;AAEA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAKA;AAAA;EACE;EACA;EACA;;;AAIJ;AAEA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;EACE;;;AAIF;EACE;;;AAIF;EACE;EACA;;;AAGF;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAmCJ;EA5BE;EACA;EACA;EACA;EACA;EAEA;;;AA0BF;EAhCE;EACA;EACA;EACA;EACA;EAEA;;;AA8BF;EAtBE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAkBA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAKF;EAvDE;EACA;EACA;EACA;EACA;EAEA;;;AAqDF;EA7CE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAwCA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAEA;EAGE;;AAEA;EACE;;AANJ;EASE;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;;AAEA;EACE;;;AAIJ;AAEA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;EAEF;EACA;EACA;;AAEA;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAEA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;AAIE;EACE;;;AAKN;AAEA;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAGF;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAEA;EACE;EACA","file":"ctrls.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../node_modules/@stanko/dual-range-input/dist/index.css","../src/scss/_ctrls.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;;;;AC3IF;EACE;AAAA;AAAA;EAGA;EACA;EACA;EACA;EACA;EAGA;EACA;EAEA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EAGA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EAEA;EACA;EAEA;EACA;EAGA;EAGA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAGA;EACA;EAEA;EAEA;EACA;EAEA;EAGA;EAEA;EACA;;;AA+CF;EACE;IA3CA;IAEA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;IAGA;IAGA;IACA;IACA;IAGA;IACA;IAGA;IAGA;IAEA;IAGA;IAGA;AAAA;AAAA;;;AAWF;EAhDE;EAEA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EAGA;EAGA;EACA;EACA;EAGA;EACA;EAGA;EAGA;EAEA;EAGA;EAGA;AAAA;AAAA;;;AAiBF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGE;EACA;EACA;;AAGF;AAAA;EAEE;EACA;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAGF;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAGA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAGF;EAEE;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EACE;;;AAKJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;;;AAOA;EACE;;AAGF;AAAA;AAAA;EAEE;;;AAKN;AAEA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAKA;AAAA;EACE;EACA;EACA;;;AAIJ;AAEA;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;EACE;;;AAIF;EACE;;;AAIF;EACE;EACA;;;AAGF;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAmCJ;EA5BE;EACA;EACA;EACA;EACA;EAEA;;;AA0BF;EAhCE;EACA;EACA;EACA;EACA;EAEA;;;AA8BF;EAtBE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAkBA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAKF;EAvDE;EACA;EACA;EACA;EACA;EAEA;;;AAqDF;EA7CE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAwCA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAEA;EAGE;;AAEA;EACE;;AANJ;EASE;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;;AAEA;EACE;;;AAIJ;AAEA;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;EAEF;EACA;EACA;;AAEA;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAEA;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;;AAIE;EACE;;;AAKN;AAEA;EACE;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;AAEA;AAAA;EAEE;EACA;EACA;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;AAGF;EAEE;EACA;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAEA;EACE;EACA","file":"ctrls.css"}
@@ -1,3 +1,4 @@
1
+ export declare const toHtmlId: (str: string) => string;
1
2
  export declare const toKebabCase: (str: string) => string;
2
3
  export declare const toCamelCase: (str: string) => string;
3
4
  export declare const toSpaceCase: (str: string) => string;
@@ -1,9 +1,12 @@
1
+ export const toHtmlId = (str) => {
2
+ return `ctrls__${toKebabCase(str)}`;
3
+ };
1
4
  export const toKebabCase = (str) => {
2
- return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
5
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
3
6
  };
4
7
  export const toCamelCase = (str) => {
5
- return str.replace(/([-_ ][a-z])/g, (group) => group.toUpperCase().replace(/[-_ ]/, ''));
8
+ return str.replace(/([-_ ][a-z])/g, (group) => group.toUpperCase().replace(/[-_ ]/, ""));
6
9
  };
7
10
  export const toSpaceCase = (str) => {
8
- return str.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();
11
+ return str.replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase();
9
12
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stanko/ctrls",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "start": "npm run parse-markdown && vite",