@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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@consent.software/catalog',
6
- version: '1.3.5',
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
- firstUpdated(_changedProperties: Map<string | number | symbol, unknown>): Promise<void>;
10
- handleClick(mouseEvent: any): Promise<void>;
11
- syncSelection(): Promise<void>;
12
- getText(): string;
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
- cursor: pointer;
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
- transition: all 0.2s;
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
- transition: all 0.2s;
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
- <div class="toggleKnobInner"></div>
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
- async firstUpdated(_changedProperties) {
90
- super.firstUpdated(_changedProperties);
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.syncSelection();
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
- async handleClick(mouseEvent) {
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
- const moverElement = this.shadowRoot.querySelector('.toggleKnobMover');
99
- moverElement.style.transform = 'translateX(20px)';
100
- await delayFor(250);
101
- moverElement.style.transform = 'translateX(30px)';
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
- mouseEvent.stopPropagation();
106
- mouseEvent.preventDefault();
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
- async syncSelection() {
111
- console.log(`Selected ${this.selected}`);
112
- const moverElement = this.shadowRoot.querySelector('.toggleKnobMover');
113
- if (this.selected) {
114
- moverElement.style.transform = 'translateX(30px)';
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
- else {
117
- moverElement.style.transform = 'translateX(0px)';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2VudHNvZnR3YXJlLXRvZ2dsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9jb25zZW50c29mdHdhcmUtdG9nZ2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBdUIsTUFBTSxLQUFLLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHM0MsSUFBTSxxQkFBcUIsR0FBM0IsTUFBTSxxQkFBc0IsU0FBUSxVQUFVO2FBQ3JDLFNBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUEsbURBQW1ELEFBQWhFLENBQWlFO2FBUXJFLFdBQU0sR0FBRyxHQUFHLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RHpCLEFBdkRtQixDQXVEbEI7SUFFRjtRQUNFLEtBQUssRUFBRSxDQUFDO1FBL0RILGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHakIsYUFBUSxHQUFHLEtBQUssQ0FBQztJQTZEeEIsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQTsyQkFDWSxJQUFJLENBQUMsT0FBTyxFQUFFO21DQUNOLElBQUksQ0FBQyxXQUFXOzs7Ozs7O0tBTzlDLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxrQkFBMEQ7UUFDbEYsS0FBSyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBVTtRQUNqQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixNQUFNLFlBQVksR0FBbUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN2RixZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztZQUNsRCxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztZQUNsRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM3QixVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWE7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFtQixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDO1FBQ3BELENBQUM7YUFBTSxDQUFDO1lBQ04sWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7O0FBbEhNO0lBRE4sUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDOzt1REFDSjtBQUdqQjtJQUROLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOzt1REFDbkI7QUFQYixxQkFBcUI7SUFEakMsYUFBYSxDQUFDLHdCQUF3QixDQUFDOztHQUMzQixxQkFBcUIsQ0F1SGpDIn0=
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc2VudHNvZnR3YXJlLXRvZ2dsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9jb25zZW50c29mdHdhcmUtdG9nZ2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBdUIsTUFBTSxLQUFLLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHM0MsSUFBTSxxQkFBcUIsR0FBM0IsTUFBTSxxQkFBc0IsU0FBUSxVQUFVO2FBdUJyQyxXQUFNLEdBQUcsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUV6QixBQW5FbUIsQ0FtRWxCO0lBRUY7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQTNGSCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFeEI7Ozs7V0FJRztRQUNLLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFFckI7O1dBRUc7UUFDSyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsV0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUN4QixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsZUFBVSxHQUFHLEVBQUUsQ0FBQztJQXlFakMsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQTsyQkFDWSxJQUFJLENBQUMsT0FBTyxFQUFFOzttQ0FFTixJQUFJLENBQUMsV0FBVzs7Ozs7OzZCQU10QixJQUFJLENBQUMsUUFBUTs2QkFDYixJ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
@@ -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
- <div class="toggleKnobInner"></div>
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
- async firstUpdated(_changedProperties) {
42692
- super.firstUpdated(_changedProperties);
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.syncSelection();
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
- async handleClick(mouseEvent) {
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
- const moverElement = this.shadowRoot.querySelector(".toggleKnobMover");
42701
- moverElement.style.transform = "translateX(20px)";
42702
- await delayFor(250);
42703
- moverElement.style.transform = "translateX(30px)";
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
- mouseEvent.stopPropagation();
42708
- mouseEvent.preventDefault();
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
- async syncSelection() {
42713
- console.log(`Selected ${this.selected}`);
42714
- const moverElement = this.shadowRoot.querySelector(".toggleKnobMover");
42715
- if (this.selected) {
42716
- moverElement.style.transform = "translateX(30px)";
42717
- } else {
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
- cursor: pointer;
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
- transition: all 0.2s;
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
- transition: all 0.2s;
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 {