@veevarts/design-system 1.14.0 → 1.15.0-alpha.10

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.
Files changed (37) hide show
  1. package/README.md +12 -0
  2. package/dist/components/AppliedCodeCard/AppliedCodeCard.d.ts +13 -0
  3. package/dist/components/AppliedCodeCard/index.d.ts +2 -0
  4. package/dist/components/DatePicker/DatePicker.d.ts +17 -0
  5. package/dist/components/DatePicker/index.d.ts +2 -0
  6. package/dist/components/RedeemCodeInput/RedeemCodeInput.d.ts +21 -0
  7. package/dist/components/RedeemCodeInput/index.d.ts +2 -0
  8. package/dist/components/index.d.ts +6 -0
  9. package/dist/index.cjs +4 -4
  10. package/dist/index.js +7829 -6966
  11. package/dist/patterns/CheckboxCardGroup/CheckboxCardGroup.d.ts +53 -0
  12. package/dist/patterns/CheckboxCardGroup/index.d.ts +2 -0
  13. package/dist/patterns/ConfirmDialog/ConfirmDialog.d.ts +22 -9
  14. package/dist/patterns/ConfirmDialog/index.d.ts +1 -1
  15. package/dist/patterns/DimensionChip/DimensionChip.d.ts +12 -0
  16. package/dist/patterns/DimensionChip/index.d.ts +2 -0
  17. package/dist/patterns/InstallmentSchedule/index.d.ts +1 -1
  18. package/dist/patterns/InstallmentSchedule/types.d.ts +2 -1
  19. package/dist/patterns/ListPanel/ListPanel.d.ts +45 -0
  20. package/dist/patterns/ListPanel/index.d.ts +2 -0
  21. package/dist/patterns/OfferCard/OfferCard.d.ts +1 -1
  22. package/dist/patterns/OfferCard/types.d.ts +23 -0
  23. package/dist/patterns/PageHeader/PageHeader.d.ts +33 -0
  24. package/dist/patterns/PageHeader/index.d.ts +2 -0
  25. package/dist/patterns/StatusChip/StatusChip.d.ts +24 -0
  26. package/dist/patterns/StatusChip/index.d.ts +2 -0
  27. package/dist/patterns/Stepper/Stepper.d.ts +62 -0
  28. package/dist/patterns/Summary/components/ActionBar.d.ts +2 -0
  29. package/dist/patterns/Summary/components/CollapseHeader.d.ts +6 -0
  30. package/dist/patterns/Summary/components/ItemRow.d.ts +2 -0
  31. package/dist/patterns/Summary/components/SecondaryTotalRow.d.ts +11 -0
  32. package/dist/patterns/Summary/components/SummaryBody.d.ts +2 -0
  33. package/dist/patterns/Summary/index.d.ts +1 -1
  34. package/dist/patterns/Summary/types.d.ts +60 -0
  35. package/dist/patterns/grid-columns.d.ts +10 -0
  36. package/dist/patterns/index.d.ts +12 -2
  37. package/package.json +1 -1
