@consent.software/catalog 1.3.5 → 1.4.1
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/dist_bundle/bundle.js +52 -31
- package/dist_bundle/bundle.js.map +3 -3
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/consentsoftware-toggle.d.ts +33 -5
- package/dist_ts_web/elements/consentsoftware-toggle.js +144 -31
- package/dist_watch/bundle.js +126 -30
- package/dist_watch/bundle.js.map +2 -2
- package/package.json +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/consentsoftware-toggle.ts +161 -33
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@consent.software/catalog',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.4.1',
|
|
7
7
|
description: 'A library of web components designed to integrate robust consent management capabilities into web applications, ensuring compliance with privacy regulations.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsMkJBQTJCO0lBQ2pDLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSwrSkFBK0o7Q0FDN0ssQ0FBQSJ9
|
|
@@ -1,13 +1,41 @@
|
|
|
1
1
|
import { LitElement, type TemplateResult } from 'lit';
|
|
2
2
|
export declare class ConsentsoftwareToggle extends LitElement {
|
|
3
|
-
static demo: () => TemplateResult<1>;
|
|
4
3
|
required: boolean;
|
|
5
4
|
selected: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* We always track the knob’s left offset in `currentX`.
|
|
7
|
+
* - 0 => fully left
|
|
8
|
+
* - 30 => fully right
|
|
9
|
+
*/
|
|
10
|
+
private currentX;
|
|
11
|
+
/**
|
|
12
|
+
* Drag state
|
|
13
|
+
*/
|
|
14
|
+
private isDragging;
|
|
15
|
+
private hasDragged;
|
|
16
|
+
private startX;
|
|
17
|
+
private readonly knobWidth;
|
|
18
|
+
private readonly trackWidth;
|
|
6
19
|
static styles: import("lit").CSSResult;
|
|
7
20
|
constructor();
|
|
8
21
|
render(): TemplateResult;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
22
|
+
/**
|
|
23
|
+
* If required = true on first render, auto-select and set the knob to the right.
|
|
24
|
+
*/
|
|
25
|
+
firstUpdated(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* CLICK HANDLER
|
|
28
|
+
*/
|
|
29
|
+
handleClick(event: MouseEvent): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* DRAG HANDLERS (pointer events)
|
|
32
|
+
*/
|
|
33
|
+
private onPointerDown;
|
|
34
|
+
private onPointerMove;
|
|
35
|
+
private onPointerUp;
|
|
36
|
+
/**
|
|
37
|
+
* If external code sets `selected = true/false`, we also sync the knob position
|
|
38
|
+
*/
|
|
39
|
+
protected updated(changedProperties: Map<PropertyKey, unknown>): void;
|
|
40
|
+
getText(): string | null;
|
|
13
41
|
}
|
|
@@ -12,7 +12,6 @@ import { customElement } from 'lit/decorators.js';
|
|
|
12
12
|
import { property } from 'lit/decorators/property.js';
|
|
13
13
|
import { delayFor } from '@push.rocks/smartdelay';
|
|
14
14
|
let ConsentsoftwareToggle = class ConsentsoftwareToggle extends LitElement {
|
|
15
|
-
static { this.demo = () => html `<consentsoftware-toggle></consentsoftware-toggle>`; }
|
|
16
15
|
static { this.styles = css `
|
|
17
16
|
:host {
|
|
18
17
|
display: block;
|
|
@@ -23,17 +22,21 @@ let ConsentsoftwareToggle = class ConsentsoftwareToggle extends LitElement {
|
|
|
23
22
|
margin-bottom: 16px;
|
|
24
23
|
}
|
|
25
24
|
|
|
25
|
+
.toggle {
|
|
26
|
+
user-select: none; /* helps avoid text selection on drag */
|
|
27
|
+
}
|
|
28
|
+
|
|
26
29
|
.toggleKnobArea {
|
|
27
|
-
|
|
30
|
+
position: relative;
|
|
28
31
|
margin: auto;
|
|
29
32
|
height: 30px;
|
|
30
33
|
width: 60px;
|
|
31
34
|
border-radius: 20px;
|
|
32
35
|
background: rgba(255, 255, 255, 0.1);
|
|
33
|
-
position: relative;
|
|
34
|
-
overflow: hidden;
|
|
35
|
-
transition: all 0.2s;
|
|
36
36
|
border: 1px solid rgba(255, 255, 255, 0);
|
|
37
|
+
overflow: hidden;
|
|
38
|
+
transition: background 0.2s ease;
|
|
39
|
+
cursor: pointer;
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
:host([selected]) .toggleKnobArea {
|
|
@@ -41,19 +44,27 @@ let ConsentsoftwareToggle = class ConsentsoftwareToggle extends LitElement {
|
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
.toggleKnobMover {
|
|
44
|
-
|
|
47
|
+
position: relative;
|
|
48
|
+
height: 100%;
|
|
49
|
+
width: 100%;
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
.toggleKnobInner {
|
|
48
|
-
height: 30px;
|
|
49
|
-
width: 30px;
|
|
50
|
-
border-radius: 15px;
|
|
51
|
-
background: rgba(255, 255, 255, 0.5);
|
|
52
53
|
position: absolute;
|
|
53
54
|
top: 0;
|
|
54
55
|
left: 0;
|
|
55
|
-
|
|
56
|
+
width: 30px;
|
|
57
|
+
height: 30px;
|
|
58
|
+
border-radius: 15px;
|
|
59
|
+
background: rgba(255, 255, 255, 0.5);
|
|
60
|
+
transition: left 0.2s ease, background 0.2s ease;
|
|
56
61
|
transform: scale(0.7);
|
|
62
|
+
/* Prevent scroll gestures on mobile */
|
|
63
|
+
touch-action: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.toggleKnobInner.dragging {
|
|
67
|
+
transition: background 0.2s ease;
|
|
57
68
|
}
|
|
58
69
|
|
|
59
70
|
:host([selected]) .toggleKnobInner {
|
|
@@ -73,49 +84,151 @@ let ConsentsoftwareToggle = class ConsentsoftwareToggle extends LitElement {
|
|
|
73
84
|
super();
|
|
74
85
|
this.required = false;
|
|
75
86
|
this.selected = false;
|
|
87
|
+
/**
|
|
88
|
+
* We always track the knob’s left offset in `currentX`.
|
|
89
|
+
* - 0 => fully left
|
|
90
|
+
* - 30 => fully right
|
|
91
|
+
*/
|
|
92
|
+
this.currentX = 0;
|
|
93
|
+
/**
|
|
94
|
+
* Drag state
|
|
95
|
+
*/
|
|
96
|
+
this.isDragging = false;
|
|
97
|
+
this.hasDragged = false;
|
|
98
|
+
this.startX = 0; // pointerdown offset
|
|
99
|
+
this.knobWidth = 30;
|
|
100
|
+
this.trackWidth = 60;
|
|
76
101
|
}
|
|
77
102
|
render() {
|
|
78
103
|
return html `
|
|
79
104
|
<div class="label">${this.getText()}</div>
|
|
105
|
+
<!-- A user can click anywhere in this toggle area. -->
|
|
80
106
|
<div class="toggle" @click=${this.handleClick}>
|
|
81
107
|
<div class="toggleKnobArea">
|
|
82
108
|
<div class="toggleKnobMover">
|
|
83
|
-
|
|
109
|
+
<!-- The knob itself, with pointer events for dragging. -->
|
|
110
|
+
<div
|
|
111
|
+
class="toggleKnobInner"
|
|
112
|
+
style="left: ${this.currentX}px;"
|
|
113
|
+
@pointerdown=${this.onPointerDown}
|
|
114
|
+
@pointermove=${this.onPointerMove}
|
|
115
|
+
@pointerup=${this.onPointerUp}
|
|
116
|
+
@pointercancel=${this.onPointerUp}
|
|
117
|
+
></div>
|
|
84
118
|
</div>
|
|
85
119
|
</div>
|
|
86
120
|
</div>
|
|
87
121
|
`;
|
|
88
122
|
}
|
|
89
|
-
|
|
90
|
-
|
|
123
|
+
/**
|
|
124
|
+
* If required = true on first render, auto-select and set the knob to the right.
|
|
125
|
+
*/
|
|
126
|
+
async firstUpdated() {
|
|
91
127
|
if (this.required) {
|
|
128
|
+
// If "required" => always selected
|
|
92
129
|
this.selected = true;
|
|
93
|
-
this.
|
|
130
|
+
this.currentX = this.knobWidth; // 30
|
|
131
|
+
this.requestUpdate();
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// If not required, set knob to 0 or 30 depending on `selected`
|
|
135
|
+
this.currentX = this.selected ? this.knobWidth : 0;
|
|
136
|
+
this.requestUpdate();
|
|
94
137
|
}
|
|
95
138
|
}
|
|
96
|
-
|
|
139
|
+
/**
|
|
140
|
+
* CLICK HANDLER
|
|
141
|
+
*/
|
|
142
|
+
async handleClick(event) {
|
|
143
|
+
// If the user truly dragged the knob, skip the normal click toggle.
|
|
144
|
+
if (this.isDragging || this.hasDragged) {
|
|
145
|
+
event.stopPropagation();
|
|
146
|
+
event.preventDefault();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
97
149
|
if (this.required) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
150
|
+
// small bounce from 30 -> 20 -> 30
|
|
151
|
+
this.currentX = this.knobWidth; // ensure at 30
|
|
152
|
+
this.requestUpdate();
|
|
153
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
154
|
+
this.currentX = 20; // small bounce left
|
|
155
|
+
this.requestUpdate();
|
|
156
|
+
await delayFor(200);
|
|
157
|
+
this.currentX = this.knobWidth; // back to 30
|
|
158
|
+
this.requestUpdate();
|
|
102
159
|
return;
|
|
103
160
|
}
|
|
161
|
+
// Normal toggle if no drag & not required
|
|
162
|
+
event.stopPropagation();
|
|
163
|
+
event.preventDefault();
|
|
104
164
|
this.selected = !this.selected;
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
this.syncSelection();
|
|
165
|
+
this.currentX = this.selected ? this.knobWidth : 0; // snap knob left(0) or right(30)
|
|
166
|
+
this.requestUpdate();
|
|
108
167
|
this.dispatchEvent(new CustomEvent('toggle', { detail: { selected: this.selected } }));
|
|
168
|
+
delayFor(0).then(() => {
|
|
169
|
+
this.hasDragged = false;
|
|
170
|
+
});
|
|
109
171
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
172
|
+
/**
|
|
173
|
+
* DRAG HANDLERS (pointer events)
|
|
174
|
+
*/
|
|
175
|
+
onPointerDown(event) {
|
|
176
|
+
if (this.required) {
|
|
177
|
+
// If "required", disallow manual dragging
|
|
178
|
+
return;
|
|
115
179
|
}
|
|
116
|
-
|
|
117
|
-
|
|
180
|
+
// Start dragging
|
|
181
|
+
this.isDragging = true;
|
|
182
|
+
// The difference between the pointer’s X and the knob’s current position
|
|
183
|
+
this.startX = event.clientX - this.currentX;
|
|
184
|
+
// capture pointer so we keep receiving pointermove/pointerup
|
|
185
|
+
event.target.setPointerCapture(event.pointerId);
|
|
186
|
+
}
|
|
187
|
+
onPointerMove(event) {
|
|
188
|
+
if (!this.isDragging)
|
|
189
|
+
return;
|
|
190
|
+
const newX = event.clientX - this.startX;
|
|
191
|
+
this.hasDragged = true;
|
|
192
|
+
const toggleKnobInner = this.shadowRoot.querySelector('.toggleKnobInner');
|
|
193
|
+
toggleKnobInner.classList.add('dragging');
|
|
194
|
+
// Clamp
|
|
195
|
+
this.currentX = Math.max(0, Math.min(newX, this.trackWidth - this.knobWidth));
|
|
196
|
+
this.requestUpdate();
|
|
197
|
+
}
|
|
198
|
+
onPointerUp(event) {
|
|
199
|
+
if (!this.isDragging)
|
|
200
|
+
return;
|
|
201
|
+
event.target.releasePointerCapture(event.pointerId);
|
|
202
|
+
this.isDragging = false;
|
|
203
|
+
// If we didn’t truly drag, pointerup does nothing; click handler handles toggling.
|
|
204
|
+
if (!this.hasDragged) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const toggleKnobInner = this.shadowRoot.querySelector('.toggleKnobInner');
|
|
208
|
+
toggleKnobInner.classList.remove('dragging');
|
|
209
|
+
// Real drag => decide final side
|
|
210
|
+
const midpoint = (this.trackWidth - this.knobWidth) / 2; // 15
|
|
211
|
+
this.selected = this.currentX > midpoint;
|
|
212
|
+
this.currentX = this.selected ? this.knobWidth : 0; // snap to edge
|
|
213
|
+
this.requestUpdate();
|
|
214
|
+
// Dispatch toggle event
|
|
215
|
+
this.dispatchEvent(new CustomEvent('toggle', { detail: { selected: this.selected } }));
|
|
216
|
+
delayFor(0).then(() => {
|
|
217
|
+
this.hasDragged = false;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* If external code sets `selected = true/false`, we also sync the knob position
|
|
222
|
+
*/
|
|
223
|
+
updated(changedProperties) {
|
|
224
|
+
if (changedProperties.has('selected') &&
|
|
225
|
+
!this.isDragging &&
|
|
226
|
+
!this.hasDragged &&
|
|
227
|
+
!this.required) {
|
|
228
|
+
this.currentX = this.selected ? this.knobWidth : 0;
|
|
229
|
+
this.requestUpdate();
|
|
118
230
|
}
|
|
231
|
+
super.updated(changedProperties);
|
|
119
232
|
}
|
|
120
233
|
getText() {
|
|
121
234
|
return this.textContent;
|
|
@@ -134,4 +247,4 @@ ConsentsoftwareToggle = __decorate([
|
|
|
134
247
|
__metadata("design:paramtypes", [])
|
|
135
248
|
], ConsentsoftwareToggle);
|
|
136
249
|
export { ConsentsoftwareToggle };
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2VudHNvZnR3YXJlLXRvZ2dsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9jb25zZW50c29mdHdhcmUtdG9nZ2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBdUIsTUFBTSxLQUFLLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHM0MsSUFBTSxxQkFBcUIsR0FBM0IsTUFBTSxxQkFBc0IsU0FBUSxVQUFVO2FBdUJyQyxXQUFNLEdBQUcsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUV6QixBQW5FbUIsQ0FtRWxCO0lBRUY7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQTNGSCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFeEI7Ozs7V0FJRztRQUNLLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFFckI7O1dBRUc7UUFDSyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsV0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUN4QixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsZUFBVSxHQUFHLEVBQUUsQ0FBQztJQXlFakMsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQTsyQkFDWSxJQUFJLENBQUMsT0FBTyxFQUFFOzttQ0FFTixJQUFJLENBQUMsV0FBVzs7Ozs7OzZCQU10QixJQUFJLENBQUMsUUFBUTs2QkFDYixJ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
|
package/dist_watch/bundle.js
CHANGED
|
@@ -42675,54 +42675,138 @@ var ConsentsoftwareToggle = class extends r4 {
|
|
|
42675
42675
|
super();
|
|
42676
42676
|
this.required = false;
|
|
42677
42677
|
this.selected = false;
|
|
42678
|
+
/**
|
|
42679
|
+
* We always track the knob’s left offset in `currentX`.
|
|
42680
|
+
* - 0 => fully left
|
|
42681
|
+
* - 30 => fully right
|
|
42682
|
+
*/
|
|
42683
|
+
this.currentX = 0;
|
|
42684
|
+
/**
|
|
42685
|
+
* Drag state
|
|
42686
|
+
*/
|
|
42687
|
+
this.isDragging = false;
|
|
42688
|
+
this.hasDragged = false;
|
|
42689
|
+
this.startX = 0;
|
|
42690
|
+
// pointerdown offset
|
|
42691
|
+
this.knobWidth = 30;
|
|
42692
|
+
this.trackWidth = 60;
|
|
42678
42693
|
}
|
|
42679
42694
|
render() {
|
|
42680
42695
|
return x`
|
|
42681
42696
|
<div class="label">${this.getText()}</div>
|
|
42697
|
+
<!-- A user can click anywhere in this toggle area. -->
|
|
42682
42698
|
<div class="toggle" @click=${this.handleClick}>
|
|
42683
42699
|
<div class="toggleKnobArea">
|
|
42684
42700
|
<div class="toggleKnobMover">
|
|
42685
|
-
|
|
42701
|
+
<!-- The knob itself, with pointer events for dragging. -->
|
|
42702
|
+
<div
|
|
42703
|
+
class="toggleKnobInner"
|
|
42704
|
+
style="left: ${this.currentX}px;"
|
|
42705
|
+
@pointerdown=${this.onPointerDown}
|
|
42706
|
+
@pointermove=${this.onPointerMove}
|
|
42707
|
+
@pointerup=${this.onPointerUp}
|
|
42708
|
+
@pointercancel=${this.onPointerUp}
|
|
42709
|
+
></div>
|
|
42686
42710
|
</div>
|
|
42687
42711
|
</div>
|
|
42688
42712
|
</div>
|
|
42689
42713
|
`;
|
|
42690
42714
|
}
|
|
42691
|
-
|
|
42692
|
-
|
|
42715
|
+
/**
|
|
42716
|
+
* If required = true on first render, auto-select and set the knob to the right.
|
|
42717
|
+
*/
|
|
42718
|
+
async firstUpdated() {
|
|
42693
42719
|
if (this.required) {
|
|
42694
42720
|
this.selected = true;
|
|
42695
|
-
this.
|
|
42721
|
+
this.currentX = this.knobWidth;
|
|
42722
|
+
this.requestUpdate();
|
|
42723
|
+
} else {
|
|
42724
|
+
this.currentX = this.selected ? this.knobWidth : 0;
|
|
42725
|
+
this.requestUpdate();
|
|
42696
42726
|
}
|
|
42697
42727
|
}
|
|
42698
|
-
|
|
42728
|
+
/**
|
|
42729
|
+
* CLICK HANDLER
|
|
42730
|
+
*/
|
|
42731
|
+
async handleClick(event) {
|
|
42732
|
+
if (this.isDragging || this.hasDragged) {
|
|
42733
|
+
event.stopPropagation();
|
|
42734
|
+
event.preventDefault();
|
|
42735
|
+
return;
|
|
42736
|
+
}
|
|
42699
42737
|
if (this.required) {
|
|
42700
|
-
|
|
42701
|
-
|
|
42702
|
-
await
|
|
42703
|
-
|
|
42738
|
+
this.currentX = this.knobWidth;
|
|
42739
|
+
this.requestUpdate();
|
|
42740
|
+
await new Promise((r11) => setTimeout(r11, 10));
|
|
42741
|
+
this.currentX = 20;
|
|
42742
|
+
this.requestUpdate();
|
|
42743
|
+
await delayFor(200);
|
|
42744
|
+
this.currentX = this.knobWidth;
|
|
42745
|
+
this.requestUpdate();
|
|
42704
42746
|
return;
|
|
42705
42747
|
}
|
|
42748
|
+
event.stopPropagation();
|
|
42749
|
+
event.preventDefault();
|
|
42706
42750
|
this.selected = !this.selected;
|
|
42707
|
-
|
|
42708
|
-
|
|
42709
|
-
this.syncSelection();
|
|
42751
|
+
this.currentX = this.selected ? this.knobWidth : 0;
|
|
42752
|
+
this.requestUpdate();
|
|
42710
42753
|
this.dispatchEvent(new CustomEvent("toggle", { detail: { selected: this.selected } }));
|
|
42754
|
+
delayFor(0).then(() => {
|
|
42755
|
+
this.hasDragged = false;
|
|
42756
|
+
});
|
|
42711
42757
|
}
|
|
42712
|
-
|
|
42713
|
-
|
|
42714
|
-
|
|
42715
|
-
|
|
42716
|
-
|
|
42717
|
-
|
|
42718
|
-
moverElement.style.transform = "translateX(0px)";
|
|
42758
|
+
/**
|
|
42759
|
+
* DRAG HANDLERS (pointer events)
|
|
42760
|
+
*/
|
|
42761
|
+
onPointerDown(event) {
|
|
42762
|
+
if (this.required) {
|
|
42763
|
+
return;
|
|
42719
42764
|
}
|
|
42765
|
+
this.isDragging = true;
|
|
42766
|
+
this.startX = event.clientX - this.currentX;
|
|
42767
|
+
event.target.setPointerCapture(event.pointerId);
|
|
42768
|
+
}
|
|
42769
|
+
onPointerMove(event) {
|
|
42770
|
+
if (!this.isDragging) return;
|
|
42771
|
+
const newX = event.clientX - this.startX;
|
|
42772
|
+
this.hasDragged = true;
|
|
42773
|
+
const toggleKnobInner = this.shadowRoot.querySelector(".toggleKnobInner");
|
|
42774
|
+
toggleKnobInner.classList.add("dragging");
|
|
42775
|
+
this.currentX = Math.max(0, Math.min(newX, this.trackWidth - this.knobWidth));
|
|
42776
|
+
this.requestUpdate();
|
|
42777
|
+
}
|
|
42778
|
+
onPointerUp(event) {
|
|
42779
|
+
if (!this.isDragging) return;
|
|
42780
|
+
event.target.releasePointerCapture(event.pointerId);
|
|
42781
|
+
this.isDragging = false;
|
|
42782
|
+
if (!this.hasDragged) {
|
|
42783
|
+
return;
|
|
42784
|
+
}
|
|
42785
|
+
const toggleKnobInner = this.shadowRoot.querySelector(".toggleKnobInner");
|
|
42786
|
+
toggleKnobInner.classList.remove("dragging");
|
|
42787
|
+
const midpoint = (this.trackWidth - this.knobWidth) / 2;
|
|
42788
|
+
this.selected = this.currentX > midpoint;
|
|
42789
|
+
this.currentX = this.selected ? this.knobWidth : 0;
|
|
42790
|
+
this.requestUpdate();
|
|
42791
|
+
this.dispatchEvent(new CustomEvent("toggle", { detail: { selected: this.selected } }));
|
|
42792
|
+
delayFor(0).then(() => {
|
|
42793
|
+
this.hasDragged = false;
|
|
42794
|
+
});
|
|
42795
|
+
}
|
|
42796
|
+
/**
|
|
42797
|
+
* If external code sets `selected = true/false`, we also sync the knob position
|
|
42798
|
+
*/
|
|
42799
|
+
updated(changedProperties) {
|
|
42800
|
+
if (changedProperties.has("selected") && !this.isDragging && !this.hasDragged && !this.required) {
|
|
42801
|
+
this.currentX = this.selected ? this.knobWidth : 0;
|
|
42802
|
+
this.requestUpdate();
|
|
42803
|
+
}
|
|
42804
|
+
super.updated(changedProperties);
|
|
42720
42805
|
}
|
|
42721
42806
|
getText() {
|
|
42722
42807
|
return this.textContent;
|
|
42723
42808
|
}
|
|
42724
42809
|
};
|
|
42725
|
-
ConsentsoftwareToggle.demo = () => x`<consentsoftware-toggle></consentsoftware-toggle>`;
|
|
42726
42810
|
ConsentsoftwareToggle.styles = i`
|
|
42727
42811
|
:host {
|
|
42728
42812
|
display: block;
|
|
@@ -42733,17 +42817,21 @@ ConsentsoftwareToggle.styles = i`
|
|
|
42733
42817
|
margin-bottom: 16px;
|
|
42734
42818
|
}
|
|
42735
42819
|
|
|
42820
|
+
.toggle {
|
|
42821
|
+
user-select: none; /* helps avoid text selection on drag */
|
|
42822
|
+
}
|
|
42823
|
+
|
|
42736
42824
|
.toggleKnobArea {
|
|
42737
|
-
|
|
42825
|
+
position: relative;
|
|
42738
42826
|
margin: auto;
|
|
42739
42827
|
height: 30px;
|
|
42740
42828
|
width: 60px;
|
|
42741
42829
|
border-radius: 20px;
|
|
42742
42830
|
background: rgba(255, 255, 255, 0.1);
|
|
42743
|
-
position: relative;
|
|
42744
|
-
overflow: hidden;
|
|
42745
|
-
transition: all 0.2s;
|
|
42746
42831
|
border: 1px solid rgba(255, 255, 255, 0);
|
|
42832
|
+
overflow: hidden;
|
|
42833
|
+
transition: background 0.2s ease;
|
|
42834
|
+
cursor: pointer;
|
|
42747
42835
|
}
|
|
42748
42836
|
|
|
42749
42837
|
:host([selected]) .toggleKnobArea {
|
|
@@ -42751,19 +42839,27 @@ ConsentsoftwareToggle.styles = i`
|
|
|
42751
42839
|
}
|
|
42752
42840
|
|
|
42753
42841
|
.toggleKnobMover {
|
|
42754
|
-
|
|
42842
|
+
position: relative;
|
|
42843
|
+
height: 100%;
|
|
42844
|
+
width: 100%;
|
|
42755
42845
|
}
|
|
42756
42846
|
|
|
42757
42847
|
.toggleKnobInner {
|
|
42758
|
-
height: 30px;
|
|
42759
|
-
width: 30px;
|
|
42760
|
-
border-radius: 15px;
|
|
42761
|
-
background: rgba(255, 255, 255, 0.5);
|
|
42762
42848
|
position: absolute;
|
|
42763
42849
|
top: 0;
|
|
42764
42850
|
left: 0;
|
|
42765
|
-
|
|
42851
|
+
width: 30px;
|
|
42852
|
+
height: 30px;
|
|
42853
|
+
border-radius: 15px;
|
|
42854
|
+
background: rgba(255, 255, 255, 0.5);
|
|
42855
|
+
transition: left 0.2s ease, background 0.2s ease;
|
|
42766
42856
|
transform: scale(0.7);
|
|
42857
|
+
/* Prevent scroll gestures on mobile */
|
|
42858
|
+
touch-action: none;
|
|
42859
|
+
}
|
|
42860
|
+
|
|
42861
|
+
.toggleKnobInner.dragging {
|
|
42862
|
+
transition: background 0.2s ease;
|
|
42767
42863
|
}
|
|
42768
42864
|
|
|
42769
42865
|
:host([selected]) .toggleKnobInner {
|