@kobalte/core
Version:
Unstyled components and primitives for building accessible web apps and design systems with SolidJS.
284 lines (274 loc) • 7.27 kB
JSX
import {
ToggleButtonRoot
} from "./WAUM5GOD.jsx";
import {
TabsKeyboardDelegate
} from "./XTJD7L6B.jsx";
import {
createListState,
createSelectableCollection,
createSelectableItem
} from "./QZDH5R5B.jsx";
import {
createDomCollection,
createDomCollectionItem
} from "./SOM3K36D.jsx";
import {
useLocale
} from "./LR7LBJN3.jsx";
import {
Polymorphic
} from "./FLVHQV4A.jsx";
import {
__export
} from "./5WXHJDCZ.jsx";
// src/toggle-group/index.tsx
var toggle_group_exports = {};
__export(toggle_group_exports, {
Item: () => ToggleGroupItem,
Root: () => ToggleGroup,
ToggleGroup: () => ToggleGroup2,
useToggleGroupContext: () => useToggleGroupContext
});
// src/toggle-group/toggle-group-item.tsx
import {
callHandler,
composeEventHandlers,
mergeDefaultProps,
mergeRefs
} from "@kobalte/utils";
import {
createUniqueId,
splitProps
} from "solid-js";
// src/toggle-group/toggle-group-context.tsx
import { createContext, useContext } from "solid-js";
var ToggleGroupContext = createContext();
function useToggleGroupContext() {
const context = useContext(ToggleGroupContext);
if (context === void 0) {
throw new Error(
"[kobalte]: `useToggleGroupContext` must be used within a `ToggleGroup` component"
);
}
return context;
}
// src/toggle-group/toggle-group-item.tsx
function ToggleGroupItem(props) {
let ref;
const rootContext = useToggleGroupContext();
const defaultID = rootContext.generateId(`item-${createUniqueId()}`);
const mergedProps = mergeDefaultProps(
{
id: defaultID
},
props
);
const [local, others] = splitProps(mergedProps, [
"ref",
"value",
"disabled",
"onPointerDown",
"onPointerUp",
"onClick",
"onKeyDown",
"onMouseDown",
"onFocus"
]);
const selectionManager = () => rootContext.listState().selectionManager();
const isDisabled = () => rootContext.isDisabled() || local.disabled;
createDomCollectionItem({
getItem: () => ({
ref: () => ref,
type: "item",
key: local.value,
textValue: "",
disabled: local.disabled || rootContext.isDisabled()
})
});
const selectableItem = createSelectableItem(
{
key: () => local.value,
selectionManager,
disabled: isDisabled
},
() => ref
);
const onKeyDown = (e) => {
if (["Enter", " "].includes(e.key)) {
e.preventDefault();
}
callHandler(e, local.onKeyDown);
callHandler(e, selectableItem.onKeyDown);
};
return <ToggleButtonRoot
ref={mergeRefs((el) => ref = el, local.ref)}
pressed={selectionManager().isSelected(local.value)}
tabIndex={selectableItem.tabIndex()}
data-orientation={rootContext.orientation()}
disabled={isDisabled()}
onPointerDown={composeEventHandlers([
local.onPointerDown,
selectableItem.onPointerDown
])}
onPointerUp={composeEventHandlers([
local.onPointerUp,
selectableItem.onPointerUp
])}
onClick={composeEventHandlers([local.onClick, selectableItem.onClick])}
onKeyDown={onKeyDown}
onMouseDown={composeEventHandlers([
local.onMouseDown,
selectableItem.onMouseDown
])}
onFocus={composeEventHandlers([local.onFocus, selectableItem.onFocus])}
{...others}
/>;
}
// src/toggle-group/toggle-group-root.tsx
import {
createMemo,
splitProps as splitProps3
} from "solid-js";
// src/toggle-group/toggle-group-base.tsx
import {
composeEventHandlers as composeEventHandlers2,
createGenerateId,
mergeDefaultProps as mergeDefaultProps2,
mergeRefs as mergeRefs2
} from "@kobalte/utils";
import {
createSignal,
createUniqueId as createUniqueId2,
splitProps as splitProps2
} from "solid-js";
function ToggleGroupBase(props) {
let ref;
const defaultId = `group-${createUniqueId2()}`;
const mergedProps = mergeDefaultProps2(
{
id: defaultId,
selectionMode: "single",
orientation: "horizontal"
},
props
);
const [local, others] = splitProps2(mergedProps, [
"ref",
"value",
"defaultValue",
"disabled",
"orientation",
"selectionMode",
"onChange",
"onKeyDown",
"onMouseDown",
"onFocusIn",
"onFocusOut"
]);
const [items, setItems] = createSignal([]);
const { DomCollectionProvider } = createDomCollection({
items,
onItemsChange: setItems
});
const listState = createListState({
selectedKeys: () => local.value,
defaultSelectedKeys: () => local.defaultValue,
onSelectionChange: (key) => local.onChange?.(Array.from(key)),
disallowEmptySelection: false,
selectionMode: () => local.selectionMode,
dataSource: items
});
const { direction } = useLocale();
const delegate = new TabsKeyboardDelegate(
() => context.listState().collection(),
direction,
() => local.orientation
);
const selectableList = createSelectableCollection(
{
selectionManager: () => listState.selectionManager(),
keyboardDelegate: () => delegate,
disallowEmptySelection: () => listState.selectionManager().disallowEmptySelection(),
disallowTypeAhead: true
},
() => ref
);
const context = {
listState: () => listState,
isDisabled: () => local.disabled ?? false,
isMultiple: () => local.selectionMode === "multiple",
generateId: createGenerateId(() => others.id),
orientation: () => local.orientation
};
return <DomCollectionProvider><ToggleGroupContext.Provider value={context}><Polymorphic
as="div"
role="group"
ref={mergeRefs2((el) => ref = el, local.ref)}
tabIndex={!local.disabled ? selectableList.tabIndex() : void 0}
data-orientation={local.orientation}
onKeyDown={composeEventHandlers2([
local.onKeyDown,
selectableList.onKeyDown
])}
onMouseDown={composeEventHandlers2([
local.onMouseDown,
selectableList.onMouseDown
])}
onFocusIn={composeEventHandlers2([
local.onFocusIn,
selectableList.onFocusIn
])}
onFocusOut={composeEventHandlers2([
local.onFocusOut,
selectableList.onFocusOut
])}
{...others}
/></ToggleGroupContext.Provider></DomCollectionProvider>;
}
// src/toggle-group/toggle-group-root.tsx
function ToggleGroup(props) {
const [local, others] = splitProps3(props, [
"value",
"defaultValue",
"onChange",
"multiple"
]);
const value = createMemo(() => {
if (local.value != null) {
return local.multiple ? local.value : [local.value];
}
return local.value;
});
const defaultValue = createMemo(() => {
if (local.defaultValue != null) {
return local.multiple ? local.defaultValue : [local.defaultValue];
}
return local.defaultValue;
});
const onChange = (value2) => {
if (local.multiple) {
local.onChange?.(value2);
} else {
local.onChange?.(value2[0] ?? null);
}
};
return <ToggleGroupBase
value={value()}
defaultValue={defaultValue()}
onChange={onChange}
selectionMode={local.multiple ? "multiple" : "single"}
{...others}
/>;
}
// src/toggle-group/index.tsx
var ToggleGroup2 = Object.assign(ToggleGroup, {
Item: ToggleGroupItem
});
export {
useToggleGroupContext,
ToggleGroupItem,
ToggleGroup,
ToggleGroup2,
toggle_group_exports
};