@@ -0,0 +1,53 @@
1
+ import { default as React } from 'react';
2
+ export interface CheckboxCardOption {
3
+ /** Stable identifier surfaced through `onChange`. */
4
+ key: string;
5
+ /** Visible label. */
6
+ label: string;
7
+ /** Optional secondary line under the label. */
8
+ description?: string;
9
+ /** Iconify name (`'solar:ticket-outline'`) or a custom node. */
10
+ icon?: string | React.ReactNode;
11
+ /** Disable just this card. */
12
+ isDisabled?: boolean;
13
+ /** Override per-card test id; defaults to `${dataTestId}-${key}`. */
14
+ 'data-testid'?: string;
15
+ }
16
+ export interface CheckboxCardGroupClassNames {
17
+ base?: string;
18
+ grid?: string;
19
+ card?: string;
20
+ hint?: string;
21
+ }
22
+ export interface CheckboxCardGroupProps {
23
+ /** Options to render in order. */
24
+ options: readonly CheckboxCardOption[];
25
+ /** Currently selected option keys. */
26
+ selectedKeys: readonly string[];
27
+ /** Fires with the next full selection whenever a card is toggled. Keys are emitted in the original option order (not selection order); any selected key not present in `options` is preserved. */
28
+ onChange: (keys: string[]) => void;
29
+ /** Optional heading rendered above the grid (labels the group). */
30
+ heading?: string;
31
+ /** `aria-label` for the group when `heading` is omitted. Default `'Select options'`. */
32
+ ariaLabel?: string;
33
+ /** Grid columns on >= sm. Default `2`. */
34
+ columnsDesktop?: 2 | 3 | 4;
35
+ /** Grid columns on mobile. Default `1`. */
36
+ columnsMobile?: 1 | 2;
37
+ /**
38
+ * Minimum number of selections. When set, the group auto-derives its
39
+ * invalid state (`selectedKeys.length < minSelected`) and a default hint,
40
+ * unless `isInvalid` / `hint` are explicitly supplied.
41
+ */
42
+ minSelected?: number;
43
+ /** Helper text under the grid. Overrides the `minSelected` default hint. */
44
+ hint?: React.ReactNode;
45
+ /** Error styling + `aria-invalid`. Overrides the `minSelected`-derived state. */
46
+ isInvalid?: boolean;
47
+ /** Disable every card. */
48
+ isDisabled?: boolean;
49
+ className?: string;
50
+ classNames?: CheckboxCardGroupClassNames;
51
+ 'data-testid'?: string;
52
+ }
53
+ export declare const CheckboxCardGroup: React.FC<CheckboxCardGroupProps>;
@@ -0,0 +1,2 @@
1
+ export { CheckboxCardGroup } from './CheckboxCardGroup';
2
+ export type { CheckboxCardGroupProps, CheckboxCardGroupClassNames, CheckboxCardOption, } from './CheckboxCardGroup';
@@ -1,21 +1,34 @@
1
1
  import { default as React } from 'react';
2
+ export type ConfirmDialogVariant = 'danger' | 'warning';
2
3
  export interface ConfirmDialogProps {
3
- /** Whether the dialog is currently open. Controlled by the host. */
4
+ /** Whether the dialog is open. Controlled by the host. */
4
5
  isOpen: boolean;
5
6
  /** Title rendered as the dialog heading. */
6
7
  title: string;
7
- /** Body copy explaining the consequences of confirming. */
8
- body: string;
9
8
  /** Label for the confirm action. */
10
9
  confirmLabel: string;
11
- /** Visual variant of the confirm button. Default `'danger'`. */
12
- confirmVariant?: 'danger' | 'primary';
13
- /** Label for the dismiss action. */
14
- dismissLabel: string;
15
10
  /** Fires when the user confirms. */
16
11
  onConfirm: () => void;
17
- /** Fires when the user dismisses (Cancel button OR Esc / outside click). */
18
- onDismiss: () => void;
12
+ /** HeroUI open-change; fires with `false` on cancel / Esc / outside click. */
13
+ onOpenChange?: (open: boolean) => void;
14
+ /** Rich body content. Overrides `description`. */
15
+ children?: React.ReactNode;
16
+ /** Body copy explaining the consequences of confirming. */
17
+ description?: React.ReactNode;
18
+ /** Label for the cancel action. Default `'Cancel'`. */
19
+ cancelLabel?: string;
20
+ /** Semantic variant driving the icon tile + confirm colour. Default `'danger'`. */
21
+ variant?: ConfirmDialogVariant;
22
+ /** Spinner on confirm + locks every dismissal channel while true. Default `false`. */
23
+ isPending?: boolean;
24
+ /** Override backdrop dismissability. Defaults to `!isPending`. */
25
+ isDismissable?: boolean;
26
+ /** Disable Esc-to-close. Forced on while `isPending`. Default `false`. */
27
+ isKeyboardDismissDisabled?: boolean;
28
+ /** Hide the header icon tile. */
29
+ hideIcon?: boolean;
30
+ /** Override the header icon (iconify name or node). Defaults to the variant icon. */
31
+ icon?: string | React.ReactNode;
19
32
  'data-testid'?: string;
20
33
  }
