@proyecto-viviana/solidaria-components 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ActionBar.js +184 -0
- package/dist/ActionBar.js.map +1 -0
- package/dist/ActionBar.jsx +128 -0
- package/dist/ActionBar.jsx.map +1 -0
- package/dist/ActionGroup.js +179 -0
- package/dist/ActionGroup.js.map +1 -0
- package/dist/ActionGroup.jsx +129 -0
- package/dist/ActionGroup.jsx.map +1 -0
- package/dist/Alert.js +111 -0
- package/dist/Alert.js.map +1 -0
- package/dist/Alert.jsx +82 -0
- package/dist/Alert.jsx.map +1 -0
- package/dist/Autocomplete.js +130 -0
- package/dist/Autocomplete.js.map +1 -0
- package/dist/Autocomplete.jsx +116 -0
- package/dist/Autocomplete.jsx.map +1 -0
- package/dist/Breadcrumbs.d.ts.map +1 -1
- package/dist/Breadcrumbs.js +334 -0
- package/dist/Breadcrumbs.js.map +1 -0
- package/dist/Breadcrumbs.jsx +266 -0
- package/dist/Breadcrumbs.jsx.map +1 -0
- package/dist/Button.d.ts.map +1 -1
- package/dist/Button.js +348 -0
- package/dist/Button.js.map +1 -0
- package/dist/Button.jsx +314 -0
- package/dist/Button.jsx.map +1 -0
- package/dist/Calendar.d.ts +4 -4
- package/dist/Calendar.d.ts.map +1 -1
- package/dist/Calendar.js +538 -0
- package/dist/Calendar.js.map +1 -0
- package/dist/Calendar.jsx +333 -0
- package/dist/Calendar.jsx.map +1 -0
- package/dist/CalendarPicker.d.ts +33 -0
- package/dist/CalendarPicker.d.ts.map +1 -0
- package/dist/CalendarPicker.js +44 -0
- package/dist/CalendarPicker.js.map +1 -0
- package/dist/CalendarPicker.jsx +44 -0
- package/dist/CalendarPicker.jsx.map +1 -0
- package/dist/Checkbox.d.ts +83 -4
- package/dist/Checkbox.d.ts.map +1 -1
- package/dist/Checkbox.js +923 -0
- package/dist/Checkbox.js.map +1 -0
- package/dist/Checkbox.jsx +707 -0
- package/dist/Checkbox.jsx.map +1 -0
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +202 -0
- package/dist/Collection.js.map +1 -0
- package/dist/Collection.jsx +152 -0
- package/dist/Collection.jsx.map +1 -0
- package/dist/Color.d.ts.map +1 -1
- package/dist/Color.js +1720 -0
- package/dist/Color.js.map +1 -0
- package/dist/Color.jsx +1344 -0
- package/dist/Color.jsx.map +1 -0
- package/dist/ColorEditor.js +208 -0
- package/dist/ColorEditor.js.map +1 -0
- package/dist/ColorEditor.jsx +120 -0
- package/dist/ColorEditor.jsx.map +1 -0
- package/dist/ComboBox.d.ts +4 -4
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +992 -0
- package/dist/ComboBox.js.map +1 -0
- package/dist/ComboBox.jsx +714 -0
- package/dist/ComboBox.jsx.map +1 -0
- package/dist/ContextualHelpTrigger.js +146 -0
- package/dist/ContextualHelpTrigger.js.map +1 -0
- package/dist/ContextualHelpTrigger.jsx +109 -0
- package/dist/ContextualHelpTrigger.jsx.map +1 -0
- package/dist/DateField.d.ts +3 -3
- package/dist/DateField.d.ts.map +1 -1
- package/dist/DateField.js +4 -0
- package/dist/DateField.jsx +4 -0
- package/dist/DateField2.js +499 -0
- package/dist/DateField2.js.map +1 -0
- package/dist/DateField2.jsx +317 -0
- package/dist/DateField2.jsx.map +1 -0
- package/dist/DatePicker.d.ts +4 -4
- package/dist/DatePicker.d.ts.map +1 -1
- package/dist/DatePicker.js +991 -0
- package/dist/DatePicker.js.map +1 -0
- package/dist/DatePicker.jsx +682 -0
- package/dist/DatePicker.jsx.map +1 -0
- package/dist/Dialog.d.ts.map +1 -1
- package/dist/Dialog.js +337 -0
- package/dist/Dialog.js.map +1 -0
- package/dist/Dialog.jsx +192 -0
- package/dist/Dialog.jsx.map +1 -0
- package/dist/Disclosure.d.ts.map +1 -1
- package/dist/Disclosure.js +328 -0
- package/dist/Disclosure.js.map +1 -0
- package/dist/Disclosure.jsx +230 -0
- package/dist/Disclosure.jsx.map +1 -0
- package/dist/DragAndDrop.d.ts.map +1 -1
- package/dist/DragAndDrop.js +176 -0
- package/dist/DragAndDrop.js.map +1 -0
- package/dist/DragAndDrop.jsx +160 -0
- package/dist/DragAndDrop.jsx.map +1 -0
- package/dist/DropZone.d.ts.map +1 -1
- package/dist/DropZone.js +189 -0
- package/dist/DropZone.js.map +1 -0
- package/dist/DropZone.jsx +144 -0
- package/dist/DropZone.jsx.map +1 -0
- package/dist/FieldError.js +66 -0
- package/dist/FieldError.js.map +1 -0
- package/dist/FieldError.jsx +47 -0
- package/dist/FieldError.jsx.map +1 -0
- package/dist/FileTrigger.js +79 -0
- package/dist/FileTrigger.js.map +1 -0
- package/dist/FileTrigger.jsx +49 -0
- package/dist/FileTrigger.jsx.map +1 -0
- package/dist/Focusable.js +70 -0
- package/dist/Focusable.js.map +1 -0
- package/dist/Focusable.jsx +69 -0
- package/dist/Focusable.jsx.map +1 -0
- package/dist/Form.js +99 -0
- package/dist/Form.js.map +1 -0
- package/dist/Form.jsx +73 -0
- package/dist/Form.jsx.map +1 -0
- package/dist/GridList.d.ts +34 -2
- package/dist/GridList.d.ts.map +1 -1
- package/dist/GridList.js +723 -0
- package/dist/GridList.js.map +1 -0
- package/dist/GridList.jsx +552 -0
- package/dist/GridList.jsx.map +1 -0
- package/dist/HiddenTimeInput.js +104 -0
- package/dist/HiddenTimeInput.js.map +1 -0
- package/dist/HiddenTimeInput.jsx +69 -0
- package/dist/HiddenTimeInput.jsx.map +1 -0
- package/dist/Icon.d.ts.map +1 -1
- package/dist/Icon.js +127 -0
- package/dist/Icon.js.map +1 -0
- package/dist/Icon.jsx +72 -0
- package/dist/Icon.jsx.map +1 -0
- package/dist/Keyboard.js +30 -0
- package/dist/Keyboard.js.map +1 -0
- package/dist/Keyboard.jsx +24 -0
- package/dist/Keyboard.jsx.map +1 -0
- package/dist/Landmark.js +134 -0
- package/dist/Landmark.js.map +1 -0
- package/dist/Landmark.jsx +118 -0
- package/dist/Landmark.jsx.map +1 -0
- package/dist/Link.d.ts.map +1 -1
- package/dist/Link.js +219 -0
- package/dist/Link.js.map +1 -0
- package/dist/Link.jsx +189 -0
- package/dist/Link.jsx.map +1 -0
- package/dist/ListBox.d.ts.map +1 -1
- package/dist/ListBox.js +670 -0
- package/dist/ListBox.js.map +1 -0
- package/dist/ListBox.jsx +508 -0
- package/dist/ListBox.jsx.map +1 -0
- package/dist/Menu.d.ts +27 -9
- package/dist/Menu.d.ts.map +1 -1
- package/dist/Menu.js +1254 -0
- package/dist/Menu.js.map +1 -0
- package/dist/Menu.jsx +1042 -0
- package/dist/Menu.jsx.map +1 -0
- package/dist/Meter.d.ts.map +1 -1
- package/dist/Meter.js +123 -0
- package/dist/Meter.js.map +1 -0
- package/dist/Meter.jsx +107 -0
- package/dist/Meter.jsx.map +1 -0
- package/dist/Modal.d.ts.map +1 -1
- package/dist/Modal.js +380 -0
- package/dist/Modal.js.map +1 -0
- package/dist/Modal.jsx +314 -0
- package/dist/Modal.jsx.map +1 -0
- package/dist/NumberField.d.ts +3 -3
- package/dist/NumberField.d.ts.map +1 -1
- package/dist/NumberField.js +573 -0
- package/dist/NumberField.js.map +1 -0
- package/dist/NumberField.jsx +443 -0
- package/dist/NumberField.jsx.map +1 -0
- package/dist/Popover.d.ts +10 -2
- package/dist/Popover.d.ts.map +1 -1
- package/dist/Popover.js +464 -0
- package/dist/Popover.js.map +1 -0
- package/dist/Popover.jsx +333 -0
- package/dist/Popover.jsx.map +1 -0
- package/dist/Pressable.js +69 -0
- package/dist/Pressable.js.map +1 -0
- package/dist/Pressable.jsx +68 -0
- package/dist/Pressable.jsx.map +1 -0
- package/dist/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar.js +130 -0
- package/dist/ProgressBar.js.map +1 -0
- package/dist/ProgressBar.jsx +114 -0
- package/dist/ProgressBar.jsx.map +1 -0
- package/dist/RadioGroup.d.ts +82 -4
- package/dist/RadioGroup.d.ts.map +1 -1
- package/dist/RadioGroup.js +931 -0
- package/dist/RadioGroup.js.map +1 -0
- package/dist/RadioGroup.jsx +681 -0
- package/dist/RadioGroup.jsx.map +1 -0
- package/dist/RangeCalendar.d.ts.map +1 -1
- package/dist/RangeCalendar.js +410 -0
- package/dist/RangeCalendar.js.map +1 -0
- package/dist/RangeCalendar.jsx +253 -0
- package/dist/RangeCalendar.jsx.map +1 -0
- package/dist/RouterProvider.js +118 -0
- package/dist/RouterProvider.js.map +1 -0
- package/dist/RouterProvider.jsx +112 -0
- package/dist/RouterProvider.jsx.map +1 -0
- package/dist/SearchField.d.ts +2 -2
- package/dist/SearchField.d.ts.map +1 -1
- package/dist/SearchField.js +643 -0
- package/dist/SearchField.js.map +1 -0
- package/dist/SearchField.jsx +526 -0
- package/dist/SearchField.jsx.map +1 -0
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +1031 -0
- package/dist/Select.js.map +1 -0
- package/dist/Select.jsx +744 -0
- package/dist/Select.jsx.map +1 -0
- package/dist/SelectionIndicator.d.ts.map +1 -1
- package/dist/SelectionIndicator.js +86 -0
- package/dist/SelectionIndicator.js.map +1 -0
- package/dist/SelectionIndicator.jsx +50 -0
- package/dist/SelectionIndicator.jsx.map +1 -0
- package/dist/Separator.js +97 -0
- package/dist/Separator.js.map +1 -0
- package/dist/Separator.jsx +85 -0
- package/dist/Separator.jsx.map +1 -0
- package/dist/SharedElementTransition.d.ts.map +1 -1
- package/dist/SharedElementTransition.js +165 -0
- package/dist/SharedElementTransition.js.map +1 -0
- package/dist/SharedElementTransition.jsx +138 -0
- package/dist/SharedElementTransition.jsx.map +1 -0
- package/dist/Slider.d.ts +33 -1
- package/dist/Slider.d.ts.map +1 -1
- package/dist/Slider.js +515 -0
- package/dist/Slider.js.map +1 -0
- package/dist/Slider.jsx +403 -0
- package/dist/Slider.jsx.map +1 -0
- package/dist/StepList.js +198 -0
- package/dist/StepList.js.map +1 -0
- package/dist/StepList.jsx +141 -0
- package/dist/StepList.jsx.map +1 -0
- package/dist/Switch.d.ts +65 -2
- package/dist/Switch.d.ts.map +1 -1
- package/dist/Switch.js +534 -0
- package/dist/Switch.js.map +1 -0
- package/dist/Switch.jsx +393 -0
- package/dist/Switch.jsx.map +1 -0
- package/dist/Table.d.ts +48 -0
- package/dist/Table.d.ts.map +1 -1
- package/dist/Table.js +1759 -0
- package/dist/Table.js.map +1 -0
- package/dist/Table.jsx +1348 -0
- package/dist/Table.jsx.map +1 -0
- package/dist/Tabs.d.ts +0 -4
- package/dist/Tabs.d.ts.map +1 -1
- package/dist/Tabs.js +595 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Tabs.jsx +367 -0
- package/dist/Tabs.jsx.map +1 -0
- package/dist/TagGroup.d.ts.map +1 -1
- package/dist/TagGroup.js +378 -0
- package/dist/TagGroup.js.map +1 -0
- package/dist/TagGroup.jsx +270 -0
- package/dist/TagGroup.jsx.map +1 -0
- package/dist/Text.d.ts +18 -6
- package/dist/Text.d.ts.map +1 -1
- package/dist/Text.js +42 -0
- package/dist/Text.js.map +1 -0
- package/dist/Text.jsx +35 -0
- package/dist/Text.jsx.map +1 -0
- package/dist/TextField.d.ts +6 -6
- package/dist/TextField.d.ts.map +1 -1
- package/dist/TextField.js +436 -0
- package/dist/TextField.js.map +1 -0
- package/dist/TextField.jsx +403 -0
- package/dist/TextField.jsx.map +1 -0
- package/dist/TimeField.d.ts +3 -3
- package/dist/TimeField.d.ts.map +1 -1
- package/dist/TimeField.js +372 -0
- package/dist/TimeField.js.map +1 -0
- package/dist/TimeField.jsx +224 -0
- package/dist/TimeField.jsx.map +1 -0
- package/dist/Toast.d.ts +14 -0
- package/dist/Toast.d.ts.map +1 -1
- package/dist/Toast.js +551 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Toast.jsx +361 -0
- package/dist/Toast.jsx.map +1 -0
- package/dist/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton.js +123 -0
- package/dist/ToggleButton.js.map +1 -0
- package/dist/ToggleButton.jsx +88 -0
- package/dist/ToggleButton.jsx.map +1 -0
- package/dist/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButtonGroup.js +114 -0
- package/dist/ToggleButtonGroup.js.map +1 -0
- package/dist/ToggleButtonGroup.jsx +85 -0
- package/dist/ToggleButtonGroup.jsx.map +1 -0
- package/dist/Toolbar.js +112 -0
- package/dist/Toolbar.js.map +1 -0
- package/dist/Toolbar.jsx +92 -0
- package/dist/Toolbar.jsx.map +1 -0
- package/dist/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip.js +539 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/Tooltip.jsx +465 -0
- package/dist/Tooltip.jsx.map +1 -0
- package/dist/Tree.d.ts +14 -2
- package/dist/Tree.d.ts.map +1 -1
- package/dist/Tree.js +1424 -0
- package/dist/Tree.js.map +1 -0
- package/dist/Tree.jsx +1172 -0
- package/dist/Tree.jsx.map +1 -0
- package/dist/Virtualizer.d.ts +16 -2
- package/dist/Virtualizer.d.ts.map +1 -1
- package/dist/Virtualizer.js +2 -0
- package/dist/Virtualizer.jsx +2 -0
- package/dist/Virtualizer2.js +751 -0
- package/dist/Virtualizer2.js.map +1 -0
- package/dist/Virtualizer2.jsx +730 -0
- package/dist/Virtualizer2.jsx.map +1 -0
- package/dist/VirtualizerLayouts.d.ts +18 -0
- package/dist/VirtualizerLayouts.d.ts.map +1 -1
- package/dist/VisuallyHidden.js +42 -0
- package/dist/VisuallyHidden.js.map +1 -0
- package/dist/VisuallyHidden.jsx +35 -0
- package/dist/VisuallyHidden.jsx.map +1 -0
- package/dist/contexts.js +33 -0
- package/dist/contexts.js.map +1 -0
- package/dist/contexts.jsx +33 -0
- package/dist/contexts.jsx.map +1 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -23932
- package/dist/index.jsx +70 -18337
- package/dist/useDragAndDrop.js +2 -0
- package/dist/useDragAndDrop.jsx +2 -0
- package/dist/useDragAndDrop2.js +395 -0
- package/dist/useDragAndDrop2.js.map +1 -0
- package/dist/useDragAndDrop2.jsx +395 -0
- package/dist/useDragAndDrop2.jsx.map +1 -0
- package/dist/utils.d.ts +83 -11
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +285 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.jsx +277 -0
- package/dist/utils.jsx.map +1 -0
- package/dist/virtualizer/Layout.js +144 -0
- package/dist/virtualizer/Layout.js.map +1 -0
- package/dist/virtualizer/Layout.jsx +144 -0
- package/dist/virtualizer/Layout.jsx.map +1 -0
- package/package.json +401 -4
- package/src/Breadcrumbs.tsx +3 -1
- package/src/Button.tsx +22 -2
- package/src/Calendar.tsx +27 -10
- package/src/CalendarPicker.tsx +73 -0
- package/src/Checkbox.tsx +539 -3
- package/src/Collection.tsx +9 -3
- package/src/Color.tsx +42 -14
- package/src/ComboBox.tsx +50 -6
- package/src/DateField.tsx +20 -2
- package/src/DatePicker.tsx +57 -5
- package/src/Dialog.tsx +13 -5
- package/src/Disclosure.tsx +3 -1
- package/src/DragAndDrop.tsx +3 -1
- package/src/DropZone.tsx +3 -1
- package/src/GridList.tsx +125 -24
- package/src/Icon.tsx +3 -1
- package/src/Link.tsx +3 -1
- package/src/ListBox.tsx +31 -4
- package/src/Menu.tsx +252 -128
- package/src/Meter.tsx +3 -1
- package/src/Modal.tsx +100 -52
- package/src/NumberField.tsx +51 -8
- package/src/Popover.tsx +40 -10
- package/src/ProgressBar.tsx +3 -1
- package/src/RadioGroup.tsx +468 -4
- package/src/RangeCalendar.tsx +3 -1
- package/src/SearchField.tsx +27 -3
- package/src/Select.tsx +22 -7
- package/src/SelectionIndicator.tsx +3 -1
- package/src/SharedElementTransition.tsx +3 -1
- package/src/Slider.tsx +159 -13
- package/src/Switch.tsx +395 -2
- package/src/Table.tsx +409 -95
- package/src/Tabs.tsx +16 -45
- package/src/TagGroup.tsx +3 -1
- package/src/Text.tsx +31 -10
- package/src/TextField.tsx +43 -5
- package/src/TimeField.tsx +20 -2
- package/src/Toast.tsx +79 -14
- package/src/ToggleButton.tsx +3 -1
- package/src/ToggleButtonGroup.tsx +3 -1
- package/src/Tooltip.tsx +3 -1
- package/src/Tree.tsx +77 -9
- package/src/Virtualizer.tsx +180 -31
- package/src/VirtualizerLayouts.ts +45 -10
- package/src/index.ts +50 -0
- package/src/utils.tsx +243 -27
- package/dist/index.js.map +0 -1
- package/dist/index.jsx.map +0 -1
|
@@ -0,0 +1,931 @@
|
|
|
1
|
+
import { Provider, filterDOMProps, useRenderProps } from "./utils.js";
|
|
2
|
+
import { VisuallyHidden } from "./VisuallyHidden.js";
|
|
3
|
+
import { FieldErrorContext } from "./FieldError.js";
|
|
4
|
+
import { TextContext } from "./Text.js";
|
|
5
|
+
import { SelectionIndicatorContext } from "./SelectionIndicator.js";
|
|
6
|
+
import { createComponent, getNextElement, getNextMarker, insert, memo, mergeProps, runHydrationEvents, setAttribute, spread, template, use } from "solid-js/web";
|
|
7
|
+
import { Show, createContext, createMemo, createSignal, createUniqueId, splitProps, useContext } from "solid-js";
|
|
8
|
+
import { createFocusRing, createHover, createRadio, createRadioGroup, mergeProps as mergeProps$2 } from "@proyecto-viviana/solidaria";
|
|
9
|
+
import { VALID_VALIDITY_STATE, createRadioGroupState } from "@proyecto-viviana/solid-stately";
|
|
10
|
+
//#region src/RadioGroup.tsx
|
|
11
|
+
/**
|
|
12
|
+
* RadioGroup and Radio components for solidaria-components
|
|
13
|
+
*
|
|
14
|
+
* Pre-wired headless radio components that combine state + aria hooks.
|
|
15
|
+
* Port of react-aria-components/src/RadioGroup.tsx
|
|
16
|
+
*/
|
|
17
|
+
var _tmpl$ = /*#__PURE__*/ template(`<div>`), _tmpl$2 = /*#__PURE__*/ template(`<input>`), _tmpl$3 = /*#__PURE__*/ template(`<span slot=description>`), _tmpl$4 = /*#__PURE__*/ template(`<span slot=errorMessage>`), _tmpl$5 = /*#__PURE__*/ template(`<label>`), _tmpl$6 = /*#__PURE__*/ template(`<label><!$><!/><!$><!/>`);
|
|
18
|
+
function assignRef(ref, el) {
|
|
19
|
+
if (!ref) return;
|
|
20
|
+
if (typeof ref === "function") ref(el);
|
|
21
|
+
else ref.current = el;
|
|
22
|
+
}
|
|
23
|
+
const validValidation = {
|
|
24
|
+
isInvalid: false,
|
|
25
|
+
validationDetails: VALID_VALIDITY_STATE,
|
|
26
|
+
validationErrors: []
|
|
27
|
+
};
|
|
28
|
+
function getNativeValidation(input) {
|
|
29
|
+
return {
|
|
30
|
+
isInvalid: !input.validity.valid,
|
|
31
|
+
validationDetails: {
|
|
32
|
+
badInput: input.validity.badInput,
|
|
33
|
+
customError: input.validity.customError,
|
|
34
|
+
patternMismatch: input.validity.patternMismatch,
|
|
35
|
+
rangeOverflow: input.validity.rangeOverflow,
|
|
36
|
+
rangeUnderflow: input.validity.rangeUnderflow,
|
|
37
|
+
stepMismatch: input.validity.stepMismatch,
|
|
38
|
+
tooLong: input.validity.tooLong,
|
|
39
|
+
tooShort: input.validity.tooShort,
|
|
40
|
+
typeMismatch: input.validity.typeMismatch,
|
|
41
|
+
valueMissing: input.validity.valueMissing,
|
|
42
|
+
valid: input.validity.valid
|
|
43
|
+
},
|
|
44
|
+
validationErrors: input.validationMessage ? [input.validationMessage] : []
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const RadioGroupContext = createContext(null);
|
|
48
|
+
const RadioGroupStateContext = createContext(null);
|
|
49
|
+
const RadioContext = createContext(null);
|
|
50
|
+
/**
|
|
51
|
+
* A radio group allows a user to select a single item from a list of mutually exclusive options.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <RadioGroup>
|
|
56
|
+
* <Radio value="one">Option 1</Radio>
|
|
57
|
+
* <Radio value="two">Option 2</Radio>
|
|
58
|
+
* </RadioGroup>
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
function RadioGroup(props) {
|
|
62
|
+
const contextProps = useContext(RadioGroupContext);
|
|
63
|
+
const contextSlotProps = contextProps?.slots?.[props.slot ?? "default"];
|
|
64
|
+
const contextBaseProps = createMemo(() => {
|
|
65
|
+
if (!contextProps) return {};
|
|
66
|
+
const { slots: _slots, ...rest } = contextProps;
|
|
67
|
+
return rest;
|
|
68
|
+
});
|
|
69
|
+
const mergedProps = contextProps ? mergeProps$2(contextBaseProps(), contextSlotProps ?? {}, props) : props;
|
|
70
|
+
const [local, ariaProps] = splitProps(mergedProps, [
|
|
71
|
+
"class",
|
|
72
|
+
"style",
|
|
73
|
+
"render",
|
|
74
|
+
"ref",
|
|
75
|
+
"slot",
|
|
76
|
+
"renderHelpText"
|
|
77
|
+
]);
|
|
78
|
+
const state = createRadioGroupState(() => ({
|
|
79
|
+
value: mergedProps.value,
|
|
80
|
+
defaultValue: mergedProps.defaultValue,
|
|
81
|
+
onChange: mergedProps.onChange,
|
|
82
|
+
isDisabled: mergedProps.isDisabled,
|
|
83
|
+
isReadOnly: mergedProps.isReadOnly,
|
|
84
|
+
isRequired: mergedProps.isRequired,
|
|
85
|
+
isInvalid: mergedProps.isInvalid,
|
|
86
|
+
validationState: mergedProps.validationState,
|
|
87
|
+
validate: mergedProps.validate,
|
|
88
|
+
validationBehavior: mergedProps.validationBehavior,
|
|
89
|
+
name: mergedProps.name,
|
|
90
|
+
form: mergedProps.form
|
|
91
|
+
}));
|
|
92
|
+
const groupAria = createRadioGroup(() => ({
|
|
93
|
+
...ariaProps,
|
|
94
|
+
description: mergedProps.description,
|
|
95
|
+
errorMessage: mergedProps.errorMessage
|
|
96
|
+
}), state);
|
|
97
|
+
const isInvalid = createMemo(() => state.isInvalid);
|
|
98
|
+
const validation = createMemo(() => state.displayValidation());
|
|
99
|
+
const fallbackErrorMessageId = createUniqueId();
|
|
100
|
+
const errorMessageId = () => groupAria.errorMessageProps.id ?? fallbackErrorMessageId;
|
|
101
|
+
const renderValues = createMemo(() => ({
|
|
102
|
+
orientation: ariaProps.orientation ?? "vertical",
|
|
103
|
+
isDisabled: state.isDisabled,
|
|
104
|
+
isReadOnly: state.isReadOnly,
|
|
105
|
+
isRequired: state.isRequired,
|
|
106
|
+
isInvalid: isInvalid(),
|
|
107
|
+
state
|
|
108
|
+
}));
|
|
109
|
+
const renderProps = useRenderProps({
|
|
110
|
+
get children() {
|
|
111
|
+
return props.children;
|
|
112
|
+
},
|
|
113
|
+
class: local.class,
|
|
114
|
+
style: local.style,
|
|
115
|
+
defaultClassName: "solidaria-RadioGroup"
|
|
116
|
+
}, renderValues);
|
|
117
|
+
const domProps = createMemo(() => filterDOMProps(ariaProps, { global: true }));
|
|
118
|
+
const cleanGroupProps = () => {
|
|
119
|
+
const { ref: _ref, ...rest } = groupAria.radioGroupProps;
|
|
120
|
+
return rest;
|
|
121
|
+
};
|
|
122
|
+
const handleGroupFocusIn = (event) => {
|
|
123
|
+
groupAria.radioGroupProps.onFocus?.(event);
|
|
124
|
+
};
|
|
125
|
+
const handleGroupFocusOut = (event) => {
|
|
126
|
+
groupAria.radioGroupProps.onBlur?.(event);
|
|
127
|
+
};
|
|
128
|
+
const handleGroupInvalidCapture = (event) => {
|
|
129
|
+
const target = event.target;
|
|
130
|
+
if (!(target instanceof HTMLInputElement) || target.type !== "radio") return;
|
|
131
|
+
state.updateValidation(getNativeValidation(target));
|
|
132
|
+
state.commitValidation();
|
|
133
|
+
target.focus();
|
|
134
|
+
event.preventDefault();
|
|
135
|
+
};
|
|
136
|
+
const handleGroupChangeCapture = (event) => {
|
|
137
|
+
const target = event.target;
|
|
138
|
+
if (!(target instanceof HTMLInputElement) || target.type !== "radio") return;
|
|
139
|
+
state.updateValidation(target.validity.valid ? validValidation : getNativeValidation(target));
|
|
140
|
+
state.commitValidation();
|
|
141
|
+
};
|
|
142
|
+
const setGroupRef = (el) => {
|
|
143
|
+
assignRef(local.ref, el);
|
|
144
|
+
};
|
|
145
|
+
const groupDescribedBy = () => {
|
|
146
|
+
const ids = [
|
|
147
|
+
cleanGroupProps()["aria-describedby"],
|
|
148
|
+
mergedProps.description ? groupAria.descriptionProps.id : void 0,
|
|
149
|
+
isInvalid() && (mergedProps.errorMessage || validation().validationErrors.length > 0) ? errorMessageId() : void 0
|
|
150
|
+
].filter(Boolean).join(" ").split(" ").filter(Boolean);
|
|
151
|
+
return ids.length ? Array.from(new Set(ids)).join(" ") : void 0;
|
|
152
|
+
};
|
|
153
|
+
const fieldErrorContext = {
|
|
154
|
+
get validation() {
|
|
155
|
+
return validation();
|
|
156
|
+
},
|
|
157
|
+
get errorMessageProps() {
|
|
158
|
+
return {
|
|
159
|
+
...groupAria.errorMessageProps,
|
|
160
|
+
id: errorMessageId()
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const GroupChildren = () => {
|
|
165
|
+
const childRenderValues = {
|
|
166
|
+
get orientation() {
|
|
167
|
+
return ariaProps.orientation ?? "vertical";
|
|
168
|
+
},
|
|
169
|
+
get isDisabled() {
|
|
170
|
+
return state.isDisabled;
|
|
171
|
+
},
|
|
172
|
+
get isReadOnly() {
|
|
173
|
+
return state.isReadOnly;
|
|
174
|
+
},
|
|
175
|
+
get isRequired() {
|
|
176
|
+
return state.isRequired;
|
|
177
|
+
},
|
|
178
|
+
get isInvalid() {
|
|
179
|
+
return isInvalid();
|
|
180
|
+
},
|
|
181
|
+
get state() {
|
|
182
|
+
return state;
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
return [
|
|
186
|
+
memo(createMemo(() => {
|
|
187
|
+
const children = props.children;
|
|
188
|
+
if (typeof children === "function") return children.length > 0 ? children(childRenderValues) : children();
|
|
189
|
+
return children;
|
|
190
|
+
})),
|
|
191
|
+
createComponent(Show, {
|
|
192
|
+
get when() {
|
|
193
|
+
return memo(() => !!(local.renderHelpText ?? true))() && mergedProps.description;
|
|
194
|
+
},
|
|
195
|
+
get children() {
|
|
196
|
+
var _el$ = getNextElement(_tmpl$);
|
|
197
|
+
spread(_el$, mergeProps(() => groupAria.descriptionProps), false, true);
|
|
198
|
+
insert(_el$, () => mergedProps.description);
|
|
199
|
+
runHydrationEvents();
|
|
200
|
+
return _el$;
|
|
201
|
+
}
|
|
202
|
+
}),
|
|
203
|
+
createComponent(Show, {
|
|
204
|
+
get when() {
|
|
205
|
+
return memo(() => !!((local.renderHelpText ?? true) && isInvalid()))() && mergedProps.errorMessage;
|
|
206
|
+
},
|
|
207
|
+
get children() {
|
|
208
|
+
var _el$2 = getNextElement(_tmpl$);
|
|
209
|
+
spread(_el$2, mergeProps(() => groupAria.errorMessageProps), false, true);
|
|
210
|
+
insert(_el$2, () => mergedProps.errorMessage);
|
|
211
|
+
runHydrationEvents();
|
|
212
|
+
return _el$2;
|
|
213
|
+
}
|
|
214
|
+
})
|
|
215
|
+
];
|
|
216
|
+
};
|
|
217
|
+
const groupEventProps = {
|
|
218
|
+
onInvalidCapture: handleGroupInvalidCapture,
|
|
219
|
+
onChangeCapture: handleGroupChangeCapture
|
|
220
|
+
};
|
|
221
|
+
const customRootProps = () => ({
|
|
222
|
+
...domProps(),
|
|
223
|
+
...cleanGroupProps(),
|
|
224
|
+
...groupEventProps,
|
|
225
|
+
ref: setGroupRef,
|
|
226
|
+
onFocusIn: handleGroupFocusIn,
|
|
227
|
+
onFocusOut: handleGroupFocusOut,
|
|
228
|
+
"aria-describedby": groupDescribedBy(),
|
|
229
|
+
class: renderProps.class(),
|
|
230
|
+
style: renderProps.style(),
|
|
231
|
+
slot: local.slot,
|
|
232
|
+
"data-orientation": ariaProps.orientation ?? "vertical",
|
|
233
|
+
"data-disabled": state.isDisabled || void 0,
|
|
234
|
+
"data-readonly": state.isReadOnly || void 0,
|
|
235
|
+
"data-required": state.isRequired || void 0,
|
|
236
|
+
"data-invalid": isInvalid() || void 0,
|
|
237
|
+
children: createComponent(GroupChildren, {})
|
|
238
|
+
});
|
|
239
|
+
return createComponent(RadioGroupStateContext.Provider, {
|
|
240
|
+
value: state,
|
|
241
|
+
get children() {
|
|
242
|
+
return createComponent(FieldErrorContext.Provider, {
|
|
243
|
+
value: fieldErrorContext,
|
|
244
|
+
get children() {
|
|
245
|
+
return memo(() => !!local.render)() ? local.render(customRootProps(), renderValues()) : (() => {
|
|
246
|
+
var _el$3 = getNextElement(_tmpl$);
|
|
247
|
+
use(setGroupRef, _el$3);
|
|
248
|
+
spread(_el$3, mergeProps(domProps, cleanGroupProps, groupEventProps, {
|
|
249
|
+
"onFocusIn": handleGroupFocusIn,
|
|
250
|
+
"onFocusOut": handleGroupFocusOut,
|
|
251
|
+
get ["aria-describedby"]() {
|
|
252
|
+
return groupDescribedBy();
|
|
253
|
+
},
|
|
254
|
+
get ["class"]() {
|
|
255
|
+
return renderProps.class();
|
|
256
|
+
},
|
|
257
|
+
get style() {
|
|
258
|
+
return renderProps.style();
|
|
259
|
+
},
|
|
260
|
+
get slot() {
|
|
261
|
+
return local.slot;
|
|
262
|
+
},
|
|
263
|
+
get ["data-orientation"]() {
|
|
264
|
+
return ariaProps.orientation ?? "vertical";
|
|
265
|
+
},
|
|
266
|
+
get ["data-disabled"]() {
|
|
267
|
+
return state.isDisabled || void 0;
|
|
268
|
+
},
|
|
269
|
+
get ["data-readonly"]() {
|
|
270
|
+
return state.isReadOnly || void 0;
|
|
271
|
+
},
|
|
272
|
+
get ["data-required"]() {
|
|
273
|
+
return state.isRequired || void 0;
|
|
274
|
+
},
|
|
275
|
+
get ["data-invalid"]() {
|
|
276
|
+
return isInvalid() || void 0;
|
|
277
|
+
}
|
|
278
|
+
}), false, true);
|
|
279
|
+
insert(_el$3, createComponent(GroupChildren, {}));
|
|
280
|
+
runHydrationEvents();
|
|
281
|
+
return _el$3;
|
|
282
|
+
})();
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Internal Radio implementation that has access to RadioGroupStateContext.
|
|
290
|
+
* This is rendered inside the RadioGroup's context provider.
|
|
291
|
+
*/
|
|
292
|
+
function RadioImpl(props) {
|
|
293
|
+
const [inputElement, setInputElement] = createSignal(null);
|
|
294
|
+
const { state } = props;
|
|
295
|
+
const contextProps = useContext(RadioContext);
|
|
296
|
+
const contextSlotProps = contextProps?.slots?.[props.radioProps.slot ?? "default"];
|
|
297
|
+
const contextBaseProps = createMemo(() => {
|
|
298
|
+
if (!contextProps) return {};
|
|
299
|
+
const { slots: _slots, ...rest } = contextProps;
|
|
300
|
+
return rest;
|
|
301
|
+
});
|
|
302
|
+
const radioProps = contextProps ? mergeProps$2(contextBaseProps(), contextSlotProps ?? {}, props.radioProps) : props.radioProps;
|
|
303
|
+
const inputRefs = createMemo(() => [
|
|
304
|
+
contextBaseProps().inputRef,
|
|
305
|
+
contextSlotProps?.inputRef,
|
|
306
|
+
props.radioProps.inputRef
|
|
307
|
+
].filter(Boolean));
|
|
308
|
+
const [local, ariaProps] = splitProps(radioProps, [
|
|
309
|
+
"class",
|
|
310
|
+
"style",
|
|
311
|
+
"render",
|
|
312
|
+
"ref",
|
|
313
|
+
"inputRef",
|
|
314
|
+
"slot",
|
|
315
|
+
"description",
|
|
316
|
+
"errorMessage",
|
|
317
|
+
"onHoverStart",
|
|
318
|
+
"onHoverEnd",
|
|
319
|
+
"onHoverChange"
|
|
320
|
+
]);
|
|
321
|
+
const descriptionId = createUniqueId();
|
|
322
|
+
const errorMessageId = createUniqueId();
|
|
323
|
+
const describedBy = () => {
|
|
324
|
+
const ids = [
|
|
325
|
+
ariaProps["aria-describedby"],
|
|
326
|
+
local.description ? descriptionId : void 0,
|
|
327
|
+
state.isInvalid && local.errorMessage ? errorMessageId : void 0
|
|
328
|
+
].filter(Boolean);
|
|
329
|
+
return ids.length ? ids.join(" ") : void 0;
|
|
330
|
+
};
|
|
331
|
+
const inputAriaProps = createMemo(() => {
|
|
332
|
+
const clean = {};
|
|
333
|
+
for (const key in ariaProps) if (!key.startsWith("data-")) clean[key] = ariaProps[key];
|
|
334
|
+
return clean;
|
|
335
|
+
});
|
|
336
|
+
const radioAria = createRadio(() => ({
|
|
337
|
+
...inputAriaProps(),
|
|
338
|
+
"aria-describedby": describedBy(),
|
|
339
|
+
children: typeof radioProps.children === "function" ? true : radioProps.children
|
|
340
|
+
}), state, inputElement);
|
|
341
|
+
const { isFocused, isFocusVisible, focusProps } = createFocusRing();
|
|
342
|
+
const { isHovered, hoverProps } = createHover({
|
|
343
|
+
get isDisabled() {
|
|
344
|
+
return radioAria.isDisabled || state.isReadOnly;
|
|
345
|
+
},
|
|
346
|
+
onHoverStart: local.onHoverStart,
|
|
347
|
+
onHoverEnd: local.onHoverEnd,
|
|
348
|
+
onHoverChange: local.onHoverChange
|
|
349
|
+
});
|
|
350
|
+
const renderValues = createMemo(() => ({
|
|
351
|
+
isSelected: radioAria.isSelected(),
|
|
352
|
+
isHovered: isHovered(),
|
|
353
|
+
isPressed: radioAria.isPressed(),
|
|
354
|
+
isFocused: isFocused(),
|
|
355
|
+
isFocusVisible: isFocusVisible(),
|
|
356
|
+
isDisabled: radioAria.isDisabled,
|
|
357
|
+
isReadOnly: state.isReadOnly,
|
|
358
|
+
isInvalid: state.isInvalid,
|
|
359
|
+
isRequired: state.isRequired
|
|
360
|
+
}));
|
|
361
|
+
const renderProps = useRenderProps({
|
|
362
|
+
children: radioProps.children,
|
|
363
|
+
class: local.class,
|
|
364
|
+
style: local.style,
|
|
365
|
+
defaultClassName: "solidaria-Radio"
|
|
366
|
+
}, renderValues);
|
|
367
|
+
const selectionIndicatorContext = createMemo(() => ({ isSelected: radioAria.isSelected }));
|
|
368
|
+
const domProps = createMemo(() => {
|
|
369
|
+
const filtered = filterDOMProps(ariaProps, { global: true });
|
|
370
|
+
delete filtered.id;
|
|
371
|
+
delete filtered.onClick;
|
|
372
|
+
return filtered;
|
|
373
|
+
});
|
|
374
|
+
const cleanLabelProps = () => {
|
|
375
|
+
const { ref: _ref1, ...rest } = radioAria.labelProps;
|
|
376
|
+
return rest;
|
|
377
|
+
};
|
|
378
|
+
const cleanHoverProps = () => {
|
|
379
|
+
const { ref: _ref2, ...rest } = hoverProps;
|
|
380
|
+
return rest;
|
|
381
|
+
};
|
|
382
|
+
const cleanInputProps = () => {
|
|
383
|
+
const { ref: _ref3, onFocus: _onFocus, onBlur: _onBlur, ...rest } = radioAria.inputProps;
|
|
384
|
+
return rest;
|
|
385
|
+
};
|
|
386
|
+
const cleanFocusProps = () => {
|
|
387
|
+
const { ref: _ref4, onFocus: _onFocus, onBlur: _onBlur, ...rest } = focusProps;
|
|
388
|
+
return rest;
|
|
389
|
+
};
|
|
390
|
+
const handleInputFocus = (event) => {
|
|
391
|
+
radioAria.inputProps.onFocus?.(event);
|
|
392
|
+
focusProps.onFocus?.(event);
|
|
393
|
+
};
|
|
394
|
+
const handleInputBlur = (event) => {
|
|
395
|
+
radioAria.inputProps.onBlur?.(event);
|
|
396
|
+
focusProps.onBlur?.(event);
|
|
397
|
+
};
|
|
398
|
+
const handleLabelClick = (event) => {
|
|
399
|
+
ariaProps.onClickCapture?.(event);
|
|
400
|
+
radioAria.labelProps.onClick?.(event);
|
|
401
|
+
};
|
|
402
|
+
const handleLabelClickCapture = (event) => {
|
|
403
|
+
ariaProps.onClickCapture?.(event);
|
|
404
|
+
};
|
|
405
|
+
const handleInputClick = (event) => {
|
|
406
|
+
radioAria.inputProps.onClick?.(event);
|
|
407
|
+
};
|
|
408
|
+
const handleInputInvalid = (event) => {
|
|
409
|
+
state.updateValidation(getNativeValidation(event.currentTarget));
|
|
410
|
+
state.commitValidation();
|
|
411
|
+
event.currentTarget.focus();
|
|
412
|
+
event.preventDefault();
|
|
413
|
+
};
|
|
414
|
+
const handleInputChange = (event) => {
|
|
415
|
+
radioAria.inputProps.onChange?.(event);
|
|
416
|
+
state.updateValidation(event.currentTarget.validity.valid ? validValidation : getNativeValidation(event.currentTarget));
|
|
417
|
+
state.commitValidation();
|
|
418
|
+
};
|
|
419
|
+
const setLabelRef = (el) => {
|
|
420
|
+
assignRef(local.ref, el);
|
|
421
|
+
};
|
|
422
|
+
const setInputRef = (el) => {
|
|
423
|
+
setInputElement(el);
|
|
424
|
+
el.addEventListener("invalid", (event) => {
|
|
425
|
+
state.updateValidation(getNativeValidation(el));
|
|
426
|
+
state.commitValidation();
|
|
427
|
+
el.focus();
|
|
428
|
+
event.preventDefault();
|
|
429
|
+
});
|
|
430
|
+
el.addEventListener("change", () => {
|
|
431
|
+
state.updateValidation(el.validity.valid ? validValidation : getNativeValidation(el));
|
|
432
|
+
state.commitValidation();
|
|
433
|
+
});
|
|
434
|
+
for (const ref of inputRefs()) assignRef(ref, el);
|
|
435
|
+
};
|
|
436
|
+
const hiddenInput = createComponent(VisuallyHidden, { get children() {
|
|
437
|
+
var _el$4 = getNextElement(_tmpl$2);
|
|
438
|
+
use(setInputRef, _el$4);
|
|
439
|
+
spread(_el$4, mergeProps(cleanInputProps, cleanFocusProps, {
|
|
440
|
+
"onFocus": handleInputFocus,
|
|
441
|
+
"onBlur": handleInputBlur,
|
|
442
|
+
"onInvalid": handleInputInvalid,
|
|
443
|
+
"onChange": handleInputChange,
|
|
444
|
+
"onClick": handleInputClick
|
|
445
|
+
}), false, false);
|
|
446
|
+
runHydrationEvents();
|
|
447
|
+
return _el$4;
|
|
448
|
+
} });
|
|
449
|
+
const labelChildren = () => [
|
|
450
|
+
hiddenInput,
|
|
451
|
+
memo(() => renderProps.renderChildren()),
|
|
452
|
+
createComponent(Show, {
|
|
453
|
+
get when() {
|
|
454
|
+
return local.description;
|
|
455
|
+
},
|
|
456
|
+
get children() {
|
|
457
|
+
var _el$5 = getNextElement(_tmpl$3);
|
|
458
|
+
setAttribute(_el$5, "id", descriptionId);
|
|
459
|
+
insert(_el$5, () => local.description);
|
|
460
|
+
return _el$5;
|
|
461
|
+
}
|
|
462
|
+
}),
|
|
463
|
+
createComponent(Show, {
|
|
464
|
+
get when() {
|
|
465
|
+
return memo(() => !!state.isInvalid)() && local.errorMessage;
|
|
466
|
+
},
|
|
467
|
+
get children() {
|
|
468
|
+
var _el$6 = getNextElement(_tmpl$4);
|
|
469
|
+
setAttribute(_el$6, "id", errorMessageId);
|
|
470
|
+
insert(_el$6, () => local.errorMessage);
|
|
471
|
+
return _el$6;
|
|
472
|
+
}
|
|
473
|
+
})
|
|
474
|
+
];
|
|
475
|
+
const customLabelProps = () => ({
|
|
476
|
+
...domProps(),
|
|
477
|
+
...cleanLabelProps(),
|
|
478
|
+
...cleanHoverProps(),
|
|
479
|
+
ref: setLabelRef,
|
|
480
|
+
class: renderProps.class(),
|
|
481
|
+
style: renderProps.style(),
|
|
482
|
+
slot: local.slot,
|
|
483
|
+
onClick: handleLabelClick,
|
|
484
|
+
onClickCapture: handleLabelClickCapture,
|
|
485
|
+
"data-selected": radioAria.isSelected() || void 0,
|
|
486
|
+
"data-pressed": radioAria.isPressed() || void 0,
|
|
487
|
+
"data-hovered": isHovered() || void 0,
|
|
488
|
+
"data-focused": isFocused() || void 0,
|
|
489
|
+
"data-focus-visible": isFocusVisible() || void 0,
|
|
490
|
+
"data-disabled": radioAria.isDisabled || void 0,
|
|
491
|
+
"data-readonly": state.isReadOnly || void 0,
|
|
492
|
+
"data-invalid": state.isInvalid || void 0,
|
|
493
|
+
"data-required": state.isRequired || void 0,
|
|
494
|
+
children: labelChildren()
|
|
495
|
+
});
|
|
496
|
+
const labelCaptureProps = { onClickCapture: handleLabelClickCapture };
|
|
497
|
+
return createComponent(SelectionIndicatorContext.Provider, {
|
|
498
|
+
get value() {
|
|
499
|
+
return selectionIndicatorContext();
|
|
500
|
+
},
|
|
501
|
+
get children() {
|
|
502
|
+
return memo(() => !!local.render)() ? local.render(customLabelProps(), renderValues()) : (() => {
|
|
503
|
+
var _el$7 = getNextElement(_tmpl$5);
|
|
504
|
+
use(setLabelRef, _el$7);
|
|
505
|
+
spread(_el$7, mergeProps(domProps, cleanLabelProps, cleanHoverProps, {
|
|
506
|
+
get ["class"]() {
|
|
507
|
+
return renderProps.class();
|
|
508
|
+
},
|
|
509
|
+
get style() {
|
|
510
|
+
return renderProps.style();
|
|
511
|
+
},
|
|
512
|
+
get slot() {
|
|
513
|
+
return local.slot;
|
|
514
|
+
},
|
|
515
|
+
"onClick": handleLabelClick
|
|
516
|
+
}, labelCaptureProps, {
|
|
517
|
+
get ["data-selected"]() {
|
|
518
|
+
return radioAria.isSelected() || void 0;
|
|
519
|
+
},
|
|
520
|
+
get ["data-pressed"]() {
|
|
521
|
+
return radioAria.isPressed() || void 0;
|
|
522
|
+
},
|
|
523
|
+
get ["data-hovered"]() {
|
|
524
|
+
return isHovered() || void 0;
|
|
525
|
+
},
|
|
526
|
+
get ["data-focused"]() {
|
|
527
|
+
return isFocused() || void 0;
|
|
528
|
+
},
|
|
529
|
+
get ["data-focus-visible"]() {
|
|
530
|
+
return isFocusVisible() || void 0;
|
|
531
|
+
},
|
|
532
|
+
get ["data-disabled"]() {
|
|
533
|
+
return radioAria.isDisabled || void 0;
|
|
534
|
+
},
|
|
535
|
+
get ["data-readonly"]() {
|
|
536
|
+
return state.isReadOnly || void 0;
|
|
537
|
+
},
|
|
538
|
+
get ["data-invalid"]() {
|
|
539
|
+
return state.isInvalid || void 0;
|
|
540
|
+
},
|
|
541
|
+
get ["data-required"]() {
|
|
542
|
+
return state.isRequired || void 0;
|
|
543
|
+
}
|
|
544
|
+
}), false, true);
|
|
545
|
+
insert(_el$7, labelChildren);
|
|
546
|
+
runHydrationEvents();
|
|
547
|
+
return _el$7;
|
|
548
|
+
})();
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* A radio represents an individual option within a radio group.
|
|
554
|
+
*
|
|
555
|
+
* @example
|
|
556
|
+
* ```tsx
|
|
557
|
+
* <Radio value="option1">
|
|
558
|
+
* {({ isSelected }) => (
|
|
559
|
+
* <>
|
|
560
|
+
* <span class={`radio ${isSelected ? 'selected' : ''}`}>
|
|
561
|
+
* {isSelected && '●'}
|
|
562
|
+
* </span>
|
|
563
|
+
* <span>Option 1</span>
|
|
564
|
+
* </>
|
|
565
|
+
* )}
|
|
566
|
+
* </Radio>
|
|
567
|
+
* ```
|
|
568
|
+
*/
|
|
569
|
+
function Radio(props) {
|
|
570
|
+
const getState = createMemo(() => useContext(RadioGroupStateContext));
|
|
571
|
+
return createComponent(Show, {
|
|
572
|
+
get when() {
|
|
573
|
+
return getState();
|
|
574
|
+
},
|
|
575
|
+
fallback: null,
|
|
576
|
+
keyed: true,
|
|
577
|
+
children: (state) => createComponent(RadioImpl, {
|
|
578
|
+
radioProps: props,
|
|
579
|
+
state
|
|
580
|
+
})
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
const RadioFieldContext = createContext(null);
|
|
584
|
+
const InternalRadioContext = createContext(null);
|
|
585
|
+
/**
|
|
586
|
+
* A RadioField represents an individual option within a radio group, containing a
|
|
587
|
+
* `RadioButton` and optional description. Must be rendered inside a `RadioGroup`.
|
|
588
|
+
* Per-option help text is wired through a TextContext description slot — render it
|
|
589
|
+
* with `<Text slot="description">`. (Radios have no per-option error slot; errors
|
|
590
|
+
* are reported at the group level.)
|
|
591
|
+
*
|
|
592
|
+
* @example
|
|
593
|
+
* ```tsx
|
|
594
|
+
* <RadioGroup>
|
|
595
|
+
* <RadioField value="a">
|
|
596
|
+
* <RadioButton>Option A</RadioButton>
|
|
597
|
+
* <Text slot="description">The first option</Text>
|
|
598
|
+
* </RadioField>
|
|
599
|
+
* </RadioGroup>
|
|
600
|
+
* ```
|
|
601
|
+
*/
|
|
602
|
+
function RadioField(props) {
|
|
603
|
+
const getState = createMemo(() => useContext(RadioGroupStateContext));
|
|
604
|
+
return createComponent(Show, {
|
|
605
|
+
get when() {
|
|
606
|
+
return getState();
|
|
607
|
+
},
|
|
608
|
+
fallback: null,
|
|
609
|
+
keyed: true,
|
|
610
|
+
children: (state) => createComponent(RadioFieldImpl, {
|
|
611
|
+
fieldProps: props,
|
|
612
|
+
state
|
|
613
|
+
})
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
function RadioFieldImpl(props) {
|
|
617
|
+
const [inputElement, setInputElement] = createSignal(null);
|
|
618
|
+
const { state } = props;
|
|
619
|
+
const contextProps = useContext(RadioFieldContext);
|
|
620
|
+
const contextSlotProps = contextProps?.slots?.[props.fieldProps.slot ?? "default"];
|
|
621
|
+
const contextBaseProps = createMemo(() => {
|
|
622
|
+
if (!contextProps) return {};
|
|
623
|
+
const { slots: _slots, ...rest } = contextProps;
|
|
624
|
+
return rest;
|
|
625
|
+
});
|
|
626
|
+
const fieldProps = contextProps ? mergeProps$2(contextBaseProps(), contextSlotProps ?? {}, props.fieldProps) : props.fieldProps;
|
|
627
|
+
const inputRefs = createMemo(() => [
|
|
628
|
+
contextBaseProps().inputRef,
|
|
629
|
+
contextSlotProps?.inputRef,
|
|
630
|
+
props.fieldProps.inputRef
|
|
631
|
+
].filter(Boolean));
|
|
632
|
+
const [local, ariaProps] = splitProps(fieldProps, [
|
|
633
|
+
"class",
|
|
634
|
+
"style",
|
|
635
|
+
"ref",
|
|
636
|
+
"inputRef",
|
|
637
|
+
"slot",
|
|
638
|
+
"children"
|
|
639
|
+
]);
|
|
640
|
+
const inputAriaProps = createMemo(() => {
|
|
641
|
+
const clean = {};
|
|
642
|
+
for (const key in ariaProps) if (!key.startsWith("data-")) clean[key] = ariaProps[key];
|
|
643
|
+
return clean;
|
|
644
|
+
});
|
|
645
|
+
const radioAria = createRadio(() => ({
|
|
646
|
+
...inputAriaProps(),
|
|
647
|
+
children: true
|
|
648
|
+
}), state, inputElement);
|
|
649
|
+
const textSlots = { slots: { get description() {
|
|
650
|
+
return radioAria.descriptionProps;
|
|
651
|
+
} } };
|
|
652
|
+
const setInputRef = (el) => {
|
|
653
|
+
setInputElement(el);
|
|
654
|
+
el.addEventListener("invalid", (event) => {
|
|
655
|
+
state.updateValidation(getNativeValidation(el));
|
|
656
|
+
state.commitValidation();
|
|
657
|
+
el.focus();
|
|
658
|
+
event.preventDefault();
|
|
659
|
+
});
|
|
660
|
+
el.addEventListener("change", () => {
|
|
661
|
+
state.updateValidation(el.validity.valid ? validValidation : getNativeValidation(el));
|
|
662
|
+
state.commitValidation();
|
|
663
|
+
});
|
|
664
|
+
for (const ref of inputRefs()) assignRef(ref, el);
|
|
665
|
+
};
|
|
666
|
+
const setFieldRef = (el) => {
|
|
667
|
+
assignRef(local.ref, el);
|
|
668
|
+
};
|
|
669
|
+
const internalContext = {
|
|
670
|
+
isSelected: () => radioAria.isSelected(),
|
|
671
|
+
isPressed: () => radioAria.isPressed(),
|
|
672
|
+
isDisabled: () => radioAria.isDisabled,
|
|
673
|
+
labelProps: () => radioAria.labelProps,
|
|
674
|
+
inputProps: () => radioAria.inputProps,
|
|
675
|
+
setInputRef,
|
|
676
|
+
defaultClassName: "solidaria-RadioButton"
|
|
677
|
+
};
|
|
678
|
+
const selectionIndicatorContext = createMemo(() => ({ isSelected: radioAria.isSelected }));
|
|
679
|
+
const renderValues = createMemo(() => ({
|
|
680
|
+
isSelected: radioAria.isSelected(),
|
|
681
|
+
isDisabled: radioAria.isDisabled,
|
|
682
|
+
isReadOnly: state.isReadOnly,
|
|
683
|
+
isInvalid: state.isInvalid,
|
|
684
|
+
isRequired: state.isRequired
|
|
685
|
+
}));
|
|
686
|
+
const renderProps = useRenderProps({
|
|
687
|
+
children: fieldProps.children,
|
|
688
|
+
class: local.class,
|
|
689
|
+
style: local.style,
|
|
690
|
+
defaultClassName: "solidaria-RadioField"
|
|
691
|
+
}, renderValues);
|
|
692
|
+
const domProps = createMemo(() => {
|
|
693
|
+
const filtered = filterDOMProps(ariaProps, { global: true });
|
|
694
|
+
delete filtered.id;
|
|
695
|
+
delete filtered.onClick;
|
|
696
|
+
return filtered;
|
|
697
|
+
});
|
|
698
|
+
const FieldChildren = () => {
|
|
699
|
+
const childRenderValues = {
|
|
700
|
+
get isSelected() {
|
|
701
|
+
return radioAria.isSelected();
|
|
702
|
+
},
|
|
703
|
+
get isDisabled() {
|
|
704
|
+
return radioAria.isDisabled;
|
|
705
|
+
},
|
|
706
|
+
get isReadOnly() {
|
|
707
|
+
return state.isReadOnly;
|
|
708
|
+
},
|
|
709
|
+
get isInvalid() {
|
|
710
|
+
return state.isInvalid;
|
|
711
|
+
},
|
|
712
|
+
get isRequired() {
|
|
713
|
+
return state.isRequired;
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
return memo(createMemo(() => {
|
|
717
|
+
const children = fieldProps.children;
|
|
718
|
+
return typeof children === "function" ? children(childRenderValues) : children;
|
|
719
|
+
}));
|
|
720
|
+
};
|
|
721
|
+
return (() => {
|
|
722
|
+
var _el$8 = getNextElement(_tmpl$);
|
|
723
|
+
use(setFieldRef, _el$8);
|
|
724
|
+
spread(_el$8, mergeProps(domProps, {
|
|
725
|
+
get ["class"]() {
|
|
726
|
+
return renderProps.class();
|
|
727
|
+
},
|
|
728
|
+
get style() {
|
|
729
|
+
return renderProps.style();
|
|
730
|
+
},
|
|
731
|
+
get slot() {
|
|
732
|
+
return local.slot;
|
|
733
|
+
},
|
|
734
|
+
get ["data-selected"]() {
|
|
735
|
+
return radioAria.isSelected() || void 0;
|
|
736
|
+
},
|
|
737
|
+
get ["data-disabled"]() {
|
|
738
|
+
return radioAria.isDisabled || void 0;
|
|
739
|
+
},
|
|
740
|
+
get ["data-readonly"]() {
|
|
741
|
+
return state.isReadOnly || void 0;
|
|
742
|
+
},
|
|
743
|
+
get ["data-invalid"]() {
|
|
744
|
+
return state.isInvalid || void 0;
|
|
745
|
+
},
|
|
746
|
+
get ["data-required"]() {
|
|
747
|
+
return state.isRequired || void 0;
|
|
748
|
+
}
|
|
749
|
+
}), false, true);
|
|
750
|
+
insert(_el$8, createComponent(SelectionIndicatorContext.Provider, {
|
|
751
|
+
get value() {
|
|
752
|
+
return selectionIndicatorContext();
|
|
753
|
+
},
|
|
754
|
+
get children() {
|
|
755
|
+
return createComponent(InternalRadioContext.Provider, {
|
|
756
|
+
value: internalContext,
|
|
757
|
+
get children() {
|
|
758
|
+
return createComponent(Provider, {
|
|
759
|
+
values: [[TextContext, textSlots]],
|
|
760
|
+
get children() {
|
|
761
|
+
return createComponent(FieldChildren, {});
|
|
762
|
+
}
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
}));
|
|
768
|
+
runHydrationEvents();
|
|
769
|
+
return _el$8;
|
|
770
|
+
})();
|
|
771
|
+
}
|
|
772
|
+
/**
|
|
773
|
+
* A RadioButton is the clickable area of a radio, including the indicator and label.
|
|
774
|
+
* Must be rendered inside a `RadioField` (or the legacy `Radio`).
|
|
775
|
+
*/
|
|
776
|
+
function RadioButton(props) {
|
|
777
|
+
const getCtx = createMemo(() => useContext(InternalRadioContext));
|
|
778
|
+
const getState = createMemo(() => useContext(RadioGroupStateContext));
|
|
779
|
+
return createComponent(Show, {
|
|
780
|
+
get when() {
|
|
781
|
+
return getCtx();
|
|
782
|
+
},
|
|
783
|
+
fallback: null,
|
|
784
|
+
keyed: true,
|
|
785
|
+
children: (ctx) => createComponent(Show, {
|
|
786
|
+
get when() {
|
|
787
|
+
return getState();
|
|
788
|
+
},
|
|
789
|
+
fallback: null,
|
|
790
|
+
keyed: true,
|
|
791
|
+
children: (state) => createComponent(RadioButtonImpl, {
|
|
792
|
+
buttonProps: props,
|
|
793
|
+
ctx,
|
|
794
|
+
state
|
|
795
|
+
})
|
|
796
|
+
})
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
function RadioButtonImpl(props) {
|
|
800
|
+
const { ctx, state } = props;
|
|
801
|
+
const { isFocused, isFocusVisible, focusProps } = createFocusRing();
|
|
802
|
+
const { isHovered, hoverProps } = createHover({
|
|
803
|
+
get isDisabled() {
|
|
804
|
+
return ctx.isDisabled() || state.isReadOnly;
|
|
805
|
+
},
|
|
806
|
+
onHoverStart: props.buttonProps.onHoverStart,
|
|
807
|
+
onHoverEnd: props.buttonProps.onHoverEnd,
|
|
808
|
+
onHoverChange: props.buttonProps.onHoverChange
|
|
809
|
+
});
|
|
810
|
+
const renderValues = createMemo(() => ({
|
|
811
|
+
isSelected: ctx.isSelected(),
|
|
812
|
+
isHovered: isHovered(),
|
|
813
|
+
isPressed: ctx.isPressed(),
|
|
814
|
+
isFocused: isFocused(),
|
|
815
|
+
isFocusVisible: isFocusVisible(),
|
|
816
|
+
isDisabled: ctx.isDisabled(),
|
|
817
|
+
isReadOnly: state.isReadOnly,
|
|
818
|
+
isInvalid: state.isInvalid,
|
|
819
|
+
isRequired: state.isRequired
|
|
820
|
+
}));
|
|
821
|
+
const renderProps = useRenderProps({
|
|
822
|
+
children: props.buttonProps.children,
|
|
823
|
+
class: props.buttonProps.class,
|
|
824
|
+
style: props.buttonProps.style,
|
|
825
|
+
defaultClassName: ctx.defaultClassName
|
|
826
|
+
}, renderValues);
|
|
827
|
+
const cleanLabelProps = () => {
|
|
828
|
+
const { ref: _ref1, ...rest } = ctx.labelProps();
|
|
829
|
+
return rest;
|
|
830
|
+
};
|
|
831
|
+
const cleanHoverProps = () => {
|
|
832
|
+
const { ref: _ref2, ...rest } = hoverProps;
|
|
833
|
+
return rest;
|
|
834
|
+
};
|
|
835
|
+
const cleanInputProps = () => {
|
|
836
|
+
const { ref: _ref3, onFocus: _onFocus, onBlur: _onBlur, ...rest } = ctx.inputProps();
|
|
837
|
+
return rest;
|
|
838
|
+
};
|
|
839
|
+
const cleanFocusProps = () => {
|
|
840
|
+
const { ref: _ref4, onFocus: _onFocus, onBlur: _onBlur, ...rest } = focusProps;
|
|
841
|
+
return rest;
|
|
842
|
+
};
|
|
843
|
+
const handleInputFocus = (event) => {
|
|
844
|
+
ctx.inputProps().onFocus?.(event);
|
|
845
|
+
focusProps.onFocus?.(event);
|
|
846
|
+
};
|
|
847
|
+
const handleInputBlur = (event) => {
|
|
848
|
+
ctx.inputProps().onBlur?.(event);
|
|
849
|
+
focusProps.onBlur?.(event);
|
|
850
|
+
};
|
|
851
|
+
const handleInputClick = (event) => {
|
|
852
|
+
ctx.inputProps().onClick?.(event);
|
|
853
|
+
};
|
|
854
|
+
const handleInputInvalid = (event) => {
|
|
855
|
+
state.updateValidation(getNativeValidation(event.currentTarget));
|
|
856
|
+
state.commitValidation();
|
|
857
|
+
event.currentTarget.focus();
|
|
858
|
+
event.preventDefault();
|
|
859
|
+
};
|
|
860
|
+
const handleInputChange = (event) => {
|
|
861
|
+
ctx.inputProps().onChange?.(event);
|
|
862
|
+
state.updateValidation(event.currentTarget.validity.valid ? validValidation : getNativeValidation(event.currentTarget));
|
|
863
|
+
state.commitValidation();
|
|
864
|
+
};
|
|
865
|
+
const setButtonRef = (el) => {
|
|
866
|
+
assignRef(props.buttonProps.ref, el);
|
|
867
|
+
};
|
|
868
|
+
return (() => {
|
|
869
|
+
var _el$9 = getNextElement(_tmpl$6), _el$1 = _el$9.firstChild, [_el$10, _co$] = getNextMarker(_el$1.nextSibling), _el$11 = _el$10.nextSibling, [_el$12, _co$2] = getNextMarker(_el$11.nextSibling);
|
|
870
|
+
use(setButtonRef, _el$9);
|
|
871
|
+
spread(_el$9, mergeProps(cleanLabelProps, cleanHoverProps, {
|
|
872
|
+
get ["class"]() {
|
|
873
|
+
return renderProps.class();
|
|
874
|
+
},
|
|
875
|
+
get style() {
|
|
876
|
+
return renderProps.style();
|
|
877
|
+
},
|
|
878
|
+
get slot() {
|
|
879
|
+
return props.buttonProps.slot;
|
|
880
|
+
},
|
|
881
|
+
get ["data-selected"]() {
|
|
882
|
+
return ctx.isSelected() || void 0;
|
|
883
|
+
},
|
|
884
|
+
get ["data-pressed"]() {
|
|
885
|
+
return ctx.isPressed() || void 0;
|
|
886
|
+
},
|
|
887
|
+
get ["data-hovered"]() {
|
|
888
|
+
return isHovered() || void 0;
|
|
889
|
+
},
|
|
890
|
+
get ["data-focused"]() {
|
|
891
|
+
return isFocused() || void 0;
|
|
892
|
+
},
|
|
893
|
+
get ["data-focus-visible"]() {
|
|
894
|
+
return isFocusVisible() || void 0;
|
|
895
|
+
},
|
|
896
|
+
get ["data-disabled"]() {
|
|
897
|
+
return ctx.isDisabled() || void 0;
|
|
898
|
+
},
|
|
899
|
+
get ["data-readonly"]() {
|
|
900
|
+
return state.isReadOnly || void 0;
|
|
901
|
+
},
|
|
902
|
+
get ["data-invalid"]() {
|
|
903
|
+
return state.isInvalid || void 0;
|
|
904
|
+
},
|
|
905
|
+
get ["data-required"]() {
|
|
906
|
+
return state.isRequired || void 0;
|
|
907
|
+
}
|
|
908
|
+
}), false, true);
|
|
909
|
+
insert(_el$9, createComponent(VisuallyHidden, { get children() {
|
|
910
|
+
var _el$0 = getNextElement(_tmpl$2);
|
|
911
|
+
var _ref$ = ctx.setInputRef;
|
|
912
|
+
typeof _ref$ === "function" ? use(_ref$, _el$0) : ctx.setInputRef = _el$0;
|
|
913
|
+
spread(_el$0, mergeProps(cleanInputProps, cleanFocusProps, {
|
|
914
|
+
"onFocus": handleInputFocus,
|
|
915
|
+
"onBlur": handleInputBlur,
|
|
916
|
+
"onInvalid": handleInputInvalid,
|
|
917
|
+
"onChange": handleInputChange,
|
|
918
|
+
"onClick": handleInputClick
|
|
919
|
+
}), false, false);
|
|
920
|
+
runHydrationEvents();
|
|
921
|
+
return _el$0;
|
|
922
|
+
} }), _el$10, _co$);
|
|
923
|
+
insert(_el$9, () => renderProps.renderChildren(), _el$12, _co$2);
|
|
924
|
+
runHydrationEvents();
|
|
925
|
+
return _el$9;
|
|
926
|
+
})();
|
|
927
|
+
}
|
|
928
|
+
//#endregion
|
|
929
|
+
export { Radio, RadioButton, RadioContext, RadioField, RadioFieldContext, RadioGroup, RadioGroupContext, RadioGroupStateContext };
|
|
930
|
+
|
|
931
|
+
//# sourceMappingURL=RadioGroup.js.map
|