UNPKG

@spark-ui/components

Version:

Spark (Leboncoin design system) components.

249 lines (241 loc) 7.69 kB
import { Collapsible } from "../chunk-3LEFXZNI.mjs"; import { Icon } from "../chunk-UMUMFMFB.mjs"; import "../chunk-KEGAAGJW.mjs"; import { Slot } from "../chunk-6QCEPQ3U.mjs"; // src/accordion/Accordion.tsx import * as accordion from "@zag-js/accordion"; import { mergeProps, normalizeProps, useMachine } from "@zag-js/react"; import { cx } from "class-variance-authority"; import { createContext, useContext, useId } from "react"; import { jsx } from "react/jsx-runtime"; var AccordionContext = createContext(null); var Accordion = ({ asChild = false, children, collapsible = true, className, defaultValue, design = "outlined", disabled = false, multiple = false, value, onValueChange, ref, ...props }) => { const [machineProps, localProps] = accordion.splitProps({ children, multiple, collapsible, value, disabled, className: cx("bg-surface rounded-lg h-fit", className), ...props }); const service = useMachine(accordion.machine, { ...machineProps, defaultValue, value, id: useId(), onValueChange(details) { onValueChange?.(details.value); } }); const Component = asChild ? Slot : "div"; const api = accordion.connect(service, normalizeProps); const mergedProps = mergeProps(api.getRootProps(), localProps); return /* @__PURE__ */ jsx(AccordionContext.Provider, { value: { ...api, design }, children: /* @__PURE__ */ jsx(Component, { "data-spark-component": "accordion", ref, ...mergedProps, children }) }); }; Accordion.displayName = "Accordion"; var useAccordionContext = () => { const context = useContext(AccordionContext); if (!context) { throw Error("useAccordionContext must be used within a Accordion provider"); } return context; }; // src/accordion/AccordionItem.tsx import { mergeProps as mergeProps2 } from "@zag-js/react"; import { cx as cx2 } from "class-variance-authority"; // src/accordion/AccordionItemContext.tsx import { createContext as createContext2, useContext as useContext2, useState } from "react"; import { jsx as jsx2 } from "react/jsx-runtime"; var AccordionItemContext = createContext2(null); var AccordionItemProvider = ({ value: valueProp, disabled: disabledProp = false, children }) => { const [value, setValue] = useState(valueProp); const [disabled, setDisabled] = useState(disabledProp); return /* @__PURE__ */ jsx2(AccordionItemContext.Provider, { value: { value, setValue, disabled, setDisabled }, children }); }; var useAccordionItemContext = () => { const context = useContext2(AccordionItemContext); if (!context) { throw Error("useAccordionItemContext must be used within a AccordionItem provider"); } return context; }; // src/accordion/AccordionItem.tsx import { jsx as jsx3 } from "react/jsx-runtime"; var Item = ({ asChild = false, className, children, disabled = false, value, ref, ...props }) => { const accordion2 = useAccordionContext(); const localProps = { className: cx2( "relative first:rounded-t-lg last:rounded-b-lg", "not-last:border-b-0", { "border-sm border-outline": accordion2.design === "outlined" }, className ), asChild, ...props }; const itemProps = accordion2.getItemProps({ value, ...disabled && { disabled } }); const mergedProps = mergeProps2(itemProps, localProps); const item = accordion2.getItemState({ value }); const itemContentProps = accordion2.getItemContentProps({ value }); return /* @__PURE__ */ jsx3(AccordionItemProvider, { value, disabled, children: /* @__PURE__ */ jsx3( Collapsible, { ref, open: item.expanded, "data-spark-component": "accordion-item", ids: { content: itemContentProps.id }, ...mergedProps, children } ) }); }; Item.displayName = "Accordion.Item"; // src/accordion/AccordionItemContent.tsx import { createSplitProps } from "@spark-ui/internal-utils"; import { mergeProps as mergeProps3 } from "@zag-js/react"; import { cx as cx3 } from "class-variance-authority"; import { jsx as jsx4 } from "react/jsx-runtime"; var splitVisibilityProps = createSplitProps(); var ItemContent = ({ asChild = false, className, children, ref, ...props }) => { const accordion2 = useAccordionContext(); const accordionItem = useAccordionItemContext(); const localProps = { className: cx3("[&>:first-child]:p-lg", "text-body-1 text-on-surface", className), asChild, ...props }; const contentProps = accordion2.getItemContentProps({ value: accordionItem.value, ...accordionItem.disabled && { disabled: accordionItem.disabled } }); const [, itemContentProps] = splitVisibilityProps(contentProps, ["hidden", "data-state"]); const mergedProps = mergeProps3(itemContentProps, localProps); return /* @__PURE__ */ jsx4(Collapsible.Content, { ref, "data-spark-component": "accordion-item-content", ...mergedProps, children }); }; ItemContent.displayName = "Accordion.ItemContent"; // src/accordion/AccordionItemHeader.tsx import { cx as cx4 } from "class-variance-authority"; import { jsx as jsx5 } from "react/jsx-runtime"; var ItemHeader = ({ asChild = false, children, className, ref }) => { const Component = asChild ? Slot : "h3"; return /* @__PURE__ */ jsx5( Component, { ref, "data-spark-component": "accordion-item-header", className: cx4("rounded-[inherit]", className), children } ); }; ItemHeader.displayName = "Accordion.ItemHeader"; // src/accordion/AccordionItemTrigger.tsx import { ArrowHorizontalDown } from "@spark-ui/icons/ArrowHorizontalDown"; import { mergeProps as mergeProps4 } from "@zag-js/react"; import { cx as cx5 } from "class-variance-authority"; import { jsx as jsx6, jsxs } from "react/jsx-runtime"; var ItemTrigger = ({ asChild = false, children, className, ref, ...props }) => { const { getItemTriggerProps } = useAccordionContext(); const { value, disabled } = useAccordionItemContext(); const Component = asChild ? Slot : "button"; const localProps = { ...props, className: cx5( "relative flex gap-lg justify-between items-center min-h-sz-48", "w-full px-lg py-md text-left text-headline-2 text-on-surface rounded-[inherit] data-[state=open]:rounded-b-0", "hover:enabled:bg-surface-hovered focus:bg-surface-hovered", "focus-visible:u-outline focus-visible:outline-hidden focus-visible:z-raised", "disabled:opacity-dim-3 cursor-pointer disabled:cursor-not-allowed", className ) }; const mergedProps = mergeProps4( getItemTriggerProps({ value, ...disabled && { disabled } }), localProps ); const isOpen = !!mergedProps["aria-expanded"]; return /* @__PURE__ */ jsxs(Component, { ref, "data-spark-component": "accordion-item-trigger", ...mergedProps, children: [ /* @__PURE__ */ jsx6("div", { className: "gap-lg flex grow items-center", children }), /* @__PURE__ */ jsx6( Icon, { intent: "neutral", className: cx5("shrink-0 rotate-0 duration-100 ease-in motion-reduce:transition-none", { "rotate-180": isOpen }), size: "sm", children: /* @__PURE__ */ jsx6(ArrowHorizontalDown, {}) } ) ] }); }; ItemTrigger.displayName = "Accordion.ItemTrigger"; // src/accordion/index.ts var Accordion2 = Object.assign(Accordion, { Item, ItemHeader, ItemTrigger, ItemContent }); Accordion2.displayName = "Accordion"; Item.displayName = "Item"; ItemHeader.displayName = "ItemHeader"; ItemTrigger.displayName = "Accordion.Trigger"; ItemContent.displayName = "Accordion.Content"; export { Accordion2 as Accordion }; //# sourceMappingURL=index.mjs.map