21
34
  export declare const ConfirmDialog: React.FC<ConfirmDialogProps>;
@@ -1,2 +1,2 @@
1
1
  export { ConfirmDialog } from './ConfirmDialog';
2
- export type { ConfirmDialogProps } from './ConfirmDialog';
2
+ export type { ConfirmDialogProps, ConfirmDialogVariant } from './ConfirmDialog';
@@ -0,0 +1,12 @@
1
+ import { default as React } from 'react';
2
+ export interface DimensionChipProps {
3
+ /** Muted leading text — the category/type (e.g. a dimension-type name). */
4
+ label: React.ReactNode;
5
+ /** Emphasised trailing text — the selected value. */
6
+ value: React.ReactNode;
7
+ /** Chip size. `'sm'` (default) for dense tables, `'md'` for detail panels. */
8
+ size?: 'sm' | 'md';
9
+ className?: string;
10
+ 'data-testid'?: string;
11
+ }
12
+ export declare const DimensionChip: React.FC<DimensionChipProps>;
@@ -0,0 +1,2 @@
1
+ export { DimensionChip } from './DimensionChip';
2
+ export type { DimensionChipProps } from './DimensionChip';
@@ -2,4 +2,4 @@ export { InstallmentSchedule } from './InstallmentSchedule';
2
2
  export { InstallmentScheduleSkeleton } from './InstallmentScheduleSkeleton';
3
3
  export { InstallmentTable } from './InstallmentTable';
4
4
  export { generateAutomaticInstallments } from './utils';
5
- export type { AutomaticScheduleSettings, InstallmentFrequency, InstallmentScheduleInput, InstallmentTableLabels, InstallmentTableProps, InstallmentScheduleClassNames, InstallmentScheduleLabels, InstallmentScheduleMode, InstallmentScheduleProps, ScheduledInstallment, } from './types';
5
+ export type { AutomaticScheduleSettings, InstallmentFrequency, InstallmentScheduleInput, InstallmentTableLabels, InstallmentTableProps, InstallmentScheduleClassNames, InstallmentScheduleLabels, InstallmentScheduleMode, InstallmentScheduleProps, InstallmentStatus, ScheduledInstallment, } from './types';
@@ -1,11 +1,12 @@
1
1
  import { ReactNode } from 'react';
2
2
  export type InstallmentScheduleMode = 'automatic' | 'manual';
3
3
  export type InstallmentFrequency = 'weekly' | 'monthly' | 'quarterly' | 'annual';
4
+ export type InstallmentStatus = 'schedule' | 'paid' | 'payment_due' | 'overdue' | 'failed' | 'refunded' | 'disputed' | 'canceled';
4
5
  export type ScheduledInstallment = {
5
6
  id: string;
6
7
  dueDate: string;
7
8
  amount: number;
8
- status?: 'scheduled' | 'fulfilled' | 'failed' | 'cancelled' | 'refunded' | 'paid';
9
+ status?: InstallmentStatus | (string & {});
9
10
  };
