react-marketing-ui 0.0.3 → 0.0.5
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/accordion.js +1 -1
- package/dist/accordion.js.map +1 -1
- package/dist/accordion.mjs +222 -2
- package/dist/accordion.mjs.map +1 -1
- package/dist/action-swap.js +1 -0
- package/dist/action-swap.mjs +77 -3
- package/dist/action-swap.mjs.map +1 -1
- package/dist/animated-beam.js +1 -0
- package/dist/animated-beam.mjs +127 -2
- package/dist/animated-beam.mjs.map +1 -1
- package/dist/button.js +1 -1
- package/dist/button.js.map +1 -1
- package/dist/button.mjs +115 -2
- package/dist/button.mjs.map +1 -1
- package/dist/card.js +1 -2
- package/dist/card.js.map +1 -1
- package/dist/card.mjs +135 -3
- package/dist/card.mjs.map +1 -1
- package/dist/dia-text-reveal.js +1 -0
- package/dist/dia-text-reveal.mjs +331 -2
- package/dist/dia-text-reveal.mjs.map +1 -1
- package/dist/elevated-input.js +1 -1
- package/dist/elevated-input.js.map +1 -1
- package/dist/elevated-input.mjs +48 -2
- package/dist/elevated-input.mjs.map +1 -1
- package/dist/fade-in.js +1 -0
- package/dist/fade-in.mjs +84 -2
- package/dist/fade-in.mjs.map +1 -1
- package/dist/feature-card.js +1 -1
- package/dist/feature-card.js.map +1 -1
- package/dist/feature-card.mjs +34 -2
- package/dist/feature-card.mjs.map +1 -1
- package/dist/flowchart-parts.js +1 -1
- package/dist/flowchart-parts.js.map +1 -1
- package/dist/flowchart-parts.mjs +91 -2
- package/dist/flowchart-parts.mjs.map +1 -1
- package/dist/footer-glow.d.cts +2 -0
- package/dist/footer-glow.d.ts +2 -0
- package/dist/footer-glow.d.ts.map +1 -0
- package/dist/footer-glow.js +110 -0
- package/dist/footer-glow.js.map +1 -0
- package/dist/footer-glow.mjs +108 -0
- package/dist/footer-glow.mjs.map +1 -0
- package/dist/glossy-button.js +1 -1
- package/dist/glossy-button.js.map +1 -1
- package/dist/glossy-button.mjs +82 -2
- package/dist/glossy-button.mjs.map +1 -1
- package/dist/grainient.js +1 -0
- package/dist/grainient.mjs +327 -2
- package/dist/grainient.mjs.map +1 -1
- package/dist/highlighter.js +1 -0
- package/dist/highlighter.mjs +122 -3
- package/dist/highlighter.mjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +101 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2741 -32
- package/dist/index.mjs.map +1 -1
- package/dist/input.js +1 -0
- package/dist/input.mjs +107 -2
- package/dist/input.mjs.map +1 -1
- package/dist/lib/breakpoints.js +1 -1
- package/dist/lib/breakpoints.js.map +1 -1
- package/dist/lib/breakpoints.mjs +34 -1
- package/dist/lib/breakpoints.mjs.map +1 -1
- package/dist/lib/cn.js +1 -1
- package/dist/lib/cn.js.map +1 -1
- package/dist/lib/cn.mjs +17 -1
- package/dist/lib/cn.mjs.map +1 -1
- package/dist/lib/ease.js +1 -0
- package/dist/lib/ease.mjs +9 -1
- package/dist/lib/ease.mjs.map +1 -1
- package/dist/lib/surface.js +1 -0
- package/dist/lib/surface.mjs +37 -1
- package/dist/lib/surface.mjs.map +1 -1
- package/dist/lib/use-media-query.js +1 -0
- package/dist/lib/use-media-query.mjs +16 -1
- package/dist/lib/use-media-query.mjs.map +1 -1
- package/dist/liquid-metal.js +1 -0
- package/dist/liquid-metal.mjs +40 -2
- package/dist/liquid-metal.mjs.map +1 -1
- package/dist/navigation-menu-icons.js +1 -1
- package/dist/navigation-menu-icons.js.map +1 -1
- package/dist/navigation-menu-icons.mjs +36 -1
- package/dist/navigation-menu-icons.mjs.map +1 -1
- package/dist/navigation-menu-styles.js +1 -1
- package/dist/navigation-menu-styles.js.map +1 -1
- package/dist/navigation-menu-styles.mjs +11 -1
- package/dist/navigation-menu-styles.mjs.map +1 -1
- package/dist/navigation-menu.js +1 -2
- package/dist/navigation-menu.js.map +1 -1
- package/dist/navigation-menu.mjs +350 -5
- package/dist/navigation-menu.mjs.map +1 -1
- package/dist/password-input.js +1 -0
- package/dist/password-input.mjs +171 -3
- package/dist/password-input.mjs.map +1 -1
- package/dist/rainbow-button.js +1 -0
- package/dist/rainbow-button.mjs +45 -2
- package/dist/rainbow-button.mjs.map +1 -1
- package/dist/range-slider.js +1 -0
- package/dist/range-slider.mjs +82 -1
- package/dist/range-slider.mjs.map +1 -1
- package/dist/rolling-badge.js +1 -0
- package/dist/rolling-badge.mjs +68 -2
- package/dist/rolling-badge.mjs.map +1 -1
- package/dist/savings-badge.js +1 -1
- package/dist/savings-badge.js.map +1 -1
- package/dist/savings-badge.mjs +22 -2
- package/dist/savings-badge.mjs.map +1 -1
- package/dist/shine-border.js +1 -0
- package/dist/shine-border.mjs +44 -2
- package/dist/shine-border.mjs.map +1 -1
- package/dist/sparkles-text.js +1 -0
- package/dist/sparkles-text.mjs +84 -3
- package/dist/sparkles-text.mjs.map +1 -1
- package/dist/tabs.js +1 -0
- package/dist/tabs.mjs +118 -2
- package/dist/tabs.mjs.map +1 -1
- package/dist/theme-toggle.js +1 -0
- package/dist/theme-toggle.mjs +248 -5
- package/dist/theme-toggle.mjs.map +1 -1
- package/package.json +12 -2
- package/dist/chunk-3SB6HUBA.mjs +0 -31
- package/dist/chunk-3SB6HUBA.mjs.map +0 -1
- package/dist/chunk-4PBVBXGY.mjs +0 -84
- package/dist/chunk-4PBVBXGY.mjs.map +0 -1
- package/dist/chunk-4VCFWVSJ.mjs +0 -42
- package/dist/chunk-4VCFWVSJ.mjs.map +0 -1
- package/dist/chunk-5QQAPGR2.mjs +0 -109
- package/dist/chunk-5QQAPGR2.mjs.map +0 -1
- package/dist/chunk-6MB4UKRX.mjs +0 -19
- package/dist/chunk-6MB4UKRX.mjs.map +0 -1
- package/dist/chunk-6T5LR34O.mjs +0 -45
- package/dist/chunk-6T5LR34O.mjs.map +0 -1
- package/dist/chunk-AYLCYDUM.mjs +0 -275
- package/dist/chunk-AYLCYDUM.mjs.map +0 -1
- package/dist/chunk-AYY7D2RJ.mjs +0 -112
- package/dist/chunk-AYY7D2RJ.mjs.map +0 -1
- package/dist/chunk-CTZEI2YS.mjs +0 -324
- package/dist/chunk-CTZEI2YS.mjs.map +0 -1
- package/dist/chunk-DA3I3Y5O.mjs +0 -71
- package/dist/chunk-DA3I3Y5O.mjs.map +0 -1
- package/dist/chunk-EYHT2EWJ.mjs +0 -18
- package/dist/chunk-EYHT2EWJ.mjs.map +0 -1
- package/dist/chunk-IHLGCS63.mjs +0 -36
- package/dist/chunk-IHLGCS63.mjs.map +0 -1
- package/dist/chunk-JVXJ6SFX.mjs +0 -38
- package/dist/chunk-JVXJ6SFX.mjs.map +0 -1
- package/dist/chunk-KBHYXLRG.mjs +0 -13
- package/dist/chunk-KBHYXLRG.mjs.map +0 -1
- package/dist/chunk-KMXUQYR3.mjs +0 -74
- package/dist/chunk-KMXUQYR3.mjs.map +0 -1
- package/dist/chunk-KNPOZ34H.mjs +0 -88
- package/dist/chunk-KNPOZ34H.mjs.map +0 -1
- package/dist/chunk-KRNWCJ4D.mjs +0 -219
- package/dist/chunk-KRNWCJ4D.mjs.map +0 -1
- package/dist/chunk-M5MESV26.mjs +0 -124
- package/dist/chunk-M5MESV26.mjs.map +0 -1
- package/dist/chunk-MJYBPJBA.mjs +0 -115
- package/dist/chunk-MJYBPJBA.mjs.map +0 -1
- package/dist/chunk-NNHPQ67J.mjs +0 -10
- package/dist/chunk-NNHPQ67J.mjs.map +0 -1
- package/dist/chunk-OCZFHVVD.mjs +0 -71
- package/dist/chunk-OCZFHVVD.mjs.map +0 -1
- package/dist/chunk-QAWSH567.mjs +0 -19
- package/dist/chunk-QAWSH567.mjs.map +0 -1
- package/dist/chunk-R2E2J42H.mjs +0 -38
- package/dist/chunk-R2E2J42H.mjs.map +0 -1
- package/dist/chunk-TPGLLSYV.mjs +0 -65
- package/dist/chunk-TPGLLSYV.mjs.map +0 -1
- package/dist/chunk-VJENJHXJ.mjs +0 -72
- package/dist/chunk-VJENJHXJ.mjs.map +0 -1
- package/dist/chunk-W22G7XHR.mjs +0 -104
- package/dist/chunk-W22G7XHR.mjs.map +0 -1
- package/dist/chunk-WDR5VPZJ.mjs +0 -79
- package/dist/chunk-WDR5VPZJ.mjs.map +0 -1
- package/dist/chunk-WLUGKBH7.mjs +0 -37
- package/dist/chunk-WLUGKBH7.mjs.map +0 -1
- package/dist/chunk-WYJYLDUA.mjs +0 -84
- package/dist/chunk-WYJYLDUA.mjs.map +0 -1
- package/dist/chunk-XZEDZVXT.mjs +0 -38
- package/dist/chunk-XZEDZVXT.mjs.map +0 -1
- package/dist/chunk-YKGP5JIL.mjs +0 -328
- package/dist/chunk-YKGP5JIL.mjs.map +0 -1
- package/dist/chunk-YM3U2OBE.mjs +0 -99
- package/dist/chunk-YM3U2OBE.mjs.map +0 -1
package/dist/accordion.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
'use strict';
|
|
2
3
|
|
|
3
4
|
var accordion = require('@base-ui/react/accordion');
|
|
@@ -5,7 +6,6 @@ var clsx = require('clsx');
|
|
|
5
6
|
var tailwindMerge = require('tailwind-merge');
|
|
6
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
8
|
|
|
8
|
-
// src/components/accordion.tsx
|
|
9
9
|
function cn(...inputs) {
|
|
10
10
|
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
11
11
|
}
|
package/dist/accordion.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../src/components/accordion.tsx"],"names":["twMerge","clsx","jsx","BaseAccordion","jsxs"],"mappings":"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","file":"accordion.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","import { Accordion as BaseAccordion } from '@base-ui/react/accordion';\nimport type * as React from 'react';\nimport { cn } from '../lib/utils.js';\n\ntype AccordionVariant =\n | 'default'\n | 'split'\n | 'outline'\n | 'nested'\n | 'isolated-bordered'\n | 'isolated-filled'\n | 'isolated-filled-bordered';\n\nfunction Accordion({\n className,\n multiple = false,\n variant = 'default',\n ...props\n}: BaseAccordion.Root.Props & { variant?: AccordionVariant }) {\n return (\n <BaseAccordion.Root\n data-slot=\"accordion\"\n data-variant={variant}\n multiple={multiple}\n className={cn(\n 'group flex w-full flex-col',\n variant === 'split' && 'space-y-2',\n variant === 'outline' && 'overflow-hidden rounded-lg border bg-(--surface)',\n variant === 'nested' && 'rounded-lg border bg-muted p-1',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: BaseAccordion.Item.Props) {\n return (\n <BaseAccordion.Item\n data-slot=\"accordion-item\"\n className={cn(\n 'transition-[margin,border-radius,border] duration-250 ease-out-expo',\n // Default variant styles\n 'group-data-[variant=default]:border-(--border) group-data-[variant=default]:border-b group-data-[variant=default]:last:border-b-0',\n // Split variant styles (individual cards)\n 'group-data-[variant=split]:overflow-hidden group-data-[variant=split]:rounded-lg group-data-[variant=split]:border group-data-[variant=split]:border-(--border) group-data-[variant=split]:bg-(--surface)',\n // Outline variant styles (items within single card)\n 'group-data-[variant=outline]:border-(--border) group-data-[variant=outline]:border-b group-data-[variant=outline]:last:border-b-0',\n // Nested variant styles - items within the single outer card\n 'group-data-[variant=nested]:mt-0.5 group-data-[variant=nested]:first:mt-0',\n // Isolated bordered variant styles - dynamically separates open items from closed ones\n // Base styles: all items have borders and background to look like cards\n 'group-data-[variant=isolated-bordered]:overflow-hidden group-data-[variant=isolated-bordered]:border group-data-[variant=isolated-bordered]:border-(--border) group-data-[variant=isolated-bordered]:bg-(--surface)',\n // Closed items: group together by overlapping borders with negative margin\n // Only apply to closed items that follow another closed item (not open items, first item, or items after open items)\n 'group-data-[variant=isolated-bordered]:relative group-data-[variant=isolated-bordered]:not-first:not-data-open:not-[[data-open]+&]:-mt-px',\n // Opened item - separated with margins\n 'group-data-[variant=isolated-bordered]:data-open:mt-2 group-data-[variant=isolated-bordered]:data-open:mb-2 group-data-[variant=isolated-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-bordered]:first:rounded-t-lg group-data-[variant=isolated-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-bordered]:last:rounded-b-lg group-data-[variant=isolated-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:overflow-hidden group-data-[variant=isolated-filled]:bg-muted',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled]:data-open:my-2 group-data-[variant=isolated-filled]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled]:first:rounded-t-lg group-data-[variant=isolated-filled]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled]:last:rounded-b-lg group-data-[variant=isolated-filled]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled bordered variant - filled background with borders between closed items\n 'group-data-[variant=isolated-filled-bordered]:overflow-hidden group-data-[variant=isolated-filled-bordered]:bg-muted',\n // All items except last have border-bottom to prevent layout shift, default to visible border\n 'group-data-[variant=isolated-filled-bordered]:not-last:border-(--border) group-data-[variant=isolated-filled-bordered]:not-last:border-b',\n // Make border transparent (invisible) for: items before open items, and open items themselves\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:border-transparent',\n 'group-data-[variant=isolated-filled-bordered]:data-open:border-transparent',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled-bordered]:data-open:my-2 group-data-[variant=isolated-filled-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled-bordered]:first:rounded-t-lg group-data-[variant=isolated-filled-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled-bordered]:last:rounded-b-lg group-data-[variant=isolated-filled-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionHeader({ className, ...props }: BaseAccordion.Header.Props) {\n return (\n <BaseAccordion.Header\n data-slot=\"accordion-header\"\n // `not-prose` guards the trigger from document typography when the\n // accordion is rendered inside a prose/markdown container (e.g. MDX docs),\n // which would otherwise style this heading with large margins and an\n // inflated line-height. Inert outside a prose context.\n className={cn('not-prose', className)}\n {...props}\n />\n );\n}\n\ninterface AccordionTriggerProps extends BaseAccordion.Trigger.Props {\n showIndicator?: boolean;\n indicatorType?: 'chevron' | 'plus';\n indicatorPosition?: 'start' | 'end';\n /** Colour class applied to the indicator glyph, e.g. `text-(--accent-brand)`. Defaults to muted-foreground. */\n indicatorColor?: string;\n icon?: React.ReactNode;\n subtitle?: React.ReactNode;\n}\n\nfunction AccordionTrigger({\n children,\n className,\n showIndicator = true,\n indicatorType = 'plus',\n indicatorPosition = 'end',\n indicatorColor,\n icon,\n subtitle,\n ...props\n}: AccordionTriggerProps) {\n const hasStartIndicator = showIndicator && indicatorPosition === 'start';\n const hasEndIndicator = showIndicator && indicatorPosition === 'end';\n\n const renderIndicator = () => {\n if (!showIndicator) return null;\n\n const indicatorClassName = cn('size-4 shrink-0 transition-transform duration-200 ease-out-expo', indicatorColor);\n\n const indicatorIcon =\n indicatorType === 'chevron' ? (\n <ChevronDownIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n ) : (\n <PlusIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n );\n\n return (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {indicatorIcon}\n </span>\n );\n };\n\n return (\n <AccordionHeader>\n <BaseAccordion.Trigger\n data-slot=\"accordion-trigger\"\n data-has-icon={hasStartIndicator ? 'true' : undefined}\n className={cn(\n 'group/trigger flex w-full cursor-pointer items-center justify-between gap-3 py-5 px-3.5 text-left font-medium text-sm outline-none disabled:pointer-events-none disabled:opacity-60',\n // Default variant styles\n 'group-data-[variant=default]:px-0',\n // Split variant styles\n 'group-data-[variant=split]:rounded-t-lg',\n // Nested variant styles - trigger with subtle interaction\n 'group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:px-3 group-data-[variant=nested]:py-2.5 group-data-[variant=nested]:hover:bg-background group-data-[variant=nested]:dark:hover:bg-background/50',\n // Indicator rotation animations\n indicatorType === 'chevron' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-180',\n indicatorType === 'plus' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-90',\n className,\n )}\n {...props}\n >\n {hasStartIndicator ? renderIndicator() : null}\n\n {/* icon prop — only rendered when indicator is at end position */}\n {icon && !hasStartIndicator && (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"underline-offset-2 group-hover/trigger:underline\">{children}</span>\n {subtitle ? <span className=\"text-muted-foreground text-sm no-underline\">{subtitle}</span> : null}\n </div>\n\n {hasEndIndicator ? renderIndicator() : null}\n </BaseAccordion.Trigger>\n </AccordionHeader>\n );\n}\n\nfunction AccordionContent({ children, className, ...props }: BaseAccordion.Panel.Props) {\n return (\n <BaseAccordion.Panel\n data-slot=\"accordion-content\"\n className={cn(\n 'h-(--accordion-panel-height) overflow-hidden text-sm transition-[height,opacity] duration-250 ease-out-expo data-ending-style:h-0 data-starting-style:h-0 data-ending-style:opacity-0 data-starting-style:opacity-0',\n )}\n {...props}\n >\n <div\n className={cn(\n 'p-3.5 text-muted-foreground',\n 'group-data-[variant=default]:px-0 group-data-[variant=default]:pt-0',\n 'group-data-[variant=split]:pt-0',\n 'group-data-[variant=outline]:pt-0',\n // Nested variant\n 'group-data-[variant=nested]:mt-1 group-data-[variant=nested]:mb-0.5 group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:border group-data-[variant=nested]:bg-background group-data-[variant=nested]:p-3 group-data-[variant=nested]:[[data-slot=accordion-item]:last-child_&]:mb-0',\n // Isolated bordered variant\n 'group-data-[variant=isolated-bordered]:pt-0',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:pt-0',\n // Isolated filled bordered variant\n 'group-data-[variant=isolated-filled-bordered]:pt-0',\n // Icon alignment - add left padding when parent item contains a trigger with icon\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:pl-[calc(1rem+0.75rem)]',\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:group-data-[variant=default]:pl-[calc(1rem+0.75rem)]',\n className,\n )}\n >\n {children}\n </div>\n </BaseAccordion.Panel>\n );\n}\n\nfunction PlusIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" {...props}>\n {/* Horizontal bar - fades out when accordion opens */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2.75 12C2.75 11.3096 3.30964 10.75 4 10.75H20C20.6904 10.75 21.25 11.3096 21.25 12C21.25 12.6904 20.6904 13.25 20 13.25H4C3.30964 13.25 2.75 12.6904 2.75 12Z\"\n fill=\"currentColor\"\n className=\"in-data-panel-open:opacity-0 transition-opacity duration-200 ease-out-expo\"\n />\n {/* Vertical bar - remains visible (becomes horizontal after 90° rotation) */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 2.75C12.6904 2.75 13.25 3.30964 13.25 4V20C13.25 20.6904 12.6904 21.25 12 21.25C11.3096 21.25 10.75 20.6904 10.75 20V4C10.75 3.30964 11.3096 2.75 12 2.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Inline replacement for the site's `@iconify-icons/mingcute/down-line` glyph. */\nfunction ChevronDownIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" {...props}>\n <path d=\"M1 3.5L5 7.5L9 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nexport { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/accordion.tsx"],"names":["twMerge","clsx","jsx","BaseAccordion","jsxs"],"mappings":"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","file":"accordion.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","import { Accordion as BaseAccordion } from '@base-ui/react/accordion';\nimport type * as React from 'react';\nimport { cn } from '../lib/utils.js';\n\ntype AccordionVariant =\n | 'default'\n | 'split'\n | 'outline'\n | 'nested'\n | 'isolated-bordered'\n | 'isolated-filled'\n | 'isolated-filled-bordered';\n\nfunction Accordion({\n className,\n multiple = false,\n variant = 'default',\n ...props\n}: BaseAccordion.Root.Props & { variant?: AccordionVariant }) {\n return (\n <BaseAccordion.Root\n data-slot=\"accordion\"\n data-variant={variant}\n multiple={multiple}\n className={cn(\n 'group flex w-full flex-col',\n variant === 'split' && 'space-y-2',\n variant === 'outline' && 'overflow-hidden rounded-lg border bg-(--surface)',\n variant === 'nested' && 'rounded-lg border bg-muted p-1',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: BaseAccordion.Item.Props) {\n return (\n <BaseAccordion.Item\n data-slot=\"accordion-item\"\n className={cn(\n 'transition-[margin,border-radius,border] duration-250 ease-out-expo',\n // Default variant styles\n 'group-data-[variant=default]:border-(--border) group-data-[variant=default]:border-b group-data-[variant=default]:last:border-b-0',\n // Split variant styles (individual cards)\n 'group-data-[variant=split]:overflow-hidden group-data-[variant=split]:rounded-lg group-data-[variant=split]:border group-data-[variant=split]:border-(--border) group-data-[variant=split]:bg-(--surface)',\n // Outline variant styles (items within single card)\n 'group-data-[variant=outline]:border-(--border) group-data-[variant=outline]:border-b group-data-[variant=outline]:last:border-b-0',\n // Nested variant styles - items within the single outer card\n 'group-data-[variant=nested]:mt-0.5 group-data-[variant=nested]:first:mt-0',\n // Isolated bordered variant styles - dynamically separates open items from closed ones\n // Base styles: all items have borders and background to look like cards\n 'group-data-[variant=isolated-bordered]:overflow-hidden group-data-[variant=isolated-bordered]:border group-data-[variant=isolated-bordered]:border-(--border) group-data-[variant=isolated-bordered]:bg-(--surface)',\n // Closed items: group together by overlapping borders with negative margin\n // Only apply to closed items that follow another closed item (not open items, first item, or items after open items)\n 'group-data-[variant=isolated-bordered]:relative group-data-[variant=isolated-bordered]:not-first:not-data-open:not-[[data-open]+&]:-mt-px',\n // Opened item - separated with margins\n 'group-data-[variant=isolated-bordered]:data-open:mt-2 group-data-[variant=isolated-bordered]:data-open:mb-2 group-data-[variant=isolated-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-bordered]:first:rounded-t-lg group-data-[variant=isolated-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-bordered]:last:rounded-b-lg group-data-[variant=isolated-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:overflow-hidden group-data-[variant=isolated-filled]:bg-muted',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled]:data-open:my-2 group-data-[variant=isolated-filled]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled]:first:rounded-t-lg group-data-[variant=isolated-filled]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled]:last:rounded-b-lg group-data-[variant=isolated-filled]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled bordered variant - filled background with borders between closed items\n 'group-data-[variant=isolated-filled-bordered]:overflow-hidden group-data-[variant=isolated-filled-bordered]:bg-muted',\n // All items except last have border-bottom to prevent layout shift, default to visible border\n 'group-data-[variant=isolated-filled-bordered]:not-last:border-(--border) group-data-[variant=isolated-filled-bordered]:not-last:border-b',\n // Make border transparent (invisible) for: items before open items, and open items themselves\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:border-transparent',\n 'group-data-[variant=isolated-filled-bordered]:data-open:border-transparent',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled-bordered]:data-open:my-2 group-data-[variant=isolated-filled-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled-bordered]:first:rounded-t-lg group-data-[variant=isolated-filled-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled-bordered]:last:rounded-b-lg group-data-[variant=isolated-filled-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionHeader({ className, ...props }: BaseAccordion.Header.Props) {\n return (\n <BaseAccordion.Header\n data-slot=\"accordion-header\"\n // `not-prose` guards the trigger from document typography when the\n // accordion is rendered inside a prose/markdown container (e.g. MDX docs),\n // which would otherwise style this heading with large margins and an\n // inflated line-height. Inert outside a prose context.\n className={cn('not-prose', className)}\n {...props}\n />\n );\n}\n\ninterface AccordionTriggerProps extends BaseAccordion.Trigger.Props {\n showIndicator?: boolean;\n indicatorType?: 'chevron' | 'plus';\n indicatorPosition?: 'start' | 'end';\n /** Colour class applied to the indicator glyph, e.g. `text-(--accent-brand)`. Defaults to muted-foreground. */\n indicatorColor?: string;\n icon?: React.ReactNode;\n subtitle?: React.ReactNode;\n}\n\nfunction AccordionTrigger({\n children,\n className,\n showIndicator = true,\n indicatorType = 'plus',\n indicatorPosition = 'end',\n indicatorColor,\n icon,\n subtitle,\n ...props\n}: AccordionTriggerProps) {\n const hasStartIndicator = showIndicator && indicatorPosition === 'start';\n const hasEndIndicator = showIndicator && indicatorPosition === 'end';\n\n const renderIndicator = () => {\n if (!showIndicator) return null;\n\n const indicatorClassName = cn('size-4 shrink-0 transition-transform duration-200 ease-out-expo', indicatorColor);\n\n const indicatorIcon =\n indicatorType === 'chevron' ? (\n <ChevronDownIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n ) : (\n <PlusIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n );\n\n return (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {indicatorIcon}\n </span>\n );\n };\n\n return (\n <AccordionHeader>\n <BaseAccordion.Trigger\n data-slot=\"accordion-trigger\"\n data-has-icon={hasStartIndicator ? 'true' : undefined}\n className={cn(\n 'group/trigger flex w-full cursor-pointer items-center justify-between gap-3 py-5 px-3.5 text-left font-medium text-sm outline-none disabled:pointer-events-none disabled:opacity-60',\n // Default variant styles\n 'group-data-[variant=default]:px-0',\n // Split variant styles\n 'group-data-[variant=split]:rounded-t-lg',\n // Nested variant styles - trigger with subtle interaction\n 'group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:px-3 group-data-[variant=nested]:py-2.5 group-data-[variant=nested]:hover:bg-background group-data-[variant=nested]:dark:hover:bg-background/50',\n // Indicator rotation animations\n indicatorType === 'chevron' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-180',\n indicatorType === 'plus' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-90',\n className,\n )}\n {...props}\n >\n {hasStartIndicator ? renderIndicator() : null}\n\n {/* icon prop — only rendered when indicator is at end position */}\n {icon && !hasStartIndicator && (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"underline-offset-2 group-hover/trigger:underline\">{children}</span>\n {subtitle ? <span className=\"text-muted-foreground text-sm no-underline\">{subtitle}</span> : null}\n </div>\n\n {hasEndIndicator ? renderIndicator() : null}\n </BaseAccordion.Trigger>\n </AccordionHeader>\n );\n}\n\nfunction AccordionContent({ children, className, ...props }: BaseAccordion.Panel.Props) {\n return (\n <BaseAccordion.Panel\n data-slot=\"accordion-content\"\n className={cn(\n 'h-(--accordion-panel-height) overflow-hidden text-sm transition-[height,opacity] duration-250 ease-out-expo data-ending-style:h-0 data-starting-style:h-0 data-ending-style:opacity-0 data-starting-style:opacity-0',\n )}\n {...props}\n >\n <div\n className={cn(\n 'p-3.5 text-muted-foreground',\n 'group-data-[variant=default]:px-0 group-data-[variant=default]:pt-0',\n 'group-data-[variant=split]:pt-0',\n 'group-data-[variant=outline]:pt-0',\n // Nested variant\n 'group-data-[variant=nested]:mt-1 group-data-[variant=nested]:mb-0.5 group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:border group-data-[variant=nested]:bg-background group-data-[variant=nested]:p-3 group-data-[variant=nested]:[[data-slot=accordion-item]:last-child_&]:mb-0',\n // Isolated bordered variant\n 'group-data-[variant=isolated-bordered]:pt-0',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:pt-0',\n // Isolated filled bordered variant\n 'group-data-[variant=isolated-filled-bordered]:pt-0',\n // Icon alignment - add left padding when parent item contains a trigger with icon\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:pl-[calc(1rem+0.75rem)]',\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:group-data-[variant=default]:pl-[calc(1rem+0.75rem)]',\n className,\n )}\n >\n {children}\n </div>\n </BaseAccordion.Panel>\n );\n}\n\nfunction PlusIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" {...props}>\n {/* Horizontal bar - fades out when accordion opens */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2.75 12C2.75 11.3096 3.30964 10.75 4 10.75H20C20.6904 10.75 21.25 11.3096 21.25 12C21.25 12.6904 20.6904 13.25 20 13.25H4C3.30964 13.25 2.75 12.6904 2.75 12Z\"\n fill=\"currentColor\"\n className=\"in-data-panel-open:opacity-0 transition-opacity duration-200 ease-out-expo\"\n />\n {/* Vertical bar - remains visible (becomes horizontal after 90° rotation) */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 2.75C12.6904 2.75 13.25 3.30964 13.25 4V20C13.25 20.6904 12.6904 21.25 12 21.25C11.3096 21.25 10.75 20.6904 10.75 20V4C10.75 3.30964 11.3096 2.75 12 2.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Inline replacement for the site's `@iconify-icons/mingcute/down-line` glyph. */\nfunction ChevronDownIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" {...props}>\n <path d=\"M1 3.5L5 7.5L9 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nexport { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger };\n"]}
|
package/dist/accordion.mjs
CHANGED
|
@@ -1,4 +1,224 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
1
|
+
"use client";
|
|
2
|
+
import { Accordion as Accordion$1 } from '@base-ui/react/accordion';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
function Accordion({
|
|
11
|
+
className,
|
|
12
|
+
multiple = false,
|
|
13
|
+
variant = "default",
|
|
14
|
+
...props
|
|
15
|
+
}) {
|
|
16
|
+
return /* @__PURE__ */ jsx(
|
|
17
|
+
Accordion$1.Root,
|
|
18
|
+
{
|
|
19
|
+
"data-slot": "accordion",
|
|
20
|
+
"data-variant": variant,
|
|
21
|
+
multiple,
|
|
22
|
+
className: cn(
|
|
23
|
+
"group flex w-full flex-col",
|
|
24
|
+
variant === "split" && "space-y-2",
|
|
25
|
+
variant === "outline" && "overflow-hidden rounded-lg border bg-(--surface)",
|
|
26
|
+
variant === "nested" && "rounded-lg border bg-muted p-1",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
function AccordionItem({ className, ...props }) {
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
Accordion$1.Item,
|
|
36
|
+
{
|
|
37
|
+
"data-slot": "accordion-item",
|
|
38
|
+
className: cn(
|
|
39
|
+
"transition-[margin,border-radius,border] duration-250 ease-out-expo",
|
|
40
|
+
// Default variant styles
|
|
41
|
+
"group-data-[variant=default]:border-(--border) group-data-[variant=default]:border-b group-data-[variant=default]:last:border-b-0",
|
|
42
|
+
// Split variant styles (individual cards)
|
|
43
|
+
"group-data-[variant=split]:overflow-hidden group-data-[variant=split]:rounded-lg group-data-[variant=split]:border group-data-[variant=split]:border-(--border) group-data-[variant=split]:bg-(--surface)",
|
|
44
|
+
// Outline variant styles (items within single card)
|
|
45
|
+
"group-data-[variant=outline]:border-(--border) group-data-[variant=outline]:border-b group-data-[variant=outline]:last:border-b-0",
|
|
46
|
+
// Nested variant styles - items within the single outer card
|
|
47
|
+
"group-data-[variant=nested]:mt-0.5 group-data-[variant=nested]:first:mt-0",
|
|
48
|
+
// Isolated bordered variant styles - dynamically separates open items from closed ones
|
|
49
|
+
// Base styles: all items have borders and background to look like cards
|
|
50
|
+
"group-data-[variant=isolated-bordered]:overflow-hidden group-data-[variant=isolated-bordered]:border group-data-[variant=isolated-bordered]:border-(--border) group-data-[variant=isolated-bordered]:bg-(--surface)",
|
|
51
|
+
// Closed items: group together by overlapping borders with negative margin
|
|
52
|
+
// Only apply to closed items that follow another closed item (not open items, first item, or items after open items)
|
|
53
|
+
"group-data-[variant=isolated-bordered]:relative group-data-[variant=isolated-bordered]:not-first:not-data-open:not-[[data-open]+&]:-mt-px",
|
|
54
|
+
// Opened item - separated with margins
|
|
55
|
+
"group-data-[variant=isolated-bordered]:data-open:mt-2 group-data-[variant=isolated-bordered]:data-open:mb-2 group-data-[variant=isolated-bordered]:data-open:rounded-lg",
|
|
56
|
+
// First item
|
|
57
|
+
"group-data-[variant=isolated-bordered]:first:rounded-t-lg group-data-[variant=isolated-bordered]:data-open:first:mt-0",
|
|
58
|
+
// Last item
|
|
59
|
+
"group-data-[variant=isolated-bordered]:last:rounded-b-lg group-data-[variant=isolated-bordered]:data-open:last:mb-0",
|
|
60
|
+
// Item after open item: round top corners (start of new group)
|
|
61
|
+
"group-data-[variant=isolated-bordered]:[[data-open]+&]:rounded-t-lg",
|
|
62
|
+
// Item before open item: round bottom corners (end of group)
|
|
63
|
+
"group-data-[variant=isolated-bordered]:[&:has(+_[data-open])]:rounded-b-lg",
|
|
64
|
+
// Isolated filled variant
|
|
65
|
+
"group-data-[variant=isolated-filled]:overflow-hidden group-data-[variant=isolated-filled]:bg-muted",
|
|
66
|
+
// Opened item - separated with margins and rounded
|
|
67
|
+
"group-data-[variant=isolated-filled]:data-open:my-2 group-data-[variant=isolated-filled]:data-open:rounded-lg",
|
|
68
|
+
// First item
|
|
69
|
+
"group-data-[variant=isolated-filled]:first:rounded-t-lg group-data-[variant=isolated-filled]:data-open:first:mt-0",
|
|
70
|
+
// Last item
|
|
71
|
+
"group-data-[variant=isolated-filled]:last:rounded-b-lg group-data-[variant=isolated-filled]:data-open:last:mb-0",
|
|
72
|
+
// Item after open item: round top corners (start of new group)
|
|
73
|
+
"group-data-[variant=isolated-filled]:[[data-open]+&]:rounded-t-lg",
|
|
74
|
+
// Item before open item: round bottom corners (end of group)
|
|
75
|
+
"group-data-[variant=isolated-filled]:[&:has(+_[data-open])]:rounded-b-lg",
|
|
76
|
+
// Isolated filled bordered variant - filled background with borders between closed items
|
|
77
|
+
"group-data-[variant=isolated-filled-bordered]:overflow-hidden group-data-[variant=isolated-filled-bordered]:bg-muted",
|
|
78
|
+
// All items except last have border-bottom to prevent layout shift, default to visible border
|
|
79
|
+
"group-data-[variant=isolated-filled-bordered]:not-last:border-(--border) group-data-[variant=isolated-filled-bordered]:not-last:border-b",
|
|
80
|
+
// Make border transparent (invisible) for: items before open items, and open items themselves
|
|
81
|
+
"group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:border-transparent",
|
|
82
|
+
"group-data-[variant=isolated-filled-bordered]:data-open:border-transparent",
|
|
83
|
+
// Opened item - separated with margins and rounded
|
|
84
|
+
"group-data-[variant=isolated-filled-bordered]:data-open:my-2 group-data-[variant=isolated-filled-bordered]:data-open:rounded-lg",
|
|
85
|
+
// First item
|
|
86
|
+
"group-data-[variant=isolated-filled-bordered]:first:rounded-t-lg group-data-[variant=isolated-filled-bordered]:data-open:first:mt-0",
|
|
87
|
+
// Last item
|
|
88
|
+
"group-data-[variant=isolated-filled-bordered]:last:rounded-b-lg group-data-[variant=isolated-filled-bordered]:data-open:last:mb-0",
|
|
89
|
+
// Item after open item: round top corners (start of new group)
|
|
90
|
+
"group-data-[variant=isolated-filled-bordered]:[[data-open]+&]:rounded-t-lg",
|
|
91
|
+
// Item before open item: round bottom corners (end of group)
|
|
92
|
+
"group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:rounded-b-lg",
|
|
93
|
+
className
|
|
94
|
+
),
|
|
95
|
+
...props
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
function AccordionHeader({ className, ...props }) {
|
|
100
|
+
return /* @__PURE__ */ jsx(
|
|
101
|
+
Accordion$1.Header,
|
|
102
|
+
{
|
|
103
|
+
"data-slot": "accordion-header",
|
|
104
|
+
className: cn("not-prose", className),
|
|
105
|
+
...props
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
function AccordionTrigger({
|
|
110
|
+
children,
|
|
111
|
+
className,
|
|
112
|
+
showIndicator = true,
|
|
113
|
+
indicatorType = "plus",
|
|
114
|
+
indicatorPosition = "end",
|
|
115
|
+
indicatorColor,
|
|
116
|
+
icon,
|
|
117
|
+
subtitle,
|
|
118
|
+
...props
|
|
119
|
+
}) {
|
|
120
|
+
const hasStartIndicator = showIndicator && indicatorPosition === "start";
|
|
121
|
+
const hasEndIndicator = showIndicator && indicatorPosition === "end";
|
|
122
|
+
const renderIndicator = () => {
|
|
123
|
+
if (!showIndicator) return null;
|
|
124
|
+
const indicatorClassName = cn("size-4 shrink-0 transition-transform duration-200 ease-out-expo", indicatorColor);
|
|
125
|
+
const indicatorIcon = indicatorType === "chevron" ? /* @__PURE__ */ jsx(ChevronDownIcon, { "data-slot": "accordion-indicator", className: indicatorClassName }) : /* @__PURE__ */ jsx(PlusIcon, { "data-slot": "accordion-indicator", className: indicatorClassName });
|
|
126
|
+
return /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: indicatorIcon });
|
|
127
|
+
};
|
|
128
|
+
return /* @__PURE__ */ jsx(AccordionHeader, { children: /* @__PURE__ */ jsxs(
|
|
129
|
+
Accordion$1.Trigger,
|
|
130
|
+
{
|
|
131
|
+
"data-slot": "accordion-trigger",
|
|
132
|
+
"data-has-icon": hasStartIndicator ? "true" : void 0,
|
|
133
|
+
className: cn(
|
|
134
|
+
"group/trigger flex w-full cursor-pointer items-center justify-between gap-3 py-5 px-3.5 text-left font-medium text-sm outline-none disabled:pointer-events-none disabled:opacity-60",
|
|
135
|
+
// Default variant styles
|
|
136
|
+
"group-data-[variant=default]:px-0",
|
|
137
|
+
// Split variant styles
|
|
138
|
+
"group-data-[variant=split]:rounded-t-lg",
|
|
139
|
+
// Nested variant styles - trigger with subtle interaction
|
|
140
|
+
"group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:px-3 group-data-[variant=nested]:py-2.5 group-data-[variant=nested]:hover:bg-background group-data-[variant=nested]:dark:hover:bg-background/50",
|
|
141
|
+
// Indicator rotation animations
|
|
142
|
+
indicatorType === "chevron" && "[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-180",
|
|
143
|
+
indicatorType === "plus" && "[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-90",
|
|
144
|
+
className
|
|
145
|
+
),
|
|
146
|
+
...props,
|
|
147
|
+
children: [
|
|
148
|
+
hasStartIndicator ? renderIndicator() : null,
|
|
149
|
+
icon && !hasStartIndicator && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: icon }),
|
|
150
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
151
|
+
/* @__PURE__ */ jsx("span", { className: "underline-offset-2 group-hover/trigger:underline", children }),
|
|
152
|
+
subtitle ? /* @__PURE__ */ jsx("span", { className: "text-muted-foreground text-sm no-underline", children: subtitle }) : null
|
|
153
|
+
] }),
|
|
154
|
+
hasEndIndicator ? renderIndicator() : null
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
) });
|
|
158
|
+
}
|
|
159
|
+
function AccordionContent({ children, className, ...props }) {
|
|
160
|
+
return /* @__PURE__ */ jsx(
|
|
161
|
+
Accordion$1.Panel,
|
|
162
|
+
{
|
|
163
|
+
"data-slot": "accordion-content",
|
|
164
|
+
className: cn(
|
|
165
|
+
"h-(--accordion-panel-height) overflow-hidden text-sm transition-[height,opacity] duration-250 ease-out-expo data-ending-style:h-0 data-starting-style:h-0 data-ending-style:opacity-0 data-starting-style:opacity-0"
|
|
166
|
+
),
|
|
167
|
+
...props,
|
|
168
|
+
children: /* @__PURE__ */ jsx(
|
|
169
|
+
"div",
|
|
170
|
+
{
|
|
171
|
+
className: cn(
|
|
172
|
+
"p-3.5 text-muted-foreground",
|
|
173
|
+
"group-data-[variant=default]:px-0 group-data-[variant=default]:pt-0",
|
|
174
|
+
"group-data-[variant=split]:pt-0",
|
|
175
|
+
"group-data-[variant=outline]:pt-0",
|
|
176
|
+
// Nested variant
|
|
177
|
+
"group-data-[variant=nested]:mt-1 group-data-[variant=nested]:mb-0.5 group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:border group-data-[variant=nested]:bg-background group-data-[variant=nested]:p-3 group-data-[variant=nested]:[[data-slot=accordion-item]:last-child_&]:mb-0",
|
|
178
|
+
// Isolated bordered variant
|
|
179
|
+
"group-data-[variant=isolated-bordered]:pt-0",
|
|
180
|
+
// Isolated filled variant
|
|
181
|
+
"group-data-[variant=isolated-filled]:pt-0",
|
|
182
|
+
// Isolated filled bordered variant
|
|
183
|
+
"group-data-[variant=isolated-filled-bordered]:pt-0",
|
|
184
|
+
// Icon alignment - add left padding when parent item contains a trigger with icon
|
|
185
|
+
"[[data-slot=accordion-item]:has([data-has-icon])_&]:pl-[calc(1rem+0.75rem)]",
|
|
186
|
+
"[[data-slot=accordion-item]:has([data-has-icon])_&]:group-data-[variant=default]:pl-[calc(1rem+0.75rem)]",
|
|
187
|
+
className
|
|
188
|
+
),
|
|
189
|
+
children
|
|
190
|
+
}
|
|
191
|
+
)
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
function PlusIcon(props) {
|
|
196
|
+
return /* @__PURE__ */ jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", ...props, children: [
|
|
197
|
+
/* @__PURE__ */ jsx(
|
|
198
|
+
"path",
|
|
199
|
+
{
|
|
200
|
+
fillRule: "evenodd",
|
|
201
|
+
clipRule: "evenodd",
|
|
202
|
+
d: "M2.75 12C2.75 11.3096 3.30964 10.75 4 10.75H20C20.6904 10.75 21.25 11.3096 21.25 12C21.25 12.6904 20.6904 13.25 20 13.25H4C3.30964 13.25 2.75 12.6904 2.75 12Z",
|
|
203
|
+
fill: "currentColor",
|
|
204
|
+
className: "in-data-panel-open:opacity-0 transition-opacity duration-200 ease-out-expo"
|
|
205
|
+
}
|
|
206
|
+
),
|
|
207
|
+
/* @__PURE__ */ jsx(
|
|
208
|
+
"path",
|
|
209
|
+
{
|
|
210
|
+
fillRule: "evenodd",
|
|
211
|
+
clipRule: "evenodd",
|
|
212
|
+
d: "M12 2.75C12.6904 2.75 13.25 3.30964 13.25 4V20C13.25 20.6904 12.6904 21.25 12 21.25C11.3096 21.25 10.75 20.6904 10.75 20V4C10.75 3.30964 11.3096 2.75 12 2.75Z",
|
|
213
|
+
fill: "currentColor"
|
|
214
|
+
}
|
|
215
|
+
)
|
|
216
|
+
] });
|
|
217
|
+
}
|
|
218
|
+
function ChevronDownIcon(props) {
|
|
219
|
+
return /* @__PURE__ */ jsx("svg", { "aria-hidden": "true", width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", ...props, children: /* @__PURE__ */ jsx("path", { d: "M1 3.5L5 7.5L9 3.5", stroke: "currentColor", strokeWidth: "1.5" }) });
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger };
|
|
3
223
|
//# sourceMappingURL=accordion.mjs.map
|
|
4
224
|
//# sourceMappingURL=accordion.mjs.map
|
package/dist/accordion.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"accordion.mjs"}
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/accordion.tsx"],"names":["BaseAccordion"],"mappings":"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","file":"accordion.mjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","import { Accordion as BaseAccordion } from '@base-ui/react/accordion';\nimport type * as React from 'react';\nimport { cn } from '../lib/utils.js';\n\ntype AccordionVariant =\n | 'default'\n | 'split'\n | 'outline'\n | 'nested'\n | 'isolated-bordered'\n | 'isolated-filled'\n | 'isolated-filled-bordered';\n\nfunction Accordion({\n className,\n multiple = false,\n variant = 'default',\n ...props\n}: BaseAccordion.Root.Props & { variant?: AccordionVariant }) {\n return (\n <BaseAccordion.Root\n data-slot=\"accordion\"\n data-variant={variant}\n multiple={multiple}\n className={cn(\n 'group flex w-full flex-col',\n variant === 'split' && 'space-y-2',\n variant === 'outline' && 'overflow-hidden rounded-lg border bg-(--surface)',\n variant === 'nested' && 'rounded-lg border bg-muted p-1',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionItem({ className, ...props }: BaseAccordion.Item.Props) {\n return (\n <BaseAccordion.Item\n data-slot=\"accordion-item\"\n className={cn(\n 'transition-[margin,border-radius,border] duration-250 ease-out-expo',\n // Default variant styles\n 'group-data-[variant=default]:border-(--border) group-data-[variant=default]:border-b group-data-[variant=default]:last:border-b-0',\n // Split variant styles (individual cards)\n 'group-data-[variant=split]:overflow-hidden group-data-[variant=split]:rounded-lg group-data-[variant=split]:border group-data-[variant=split]:border-(--border) group-data-[variant=split]:bg-(--surface)',\n // Outline variant styles (items within single card)\n 'group-data-[variant=outline]:border-(--border) group-data-[variant=outline]:border-b group-data-[variant=outline]:last:border-b-0',\n // Nested variant styles - items within the single outer card\n 'group-data-[variant=nested]:mt-0.5 group-data-[variant=nested]:first:mt-0',\n // Isolated bordered variant styles - dynamically separates open items from closed ones\n // Base styles: all items have borders and background to look like cards\n 'group-data-[variant=isolated-bordered]:overflow-hidden group-data-[variant=isolated-bordered]:border group-data-[variant=isolated-bordered]:border-(--border) group-data-[variant=isolated-bordered]:bg-(--surface)',\n // Closed items: group together by overlapping borders with negative margin\n // Only apply to closed items that follow another closed item (not open items, first item, or items after open items)\n 'group-data-[variant=isolated-bordered]:relative group-data-[variant=isolated-bordered]:not-first:not-data-open:not-[[data-open]+&]:-mt-px',\n // Opened item - separated with margins\n 'group-data-[variant=isolated-bordered]:data-open:mt-2 group-data-[variant=isolated-bordered]:data-open:mb-2 group-data-[variant=isolated-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-bordered]:first:rounded-t-lg group-data-[variant=isolated-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-bordered]:last:rounded-b-lg group-data-[variant=isolated-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:overflow-hidden group-data-[variant=isolated-filled]:bg-muted',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled]:data-open:my-2 group-data-[variant=isolated-filled]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled]:first:rounded-t-lg group-data-[variant=isolated-filled]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled]:last:rounded-b-lg group-data-[variant=isolated-filled]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled]:[&:has(+_[data-open])]:rounded-b-lg',\n // Isolated filled bordered variant - filled background with borders between closed items\n 'group-data-[variant=isolated-filled-bordered]:overflow-hidden group-data-[variant=isolated-filled-bordered]:bg-muted',\n // All items except last have border-bottom to prevent layout shift, default to visible border\n 'group-data-[variant=isolated-filled-bordered]:not-last:border-(--border) group-data-[variant=isolated-filled-bordered]:not-last:border-b',\n // Make border transparent (invisible) for: items before open items, and open items themselves\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:border-transparent',\n 'group-data-[variant=isolated-filled-bordered]:data-open:border-transparent',\n // Opened item - separated with margins and rounded\n 'group-data-[variant=isolated-filled-bordered]:data-open:my-2 group-data-[variant=isolated-filled-bordered]:data-open:rounded-lg',\n // First item\n 'group-data-[variant=isolated-filled-bordered]:first:rounded-t-lg group-data-[variant=isolated-filled-bordered]:data-open:first:mt-0',\n // Last item\n 'group-data-[variant=isolated-filled-bordered]:last:rounded-b-lg group-data-[variant=isolated-filled-bordered]:data-open:last:mb-0',\n // Item after open item: round top corners (start of new group)\n 'group-data-[variant=isolated-filled-bordered]:[[data-open]+&]:rounded-t-lg',\n // Item before open item: round bottom corners (end of group)\n 'group-data-[variant=isolated-filled-bordered]:[&:has(+_[data-open])]:rounded-b-lg',\n\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AccordionHeader({ className, ...props }: BaseAccordion.Header.Props) {\n return (\n <BaseAccordion.Header\n data-slot=\"accordion-header\"\n // `not-prose` guards the trigger from document typography when the\n // accordion is rendered inside a prose/markdown container (e.g. MDX docs),\n // which would otherwise style this heading with large margins and an\n // inflated line-height. Inert outside a prose context.\n className={cn('not-prose', className)}\n {...props}\n />\n );\n}\n\ninterface AccordionTriggerProps extends BaseAccordion.Trigger.Props {\n showIndicator?: boolean;\n indicatorType?: 'chevron' | 'plus';\n indicatorPosition?: 'start' | 'end';\n /** Colour class applied to the indicator glyph, e.g. `text-(--accent-brand)`. Defaults to muted-foreground. */\n indicatorColor?: string;\n icon?: React.ReactNode;\n subtitle?: React.ReactNode;\n}\n\nfunction AccordionTrigger({\n children,\n className,\n showIndicator = true,\n indicatorType = 'plus',\n indicatorPosition = 'end',\n indicatorColor,\n icon,\n subtitle,\n ...props\n}: AccordionTriggerProps) {\n const hasStartIndicator = showIndicator && indicatorPosition === 'start';\n const hasEndIndicator = showIndicator && indicatorPosition === 'end';\n\n const renderIndicator = () => {\n if (!showIndicator) return null;\n\n const indicatorClassName = cn('size-4 shrink-0 transition-transform duration-200 ease-out-expo', indicatorColor);\n\n const indicatorIcon =\n indicatorType === 'chevron' ? (\n <ChevronDownIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n ) : (\n <PlusIcon data-slot=\"accordion-indicator\" className={indicatorClassName} />\n );\n\n return (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {indicatorIcon}\n </span>\n );\n };\n\n return (\n <AccordionHeader>\n <BaseAccordion.Trigger\n data-slot=\"accordion-trigger\"\n data-has-icon={hasStartIndicator ? 'true' : undefined}\n className={cn(\n 'group/trigger flex w-full cursor-pointer items-center justify-between gap-3 py-5 px-3.5 text-left font-medium text-sm outline-none disabled:pointer-events-none disabled:opacity-60',\n // Default variant styles\n 'group-data-[variant=default]:px-0',\n // Split variant styles\n 'group-data-[variant=split]:rounded-t-lg',\n // Nested variant styles - trigger with subtle interaction\n 'group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:px-3 group-data-[variant=nested]:py-2.5 group-data-[variant=nested]:hover:bg-background group-data-[variant=nested]:dark:hover:bg-background/50',\n // Indicator rotation animations\n indicatorType === 'chevron' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-180',\n indicatorType === 'plus' && '[&[data-panel-open]_[data-slot=accordion-indicator]]:rotate-90',\n className,\n )}\n {...props}\n >\n {hasStartIndicator ? renderIndicator() : null}\n\n {/* icon prop — only rendered when indicator is at end position */}\n {icon && !hasStartIndicator && (\n <span className=\"shrink-0 text-muted-foreground\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"underline-offset-2 group-hover/trigger:underline\">{children}</span>\n {subtitle ? <span className=\"text-muted-foreground text-sm no-underline\">{subtitle}</span> : null}\n </div>\n\n {hasEndIndicator ? renderIndicator() : null}\n </BaseAccordion.Trigger>\n </AccordionHeader>\n );\n}\n\nfunction AccordionContent({ children, className, ...props }: BaseAccordion.Panel.Props) {\n return (\n <BaseAccordion.Panel\n data-slot=\"accordion-content\"\n className={cn(\n 'h-(--accordion-panel-height) overflow-hidden text-sm transition-[height,opacity] duration-250 ease-out-expo data-ending-style:h-0 data-starting-style:h-0 data-ending-style:opacity-0 data-starting-style:opacity-0',\n )}\n {...props}\n >\n <div\n className={cn(\n 'p-3.5 text-muted-foreground',\n 'group-data-[variant=default]:px-0 group-data-[variant=default]:pt-0',\n 'group-data-[variant=split]:pt-0',\n 'group-data-[variant=outline]:pt-0',\n // Nested variant\n 'group-data-[variant=nested]:mt-1 group-data-[variant=nested]:mb-0.5 group-data-[variant=nested]:rounded-sm group-data-[variant=nested]:border group-data-[variant=nested]:bg-background group-data-[variant=nested]:p-3 group-data-[variant=nested]:[[data-slot=accordion-item]:last-child_&]:mb-0',\n // Isolated bordered variant\n 'group-data-[variant=isolated-bordered]:pt-0',\n // Isolated filled variant\n 'group-data-[variant=isolated-filled]:pt-0',\n // Isolated filled bordered variant\n 'group-data-[variant=isolated-filled-bordered]:pt-0',\n // Icon alignment - add left padding when parent item contains a trigger with icon\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:pl-[calc(1rem+0.75rem)]',\n '[[data-slot=accordion-item]:has([data-has-icon])_&]:group-data-[variant=default]:pl-[calc(1rem+0.75rem)]',\n className,\n )}\n >\n {children}\n </div>\n </BaseAccordion.Panel>\n );\n}\n\nfunction PlusIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\" {...props}>\n {/* Horizontal bar - fades out when accordion opens */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M2.75 12C2.75 11.3096 3.30964 10.75 4 10.75H20C20.6904 10.75 21.25 11.3096 21.25 12C21.25 12.6904 20.6904 13.25 20 13.25H4C3.30964 13.25 2.75 12.6904 2.75 12Z\"\n fill=\"currentColor\"\n className=\"in-data-panel-open:opacity-0 transition-opacity duration-200 ease-out-expo\"\n />\n {/* Vertical bar - remains visible (becomes horizontal after 90° rotation) */}\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12 2.75C12.6904 2.75 13.25 3.30964 13.25 4V20C13.25 20.6904 12.6904 21.25 12 21.25C11.3096 21.25 10.75 20.6904 10.75 20V4C10.75 3.30964 11.3096 2.75 12 2.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** Inline replacement for the site's `@iconify-icons/mingcute/down-line` glyph. */\nfunction ChevronDownIcon(props: React.ComponentProps<'svg'>) {\n return (\n <svg aria-hidden=\"true\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" {...props}>\n <path d=\"M1 3.5L5 7.5L9 3.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nexport { Accordion, AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger };\n"]}
|
package/dist/action-swap.js
CHANGED
package/dist/action-swap.mjs
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
3
|
-
import '
|
|
1
|
+
"use client";
|
|
2
|
+
import { useReducedMotion, AnimatePresence, motion } from 'framer-motion';
|
|
3
|
+
import { useRef, useState, useLayoutEffect } from 'react';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { twMerge } from 'tailwind-merge';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
// src/lib/ease.ts
|
|
9
|
+
var EASE_OUT = [0.16, 1, 0.3, 1];
|
|
10
|
+
var EASE_OUT_CSS = "cubic-bezier(0.16, 1, 0.3, 1)";
|
|
11
|
+
var SPRING_SWAP = { type: "spring", stiffness: 460, damping: 30, mass: 0.55 };
|
|
12
|
+
function cn(...inputs) {
|
|
13
|
+
return twMerge(clsx(inputs));
|
|
14
|
+
}
|
|
15
|
+
var ROLL_EXIT_TRANSITION = { duration: 0.14, ease: EASE_OUT };
|
|
16
|
+
var ROLL_BLUR = "blur(3px)";
|
|
17
|
+
var AT_REST = { opacity: 1, y: 0, filter: "blur(0px)" };
|
|
18
|
+
var TEXT_VARIANTS = {
|
|
19
|
+
initial: { opacity: 0, y: "90%", filter: ROLL_BLUR },
|
|
20
|
+
animate: { opacity: 1, y: "0%", filter: "blur(0px)", transition: SPRING_SWAP },
|
|
21
|
+
exit: { opacity: 0, y: "-90%", filter: ROLL_BLUR, transition: ROLL_EXIT_TRANSITION }
|
|
22
|
+
};
|
|
23
|
+
var ICON_VARIANTS = {
|
|
24
|
+
initial: { opacity: 0, y: 12, filter: ROLL_BLUR },
|
|
25
|
+
animate: { opacity: 1, y: 0, filter: "blur(0px)", transition: SPRING_SWAP },
|
|
26
|
+
exit: { opacity: 0, y: -12, filter: ROLL_BLUR, transition: ROLL_EXIT_TRANSITION }
|
|
27
|
+
};
|
|
28
|
+
function ActionSwapRollText({ value, children, className }) {
|
|
29
|
+
const reduce = useReducedMotion() ?? false;
|
|
30
|
+
const measureRef = useRef(null);
|
|
31
|
+
const [width, setWidth] = useState();
|
|
32
|
+
useLayoutEffect(() => {
|
|
33
|
+
const nextWidth = measureRef.current?.offsetWidth;
|
|
34
|
+
if (!nextWidth) return;
|
|
35
|
+
setWidth((current) => current === nextWidth ? current : nextWidth);
|
|
36
|
+
});
|
|
37
|
+
return /* @__PURE__ */ jsxs(
|
|
38
|
+
"span",
|
|
39
|
+
{
|
|
40
|
+
className: cn("relative inline-block overflow-hidden whitespace-nowrap align-bottom", className),
|
|
41
|
+
style: { width, transition: reduce ? void 0 : `width 220ms ${EASE_OUT_CSS}` },
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ jsx("span", { ref: measureRef, "aria-hidden": true, className: "invisible inline-block whitespace-nowrap", children }),
|
|
44
|
+
/* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: /* @__PURE__ */ jsx(
|
|
45
|
+
motion.span,
|
|
46
|
+
{
|
|
47
|
+
variants: TEXT_VARIANTS,
|
|
48
|
+
initial: reduce ? false : "initial",
|
|
49
|
+
animate: reduce ? AT_REST : "animate",
|
|
50
|
+
exit: reduce ? void 0 : "exit",
|
|
51
|
+
className: "absolute top-0 left-0 inline-block will-change-[opacity,filter,transform]",
|
|
52
|
+
children
|
|
53
|
+
},
|
|
54
|
+
value
|
|
55
|
+
) })
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
function ActionSwapRollIcon({ value, children, className }) {
|
|
61
|
+
const reduce = useReducedMotion() ?? false;
|
|
62
|
+
return /* @__PURE__ */ jsx("span", { className: cn("relative inline-grid shrink-0 place-items-center overflow-hidden", className), children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", initial: false, children: /* @__PURE__ */ jsx(
|
|
63
|
+
motion.span,
|
|
64
|
+
{
|
|
65
|
+
"aria-hidden": true,
|
|
66
|
+
variants: ICON_VARIANTS,
|
|
67
|
+
initial: reduce ? false : "initial",
|
|
68
|
+
animate: reduce ? AT_REST : "animate",
|
|
69
|
+
exit: reduce ? void 0 : "exit",
|
|
70
|
+
className: "col-start-1 row-start-1 inline-flex items-center justify-center will-change-[opacity,filter,transform]",
|
|
71
|
+
children
|
|
72
|
+
},
|
|
73
|
+
value
|
|
74
|
+
) }) });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { ActionSwapRollIcon, ActionSwapRollText };
|
|
4
78
|
//# sourceMappingURL=action-swap.mjs.map
|
|
5
79
|
//# sourceMappingURL=action-swap.mjs.map
|
package/dist/action-swap.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"action-swap.mjs"}
|
|
1
|
+
{"version":3,"sources":["../src/lib/ease.ts","../src/lib/utils.ts","../src/components/action-swap.tsx"],"names":[],"mappings":"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","file":"action-swap.mjs","sourcesContent":["/**\n * Easing curves shared across landing-ui components.\n */\n\n/** Smooth deceleration — matches the former CSS `ease-out-expo`. */\nexport const easeOut = [0.22, 1, 0.36, 1] as const;\n\n/** Gentle overshoot — bounce-like settle for spring alternatives. */\nexport const easeOutBack = [0.34, 1.56, 0.64, 1] as const;\n\n// ── Content-swap tokens (action-swap) ─────────────────────────────────────\n// Values mirror beui.dev's `lib/ease.ts` so vendored action-swap primitives\n// keep their upstream timing.\n\n/** Strong ease-out — the default `ease-out` reads weak at these durations. */\nexport const EASE_OUT = [0.16, 1, 0.3, 1] as const;\n\n/** CSS string form of {@link EASE_OUT} for inline style transitions. */\nexport const EASE_OUT_CSS = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n/** Content swaps — label/icon slots trading places inside a control. */\nexport const SPRING_SWAP = { type: 'spring', stiffness: 460, damping: 30, mass: 0.55 } as const;\n","import { type ClassValue, clsx } from 'clsx';\nimport type { CSSProperties } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n/**\n * A style object that may carry CSS custom properties (CSS variables)\n * such as `--duration`. React's `CSSProperties` intentionally drops\n * its index signature, so custom properties are not accepted without help.\n */\nexport type CSSPropertiesWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/**\n * Builds a {@link CSSProperties} value that also allows CSS custom properties,\n * so `style` props can be written without an `as React.CSSProperties` cast while\n * still type-checking both the known style keys and the custom-property values.\n *\n * @example\n * <div style={validCssVars({ '--duration': '0.35s', color: 'red' })} />\n */\nexport function validCssVars(style: CSSPropertiesWithVars): CSSProperties {\n return style;\n}\n\n/**\n * Narrows a union to the member(s) that declare `key` — a type-guard\n * replacement for the `in` operator's discriminated-union narrowing.\n */\nexport function hasKey<K extends PropertyKey>(key: K, obj: unknown): obj is Record<K, unknown> {\n return obj !== null && typeof obj === 'object' && Object.hasOwn(obj, key);\n}\n\nexport function noop(): void {\n // intentional no-op\n}\n","'use client';\n// Adapted from beui.dev/components/motion/action-swap (roll variant only).\n// Upstream imports `motion/react`; this project is on framer-motion, and its\n// blur/cascade animations and pre-styled <ActionSwapButton> are omitted — the\n// button's variant classes reference `bg-card`/`bg-primary`, which this site\n// doesn't define as --color-* tokens, so Tailwind would drop them silently.\n\nimport { AnimatePresence, motion, useReducedMotion, type Variants } from 'framer-motion';\nimport { type ReactNode, useLayoutEffect, useRef, useState } from 'react';\nimport { EASE_OUT, EASE_OUT_CSS, SPRING_SWAP } from '../lib/ease.js';\nimport { cn } from '../lib/utils.js';\n\n/** The outgoing half rolls out faster than the incoming half settles. */\nconst ROLL_EXIT_TRANSITION = { duration: 0.14, ease: EASE_OUT } as const;\nconst ROLL_BLUR = 'blur(3px)';\n\n/** Rest state used under reduced motion — no travel, no blur. */\nconst AT_REST = { opacity: 1, y: 0, filter: 'blur(0px)' } as const;\n\n/** Text travels in percentages so the roll scales with the line height. */\nconst TEXT_VARIANTS: Variants = {\n initial: { opacity: 0, y: '90%', filter: ROLL_BLUR },\n animate: { opacity: 1, y: '0%', filter: 'blur(0px)', transition: SPRING_SWAP },\n exit: { opacity: 0, y: '-90%', filter: ROLL_BLUR, transition: ROLL_EXIT_TRANSITION },\n};\n\n/** Icons travel in pixels — a glyph box has no line height to scale against. */\nconst ICON_VARIANTS: Variants = {\n initial: { opacity: 0, y: 12, filter: ROLL_BLUR },\n animate: { opacity: 1, y: 0, filter: 'blur(0px)', transition: SPRING_SWAP },\n exit: { opacity: 0, y: -12, filter: ROLL_BLUR, transition: ROLL_EXIT_TRANSITION },\n};\n\nexport type ActionSwapRollProps = {\n /** Identity of the current content — changing it triggers the roll. */\n value: string;\n children: ReactNode;\n className?: string;\n};\n\n/**\n * Rolls `children` up out of the box while the new content rolls in from below,\n * animating the box's width so labels of different lengths don't snap.\n *\n * The visible label is the accessible name, so for the duration of a swap both\n * the outgoing and incoming text are in the accessibility tree. Give the host\n * control an explicit `aria-label` when that ambiguity matters.\n */\nexport function ActionSwapRollText({ value, children, className }: ActionSwapRollProps) {\n const reduce = useReducedMotion() ?? false;\n const measureRef = useRef<HTMLSpanElement>(null);\n const [width, setWidth] = useState<number>();\n\n // Deliberately un-keyed: the invisible copy is re-measured after every render\n // so the box tracks content it can't diff (fonts finishing, text changing).\n useLayoutEffect(() => {\n const nextWidth = measureRef.current?.offsetWidth;\n if (!nextWidth) return;\n setWidth((current) => (current === nextWidth ? current : nextWidth));\n });\n\n return (\n <span\n className={cn('relative inline-block overflow-hidden whitespace-nowrap align-bottom', className)}\n style={{ width, transition: reduce ? undefined : `width 220ms ${EASE_OUT_CSS}` }}\n >\n {/* Width source: laid out in flow but never painted, so the absolutely\n positioned live copies below have something to size the box. */}\n <span ref={measureRef} aria-hidden={true} className=\"invisible inline-block whitespace-nowrap\">\n {children}\n </span>\n <AnimatePresence initial={false}>\n <motion.span\n key={value}\n variants={TEXT_VARIANTS}\n initial={reduce ? false : 'initial'}\n animate={reduce ? AT_REST : 'animate'}\n exit={reduce ? undefined : 'exit'}\n className=\"absolute top-0 left-0 inline-block will-change-[opacity,filter,transform]\"\n >\n {children}\n </motion.span>\n </AnimatePresence>\n </span>\n );\n}\n\n/**\n * Icon counterpart to {@link ActionSwapRollText}. `popLayout` pulls the outgoing\n * icon out of flow so the pair overlaps in one cell instead of sitting side by\n * side mid-swap. Always `aria-hidden` — icons here restate a visible label.\n */\nexport function ActionSwapRollIcon({ value, children, className }: ActionSwapRollProps) {\n const reduce = useReducedMotion() ?? false;\n\n return (\n <span className={cn('relative inline-grid shrink-0 place-items-center overflow-hidden', className)}>\n <AnimatePresence mode=\"popLayout\" initial={false}>\n <motion.span\n key={value}\n aria-hidden={true}\n variants={ICON_VARIANTS}\n initial={reduce ? false : 'initial'}\n animate={reduce ? AT_REST : 'animate'}\n exit={reduce ? undefined : 'exit'}\n className=\"col-start-1 row-start-1 inline-flex items-center justify-center will-change-[opacity,filter,transform]\"\n >\n {children}\n </motion.span>\n </AnimatePresence>\n </span>\n );\n}\n"]}
|
package/dist/animated-beam.js
CHANGED