@veevarts/design-system 1.16.0 → 1.17.0-alpha.2
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/README.md +12 -0
- package/dist/components/AppliedCodeCard/AppliedCodeCard.d.ts +13 -0
- package/dist/components/AppliedCodeCard/index.d.ts +2 -0
- package/dist/components/DatePicker/DatePicker.d.ts +17 -0
- package/dist/components/DatePicker/index.d.ts +2 -0
- package/dist/components/RedeemCodeInput/RedeemCodeInput.d.ts +21 -0
- package/dist/components/RedeemCodeInput/index.d.ts +2 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/index.cjs +10 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8346 -7160
- package/dist/patterns/AdminTable/AdminTable.d.ts +42 -0
- package/dist/patterns/AdminTable/index.d.ts +3 -0
- package/dist/patterns/AdminTable/styles.d.ts +34 -0
- package/dist/patterns/AdminTextField/AdminTextField.d.ts +39 -0
- package/dist/patterns/AdminTextField/index.d.ts +3 -0
- package/dist/patterns/AdminTextField/styles.d.ts +35 -0
- package/dist/patterns/AdminToolbar/AdminToolbar.d.ts +18 -0
- package/dist/patterns/AdminToolbar/index.d.ts +2 -0
- package/dist/patterns/ConfirmDialog/ConfirmDialog.d.ts +22 -9
- package/dist/patterns/ConfirmDialog/index.d.ts +1 -1
- package/dist/patterns/DimensionChip/index.d.ts +13 -0
- package/dist/patterns/InstallmentFundAssignment/InstallmentFundAssignment.d.ts +1 -1
- package/dist/patterns/InstallmentFundAssignment/types.d.ts +1 -0
- package/dist/patterns/InstallmentSchedule/InstallmentTable.d.ts +1 -1
- package/dist/patterns/InstallmentSchedule/index.d.ts +1 -1
- package/dist/patterns/InstallmentSchedule/types.d.ts +14 -1
- package/dist/patterns/KeyValueChip/KeyValueChip.d.ts +12 -0
- package/dist/patterns/KeyValueChip/index.d.ts +2 -0
- package/dist/patterns/ListPanel/ListPanel.d.ts +45 -0
- package/dist/patterns/ListPanel/index.d.ts +2 -0
- package/dist/patterns/OfferCard/OfferCard.d.ts +1 -1
- package/dist/patterns/OfferCard/types.d.ts +23 -0
- package/dist/patterns/PageHeader/PageHeader.d.ts +33 -0
- package/dist/patterns/PageHeader/index.d.ts +2 -0
- package/dist/patterns/PaginationSummary/PaginationSummary.d.ts +26 -0
- package/dist/patterns/PaginationSummary/index.d.ts +3 -0
- package/dist/patterns/PaginationSummary/page-range.d.ts +19 -0
- package/dist/patterns/PickerRow/PickerRow.d.ts +27 -0
- package/dist/patterns/PickerRow/index.d.ts +2 -0
- package/dist/patterns/RowActions/RowActions.d.ts +17 -0
- package/dist/patterns/RowActions/index.d.ts +2 -0
- package/dist/patterns/StatusChip/StatusChip.d.ts +28 -0
- package/dist/patterns/StatusChip/index.d.ts +2 -0
- package/dist/patterns/Summary/components/CollapseHeader.d.ts +6 -0
- package/dist/patterns/Summary/components/TotalsLineRow.d.ts +6 -2
- package/dist/patterns/Summary/index.d.ts +1 -1
- package/dist/patterns/Summary/types.d.ts +31 -6
- package/dist/patterns/TableSkeleton/TableSkeleton.d.ts +32 -0
- package/dist/patterns/TableSkeleton/index.d.ts +2 -0
- package/dist/patterns/UnderlineTabs/UnderlineTabs.d.ts +18 -0
- package/dist/patterns/UnderlineTabs/index.d.ts +2 -0
- package/dist/patterns/grid-columns.d.ts +10 -0
- package/dist/patterns/index.d.ts +28 -2
- package/dist/tailwind/index.d.ts +4 -0
- package/dist/tailwind/index.js +68 -1
- package/dist/tokens/admin-surface.d.ts +58 -0
- package/dist/tokens/index.d.ts +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { TableBody } from '../../components';
|
|
3
|
+
export interface AdminTableColumn {
|
|
4
|
+
/** Stable identity for the column, and the key its cells are matched on. */
|
|
5
|
+
key: string;
|
|
6
|
+
/** Header text. Pass an empty string for a control column. */
|
|
7
|
+
label: React.ReactNode;
|
|
8
|
+
/** Cell alignment. Numeric columns should be `'right'`. */
|
|
9
|
+
align?: 'left' | 'right';
|
|
10
|
+
/** Fixed pixel width. Omit to let the column size to content. */
|
|
11
|
+
width?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AdminTableClassNames {
|
|
14
|
+
base?: string;
|
|
15
|
+
table?: string;
|
|
16
|
+
th?: string;
|
|
17
|
+
tr?: string;
|
|
18
|
+
td?: string;
|
|
19
|
+
footer?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AdminTableProps {
|
|
22
|
+
columns: AdminTableColumn[];
|
|
23
|
+
/**
|
|
24
|
+
* HeroUI `TableRow` children.
|
|
25
|
+
*
|
|
26
|
+
* Typed as HeroUI's own body-children type rather than `ReactNode`, so the
|
|
27
|
+
* collection contract is enforced where you write it: passing a bare `<tr>`
|
|
28
|
+
* is a type error here instead of `Unknown element <tr> in collection` at
|
|
29
|
+
* render time.
|
|
30
|
+
*/
|
|
31
|
+
children: React.ComponentProps<typeof TableBody>['children'];
|
|
32
|
+
/** Shown when there are no rows. */
|
|
33
|
+
emptyContent?: React.ReactNode;
|
|
34
|
+
/** Rendered under the table — where a pager goes. */
|
|
35
|
+
footer?: React.ReactNode;
|
|
36
|
+
/** Accessible name. Required: a table with no name is unnavigable by screen reader. */
|
|
37
|
+
ariaLabel: string;
|
|
38
|
+
className?: string;
|
|
39
|
+
classNames?: AdminTableClassNames;
|
|
40
|
+
'data-testid'?: string;
|
|
41
|
+
}
|
|
42
|
+
export declare const AdminTable: React.FC<AdminTableProps>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The back-office table's appearance, in one place.
|
|
3
|
+
*
|
|
4
|
+
* `AdminTable` feeds these to HeroUI's slots; nothing here is spelled a second
|
|
5
|
+
* time inside the component. They started out split — exported strings here,
|
|
6
|
+
* "internal" ones inline — and the two immediately drifted: `adminTdClass` and
|
|
7
|
+
* the `td` slot were the same declaration with one dropping `align-middle`, and
|
|
8
|
+
* the row hover existed as both `hover:` and `data-[hover=true]:`. That is the
|
|
9
|
+
* exact failure these components were built to stop, so the split is gone.
|
|
10
|
+
*
|
|
11
|
+
* They are exported for the one screen that cannot use `AdminTable`: react-aria's
|
|
12
|
+
* collection API rejects an interleaved `<tr>`, so a table that expands a row
|
|
13
|
+
* into a full-width panel renders its own `<table>` and dresses it with these.
|
|
14
|
+
*
|
|
15
|
+
* The arbitrary values (`text-[11px]`, `tracking-[.04em]`) are the mockups'
|
|
16
|
+
* measurements, pinned rather than rounded to the nearest scale step: these
|
|
17
|
+
* surfaces are pixel-ports of signed-off designs.
|
|
18
|
+
*/
|
|
19
|
+
/** Uppercase column header. `bg-transparent` overrides HeroUI's own header fill. */
|
|
20
|
+
export declare const adminThClass = "text-left text-[11px] font-semibold uppercase tracking-[.04em] text-acct-muted px-4 pt-4 pb-3 whitespace-nowrap bg-transparent";
|
|
21
|
+
/** Body cell. */
|
|
22
|
+
export declare const adminTdClass = "px-4 text-[13.5px] text-acct-ink2 align-middle";
|
|
23
|
+
/**
|
|
24
|
+
* Row hairline and hover.
|
|
25
|
+
*
|
|
26
|
+
* Carries both hover spellings on purpose: `data-[hover=true]:` is what HeroUI
|
|
27
|
+
* sets on its own rows, and `hover:` is what a plain `<tr>` responds to. One
|
|
28
|
+
* string serves both so the two renderings cannot look different.
|
|
29
|
+
*/
|
|
30
|
+
export declare const adminRowClass = "border-t border-acct-hair transition-colors duration-150 hover:bg-acct-page data-[hover=true]:bg-acct-page";
|
|
31
|
+
/** The table element itself. */
|
|
32
|
+
export declare const adminTableClass = "w-full";
|
|
33
|
+
/** The strip under the table where a pager sits. */
|
|
34
|
+
export declare const adminTableFooterClass = "border-t border-acct-border px-5 py-3.5";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
interface AdminTextFieldBase {
|
|
3
|
+
/** Uppercase label above the control. Omit only when an adjacent element already names it. */
|
|
4
|
+
label?: React.ReactNode;
|
|
5
|
+
value: string;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** Monospace face without the read-only treatment, for codes the user types. */
|
|
9
|
+
mono?: boolean;
|
|
10
|
+
/** Claim initial focus. Only for the first field of a dialog, never on a page. */
|
|
11
|
+
autoFocus?: boolean;
|
|
12
|
+
/** Small helper or error text under the control. */
|
|
13
|
+
hint?: React.ReactNode;
|
|
14
|
+
/** Renders the hint as an error and marks the control invalid. */
|
|
15
|
+
invalid?: boolean;
|
|
16
|
+
className?: string;
|
|
17
|
+
'data-testid'?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* `onChange` is REQUIRED unless the field is read-only.
|
|
21
|
+
*
|
|
22
|
+
* This is a controlled input: given a `value` and no handler, React pins it and
|
|
23
|
+
* typing does nothing — a field that looks editable, accepts focus, and silently
|
|
24
|
+
* discards every keystroke. That is indistinguishable from a bug at a glance,
|
|
25
|
+
* and it is what happens by accident when someone renders one to show a value.
|
|
26
|
+
*
|
|
27
|
+
* Showing a value without accepting edits is a real case, so it stays possible;
|
|
28
|
+
* it just has to be said, with `readOnly`, which also renders it as system-owned
|
|
29
|
+
* and announces it correctly.
|
|
30
|
+
*/
|
|
31
|
+
export type AdminTextFieldProps = AdminTextFieldBase & ({
|
|
32
|
+
readOnly: true;
|
|
33
|
+
onChange?: never;
|
|
34
|
+
} | {
|
|
35
|
+
readOnly?: false;
|
|
36
|
+
onChange: (value: string) => void;
|
|
37
|
+
});
|
|
38
|
+
export declare const AdminTextField: React.FC<AdminTextFieldProps>;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The back-office field's appearance, in one place.
|
|
3
|
+
*
|
|
4
|
+
* `AdminTextField` feeds these to HeroUI's `Input` slots; nothing here is
|
|
5
|
+
* spelled a second time inside the component. Splitting them — exported strings
|
|
6
|
+
* here, "internal" ones inline — is what let this file and its component drift
|
|
7
|
+
* apart, so every slot's styling lives here whether or not a consumer needs it.
|
|
8
|
+
*
|
|
9
|
+
* They are exported so a form with a control this component does not cover (a
|
|
10
|
+
* textarea, a date picker) can dress its HeroUI counterpart identically rather
|
|
11
|
+
* than approximating it.
|
|
12
|
+
*
|
|
13
|
+
* The arbitrary values are the mockups' measurements, pinned rather than rounded
|
|
14
|
+
* to the nearest scale step: these surfaces are pixel-ports of signed-off
|
|
15
|
+
* designs.
|
|
16
|
+
*/
|
|
17
|
+
/** Uppercase label above a control — HeroUI's `label` slot. */
|
|
18
|
+
export declare const adminFieldLabelClass = "text-[11px] font-semibold uppercase tracking-[.04em] text-acct-muted mb-1.5";
|
|
19
|
+
/**
|
|
20
|
+
* The 38px box — HeroUI's `inputWrapper` slot, which carries the border and
|
|
21
|
+
* background (the `input` slot is the bare field).
|
|
22
|
+
*
|
|
23
|
+
* `!h-[38px]` because HeroUI sets its own height per size, and the
|
|
24
|
+
* `data-[hover=]` / `group-data-[focus=]` hooks because overriding the plain
|
|
25
|
+
* classes alone leaves its own hover and focus borders showing through.
|
|
26
|
+
*/
|
|
27
|
+
export declare const adminInputWrapperClass: string;
|
|
28
|
+
/** The bare field — HeroUI's `input` slot. */
|
|
29
|
+
export declare const adminInputClass = "text-[13.5px] text-acct-ink";
|
|
30
|
+
/** A value the system minted rather than the user: muted fill, not editable. */
|
|
31
|
+
export declare const adminInputReadOnlyClass = "bg-acct-page text-acct-muted cursor-default";
|
|
32
|
+
/** Helper text under the control — HeroUI's `description` slot. */
|
|
33
|
+
export declare const adminFieldHintClass = "mt-[5px] text-xs text-acct-sub";
|
|
34
|
+
/** Error text under the control — HeroUI's `errorMessage` slot. */
|
|
35
|
+
export declare const adminFieldErrorClass = "mt-[5px] text-xs text-acct-danger";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface AdminToolbarProps {
|
|
3
|
+
searchValue: string;
|
|
4
|
+
onSearchChange: (value: string) => void;
|
|
5
|
+
/** Placeholder AND the hidden label, so the field is named even once filled. */
|
|
6
|
+
searchLabel: string;
|
|
7
|
+
/** Leading glyph inside the search box. */
|
|
8
|
+
searchIcon?: React.ReactNode;
|
|
9
|
+
/** Filters, sort pickers, a toggle — laid out after the search box. */
|
|
10
|
+
children?: React.ReactNode;
|
|
11
|
+
/** Pushed to the far right, for a primary action. */
|
|
12
|
+
trailing?: React.ReactNode;
|
|
13
|
+
/** Search box width. `'md'` (280px) by default, `'lg'` (360px) for wide tables. */
|
|
14
|
+
searchWidth?: 'md' | 'lg';
|
|
15
|
+
className?: string;
|
|
16
|
+
'data-testid'?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const AdminToolbar: React.FC<AdminToolbarProps>;
|
|
@@ -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
|
|
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
|
-
/**
|
|
18
|
-
|
|
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,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Use `KeyValueChip`. Same component, domain-neutral name.
|
|
3
|
+
*
|
|
4
|
+
* It shipped named after the accounting ledger's cost-center tags, which is
|
|
5
|
+
* what it was first built for and not what it is: it only ever knew
|
|
6
|
+
* "label: value", never what a dimension was. The name is what kept every
|
|
7
|
+
* other team from reaching for it.
|
|
8
|
+
*
|
|
9
|
+
* Kept as an alias so consumers on 1.21+ do not break. Remove on the next
|
|
10
|
+
* major, once the remaining imports have moved.
|
|
11
|
+
*/
|
|
12
|
+
export { KeyValueChip as DimensionChip } from '../KeyValueChip';
|
|
13
|
+
export type { KeyValueChipProps as DimensionChipProps } from '../KeyValueChip';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { JSX } from 'react';
|
|
2
2
|
import { InstallmentFundAssignmentProps } from './types';
|
|
3
|
-
export declare function InstallmentFundAssignment({ assignments, funds, labels: customLabels, classNames, isSaving, hasSavedAssignments, isFundPickerOpen, activeAssignmentId, footer, onAssignmentsChange, onOpenFundPicker, onCloseFundPicker, onCollapseChange, onSave, }: InstallmentFundAssignmentProps): JSX.Element;
|
|
3
|
+
export declare function InstallmentFundAssignment({ assignments, funds, labels: customLabels, classNames, isSaving, hasSavedAssignments, isFundPickerOpen, activeAssignmentId, modalPortalContainer, footer, onAssignmentsChange, onOpenFundPicker, onCloseFundPicker, onCollapseChange, onSave, }: InstallmentFundAssignmentProps): JSX.Element;
|
|
@@ -57,6 +57,7 @@ export type InstallmentFundAssignmentProps = {
|
|
|
57
57
|
hasSavedAssignments?: boolean;
|
|
58
58
|
isFundPickerOpen?: boolean;
|
|
59
59
|
activeAssignmentId?: string | null;
|
|
60
|
+
modalPortalContainer?: Element;
|
|
60
61
|
footer?: ReactNode;
|
|
61
62
|
onModeChange?: (mode: InstallmentFundAssignmentMode) => void;
|
|
62
63
|
onAssignmentsChange: (assignments: InstallmentFundAssignmentEntry[]) => void;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { JSX } from 'react';
|
|
2
2
|
import { InstallmentTableProps } from './types';
|
|
3
|
-
export declare function InstallmentTable({ installments, currency, locale, showTitle, showCard, showEditPayment, labels: customLabels, isSaving, onEditInstallments, onPayInstallment, onDeleteInstallment, }: InstallmentTableProps): JSX.Element;
|
|
3
|
+
export declare function InstallmentTable({ installments, currency, locale, showTitle, showCard, showEditPayment, showDelete, payNowHiddenStatuses, labels: customLabels, isSaving, onEditInstallments, onPayInstallment, onDeleteInstallment, }: InstallmentTableProps): JSX.Element;
|
|
@@ -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?:
|
|
9
|
+
status?: InstallmentStatus | (string & {});
|
|
9
10
|
};
|
|
10
11
|
export type AutomaticScheduleSettings = {
|
|
11
12
|
numberOfInstallments: number;
|
|
@@ -108,6 +109,18 @@ export type InstallmentTableProps = {
|
|
|
108
109
|
showTitle?: boolean;
|
|
109
110
|
showCard?: boolean;
|
|
110
111
|
showEditPayment?: boolean;
|
|
112
|
+
/**
|
|
113
|
+
* FR-1619 — when `false`, the delete action inside the row-actions
|
|
114
|
+
* dropdown is not rendered. Defaults to `true` (backward-compatible).
|
|
115
|
+
*/
|
|
116
|
+
showDelete?: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* FR-1619 — statuses for which the Pay Now button is NOT rendered on a row.
|
|
119
|
+
* Typed with the `InstallmentStatus` union so consumers get compile-time
|
|
120
|
+
* safety on status keys. The pre-existing `paid` disabled guard still
|
|
121
|
+
* applies to any Pay Now button that IS rendered. Defaults to `[]`.
|
|
122
|
+
*/
|
|
123
|
+
payNowHiddenStatuses?: InstallmentStatus[];
|
|
111
124
|
labels?: InstallmentTableLabels;
|
|
112
125
|
isSaving?: boolean;
|
|
113
126
|
onEditInstallments: () => void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface KeyValueChipProps {
|
|
3
|
+
/** Muted leading text — what the value describes (a field, category or type name). */
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
/** Emphasised trailing text — the value itself. */
|
|
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 KeyValueChip: React.FC<KeyValueChipProps>;
|
|
@@ -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>;
|
|
@@ -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,26 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface PaginationSummaryClassNames {
|
|
3
|
+
base?: string;
|
|
4
|
+
emphasis?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PaginationSummaryProps {
|
|
7
|
+
/** Current page, 1-based. */
|
|
8
|
+
page: number;
|
|
9
|
+
/** Rows per page. */
|
|
10
|
+
pageSize: number;
|
|
11
|
+
/** Total rows across all pages, not the length of the current page. */
|
|
12
|
+
total: number;
|
|
13
|
+
/** What is being counted, already pluralised (e.g. `"entries"`). */
|
|
14
|
+
unit?: React.ReactNode;
|
|
15
|
+
/**
|
|
16
|
+
* Announce range changes to assistive tech. On by default: paging is a
|
|
17
|
+
* user-initiated change whose only text confirmation is this line. Turn it
|
|
18
|
+
* off when the surrounding table already announces its own updates, to
|
|
19
|
+
* avoid reading the change twice.
|
|
20
|
+
*/
|
|
21
|
+
announce?: boolean;
|
|
22
|
+
className?: string;
|
|
23
|
+
classNames?: PaginationSummaryClassNames;
|
|
24
|
+
'data-testid'?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const PaginationSummary: React.FC<PaginationSummaryProps>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The inclusive 1-based range covered by the current page.
|
|
3
|
+
*
|
|
4
|
+
* Its own module rather than a second export from `PaginationSummary.tsx`, so
|
|
5
|
+
* that file exports only its component (`react-refresh/only-export-components`).
|
|
6
|
+
* It is exported at all because the arithmetic, not the markup, is what callers
|
|
7
|
+
* reuse: one rendering its own sentence (another language, another emphasis)
|
|
8
|
+
* should not have to restate the edge cases.
|
|
9
|
+
*
|
|
10
|
+
* - No rows at all → `0–0`, so the caller can render "0 of 0" rather than the
|
|
11
|
+
* `1–0` that the naive formula produces.
|
|
12
|
+
* - Last page → `to` is clamped to `total`, never `page * pageSize`.
|
|
13
|
+
* - `page` past the end (a filter that shrank the result set before the page
|
|
14
|
+
* state caught up) → an empty range rather than a negative one.
|
|
15
|
+
*/
|
|
16
|
+
export declare function pageRange(page: number, pageSize: number, total: number): {
|
|
17
|
+
from: number;
|
|
18
|
+
to: number;
|
|
19
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface PickerRowProps {
|
|
3
|
+
/** Rendered inside the trigger when a value is set. Omit for the empty state. */
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
/** Shown when there is no value. */
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
/** Opens the picker. */
|
|
8
|
+
onOpen: () => void;
|
|
9
|
+
/** Clears the value. Omitted or undefined hides the clear button entirely. */
|
|
10
|
+
onClear?: () => void;
|
|
11
|
+
/**
|
|
12
|
+
* Accessible name for the trigger. Say what is being picked, not what is
|
|
13
|
+
* picked: "Revenue account" reads better than repeating the value, which the
|
|
14
|
+
* content already announces.
|
|
15
|
+
*/
|
|
16
|
+
ariaLabel: string;
|
|
17
|
+
/** Leading glyph. Pass an inline SVG. */
|
|
18
|
+
icon?: React.ReactNode;
|
|
19
|
+
/** Trailing affordance, normally a chevron. Pass an inline SVG. */
|
|
20
|
+
trailingIcon?: React.ReactNode;
|
|
21
|
+
/** Glyph for the clear button. Pass an inline SVG. */
|
|
22
|
+
clearIcon?: React.ReactNode;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
className?: string;
|
|
25
|
+
'data-testid'?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare const PickerRow: React.FC<PickerRowProps>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface RowAction {
|
|
3
|
+
key: string;
|
|
4
|
+
/** Accessible name AND tooltip. Include the subject: "Edit Annual Fund", not "Edit". */
|
|
5
|
+
label: string;
|
|
6
|
+
icon: React.ReactNode;
|
|
7
|
+
onPress: () => void;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface RowActionsProps {
|
|
11
|
+
actions: RowAction[];
|
|
12
|
+
/** Button edge length. `'md'` (30px) by default, `'sm'` (24px) for dense rows. */
|
|
13
|
+
size?: 'sm' | 'md';
|
|
14
|
+
className?: string;
|
|
15
|
+
'data-testid'?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const RowActions: React.FC<RowActionsProps>;
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
/**
|
|
11
|
+
* Visual style. HeroUI chip variants (default `'flat'`), plus the DS
|
|
12
|
+
* `'dot'` variant: a soft, radius-full pill with a leading tone dot,
|
|
13
|
+
* 12px / weight-600 text, tuned for dense admin lifecycle tables.
|
|
14
|
+
*/
|
|
15
|
+
variant?: ChipProps['variant'] | 'dot';
|
|
16
|
+
/** Chip size. Default `'sm'`. Ignored by `variant="dot"`. */
|
|
17
|
+
size?: ChipProps['size'];
|
|
18
|
+
/**
|
|
19
|
+
* Override the colour derived from `status`. Escape hatch for the
|
|
20
|
+
* rare state not covered by `StatusChipStatus`. Ignored by `variant="dot"`.
|
|
21
|
+
*/
|
|
22
|
+
color?: ChipProps['color'];
|
|
23
|
+
/** Optional leading element (dot, icon). Ignored by `variant="dot"`. */
|
|
24
|
+
startContent?: React.ReactNode;
|
|
25
|
+
className?: string;
|
|
26
|
+
'data-testid'?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const StatusChip: React.FC<StatusChipProps>;
|
|
@@ -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. */
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { SummaryPostTotalRow } from '../types';
|
|
3
3
|
export interface TotalsLineRowProps {
|
|
4
|
-
row:
|
|
4
|
+
row: SummaryPostTotalRow;
|
|
5
5
|
locale: string;
|
|
6
6
|
emphasized: boolean;
|
|
7
|
+
onRemove?: (id: string) => void;
|
|
8
|
+
removeAriaLabel?: string;
|
|
9
|
+
/** Show the per-row remove control. Defaults to `true`. */
|
|
10
|
+
showRemoveButton?: boolean;
|
|
7
11
|
}
|
|
8
12
|
export declare const TotalsLineRow: React.FC<TotalsLineRowProps>;
|