@veevarts/design-system 1.12.0-alpha.2 → 1.12.0-alpha.4
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/index.cjs +11 -11
- package/dist/index.js +4398 -3717
- package/dist/patterns/CatalogItemCard/CatalogItemCard.d.ts +7 -0
- package/dist/patterns/CatalogItemCard/index.d.ts +2 -0
- package/dist/patterns/CatalogItemCard/type.d.ts +82 -0
- package/dist/patterns/EventDetails/EventDetails.d.ts +3 -1
- package/dist/patterns/FeedbackState/FeedbackState.d.ts +23 -0
- package/dist/patterns/FeedbackState/index.d.ts +2 -0
- package/dist/patterns/FeedbackState/type.d.ts +40 -0
- package/dist/patterns/FilterPopover/FilterPopover.d.ts +6 -0
- package/dist/patterns/FilterPopover/index.d.ts +2 -0
- package/dist/patterns/FilterPopover/type.d.ts +85 -0
- package/dist/patterns/ItemCard/type.d.ts +52 -0
- package/dist/patterns/OfferCard/OfferCard.d.ts +1 -1
- package/dist/patterns/OfferCard/types.d.ts +93 -2
- package/dist/patterns/OfferCard/variants/OfferCardList.d.ts +2 -2
- package/dist/patterns/SessionTimeline/SessionTimeline.d.ts +7 -0
- package/dist/patterns/SessionTimeline/index.d.ts +2 -0
- package/dist/patterns/SessionTimeline/type.d.ts +76 -0
- package/dist/patterns/Summary/types.d.ts +12 -5
- package/dist/patterns/Summary/useIsMobile.d.ts +17 -0
- package/dist/patterns/index.d.ts +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { CatalogItemCardProps } from './type';
|
|
3
|
+
export declare const CatalogItemCard: {
|
|
4
|
+
({ id, title, media, imageUrl, imageAlt, imageClassName, imageAspect, meta, price, action, footer, onPress, isPressable, isDisabled, compact, className, bodyClassName, footerClassName, dataTestId, }: CatalogItemCardProps): JSX.Element;
|
|
5
|
+
displayName: string;
|
|
6
|
+
};
|
|
7
|
+
export default CatalogItemCard;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ButtonProps } from '../../components';
|
|
2
|
+
/**
|
|
3
|
+
* Metadata row displayed under the card title.
|
|
4
|
+
*/
|
|
5
|
+
export interface CatalogItemCardMetaItem {
|
|
6
|
+
/** Iconify icon name for the metadata row. */
|
|
7
|
+
icon: string;
|
|
8
|
+
/** Human-readable metadata value. */
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Optional price block shown in the card footer.
|
|
13
|
+
*/
|
|
14
|
+
export interface CatalogItemCardPrice {
|
|
15
|
+
/** Optional prefix before the value, typically `From` or `Starts at`. */
|
|
16
|
+
label: string;
|
|
17
|
+
/** Fully formatted amount to render. */
|
|
18
|
+
value: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Optional action shown in the card footer.
|
|
22
|
+
*/
|
|
23
|
+
export interface CatalogItemCardAction {
|
|
24
|
+
/** Action label for the button. */
|
|
25
|
+
label: string;
|
|
26
|
+
/** Iconify icon name. */
|
|
27
|
+
icon?: string;
|
|
28
|
+
/** Click handler for the action button. */
|
|
29
|
+
onPress?: () => void;
|
|
30
|
+
/** HeroUI button variant. */
|
|
31
|
+
variant?: ButtonProps['variant'];
|
|
32
|
+
/** HeroUI button color. */
|
|
33
|
+
color?: ButtonProps['color'];
|
|
34
|
+
/** HeroUI button size. */
|
|
35
|
+
size?: ButtonProps['size'];
|
|
36
|
+
/** Additional classes for action button. */
|
|
37
|
+
className?: string;
|
|
38
|
+
/** Disabled state for action button. */
|
|
39
|
+
isDisabled?: boolean;
|
|
40
|
+
/** Optional aria label override for action button. */
|
|
41
|
+
ariaLabel?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface CatalogItemCardProps {
|
|
44
|
+
/** Optional card identifier used for data-testid and DOM debugging. */
|
|
45
|
+
id?: string;
|
|
46
|
+
/** Card title. */
|
|
47
|
+
title: string;
|
|
48
|
+
/** Optional custom media node. If not provided, `imageUrl` is used. */
|
|
49
|
+
media?: React.ReactNode;
|
|
50
|
+
/** Optional image URL used when `media` is not set. */
|
|
51
|
+
imageUrl?: string;
|
|
52
|
+
/** Optional image alt text used when `media` is not set. */
|
|
53
|
+
imageAlt?: string;
|
|
54
|
+
/** Optional className for the image wrapper. */
|
|
55
|
+
imageClassName?: string;
|
|
56
|
+
/** Optional aspect ratio class for media wrapper. */
|
|
57
|
+
imageAspect?: string;
|
|
58
|
+
/** Optional list of metadata rows. */
|
|
59
|
+
meta?: CatalogItemCardMetaItem[];
|
|
60
|
+
/** Optional price block. */
|
|
61
|
+
price?: CatalogItemCardPrice;
|
|
62
|
+
/** Optional root action button. */
|
|
63
|
+
action?: CatalogItemCardAction;
|
|
64
|
+
/** Optional custom footer content. If provided, `price` and `action` still render above it. */
|
|
65
|
+
footer?: React.ReactNode;
|
|
66
|
+
/** Set a press handler on the card root. */
|
|
67
|
+
onPress?: () => void;
|
|
68
|
+
/** Enables pressable visual behavior when combined with `onPress`. */
|
|
69
|
+
isPressable?: boolean;
|
|
70
|
+
/** Disable all card interactions. */
|
|
71
|
+
isDisabled?: boolean;
|
|
72
|
+
/** Compact layout mode. */
|
|
73
|
+
compact?: boolean;
|
|
74
|
+
/** Root className for the component. */
|
|
75
|
+
className?: string;
|
|
76
|
+
/** Root className for card body. */
|
|
77
|
+
bodyClassName?: string;
|
|
78
|
+
/** Footer container className. */
|
|
79
|
+
footerClassName?: string;
|
|
80
|
+
/** Optional root test id for QA. */
|
|
81
|
+
dataTestId?: string;
|
|
82
|
+
}
|
|
@@ -18,6 +18,8 @@ export interface EventDetailsProps {
|
|
|
18
18
|
description?: string;
|
|
19
19
|
/** @property {string} [classes] - Optional Tailwind CSS utility classes for custom styling. */
|
|
20
20
|
classes?: string;
|
|
21
|
+
/** @property {boolean} [compact] - Dense spacing mode for compact side layouts. */
|
|
22
|
+
compact?: boolean;
|
|
21
23
|
/** @property {boolean} [showImage] - Optional flag to show or hide the event image. Defaults to true. */
|
|
22
24
|
showImage?: boolean;
|
|
23
25
|
/** @property {'lazy' | 'eager'} [imageLoading] - Optional loading strategy for the event image. Use `'lazy'` for off-screen placements (long lists, below-the-fold). Defaults to `'eager'` since the banner is typically above-the-fold. */
|
|
@@ -35,5 +37,5 @@ export interface EventDetailsProps {
|
|
|
35
37
|
* @function EventDetails
|
|
36
38
|
* @description Displays a card with event information such as name, image, date, time, location, and description.
|
|
37
39
|
*/
|
|
38
|
-
export declare const EventDetails: ({ classes, name, imageUrl, eventDate, eventTime, location, description, showImage, imageLoading, showMoreButtonClassName, labels, }: EventDetailsProps) => JSX.Element;
|
|
40
|
+
export declare const EventDetails: ({ classes, name, imageUrl, eventDate, eventTime, location, description, showImage, compact, imageLoading, showMoreButtonClassName, labels, }: EventDetailsProps) => JSX.Element;
|
|
39
41
|
export default EventDetails;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { EmptyStateProps, ErrorStateProps, FeedbackStateProps, LoadingStateProps, SuccessStateProps } from './type';
|
|
3
|
+
export declare function FeedbackState({ variant, title, titleAs: TitleElement, description, icon, actions, role, ariaLive, iconSize, className, classNames, 'data-testid': dataTestId, }: FeedbackStateProps): JSX.Element;
|
|
4
|
+
export declare namespace FeedbackState {
|
|
5
|
+
var displayName: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function EmptyState(props: EmptyStateProps): JSX.Element;
|
|
8
|
+
export declare namespace EmptyState {
|
|
9
|
+
var displayName: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function ErrorState(props: ErrorStateProps): JSX.Element;
|
|
12
|
+
export declare namespace ErrorState {
|
|
13
|
+
var displayName: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function LoadingState(props: LoadingStateProps): JSX.Element;
|
|
16
|
+
export declare namespace LoadingState {
|
|
17
|
+
var displayName: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function SuccessState(props: SuccessStateProps): JSX.Element;
|
|
20
|
+
export declare namespace SuccessState {
|
|
21
|
+
var displayName: string;
|
|
22
|
+
}
|
|
23
|
+
export default FeedbackState;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AriaRole, ReactNode } from 'react';
|
|
2
|
+
export type FeedbackStateVariant = 'empty' | 'error' | 'success' | 'loading';
|
|
3
|
+
export interface FeedbackStateClassNames {
|
|
4
|
+
base?: string;
|
|
5
|
+
iconWrapper?: string;
|
|
6
|
+
icon?: string;
|
|
7
|
+
spinner?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
actions?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface FeedbackStateProps {
|
|
13
|
+
/** Visual tone and default accessibility role. */
|
|
14
|
+
variant?: FeedbackStateVariant;
|
|
15
|
+
/** Main state message. */
|
|
16
|
+
title: ReactNode;
|
|
17
|
+
/** Semantic element used for the title. Defaults to a paragraph for inline states. */
|
|
18
|
+
titleAs?: 'p' | 'h1' | 'h2' | 'h3' | 'h4' | 'div';
|
|
19
|
+
/** Supporting copy rendered under the title. */
|
|
20
|
+
description?: ReactNode;
|
|
21
|
+
/** Iconify name, custom React node, or false to hide the icon. Loading defaults to a spinner. */
|
|
22
|
+
icon?: string | ReactNode | false;
|
|
23
|
+
/** Optional CTA area; pass buttons, links, or any custom action group. */
|
|
24
|
+
actions?: ReactNode;
|
|
25
|
+
/** Overrides the default role: error => alert, otherwise status. */
|
|
26
|
+
role?: AriaRole;
|
|
27
|
+
/** Overrides the default live-region politeness. */
|
|
28
|
+
ariaLive?: 'off' | 'polite' | 'assertive';
|
|
29
|
+
/** Icon size in pixels when icon is an Iconify name. */
|
|
30
|
+
iconSize?: number;
|
|
31
|
+
/** Root className shortcut. */
|
|
32
|
+
className?: string;
|
|
33
|
+
/** Slot-level className overrides. */
|
|
34
|
+
classNames?: FeedbackStateClassNames;
|
|
35
|
+
'data-testid'?: string;
|
|
36
|
+
}
|
|
37
|
+
export type EmptyStateProps = Omit<FeedbackStateProps, 'variant'>;
|
|
38
|
+
export type ErrorStateProps = Omit<FeedbackStateProps, 'variant'>;
|
|
39
|
+
export type LoadingStateProps = Omit<FeedbackStateProps, 'variant'>;
|
|
40
|
+
export type SuccessStateProps = Omit<FeedbackStateProps, 'variant'>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FilterPopoverProps } from './type';
|
|
2
|
+
export declare const FilterPopover: {
|
|
3
|
+
({ triggerLabel, triggerAriaLabel, triggerIcon, triggerVariant, triggerColor, triggerSize, triggerClassName, popoverClassName, className, sections, onConfirm, onClear, appliedCount, countAriaLabel, countDisplay, confirmLabel, clearLabel, isOpen, defaultOpen, onOpenChange, isDisabled, closeOnConfirm, keepOpenAfterClear, }: FilterPopoverProps): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
displayName: string;
|
|
5
|
+
};
|
|
6
|
+
export default FilterPopover;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { ButtonProps } from '../../components';
|
|
2
|
+
export interface FilterOption {
|
|
3
|
+
/** Option value used in payload. */
|
|
4
|
+
value: string;
|
|
5
|
+
/** Label for the option. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Option disabled state. */
|
|
8
|
+
isDisabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface FilterSectionBase {
|
|
11
|
+
/** Unique identifier for this filter section. */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Section label above its options. */
|
|
14
|
+
label: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CheckboxFilterSection extends FilterSectionBase {
|
|
17
|
+
/** Render options as multi-select checkboxes. */
|
|
18
|
+
type: 'checkbox';
|
|
19
|
+
/** Currently selected values for this section. */
|
|
20
|
+
selectedValues: readonly string[];
|
|
21
|
+
/** Checkbox section options. */
|
|
22
|
+
options: readonly FilterOption[];
|
|
23
|
+
}
|
|
24
|
+
export interface RadioFilterSection extends FilterSectionBase {
|
|
25
|
+
/** Render options as mutually exclusive radio buttons. */
|
|
26
|
+
type: 'radio';
|
|
27
|
+
/** Currently selected value; empty when no option selected. */
|
|
28
|
+
selectedValue: string | null;
|
|
29
|
+
/** Radio section options. */
|
|
30
|
+
options: readonly FilterOption[];
|
|
31
|
+
}
|
|
32
|
+
export type FilterSection = CheckboxFilterSection | RadioFilterSection;
|
|
33
|
+
export type AppliedFilterValues = Record<string, string | string[] | null>;
|
|
34
|
+
export type DraftFilterValues = Record<string, string[]>;
|
|
35
|
+
export interface FilterPopoverProps {
|
|
36
|
+
/** Label for popover trigger button. */
|
|
37
|
+
triggerLabel: string;
|
|
38
|
+
/** Optional accessible label for the popover trigger. */
|
|
39
|
+
triggerAriaLabel?: string;
|
|
40
|
+
/** Optional icon for trigger button. */
|
|
41
|
+
triggerIcon?: string;
|
|
42
|
+
/** Text for confirmation button. */
|
|
43
|
+
confirmLabel?: string;
|
|
44
|
+
/** Text for clear button. */
|
|
45
|
+
clearLabel?: string;
|
|
46
|
+
/** Count badge accessibility label. */
|
|
47
|
+
countAriaLabel?: (count: number) => string;
|
|
48
|
+
/**
|
|
49
|
+
* How to render the applied filter count on the trigger.
|
|
50
|
+
* Defaults to compact badge rendering for buyer-flow toolbar usage.
|
|
51
|
+
*/
|
|
52
|
+
countDisplay?: 'summary' | 'badge';
|
|
53
|
+
/** Applied sections to initialize draft state. */
|
|
54
|
+
sections: readonly FilterSection[];
|
|
55
|
+
/** Called with normalized values when user clicks Confirm. */
|
|
56
|
+
onConfirm: (values: AppliedFilterValues) => void | Promise<void>;
|
|
57
|
+
/** Clears all filters. */
|
|
58
|
+
onClear: () => void | Promise<void>;
|
|
59
|
+
/** Optional external count override. */
|
|
60
|
+
appliedCount?: number;
|
|
61
|
+
/** Control popover open state. */
|
|
62
|
+
isOpen?: boolean;
|
|
63
|
+
/** Uncontrolled initial open state. */
|
|
64
|
+
defaultOpen?: boolean;
|
|
65
|
+
/** Controlled open-state change handler. */
|
|
66
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
67
|
+
/** Trigger variant. */
|
|
68
|
+
triggerVariant?: ButtonProps['variant'];
|
|
69
|
+
/** Trigger color. */
|
|
70
|
+
triggerColor?: ButtonProps['color'];
|
|
71
|
+
/** Trigger size. */
|
|
72
|
+
triggerSize?: ButtonProps['size'];
|
|
73
|
+
/** Trigger button className. */
|
|
74
|
+
triggerClassName?: string;
|
|
75
|
+
/** Popover content className. */
|
|
76
|
+
popoverClassName?: string;
|
|
77
|
+
/** Container className. */
|
|
78
|
+
className?: string;
|
|
79
|
+
/** Disable entire control. */
|
|
80
|
+
isDisabled?: boolean;
|
|
81
|
+
/** Close popover when confirm is clicked. */
|
|
82
|
+
closeOnConfirm?: boolean;
|
|
83
|
+
/** Keep popover open after clearing. */
|
|
84
|
+
keepOpenAfterClear?: boolean;
|
|
85
|
+
}
|
|
@@ -3,12 +3,64 @@ export interface ItemCardProps {
|
|
|
3
3
|
* Selection key. Pass as `itemKey` in JSX (React reserves `key` and does not forward it).
|
|
4
4
|
*/
|
|
5
5
|
itemKey: string;
|
|
6
|
+
/**
|
|
7
|
+
* Display name
|
|
8
|
+
*/
|
|
6
9
|
name: string;
|
|
10
|
+
/**
|
|
11
|
+
* Raw price value
|
|
12
|
+
*/
|
|
7
13
|
price: number;
|
|
14
|
+
/**
|
|
15
|
+
* Whether to render the price column.
|
|
16
|
+
* Useful for buyer-flow selection cards where the value is represented by a status badge.
|
|
17
|
+
* @default true
|
|
18
|
+
*/
|
|
19
|
+
showPrice?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Locale for price formatting
|
|
22
|
+
*/
|
|
8
23
|
locale?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Currency code
|
|
26
|
+
*/
|
|
9
27
|
currency?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Optional type label
|
|
30
|
+
*/
|
|
10
31
|
type?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Whether this item is selected
|
|
34
|
+
*/
|
|
11
35
|
isSelected?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Compact rendering mode
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
40
|
+
compact?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Whether card actions are disabled
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
isDisabled?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Optional label describing disabled reason
|
|
48
|
+
*/
|
|
49
|
+
disabledReason?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Optional status label used in compact/badged states
|
|
52
|
+
*/
|
|
53
|
+
statusLabel?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Status tone for disabled state
|
|
56
|
+
*/
|
|
57
|
+
statusTone?: 'default' | 'success' | 'warning' | 'danger';
|
|
58
|
+
/**
|
|
59
|
+
* Selection handler, turns card pressable
|
|
60
|
+
*/
|
|
12
61
|
onSelect?: (key: string) => void;
|
|
62
|
+
/**
|
|
63
|
+
* Optional custom class
|
|
64
|
+
*/
|
|
13
65
|
className?: string;
|
|
14
66
|
}
|
|
@@ -6,7 +6,7 @@ import { OfferCardProps } from './types';
|
|
|
6
6
|
* Supports slot-based customization for all rendered elements.
|
|
7
7
|
*/
|
|
8
8
|
export declare const OfferCard: {
|
|
9
|
-
({ offer, quantity: quantityProp, defaultQuantity, onQuantityChange, currency, locale, labels: customLabels, slots, isDisabled, buttonVariant, buttonColor, showCard, showDescription, showPeopleCount, showPrice, classNames, "data-testid": dataTestId, selectedColor, }: OfferCardProps): JSX.Element;
|
|
9
|
+
({ offer, quantity: quantityProp, defaultQuantity, onQuantityChange, currency, locale, labels: customLabels, slots, isDisabled, buttonVariant, buttonColor, showCard, showDescription, showPeopleCount, showPrice, classNames, "data-testid": dataTestId, selectedColor, compact, isSoldOut: isSoldOutProp, isMaxReached: isMaxReachedProp, isRuleBlocked: isRuleBlockedProp, statusTone: statusToneProp, statusLabel, disabledReason, disabled, }: OfferCardProps): JSX.Element;
|
|
10
10
|
displayName: string;
|
|
11
11
|
};
|
|
12
12
|
export default OfferCard;
|
|
@@ -40,6 +40,29 @@ export interface Offer {
|
|
|
40
40
|
* Position for sorting offers in a list
|
|
41
41
|
*/
|
|
42
42
|
position?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Explicit sold-out override for buyer-flow states.
|
|
45
|
+
* When true, the offer is considered unavailable regardless of numeric ticket fields.
|
|
46
|
+
*/
|
|
47
|
+
isSoldOut?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Explicit max reached override for buyer-flow states.
|
|
50
|
+
* When true, increments are disabled and the max-reached message is shown.
|
|
51
|
+
*/
|
|
52
|
+
isMaxReached?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Flag used for blocked states (adult-required, business-rule restrictions, etc.).
|
|
55
|
+
* Blocked offers are read-only and render an explanatory status message.
|
|
56
|
+
*/
|
|
57
|
+
isRuleBlocked?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Optional disabled reason shown when the offer is unavailable.
|
|
60
|
+
*/
|
|
61
|
+
disabledReason?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Optional compact rendering mode for list/item layouts.
|
|
64
|
+
*/
|
|
65
|
+
compact?: boolean;
|
|
43
66
|
}
|
|
44
67
|
/**
|
|
45
68
|
* Selection state for offers (map of offer ID to quantity)
|
|
@@ -69,6 +92,14 @@ export interface OfferCardLabels {
|
|
|
69
92
|
* Message when maximum tickets reached (e.g., "Maximum number of tickets allowed reached")
|
|
70
93
|
*/
|
|
71
94
|
maxReached?: string;
|
|
95
|
+
/**
|
|
96
|
+
* Message for rule-blocked/buying-rule disabled states
|
|
97
|
+
*/
|
|
98
|
+
ruleBlocked?: string;
|
|
99
|
+
/**
|
|
100
|
+
* Generic disabled message fallback
|
|
101
|
+
*/
|
|
102
|
+
disabled?: string;
|
|
72
103
|
}
|
|
73
104
|
/**
|
|
74
105
|
* Labels for error state
|
|
@@ -131,6 +162,14 @@ export interface OfferCardClassNames {
|
|
|
131
162
|
* Class for the card footer
|
|
132
163
|
*/
|
|
133
164
|
footer?: string;
|
|
165
|
+
/**
|
|
166
|
+
* Class for compact mode container
|
|
167
|
+
*/
|
|
168
|
+
compact?: string;
|
|
169
|
+
/**
|
|
170
|
+
* Class for compact quantity/status area
|
|
171
|
+
*/
|
|
172
|
+
compactFooter?: string;
|
|
134
173
|
}
|
|
135
174
|
/**
|
|
136
175
|
* Class names for OfferCardList
|
|
@@ -235,6 +274,10 @@ export interface OfferCardSlots {
|
|
|
235
274
|
* Custom render for max reached alert
|
|
236
275
|
*/
|
|
237
276
|
renderMaxReachedAlert?: (message: string) => React.ReactNode;
|
|
277
|
+
/**
|
|
278
|
+
* Custom render for disabled state (sold out / max reached / rule blocked)
|
|
279
|
+
*/
|
|
280
|
+
renderDisabledState?: (kind: 'soldOut' | 'maxReached' | 'ruleBlocked' | 'disabled', label: string) => React.ReactNode;
|
|
238
281
|
}
|
|
239
282
|
/**
|
|
240
283
|
* Props for the OfferCard component
|
|
@@ -323,15 +366,53 @@ export interface OfferCardProps {
|
|
|
323
366
|
* Class names for styling different parts of the component
|
|
324
367
|
*/
|
|
325
368
|
classNames?: OfferCardClassNames;
|
|
369
|
+
/**
|
|
370
|
+
* Render in compact visual density mode.
|
|
371
|
+
* @default false
|
|
372
|
+
*/
|
|
373
|
+
compact?: boolean;
|
|
374
|
+
/**
|
|
375
|
+
* Explicit sold-out override for this specific card.
|
|
376
|
+
* @default false
|
|
377
|
+
*/
|
|
378
|
+
isSoldOut?: boolean;
|
|
379
|
+
/**
|
|
380
|
+
* Explicit max-reached override for this specific card.
|
|
381
|
+
* @default false
|
|
382
|
+
*/
|
|
383
|
+
isMaxReached?: boolean;
|
|
384
|
+
/**
|
|
385
|
+
* Rule-blocked state for this specific card.
|
|
386
|
+
* @default false
|
|
387
|
+
*/
|
|
388
|
+
isRuleBlocked?: boolean;
|
|
389
|
+
/**
|
|
390
|
+
* Status/tone shown for rule-blocked or max-reached states.
|
|
391
|
+
* @default 'warning'
|
|
392
|
+
*/
|
|
393
|
+
statusTone?: 'default' | 'warning' | 'danger';
|
|
394
|
+
/**
|
|
395
|
+
* Optional message to explain why interaction is blocked.
|
|
396
|
+
*/
|
|
397
|
+
disabledReason?: string;
|
|
398
|
+
/**
|
|
399
|
+
* Optional override for the disabled state status label.
|
|
400
|
+
*/
|
|
401
|
+
statusLabel?: string;
|
|
402
|
+
/**
|
|
403
|
+
* Optional disabled override used by OfferCardList or list-level controls.
|
|
404
|
+
* @default false
|
|
405
|
+
*/
|
|
406
|
+
disabled?: boolean;
|
|
326
407
|
}
|
|
327
408
|
/**
|
|
328
409
|
* Props for the OfferCardList component
|
|
329
410
|
*/
|
|
330
|
-
export interface OfferCardListProps {
|
|
411
|
+
export interface OfferCardListProps<TOffer = Offer> {
|
|
331
412
|
/**
|
|
332
413
|
* Array of offers to display
|
|
333
414
|
*/
|
|
334
|
-
offers:
|
|
415
|
+
offers: TOffer[];
|
|
335
416
|
/**
|
|
336
417
|
* Currently selected quantities (controlled mode)
|
|
337
418
|
* Map of offer ID to quantity
|
|
@@ -401,6 +482,16 @@ export interface OfferCardListProps {
|
|
|
401
482
|
* Class names for styling different parts of the component
|
|
402
483
|
*/
|
|
403
484
|
classNames?: OfferCardListClassNames;
|
|
485
|
+
/**
|
|
486
|
+
* Render the offer list in compact mode
|
|
487
|
+
* @default false
|
|
488
|
+
*/
|
|
489
|
+
compact?: boolean;
|
|
490
|
+
/**
|
|
491
|
+
* Map incoming offer-like items to OfferCard props.
|
|
492
|
+
* This supports lightweight adapters for buyer-flow data shapes.
|
|
493
|
+
*/
|
|
494
|
+
mapOffer?: (offer: TOffer) => Offer;
|
|
404
495
|
}
|
|
405
496
|
/**
|
|
406
497
|
* Props for the OfferCardSkeleton component
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { JSX } from 'react';
|
|
2
|
-
import { OfferCardListProps } from '../types';
|
|
2
|
+
import { OfferCardListProps, Offer } from '../types';
|
|
3
3
|
/**
|
|
4
4
|
* OfferCardList component displays a collection of offer cards in a responsive grid.
|
|
5
5
|
* It manages selection state internally or accepts external control via props.
|
|
6
6
|
* When animated is true, cards animate in/out using Framer Motion variants.
|
|
7
7
|
*/
|
|
8
8
|
export declare const OfferCardList: {
|
|
9
|
-
({ offers, selection: selectionProp, defaultSelection, onSelectionChange, onQuantityChange, currency, locale, labels, slots, isDisabled, buttonVariant, buttonColor, showCard, animated, gap, classNames, }: OfferCardListProps): JSX.Element;
|
|
9
|
+
<TOffer = Offer>({ offers, mapOffer, selection: selectionProp, defaultSelection, onSelectionChange, onQuantityChange, currency, locale, labels, slots, isDisabled, buttonVariant, buttonColor, showCard, animated, gap, compact, classNames, }: OfferCardListProps<TOffer>): JSX.Element;
|
|
10
10
|
displayName: string;
|
|
11
11
|
};
|
|
12
12
|
export default OfferCardList;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
2
|
+
import { SessionTimelineProps } from './type';
|
|
3
|
+
export declare const SessionTimeline: {
|
|
4
|
+
({ heading, subheading, days, selectedDate, onDateSelect, quickDates, selectedSessionId, onSessionSelect, emptyStateMessage, statusLabel, statusTone, sessionAriaLabel, dayButtonClassName, calendarSlot, dayGroupAriaLabel, sessionGridAriaLabel, className, headingClassName, subheadingClassName, }: SessionTimelineProps): JSX.Element;
|
|
5
|
+
displayName: string;
|
|
6
|
+
};
|
|
7
|
+
export default SessionTimeline;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export type SessionTimelineStatus = 'available' | 'limited' | 'sold-out' | 'closed';
|
|
2
|
+
export interface SessionTimelineSession {
|
|
3
|
+
/** Unique identifier for the session. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Human-readable start time text. */
|
|
6
|
+
startTime: string;
|
|
7
|
+
/** Human-readable end time text. */
|
|
8
|
+
endTime: string;
|
|
9
|
+
/** Remaining seats, if applicable. */
|
|
10
|
+
seatsRemaining?: number;
|
|
11
|
+
/** Status used for tone and accessibility text. */
|
|
12
|
+
status?: SessionTimelineStatus;
|
|
13
|
+
/** Whether this session has no capacity cap. */
|
|
14
|
+
isUnlimited?: boolean;
|
|
15
|
+
/** Force-disable regardless of status. */
|
|
16
|
+
isDisabled?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface SessionTimelineDay {
|
|
19
|
+
/** Stable day key (ISO date or grouped value). */
|
|
20
|
+
date: string;
|
|
21
|
+
/** Optional custom label for quick controls and cards. */
|
|
22
|
+
label: string;
|
|
23
|
+
/** Sessions available for this day. */
|
|
24
|
+
sessions: SessionTimelineSession[];
|
|
25
|
+
}
|
|
26
|
+
export interface SessionTimelineQuickDate {
|
|
27
|
+
/** Day key from `SessionTimelineDay.date`. */
|
|
28
|
+
date: string;
|
|
29
|
+
/** Label shown for this quick button. */
|
|
30
|
+
label: string;
|
|
31
|
+
/** Disable quick button. */
|
|
32
|
+
isDisabled?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface SessionTimelineProps {
|
|
35
|
+
/** Optional section heading. */
|
|
36
|
+
heading: string;
|
|
37
|
+
/** Optional section description. */
|
|
38
|
+
subheading?: string;
|
|
39
|
+
/** All available session days. */
|
|
40
|
+
days: readonly SessionTimelineDay[];
|
|
41
|
+
/** Currently selected day key. */
|
|
42
|
+
selectedDate: string | null;
|
|
43
|
+
/** Day selection callback. */
|
|
44
|
+
onDateSelect: (date: string) => void | Promise<void>;
|
|
45
|
+
/** Optional quick selector buttons rendered above the timeline. */
|
|
46
|
+
quickDates?: readonly SessionTimelineQuickDate[];
|
|
47
|
+
/** Currently selected session id. */
|
|
48
|
+
selectedSessionId?: string | null;
|
|
49
|
+
/** Session selection callback (toggle null to clear). */
|
|
50
|
+
onSessionSelect: (sessionId: string | null) => void | Promise<void>;
|
|
51
|
+
/** Text when the selected day has no sessions. */
|
|
52
|
+
emptyStateMessage?: string;
|
|
53
|
+
/** Custom status label factory. */
|
|
54
|
+
statusLabel?: (session: SessionTimelineSession) => string;
|
|
55
|
+
/** Custom session status tone. */
|
|
56
|
+
statusTone?: (session: SessionTimelineSession) => 'default' | 'success' | 'danger';
|
|
57
|
+
/** Custom session card accessible label factory. */
|
|
58
|
+
sessionAriaLabel?: (session: SessionTimelineSession, state: {
|
|
59
|
+
isSelected: boolean;
|
|
60
|
+
isUnavailable: boolean;
|
|
61
|
+
}) => string;
|
|
62
|
+
/** Custom day selection status class. */
|
|
63
|
+
dayButtonClassName?: string;
|
|
64
|
+
/** Optional additional control slot for a calendar trigger/popover. */
|
|
65
|
+
calendarSlot?: React.ReactNode;
|
|
66
|
+
/** Aria label for day quick switch group. */
|
|
67
|
+
dayGroupAriaLabel?: string;
|
|
68
|
+
/** Aria label for session grid region. */
|
|
69
|
+
sessionGridAriaLabel?: string;
|
|
70
|
+
/** Optional custom root class. */
|
|
71
|
+
className?: string;
|
|
72
|
+
/** Optional custom heading class. */
|
|
73
|
+
headingClassName?: string;
|
|
74
|
+
/** Optional custom subheading class. */
|
|
75
|
+
subheadingClassName?: string;
|
|
76
|
+
}
|
|
@@ -115,12 +115,15 @@ export interface SummaryProps {
|
|
|
115
115
|
};
|
|
116
116
|
/**
|
|
117
117
|
* Whether the summary can collapse — the header shows a `×` and the whole
|
|
118
|
-
* header toggles Open/Closed. Defaults to `variant === 'mobile'` (
|
|
119
|
-
*
|
|
120
|
-
* behaviour.
|
|
118
|
+
* header toggles Open/Closed. Defaults to `variant === 'mobile'` (including
|
|
119
|
+
* the auto-detected mobile variant — see `variant`). Pass explicitly to
|
|
120
|
+
* override the automatic behaviour.
|
|
121
121
|
*/
|
|
122
122
|
collapsible?: boolean;
|
|
123
|
-
/**
|
|
123
|
+
/**
|
|
124
|
+
* Controlled open/closed state. Defaults to **closed** when collapsible (the
|
|
125
|
+
* mobile sheet rests collapsed) and always open on the non-collapsible card.
|
|
126
|
+
*/
|
|
124
127
|
isOpen?: boolean;
|
|
125
128
|
/** Fires when the header (open) — or the closed bar's Total (closed) — is activated to toggle. */
|
|
126
129
|
onToggleOpen?: () => void;
|
|
@@ -128,7 +131,11 @@ export interface SummaryProps {
|
|
|
128
131
|
primaryAction?: SummaryPrimaryAction;
|
|
129
132
|
/** When provided, item rows show a red trash remove control. */
|
|
130
133
|
onRemoveItem?: (id: string) => void;
|
|
131
|
-
/**
|
|
134
|
+
/**
|
|
135
|
+
* Layout: full card (`'main'`) or the bottom-sheet / compact bar (`'mobile'`).
|
|
136
|
+
* When OMITTED the layout is auto-detected from the viewport (below `md`
|
|
137
|
+
* → `'mobile'`, `md`+ → `'main'`). Pass explicitly to pin a layout.
|
|
138
|
+
*/
|
|
132
139
|
variant?: 'main' | 'mobile';
|
|
133
140
|
/** Mobile bottom-bar cart button + badge count. */
|
|
134
141
|
cart?: {
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Below Tailwind's `md` (768px): phones / small tablets get the bottom-sheet,
|
|
3
|
+
* everything `md`+ gets the bordered card. Exported so the threshold is shared
|
|
4
|
+
* and overridable.
|
|
5
|
+
*/
|
|
6
|
+
export declare const MOBILE_MEDIA_QUERY = "(max-width: 767px)";
|
|
7
|
+
/**
|
|
8
|
+
* Pure, SSR-safe read of a media query. Returns `false` when `matchMedia` is
|
|
9
|
+
* unavailable (server / jsdom), so callers default to the non-mobile layout.
|
|
10
|
+
*/
|
|
11
|
+
export declare const mediaMatches: (query: string) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Subscribe to a media query and re-render on viewport changes. Initialises
|
|
14
|
+
* from `mediaMatches` (so the first paint already reflects the viewport on the
|
|
15
|
+
* client) and updates live as the screen crosses the breakpoint.
|
|
16
|
+
*/
|
|
17
|
+
export declare const useIsMobile: (query?: string) => boolean;
|