@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.
- package/dist/components/core/Accordion/Accordion.theme.js +2 -2
- package/dist/components/core/Breadcrumbs/Breadcrumbs.js +1 -1
- package/dist/components/core/Breadcrumbs/Breadcrumbs.theme.js +2 -2
- package/dist/components/core/Calendar/Calendar.js +1 -1
- package/dist/components/core/Calendar/CalendarMini/CalendarMini.js +4 -2
- package/dist/components/core/Calendar/CalendarMini/CalendarMini.theme.js +1 -1
- package/dist/components/core/Empty/Empty.theme.js +1 -1
- package/dist/components/core/Link/Link.js +1 -1
- package/dist/components/data-display/Timeline/Timeline.animations.d.ts +0 -7
- package/dist/components/data-display/Timeline/Timeline.animations.js +1 -27
- package/dist/components/data-display/Timeline/Timeline.js +3 -4
- package/dist/components/data-display/Timeline/Timeline.types.d.ts +0 -13
- package/dist/components/data-display/Timeline/TimelineContent.js +3 -7
- package/dist/components/data-display/Timeline/TimelineItem.js +4 -17
- package/dist/components/data-display/Timeline/index.d.ts +2 -2
- package/dist/components/effects/index.d.ts +7 -0
- package/dist/components/effects/index.js +3 -0
- package/dist/components/forms/Select/Select.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -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-
|
|
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: "
|
|
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
|
|
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-
|
|
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-
|
|
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 {
|
|
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",
|
|
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,
|
|
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,
|
|
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
|
|
9
|
-
const { isLast
|
|
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,
|
|
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,
|
|
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
|
-
//
|
|
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,
|
|
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,
|
|
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
|
|
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
|