@proyecto-viviana/solidaria 0.0.3 → 0.0.4

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 (110) hide show
  1. package/dist/button/createButton.d.ts +29 -0
  2. package/dist/button/createButton.d.ts.map +1 -0
  3. package/dist/button/createToggleButton.d.ts +41 -0
  4. package/dist/button/createToggleButton.d.ts.map +1 -0
  5. package/dist/button/index.d.ts +5 -0
  6. package/dist/button/index.d.ts.map +1 -0
  7. package/dist/button/types.d.ts +66 -0
  8. package/dist/button/types.d.ts.map +1 -0
  9. package/dist/checkbox/createCheckbox.d.ts +56 -0
  10. package/dist/checkbox/createCheckbox.d.ts.map +1 -0
  11. package/dist/checkbox/createCheckboxGroup.d.ts +53 -0
  12. package/dist/checkbox/createCheckboxGroup.d.ts.map +1 -0
  13. package/dist/checkbox/createCheckboxGroupItem.d.ts +25 -0
  14. package/dist/checkbox/createCheckboxGroupItem.d.ts.map +1 -0
  15. package/dist/checkbox/createCheckboxGroupState.d.ts +71 -0
  16. package/dist/checkbox/createCheckboxGroupState.d.ts.map +1 -0
  17. package/dist/checkbox/index.d.ts +9 -0
  18. package/dist/checkbox/index.d.ts.map +1 -0
  19. package/dist/index.d.ts +15 -1214
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +324 -151
  22. package/dist/index.js.map +1 -0
  23. package/dist/interactions/FocusableProvider.d.ts +26 -0
  24. package/dist/interactions/FocusableProvider.d.ts.map +1 -0
  25. package/dist/interactions/PressEvent.d.ts +63 -0
  26. package/dist/interactions/PressEvent.d.ts.map +1 -0
  27. package/dist/interactions/createFocus.d.ts +31 -0
  28. package/dist/interactions/createFocus.d.ts.map +1 -0
  29. package/dist/interactions/createFocusRing.d.ts +37 -0
  30. package/dist/interactions/createFocusRing.d.ts.map +1 -0
  31. package/dist/interactions/createFocusWithin.d.ts +27 -0
  32. package/dist/interactions/createFocusWithin.d.ts.map +1 -0
  33. package/dist/interactions/createFocusable.d.ts +65 -0
  34. package/dist/interactions/createFocusable.d.ts.map +1 -0
  35. package/dist/interactions/createHover.d.ts +41 -0
  36. package/dist/interactions/createHover.d.ts.map +1 -0
  37. package/dist/interactions/createKeyboard.d.ts +35 -0
  38. package/dist/interactions/createKeyboard.d.ts.map +1 -0
  39. package/dist/interactions/createPress.d.ts +49 -0
  40. package/dist/interactions/createPress.d.ts.map +1 -0
  41. package/dist/interactions/index.d.ts +10 -0
  42. package/dist/interactions/index.d.ts.map +1 -0
  43. package/dist/label/createField.d.ts +51 -0
  44. package/dist/label/createField.d.ts.map +1 -0
  45. package/dist/label/createLabel.d.ts +49 -0
  46. package/dist/label/createLabel.d.ts.map +1 -0
  47. package/dist/label/createLabels.d.ts +16 -0
  48. package/dist/label/createLabels.d.ts.map +1 -0
  49. package/dist/label/index.d.ts +6 -0
  50. package/dist/label/index.d.ts.map +1 -0
  51. package/dist/link/createLink.d.ts +65 -0
  52. package/dist/link/createLink.d.ts.map +1 -0
  53. package/dist/link/index.d.ts +2 -0
  54. package/dist/link/index.d.ts.map +1 -0
  55. package/dist/progress/createProgressBar.d.ts +47 -0
  56. package/dist/progress/createProgressBar.d.ts.map +1 -0
  57. package/dist/progress/index.d.ts +2 -0
  58. package/dist/progress/index.d.ts.map +1 -0
  59. package/dist/radio/createRadio.d.ts +68 -0
  60. package/dist/radio/createRadio.d.ts.map +1 -0
  61. package/dist/radio/createRadioGroup.d.ts +85 -0
  62. package/dist/radio/createRadioGroup.d.ts.map +1 -0
  63. package/dist/radio/createRadioGroupState.d.ts +77 -0
  64. package/dist/radio/createRadioGroupState.d.ts.map +1 -0
  65. package/dist/radio/index.d.ts +4 -0
  66. package/dist/radio/index.d.ts.map +1 -0
  67. package/dist/separator/createSeparator.d.ts +38 -0
  68. package/dist/separator/createSeparator.d.ts.map +1 -0
  69. package/dist/separator/index.d.ts +2 -0
  70. package/dist/separator/index.d.ts.map +1 -0
  71. package/dist/ssr/index.d.ts +24 -0
  72. package/dist/ssr/index.d.ts.map +1 -0
  73. package/dist/switch/createSwitch.d.ts +34 -0
  74. package/dist/switch/createSwitch.d.ts.map +1 -0
  75. package/dist/switch/index.d.ts +2 -0
  76. package/dist/switch/index.d.ts.map +1 -0
  77. package/dist/textfield/createTextField.d.ts +73 -0
  78. package/dist/textfield/createTextField.d.ts.map +1 -0
  79. package/dist/textfield/index.d.ts +2 -0
  80. package/dist/textfield/index.d.ts.map +1 -0
  81. package/dist/toggle/createToggle.d.ts +94 -0
  82. package/dist/toggle/createToggle.d.ts.map +1 -0
  83. package/dist/toggle/createToggleState.d.ts +34 -0
  84. package/dist/toggle/createToggleState.d.ts.map +1 -0
  85. package/dist/toggle/index.d.ts +5 -0
  86. package/dist/toggle/index.d.ts.map +1 -0
  87. package/dist/utils/dom.d.ts +51 -0
  88. package/dist/utils/dom.d.ts.map +1 -0
  89. package/dist/utils/events.d.ts +29 -0
  90. package/dist/utils/events.d.ts.map +1 -0
  91. package/dist/utils/filterDOMProps.d.ts +29 -0
  92. package/dist/utils/filterDOMProps.d.ts.map +1 -0
  93. package/dist/utils/focus.d.ts +20 -0
  94. package/dist/utils/focus.d.ts.map +1 -0
  95. package/dist/utils/geometry.d.ts +40 -0
  96. package/dist/utils/geometry.d.ts.map +1 -0
  97. package/dist/utils/globalListeners.d.ts +36 -0
  98. package/dist/utils/globalListeners.d.ts.map +1 -0
  99. package/dist/utils/index.d.ts +11 -0
  100. package/dist/utils/index.d.ts.map +1 -0
  101. package/dist/utils/mergeProps.d.ts +8 -0
  102. package/dist/utils/mergeProps.d.ts.map +1 -0
  103. package/dist/utils/platform.d.ts +14 -0
  104. package/dist/utils/platform.d.ts.map +1 -0
  105. package/dist/utils/reactivity.d.ts +28 -0
  106. package/dist/utils/reactivity.d.ts.map +1 -0
  107. package/dist/utils/textSelection.d.ts +19 -0
  108. package/dist/utils/textSelection.d.ts.map +1 -0
  109. package/package.json +52 -53
  110. package/dist/index.jsx +0 -2717