10
11
  export type AutomaticScheduleSettings = {
11
12
  numberOfInstallments: number;
@@ -0,0 +1,45 @@
1
+ import { default as React } from 'react';
2
+ export interface ListPanelClassNames {
3
+ base?: string;
4
+ state?: string;
5
+ }
6
+ export interface ListPanelProps {
7
+ /** Show the loading state. Highest precedence (loading > error > empty > children). */
8
+ isLoading?: boolean;
9
+ /** Show the error state. Wins over empty and children. */
10
+ isError?: boolean;
11
+ /** Show the empty state. Wins over children. */
12
+ isEmpty?: boolean;
13
+ /** Loading headline. Default `'Loading…'`. */
14
+ loadingTitle?: React.ReactNode;
15
+ /** Replace the whole loading state. */
16
+ loadingContent?: React.ReactNode;
17
+ /** Error headline. Default `'Something went wrong'`. */
18
+ errorTitle?: React.ReactNode;
19
+ /** Error supporting copy. */
20
+ errorDescription?: React.ReactNode;
21
+ /** Retry button label. Default `'Retry'`. Rendered only when `onRetry` is set. */
22
+ retryLabel?: React.ReactNode;
23
+ /** Retry handler; when set, a Retry button appears in the error state. */
24
+ onRetry?: () => void;
25
+ /** Replace the error state's action area (overrides the Retry button). */
26
+ errorActions?: React.ReactNode;
27
+ /** Replace the whole error state. */
28
+ errorContent?: React.ReactNode;
29
+ /** Empty headline. Default `'Nothing here yet'`. */
30
+ emptyTitle?: React.ReactNode;
31
+ /** Empty supporting copy. */
32
+ emptyDescription?: React.ReactNode;
33
+ /** Iconify name or node for the empty state. */
34
+ emptyIcon?: string | React.ReactNode | false;
35
+ /** Empty-state CTA area. */
36
+ emptyActions?: React.ReactNode;
37
+ /** Replace the whole empty state. */
38
+ emptyContent?: React.ReactNode;
39
+ /** The table/list rendered when none of the async states apply. */
40
+ children?: React.ReactNode;
41
+ className?: string;
42
+ classNames?: ListPanelClassNames;
43
+ 'data-testid'?: string;
44
+ }
45
+ export declare const ListPanel: React.FC<ListPanelProps>;
@@ -0,0 +1,2 @@
1
+ export { ListPanel } from './ListPanel';
2
+ export type { ListPanelProps, ListPanelClassNames } from './ListPanel';
@@ -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, compact, isSoldOut: isSoldOutProp, isMaxReached: isMaxReachedProp, isRuleBlocked: isRuleBlockedProp, statusTone: statusToneProp, statusLabel, disabledReason, disabled, }: OfferCardProps): JSX.Element;
9
+ ({ offer, quantity: quantityProp, defaultQuantity, onQuantityChange, currency, locale, labels: customLabels, slots, isDisabled, buttonVariant, buttonColor, showCard, showDescription, showPeopleCount, showPrice, priceDisplay, 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;
@@ -134,6 +134,14 @@ export interface OfferCardClassNames {
134
134
  * Class for the price display
135
135
  */
136
136
  price?: string;
137
+ /**
138
+ * Class for the crossed-out original price when `priceDisplay` renders a discount.
139
+ */
140
+ originalPrice?: string;
141
+ /**
142
+ * Class for the current discounted price when `priceDisplay` renders a discount.
143
+ */
144
+ discountedPrice?: string;
137
145
  /**
138
146
  * Class for the description text
139
147
  */
@@ -362,6 +370,21 @@ export interface OfferCardProps {
362
370
  * @default true
363
371
  */
364
372
  showPrice?: boolean;
373
+ /**
374
+ * Optional explicit price display contract. Existing consumers keep the
375
+ * legacy `offer.price` rendering when this prop is omitted.
376
+ */
377
+ priceDisplay?: {
378
+ /**
379
+ * Current/effective price to display.
380
+ */
381
+ price: number;
382
+ /**
383
+ * Optional compare-at/original price. A discounted display is rendered
384
+ * only when this value is greater than `price`.
385
+ */
386
+ originalPrice?: number | null;
387
+ };
365
388
  /**
366
389
  * Class names for styling different parts of the component
367
390
  */
@@ -0,0 +1,33 @@
1
+ import { default as React } from 'react';
2
+ export interface PageHeaderClassNames {
3
+ base?: string;
4
+ iconWrapper?: string;
5
+ eyebrow?: string;
6
+ title?: string;
7
+ subtitle?: string;
8
+ actions?: string;
9
+ }
10
+ export interface PageHeaderProps {
11
+ /** Main heading. */
12
+ title: React.ReactNode;
13
+ /** Supporting copy under the title. */
14
+ subtitle?: React.ReactNode;
15
+ /** Small uppercase label above the title (e.g. a section or category name). */
16
+ eyebrow?: React.ReactNode;
17
+ /** Iconify name (`'solar:tag-outline'`) or a custom node for the tile. */
18
+ icon?: string | React.ReactNode;
19
+ /** Short text rendered in the tile when no `icon` is given (e.g. "DT"). */
20
+ initials?: string;
21
+ /**
22
+ * Right-aligned action area. Compose the primary CTA here, with an
23
+ * optional secondary button alongside it (caller-composed). Style the
24
+ * tile via `classNames.iconWrapper`.
25
+ */
26
+ actions?: React.ReactNode;
27
+ /** Heading level for the title element. Default `'h1'`. */
28
+ titleAs?: 'h1' | 'h2' | 'h3';
29
+ className?: string;
30
+ classNames?: PageHeaderClassNames;
31
+ 'data-testid'?: string;
32
+ }
33
+ export declare const PageHeader: React.FC<PageHeaderProps>;
@@ -0,0 +1,2 @@
1
+ export { PageHeader } from './PageHeader';
2
+ export type { PageHeaderProps, PageHeaderClassNames } from './PageHeader';
@@ -0,0 +1,24 @@
1
+ import { default as React } from 'react';
2
+ import { ChipProps } from '../../components';
3
+ /** Domain-agnostic lifecycle states an admin row can be in. */
4
+ export type StatusChipStatus = 'active' | 'archived' | 'inactive' | 'draft' | 'pending' | 'success' | 'warning' | 'danger' | 'neutral';
5
+ export interface StatusChipProps {
6
+ /** Lifecycle state — selects the colour/tone only, never the text. */
7
+ status: StatusChipStatus;
8
+ /** Visible label. Caller-supplied so no domain copy lives here. */
9
+ label: React.ReactNode;
10
+ /** HeroUI chip variant. Default `'flat'` (soft pill). */
11
+ variant?: ChipProps['variant'];
12
+ /** Chip size. Default `'sm'`. */
13
+ size?: ChipProps['size'];
14
+ /**
15
+ * Override the colour derived from `status`. Escape hatch for the
16
+ * rare state not covered by `StatusChipStatus`.
17
+ */
18
+ color?: ChipProps['color'];
19
+ /** Optional leading element (dot, icon). */
20
+ startContent?: React.ReactNode;
21
+ className?: string;
22
+ 'data-testid'?: string;
23
+ }
24
+ export declare const StatusChip: React.FC<StatusChipProps>;
@@ -0,0 +1,2 @@
1
+ export { StatusChip } from './StatusChip';
2
+ export type { StatusChipProps, StatusChipStatus } from './StatusChip';
@@ -16,6 +16,59 @@ export interface StepperProps extends React.HTMLAttributes<HTMLElement> {
16
16
  * ```
17
17
  */
18
18
  label?: string;
19
+ /**
20
+ * Labels rendered inside the active step when using the `activeLabel` variant.
21
+ * The array index matches the zero-based step index.
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * <Stepper
26
+ * variant="activeLabel"
27
+ * stepLabels={['Details', 'Recurrences', 'Attendance']}
28
+ * stepsCount={3}
29
+ * />
30
+ * ```
31
+ */
32
+ stepLabels?: string[];
33
+ /**
34
+ * Whether to show a tooltip with the step label on each step.
35
+ * Tooltip content comes from `stepLabels[stepIndex]`.
36
+ *
37
+ * @default false
38
+ */
39
+ showStepLabelTooltip?: boolean;
40
+ /**
41
+ * Placement for the optional step label tooltip.
42
+ *
43
+ * @default "top"
44
+ */
45
+ stepLabelTooltipPlacement?: 'top' | 'bottom' | 'left' | 'right';
46
+ /**
47
+ * Whether to render a step counter like "Step 1 of 6".
48
+ *
49
+ * @default false
50
+ */
51
+ showStepCounter?: boolean;
52
+ /**
53
+ * Position of the optional step counter relative to the step list.
54
+ *
55
+ * @default "right"
56
+ */
57
+ stepCounterPosition?: 'left' | 'right';
58
+ /**
59
+ * Layout distribution for the stepper and optional step counter.
60
+ *
61
+ * - `compact`: content stays grouped together
62
+ * - `spread`: content stretches to opposite sides of the available width
63
+ *
64
+ * @default "compact"
65
+ */
66
+ layout?: 'compact' | 'spread';
67
+ /**
68
+ * Optional formatter for the step counter text.
69
+ * Receives one-based current step number and total step count.
70
+ */
71
+ stepCounterFormat?: (currentStepNumber: number, totalSteps: number) => string;
19
72
  /**
20
73
  * Total number of steps in the sequence.
21
74
  *
@@ -40,6 +93,15 @@ export interface StepperProps extends React.HTMLAttributes<HTMLElement> {
40
93
  * ```
41
94
  */
42
95
  color?: ButtonProps['color'];
96
+ /**
97
+ * Visual presentation of the stepper.
98
+ *
99
+ * - `default`: current behavior with checkmarks on completed steps
100
+ * - `activeLabel`: active step expands into a pill with number + label
101
+ *
102
+ * @default "default"
103
+ */
104
+ variant?: 'default' | 'activeLabel';
43
105
  /**
44
106
  * The current active step index (zero-based).
45
107
  * Use this prop for controlled mode.
@@ -10,6 +10,8 @@ export interface ActionBarProps {
10
10
  isLoading: boolean;
11
11
  cart?: SummaryProps['cart'];
12
12
  cartAriaLabel: string;
13
+ /** Optional caption rendered under the open-layer CTA (e.g. installment breakdown). */
14
+ ctaCaption?: React.ReactNode;
13
15
  /** Expand the summary — the closed-bar cart button opens it on click. */
14
16
  onToggleOpen?: () => void;
15
17
  classNames: SummaryClassNames;
@@ -6,6 +6,12 @@ export interface CollapseHeaderProps {
6
6
  label?: React.ReactNode;
7
7
  amount: Money;
8
8
  };
9
+ /** Optional primary-colored row mirrored under the Total in the compact bar
10
+ * (e.g. "Due Today"); cross-fades like the Total. */
11
+ secondaryTotal?: {
12
+ label: React.ReactNode;
13
+ amount: Money;
14
+ };
9
15
  locale: string;
10
16
  open: boolean;
11
17
  /** Open progress 0→1; drives the cross-fade opacity. */
@@ -5,5 +5,7 @@ export interface ItemRowProps {
5
5
  locale: string;
6
6
  onRemove?: (id: string) => void;
7
7
  removeAriaLabel: string;
8
+ /** Show the per-item remove control. Defaults to `true`. */
9
+ showRemoveButton?: boolean;
8
10
  }
9
11
  export declare const ItemRow: React.FC<ItemRowProps>;
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ import { Money } from '../types';
3
+ export interface SecondaryTotalRowProps {
4
+ secondaryTotal: {
5
+ label: React.ReactNode;
6
+ amount: Money;
7
+ };
8
+ locale: string;
9
+ className?: string;
10
+ }
11
+ export declare const SecondaryTotalRow: React.FC<SecondaryTotalRowProps>;
@@ -9,6 +9,8 @@ export interface SummaryBodyProps {
9
9
  locale: string;
10
10
  onRemoveItem?: (id: string) => void;
11
11
  removeAriaLabel: string;
12
+ /** Show the per-item remove control. Defaults to `true`. */
13
+ showRemoveButton?: boolean;
12
14
  emptyState?: React.ReactNode;
13
15
  classNames: SummaryClassNames;
14
16
  }
@@ -4,4 +4,4 @@
4
4
  * Total + CTA, and a compact mobile bottom-bar.
5
5
  */
6
6
  export { Summary } from './Summary';
7
- export type { SummaryProps, SummaryLineItem, SummaryServiceFee, SummaryTotalRow, SummaryPrimaryAction, SummaryLabels, Money, } from './types';
7
+ export type { SummaryProps, SummaryLineItem, SummaryItemDetail, SummaryServiceFee, SummaryTotalRow, SummaryPrimaryAction, SummaryLabels, Money, } from './types';
@@ -1,6 +1,28 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { Money } from '../../utils/money';
3
3
  export type { Money } from '../../utils/money';
4
+ /**
5
+ * A generic, parametrizable detail row rendered under a line item — an icon +
6
+ * label, an optional right-aligned value, and an optional info tooltip. It is
7
+ * intentionally agnostic: the host composes whatever the design needs (e.g. an
8
+ * auto-renewal note, a "pay by installments" line, a fulfilment hint) without
9
+ * the Summary pattern knowing those domains. The existing `dateLabel` /
10
+ * `dateRange` slots stay as dedicated rows; this covers everything else.
11
+ */
12
+ export interface SummaryItemDetail {
13
+ /** Stable key for `data-testid` (falls back to the row index). */
14
+ key?: string;
15
+ /** Leading icon node (e.g. `lucide:refresh-cw`, `lucide:scissors`). */
16
+ icon?: ReactNode;
17
+ /** Left label (rendered muted, like the date rows). */
18
+ label: ReactNode;
19
+ /** Optional right-aligned value (e.g. "$4.23 / month"). */
20
+ value?: ReactNode;
21
+ /** Tone of the value: `'primary'` paints it in the primary color; default inherits the muted label tone. */
22
+ valueTone?: 'default' | 'primary';
23
+ /** When set, an info icon next to the value reveals this content in a tooltip. */
24
+ tooltip?: ReactNode;
25
+ }
4
26
  /**
5
27
  * A single, flexible line item. The four Figma "types" (Ticket, Event,
6
28
  * Membership, Donation) are compositions of this one shape — not rigid
@@ -28,6 +50,12 @@ export interface SummaryLineItem {
28
50
  };
29
51
  /** Nested rows, indented (Event's Adult / Children). */
30
52
  children?: SummaryLineItem[];
53
+ /**
54
+ * Extra detail rows rendered under the item (after any date row). Generic
55
+ * and agnostic — see {@link SummaryItemDetail}. Used e.g. by membership to
56
+ * show an auto-renewal note and a pay-by-installments line.
57
+ */
58
+ details?: SummaryItemDetail[];
31
59
  }
32
60
  /** The "Pay Service fee" radio-toggle row. */
33
61
  export interface SummaryServiceFee {
@@ -86,8 +114,12 @@ export interface SummaryClassNames {
86
114
  totalsRows?: string;
87
115
  /** The Total row. */
88
116
  total?: string;
117
+ /** The secondary (primary-colored) total row under the Total. */
118
+ secondaryTotal?: string;
89
119
  /** Primary CTA button. */
90
120
  cta?: string;
121
+ /** The caption rendered under the CTA. */
122
+ ctaCaption?: string;
91
123
  /** Mobile compact bottom-bar. */
92
124
  mobileBar?: string;
93
125
  /** Mobile cart button. */
@@ -113,6 +145,34 @@ export interface SummaryProps {
113
145
  label?: ReactNode;
114
146
  amount: Money;
115
147
  };
148
+ /**
149
+ * Optional flat rows rendered BETWEEN the Total and the secondary total —
150
+ * e.g. applied gift cards as tenders ("Gift Card · …XWDG −$50.00"). Same
151
+ * shape and flat style as `rows`; negative amounts are passed as data,
152
+ * exactly like a Discounts line. The Total itself is never affected.
153
+ */
154
+ postTotalRows?: SummaryTotalRow[];
155
+ /**
156
+ * An optional secondary total rendered under the Total (after any
157
+ * `postTotalRows`), in the primary color (e.g. "Due Today"). Purely
158
+ * presentational — the host supplies both the label and the
159
+ * already-computed amount.
160
+ */
161
+ secondaryTotal?: {
162
+ label: ReactNode;
163
+ amount: Money;
164
+ };
165
+ /**
166
+ * An optional caption rendered under the CTA, in muted text (e.g. an
167
+ * installment breakdown like "$50.75 total · 12 monthly installments…").
168
+ */
169
+ ctaCaption?: ReactNode;
170
+ /**
171
+ * Whether the per-item remove (trash) control is shown. Defaults to `true`;
172
+ * pass `false` to hide it even when `onRemoveItem` is wired. Independent of
173
+ * `onRemoveItem` so a host can keep the handler but suppress the control.
174
+ */
175
+ showRemoveButton?: boolean;
116
176
  /**
117
177
  * Whether the summary can collapse — the header shows a `×` and the whole
118
178
  * header toggles Open/Closed. Defaults to `variant === 'mobile'` (including
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared responsive grid-column class maps for the card-picker patterns
3
+ * (TileSelect single-select, CheckboxCardGroup multi-select). Kept in one
4
+ * place so the two siblings never drift on breakpoints or column counts.
5
+ *
6
+ * The literal Tailwind classes must stay spelled out (not interpolated) so
7
+ * the JIT scanner keeps generating them.
8
+ */
9
+ export declare const GRID_DESKTOP_COLS: Record<2 | 3 | 4, string>;
10
+ export declare const GRID_MOBILE_COLS: Record<1 | 2, string>;
@@ -41,6 +41,16 @@ export { FilterPopover } from './FilterPopover';
41
41
  export type * from './FilterPopover';
42
42
  export { SessionTimeline } from './SessionTimeline';
43
43
  export type * from './SessionTimeline';
44
+ export { PageHeader } from './PageHeader';
45
+ export type { PageHeaderProps, PageHeaderClassNames } from './PageHeader';
46
+ export { StatusChip } from './StatusChip';
47
+ export type { StatusChipProps, StatusChipStatus } from './StatusChip';
48
+ export { DimensionChip } from './DimensionChip';
49
+ export type { DimensionChipProps } from './DimensionChip';
50
+ export { CheckboxCardGroup } from './CheckboxCardGroup';
51
+ export type { CheckboxCardGroupProps, CheckboxCardOption } from './CheckboxCardGroup';
52
+ export { ListPanel } from './ListPanel';
53
+ export type { ListPanelProps, ListPanelClassNames } from './ListPanel';
44
54
  export { CashTenderForm } from './CashTenderForm';
45
55
  export type { CashTenderFormProps, CashTenderValue, CashTenderLabels, } from './CashTenderForm';
46
56
  export { CheckTenderForm } from './CheckTenderForm';
@@ -64,6 +74,6 @@ export type { PaymentCashChangeBannerProps } from './PaymentCashChangeBanner';
64
74
  export { PaymentSubAmountInput } from './PaymentSubAmountInput';
65
75
  export type { PaymentSubAmountInputProps } from './PaymentSubAmountInput';
66
76
  export { ConfirmDialog } from './ConfirmDialog';
67
- export type { ConfirmDialogProps } from './ConfirmDialog';
77
+ export type { ConfirmDialogProps, ConfirmDialogVariant } from './ConfirmDialog';
68
78
  export { Summary } from './Summary';
69
- export type { SummaryProps, SummaryLineItem, SummaryServiceFee, SummaryTotalRow, SummaryPrimaryAction, SummaryLabels, } from './Summary';
79
+ export type { SummaryProps, SummaryLineItem, SummaryItemDetail, SummaryServiceFee, SummaryTotalRow, SummaryPrimaryAction, SummaryLabels, } from './Summary';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@veevarts/design-system",
3
3
  "private": false,
4
- "version": "1.14.0",
4
+ "version": "1.15.0-alpha.10",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",