@flikk/ui 1.0.0-beta.24 → 1.0.0-beta.25

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.
@@ -8,9 +8,9 @@ const accordionTheme = {
8
8
  // Item styles for stacked variant (shared borders, no spacing)
9
9
  itemStyleStacked: "bg-white border-t border-[var(--color-border)] first-of-type:border-t-0",
10
10
  // Trigger styles (shared across variants)
11
- triggerStyle: "flex w-full gap-3 items-center px-4 py-2.5 text-left font-medium transition-all duration-200 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-text-primary)]",
11
+ triggerStyle: "flex w-full gap-3 items-center px-4 py-2.5 text-left font-medium transition-all duration-200 cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-primary)] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-text-primary)] text-sm",
12
12
  // Body styles (shared across variants)
13
- bodyStyle: "data-[state=closed]:max-h-0 data-[state=open]:max-h-[320px] accordion-content overflow-hidden",
13
+ bodyStyle: "data-[state=closed]:max-h-0 data-[state=open]:max-h-[320px] accordion-content overflow-hidden text-sm",
14
14
  // Body inner wrapper styles
15
15
  bodyInnerStyle: "p-4 pb-2.5 pt-0",
16
16
  };
@@ -46,7 +46,7 @@ const Breadcrumbs = ({ items, separator, maxItems = 4, variant = "default", clas
46
46
  // Render individual breadcrumb item wrapped in its own <li>
47
47
  const renderItem = (item, index, isLast) => {
48
48
  const isCurrentPage = isLast || !item.href;
49
- return (jsxs("li", { className: "flex items-center", children: [isCurrentPage ? (jsx("span", { className: cn("flex items-center text-base", theme.current), "aria-current": "page", children: renderItemContent(item) })) : (jsx("a", { href: item.href, className: cn("flex items-center text-base", theme.link), "aria-label": typeof item.label === 'string' ? `Navigate to ${item.label}` : undefined, children: renderItemContent(item) })), !isLast && (jsx("span", { className: cn("flex items-center ml-1", theme.separator), "aria-hidden": "true", children: SeparatorComponent }))] }, `breadcrumb-${index}`));
49
+ return (jsxs("li", { className: "flex items-center", children: [isCurrentPage ? (jsx("span", { className: cn("flex items-center text-sm", theme.current), "aria-current": "page", children: renderItemContent(item) })) : (jsx("a", { href: item.href, className: cn("flex items-center text-sm", theme.link), "aria-label": typeof item.label === 'string' ? `Navigate to ${item.label}` : undefined, children: renderItemContent(item) })), !isLast && (jsx("span", { className: cn("flex items-center ml-1", theme.separator), "aria-hidden": "true", children: SeparatorComponent }))] }, `breadcrumb-${index}`));
50
50
  };
51
51
  // Render ellipsis with dropdown wrapped in its own <li>
52
52
  const renderEllipsis = (separatorIndex) => {
@@ -10,7 +10,7 @@ const breadcrumbsTheme = {
10
10
  link: "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors duration-150 font-medium",
11
11
  current: "text-[var(--color-text-primary)] font-medium",
12
12
  separator: "text-[var(--color-text-muted)] select-none",
13
- ellipsis: "text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors duration-150 cursor-pointer p-1 rounded hover:bg-[var(--color-background-tertiary)]",
13
+ ellipsis: "text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-primary)] transition-colors duration-150 cursor-pointer p-1 rounded hover:bg-[var(--color-background-tertiary)]",
14
14
  };
15
15
  /**
16
16
  * Variant styles for different breadcrumb appearances
@@ -21,7 +21,7 @@ const breadcrumbsVariants = {
21
21
  link: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition-colors duration-150 font-normal",
22
22
  current: "text-[var(--color-text-secondary)] font-normal",
23
23
  separator: "text-[var(--color-border)]",
24
- ellipsis: "text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition-colors duration-150 cursor-pointer p-1 rounded hover:bg-[var(--color-background-secondary)]",
24
+ ellipsis: "text-sm text-[var(--color-text-muted)] hover:text-[var(--color-text-secondary)] transition-colors duration-150 cursor-pointer p-1 rounded hover:bg-[var(--color-background-secondary)]",
25
25
  },
26
26
  };
27
27
  /**
@@ -371,7 +371,7 @@ const Calendar = React__default.forwardRef(({ mode = 'single', value, defaultVal
371
371
  }
372
372
  }
373
373
  }, [minDate, maxDate, customIsDateDisabled, currentMonth, currentYear, onViewDateChange, mode, value, onChange, selectedValue, rangeSelectionState]);
374
- return (jsxs("div", { ref: ref, className: cn(calendarTheme.baseStyle, className), ...props, children: [jsxs("div", { className: calendarTheme.headerStyle, children: [onNavigatePrev !== null && (jsx(Button, { onClick: navigateToPreviousMonth, "aria-label": "Previous month", disabled: !canNavigateToPrev, iconOnly: true, variant: "link", color: "neutral", size: "sm", children: jsx(ChevronLeftIcon, { className: "size-4", strokeWidth: 2 }) })), onNavigatePrev === null && jsx("div", { className: "w-8" }), resolvedHeaderMode === 'static' ? (jsxs("h2", { className: calendarTheme.titleStyle, children: [getMonthName(viewDate, months), " ", currentYear] })) : (jsxs("div", { className: calendarTheme.headerDropdownsStyle, children: [(resolvedHeaderMode === 'dropdown' || (resolvedHeaderMode === 'mixed' && enableMonthDropdown)) && (jsx(Select, { value: currentMonth.toString(), onChange: handleMonthChange, options: monthOptions, displayValue: currentAbbreviatedMonth, size: "sm", className: "text-base font-medium" })), (resolvedHeaderMode === 'dropdown' || (resolvedHeaderMode === 'mixed' && enableYearDropdown)) && (jsx(Select, { value: currentYear.toString(), onChange: handleYearChange, options: yearOptions, size: "sm", className: "text-base font-medium" }))] })), onNavigateNext !== null && (jsx(Button, { onClick: navigateToNextMonth, "aria-label": "Next month", disabled: !canNavigateToNext, iconOnly: true, variant: "link", color: "neutral", size: "sm", children: jsx(ChevronRightIcon, { className: "size-4", strokeWidth: 2 }) })), onNavigateNext === null && jsx("div", { className: "w-8" })] }), jsx("div", { className: calendarTheme.weekdaysStyle, children: weekdays.map((day) => (jsx("div", { className: calendarTheme.weekdayStyle, children: day }, day))) }), jsx("div", { className: calendarTheme.daysGridStyle, children: calendarDays.map((day, index) => {
374
+ return (jsxs("div", { ref: ref, className: cn(calendarTheme.baseStyle, className), ...props, children: [jsxs("div", { className: calendarTheme.headerStyle, children: [onNavigatePrev !== null && (jsx(Button, { onClick: navigateToPreviousMonth, "aria-label": "Previous month", disabled: !canNavigateToPrev, iconOnly: true, variant: "link", color: "neutral", size: "sm", children: jsx(ChevronLeftIcon, { className: "size-4", strokeWidth: 2 }) })), onNavigatePrev === null && jsx("div", { className: "w-8" }), resolvedHeaderMode === 'static' ? (jsxs("h2", { className: calendarTheme.titleStyle, children: [getMonthName(viewDate, months), " ", currentYear] })) : (jsxs("div", { className: calendarTheme.headerDropdownsStyle, children: [(resolvedHeaderMode === 'dropdown' || (resolvedHeaderMode === 'mixed' && enableMonthDropdown)) && (jsx(Select, { value: currentMonth.toString(), onChange: handleMonthChange, options: monthOptions, displayValue: currentAbbreviatedMonth, size: "sm", className: "font-medium" })), (resolvedHeaderMode === 'dropdown' || (resolvedHeaderMode === 'mixed' && enableYearDropdown)) && (jsx(Select, { value: currentYear.toString(), onChange: handleYearChange, options: yearOptions, size: "sm", className: "font-medium" }))] })), onNavigateNext !== null && (jsx(Button, { onClick: navigateToNextMonth, "aria-label": "Next month", disabled: !canNavigateToNext, iconOnly: true, variant: "link", color: "neutral", size: "sm", children: jsx(ChevronRightIcon, { className: "size-4", strokeWidth: 2 }) })), onNavigateNext === null && jsx("div", { className: "w-8" })] }), jsx("div", { className: calendarTheme.weekdaysStyle, children: weekdays.map((day) => (jsx("div", { className: calendarTheme.weekdayStyle, children: day }, day))) }), jsx("div", { className: calendarTheme.daysGridStyle, children: calendarDays.map((day, index) => {
375
375
  var _a;
376
376
  const dayNumber = day.date.getDate();
377
377
  const isInStrip = day.isRangeStart || day.isRangeEnd || day.isInRange;
@@ -182,7 +182,9 @@ const CalendarMini = React__default.forwardRef(({ selectedDate, currentMonth, on
182
182
  }, [activeMonth]);
183
183
  // Check if date is selected
184
184
  const isDateSelected = useCallback((date) => {
185
- return defaultSelectedDate ? isSameDay(date, defaultSelectedDate) : false;
185
+ return defaultSelectedDate
186
+ ? isSameDay(date, defaultSelectedDate)
187
+ : false;
186
188
  }, [defaultSelectedDate]);
187
189
  // Check if date is today
188
190
  const isDateToday = useCallback((date) => {
@@ -242,7 +244,7 @@ const CalendarMini = React__default.forwardRef(({ selectedDate, currentMonth, on
242
244
  day: "numeric",
243
245
  }), "aria-selected": isSelected, "aria-current": isToday ? "date" : undefined, "aria-disabled": disabled, type: "button", ...(enableAnimations && {
244
246
  whileTap: !disabled ? { scale: 0.95 } : undefined,
245
- }), children: [jsx("div", { className: "text-base font-medium opacity-60", children: formatDayName(date) }), jsx("time", { dateTime: date.toISOString(), className: cn("font-semibold"), children: formatDateNumber(date) })] }, date.toISOString()));
247
+ }), children: [jsx("div", { className: "text-sm font-medium opacity-60", children: formatDayName(date) }), jsx("time", { dateTime: date.toISOString(), className: cn("font-semibold"), children: formatDateNumber(date) })] }, date.toISOString()));
246
248
  }) }, `${startDate.getTime()}-dates`) }) }) })] }), jsx(Button, { iconOnly: true, color: "neutral", variant: "soft", className: "!flex-shrink !flex-grow-0 !w-fit self-stretch !h-auto !min-h-0 px-0.5", onClick: handleNextMonth, "aria-label": "Next month", children: jsx(ChevronRightIcon, { className: "size-5 text-[var(--color-text-primary)]" }) })] }));
247
249
  });
248
250
  CalendarMini.displayName = "CalendarMini";
@@ -1,5 +1,5 @@
1
1
  const calendarMiniTheme = {
2
- baseStyle: "flex items-center justify-center gap-1 transition-all duration-300",
2
+ baseStyle: "flex items-center justify-center gap-1 transition-all duration-300 text-sm",
3
3
  monthRowStyle: "flex flex-1 gap-4 overflow-x-auto scrollbar-hide scroll-smooth snap-x snap-mandatory px-4 ml-3",
4
4
  monthItemStyle: "font-semibold text-[var(--color-text-secondary)] cursor-pointer transition-colors hover:text-[var(--color-text-primary)] flex-shrink-0 snap-center data-[state=active]:text-[var(--color-text-primary)] data-[state=active]:opacity-100",
5
5
  dateRowStyle: "relative overflow-hidden px-4 py-0.5",
@@ -5,7 +5,7 @@ const emptyTheme = {
5
5
  // Base container styles - customizable spacing, colors, and layout
6
6
  baseStyle: "flex flex-col items-center justify-center text-center w-full max-w-md mx-auto space-y-3 py-12 px-6 ",
7
7
  // Title text styles - customizable typography and colors
8
- titleStyle: "text-base font-semibold text-[var(--color-text-primary)]",
8
+ titleStyle: "text-sm font-semibold text-[var(--color-text-primary)]",
9
9
  // Description text styles - customizable typography and colors
10
10
  subtitleStyle: "text-sm text-[var(--color-text-muted)]",
11
11
  };
@@ -35,7 +35,7 @@ onAnimationStart: _onAnimationStart, onAnimationEnd: _onAnimationEnd, onDrag: _o
35
35
  }, [shouldReduceMotion]);
36
36
  return (jsx(motion.a, { ref: ref, href: disabled ? undefined : href, className: cn(buttonTheme.baseStyle, themeClasses.colorClasses, themeClasses.variantClasses, themeClasses.sizeClasses, themeClasses.stateClasses,
37
37
  // Special case for link variant to have an underline
38
- "underline underline-offset-4 rounded-none font-semibold", className), "data-color": color, "data-variant": resolvedVariant, "data-size": size, "aria-disabled": disabled || undefined, ...(disabled ? {} : animationProps), ...props, children: children }));
38
+ "underline underline-offset-4 rounded-none font-semibold text-sm", className), "data-color": color, "data-variant": resolvedVariant, "data-size": size, "aria-disabled": disabled || undefined, ...(disabled ? {} : animationProps), ...props, children: children }));
39
39
  });
40
40
  Link.displayName = "Link";
41
41
 
@@ -4,13 +4,6 @@ import { Variants } from "motion/react";
4
4
  * Provides a fade + slide effect when items enter the viewport
5
5
  */
6
6
  export declare const timelineItemVariants: Variants;
7
- /**
8
- * Get directional slide variants based on alignment side
9
- * Items slide in from the opposite direction of their placement
10
- *
11
- * @param side - 'left' slides from left, 'right' slides from right
12
- */
13
- export declare const getDirectionalVariants: (side: "left" | "right") => Variants;
14
7
  /**
15
8
  * Horizontal layout item entry animation
16
9
  * Items fade in from below
@@ -20,32 +20,6 @@ const timelineItemVariants = {
20
20
  },
21
21
  },
22
22
  };
23
- /**
24
- * Get directional slide variants based on alignment side
25
- * Items slide in from the opposite direction of their placement
26
- *
27
- * @param side - 'left' slides from left, 'right' slides from right
28
- */
29
- const getDirectionalVariants = (side) => ({
30
- hidden: {
31
- opacity: 0,
32
- x: side === "left" ? -30 : 30,
33
- y: 10,
34
- transition: {
35
- duration: 0.3,
36
- ease: "easeOut",
37
- },
38
- },
39
- visible: {
40
- opacity: 1,
41
- x: 0,
42
- y: 0,
43
- transition: {
44
- duration: 0.5,
45
- ease: [0.04, 0.62, 0.23, 0.98],
46
- },
47
- },
48
- });
49
23
  /**
50
24
  * Horizontal layout item entry animation
51
25
  * Items fade in from below
@@ -89,4 +63,4 @@ const timelineMarkerVariants = {
89
63
  },
90
64
  };
91
65
 
92
- export { getDirectionalVariants, timelineHorizontalItemVariants, timelineItemVariants, timelineMarkerVariants };
66
+ export { timelineHorizontalItemVariants, timelineItemVariants, timelineMarkerVariants };
@@ -14,7 +14,7 @@ const useTimelineContext = () => {
14
14
  throw new Error("Timeline compound components must be used within <Timeline>");
15
15
  return ctx;
16
16
  };
17
- const TimelineRoot = React__default.forwardRef(({ children, className, layout = "vertical", align = "left", theme: themeOverrides, ...props }, ref) => {
17
+ const TimelineRoot = React__default.forwardRef(({ children, className, layout = "vertical", theme: themeOverrides, ...props }, ref) => {
18
18
  // Merge theme with any overrides
19
19
  const theme = useMemo(() => ({
20
20
  ...timelineTheme,
@@ -29,12 +29,11 @@ const TimelineRoot = React__default.forwardRef(({ children, className, layout =
29
29
  // Context value to be provided to children
30
30
  const contextValue = useMemo(() => ({
31
31
  layout,
32
- align,
33
32
  theme,
34
33
  totalItems,
35
- }), [layout, align, theme, totalItems]);
34
+ }), [layout, theme, totalItems]);
36
35
  const isHorizontal = layout === "horizontal";
37
- return (jsx(TimelineContext.Provider, { value: contextValue, children: jsx("div", { ref: ref, className: cn(isHorizontal ? theme.baseStyleHorizontal : theme.baseStyle, className), "data-layout": layout, "data-align": align, role: "list", "aria-label": "Timeline", ...props, children: children }) }));
36
+ return (jsx(TimelineContext.Provider, { value: contextValue, children: jsx("div", { ref: ref, className: cn(isHorizontal ? theme.baseStyleHorizontal : theme.baseStyle, className), "data-layout": layout, role: "list", "aria-label": "Timeline", ...props, children: children }) }));
38
37
  });
39
38
  TimelineRoot.displayName = "Timeline";
40
39
  // Attach compound subcomponents
@@ -3,13 +3,6 @@ import React from "react";
3
3
  * Layout orientation for the Timeline
4
4
  */
5
5
  export type TimelineLayout = "vertical" | "horizontal";
6
- /**
7
- * Alignment mode for vertical timeline items
8
- * - left: all items on the left side of the line
9
- * - right: all items on the right side of the line
10
- * - alternate: items alternate between left and right
11
- */
12
- export type TimelineAlign = "left" | "right" | "alternate";
13
6
  /**
14
7
  * Status of an individual timeline item
15
8
  * - completed: item is finished (success color)
@@ -41,11 +34,6 @@ export interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {
41
34
  * @default 'vertical'
42
35
  */
43
36
  layout?: TimelineLayout;
44
- /**
45
- * Alignment of items relative to the timeline line (vertical only)
46
- * @default 'left'
47
- */
48
- align?: TimelineAlign;
49
37
  /**
50
38
  * Theme overrides for customizing styles
51
39
  */
@@ -60,7 +48,6 @@ export interface TimelineProps extends React.HTMLAttributes<HTMLDivElement> {
60
48
  */
61
49
  export interface TimelineContextValue {
62
50
  layout: TimelineLayout;
63
- align: TimelineAlign;
64
51
  theme: TimelineThemeOverrides & {
65
52
  baseStyle: string;
66
53
  baseStyleHorizontal: string;
@@ -5,16 +5,12 @@ import { useTimelineContext } from './Timeline.js';
5
5
  import { useTimelineItemContext } from './TimelineItem.js';
6
6
 
7
7
  const TimelineContent = React__default.forwardRef(({ children, className, ...props }, ref) => {
8
- const { theme, layout, align } = useTimelineContext();
9
- const { isLast, index } = useTimelineItemContext();
8
+ const { theme, layout } = useTimelineContext();
9
+ const { isLast } = useTimelineItemContext();
10
10
  const isHorizontal = layout === "horizontal";
11
- // For alternate layout, determine text alignment
12
- const isAlternateRight = align === "alternate" && index % 2 !== 0;
13
11
  return (jsx("div", { ref: ref, className: cn(isHorizontal ? theme.contentStyleHorizontal : theme.contentStyle,
14
12
  // Remove bottom padding on last item
15
- !isHorizontal && isLast && "pb-0",
16
- // Align text based on side in alternate mode
17
- !isHorizontal && isAlternateRight && "text-right", !isHorizontal && align === "right" && "text-right", className), ...props, children: children }));
13
+ !isHorizontal && isLast && "pb-0", className), ...props, children: children }));
18
14
  });
19
15
  TimelineContent.displayName = "TimelineContent";
20
16
 
@@ -3,7 +3,7 @@ import React__default, { createContext, useRef, useState, useEffect, useContext
3
3
  import { useReducedMotion, motion } from 'motion/react';
4
4
  import { cn } from '../../../utils/cn.js';
5
5
  import { useTimelineContext } from './Timeline.js';
6
- import { timelineHorizontalItemVariants, getDirectionalVariants, timelineItemVariants } from './Timeline.animations.js';
6
+ import { timelineHorizontalItemVariants, timelineItemVariants } from './Timeline.animations.js';
7
7
 
8
8
  // Create context for TimelineItem
9
9
  const TimelineItemContext = createContext(undefined);
@@ -15,7 +15,7 @@ const useTimelineItemContext = () => {
15
15
  return ctx;
16
16
  };
17
17
  const TimelineItem = React__default.forwardRef(({ children, className, status = "pending", ...props }, ref) => {
18
- const { layout, align, theme, totalItems } = useTimelineContext();
18
+ const { layout, theme, totalItems } = useTimelineContext();
19
19
  const shouldReduceMotion = useReducedMotion();
20
20
  const itemRef = useRef(null);
21
21
  const [isVisible, setIsVisible] = useState(false);
@@ -48,21 +48,12 @@ const TimelineItem = React__default.forwardRef(({ children, className, status =
48
48
  const isFirst = index === 0;
49
49
  const isLast = index === totalItems - 1;
50
50
  const isHorizontal = layout === "horizontal";
51
- // Determine which side this item is on for alternate layout
52
- const itemSide = align === "alternate"
53
- ? index % 2 === 0
54
- ? "left"
55
- : "right"
56
- : align;
57
- // Select animation variants based on layout and alignment
51
+ // Select animation variants based on layout
58
52
  const getVariants = () => {
59
53
  if (shouldReduceMotion)
60
54
  return undefined;
61
55
  if (isHorizontal)
62
56
  return timelineHorizontalItemVariants;
63
- if (align === "alternate") {
64
- return getDirectionalVariants(itemSide);
65
- }
66
57
  return timelineItemVariants;
67
58
  };
68
59
  // Context value for Marker and Content
@@ -72,14 +63,10 @@ const TimelineItem = React__default.forwardRef(({ children, className, status =
72
63
  isFirst,
73
64
  isLast,
74
65
  };
75
- // Build className based on layout
76
- const isAlternateRight = align === "alternate" && index % 2 !== 0;
77
66
  // Filter out conflicting motion props from rest
78
67
  const { onDrag, onDragEnd, onDragStart, onAnimationStart, onAnimationEnd, ...safeProps } = props;
79
68
  const variants = getVariants();
80
- return (jsx(TimelineItemContext.Provider, { value: contextValue, children: jsx(motion.div, { ref: ref || itemRef, className: cn(isHorizontal ? theme.itemStyleHorizontal : theme.itemStyle,
81
- // For right-aligned or alternate-right, reverse the flex direction
82
- !isHorizontal && align === "right" && "flex-row-reverse", !isHorizontal && isAlternateRight && "flex-row-reverse", className), "data-status": status, "data-side": itemSide, "data-layout": layout, role: "listitem", initial: variants ? "hidden" : undefined, animate: variants && isVisible ? "visible" : variants ? "hidden" : undefined, variants: variants, ...safeProps, children: children }) }));
69
+ return (jsx(TimelineItemContext.Provider, { value: contextValue, children: jsx(motion.div, { ref: ref || itemRef, className: cn(isHorizontal ? theme.itemStyleHorizontal : theme.itemStyle, className), "data-status": status, "data-layout": layout, role: "listitem", initial: variants ? "hidden" : undefined, animate: variants && isVisible ? "visible" : variants ? "hidden" : undefined, variants: variants, ...safeProps, children: children }) }));
83
70
  });
84
71
  TimelineItem.displayName = "TimelineItem";
85
72
 
@@ -1,4 +1,4 @@
1
1
  import { Timeline } from "./Timeline";
2
- import { TimelineProps, TimelineItemProps, TimelineMarkerProps, TimelineContentProps, TimelineContextValue, TimelineItemContextValue, TimelineThemeOverrides, TimelineLayout, TimelineAlign, TimelineItemStatus } from "./Timeline.types";
2
+ import { TimelineProps, TimelineItemProps, TimelineMarkerProps, TimelineContentProps, TimelineContextValue, TimelineItemContextValue, TimelineThemeOverrides, TimelineLayout, TimelineItemStatus } from "./Timeline.types";
3
3
  export { Timeline };
4
- export type { TimelineProps, TimelineItemProps, TimelineMarkerProps, TimelineContentProps, TimelineContextValue, TimelineItemContextValue, TimelineThemeOverrides, TimelineLayout, TimelineAlign, TimelineItemStatus, };
4
+ export type { TimelineProps, TimelineItemProps, TimelineMarkerProps, TimelineContentProps, TimelineContextValue, TimelineItemContextValue, TimelineThemeOverrides, TimelineLayout, TimelineItemStatus, };
@@ -24,6 +24,8 @@ export { NoiseOverlay } from "./NoiseOverlay";
24
24
  export type { NoiseOverlayProps, NoiseBlendMode } from "./NoiseOverlay";
25
25
  export { Spotlight } from "./Spotlight";
26
26
  export type { SpotlightProps } from "./Spotlight";
27
+ export { SpotlightBorder } from "./SpotlightBorder";
28
+ export type { SpotlightBorderProps, SpotlightBorderVariation, } from "./SpotlightBorder";
27
29
  export { ParallaxSection } from "./ParallaxSection";
28
30
  export type { ParallaxSectionProps } from "./ParallaxSection";
29
31
  export { ScrollReveal } from "./ScrollReveal";
@@ -36,3 +38,8 @@ export { InteractiveCharacters } from "./InteractiveCharacters";
36
38
  export type { InteractiveCharactersProps, CharacterState, CharacterSize, } from "./InteractiveCharacters";
37
39
  export { InsetCircleButton, InsetPill } from "./Neumorphic";
38
40
  export type { InsetCircleButtonProps, InsetPillProps, } from "./Neumorphic";
41
+ export { AIOrb } from "./AIOrb";
42
+ export type { AIOrbProps, OrbState } from "./AIOrb";
43
+ export type { DotSphereProps, LiquidProps, AuraProps } from "./AIOrb";
44
+ export { Particles } from "./Particles";
45
+ export type { ParticlesProps } from "./Particles";
@@ -11,6 +11,7 @@ export { GridPattern } from './GridPattern/GridPattern.js';
11
11
  export { DotPattern } from './DotPattern/DotPattern.js';
12
12
  export { NoiseOverlay } from './NoiseOverlay/NoiseOverlay.js';
13
13
  export { Spotlight } from './Spotlight/Spotlight.js';
14
+ export { SpotlightBorder } from './SpotlightBorder/SpotlightBorder.js';
14
15
  export { ParallaxSection } from './ParallaxSection/ParallaxSection.js';
15
16
  export { ScrollReveal } from './ScrollReveal/ScrollReveal.js';
16
17
  export { StickyScroll } from './StickyScroll/StickyScroll.js';
@@ -18,3 +19,5 @@ export { PageTransition } from './PageTransition/PageTransition.js';
18
19
  export { InteractiveCharacters } from './InteractiveCharacters/InteractiveCharacters.js';
19
20
  export { InsetCircleButton } from './Neumorphic/InsetCircleButton.js';
20
21
  export { InsetPill } from './Neumorphic/InsetPill.js';
22
+ export { AIOrb } from './AIOrb/AIOrb.js';
23
+ export { Particles } from './Particles/Particles.js';
@@ -379,7 +379,7 @@ const SelectInner = ({ id, name, size = "md", state = "default", value, displayV
379
379
  .filter(Boolean);
380
380
  const displayed = selectedOpts.slice(0, maxDisplayedChips);
381
381
  const overflow = selectedOpts.length - maxDisplayedChips;
382
- return (jsxs("div", { className: theme.chipContainerStyle, children: [jsx(AnimatePresence, { mode: "popLayout", children: displayed.map((opt) => (jsx(Tag, { size: "sm", onRemove: () => removeValue(opt.value), className: "shrink-0 max-w-[120px] truncate rounded-md border-none", children: opt.label }, String(opt.id)))) }), overflow > 0 && (jsxs("span", { className: theme.chipOverflowStyle, children: ["+", overflow, " more"] }))] }));
382
+ return (jsxs("div", { className: theme.chipContainerStyle, children: [jsx(AnimatePresence, { mode: "popLayout", children: displayed.map((opt) => (jsx(Tag, { size: "sm", onRemove: () => removeValue(opt.value), className: "shrink-0 max-w-[120px] truncate", children: opt.label }, String(opt.id)))) }), overflow > 0 && (jsxs("span", { className: theme.chipOverflowStyle, children: ["+", overflow, " more"] }))] }));
383
383
  }, [multiple, selectedValues, options, maxDisplayedChips, theme.chipContainerStyle, theme.chipOverflowStyle, removeValue]);
384
384
  const computedDisplayValue = displayValue ||
385
385
  (multiple