@cerberus-design/react
Version:
The Cerberus Design React component library.
1 lines • 18.5 kB
Source Map (JSON)
{"version":3,"sources":["../../../../src/components/carousel/index.ts","../../../../src/components/carousel/primitives.ts","../../../../src/system/primitive-factory.tsx","../../../../src/system/index.ts","../../../../src/components/carousel/parts.ts","../../../../src/components/show/show.tsx","../../../../src/components/for/for.tsx","../../../../src/components/carousel/carousel.tsx"],"sourcesContent":["export * from './parts'\nexport * from './primitives'\nexport * from './carousel'\n","import {\n Carousel,\n type CarouselRootProps as ArkRootProps,\n type CarouselControlProps as ArkControlProps,\n type CarouselPrevTriggerProps as ArkPrevTriggerProps,\n type CarouselNextTriggerProps as ArkNextTriggerProps,\n type CarouselIndicatorGroupProps as ArkIndicatorGroupProps,\n type CarouselIndicatorProps as ArkIndicatorProps,\n type CarouselItemGroupProps as ArkItemGroupProps,\n type CarouselItemProps as ArkItemProps,\n} from '@ark-ui/react/carousel'\nimport { carousel, type CarouselVariantProps } from 'styled-system/recipes'\nimport { createCerberusPrimitive } from '../../system/index'\n\n/**\n * This module contains the carousel primitives.\n * @module carousel/primitives\n */\n\nconst { withSlotRecipe } = createCerberusPrimitive(carousel)\n\n// Primitives\n\nexport type CarouselRootProps = CarouselVariantProps & ArkRootProps\nexport const CarouselRoot = withSlotRecipe(Carousel.Root, 'root')\n\nexport type CarouselControlProps = CarouselVariantProps & ArkControlProps\nexport const CarouselControl = withSlotRecipe(Carousel.Control, 'control')\n\nexport type CarouselPrevTriggerProps = CarouselVariantProps &\n ArkPrevTriggerProps\nexport const CarouselPrevTrigger = withSlotRecipe(\n Carousel.PrevTrigger,\n 'prevTrigger',\n)\n\nexport type CarouselNextTriggerProps = CarouselVariantProps &\n ArkNextTriggerProps\nexport const CarouselNextTrigger = withSlotRecipe(\n Carousel.NextTrigger,\n 'nextTrigger',\n)\n\nexport type CarouselIndicatorGroupProps = CarouselVariantProps &\n ArkIndicatorGroupProps\nexport const CarouselIndicatorGroup = withSlotRecipe(\n Carousel.IndicatorGroup,\n 'indicatorGroup',\n)\n\nexport type CarouselIndicatorProps = CarouselVariantProps & ArkIndicatorProps\nexport const CarouselIndicator = withSlotRecipe(Carousel.Indicator, 'indicator')\n\nexport type CarouselItemGroupProps = CarouselVariantProps & ArkItemGroupProps\nexport const CarouselItemGroup = withSlotRecipe(Carousel.ItemGroup, 'itemGroup')\n\nexport type CarouselItemProps = CarouselVariantProps & ArkItemProps\nexport const CarouselItem = withSlotRecipe(Carousel.Item, 'item')\n","import { css, cx } from 'styled-system/css'\nimport type { RecipeVariantRecord } from 'styled-system/types'\nimport {\n type ComponentType,\n type ElementType,\n type HTMLAttributes,\n type PropsWithChildren,\n} from 'react'\nimport type { WithCss } from '../types'\nimport type {\n CerberusPrimitiveEl,\n CerberusPrimitiveRecipe,\n CerberusRecipe,\n CerberusSlotRecipe,\n WithRecipeOptions,\n} from './types'\n\n/**\n * This module contains a factory for creating Cerberus primitives.\n * @module @cerberus/core/system/factory\n */\n\nexport class CerberusPrimitive {\n recipe: CerberusPrimitiveRecipe | null\n\n constructor(recipe?: CerberusPrimitiveRecipe) {\n this.recipe = recipe ?? null\n }\n\n private hasStyles(styles: string | undefined): Record<string, unknown> {\n if (styles) {\n return {\n className: styles,\n }\n }\n return {}\n }\n\n private validateComponent<P extends HTMLAttributes<unknown>>(\n Component: ComponentType<P> | string,\n ) {\n if (typeof Component !== 'function' && typeof Component !== 'object') {\n return false\n }\n return true\n }\n\n /**\n * Creates a Cerberus component with bare features and no recipe.\n * @param Component - The React component to enhance with Cerberus features.\n * Can be a string or a component reference.\n * @returns A new React component that applies Cerberus features to the\n * original component.\n *\n * @example\n * ```ts\n * const { withNoRecipe } = createCerberusPrimitive(buttonRecipe)\n * const Button = withNoRecipe('button')\n * ```\n */\n withNoRecipe = <P extends HTMLAttributes<unknown>>(\n Component: ComponentType<P> | string,\n options?: WithRecipeOptions,\n ): CerberusPrimitiveEl<P> => {\n const { defaultProps } = options || {}\n const El = Component as ComponentType<P> | ElementType\n\n const CerbComponent = (props: PropsWithChildren<P> & WithCss) => {\n const { css: customCss, className, ...nativeProps } = props\n const styles = this.hasStyles(cx(className, css(customCss)))\n return <El {...defaultProps} {...styles} {...(nativeProps as P)} />\n }\n\n if (this.validateComponent(El)) {\n const ElName = typeof El === 'string' ? El : El.displayName || El.name\n CerbComponent.displayName = ElName\n }\n\n return CerbComponent\n }\n\n /**\n * Creates a Cerberus component with the given recipe.\n * @param Component - The React component to enhance with the recipe.\n * @param options - Options for the recipe.\n * @returns A new React component that applies the recipe to the original\n * component.\n */\n withRecipe = <P extends HTMLAttributes<unknown>>(\n Component: ComponentType<P> | string,\n options?: WithRecipeOptions,\n ): CerberusPrimitiveEl<P & WithRecipeOptions['defaultProps']> => {\n const { defaultProps } = options || {}\n const El = Component as ComponentType<P> | ElementType\n\n const recipe = this.recipe as CerberusRecipe\n\n const CerbComponent = (internalProps: PropsWithChildren<P> & WithCss) => {\n const {\n css: customCss,\n className,\n ...restOfInternalProps\n } = internalProps\n\n const [variantOptions, nativeProps] =\n recipe.splitVariantProps(restOfInternalProps)\n const recipeStyles = recipe(variantOptions)\n\n return (\n <Component\n {...defaultProps}\n {...(nativeProps as P)}\n className={cx(className, recipeStyles, css(customCss))}\n />\n )\n }\n\n if (this.validateComponent(El)) {\n const ElName = typeof El === 'string' ? El : El.displayName || El.name\n CerbComponent.displayName = ElName\n }\n\n return CerbComponent\n }\n\n /**\n * Creates a Cerberus component with a slot recipe applied.\n * @param Component - The React component to enhance with Cerberus features.\n * @param recipe - The slot recipe to apply to the component.\n * @returns A new React component that applies Cerberus features and the\n * specified slot recipe to the original component.\n * @example\n * ```typescript\n * const { withSlotRecipe } = createCerberusPrimitive(field)\n * const Field = withSlotRecipe(RawField, field)\n * ```\n */\n withSlotRecipe = <P extends HTMLAttributes<unknown>>(\n Component: ComponentType<P> | string,\n slot: keyof RecipeVariantRecord,\n options?: WithRecipeOptions,\n ) => {\n const { defaultProps } = options || {}\n const El = Component as ComponentType<P> | ElementType\n\n const recipe = this.recipe as CerberusSlotRecipe<typeof slot>\n\n const CerbComponent = (internalProps: PropsWithChildren<P> & WithCss) => {\n const {\n css: customCss,\n className,\n ...restOfInternalProps\n } = internalProps\n\n const [variantOptions, nativeProps] =\n recipe.splitVariantProps(restOfInternalProps)\n const styles = recipe(variantOptions)\n const slotStyles = styles[slot as keyof typeof styles]\n\n return (\n <Component\n {...defaultProps}\n {...(nativeProps as P)}\n className={cx(className, slotStyles, css(customCss))}\n />\n )\n }\n\n if (this.validateComponent(El)) {\n const ElName = typeof El === 'string' ? El : El.displayName || El.name\n CerbComponent.displayName = ElName\n }\n\n return CerbComponent\n }\n}\n","import { CerberusPrimitive } from './primitive-factory'\nimport type { CerberusFactory, CerberusPrimitiveRecipe } from './types'\nimport { cerberusFactoryProxy } from './factory'\n\n/**\n * This module contains the user interface for creating Cerberus primitives.\n * @module @cerberus/core/system/create-cerb-primitive\n */\n\n/**\n * A factory function that creates a Cerberus primitive instance with the given\n * recipe.\n * @param recipe\n * @returns An object with three methods: `withNoRecipe`, `withRecipe`, and `withSlotRecipe` that\n * apply the recipes and special Cerberus helpers like `css`.\n *\n * @example\n * ```tsx\n * const { withRecipe } = createCerberusPrimitive(myCustomRecipe);\n * export const Button = withRecipe(MyCustomButton)\n * ```\n */\nexport function createCerberusPrimitive<T extends CerberusPrimitiveRecipe>(\n recipe?: T,\n) {\n return new CerberusPrimitive(recipe)\n}\n\n/**\n * A utility function to access Cerberus components by their name.\n * @param component - The name of the Cerberus component to access.\n * @returns The Cerberus component corresponding to the provided name.\n * @throws An error if the component name is not valid.\n *\n * @example\n * ```tsx\n * import { cerberus } from '@cerberus/react'\n * const Button = cerberus('button')\n *\n * <Button css={{ color: 'blue' }} asChild>\n * <Link href=\"/some-page\">Click me</Link>\n * </Button>\n * ```\n */\nexport const cerberus = cerberusFactoryProxy as CerberusFactory\n\nexport * from './types'\n","import type { ElementType } from 'react'\nimport {\n CarouselRoot,\n CarouselControl,\n CarouselPrevTrigger,\n CarouselNextTrigger,\n CarouselIndicatorGroup,\n CarouselIndicator,\n CarouselItemGroup,\n CarouselItem,\n} from './primitives'\n\n/**\n * This module contains the parts of the Carousel component.\n * @module 'carousel/parts'\n */\n\ninterface CarouselPartsValue {\n /**\n * The context provider of the carousel.\n */\n Root: ElementType\n /**\n * The control of the carousel.\n */\n Control: ElementType\n /**\n * The previous trigger of the carousel.\n */\n PrevTrigger: ElementType\n /**\n * The next trigger of the carousel.\n */\n NextTrigger: ElementType\n /**\n * The indicator group of the carousel.\n */\n IndicatorGroup: ElementType\n /**\n * The indicator of the carousel.\n */\n Indicator: ElementType\n /**\n * The item group of the carousel.\n */\n ItemGroup: ElementType\n /**\n * The item of the carousel.\n */\n Item: ElementType\n}\n\n/**\n * An Object containing the parts of the Button component. For users that\n * prefer Object component syntax.\n *\n * @remarks\n *\n * When using object component syntax, you import the CarouselParts object and\n * the entire family of components vs. only what you use.\n */\nexport const CarouselParts: CarouselPartsValue = {\n Root: CarouselRoot,\n Control: CarouselControl,\n PrevTrigger: CarouselPrevTrigger,\n NextTrigger: CarouselNextTrigger,\n IndicatorGroup: CarouselIndicatorGroup,\n Indicator: CarouselIndicator,\n ItemGroup: CarouselItemGroup,\n Item: CarouselItem,\n}\n","import { type PropsWithChildren, type ReactNode } from 'react'\n\n/**\n * This module contains the Show component.\n * @module\n */\n\nexport interface ShowProps<T> {\n /**\n * The condition to render memoized children or the fallback content.\n */\n when: T | boolean | null | undefined\n /**\n * The children to render when the condition is false.\n */\n fallback?: ReactNode\n}\n\n/**\n * Conditionally render a memoized version of the children or optional fallback\n * content.\n * @see https://cerberus.digitalu.design/react/show\n * @example\n * ```tsx\n * <Show when={isLoggedIn} fallback={<Navigate to=\"/login\" />}>\n * <Dashboard />\n * </Show>\n */\nexport function Show<T>(props: PropsWithChildren<ShowProps<T>>) {\n const { when, children, fallback } = props\n\n if (when) {\n return <>{children}</>\n }\n\n if (fallback) {\n return <>{fallback}</>\n }\n\n return null\n}\n","import type { ReactNode, JSX } from 'react'\n\nexport interface ForProps<T extends readonly unknown[], U extends JSX.Element> {\n /**\n * The array to iterate over.\n */\n each: T | undefined | null | false\n /**\n * The fallback to render when the array is empty.\n */\n fallback?: JSX.Element\n /**\n * The children to render for each item in the array.\n */\n children: (item: T[number], index: number) => U\n}\n\n/**\n * The For component is used to iterate over an array and render a list of\n * components or display a fallback when the array is empty.\n * Inspired by the `<For>` component from SolidJS.\n *\n * @example\n * ```tsx\n * <For each={['a', 'b', 'c']}>\n * {(item, index) => <div key={index}>{item}</div>}\n * </For>\n * ```\n */\nexport function For<T extends readonly unknown[], U extends JSX.Element>(\n props: ForProps<T, U>,\n) {\n if (!props.each || !props.each.length) {\n return props.fallback || null\n }\n\n return <>{props.each?.map(props.children) as ReactNode}</>\n}\n","import type { PropsWithChildren } from 'react'\nimport { Show } from '../show/show'\nimport { For } from '../for/for'\nimport { CarouselParts } from './parts'\nimport type { CarouselRootProps } from './primitives'\n\n/**\n * This module contains an abstraction of the carousel family of components.\n * @module carousel\n */\n\nexport interface CarouselProps extends CarouselRootProps {\n /**\n * Whether to show the carousel indicators (dot list).\n * @default false\n */\n showIndicators?: boolean\n}\n\n/**\n * The Carousel component is an abstraction of the carousel family of\n * components. It provides a simple interface for creating carousels with\n * various configurations.\n *\n * @remarks\n * This component uses the `CarouselParts` object to provide the necessary\n * parts. For customization, we recommend using the `CarouselParts` object\n * directly in combination with the `css` prop.\n */\nfunction CarouselEl(props: PropsWithChildren<CarouselProps>) {\n const { showIndicators = false, children, ...rootProps } = props\n\n return (\n <CarouselParts.Root {...rootProps}>\n {children}\n\n <Show when={showIndicators}>\n <CarouselParts.IndicatorGroup>\n <For each={Array.from({ length: props.slideCount ?? 0 })}>\n {(_, idx) => <CarouselParts.Indicator key={idx} index={idx} />}\n </For>\n </CarouselParts.IndicatorGroup>\n </Show>\n </CarouselParts.Root>\n )\n}\n\nexport const Carousel = {\n Root: CarouselEl,\n ItemGroup: CarouselParts.ItemGroup,\n Item: CarouselParts.Item,\n Control: CarouselParts.Control,\n PrevTrigger: CarouselParts.PrevTrigger,\n NextTrigger: CarouselParts.NextTrigger,\n}\n"],"mappings":"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","names":["Carousel","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","Carousel"]}