@spark-ui/components
Version:
Spark (Leboncoin design system) components.
461 lines (441 loc) • 16.2 kB
JavaScript
"use strict";
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/accordion/index.ts
var accordion_exports = {};
__export(accordion_exports, {
Accordion: () => Accordion2
});
module.exports = __toCommonJS(accordion_exports);
// src/accordion/Accordion.tsx
var accordion = __toESM(require("@zag-js/accordion"));
var import_react2 = require("@zag-js/react");
var import_class_variance_authority = require("class-variance-authority");
var import_react3 = require("react");
// src/slot/Slot.tsx
var import_radix_ui = require("radix-ui");
var import_react = require("react");
var import_jsx_runtime = require("react/jsx-runtime");
var Slottable = import_radix_ui.Slot.Slottable;
var Slot = ({ ref, ...props }) => {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_radix_ui.Slot.Root, { ref, ...props });
};
// src/accordion/Accordion.tsx
var import_jsx_runtime2 = require("react/jsx-runtime");
var AccordionContext = (0, import_react3.createContext)(null);
var Accordion = ({
asChild = false,
children,
collapsible: collapsible2 = true,
className,
defaultValue,
design = "outlined",
disabled = false,
multiple = false,
value,
onValueChange,
ref,
...props
}) => {
const [machineProps, localProps] = accordion.splitProps({
children,
multiple,
collapsible: collapsible2,
value,
disabled,
className: (0, import_class_variance_authority.cx)("bg-surface rounded-lg h-fit", className),
...props
});
const service = (0, import_react2.useMachine)(accordion.machine, {
...machineProps,
defaultValue,
value,
id: (0, import_react3.useId)(),
onValueChange(details) {
onValueChange?.(details.value);
}
});
const Component = asChild ? Slot : "div";
const api = accordion.connect(service, import_react2.normalizeProps);
const mergedProps = (0, import_react2.mergeProps)(api.getRootProps(), localProps);
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AccordionContext.Provider, { value: { ...api, design }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Component, { "data-spark-component": "accordion", ref, ...mergedProps, children }) });
};
Accordion.displayName = "Accordion";
var useAccordionContext = () => {
const context = (0, import_react3.useContext)(AccordionContext);
if (!context) {
throw Error("useAccordionContext must be used within a Accordion provider");
}
return context;
};
// src/accordion/AccordionItem.tsx
var import_react9 = require("@zag-js/react");
var import_class_variance_authority3 = require("class-variance-authority");
// src/collapsible/Collapsible.tsx
var collapsible = __toESM(require("@zag-js/collapsible"));
var import_react4 = require("@zag-js/react");
var import_react5 = require("react");
var import_jsx_runtime3 = require("react/jsx-runtime");
var CollapsibleContext = (0, import_react5.createContext)(null);
var Collapsible = ({
asChild = false,
children,
defaultOpen = false,
disabled = false,
onOpenChange,
open,
ids,
ref,
...props
}) => {
const service = (0, import_react4.useMachine)(collapsible.machine, {
open,
defaultOpen,
disabled,
id: (0, import_react5.useId)(),
ids,
onOpenChange(details) {
onOpenChange?.(details.open);
}
});
const api = collapsible.connect(service, import_react4.normalizeProps);
const Component = asChild ? Slot : "div";
const mergedProps = (0, import_react4.mergeProps)(api.getRootProps(), props);
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CollapsibleContext.Provider, { value: api, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Component, { "data-spark-component": "collapsible", ref, ...mergedProps, children }) });
};
Collapsible.displayName = "Collapsible";
var useCollapsibleContext = () => {
const context = (0, import_react5.useContext)(CollapsibleContext);
if (!context) {
throw Error("useCollapsibleContext must be used within a Collapsible provider");
}
return context;
};
// src/collapsible/CollapsibleContent.tsx
var import_react6 = require("@zag-js/react");
var import_class_variance_authority2 = require("class-variance-authority");
var import_jsx_runtime4 = require("react/jsx-runtime");
var Content = ({
asChild = false,
className,
children,
ref,
...props
}) => {
const { getContentProps } = useCollapsibleContext();
const Component = asChild ? Slot : "div";
const contentProps = getContentProps();
const mergedProps = (0, import_react6.mergeProps)(contentProps, {
className: (0, import_class_variance_authority2.cx)(
"overflow-hidden",
"motion-reduce:animate-none!",
"[&[hidden]]:hidden",
"data-[state=open]:animate-standalone-collapse-in data-[state=closed]:animate-standalone-collapse-out",
className
),
...props
});
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Component, { ref, "data-spark-component": "collapsible-content", ...mergedProps, children });
};
Content.displayName = "Collapsible.Content";
// src/collapsible/CollapsibleTrigger.tsx
var import_react7 = require("@zag-js/react");
var import_jsx_runtime5 = require("react/jsx-runtime");
var Trigger = ({ asChild = false, children, ref, ...props }) => {
const collapsibleContext = useCollapsibleContext();
const Component = asChild ? Slot : "button";
const mergedProps = (0, import_react7.mergeProps)(collapsibleContext.getTriggerProps(), props);
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Component, { ref, "data-spark-component": "collapsible-trigger", ...mergedProps, children });
};
Trigger.displayName = "Collapsible.Trigger";
// src/collapsible/index.ts
var Collapsible2 = Object.assign(Collapsible, {
Trigger,
Content
});
Collapsible2.displayName = "Collapsible";
Trigger.displayName = "Collapsible.Trigger";
Content.displayName = "Collapsible.Content";
// src/accordion/AccordionItemContext.tsx
var import_react8 = require("react");
var import_jsx_runtime6 = require("react/jsx-runtime");
var AccordionItemContext = (0, import_react8.createContext)(null);
var AccordionItemProvider = ({
value: valueProp,
disabled: disabledProp = false,
children
}) => {
const [value, setValue] = (0, import_react8.useState)(valueProp);
const [disabled, setDisabled] = (0, import_react8.useState)(disabledProp);
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AccordionItemContext.Provider, { value: { value, setValue, disabled, setDisabled }, children });
};
var useAccordionItemContext = () => {
const context = (0, import_react8.useContext)(AccordionItemContext);
if (!context) {
throw Error("useAccordionItemContext must be used within a AccordionItem provider");
}
return context;
};
// src/accordion/AccordionItem.tsx
var import_jsx_runtime7 = require("react/jsx-runtime");
var Item = ({
asChild = false,
className,
children,
disabled = false,
value,
ref,
...props
}) => {
const accordion2 = useAccordionContext();
const localProps = {
className: (0, import_class_variance_authority3.cx)(
"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 = (0, import_react9.mergeProps)(itemProps, localProps);
const item = accordion2.getItemState({ value });
const itemContentProps = accordion2.getItemContentProps({ value });
return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(AccordionItemProvider, { value, disabled, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
Collapsible2,
{
ref,
open: item.expanded,
"data-spark-component": "accordion-item",
ids: { content: itemContentProps.id },
...mergedProps,
children
}
) });
};
Item.displayName = "Accordion.Item";
// src/accordion/AccordionItemContent.tsx
var import_internal_utils = require("@spark-ui/internal-utils");
var import_react10 = require("@zag-js/react");
var import_class_variance_authority4 = require("class-variance-authority");
var import_jsx_runtime8 = require("react/jsx-runtime");
var splitVisibilityProps = (0, import_internal_utils.createSplitProps)();
var ItemContent = ({
asChild = false,
className,
children,
ref,
...props
}) => {
const accordion2 = useAccordionContext();
const accordionItem = useAccordionItemContext();
const localProps = {
className: (0, import_class_variance_authority4.cx)("[&>: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 = (0, import_react10.mergeProps)(itemContentProps, localProps);
return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Collapsible2.Content, { ref, "data-spark-component": "accordion-item-content", ...mergedProps, children });
};
ItemContent.displayName = "Accordion.ItemContent";
// src/accordion/AccordionItemHeader.tsx
var import_class_variance_authority5 = require("class-variance-authority");
var import_jsx_runtime9 = require("react/jsx-runtime");
var ItemHeader = ({
asChild = false,
children,
className,
ref
}) => {
const Component = asChild ? Slot : "h3";
return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
Component,
{
ref,
"data-spark-component": "accordion-item-header",
className: (0, import_class_variance_authority5.cx)("rounded-[inherit]", className),
children
}
);
};
ItemHeader.displayName = "Accordion.ItemHeader";
// src/accordion/AccordionItemTrigger.tsx
var import_ArrowHorizontalDown = require("@spark-ui/icons/ArrowHorizontalDown");
var import_react12 = require("@zag-js/react");
var import_class_variance_authority7 = require("class-variance-authority");
// src/icon/Icon.tsx
var import_react11 = require("react");
// src/visually-hidden/VisuallyHidden.tsx
var import_jsx_runtime10 = require("react/jsx-runtime");
var VisuallyHidden = ({ asChild = false, ref, ...props }) => {
const Component = asChild ? Slot : "span";
return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
Component,
{
...props,
ref,
style: {
// See: https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss
position: "absolute",
border: 0,
width: 1,
height: 1,
padding: 0,
margin: -1,
overflow: "hidden",
clip: "rect(0, 0, 0, 0)",
whiteSpace: "nowrap",
wordWrap: "normal",
...props.style
}
}
);
};
VisuallyHidden.displayName = "VisuallyHidden";
// src/icon/Icon.styles.tsx
var import_internal_utils2 = require("@spark-ui/internal-utils");
var import_class_variance_authority6 = require("class-variance-authority");
var iconStyles = (0, import_class_variance_authority6.cva)(["fill-current shrink-0"], {
variants: {
/**
* Color scheme of the icon.
*/
intent: (0, import_internal_utils2.makeVariants)({
current: ["text-current"],
main: ["text-main"],
support: ["text-support"],
accent: ["text-accent"],
basic: ["text-basic"],
success: ["text-success"],
alert: ["text-alert"],
error: ["text-error"],
info: ["text-info"],
neutral: ["text-neutral"]
}),
/**
* Sets the size of the icon.
*/
size: (0, import_internal_utils2.makeVariants)({
current: ["u-current-font-size"],
sm: ["w-sz-16", "h-sz-16"],
md: ["w-sz-24", "h-sz-24"],
lg: ["w-sz-32", "h-sz-32"],
xl: ["w-sz-40", "h-sz-40"]
})
}
});
// src/icon/Icon.tsx
var import_jsx_runtime11 = require("react/jsx-runtime");
var Icon = ({
label,
className,
size = "current",
intent = "current",
children,
...others
}) => {
const child = import_react11.Children.only(children);
return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
(0, import_react11.cloneElement)(child, {
className: iconStyles({ className, size, intent }),
"data-spark-component": "icon",
"aria-hidden": "true",
focusable: "false",
...others
}),
label && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(VisuallyHidden, { children: label })
] });
};
Icon.displayName = "Icon";
// src/accordion/AccordionItemTrigger.tsx
var import_jsx_runtime12 = require("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: (0, import_class_variance_authority7.cx)(
"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 = (0, import_react12.mergeProps)(
getItemTriggerProps({ value, ...disabled && { disabled } }),
localProps
);
const isOpen = !!mergedProps["aria-expanded"];
return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(Component, { ref, "data-spark-component": "accordion-item-trigger", ...mergedProps, children: [
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "gap-lg flex grow items-center", children }),
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
Icon,
{
intent: "neutral",
className: (0, import_class_variance_authority7.cx)("shrink-0 rotate-0 duration-100 ease-in motion-reduce:transition-none", {
"rotate-180": isOpen
}),
size: "sm",
children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_ArrowHorizontalDown.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";
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
Accordion
});
//# sourceMappingURL=index.js.map