@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 +3 -0
- package/dist/ctrls/ctrl-boolean.js +4 -0
- package/dist/ctrls/ctrl-dual-range.js +6 -0
- package/dist/ctrls/ctrl-easing.js +3 -0
- package/dist/ctrls/ctrl-radio.js +2 -1
- package/dist/ctrls/ctrl-range.js +4 -0
- package/dist/ctrls/ctrl-seed.js +3 -1
- package/dist/ctrls/index.d.ts +1 -1
- package/dist/ctrls.css +0 -4
- package/dist/ctrls.css.map +1 -1
- package/dist/utils/string-utils.d.ts +1 -0
- package/dist/utils/string-utils.js +6 -3
- package/package.json +1 -1
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);
|
package/dist/ctrls/ctrl-radio.js
CHANGED
|
@@ -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 = `
|
|
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;
|
package/dist/ctrls/ctrl-range.js
CHANGED
|
@@ -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());
|
package/dist/ctrls/ctrl-seed.js
CHANGED
|
@@ -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 =
|
|
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);
|
package/dist/ctrls/index.d.ts
CHANGED
package/dist/ctrls.css
CHANGED
package/dist/ctrls.css.map
CHANGED
|
@@ -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
|
|
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,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,
|
|
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,
|
|
11
|
+
return str.replace(/([a-z])([A-Z])/g, "$1 $2").toLowerCase();
|
|
9
12
|
};
|