package/dist/index.jsx DELETED
@@ -1,2717 +0,0 @@
1
- // src/interactions/createPress.ts
2
- import { createSignal, onCleanup as onCleanup2 } from "solid-js";
3
-
4
- // src/interactions/PressEvent.ts
5
- var PressEvent = class {
6
- type;
7
- pointerType;
8
- target;
9
- shiftKey;
10
- ctrlKey;
11
- metaKey;
12
- altKey;
13
- x;
14
- y;
15
- #shouldStopPropagation = true;
16
- constructor(type, pointerType, originalEvent, target) {
17
- this.type = type;
18
- this.pointerType = pointerType;
19
- this.target = target;
20
- const e = originalEvent;
21
- this.shiftKey = e?.shiftKey ?? false;
22
- this.ctrlKey = e?.ctrlKey ?? false;
23
- this.metaKey = e?.metaKey ?? false;
24
- this.altKey = e?.altKey ?? false;
25
- this.x = 0;
26
- this.y = 0;
27
- if (originalEvent && "clientX" in originalEvent && target) {
28
- const rect = target.getBoundingClientRect();
29
- this.x = originalEvent.clientX - rect.left;
30
- this.y = originalEvent.clientY - rect.top;
31
- } else if (target) {
32
- const rect = target.getBoundingClientRect();
33
- this.x = rect.width / 2;
34
- this.y = rect.height / 2;
35
- }
36
- }
37
- /**
38
- * Call this to allow the press event to propagate to parent elements.
39
- * By default, press events stop propagation.
40
- */
41
- continuePropagation() {
42
- this.#shouldStopPropagation = false;
43
- }
44
- /**
45
- * Whether the event should stop propagation.
46
- * Used internally by the press handler.
47
- */
48
- get shouldStopPropagation() {
49
- return this.#shouldStopPropagation;
50
- }
51
- };
52
- function createPressEvent(type, pointerType, originalEvent, target) {
53
- return new PressEvent(type, pointerType, originalEvent, target);
54
- }
55
-
56
- // src/utils/mergeProps.ts
57
- function mergeProps(...args) {
58
- const result = {};
59
- for (const props of args) {
60
- for (const key in props) {
61
- const value = props[key];
62
- const existingValue = result[key];
63
- if (typeof existingValue === "function" && typeof value === "function" && key.startsWith("on") && key[2] === key[2]?.toUpperCase()) {
64
- result[key] = chainHandlers(existingValue, value);
65
- } else if (key === "class" || key === "className") {
66
- result[key] = mergeClassNames(existingValue, value);
67
- } else if (key === "style" && typeof existingValue === "object" && typeof value === "object") {
68
- result[key] = { ...existingValue, ...value };
69
- } else if (value !== void 0) {
70
- result[key] = value;
71
- }
72
- }
73
- }
74
- return result;
75
- }
76
- function chainHandlers(existingHandler, newHandler) {
77
- return (...args) => {
78
- existingHandler(...args);
79
- newHandler(...args);
80
- };
81
- }
82
- function mergeClassNames(...classes) {
83
- return classes.filter(Boolean).join(" ");
84
- }
85
-
86
- // src/utils/filterDOMProps.ts
87
- var DOMPropNames = /* @__PURE__ */ new Set(["id"]);
88
- var labelablePropNames = /* @__PURE__ */ new Set([
89
- "aria-label",
90
- "aria-labelledby",
91
- "aria-describedby",
92
- "aria-details"
93
- ]);
94
- var linkPropNames = /* @__PURE__ */ new Set([
95
- "href",
96
- "hrefLang",
97
- "target",
98
- "rel",
99
- "download",
100
- "ping",
101
- "referrerPolicy"
102
- ]);
103
- var globalAttrs = /* @__PURE__ */ new Set(["dir", "lang", "hidden", "inert", "translate"]);
104
- var globalEvents = /* @__PURE__ */ new Set([
105
- "onClick",
106
- "onAuxClick",
107
- "onContextMenu",
108
- "onDoubleClick",
109
- "onMouseDown",
110
- "onMouseEnter",
111
- "onMouseLeave",
112
- "onMouseMove",
113
- "onMouseOut",
114
- "onMouseOver",
115
- "onMouseUp",
116
- "onTouchCancel",
117
- "onTouchEnd",
118
- "onTouchMove",
119
- "onTouchStart",
120
- "onPointerDown",
121
- "onPointerMove",
122
- "onPointerUp",
123
- "onPointerCancel",
124
- "onPointerEnter",
125
- "onPointerLeave",
126
- "onPointerOver",
127
- "onPointerOut",
128
- "onGotPointerCapture",
129
- "onLostPointerCapture",
130
- "onScroll",
131
- "onWheel",
132
- "onAnimationStart",
133
- "onAnimationEnd",
134
- "onAnimationIteration",
135
- "onTransitionCancel",
136
- "onTransitionEnd",
137
- "onTransitionRun",
138
- "onTransitionStart"
139
- ]);
140
- var propRe = /^(data-.*)$/;
141
- function filterDOMProps(props, opts = {}) {
142
- const { labelable, isLink, global, events = global, propNames } = opts;
143
- const filteredProps = {};
144
- for (const prop in props) {
145
- if (Object.prototype.hasOwnProperty.call(props, prop) && (DOMPropNames.has(prop) || labelable && labelablePropNames.has(prop) || isLink && linkPropNames.has(prop) || global && globalAttrs.has(prop) || events && (globalEvents.has(prop) || prop.endsWith("Capture") && globalEvents.has(prop.slice(0, -7))) || propNames?.has(prop) || propRe.test(prop))) {
146
- filteredProps[prop] = props[prop];
147
- }
148
- }
149
- return filteredProps;
150
- }
151
-
152
- // src/utils/reactivity.ts
153
- function access(value) {
154
- return typeof value === "function" ? value() : value;
155
- }
156
- function isAccessor(value) {
157
- return typeof value === "function";
158
- }
159
-
160
- // src/utils/platform.ts
161
- function testPlatform(re) {
162
- return typeof window !== "undefined" && window.navigator != null ? re.test(window.navigator.platform || window.navigator.userAgentData?.platform || "") : false;
163
- }
164
- function isMac() {
165
- return testPlatform(/^Mac/i);
166
- }
167
- function isIPhone() {
168
- return testPlatform(/^iPhone/i);
169
- }
170
- function isIPad() {
171
- return testPlatform(/^iPad/i) || isMac() && navigator.maxTouchPoints > 1;
172
- }
173
- function isIOS() {
174
- return isIPhone() || isIPad();
175
- }
176
-
177
- // src/utils/dom.ts
178
- function getOwnerDocument(el) {
179
- return el?.ownerDocument ?? document;
180
- }
181
- function nodeContains(parent, child) {
182
- if (!parent || !child) {
183
- return false;
184
- }
185
- if (parent.contains(child)) {
186
- return true;
187
- }
188
- let node = child;
189
- while (node) {
190
- if (node === parent) {
191
- return true;
192
- }
193
- if (node.host) {
194
- node = node.host;
195
- } else {
196
- node = node.parentNode;
197
- }
198
- }
199
- return false;
200
- }
201
- function getEventTarget(event) {
202
- if (typeof event.composedPath === "function") {
203
- const path = event.composedPath();
204
- if (path.length > 0) {
205
- return path[0];
206
- }
207
- }
208
- return event.target;
209
- }
210
- function isValidKeyboardEvent(event, currentTarget) {
211
- const { key, code } = event;
212
- const element = currentTarget;
213
- const tagName = element.tagName.toLowerCase();
214
- const role = element.getAttribute("role");
215
- const isActivationKey = key === "Enter" || key === " " || key === "Spacebar" || code === "Space";
216
- if (!isActivationKey) {
217
- return false;
218
- }
219
- if (tagName === "textarea") {
220
- return false;
221
- }
222
- if (element.isContentEditable) {
223
- return false;
224
- }
225
- const isLink = tagName === "a" || role === "link";
226
- if (isLink && key !== "Enter") {
227
- return false;
228
- }
229
- if (tagName === "input") {
230
- return isValidInputKey(element, key);
231
- }
232
- return true;
233
- }
234
- function isValidInputKey(target, key) {
235
- const type = target.type.toLowerCase();
236
- if (type === "checkbox" || type === "radio") {
237
- return key === " " || key === "Spacebar";
238
- }
239
- const textInputTypes = [
240
- "text",
241
- "search",
242
- "url",
243
- "tel",
244
- "email",
245
- "password",
246
- "date",
247
- "month",
248
- "week",
249
- "time",
250
- "datetime-local",
251
- "number"
252
- ];
253
- if (textInputTypes.includes(type)) {
254
- return false;
255
- }
256
- return true;
257
- }
258
- function isHTMLAnchorLink(target) {
259
- return target.tagName === "A" && target.hasAttribute("href");
260
- }
261
- function shouldPreventDefaultKeyboard(target, key) {
262
- const tagName = target.tagName.toLowerCase();
263
- if (tagName === "input" || tagName === "textarea" || tagName === "select") {
264
- return false;
265
- }
266
- if ((tagName === "a" || target.getAttribute("role") === "link") && key === "Enter") {
267
- return false;
268
- }
269
- if (tagName === "button") {
270
- const type = target.type;
271
- if (type === "submit" || type === "reset") {
272
- return false;
273
- }
274
- }
275
- return true;
276
- }
277
- function openLink(target, event, allowOpener = false) {
278
- const { href, target: linkTarget, rel } = target;
279
- const keyEvent = event;
280
- const shouldOpenInNewTab = linkTarget === "_blank" || keyEvent?.metaKey || keyEvent?.ctrlKey || keyEvent?.shiftKey || keyEvent?.altKey;
281
- if (shouldOpenInNewTab) {
282
- const features = !allowOpener && rel?.includes("noopener") ? "noopener" : void 0;
283
- window.open(href, linkTarget || "_blank", features);
284
- } else {
285
- window.location.href = href;
286
- }
287
- }
288
-
289
- // src/utils/geometry.ts
290
- function areRectanglesOverlapping(a, b) {
291
- if (a.left > b.right || b.left > a.right) {
292
- return false;
293
- }
294
- if (a.top > b.bottom || b.top > a.bottom) {
295
- return false;
296
- }
297
- return true;
298
- }
299
- function getPointClientRect(point) {
300
- let offsetX = 0;
301
- let offsetY = 0;
302
- if (point.width !== void 0 && point.width > 0) {
303
- offsetX = point.width / 2;
304
- } else if (point.radiusX !== void 0 && point.radiusX > 0) {
305
- offsetX = point.radiusX;
306
- }
307
- if (point.height !== void 0 && point.height > 0) {
308
- offsetY = point.height / 2;
309
- } else if (point.radiusY !== void 0 && point.radiusY > 0) {
310
- offsetY = point.radiusY;
311
- }
312
- return {
313
- top: point.clientY - offsetY,
314
- right: point.clientX + offsetX,
315
- bottom: point.clientY + offsetY,
316
- left: point.clientX - offsetX
317
- };
318
- }
319
- function isPointOverTarget(point, target) {
320
- const rect = target.getBoundingClientRect();
321
- const pointRect = getPointClientRect(point);
322
- return areRectanglesOverlapping(
323
- {
324
- top: rect.top,
325
- right: rect.right,
326
- bottom: rect.bottom,
327
- left: rect.left
328
- },
329
- pointRect
330
- );
331
- }
332
- function getTouchFromEvent(event) {
333
- const { targetTouches } = event;
334
- if (targetTouches.length > 0) {
335
- return targetTouches[0];
336
- }
337
- return null;
338
- }
339
- function getTouchById(event, pointerId) {
340
- if (pointerId == null) {
341
- return null;
342
- }
343
- const { changedTouches } = event;
344
- for (let i = 0; i < changedTouches.length; i++) {
345
- const touch = changedTouches[i];
346
- if (touch.identifier === pointerId) {
347
- return touch;
348
- }
349
- }
350
- return null;
351
- }
352
-
353
- // src/utils/events.ts
354
- function isVirtualClick(event) {
355
- if (event.mozInputSource === 0 && event.isTrusted) {
356
- return true;
357
- }
358
- if (isAndroidTalkBackClick(event)) {
359
- return true;
360
- }
361
- return event.detail === 0 && !event.pointerType;
362
- }
363
- function isAndroidTalkBackClick(event) {
364
- return event.detail === 1 && event.offsetX === 0 && event.offsetY === 0;
365
- }
366
- function isVirtualPointerEvent(event) {
367
- return event.width === 0 && event.height === 0 || // Some screen readers send events with pointerType but no actual pointer
368
- event.pointerType === "mouse" && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.buttons === 0;
369
- }
370
- function setEventTarget(event, target) {
371
- Object.defineProperty(event, "target", {
372
- value: target,
373
- writable: false,
374
- configurable: true
375
- });
376
- Object.defineProperty(event, "currentTarget", {
377
- value: target,
378
- writable: false,
379
- configurable: true
380
- });
381
- }
382
-
383
- // src/utils/textSelection.ts
384
- var state = "default";
385
- var savedUserSelect = "";
386
- var modifiedElementMap = /* @__PURE__ */ new WeakMap();
387
- function disableTextSelection(target) {
388
- if (isIOS()) {
389
- if (state === "default") {
390
- const documentElement = getOwnerDocument(target).documentElement;
391
- savedUserSelect = documentElement.style.webkitUserSelect;
392
- documentElement.style.webkitUserSelect = "none";
393
- }
394
- state = "disabled";
395
- } else if (target) {
396
- const element = target;
397
- if (!modifiedElementMap.has(element)) {
398
- modifiedElementMap.set(element, element.style.userSelect);
399
- element.style.userSelect = "none";
400
- }
401
- }
402
- }
403
- function restoreTextSelection(target) {
404
- if (isIOS()) {
405
- if (state !== "disabled") {
406
- return;
407
- }
408
- state = "restoring";
409
- setTimeout(() => {
410
- runAfterTransition(() => {
411
- if (state === "restoring") {
412
- const documentElement = getOwnerDocument(target).documentElement;
413
- if (savedUserSelect) {
414
- documentElement.style.webkitUserSelect = savedUserSelect;
415
- } else {
416
- documentElement.style.removeProperty("-webkit-user-select");
417
- }
418
- savedUserSelect = "";
419
- state = "default";
420
- }
421
- });
422
- }, 300);
423
- } else if (target) {
424
- const element = target;
425
- const savedValue = modifiedElementMap.get(element);
426
- if (savedValue !== void 0) {
427
- if (savedValue) {
428
- element.style.userSelect = savedValue;
429
- } else {
430
- element.style.removeProperty("user-select");
431
- }
432
- modifiedElementMap.delete(element);
433
- }
434
- }
435
- }
436
- var pendingTransitions = /* @__PURE__ */ new Set();
437
- var transitionTimeout = null;
438
- function runAfterTransition(callback) {
439
- pendingTransitions.add(callback);
440
- if (transitionTimeout != null) {
441
- clearTimeout(transitionTimeout);
442
- }
443
- transitionTimeout = setTimeout(() => {
444
- for (const cb of pendingTransitions) {
445
- cb();
446
- }
447
- pendingTransitions.clear();
448
- transitionTimeout = null;
449
- }, 0);
450
- }
451
-
452
- // src/utils/focus.ts
453
- function focusWithoutScrolling(element) {
454
- if (!element) return;
455
- try {
456
- element.focus({ preventScroll: true });
457
- } catch {
458
- const scrollableElements = getScrollableAncestors(element);
459
- const scrollPositions = scrollableElements.map((el) => ({
460
- element: el,
461
- scrollTop: el.scrollTop,
462
- scrollLeft: el.scrollLeft
463
- }));
464
- element.focus();
465
- for (const { element: el, scrollTop, scrollLeft } of scrollPositions) {
466
- el.scrollTop = scrollTop;
467
- el.scrollLeft = scrollLeft;
468
- }
469
- }
470
- }
471
- function getScrollableAncestors(element) {
472
- const ancestors = [];
473
- let parent = element.parentElement;
474
- while (parent) {
475
- const style = getComputedStyle(parent);
476
- const overflowY = style.overflowY;
477
- const overflowX = style.overflowX;
478
- if (overflowY === "auto" || overflowY === "scroll" || overflowX === "auto" || overflowX === "scroll") {
479
- ancestors.push(parent);
480
- }
481
- parent = parent.parentElement;
482
- }
483
- const doc = getOwnerDocument(element);
484
- ancestors.push(doc.documentElement);
485
- return ancestors;
486
- }
487
- var ignoreFocus = false;
488
- var preventFocusTimeout = null;
489
- function preventFocus(target) {
490
- const focusableAncestor = findFocusableAncestor(target);
491
- if (!focusableAncestor) return;
492
- const document2 = getOwnerDocument(target);
493
- const activeElement = document2.activeElement;
494
- ignoreFocus = true;
495
- const onFocus = (e) => {
496
- if (ignoreFocus) {
497
- e.stopImmediatePropagation();
498
- if (activeElement && activeElement !== document2.body) {
499
- activeElement.focus();
500
- }
501
- }
502
- };
503
- const onBlur = (e) => {
504
- if (ignoreFocus) {
505
- e.stopImmediatePropagation();
506
- }
507
- };
508
- const el = focusableAncestor;
509
- el.addEventListener("focus", onFocus, true);
510
- el.addEventListener("blur", onBlur, true);
511
- el.addEventListener("focusin", onFocus, true);
512
- el.addEventListener("focusout", onBlur, true);
513
- if (preventFocusTimeout != null) {
514
- clearTimeout(preventFocusTimeout);
515
- }
516
- preventFocusTimeout = setTimeout(() => {
517
- ignoreFocus = false;
518
- el.removeEventListener("focus", onFocus, true);
519
- el.removeEventListener("blur", onBlur, true);
520
- el.removeEventListener("focusin", onFocus, true);
521
- el.removeEventListener("focusout", onBlur, true);
522
- preventFocusTimeout = null;
523
- }, 0);
524
- }
525
- function findFocusableAncestor(element) {
526
- let current = element;
527
- while (current) {
528
- if (current.hasAttribute("tabindex") || ["INPUT", "BUTTON", "SELECT", "TEXTAREA", "A"].includes(current.tagName)) {
529
- return current;
530
- }
531
- current = current.parentElement;
532
- }
533
- return element;
534
- }
535
- var focusSafely = focusWithoutScrolling;
536
-
537
- // src/utils/globalListeners.ts
538
- import { onCleanup } from "solid-js";
539
- function createGlobalListeners() {
540
- const listeners = [];
541
- function addGlobalListener(type, handler, options) {
542
- const target = options?.isWindow ? window : document;
543
- const listenerOptions = options ? {
544
- capture: options.capture,
545
- passive: options.passive,
546
- once: options.once
547
- } : void 0;
548
- target.addEventListener(type, handler, listenerOptions);
549
- listeners.push({ target, type, handler, options: listenerOptions });
550
- }
551
- function removeGlobalListener(type, handler, options) {
552
- const target = options?.isWindow ? window : document;
553
- const listenerOptions = options ? {
554
- capture: options.capture
555
- } : void 0;
556
- target.removeEventListener(type, handler, listenerOptions);
557
- const index = listeners.findIndex(
558
- (l) => l.target === target && l.type === type && l.handler === handler && l.options?.capture === listenerOptions?.capture
559
- );
560
- if (index !== -1) {
561
- listeners.splice(index, 1);
562
- }
563
- }
564
- function removeAllGlobalListeners() {
565
- for (const { target, type, handler, options } of listeners) {
566
- target.removeEventListener(type, handler, options);
567
- }
568
- listeners.length = 0;
569
- }
570
- onCleanup(removeAllGlobalListeners);
571
- return {
572
- addGlobalListener,
573
- removeGlobalListener,
574
- removeAllGlobalListeners
575
- };
576
- }
577
-
578
- // src/interactions/createPress.ts
579
- function isDisabledValue(isDisabled) {
580
- if (typeof isDisabled === "function") {
581
- return isDisabled();
582
- }
583
- return isDisabled ?? false;
584
- }
585
- function isPressedValue(isPressed) {
586
- if (typeof isPressed === "function") {
587
- return isPressed();
588
- }
589
- return isPressed ?? false;
590
- }
591
- var LINK_CLICKED = Symbol("linkClicked");
592
- var pressableCSSInjected = false;
593
- function injectPressableCSS() {
594
- if (pressableCSSInjected || typeof document === "undefined") return;
595
- const style = document.createElement("style");
596
- style.id = "solidaria-pressable-style";
597
- style.textContent = `
598
- [data-solidaria-pressable] {
599
- touch-action: pan-x pan-y pinch-zoom;
600
- }
601
- `;
602
- document.head.appendChild(style);
603
- pressableCSSInjected = true;
604
- }
605
- function createPress(props = {}) {
606
- const [internalIsPressed, setInternalIsPressed] = createSignal(false);
607
- const isPressed = () => {
608
- const controlledPressed = isPressedValue(props.isPressed);
609
- if (controlledPressed) {
610
- return controlledPressed;
611
- }
612
- return internalIsPressed();
613
- };
614
- let pressState = {
615
- isPressed: false,
616
- ignoreEmulatedMouseEvents: false,
617
- ignoreClickAfterPress: false,
618
- didFirePressStart: false,
619
- isTriggeringEvent: false,
620
- activePointerId: null,
621
- target: null,
622
- isOverTarget: false,
623
- pointerType: null,
624
- userSelect: void 0,
625
- metaKeyEvents: null,
626
- clickCleanup: null
627
- };
628
- const { addGlobalListener, removeAllGlobalListeners } = createGlobalListeners();
629
- injectPressableCSS();
630
- const triggerPressStart = (originalEvent, pointerType) => {
631
- if (isDisabledValue(props.isDisabled) || pressState.didFirePressStart) {
632
- return false;
633
- }
634
- let shouldStopPropagation = true;
635
- pressState.isTriggeringEvent = true;
636
- if (props.onPressStart) {
637
- const event = createPressEvent("pressstart", pointerType, originalEvent, pressState.target);
638
- props.onPressStart(event);
639
- shouldStopPropagation = event.shouldStopPropagation;
640
- }
641
- if (props.onPressChange) {
642
- props.onPressChange(true);
643
- }
644
- pressState.isTriggeringEvent = false;
645
- pressState.didFirePressStart = true;
646
- setInternalIsPressed(true);
647
- return shouldStopPropagation;
648
- };
649
- const triggerPressEnd = (originalEvent, pointerType, wasPressed = true) => {
650
- if (!pressState.didFirePressStart) {
651
- return;
652
- }
653
- pressState.ignoreClickAfterPress = true;
654
- pressState.didFirePressStart = false;
655
- pressState.isTriggeringEvent = true;
656
- if (props.onPressEnd) {
657
- const event = createPressEvent("pressend", pointerType, originalEvent, pressState.target);
658
- props.onPressEnd(event);
659
- }
660
- if (props.onPressChange) {
661
- props.onPressChange(false);
662
- }
663
- setInternalIsPressed(false);
664
- if (wasPressed && !isDisabledValue(props.isDisabled)) {
665
- if (props.onPress) {
666
- const event = createPressEvent("press", pointerType, originalEvent, pressState.target);
667
- props.onPress(event);
668
- }
669
- }
670
- pressState.isTriggeringEvent = false;
671
- };
672
- const triggerPressUp = (originalEvent, pointerType) => {
673
- if (isDisabledValue(props.isDisabled)) {
674
- return;
675
- }
676
- if (props.onPressUp) {
677
- pressState.isTriggeringEvent = true;
678
- const event = createPressEvent("pressup", pointerType, originalEvent, pressState.target);
679
- props.onPressUp(event);
680
- pressState.isTriggeringEvent = false;
681
- }
682
- };
683
- const cancel = (originalEvent) => {
684
- if (!pressState.isPressed) {
685
- return;
686
- }
687
- if (pressState.isOverTarget && pressState.target) {
688
- triggerPressEnd(originalEvent, pressState.pointerType ?? "mouse", false);
689
- }
690
- pressState.isPressed = false;
691
- pressState.isOverTarget = false;
692
- pressState.activePointerId = null;
693
- pressState.pointerType = null;
694
- removeAllGlobalListeners();
695
- if (pressState.clickCleanup) {
696
- pressState.clickCleanup();
697
- pressState.clickCleanup = null;
698
- }
699
- if (!props.allowTextSelectionOnPress) {
700
- restoreTextSelection(pressState.target);
701
- }
702
- };
703
- const onPointerDown = (e) => {
704
- if (e.button !== 0 || !nodeContains(e.currentTarget, getEventTarget(e))) {
705
- return;
706
- }
707
- if (isVirtualPointerEvent(e)) {
708
- pressState.pointerType = "virtual";
709
- return;
710
- }
711
- pressState.pointerType = e.pointerType;
712
- if (!pressState.isPressed) {
713
- pressState.isPressed = true;
714
- pressState.isOverTarget = true;
715
- pressState.activePointerId = e.pointerId;
716
- pressState.target = e.currentTarget;
717
- if (!props.allowTextSelectionOnPress) {
718
- disableTextSelection(pressState.target);
719
- }
720
- const shouldStopPropagation = triggerPressStart(e, pressState.pointerType);
721
- if (shouldStopPropagation) {
722
- e.stopPropagation();
723
- }
724
- addGlobalListener("pointerup", onPointerUp);
725
- addGlobalListener("pointercancel", onPointerCancel);
726
- }
727
- };
728
- const onMouseDownPointer = (e) => {
729
- if (!nodeContains(e.currentTarget, getEventTarget(e))) {
730
- return;
731
- }
732
- if (e.button === 0) {
733
- if (props.preventFocusOnPress) {
734
- preventFocus(e.currentTarget);
735
- }
736
- e.stopPropagation();
737
- }
738
- };
739
- const onPointerUp = (e) => {
740
- if (e.pointerId !== pressState.activePointerId || !pressState.isPressed || e.button !== 0 || !pressState.target) {
741
- return;
742
- }
743
- const isOverTarget = nodeContains(pressState.target, getEventTarget(e));
744
- if (isOverTarget && pressState.pointerType != null && pressState.pointerType !== "virtual") {
745
- let clickFired = false;
746
- const timeout = setTimeout(() => {
747
- if (typeof HTMLElement === "undefined") {
748
- return;
749
- }
750
- if (pressState.isPressed && pressState.target instanceof HTMLElement) {
751
- if (clickFired) {
752
- cancel(e);
753
- } else {
754
- pressState.target.focus();
755
- pressState.target.click();
756
- }
757
- }
758
- }, 80);
759
- const doc = pressState.target.ownerDocument ?? document;
760
- const clickListener = () => {
761
- clickFired = true;
762
- };
763
- doc.addEventListener("click", clickListener, true);
764
- pressState.clickCleanup = () => {
765
- clearTimeout(timeout);
766
- doc.removeEventListener("click", clickListener, true);
767
- };
768
- pressState.isOverTarget = false;
769
- } else {
770
- cancel(e);
771
- }
772
- };
773
- const onPointerCancel = (e) => {
774
- if (e.pointerId === pressState.activePointerId) {
775
- cancel(e);
776
- }
777
- };
778
- const onPointerEnter = (e) => {
779
- if (e.pointerId === pressState.activePointerId && pressState.target && !pressState.isOverTarget && pressState.pointerType != null) {
780
- pressState.isOverTarget = true;
781
- triggerPressStart(e, pressState.pointerType);
782
- }
783
- };
784
- const onPointerLeave = (e) => {
785
- if (e.pointerId === pressState.activePointerId && pressState.target && pressState.isOverTarget && pressState.pointerType != null) {
786
- pressState.isOverTarget = false;
787
- triggerPressEnd(e, pressState.pointerType, false);
788
- if (props.shouldCancelOnPointerExit) {
789
- cancel(e);
790
- }
791
- }
792
- };
793
- const onTouchStart = (e) => {
794
- if (isDisabledValue(props.isDisabled)) {
795
- return;
796
- }
797
- if (pressState.isPressed) {
798
- return;
799
- }
800
- const touch = getTouchFromEvent(e);
801
- if (!touch) {
802
- return;
803
- }
804
- pressState.activePointerId = touch.identifier;
805
- pressState.ignoreEmulatedMouseEvents = true;
806
- pressState.isOverTarget = true;
807
- pressState.isPressed = true;
808
- pressState.target = e.currentTarget;
809
- pressState.pointerType = "touch";
810
- if (!props.allowTextSelectionOnPress) {
811
- disableTextSelection(pressState.target);
812
- }
813
- const shouldStopPropagation = triggerPressStart(e, "touch");
814
- if (shouldStopPropagation) {
815
- e.stopPropagation();
816
- }
817
- addGlobalListener("scroll", onScroll, { capture: true, isWindow: true });
818
- };
819
- const onTouchMove = (e) => {
820
- if (!pressState.isPressed) {
821
- return;
822
- }
823
- const touch = getTouchById(e, pressState.activePointerId);
824
- if (!touch) {
825
- return;
826
- }
827
- const target = pressState.target;
828
- const isOverTarget = isPointOverTarget(touch, target);
829
- if (isOverTarget !== pressState.isOverTarget) {
830
- pressState.isOverTarget = isOverTarget;
831
- if (isOverTarget) {
832
- triggerPressStart(e, "touch");
833
- } else {
834
- triggerPressEnd(e, "touch", false);
835
- if (props.shouldCancelOnPointerExit) {
836
- cancel(e);
837
- }
838
- }
839
- }
840
- };
841
- const onTouchEnd = (e) => {
842
- if (!pressState.isPressed) {
843
- return;
844
- }
845
- const touch = getTouchById(e, pressState.activePointerId);
846
- if (!touch) {
847
- return;
848
- }
849
- const target = pressState.target;
850
- const isOverTarget = isPointOverTarget(touch, target);
851
- if (isOverTarget) {
852
- triggerPressUp(e, "touch");
853
- }
854
- triggerPressEnd(e, "touch", isOverTarget && pressState.isOverTarget);
855
- pressState.isPressed = false;
856
- pressState.isOverTarget = false;
857
- pressState.activePointerId = null;
858
- pressState.pointerType = null;
859
- removeAllGlobalListeners();
860
- if (!props.allowTextSelectionOnPress) {
861
- restoreTextSelection(target);
862
- }
863
- };
864
- const onTouchCancel = (e) => {
865
- cancel(e);
866
- };
867
- const onScroll = (e) => {
868
- if (pressState.isPressed && nodeContains(e.target, pressState.target)) {
869
- cancel(e);
870
- }
871
- };
872
- const onMouseDownFallback = (e) => {
873
- if (e.button !== 0) {
874
- return;
875
- }
876
- if (pressState.ignoreEmulatedMouseEvents) {
877
- e.stopPropagation();
878
- return;
879
- }
880
- pressState.isPressed = true;
881
- pressState.isOverTarget = true;
882
- pressState.target = e.currentTarget;
883
- pressState.pointerType = isVirtualClick(e) ? "virtual" : "mouse";
884
- const shouldStopPropagation = triggerPressStart(e, pressState.pointerType);
885
- if (shouldStopPropagation) {
886
- e.stopPropagation();
887
- }
888
- addGlobalListener("mouseup", onMouseUpFallback);
889
- };
890
- const onMouseUpFallback = (e) => {
891
- if (e.button !== 0) {
892
- return;
893
- }
894
- if (!pressState.ignoreEmulatedMouseEvents && e.button === 0 && !pressState.isPressed) {
895
- triggerPressUp(e, pressState.pointerType || "mouse");
896
- }
897
- };
898
- const onMouseEnterFallback = (e) => {
899
- if (!pressState.isPressed || pressState.ignoreEmulatedMouseEvents) {
900
- return;
901
- }
902
- if (pressState.isPressed && !pressState.ignoreEmulatedMouseEvents && pressState.pointerType != null) {
903
- pressState.isOverTarget = true;
904
- triggerPressStart(e, pressState.pointerType);
905
- }
906
- };
907
- const onMouseLeaveFallback = (e) => {
908
- if (!pressState.isPressed || pressState.ignoreEmulatedMouseEvents) {
909
- return;
910
- }
911
- if (pressState.isPressed && !pressState.ignoreEmulatedMouseEvents && pressState.pointerType != null) {
912
- pressState.isOverTarget = false;
913
- triggerPressEnd(e, pressState.pointerType, false);
914
- if (props.shouldCancelOnPointerExit) {
915
- cancel(e);
916
- }
917
- }
918
- };
919
- const onKeyDown = (e) => {
920
- if (isDisabledValue(props.isDisabled)) {
921
- return;
922
- }
923
- if (!isValidKeyboardEvent(e, e.currentTarget)) {
924
- if (e.key === "Enter") {
925
- e.stopPropagation();
926
- }
927
- return;
928
- }
929
- if (e.repeat) {
930
- e.preventDefault();
931
- return;
932
- }
933
- pressState.target = e.currentTarget;
934
- pressState.isPressed = true;
935
- pressState.isOverTarget = true;
936
- pressState.pointerType = "keyboard";
937
- const shouldStopPropagation = triggerPressStart(e, "keyboard");
938
- if (shouldStopPropagation) {
939
- e.stopPropagation();
940
- }
941
- if (shouldPreventDefaultKeyboard(e.currentTarget, e.key)) {
942
- e.preventDefault();
943
- }
944
- if (isMac() && e.metaKey && !e.ctrlKey && !e.altKey) {
945
- pressState.metaKeyEvents = pressState.metaKeyEvents || /* @__PURE__ */ new Map();
946
- pressState.metaKeyEvents.set(e.key, e);
947
- }
948
- if (e.key === "Enter") {
949
- pressState.ignoreClickAfterPress = true;
950
- }
951
- addGlobalListener("keyup", onKeyUp, { capture: true });
952
- };
953
- const onKeyUp = (e) => {
954
- if (!pressState.isPressed || pressState.pointerType !== "keyboard") {
955
- return;
956
- }
957
- if (!isValidKeyboardEvent(e, pressState.target)) {
958
- return;
959
- }
960
- if (isMac() && e.key === "Meta" && pressState.metaKeyEvents?.size) {
961
- for (const [key, event] of pressState.metaKeyEvents) {
962
- pressState.target?.dispatchEvent(
963
- new KeyboardEvent("keyup", {
964
- key,
965
- code: event.code,
966
- bubbles: true,
967
- cancelable: true
968
- })
969
- );
970
- }
971
- pressState.metaKeyEvents.clear();
972
- return;
973
- }
974
- const target = pressState.target;
975
- triggerPressUp(e, "keyboard");
976
- triggerPressEnd(e, "keyboard", pressState.isOverTarget);
977
- pressState.isPressed = false;
978
- pressState.pointerType = null;
979
- removeAllGlobalListeners();
980
- e.preventDefault();
981
- if (e.key === " " && isHTMLAnchorLink(target) && !target[LINK_CLICKED]) {
982
- target[LINK_CLICKED] = true;
983
- openLink(target, e);
984
- setTimeout(() => {
985
- delete target[LINK_CLICKED];
986
- }, 0);
987
- }
988
- if (e.key === " ") {
989
- pressState.ignoreClickAfterPress = true;
990
- }
991
- };
992
- const onClick = (e) => {
993
- if (!nodeContains(e.currentTarget, e.target)) {
994
- return;
995
- }
996
- if (e.button === 0 && !pressState.isTriggeringEvent) {
997
- if (isDisabledValue(props.isDisabled)) {
998
- e.preventDefault();
999
- return;
1000
- }
1001
- if (!pressState.ignoreEmulatedMouseEvents && !pressState.isPressed && (pressState.pointerType === "virtual" || isVirtualClick(e))) {
1002
- pressState.target = e.currentTarget;
1003
- triggerPressStart(e, "virtual");
1004
- triggerPressUp(e, "virtual");
1005
- triggerPressEnd(e, "virtual", true);
1006
- } else if (pressState.isPressed && pressState.pointerType !== "keyboard") {
1007
- const pointerType = pressState.pointerType || e.pointerType || "virtual";
1008
- triggerPressUp(e, pointerType);
1009
- triggerPressEnd(e, pointerType, true);
1010
- pressState.isOverTarget = false;
1011
- cancel(e);
1012
- }
1013
- pressState.ignoreEmulatedMouseEvents = false;
1014
- }
1015
- };
1016
- const onDragStart = (e) => {
1017
- if (pressState.isPressed) {
1018
- cancel(e);
1019
- }
1020
- };
1021
- const pressProps = typeof PointerEvent !== "undefined" ? {
1022
- // Keyboard events
1023
- onKeyDown,
1024
- onKeyUp,
1025
- onClick,
1026
- onDragStart,
1027
- // Pointer events (preferred when available)
1028
- onPointerDown,
1029
- onPointerEnter,
1030
- onPointerLeave,
1031
- // Mouse down only for focus prevention when using pointer events
1032
- onMouseDown: onMouseDownPointer,
1033
- // Touch events (always included for ignoreEmulatedMouseEvents handling)
1034
- onTouchStart,
1035
- onTouchMove,
1036
- onTouchEnd,
1037
- onTouchCancel,
1038
- // Attribute for CSS touch-action
1039
- "data-solidaria-pressable": ""
1040
- } : {
1041
- // Keyboard events
1042
- onKeyDown,
1043
- onKeyUp,
1044
- onClick,
1045
- onDragStart,
1046
- // Mouse events (fallback when PointerEvent not available)
1047
- onMouseDown: onMouseDownFallback,
1048
- onMouseEnter: onMouseEnterFallback,
1049
- onMouseLeave: onMouseLeaveFallback,
1050
- // Touch events (always included)
1051
- onTouchStart,
1052
- onTouchMove,
1053
- onTouchEnd,
1054
- onTouchCancel,
1055
- // Attribute for CSS touch-action
1056
- "data-solidaria-pressable": ""
1057
- };
1058
- onCleanup2(() => {
1059
- removeAllGlobalListeners();
1060
- if (pressState.clickCleanup) {
1061
- pressState.clickCleanup();
1062
- pressState.clickCleanup = null;
1063
- }
1064
- });
1065
- return {
1066
- isPressed,
1067
- pressProps
1068
- };
1069
- }
1070
-
1071
- // src/interactions/createFocus.ts
1072
- import { onCleanup as onCleanup3 } from "solid-js";
1073
- function createSyntheticBlurHandler(onBlur) {
1074
- let isFocused = false;
1075
- let observer = null;
1076
- return (_e, target) => {
1077
- if (target instanceof HTMLButtonElement || target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) {
1078
- isFocused = true;
1079
- const onBlurHandler = (blurEvent) => {
1080
- isFocused = false;
1081
- if (target.disabled && onBlur) {
1082
- onBlur(blurEvent);
1083
- }
1084
- if (observer) {
1085
- observer.disconnect();
1086
- observer = null;
1087
- }
1088
- };
1089
- target.addEventListener("focusout", onBlurHandler, { once: true });
1090
- observer = new MutationObserver(() => {
1091
- if (isFocused && target.disabled) {
1092
- observer?.disconnect();
1093
- const relatedTarget = target === document.activeElement ? null : document.activeElement;
1094
- target.dispatchEvent(new FocusEvent("blur", { relatedTarget }));
1095
- target.dispatchEvent(new FocusEvent("focusout", { bubbles: true, relatedTarget }));
1096
- }
1097
- });
1098
- observer.observe(target, { attributes: true, attributeFilter: ["disabled"] });
1099
- return () => {
1100
- if (observer) {
1101
- observer.disconnect();
1102
- observer = null;
1103
- }
1104
- };
1105
- }
1106
- return void 0;
1107
- };
1108
- }
1109
- function createFocus(props = {}) {
1110
- const { isDisabled, onFocus: onFocusProp, onBlur: onBlurProp, onFocusChange } = props;
1111
- let cleanupRef;
1112
- const syntheticBlurHandler = createSyntheticBlurHandler(onBlurProp);
1113
- onCleanup3(() => {
1114
- if (cleanupRef) {
1115
- cleanupRef();
1116
- }
1117
- });
1118
- const onBlur = (e) => {
1119
- if (e.target === e.currentTarget) {
1120
- if (onBlurProp) {
1121
- onBlurProp(e);
1122
- }
1123
- if (onFocusChange) {
1124
- onFocusChange(false);
1125
- }
1126
- }
1127
- };
1128
- const onFocus = (e) => {
1129
- const ownerDocument = getOwnerDocument(e.target);
1130
- const activeElement = ownerDocument?.activeElement;
1131
- if (e.target === e.currentTarget && activeElement === getEventTarget(e)) {
1132
- if (onFocusProp) {
1133
- onFocusProp(e);
1134
- }
1135
- if (onFocusChange) {
1136
- onFocusChange(true);
1137
- }
1138
- cleanupRef = syntheticBlurHandler(e, e.target);
1139
- }
1140
- };
1141
- if (isDisabled) {
1142
- return {
1143
- focusProps: {}
1144
- };
1145
- }
1146
- const hasHandlers = onFocusProp || onFocusChange || onBlurProp;
1147
- return {
1148
- focusProps: {
1149
- onFocus: hasHandlers ? onFocus : void 0,
1150
- onBlur: onBlurProp || onFocusChange ? onBlur : void 0
1151
- }
1152
- };
1153
- }
1154
-
1155
- // src/interactions/createFocusWithin.ts
1156
- import { onCleanup as onCleanup4 } from "solid-js";
1157
- function createFocusWithin(props = {}) {
1158
- const { isDisabled, onBlurWithin, onFocusWithin, onFocusWithinChange } = props;
1159
- let isFocusWithin = false;
1160
- const { addGlobalListener, removeAllGlobalListeners } = createGlobalListeners();
1161
- onCleanup4(() => {
1162
- removeAllGlobalListeners();
1163
- });
1164
- const onBlur = (e) => {
1165
- if (!e.currentTarget.contains(e.target)) {
1166
- return;
1167
- }
1168
- if (isFocusWithin && !e.currentTarget.contains(e.relatedTarget)) {
1169
- isFocusWithin = false;
1170
- removeAllGlobalListeners();
1171
- if (onBlurWithin) {
1172
- onBlurWithin(e);
1173
- }
1174
- if (onFocusWithinChange) {
1175
- onFocusWithinChange(false);
1176
- }
1177
- }
1178
- };
1179
- const onFocus = (e) => {
1180
- if (!e.currentTarget.contains(e.target)) {
1181
- return;
1182
- }
1183
- const ownerDocument = getOwnerDocument(e.target);
1184
- const activeElement = ownerDocument?.activeElement;
1185
- if (!isFocusWithin && activeElement === getEventTarget(e)) {
1186
- if (onFocusWithin) {
1187
- onFocusWithin(e);
1188
- }
1189
- if (onFocusWithinChange) {
1190
- onFocusWithinChange(true);
1191
- }
1192
- isFocusWithin = true;
1193
- const currentTarget = e.currentTarget;
1194
- addGlobalListener(
1195
- "focus",
1196
- (focusEvent) => {
1197
- if (isFocusWithin && !nodeContains(currentTarget, focusEvent.target)) {
1198
- const window2 = ownerDocument?.defaultView;
1199
- if (window2) {
1200
- const nativeEvent = new window2.FocusEvent("blur", {
1201
- relatedTarget: focusEvent.target
1202
- });
1203
- setEventTarget(nativeEvent, currentTarget);
1204
- isFocusWithin = false;
1205
- removeAllGlobalListeners();
1206
- if (onBlurWithin) {
1207
- onBlurWithin(nativeEvent);
1208
- }
1209
- if (onFocusWithinChange) {
1210
- onFocusWithinChange(false);
1211
- }
1212
- }
1213
- }
1214
- },
1215
- { capture: true }
1216
- );
1217
- }
1218
- };
1219
- if (isDisabled) {
1220
- return {
1221
- focusWithinProps: {
1222
- onFocus: void 0,
1223
- onBlur: void 0
1224
- }
1225
- };
1226
- }
1227
- return {
1228
- focusWithinProps: {
1229
- onFocus,
1230
- onBlur
1231
- }
1232
- };
1233
- }
1234
-
1235
- // src/interactions/createFocusable.ts
1236
- import { createContext, useContext, onMount } from "solid-js";
1237
-
1238
- // src/interactions/createKeyboard.ts
1239
- function createEventHandler(handler) {
1240
- if (!handler) {
1241
- return void 0;
1242
- }
1243
- return (e) => {
1244
- let shouldStopPropagation = true;
1245
- const event = Object.assign(e, {
1246
- continuePropagation() {
1247
- shouldStopPropagation = false;
1248
- }
1249
- });
1250
- handler(event);
1251
- if (shouldStopPropagation) {
1252
- e.stopPropagation();
1253
- }
1254
- };
1255
- }
1256
- function createKeyboard(props = {}) {
1257
- if (props.isDisabled) {
1258
- return {
1259
- keyboardProps: {}
1260
- };
1261
- }
1262
- return {
1263
- keyboardProps: {
1264
- onKeyDown: createEventHandler(props.onKeyDown),
1265
- onKeyUp: createEventHandler(props.onKeyUp)
1266
- }
1267
- };
1268
- }
1269
-
1270
- // src/interactions/createFocusable.ts
1271
- var FocusableContext = createContext(null);
1272
- function useFocusableContext(setRef) {
1273
- const context = useContext(FocusableContext) || {};
1274
- if (context.ref) {
1275
- const contextRef = context.ref;
1276
- const originalSetRef = setRef;
1277
- setRef = (el) => {
1278
- originalSetRef(el);
1279
- contextRef(el);
1280
- };
1281
- }
1282
- const { ref: _, ...otherProps } = context;
1283
- return otherProps;
1284
- }
1285
- function isDisabledValue2(isDisabled) {
1286
- if (typeof isDisabled === "function") {
1287
- return isDisabled();
1288
- }
1289
- return isDisabled ?? false;
1290
- }
1291
- function createFocusable(props = {}, ref) {
1292
- let elementRef = null;
1293
- let autoFocusDone = false;
1294
- const setRef = (el) => {
1295
- elementRef = el;
1296
- ref?.(el);
1297
- };
1298
- const { focusProps } = createFocus({
1299
- isDisabled: isDisabledValue2(props.isDisabled),
1300
- onFocus: props.onFocus,
1301
- onBlur: props.onBlur,
1302
- onFocusChange: props.onFocusChange
1303
- });
1304
- const { keyboardProps } = createKeyboard({
1305
- isDisabled: isDisabledValue2(props.isDisabled),
1306
- onKeyDown: props.onKeyDown,
1307
- onKeyUp: props.onKeyUp
1308
- });
1309
- const interactions = mergeProps(focusProps, keyboardProps);
1310
- const contextProps = useFocusableContext(setRef);
1311
- const interactionProps = isDisabledValue2(props.isDisabled) ? {} : contextProps;
1312
- onMount(() => {
1313
- if (props.autoFocus && elementRef && !autoFocusDone) {
1314
- focusSafely(elementRef);
1315
- autoFocusDone = true;
1316
- }
1317
- });
1318
- let tabIndex = props.excludeFromTabOrder ? -1 : 0;
1319
- if (isDisabledValue2(props.isDisabled)) {
1320
- tabIndex = void 0;
1321
- }
1322
- const focusableProps = mergeProps(
1323
- {
1324
- ...interactions,
1325
- tabIndex,
1326
- ref: setRef
1327
- },
1328
- interactionProps
1329
- );
1330
- return {
1331
- focusableProps
1332
- };
1333
- }
1334
-
1335
- // src/interactions/createFocusRing.ts
1336
- import { createSignal as createSignal2, createEffect, onCleanup as onCleanup5 } from "solid-js";
1337
- var currentModality = null;
1338
- var hasSetupGlobalListeners = false;
1339
- var changeHandlers = /* @__PURE__ */ new Set();
1340
- function triggerChangeHandlers(modality) {
1341
- currentModality = modality;
1342
- for (const handler of changeHandlers) {
1343
- handler(modality);
1344
- }
1345
- }
1346
- function handleKeyboardEvent(e) {
1347
- if (e.metaKey || e.altKey || e.ctrlKey || e.key === "Control" || e.key === "Shift" || e.key === "Meta") {
1348
- return;
1349
- }
1350
- currentModality = "keyboard";
1351
- triggerChangeHandlers("keyboard");
1352
- }
1353
- function handlePointerEvent(e) {
1354
- currentModality = "pointer";
1355
- if (e.type === "mousedown" || e.type === "pointerdown") {
1356
- triggerChangeHandlers("pointer");
1357
- }
1358
- }
1359
- function setupGlobalFocusListeners() {
1360
- if (typeof document === "undefined" || hasSetupGlobalListeners) {
1361
- return;
1362
- }
1363
- hasSetupGlobalListeners = true;
1364
- document.addEventListener("keydown", handleKeyboardEvent, true);
1365
- document.addEventListener("keyup", handleKeyboardEvent, true);
1366
- document.addEventListener("mousedown", handlePointerEvent, true);
1367
- document.addEventListener("pointerdown", handlePointerEvent, true);
1368
- }
1369
- function createFocusRing(props = {}) {
1370
- const { isTextInput = false, autoFocus = false } = props;
1371
- const [isFocused, setIsFocused] = createSignal2(false);
1372
- const [isFocusVisible, setIsFocusVisible] = createSignal2(autoFocus);
1373
- const [modality, setModality] = createSignal2(currentModality);
1374
- createEffect(() => {
1375
- setupGlobalFocusListeners();
1376
- const handler = (newModality) => {
1377
- setModality(newModality);
1378
- };
1379
- changeHandlers.add(handler);
1380
- onCleanup5(() => {
1381
- changeHandlers.delete(handler);
1382
- });
1383
- });
1384
- createEffect(() => {
1385
- const focused = isFocused();
1386
- const mod = modality();
1387
- if (focused) {
1388
- setIsFocusVisible(isTextInput || mod === "keyboard");
1389
- } else {
1390
- setIsFocusVisible(false);
1391
- }
1392
- });
1393
- const focusResult = createFocus({
1394
- onFocus: () => setIsFocused(true),
1395
- onBlur: () => setIsFocused(false)
1396
- });
1397
- return {
1398
- isFocused,
1399
- isFocusVisible,
1400
- focusProps: focusResult.focusProps
1401
- };
1402
- }
1403
-
1404
- // src/interactions/createHover.ts
1405
- import { createSignal as createSignal3, createEffect as createEffect2, onCleanup as onCleanup6, createMemo } from "solid-js";
1406
- var globalIgnoreEmulatedMouseEvents = false;
1407
- var hoverCount = 0;
1408
- function setGlobalIgnoreEmulatedMouseEvents() {
1409
- globalIgnoreEmulatedMouseEvents = true;
1410
- setTimeout(() => {
1411
- globalIgnoreEmulatedMouseEvents = false;
1412
- }, 50);
1413
- }
1414
- function handleGlobalPointerEvent(e) {
1415
- if (e.pointerType === "touch") {
1416
- setGlobalIgnoreEmulatedMouseEvents();
1417
- }
1418
- }
1419
- function setupGlobalTouchEvents() {
1420
- if (typeof document === "undefined") {
1421
- return () => {
1422
- };
1423
- }
1424
- if (hoverCount === 0) {
1425
- if (typeof PointerEvent !== "undefined") {
1426
- document.addEventListener("pointerup", handleGlobalPointerEvent);
1427
- } else if (false) {
1428
- document.addEventListener("touchend", setGlobalIgnoreEmulatedMouseEvents);
1429
- }
1430
- }
1431
- hoverCount++;
1432
- return () => {
1433
- hoverCount--;
1434
- if (hoverCount > 0) {
1435
- return;
1436
- }
1437
- if (typeof PointerEvent !== "undefined") {
1438
- document.removeEventListener("pointerup", handleGlobalPointerEvent);
1439
- } else if (false) {
1440
- document.removeEventListener("touchend", setGlobalIgnoreEmulatedMouseEvents);
1441
- }
1442
- };
1443
- }
1444
- function createHover(props = {}) {
1445
- const getProps = () => access(props);
1446
- const [isHovered, setIsHovered] = createSignal3(false);
1447
- let state2 = {
1448
- isHovered: false,
1449
- ignoreEmulatedMouseEvents: false,
1450
- pointerType: "",
1451
- target: null
1452
- };
1453
- createEffect2(() => {
1454
- const cleanup = setupGlobalTouchEvents();
1455
- onCleanup6(cleanup);
1456
- });
1457
- createEffect2(() => {
1458
- const p = getProps();
1459
- if (p.isDisabled && state2.isHovered) {
1460
- triggerHoverEnd(state2.target, state2.pointerType);
1461
- }
1462
- });
1463
- function triggerHoverStart(target, pointerType) {
1464
- const p = getProps();
1465
- state2.pointerType = pointerType;
1466
- if (p.isDisabled || state2.isHovered) {
1467
- return;
1468
- }
1469
- state2.isHovered = true;
1470
- state2.target = target;
1471
- p.onHoverStart?.({
1472
- type: "hoverstart",
1473
- target,
1474
- pointerType
1475
- });
1476
- p.onHoverChange?.(true);
1477
- setIsHovered(true);
1478
- }
1479
- function triggerHoverEnd(target, pointerType) {
1480
- const p = getProps();
1481
- state2.pointerType = "";
1482
- state2.target = null;
1483
- if (!state2.isHovered || !target) {
1484
- return;
1485
- }
1486
- state2.isHovered = false;
1487
- p.onHoverEnd?.({
1488
- type: "hoverend",
1489
- target,
1490
- pointerType
1491
- });
1492
- p.onHoverChange?.(false);
1493
- setIsHovered(false);
1494
- }
1495
- const hoverProps = createMemo(() => {
1496
- if (typeof PointerEvent !== "undefined") {
1497
- return {
1498
- onPointerEnter: (e) => {
1499
- if (globalIgnoreEmulatedMouseEvents && e.pointerType === "mouse") {
1500
- return;
1501
- }
1502
- if (e.pointerType === "touch") {
1503
- return;
1504
- }
1505
- triggerHoverStart(e.currentTarget, e.pointerType);
1506
- },
1507
- onPointerLeave: (e) => {
1508
- const p = getProps();
1509
- if (!p.isDisabled && e.currentTarget.contains(e.target)) {
1510
- triggerHoverEnd(e.currentTarget, e.pointerType);
1511
- }
1512
- }
1513
- };
1514
- }
1515
- return {
1516
- onMouseEnter: (e) => {
1517
- if (!state2.ignoreEmulatedMouseEvents && !globalIgnoreEmulatedMouseEvents) {
1518
- triggerHoverStart(e.currentTarget, "mouse");
1519
- }
1520
- state2.ignoreEmulatedMouseEvents = false;
1521
- },
1522
- onMouseLeave: (e) => {
1523
- const p = getProps();
1524
- if (!p.isDisabled && e.currentTarget.contains(e.target)) {
1525
- triggerHoverEnd(e.currentTarget, "mouse");
1526
- }
1527
- }
1528
- };
1529
- });
1530
- return {
1531
- hoverProps: hoverProps(),
1532
- isHovered
1533
- };
1534
- }
1535
-
1536
- // src/button/createButton.ts
1537
- function isDisabledValue3(isDisabled) {
1538
- if (typeof isDisabled === "function") {
1539
- return isDisabled();
1540
- }
1541
- return isDisabled ?? false;
1542
- }
1543
- function createButton(props = {}) {
1544
- const elementType = props.elementType ?? "button";
1545
- const { pressProps, isPressed } = createPress({
1546
- isDisabled: props.isDisabled,
1547
- onPress: props.onPress,
1548
- onPressStart: props.onPressStart,
1549
- onPressEnd: props.onPressEnd,
1550
- onPressUp: props.onPressUp,
1551
- onPressChange: props.onPressChange,
1552
- preventFocusOnPress: props.preventFocusOnPress
1553
- });
1554
- const { focusableProps } = createFocusable({
1555
- isDisabled: props.isDisabled,
1556
- autoFocus: props.autoFocus,
1557
- excludeFromTabOrder: props.excludeFromTabOrder
1558
- });
1559
- const isNativeButton = elementType === "button" || elementType === "input";
1560
- const isLink = elementType === "a";
1561
- const disabled = isDisabledValue3(props.isDisabled);
1562
- let additionalProps = {};
1563
- if (isNativeButton) {
1564
- additionalProps = {
1565
- type: props.type ?? "button",
1566
- disabled,
1567
- // Form-related attributes
1568
- ...props.form && { form: props.form },
1569
- ...props.formAction && { formAction: props.formAction },
1570
- ...props.formEncType && { formEncType: props.formEncType },
1571
- ...props.formMethod && { formMethod: props.formMethod },
1572
- ...props.formNoValidate && { formNoValidate: props.formNoValidate },
1573
- ...props.formTarget && { formTarget: props.formTarget },
1574
- ...props.name && { name: props.name },
1575
- ...props.value && { value: props.value }
1576
- };
1577
- } else {
1578
- additionalProps = {
1579
- role: "button",
1580
- tabIndex: disabled ? void 0 : 0,
1581
- "aria-disabled": disabled ? true : void 0
1582
- };
1583
- if (isLink) {
1584
- additionalProps.href = props.href;
1585
- additionalProps.target = props.target;
1586
- additionalProps.rel = props.rel;
1587
- }
1588
- }
1589
- const ariaProps = {};
1590
- if (props["aria-pressed"] !== void 0) {
1591
- ariaProps["aria-pressed"] = props["aria-pressed"];
1592
- }
1593
- if (props["aria-haspopup"] !== void 0) {
1594
- ariaProps["aria-haspopup"] = props["aria-haspopup"];
1595
- }
1596
- if (props["aria-expanded"] !== void 0) {
1597
- ariaProps["aria-expanded"] = props["aria-expanded"];
1598
- }
1599
- if (props["aria-label"]) {
1600
- ariaProps["aria-label"] = props["aria-label"];
1601
- }
1602
- if (props["aria-labelledby"]) {
1603
- ariaProps["aria-labelledby"] = props["aria-labelledby"];
1604
- }
1605
- if (props["aria-describedby"]) {
1606
- ariaProps["aria-describedby"] = props["aria-describedby"];
1607
- }
1608
- if (props["aria-controls"]) {
1609
- ariaProps["aria-controls"] = props["aria-controls"];
1610
- }
1611
- if (props["aria-current"] !== void 0) {
1612
- ariaProps["aria-current"] = props["aria-current"];
1613
- }
1614
- const buttonProps = mergeProps(
1615
- filterDOMProps(props, { labelable: true }),
1616
- additionalProps,
1617
- ariaProps,
1618
- focusableProps,
1619
- pressProps
1620
- );
1621
- return {
1622
- buttonProps,
1623
- isPressed
1624
- };
1625
- }
1626
-
1627
- // src/button/createToggleButton.ts
1628
- import { createSignal as createSignal4 } from "solid-js";
1629
- function getSelectedValue(isSelected) {
1630
- if (typeof isSelected === "function") {
1631
- return isSelected();
1632
- }
1633
- return isSelected ?? false;
1634
- }
1635
- function createToggleButton(props = {}) {
1636
- const isControlled = props.isSelected !== void 0;
1637
- const [uncontrolledSelected, setUncontrolledSelected] = createSignal4(
1638
- props.defaultSelected ?? false
1639
- );
1640
- const isSelected = () => {
1641
- if (isControlled) {
1642
- return getSelectedValue(props.isSelected);
1643
- }
1644
- return uncontrolledSelected();
1645
- };
1646
- const toggleSelection = () => {
1647
- const newValue = !isSelected();
1648
- if (!isControlled) {
1649
- setUncontrolledSelected(newValue);
1650
- }
1651
- props.onChange?.(newValue);
1652
- };
1653
- const onPress = (e) => {
1654
- toggleSelection();
1655
- props.onPress?.(e);
1656
- };
1657
- const { buttonProps: baseButtonProps, isPressed } = createButton(
1658
- mergeProps(props, {
1659
- onPress
1660
- })
1661
- );
1662
- const buttonProps = {
1663
- ...baseButtonProps,
1664
- get "aria-pressed"() {
1665
- return isSelected();
1666
- }
1667
- };
1668
- return {
1669
- buttonProps,
1670
- isPressed,
1671
- isSelected
1672
- };
1673
- }
1674
-
1675
- // src/checkbox/createCheckbox.ts
1676
- import { createEffect as createEffect4 } from "solid-js";
1677
-
1678
- // src/toggle/index.ts
1679
- import { createToggleState } from "@proyecto-viviana/solid-stately";
1680
-
1681
- // src/toggle/createToggle.ts
1682
- import { createEffect as createEffect3 } from "solid-js";
1683
- function createToggle(props, state2, ref) {
1684
- const getProps = () => access(props);
1685
- const isDisabled = () => getProps().isDisabled ?? false;
1686
- const isReadOnly = () => getProps().isReadOnly ?? false;
1687
- const isInvalid = () => {
1688
- return getProps().isInvalid ?? false;
1689
- };
1690
- const { pressProps, isPressed } = createPress({
1691
- get onPressStart() {
1692
- return getProps().onPressStart;
1693
- },
1694
- get onPressEnd() {
1695
- return getProps().onPressEnd;
1696
- },
1697
- get onPressChange() {
1698
- return getProps().onPressChange;
1699
- },
1700
- get onPress() {
1701
- return getProps().onPress;
1702
- },
1703
- get onPressUp() {
1704
- return getProps().onPressUp;
1705
- },
1706
- get isDisabled() {
1707
- return isDisabled();
1708
- }
1709
- });
1710
- const { pressProps: labelPressProps, isPressed: isLabelPressed } = createPress({
1711
- get onPressStart() {
1712
- return getProps().onPressStart;
1713
- },
1714
- get onPressEnd() {
1715
- return getProps().onPressEnd;
1716
- },
1717
- get onPressChange() {
1718
- return getProps().onPressChange;
1719
- },
1720
- get onPressUp() {
1721
- return getProps().onPressUp;
1722
- },
1723
- onPress(e) {
1724
- getProps().onPress?.(e);
1725
- state2.toggle();
1726
- ref()?.focus();
1727
- },
1728
- get isDisabled() {
1729
- return isDisabled() || isReadOnly();
1730
- }
1731
- });
1732
- const { focusableProps } = createFocusable({
1733
- get isDisabled() {
1734
- return isDisabled();
1735
- },
1736
- get autoFocus() {
1737
- return getProps().autoFocus;
1738
- },
1739
- get onFocus() {
1740
- return getProps().onFocus;
1741
- },
1742
- get onBlur() {
1743
- return getProps().onBlur;
1744
- },
1745
- get onFocusChange() {
1746
- return getProps().onFocusChange;
1747
- },
1748
- get onKeyDown() {
1749
- return getProps().onKeyDown;
1750
- },
1751
- get onKeyUp() {
1752
- return getProps().onKeyUp;
1753
- },
1754
- get excludeFromTabOrder() {
1755
- return getProps().excludeFromTabOrder;
1756
- }
1757
- }, ref);
1758
- const interactions = mergeProps(pressProps, focusableProps);
1759
- const domProps = () => filterDOMProps(getProps(), { labelable: true });
1760
- const onChange = (e) => {
1761
- e.stopPropagation();
1762
- if (isReadOnly()) {
1763
- e.currentTarget.checked = state2.isSelected();
1764
- return;
1765
- }
1766
- state2.setSelected(e.currentTarget.checked);
1767
- };
1768
- createEffect3(() => {
1769
- const p = getProps();
1770
- const hasChildren = p.children != null;
1771
- const hasAriaLabel = p["aria-label"] != null || p["aria-labelledby"] != null;
1772
- if (!hasChildren && !hasAriaLabel && true) {
1773
- console.warn("If you do not provide children, you must specify an aria-label for accessibility");
1774
- }
1775
- });
1776
- const combinedIsPressed = () => isPressed() || isLabelPressed();
1777
- return {
1778
- labelProps: mergeProps(labelPressProps, {
1779
- onClick: (e) => e.preventDefault()
1780
- }),
1781
- get inputProps() {
1782
- const p = getProps();
1783
- return mergeProps(domProps(), {
1784
- "aria-invalid": isInvalid() || void 0,
1785
- "aria-errormessage": p["aria-errormessage"],
1786
- "aria-controls": p["aria-controls"],
1787
- "aria-readonly": isReadOnly() || void 0,
1788
- onChange,
1789
- disabled: isDisabled(),
1790
- ...p.value == null ? {} : { value: p.value },
1791
- name: p.name,
1792
- form: p.form,
1793
- type: "checkbox",
1794
- ...interactions,
1795
- // Stop click propagation to prevent labelProps.onClick from calling preventDefault
1796
- // which would prevent the checkbox from toggling in JSDOM/testing-library environments
1797
- onClick: (e) => e.stopPropagation()
1798
- });
1799
- },
1800
- isSelected: state2.isSelected,
1801
- isPressed: combinedIsPressed,
1802
- isDisabled: isDisabled(),
1803
- isReadOnly: isReadOnly(),
1804
- isInvalid: isInvalid()
1805
- };
1806
- }
1807
-
1808
- // src/checkbox/createCheckbox.ts
1809
- function createCheckbox(props, state2, inputRef) {
1810
- const getProps = () => access(props);
1811
- const toggleResult = createToggle(props, state2, inputRef);
1812
- const {
1813
- labelProps: baseLabelProps,
1814
- isSelected,
1815
- isPressed,
1816
- isDisabled,
1817
- isReadOnly,
1818
- isInvalid
1819
- } = toggleResult;
1820
- createEffect4(() => {
1821
- const input = inputRef();
1822
- const isIndeterminate = getProps().isIndeterminate;
1823
- if (input) {
1824
- input.indeterminate = !!isIndeterminate;
1825
- }
1826
- });
1827
- const { pressProps } = createPress({
1828
- get isDisabled() {
1829
- return isDisabled || isReadOnly;
1830
- },
1831
- onPress() {
1832
- }
1833
- });
1834
- return {
1835
- labelProps: mergeProps(
1836
- baseLabelProps,
1837
- pressProps,
1838
- {
1839
- // Prevent label from being focused when mouse down on it.
1840
- // Note, this does not prevent the input from being focused in the `click` event.
1841
- onMouseDown: (e) => e.preventDefault()
1842
- }
1843
- ),
1844
- get inputProps() {
1845
- const p = getProps();
1846
- const { isRequired, validationBehavior = "aria" } = p;
1847
- return mergeProps(toggleResult.inputProps, {
1848
- checked: isSelected(),
1849
- "aria-required": isRequired && validationBehavior === "aria" || void 0,
1850
- required: isRequired && validationBehavior === "native"
1851
- });
1852
- },
1853
- isSelected,
1854
- isPressed,
1855
- isDisabled,
1856
- isReadOnly,
1857
- isInvalid
1858
- };
1859
- }
1860
-
1861
- // src/checkbox/index.ts
1862
- import { createCheckboxGroupState } from "@proyecto-viviana/solid-stately";
1863
-
1864
- // src/ssr/index.ts
1865
- import { createUniqueId } from "solid-js";
1866
- import { isServer } from "solid-js/web";
1867
- function createIsSSR() {
1868
- return isServer;
1869
- }
1870
- function createId(defaultId) {
1871
- if (defaultId) {
1872
- return defaultId;
1873
- }
1874
- return `solidaria-${createUniqueId()}`;
1875
- }
1876
- var canUseDOM = !isServer;
1877
-
1878
- // src/label/createLabels.ts
1879
- function createLabels(props, defaultLabel) {
1880
- let {
1881
- id,
1882
- "aria-label": label,
1883
- "aria-labelledby": labelledBy
1884
- } = props;
1885
- id = createId(id);
1886
- if (labelledBy && label) {
1887
- const ids = /* @__PURE__ */ new Set([id, ...labelledBy.trim().split(/\s+/)]);
1888
- labelledBy = [...ids].join(" ");
1889
- } else if (labelledBy) {
1890
- labelledBy = labelledBy.trim().split(/\s+/).join(" ");
1891
- }
1892
- if (!label && !labelledBy && defaultLabel) {
1893
- label = defaultLabel;
1894
- }
1895
- return {
1896
- id,
1897
- "aria-label": label,
1898
- "aria-labelledby": labelledBy
1899
- };
1900
- }
1901
-
1902
- // src/label/createLabel.ts
1903
- function createLabel(props) {
1904
- const getProps = () => access(props);
1905
- const id = createId(getProps().id);
1906
- const labelId = createId();
1907
- const getLabelProps = () => {
1908
- const { label, labelElementType = "label" } = getProps();
1909
- if (!label) {
1910
- return {};
1911
- }
1912
- return {
1913
- id: labelId,
1914
- ...labelElementType === "label" ? { for: id } : {}
1915
- };
1916
- };
1917
- const getFieldProps = () => {
1918
- const {
1919
- label,
1920
- "aria-labelledby": ariaLabelledby,
1921
- "aria-label": ariaLabel
1922
- } = getProps();
1923
- let labelledBy = ariaLabelledby;
1924
- if (label) {
1925
- labelledBy = ariaLabelledby ? `${labelId} ${ariaLabelledby}` : labelId;
1926
- } else if (!ariaLabelledby && !ariaLabel && true) {
1927
- console.warn(
1928
- "If you do not provide a visible label, you must specify an aria-label or aria-labelledby attribute for accessibility"
1929
- );
1930
- }
1931
- return createLabels({
1932
- id,
1933
- "aria-label": ariaLabel,
1934
- "aria-labelledby": labelledBy
1935
- });
1936
- };
1937
- return {
1938
- get labelProps() {
1939
- return getLabelProps();
1940
- },
1941
- get fieldProps() {
1942
- return getFieldProps();
1943
- }
1944
- };
1945
- }
1946
-
1947
- // src/label/createField.ts
1948
- function createField(props) {
1949
- const getProps = () => access(props);
1950
- const { labelProps, fieldProps: baseLabelFieldProps } = createLabel(props);
1951
- const descriptionId = createId();
1952
- const errorMessageId = createId();
1953
- const getDescriptionProps = () => {
1954
- const { description, errorMessage, isInvalid } = getProps();
1955
- if (!description && !errorMessage && !isInvalid) {
1956
- return {};
1957
- }
1958
- return {
1959
- id: descriptionId
1960
- };
1961
- };
1962
- const getErrorMessageProps = () => {
1963
- const { errorMessage, isInvalid } = getProps();
1964
- if (!errorMessage && !isInvalid) {
1965
- return {};
1966
- }
1967
- return {
1968
- id: errorMessageId
1969
- };
1970
- };
1971
- const getFieldProps = () => {
1972
- const { description, errorMessage, isInvalid } = getProps();
1973
- const describedByIds = [];
1974
- if (description) {
1975
- describedByIds.push(descriptionId);
1976
- }
1977
- if (isInvalid && errorMessage) {
1978
- describedByIds.push(errorMessageId);
1979
- }
1980
- const existingDescribedBy = getProps()["aria-describedby"];
1981
- if (existingDescribedBy) {
1982
- describedByIds.push(existingDescribedBy);
1983
- }
1984
- const ariaDescribedBy = describedByIds.length > 0 ? describedByIds.join(" ") : void 0;
1985
- return mergeProps(baseLabelFieldProps, {
1986
- "aria-describedby": ariaDescribedBy
1987
- });
1988
- };
1989
- return {
1990
- get labelProps() {
1991
- return labelProps;
1992
- },
1993
- get fieldProps() {
1994
- return getFieldProps();
1995
- },
1996
- get descriptionProps() {
1997
- return getDescriptionProps();
1998
- },
1999
- get errorMessageProps() {
2000
- return getErrorMessageProps();
2001
- }
2002
- };
2003
- }
2004
-
2005
- // src/checkbox/createCheckboxGroup.ts
2006
- var checkboxGroupData = /* @__PURE__ */ new WeakMap();
2007
- function createCheckboxGroup(props, state2) {
2008
- const getProps = () => access(props);
2009
- const isInvalid = () => state2.isInvalid;
2010
- const { labelProps, fieldProps, descriptionProps, errorMessageProps } = createField({
2011
- get label() {
2012
- return getProps().label;
2013
- },
2014
- get "aria-label"() {
2015
- return getProps()["aria-label"];
2016
- },
2017
- get "aria-labelledby"() {
2018
- return getProps()["aria-labelledby"];
2019
- },
2020
- get "aria-describedby"() {
2021
- return getProps()["aria-describedby"];
2022
- },
2023
- get "aria-details"() {
2024
- return getProps()["aria-details"];
2025
- },
2026
- get description() {
2027
- return getProps().description;
2028
- },
2029
- get errorMessage() {
2030
- return getProps().errorMessage ?? (isInvalid() ? "Invalid selection" : void 0);
2031
- },
2032
- get isInvalid() {
2033
- return isInvalid();
2034
- },
2035
- // Checkbox group is not an HTML input element so it
2036
- // shouldn't be labeled by a <label> element.
2037
- labelElementType: "span"
2038
- });
2039
- checkboxGroupData.set(state2, {
2040
- name: getProps().name,
2041
- form: getProps().form,
2042
- descriptionId: descriptionProps.id,
2043
- errorMessageId: errorMessageProps.id,
2044
- validationBehavior: "aria"
2045
- });
2046
- const domProps = () => filterDOMProps(getProps(), { labelable: true });
2047
- const { focusWithinProps } = createFocusWithin({
2048
- get onBlurWithin() {
2049
- return getProps().onBlur;
2050
- },
2051
- get onFocusWithin() {
2052
- return getProps().onFocus;
2053
- },
2054
- get onFocusWithinChange() {
2055
- return getProps().onFocusChange;
2056
- }
2057
- });
2058
- return {
2059
- get groupProps() {
2060
- return mergeProps(domProps(), {
2061
- role: "group",
2062
- "aria-disabled": state2.isDisabled || void 0,
2063
- ...fieldProps,
2064
- ...focusWithinProps
2065
- });
2066
- },
2067
- get labelProps() {
2068
- return labelProps;
2069
- },
2070
- get descriptionProps() {
2071
- return descriptionProps;
2072
- },
2073
- get errorMessageProps() {
2074
- return errorMessageProps;
2075
- },
2076
- get isInvalid() {
2077
- return isInvalid();
2078
- }
2079
- };
2080
- }
2081
-
2082
- // src/checkbox/createCheckboxGroupItem.ts
2083
- function createCheckboxGroupItem(props, state2, inputRef) {
2084
- const getProps = () => access(props);
2085
- const toggleState = {
2086
- isSelected: () => state2.isSelected(getProps().value),
2087
- defaultSelected: state2.defaultValue.includes(getProps().value),
2088
- setSelected(isSelected) {
2089
- const value = getProps().value;
2090
- if (isSelected) {
2091
- state2.addValue(value);
2092
- } else {
2093
- state2.removeValue(value);
2094
- }
2095
- getProps().onChange?.(isSelected);
2096
- },
2097
- toggle() {
2098
- state2.toggleValue(getProps().value);
2099
- }
2100
- };
2101
- const getGroupData = () => checkboxGroupData.get(state2);
2102
- const checkboxProps = () => {
2103
- const p = getProps();
2104
- const groupData = getGroupData();
2105
- return {
2106
- ...p,
2107
- isReadOnly: p.isReadOnly ?? state2.isReadOnly,
2108
- isDisabled: p.isDisabled ?? state2.isDisabled,
2109
- name: p.name ?? groupData?.name,
2110
- form: p.form ?? groupData?.form,
2111
- isRequired: p.isRequired ?? state2.isRequired(),
2112
- validationBehavior: p.validationBehavior ?? groupData?.validationBehavior ?? "aria"
2113
- };
2114
- };
2115
- const result = createCheckbox(checkboxProps, toggleState, inputRef);
2116
- return {
2117
- ...result,
2118
- get inputProps() {
2119
- const baseInputProps = result.inputProps;
2120
- const groupData = getGroupData();
2121
- const describedByIds = [];
2122
- const propsDescribedBy = getProps()["aria-describedby"];
2123
- if (propsDescribedBy) {
2124
- describedByIds.push(propsDescribedBy);
2125
- }
2126
- if (state2.isInvalid && groupData?.errorMessageId) {
2127
- describedByIds.push(groupData.errorMessageId);
2128
- }
2129
- if (groupData?.descriptionId) {
2130
- describedByIds.push(groupData.descriptionId);
2131
- }
2132
- const ariaDescribedBy = describedByIds.length > 0 ? describedByIds.join(" ") : void 0;
2133
- return {
2134
- ...baseInputProps,
2135
- "aria-describedby": ariaDescribedBy
2136
- };
2137
- }
2138
- };
2139
- }
2140
-
2141
- // src/radio/index.ts
2142
- import {
2143
- createRadioGroupState,
2144
- radioGroupSyncVersion as radioGroupSyncVersion2
2145
- } from "@proyecto-viviana/solid-stately";
2146
-
2147
- // src/radio/createRadioGroup.ts
2148
- var radioGroupData = /* @__PURE__ */ new WeakMap();
2149
- function createRadioGroup(props, state2) {
2150
- const getProps = () => access(props);
2151
- const orientation = () => getProps().orientation ?? "vertical";
2152
- const isReadOnly = () => getProps().isReadOnly ?? false;
2153
- const isRequired = () => getProps().isRequired ?? false;
2154
- const isDisabled = () => getProps().isDisabled ?? false;
2155
- const validationBehavior = () => getProps().validationBehavior ?? "aria";
2156
- const { labelProps, fieldProps, descriptionProps, errorMessageProps } = createField({
2157
- get label() {
2158
- return getProps().label;
2159
- },
2160
- get description() {
2161
- return getProps().description;
2162
- },
2163
- get errorMessage() {
2164
- return getProps().errorMessage;
2165
- },
2166
- get isInvalid() {
2167
- return state2.isInvalid;
2168
- },
2169
- // Radio group is not an HTML input element so it
2170
- // shouldn't be labeled by a <label> element.
2171
- labelElementType: "span"
2172
- });
2173
- const { focusWithinProps } = createFocusWithin({
2174
- onBlurWithin(e) {
2175
- getProps().onBlur?.(e);
2176
- if (!state2.selectedValue()) {
2177
- state2.setLastFocusedValue(null);
2178
- }
2179
- },
2180
- onFocusWithin: (e) => getProps().onFocus?.(e),
2181
- onFocusWithinChange: (isFocused) => getProps().onFocusChange?.(isFocused)
2182
- });
2183
- const domProps = () => filterDOMProps(getProps(), { labelable: true });
2184
- const groupName = getProps().name ?? createId();
2185
- radioGroupData.set(state2, {
2186
- name: groupName,
2187
- form: getProps().form,
2188
- descriptionId: descriptionProps.id,
2189
- errorMessageId: errorMessageProps.id,
2190
- validationBehavior: validationBehavior()
2191
- });
2192
- const onKeyDown = (_e) => {
2193
- };
2194
- return {
2195
- get radioGroupProps() {
2196
- return mergeProps(
2197
- domProps(),
2198
- focusWithinProps,
2199
- {
2200
- role: "radiogroup",
2201
- onKeyDown,
2202
- "aria-invalid": state2.isInvalid || void 0,
2203
- "aria-errormessage": getProps()["aria-errormessage"],
2204
- "aria-readonly": isReadOnly() || void 0,
2205
- "aria-required": isRequired() || void 0,
2206
- "aria-disabled": isDisabled() || void 0,
2207
- "aria-orientation": orientation(),
2208
- ...fieldProps
2209
- }
2210
- );
2211
- },
2212
- labelProps,
2213
- descriptionProps,
2214
- errorMessageProps,
2215
- get isInvalid() {
2216
- return state2.isInvalid;
2217
- },
2218
- get validationErrors() {
2219
- return [];
2220
- },
2221
- get validationDetails() {
2222
- return {};
2223
- }
2224
- };
2225
- }
2226
-
2227
- // src/radio/createRadio.ts
2228
- import { createEffect as createEffect5 } from "solid-js";
2229
- import { radioGroupSyncVersion } from "@proyecto-viviana/solid-stately";
2230
- function createRadio(props, state2, ref) {
2231
- const getProps = () => access(props);
2232
- const isDisabled = () => getProps().isDisabled || state2.isDisabled;
2233
- const value = () => getProps().value;
2234
- const isSelected = () => {
2235
- const selected = state2.selectedValue();
2236
- const v = value();
2237
- return selected === v;
2238
- };
2239
- createEffect5(() => {
2240
- const p = getProps();
2241
- const hasChildren = p.children != null;
2242
- const hasAriaLabel = p["aria-label"] != null || p["aria-labelledby"] != null;
2243
- if (!hasChildren && !hasAriaLabel && true) {
2244
- console.warn("If you do not provide children, you must specify an aria-label for accessibility");
2245
- }
2246
- });
2247
- createEffect5(() => {
2248
- const inputEl = ref();
2249
- if (!inputEl) return;
2250
- const syncVersion = radioGroupSyncVersion.get(state2);
2251
- syncVersion?.();
2252
- const shouldBeChecked = isSelected();
2253
- if (inputEl.checked !== shouldBeChecked) {
2254
- inputEl.checked = shouldBeChecked;
2255
- }
2256
- });
2257
- const onChange = (e) => {
2258
- e.stopPropagation();
2259
- const target = e.target;
2260
- if (isDisabled()) {
2261
- target.checked = isSelected();
2262
- return;
2263
- }
2264
- state2.setSelectedValue(value());
2265
- target.focus();
2266
- target.checked = isSelected();
2267
- };
2268
- const { pressProps, isPressed } = createPress({
2269
- get onPressStart() {
2270
- return getProps().onPressStart;
2271
- },
2272
- get onPressEnd() {
2273
- return getProps().onPressEnd;
2274
- },
2275
- get onPressChange() {
2276
- return getProps().onPressChange;
2277
- },
2278
- get onPress() {
2279
- return getProps().onPress;
2280
- },
2281
- get onPressUp() {
2282
- return getProps().onPressUp;
2283
- },
2284
- get isDisabled() {
2285
- return isDisabled();
2286
- }
2287
- });
2288
- const { pressProps: labelPressProps, isPressed: isLabelPressed } = createPress({
2289
- get onPressStart() {
2290
- return getProps().onPressStart;
2291
- },
2292
- get onPressEnd() {
2293
- return getProps().onPressEnd;
2294
- },
2295
- get onPressChange() {
2296
- return getProps().onPressChange;
2297
- },
2298
- get onPressUp() {
2299
- return getProps().onPressUp;
2300
- },
2301
- onPress(e) {
2302
- getProps().onPress?.(e);
2303
- state2.setSelectedValue(value());
2304
- ref()?.focus();
2305
- },
2306
- get isDisabled() {
2307
- return isDisabled();
2308
- }
2309
- });
2310
- const { focusableProps } = createFocusable({
2311
- get isDisabled() {
2312
- return isDisabled();
2313
- },
2314
- get autoFocus() {
2315
- return getProps().autoFocus;
2316
- },
2317
- onFocus(e) {
2318
- getProps().onFocus?.(e);
2319
- state2.setLastFocusedValue(value());
2320
- },
2321
- get onBlur() {
2322
- return getProps().onBlur;
2323
- },
2324
- get onFocusChange() {
2325
- return getProps().onFocusChange;
2326
- },
2327
- get onKeyDown() {
2328
- return getProps().onKeyDown;
2329
- },
2330
- get onKeyUp() {
2331
- return getProps().onKeyUp;
2332
- }
2333
- }, ref);
2334
- const interactions = mergeProps(pressProps, focusableProps);
2335
- const domProps = () => filterDOMProps(getProps(), { labelable: true });
2336
- const getTabIndex = () => {
2337
- if (isDisabled()) {
2338
- return void 0;
2339
- }
2340
- const selected = state2.selectedValue();
2341
- const lastFocused = state2.lastFocusedValue();
2342
- const currentValue = value();
2343
- if (selected != null) {
2344
- if (selected === currentValue) {
2345
- return 0;
2346
- }
2347
- return -1;
2348
- } else {
2349
- if (lastFocused === currentValue || lastFocused == null) {
2350
- return 0;
2351
- }
2352
- return -1;
2353
- }
2354
- };
2355
- const getGroupData = () => radioGroupData.get(state2);
2356
- const combinedIsPressed = () => isPressed() || isLabelPressed();
2357
- return {
2358
- labelProps: mergeProps(labelPressProps, {
2359
- onClick: (e) => e.preventDefault(),
2360
- onMouseDown: (e) => e.preventDefault()
2361
- }),
2362
- get inputProps() {
2363
- const p = getProps();
2364
- const groupData = getGroupData();
2365
- const describedByIds = [];
2366
- if (p["aria-describedby"]) {
2367
- describedByIds.push(p["aria-describedby"]);
2368
- }
2369
- if (state2.isInvalid && groupData?.errorMessageId) {
2370
- describedByIds.push(groupData.errorMessageId);
2371
- }
2372
- if (groupData?.descriptionId) {
2373
- describedByIds.push(groupData.descriptionId);
2374
- }
2375
- const ariaDescribedBy = describedByIds.length > 0 ? describedByIds.join(" ") : void 0;
2376
- return mergeProps(domProps(), interactions, {
2377
- type: "radio",
2378
- name: groupData?.name,
2379
- form: groupData?.form,
2380
- tabIndex: getTabIndex(),
2381
- disabled: isDisabled(),
2382
- required: state2.isRequired && groupData?.validationBehavior === "native",
2383
- checked: isSelected(),
2384
- value: value(),
2385
- onChange,
2386
- "aria-describedby": ariaDescribedBy
2387
- });
2388
- },
2389
- isDisabled: isDisabled(),
2390
- isSelected,
2391
- isPressed: combinedIsPressed
2392
- };
2393
- }
2394
-
2395
- // src/switch/createSwitch.ts
2396
- function createSwitch(props, state2, ref) {
2397
- const toggle = createToggle(props, state2, ref);
2398
- return {
2399
- labelProps: toggle.labelProps,
2400
- get inputProps() {
2401
- const baseProps = toggle.inputProps;
2402
- return {
2403
- ...baseProps,
2404
- role: "switch",
2405
- checked: toggle.isSelected()
2406
- };
2407
- },
2408
- isSelected: toggle.isSelected,
2409
- isPressed: toggle.isPressed,
2410
- isDisabled: toggle.isDisabled,
2411
- isReadOnly: toggle.isReadOnly
2412
- };
2413
- }
2414
-
2415
- // src/link/createLink.ts
2416
- function createLink(props = {}) {
2417
- const getProps = () => access(props);
2418
- const isDisabled = () => getProps().isDisabled ?? false;
2419
- const elementType = () => getProps().elementType ?? "a";
2420
- const { pressProps, isPressed } = createPress({
2421
- get isDisabled() {
2422
- return isDisabled();
2423
- },
2424
- get onPress() {
2425
- return getProps().onPress;
2426
- },
2427
- get onPressStart() {
2428
- return getProps().onPressStart;
2429
- },
2430
- get onPressEnd() {
2431
- return getProps().onPressEnd;
2432
- }
2433
- });
2434
- const { focusableProps } = createFocusable({
2435
- get isDisabled() {
2436
- return isDisabled();
2437
- },
2438
- get autoFocus() {
2439
- return getProps().autoFocus;
2440
- },
2441
- get onFocus() {
2442
- return getProps().onFocus;
2443
- },
2444
- get onBlur() {
2445
- return getProps().onBlur;
2446
- },
2447
- get onFocusChange() {
2448
- return getProps().onFocusChange;
2449
- },
2450
- get onKeyDown() {
2451
- return getProps().onKeyDown;
2452
- },
2453
- get onKeyUp() {
2454
- return getProps().onKeyUp;
2455
- }
2456
- });
2457
- const getLinkProps = () => {
2458
- const p = getProps();
2459
- const elType = elementType();
2460
- const disabled = isDisabled();
2461
- let baseProps = {};
2462
- if (elType !== "a") {
2463
- baseProps = {
2464
- role: "link",
2465
- tabIndex: disabled ? void 0 : 0
2466
- };
2467
- }
2468
- if (elType === "a") {
2469
- if (p.href) baseProps.href = p.href;
2470
- if (p.target) baseProps.target = p.target;
2471
- if (p.rel) baseProps.rel = p.rel;
2472
- }
2473
- const ariaProps = {
2474
- "aria-disabled": disabled || void 0
2475
- };
2476
- if (p["aria-current"] !== void 0) {
2477
- ariaProps["aria-current"] = p["aria-current"];
2478
- }
2479
- if (p["aria-label"]) {
2480
- ariaProps["aria-label"] = p["aria-label"];
2481
- }
2482
- if (p["aria-labelledby"]) {
2483
- ariaProps["aria-labelledby"] = p["aria-labelledby"];
2484
- }
2485
- if (p["aria-describedby"]) {
2486
- ariaProps["aria-describedby"] = p["aria-describedby"];
2487
- }
2488
- const onClick = (e) => {
2489
- if (disabled) {
2490
- e.preventDefault();
2491
- return;
2492
- }
2493
- p.onClick?.(e);
2494
- };
2495
- return mergeProps(
2496
- filterDOMProps(p, { labelable: true }),
2497
- baseProps,
2498
- ariaProps,
2499
- focusableProps,
2500
- pressProps,
2501
- { onClick }
2502
- );
2503
- };
2504
- return {
2505
- get linkProps() {
2506
- return getLinkProps();
2507
- },
2508
- isPressed
2509
- };
2510
- }
2511
-
2512
- // src/textfield/createTextField.ts
2513
- function createTextField(props, ref) {
2514
- const getProps = () => access(props);
2515
- const { labelProps, fieldProps, descriptionProps, errorMessageProps } = createField(props);
2516
- const { focusableProps } = createFocusable(
2517
- {
2518
- get isDisabled() {
2519
- return getProps().isDisabled;
2520
- },
2521
- get autoFocus() {
2522
- return getProps().autoFocus;
2523
- },
2524
- onFocus: getProps().onFocus,
2525
- onBlur: getProps().onBlur,
2526
- onFocusChange: getProps().onFocusChange,
2527
- onKeyDown: getProps().onKeyDown,
2528
- onKeyUp: getProps().onKeyUp
2529
- },
2530
- ref
2531
- );
2532
- const getDomProps = () => filterDOMProps(getProps(), { labelable: true });
2533
- const getInputProps = () => {
2534
- const p = getProps();
2535
- const isInvalid = p.isInvalid ?? false;
2536
- const isTextarea = p.inputElementType === "textarea";
2537
- return mergeProps(
2538
- getDomProps(),
2539
- {
2540
- disabled: p.isDisabled,
2541
- readOnly: p.isReadOnly,
2542
- required: p.isRequired,
2543
- "aria-required": p.isRequired || void 0,
2544
- "aria-invalid": isInvalid || void 0,
2545
- value: p.value ?? p.defaultValue ?? "",
2546
- onChange: (e) => {
2547
- const target = e.target;
2548
- p.onChange?.(target.value);
2549
- },
2550
- // Don't include type and pattern for textarea elements
2551
- type: isTextarea ? void 0 : p.type ?? "text",
2552
- inputMode: p.inputMode,
2553
- name: p.name,
2554
- pattern: isTextarea ? void 0 : p.pattern,
2555
- maxLength: p.maxLength,
2556
- minLength: p.minLength,
2557
- placeholder: p.placeholder,
2558
- autoComplete: p.autoComplete,
2559
- autoCorrect: p.autoCorrect,
2560
- autoCapitalize: p.autoCapitalize,
2561
- spellCheck: p.spellCheck,
2562
- // Clipboard events
2563
- onCopy: p.onCopy,
2564
- onCut: p.onCut,
2565
- onPaste: p.onPaste,
2566
- // Composition events
2567
- onCompositionStart: p.onCompositionStart,
2568
- onCompositionEnd: p.onCompositionEnd,
2569
- onCompositionUpdate: p.onCompositionUpdate,
2570
- // Selection events
2571
- onSelect: p.onSelect,
2572
- // Input events
2573
- onBeforeInput: p.onBeforeInput,
2574
- onInput: p.onInput
2575
- },
2576
- focusableProps,
2577
- fieldProps
2578
- );
2579
- };
2580
- const getIsInvalid = () => {
2581
- return getProps().isInvalid ?? false;
2582
- };
2583
- return {
2584
- get labelProps() {
2585
- return labelProps;
2586
- },
2587
- get inputProps() {
2588
- return getInputProps();
2589
- },
2590
- get descriptionProps() {
2591
- return descriptionProps;
2592
- },
2593
- get errorMessageProps() {
2594
- return errorMessageProps;
2595
- },
2596
- get isInvalid() {
2597
- return getIsInvalid();
2598
- }
2599
- };
2600
- }
2601
-
2602
- // src/progress/createProgressBar.ts
2603
- function clamp(value, min, max) {
2604
- return Math.min(Math.max(value, min), max);
2605
- }
2606
- function createProgressBar(props = {}) {
2607
- const getProps = () => access(props);
2608
- const { labelProps, fieldProps } = createLabel({
2609
- get label() {
2610
- return getProps().label;
2611
- },
2612
- get "aria-label"() {
2613
- return getProps()["aria-label"];
2614
- },
2615
- get "aria-labelledby"() {
2616
- return getProps()["aria-labelledby"];
2617
- },
2618
- // Progress bar is not an HTML input element so it
2619
- // shouldn't be labeled by a <label> element.
2620
- labelElementType: "span"
2621
- });
2622
- const getProgressBarProps = () => {
2623
- const p = getProps();
2624
- const value = p.value ?? 0;
2625
- const minValue = p.minValue ?? 0;
2626
- const maxValue = p.maxValue ?? 100;
2627
- const isIndeterminate = p.isIndeterminate ?? false;
2628
- const formatOptions = p.formatOptions ?? { style: "percent" };
2629
- const clampedValue = clamp(value, minValue, maxValue);
2630
- const percentage = (clampedValue - minValue) / (maxValue - minValue);
2631
- let valueLabel = p.valueLabel;
2632
- if (!isIndeterminate && !valueLabel) {
2633
- const valueToFormat = formatOptions.style === "percent" ? percentage : clampedValue;
2634
- try {
2635
- const formatter = new Intl.NumberFormat(void 0, formatOptions);
2636
- valueLabel = formatter.format(valueToFormat);
2637
- } catch {
2638
- valueLabel = `${Math.round(percentage * 100)}%`;
2639
- }
2640
- }
2641
- const domProps = filterDOMProps(p, { labelable: true });
2642
- return mergeProps(domProps, fieldProps, {
2643
- "aria-valuenow": isIndeterminate ? void 0 : clampedValue,
2644
- "aria-valuemin": minValue,
2645
- "aria-valuemax": maxValue,
2646
- "aria-valuetext": isIndeterminate ? void 0 : valueLabel,
2647
- role: "progressbar"
2648
- });
2649
- };
2650
- return {
2651
- get progressBarProps() {
2652
- return getProgressBarProps();
2653
- },
2654
- get labelProps() {
2655
- return labelProps;
2656
- }
2657
- };
2658
- }
2659
-
2660
- // src/separator/createSeparator.ts
2661
- function createSeparator(props = {}) {
2662
- const getSeparatorProps = () => {
2663
- const p = access(props);
2664
- const domProps = filterDOMProps(p, { labelable: true });
2665
- let ariaOrientation;
2666
- if (p.orientation === "vertical") {
2667
- ariaOrientation = "vertical";
2668
- }
2669
- if (p.elementType !== "hr") {
2670
- return {
2671
- ...domProps,
2672
- role: "separator",
2673
- "aria-orientation": ariaOrientation
2674
- };
2675
- }
2676
- return domProps;
2677
- };
2678
- return {
2679
- get separatorProps() {
2680
- return getSeparatorProps();
2681
- }
2682
- };
2683
- }
2684
- export {
2685
- access,
2686
- canUseDOM,
2687
- checkboxGroupData,
2688
- createButton,
2689
- createCheckbox,
2690
- createCheckboxGroup,
2691
- createCheckboxGroupItem,
2692
- createCheckboxGroupState,
2693
- createField,
2694
- createFocusRing,
2695
- createFocusable,
2696
- createHover,
2697
- createId,
2698
- createIsSSR,
2699
- createLabel,
2700
- createLabels,
2701
- createLink,
2702
- createPress,
2703
- createProgressBar,
2704
- createRadio,
2705
- createRadioGroup,
2706
- createRadioGroupState,
2707
- createSeparator,
2708
- createSwitch,
2709
- createTextField,
2710
- createToggle,
2711
- createToggleButton,
2712
- createToggleState,
2713
- filterDOMProps,
2714
- isAccessor,
2715
- mergeProps,
2716
- radioGroupData
2717
- };