@veevarts/design-system 2.1.0-beta.2 → 2.1.0-beta.20
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 +39 -0
- package/dist/components/Drawer/Drawer.d.ts +17 -0
- package/dist/components/Drawer/index.d.ts +2 -0
- package/dist/components/Modal/CloseButton.d.ts +18 -0
- package/dist/components/Modal/Modal.d.ts +15 -0
- package/dist/components/Modal/index.d.ts +2 -0
- package/dist/components/Modal/useLabelledCloseButton.d.ts +13 -0
- package/dist/components/Select/Select.d.ts +10 -0
- package/dist/components/Table/Table.d.ts +7 -0
- package/dist/components/Table/index.d.ts +2 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/index.cjs +5 -5
- package/dist/index.d.ts +4 -0
- package/dist/index.js +9332 -5319
- package/dist/patterns/ActivityTimeline/ActivityTimeline.d.ts +3 -0
- package/dist/patterns/ActivityTimeline/index.d.ts +2 -0
- package/dist/patterns/ActivityTimeline/styles.d.ts +15 -0
- package/dist/patterns/ActivityTimeline/types.d.ts +15 -0
- package/dist/patterns/AdminTable/AdminTable.d.ts +1 -0
- package/dist/patterns/AdminTable/styles.d.ts +6 -0
- package/dist/patterns/AdminToolbar/AdminToolbar.d.ts +13 -2
- package/dist/patterns/AdminToolbar/index.d.ts +1 -0
- package/dist/patterns/AdminToolbar/styles.d.ts +49 -0
- package/dist/patterns/AdminToolbar/types.d.ts +2 -0
- package/dist/patterns/AmountList/AmountList.d.ts +3 -0
- package/dist/patterns/AmountList/index.d.ts +2 -0
- package/dist/patterns/AmountList/styles.d.ts +23 -0
- package/dist/patterns/AmountList/types.d.ts +26 -0
- package/dist/patterns/CardList/CardList.d.ts +3 -0
- package/dist/patterns/CardList/index.d.ts +2 -0
- package/dist/patterns/CardList/styles.d.ts +20 -0
- package/dist/patterns/CardList/types.d.ts +20 -0
- package/dist/patterns/CardStack/CardStack.d.ts +7 -0
- package/dist/patterns/CardStack/index.d.ts +2 -0
- package/dist/patterns/CardStack/styles.d.ts +2 -0
- package/dist/patterns/CashTenderForm/types.d.ts +6 -0
- package/dist/patterns/CellText/CellText.d.ts +16 -0
- package/dist/patterns/CellText/index.d.ts +2 -0
- package/dist/patterns/CellText/styles.d.ts +7 -0
- package/dist/patterns/DiscardGuard/DiscardGuard.d.ts +23 -0
- package/dist/patterns/DiscardGuard/context.d.ts +25 -0
- package/dist/patterns/DiscardGuard/index.d.ts +6 -0
- package/dist/patterns/DiscardGuard/useDiscardGuard.d.ts +38 -0
- package/dist/patterns/DonationAmounts/index.d.ts +1 -1
- package/dist/patterns/DonationAmounts/styles.d.ts +32 -0
- package/dist/patterns/DonationAmounts/types.d.ts +55 -1
- package/dist/patterns/DonationAmounts/utils/currency.d.ts +7 -3
- package/dist/patterns/EntityRow/EntityList.d.ts +9 -0
- package/dist/patterns/EntityRow/EntityRow.d.ts +3 -0
- package/dist/patterns/EntityRow/context.d.ts +2 -0
- package/dist/patterns/EntityRow/icons.d.ts +3 -0
- package/dist/patterns/EntityRow/index.d.ts +3 -0
- package/dist/patterns/EntityRow/initials.d.ts +6 -0
- package/dist/patterns/EntityRow/styles.d.ts +59 -0
- package/dist/patterns/EntityRow/types.d.ts +118 -0
- package/dist/patterns/FeedbackState/FeedbackState.d.ts +1 -1
- package/dist/patterns/FeedbackState/type.d.ts +11 -1
- package/dist/patterns/FilterSelect/FilterSelect.d.ts +3 -0
- package/dist/patterns/FilterSelect/FilterSelectGroup.d.ts +3 -0
- package/dist/patterns/FilterSelect/index.d.ts +3 -0
- package/dist/patterns/FilterSelect/styles.d.ts +17 -0
- package/dist/patterns/FilterSelect/types.d.ts +19 -0
- package/dist/patterns/InlineConfirm/InlineConfirm.d.ts +38 -0
- package/dist/patterns/InlineConfirm/index.d.ts +2 -0
- package/dist/patterns/InlineConfirm/styles.d.ts +16 -0
- package/dist/patterns/InstallmentSchedule/types.d.ts +29 -5
- package/dist/patterns/InstallmentSchedule/utils.d.ts +6 -0
- package/dist/patterns/KeyValueChip/KeyValueChip.d.ts +1 -0
- package/dist/patterns/KeyValueRows/KeyValueRows.d.ts +13 -0
- package/dist/patterns/KeyValueRows/index.d.ts +2 -0
- package/dist/patterns/KeyValueRows/styles.d.ts +8 -0
- package/dist/patterns/LineItemRows/LineItemRows.d.ts +17 -0
- package/dist/patterns/LineItemRows/index.d.ts +2 -0
- package/dist/patterns/LineItemRows/styles.d.ts +13 -0
- package/dist/patterns/ListPanel/ListPanel.d.ts +2 -0
- package/dist/patterns/LoadMoreFooter/LoadMoreFooter.d.ts +3 -0
- package/dist/patterns/LoadMoreFooter/index.d.ts +2 -0
- package/dist/patterns/LoadMoreFooter/styles.d.ts +7 -0
- package/dist/patterns/LoadMoreFooter/types.d.ts +10 -0
- package/dist/patterns/MetaCard/types.d.ts +2 -0
- package/dist/patterns/ModalPanels/ModalPanels.d.ts +35 -0
- package/dist/patterns/ModalPanels/context.d.ts +20 -0
- package/dist/patterns/ModalPanels/focus.d.ts +44 -0
- package/dist/patterns/ModalPanels/index.d.ts +6 -0
- package/dist/patterns/ModalPanels/styles.d.ts +13 -0
- package/dist/patterns/ModalPanels/useModalPanels.d.ts +30 -0
- package/dist/patterns/Notice/Notice.d.ts +16 -0
- package/dist/patterns/Notice/index.d.ts +2 -0
- package/dist/patterns/Notice/styles.d.ts +35 -0
- package/dist/patterns/Notice/type.d.ts +39 -0
- package/dist/patterns/OutcomeView/index.d.ts +1 -1
- package/dist/patterns/OutcomeView/types.d.ts +110 -3
- package/dist/patterns/PageHeader/PageHeader.d.ts +1 -0
- package/dist/patterns/PaginationSummary/PaginationSummary.d.ts +12 -0
- package/dist/patterns/PaginationSummary/index.d.ts +1 -1
- package/dist/patterns/PaymentSubAmountInput/PaymentSubAmountInput.d.ts +2 -0
- package/dist/patterns/PillTabs/PillTabs.d.ts +3 -0
- package/dist/patterns/PillTabs/ids.d.ts +9 -0
- package/dist/patterns/PillTabs/index.d.ts +3 -0
- package/dist/patterns/PillTabs/styles.d.ts +20 -0
- package/dist/patterns/PillTabs/types.d.ts +21 -0
- package/dist/patterns/{CatalogItemCard → Programs/CatalogItemCard}/type.d.ts +1 -1
- package/dist/patterns/{EventDetails → Programs/EventDetails}/EventDetails.d.ts +3 -1
- package/dist/patterns/{OfferCard → Programs/OfferCard}/OfferCard.d.ts +1 -1
- package/dist/patterns/{OfferCard → Programs/OfferCard}/types.d.ts +7 -0
- package/dist/patterns/Programs/ProgramListItem/ProgramListItem.d.ts +17 -0
- package/dist/patterns/Programs/ProgramListItem/index.d.ts +2 -0
- package/dist/patterns/Programs/index.d.ts +5 -0
- package/dist/patterns/ReasonSelect/types.d.ts +1 -0
- package/dist/patterns/RecordCard/RecordCard.d.ts +3 -0
- package/dist/patterns/RecordCard/index.d.ts +2 -0
- package/dist/patterns/RecordCard/styles.d.ts +16 -0
- package/dist/patterns/RecordCard/types.d.ts +22 -0
- package/dist/patterns/RecordHeader/RecordHeader.d.ts +3 -0
- package/dist/patterns/RecordHeader/index.d.ts +2 -0
- package/dist/patterns/RecordHeader/styles.d.ts +43 -0
- package/dist/patterns/RecordHeader/types.d.ts +30 -0
- package/dist/patterns/RecordLayout/RecordLayout.d.ts +3 -0
- package/dist/patterns/RecordLayout/index.d.ts +2 -0
- package/dist/patterns/RecordLayout/styles.d.ts +8 -0
- package/dist/patterns/RecordLayout/types.d.ts +6 -0
- package/dist/patterns/RecordTotals/RecordTotals.d.ts +19 -0
- package/dist/patterns/RecordTotals/index.d.ts +2 -0
- package/dist/patterns/RecordTotals/styles.d.ts +19 -0
- package/dist/patterns/RefundMethodCards/RefundMethodCards.d.ts +4 -0
- package/dist/patterns/RefundMethodCards/index.d.ts +2 -0
- package/dist/patterns/RefundMethodCards/styles.d.ts +59 -0
- package/dist/patterns/RefundMethodCards/types.d.ts +72 -0
- package/dist/patterns/RefundProgressList/RefundProgressList.d.ts +4 -0
- package/dist/patterns/RefundProgressList/index.d.ts +2 -0
- package/dist/patterns/RefundProgressList/styles.d.ts +44 -0
- package/dist/patterns/RefundProgressList/types.d.ts +37 -0
- package/dist/patterns/RelatedRecordList/RelatedRecordList.d.ts +3 -0
- package/dist/patterns/RelatedRecordList/index.d.ts +2 -0
- package/dist/patterns/RelatedRecordList/styles.d.ts +19 -0
- package/dist/patterns/RelatedRecordList/types.d.ts +17 -0
- package/dist/patterns/SessionExpiredCard/SessionExpiredCard.d.ts +14 -0
- package/dist/patterns/SessionExpiredCard/index.d.ts +2 -0
- package/dist/patterns/SessionExpiredCard/type.d.ts +6 -0
- package/dist/patterns/SplitPaymentSummary/index.d.ts +1 -1
- package/dist/patterns/SplitPaymentSummary/types.d.ts +18 -0
- package/dist/patterns/StatTiles/StatTiles.d.ts +3 -0
- package/dist/patterns/StatTiles/index.d.ts +2 -0
- package/dist/patterns/StatTiles/styles.d.ts +8 -0
- package/dist/patterns/StatTiles/types.d.ts +12 -0
- package/dist/patterns/StatusChip/StatusChip.d.ts +3 -3
- package/dist/patterns/StepProgress/StepProgress.d.ts +4 -0
- package/dist/patterns/StepProgress/index.d.ts +2 -0
- package/dist/patterns/StepProgress/styles.d.ts +29 -0
- package/dist/patterns/StepProgress/types.d.ts +43 -0
- package/dist/patterns/Summary/components/ActionBar.d.ts +2 -0
- package/dist/patterns/Summary/components/GrandTotalRow.d.ts +1 -0
- package/dist/patterns/Summary/components/ItemRow.d.ts +1 -0
- package/dist/patterns/Summary/components/SummaryBody.d.ts +4 -1
- package/dist/patterns/Summary/components/TotalsLineRow.d.ts +3 -2
- package/dist/patterns/Summary/types.d.ts +51 -9
- package/dist/patterns/TableSkeleton/TableSkeleton.d.ts +1 -0
- package/dist/patterns/TileSelect/TileSelect.d.ts +80 -2
- package/dist/patterns/TileSelect/index.d.ts +1 -1
- package/dist/patterns/TileSelect/styles.d.ts +14 -0
- package/dist/patterns/ToolbarButton/ToolbarButton.d.ts +2 -0
- package/dist/patterns/UnderlineTabs/UnderlineTabs.d.ts +20 -1
- package/dist/patterns/UnderlineTabs/index.d.ts +1 -1
- package/dist/patterns/UnderlineTabs/styles.d.ts +10 -0
- package/dist/patterns/WizardShell/index.d.ts +1 -1
- package/dist/patterns/WizardShell/types.d.ts +9 -1
- package/dist/patterns/grid-columns.d.ts +1 -1
- package/dist/patterns/index.d.ts +69 -17
- package/dist/patterns/shared/hasContent.d.ts +2 -0
- package/dist/patterns/shared/index.d.ts +1 -0
- package/dist/patterns/shared/motion.d.ts +6 -0
- package/dist/patterns/shared/recordTone.d.ts +9 -0
- package/dist/patterns/shared/rem.d.ts +4 -0
- package/dist/patterns/shared/useContainerWidth.d.ts +6 -0
- package/dist/patterns/shared/useDecimalDraft.d.ts +33 -0
- package/dist/patterns/shared/usePrefillEdits.d.ts +7 -0
- package/dist/providers/DensityProvider.d.ts +7 -0
- package/dist/providers/HeroUIProvider.d.ts +20 -1
- package/dist/providers/ToastProvider.d.ts +16 -0
- package/dist/providers/close-label-context.d.ts +18 -0
- package/dist/providers/density.d.ts +17 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/tailwind/index.cjs +25 -1
- package/dist/tailwind/index.d.ts +39 -0
- package/dist/tailwind/index.mjs +25 -1
- package/dist/test/ReducedMotion.d.ts +4 -0
- package/dist/test/RootFontSize.d.ts +5 -0
- package/dist/test/container-width.d.ts +14 -0
- package/dist/test/contrast.d.ts +1 -0
- package/dist/test/px-class-names.d.ts +1 -0
- package/dist/test/px-classes.d.ts +3 -0
- package/dist/test/root-font-size.d.ts +8 -0
- package/dist/tokens/pos-surface.d.ts +23 -4
- package/package.json +2 -2
- /package/dist/patterns/{CatalogItemCard → Programs/CatalogItemCard}/CatalogItemCard.d.ts +0 -0
- /package/dist/patterns/{CatalogItemCard → Programs/CatalogItemCard}/index.d.ts +0 -0
- /package/dist/patterns/{EventDetails → Programs/EventDetails}/index.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/examples/CustomQuantitySelectorExample.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/examples/ListWithEurosCurrencyExample.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/examples/ListWithoutAnimationExample.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/examples/index.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/index.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/utils/animations.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/utils/currency.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/utils/index.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/utils/offers.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/variants/OfferCardEmpty.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/variants/OfferCardError.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/variants/OfferCardList.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/variants/OfferCardSkeleton.d.ts +0 -0
- /package/dist/patterns/{OfferCard → Programs/OfferCard}/variants/index.d.ts +0 -0
- /package/dist/patterns/{SessionTimeline → Programs/SessionTimeline}/SessionTimeline.d.ts +0 -0
- /package/dist/patterns/{SessionTimeline → Programs/SessionTimeline}/index.d.ts +0 -0
- /package/dist/patterns/{SessionTimeline → Programs/SessionTimeline}/type.d.ts +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { EntityListProps, EntityRowSize, EntityRowTagTone, EntityRowVariant } from './types';
|
|
2
|
+
export declare const entityRowClass: {
|
|
3
|
+
readonly base: "relative flex w-full items-center gap-2 transition-colors";
|
|
4
|
+
readonly content: "flex min-w-0 flex-1 items-center gap-3 text-left";
|
|
5
|
+
/**
|
|
6
|
+
* The press target is a HeroUI `Button` (or `Link`) stretched over the row
|
|
7
|
+
* by its `::after`. Its base classes have to be undone for that to work:
|
|
8
|
+
* `relative` would make the button the overlay's containing block,
|
|
9
|
+
* `transform-gpu` would too, `overflow-hidden` clips the overlay,
|
|
10
|
+
* `min-w-max` and `whitespace-nowrap` defeat truncation, and the focus
|
|
11
|
+
* outline is moved from the button to the overlay so it rings the row.
|
|
12
|
+
*/
|
|
13
|
+
readonly pressTarget: string;
|
|
14
|
+
readonly text: "flex min-w-0 flex-col";
|
|
15
|
+
readonly titleLine: "flex min-w-0 items-center gap-2";
|
|
16
|
+
readonly title: "truncate font-medium text-default-900";
|
|
17
|
+
readonly subtitle: "truncate text-default-600";
|
|
18
|
+
readonly tags: "flex shrink-0 items-center gap-1";
|
|
19
|
+
/** Lifted above the stretched overlay so each stays its own control. */
|
|
20
|
+
readonly side: "relative z-10 flex shrink-0 items-center gap-1";
|
|
21
|
+
readonly chevron: "flex shrink-0 text-default-500";
|
|
22
|
+
readonly menuTrigger: "text-default-600";
|
|
23
|
+
readonly avatar: "shrink-0 bg-default-200 text-default-700";
|
|
24
|
+
readonly dangerItem: "text-danger";
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Text overrides for flat chips whose HeroUI tone measures under 4.5:1 on the
|
|
28
|
+
* plain row's hover tint (default-100): primary 4.39:1 and warning 4.03:1 at
|
|
29
|
+
* their `-700` text. One step darker clears it; the others already do.
|
|
30
|
+
*/
|
|
31
|
+
export declare const entityRowTagToneClass: Record<EntityRowTagTone, string | undefined>;
|
|
32
|
+
export declare const entityRowVariantClass: Record<EntityRowVariant, {
|
|
33
|
+
row: string;
|
|
34
|
+
hover: string;
|
|
35
|
+
overlay: string;
|
|
36
|
+
}>;
|
|
37
|
+
export declare const entityRowSizeClass: Record<EntityRowSize, {
|
|
38
|
+
row: string;
|
|
39
|
+
content: string;
|
|
40
|
+
title: string;
|
|
41
|
+
subtitle: string;
|
|
42
|
+
avatar: 'sm' | 'md';
|
|
43
|
+
control: 'md' | 'lg';
|
|
44
|
+
}>;
|
|
45
|
+
export declare const entityRowMenuItemClass: Record<EntityRowSize, string | undefined>;
|
|
46
|
+
export declare const entityListGapClass: Record<NonNullable<EntityListProps['gap']>, string>;
|
|
47
|
+
export declare const entityListClass = "m-0 flex list-none flex-col p-0";
|
|
48
|
+
export declare const entityListSkeletonClass: {
|
|
49
|
+
readonly row: "flex items-center gap-3 px-2";
|
|
50
|
+
readonly avatar: {
|
|
51
|
+
readonly md: "size-8 shrink-0 rounded-full";
|
|
52
|
+
readonly lg: "size-10 shrink-0 rounded-full";
|
|
53
|
+
};
|
|
54
|
+
readonly lines: "flex flex-col gap-2";
|
|
55
|
+
readonly title: "h-4 rounded-md";
|
|
56
|
+
readonly subtitle: "h-3 w-44 rounded-md";
|
|
57
|
+
/** Varied so the placeholder does not read as a ruled grid. */
|
|
58
|
+
readonly titleWidths: readonly ["w-32", "w-28", "w-36", "w-24", "w-40", "w-28"];
|
|
59
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ElementType, ReactNode } from 'react';
|
|
2
|
+
/** `md` is a desk row (48px), `lg` a touch row (56px). */
|
|
3
|
+
export type EntityRowSize = 'md' | 'lg';
|
|
4
|
+
/** `plain` sits in a list and tints on hover; `bordered` is a standalone hairline card. */
|
|
5
|
+
export type EntityRowVariant = 'plain' | 'bordered';
|
|
6
|
+
export type EntityRowTagTone = 'default' | 'primary' | 'success' | 'warning' | 'danger';
|
|
7
|
+
export interface EntityRowTag {
|
|
8
|
+
key: string;
|
|
9
|
+
label: ReactNode;
|
|
10
|
+
/** Maps to the HeroUI `Chip` color, always `variant="flat"`. */
|
|
11
|
+
tone?: EntityRowTagTone;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* What the row leads with. Always decorative (`aria-hidden`): the title is the
|
|
15
|
+
* row's name. Precedence: `src`, then `icon`, then initials (`initials`, else
|
|
16
|
+
* derived from `name`, else from a string `title`).
|
|
17
|
+
*/
|
|
18
|
+
export interface EntityRowLeading {
|
|
19
|
+
/** Image URL. */
|
|
20
|
+
src?: string;
|
|
21
|
+
/** An icon tile instead of initials (a household, an organization). */
|
|
22
|
+
icon?: ReactNode;
|
|
23
|
+
/** Explicit initials, used verbatim. */
|
|
24
|
+
initials?: string;
|
|
25
|
+
/** Source for derived initials when the title is not the person's name. */
|
|
26
|
+
name?: string;
|
|
27
|
+
/** `circle` for people (default), `square` for a tile. */
|
|
28
|
+
shape?: 'circle' | 'square';
|
|
29
|
+
}
|
|
30
|
+
export interface EntityRowAction {
|
|
31
|
+
key: string;
|
|
32
|
+
label: string;
|
|
33
|
+
icon?: ReactNode;
|
|
34
|
+
tone?: 'default' | 'danger';
|
|
35
|
+
isDisabled?: boolean;
|
|
36
|
+
onAction: () => void;
|
|
37
|
+
/** Defaults to `<row testid>-menu-<key>`. */
|
|
38
|
+
'data-testid'?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Actions and their label travel together: an overflow trigger is icon-only,
|
|
42
|
+
* so without a label it is announced as "button" and nothing else.
|
|
43
|
+
*/
|
|
44
|
+
type EntityRowActionsProps = {
|
|
45
|
+
actions?: undefined;
|
|
46
|
+
actionsLabel?: undefined;
|
|
47
|
+
} | {
|
|
48
|
+
/** Overflow menu items. An empty array renders no trigger. */
|
|
49
|
+
actions: EntityRowAction[];
|
|
50
|
+
/**
|
|
51
|
+
* Accessible name of the `⋯` trigger and of the menu. Include the
|
|
52
|
+
* subject: "Actions for Chidi Okafor", not "Actions" — a list of
|
|
53
|
+
* these otherwise reads as a column of identical buttons.
|
|
54
|
+
*/
|
|
55
|
+
actionsLabel: string;
|
|
56
|
+
};
|
|
57
|
+
interface EntityRowBaseProps {
|
|
58
|
+
/** The row's accessible name. */
|
|
59
|
+
title: ReactNode;
|
|
60
|
+
/** Second line (contact details, a count, "View household"). */
|
|
61
|
+
subtitle?: ReactNode;
|
|
62
|
+
leading?: EntityRowLeading;
|
|
63
|
+
/** Chips beside the title. */
|
|
64
|
+
tags?: EntityRowTag[];
|
|
65
|
+
/**
|
|
66
|
+
* Makes the whole row a button. The press target is stretched over the
|
|
67
|
+
* row; `trailing` and the actions menu stay their own controls.
|
|
68
|
+
*/
|
|
69
|
+
onPress?: () => void;
|
|
70
|
+
/** Makes the whole row a link (wins over `onPress` for semantics; both fire). */
|
|
71
|
+
href?: string;
|
|
72
|
+
/** Router link component for `href` (Next.js `Link`, React Router `Link`). */
|
|
73
|
+
linkAs?: ElementType;
|
|
74
|
+
/** e.g. `'dialog'` when the row opens a picker. Only for button rows. */
|
|
75
|
+
'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | true;
|
|
76
|
+
/** Explicit control between the text and the menu ("Select", "Add"). */
|
|
77
|
+
trailing?: ReactNode;
|
|
78
|
+
/** Trailing chevron: the row leads somewhere. */
|
|
79
|
+
showChevron?: boolean;
|
|
80
|
+
/** Overrides the default chevron glyph. */
|
|
81
|
+
chevronIcon?: ReactNode;
|
|
82
|
+
/** Overrides the default `⋯` glyph. */
|
|
83
|
+
actionsIcon?: ReactNode;
|
|
84
|
+
/** Defaults from `DensityProvider`: `touch` → `lg`, otherwise `md`. */
|
|
85
|
+
size?: EntityRowSize;
|
|
86
|
+
variant?: EntityRowVariant;
|
|
87
|
+
/** Disables the press target and the actions trigger (not `trailing`, which the host owns). */
|
|
88
|
+
isDisabled?: boolean;
|
|
89
|
+
/** Container element. Defaults to `li` inside `EntityList`, `div` elsewhere. */
|
|
90
|
+
as?: 'li' | 'div';
|
|
91
|
+
className?: string;
|
|
92
|
+
/**
|
|
93
|
+
* Row container. Derived: `-trigger` (press target), `-menu-trigger`,
|
|
94
|
+
* `-menu`, `-menu-<key>`.
|
|
95
|
+
*/
|
|
96
|
+
'data-testid'?: string;
|
|
97
|
+
}
|
|
98
|
+
export type EntityRowProps = EntityRowBaseProps & EntityRowActionsProps;
|
|
99
|
+
export interface EntityListProps {
|
|
100
|
+
children: ReactNode;
|
|
101
|
+
/** Name the list: `aria-label` or `aria-labelledby` (one is required by a11y review). */
|
|
102
|
+
'aria-label'?: string;
|
|
103
|
+
'aria-labelledby'?: string;
|
|
104
|
+
/** Spacing between rows; `bordered` rows read better apart. */
|
|
105
|
+
gap?: 'none' | 'sm' | 'md';
|
|
106
|
+
className?: string;
|
|
107
|
+
'data-testid'?: string;
|
|
108
|
+
}
|
|
109
|
+
export interface EntityListSkeletonProps {
|
|
110
|
+
/** Announced to assistive tech while the rows load ("Loading contacts"). */
|
|
111
|
+
label: string;
|
|
112
|
+
rows?: number;
|
|
113
|
+
/** Defaults from `DensityProvider`, like `EntityRow`. */
|
|
114
|
+
size?: EntityRowSize;
|
|
115
|
+
className?: string;
|
|
116
|
+
'data-testid'?: string;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { JSX } from 'react';
|
|
2
2
|
import { EmptyStateProps, ErrorStateProps, FeedbackStateProps, LoadingStateProps, SuccessStateProps } from './type';
|
|
3
|
-
export declare function FeedbackState(
|
|
3
|
+
export declare function FeedbackState(props: FeedbackStateProps): JSX.Element;
|
|
4
4
|
export declare namespace FeedbackState {
|
|
5
5
|
var displayName: string;
|
|
6
6
|
}
|
|
@@ -20,6 +20,8 @@ export interface FeedbackStateClassNames {
|
|
|
20
20
|
spinner?: string;
|
|
21
21
|
title?: string;
|
|
22
22
|
description?: string;
|
|
23
|
+
/** The `ErrorState` reference code line. */
|
|
24
|
+
referenceCode?: string;
|
|
23
25
|
actions?: string;
|
|
24
26
|
}
|
|
25
27
|
export interface FeedbackStateProps {
|
|
@@ -50,6 +52,14 @@ export interface FeedbackStateProps {
|
|
|
50
52
|
'data-testid'?: string;
|
|
51
53
|
}
|
|
52
54
|
export type EmptyStateProps = Omit<FeedbackStateProps, 'variant'>;
|
|
53
|
-
export
|
|
55
|
+
export interface ErrorStateProps extends Omit<FeedbackStateProps, 'variant'> {
|
|
56
|
+
/**
|
|
57
|
+
* Support code for this failure, e.g. `"FR-QE-900"`, shown on a small line under the description
|
|
58
|
+
* so a user can quote it from a screenshot. Nothing is rendered without it.
|
|
59
|
+
*/
|
|
60
|
+
referenceCode?: string;
|
|
61
|
+
/** Text before the code. Defaults to `"Reference code:"`; the caller owns i18n. */
|
|
62
|
+
referenceCodeLabel?: string;
|
|
63
|
+
}
|
|
54
64
|
export type LoadingStateProps = Omit<FeedbackStateProps, 'variant'>;
|
|
55
65
|
export type SuccessStateProps = Omit<FeedbackStateProps, 'variant'>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const filterSelectClass: {
|
|
2
|
+
readonly base: "relative inline-grid min-w-[var(--filter-select-min)] max-w-max shrink grow basis-[var(--filter-select-min)] grid-cols-[minmax(0,1fr)] [--filter-select-min:6rem]";
|
|
3
|
+
readonly baseActive: "[--filter-select-min:8rem]";
|
|
4
|
+
readonly cell: "[grid-area:1/1]";
|
|
5
|
+
readonly sizer: "invisible h-0 max-w-[20rem] overflow-hidden whitespace-nowrap border-x-2 border-transparent pl-2 pr-[2.0625rem] text-[0.875rem]";
|
|
6
|
+
readonly sizerActive: "pr-[3.4375rem] font-semibold";
|
|
7
|
+
readonly select: "w-full [contain:inline-size]";
|
|
8
|
+
readonly trigger: "h-[2.375rem] min-h-[2.375rem] rounded-[0.625rem] border-medium border-pos-field bg-white px-2 shadow-none data-[hover=true]:border-default-300 data-[focus=true]:border-primary data-[open=true]:border-primary data-[focus-visible=true]:ring-2 data-[focus-visible=true]:ring-primary data-[focus-visible=true]:ring-offset-1";
|
|
9
|
+
readonly triggerActive: "!border-acct-rust-border !bg-acct-rust-fill pr-[1.875rem]";
|
|
10
|
+
readonly value: "text-[0.875rem] !text-default-900";
|
|
11
|
+
readonly valueActive: "font-semibold !text-primary-600";
|
|
12
|
+
readonly iconActive: "!text-primary-600";
|
|
13
|
+
readonly clear: "absolute right-[1.875rem] top-1/2 z-20 inline-flex size-[1.25rem] -translate-y-1/2 items-center justify-center rounded-md text-primary-600 outline-none hover:bg-white/70 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary";
|
|
14
|
+
readonly clearIcon: "size-[0.8125rem]";
|
|
15
|
+
readonly optionTitle: "whitespace-normal break-words";
|
|
16
|
+
};
|
|
17
|
+
export declare const filterSelectGroupClass = "grid shrink grow basis-0 grid-flow-col auto-cols-auto gap-2.5 [--filter-select-cap:16rem] max-w-[calc(var(--filter-select-count)*var(--filter-select-cap)+(var(--filter-select-count)-1)*0.625rem)] [&>[data-slot=filter-select]]:max-w-none";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface FilterSelectOption {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FilterSelectProps {
|
|
7
|
+
label: string;
|
|
8
|
+
value: string | null;
|
|
9
|
+
options: FilterSelectOption[];
|
|
10
|
+
onChange: (value: string | null) => void;
|
|
11
|
+
clearLabel: string;
|
|
12
|
+
minWidth?: number;
|
|
13
|
+
'data-testid'?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface FilterSelectGroupProps {
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
className?: string;
|
|
18
|
+
'data-testid'?: string;
|
|
19
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type InlineConfirmVariant = 'danger' | 'warning';
|
|
3
|
+
export type InlineConfirmSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
export interface InlineConfirmProps {
|
|
5
|
+
/** The question. Also the accessible name of the alertdialog. */
|
|
6
|
+
message: React.ReactNode;
|
|
7
|
+
/** Optional consequences. Becomes `aria-describedby`. */
|
|
8
|
+
description?: React.ReactNode;
|
|
9
|
+
/** Label for the confirm action. Carry the verb ("Remove"), not "OK". */
|
|
10
|
+
confirmLabel: string;
|
|
11
|
+
/** Label for the cancel action. Default `'Cancel'`. */
|
|
12
|
+
cancelLabel?: string;
|
|
13
|
+
onConfirm: () => void;
|
|
14
|
+
/** Fires from the Cancel button and from Escape. */
|
|
15
|
+
onCancel: () => void;
|
|
16
|
+
/** Drives the surface tone and the confirm colour. Default `'danger'`. */
|
|
17
|
+
variant?: InlineConfirmVariant;
|
|
18
|
+
/** Spinner on confirm; Cancel and Escape locked. Default `false`. */
|
|
19
|
+
isPending?: boolean;
|
|
20
|
+
/** Which button receives focus on mount. Default `'cancel'`. */
|
|
21
|
+
initialFocus?: 'cancel' | 'confirm';
|
|
22
|
+
/** Stop Escape from reaching ancestors (e.g. an enclosing Modal). Default `true`. */
|
|
23
|
+
containEscape?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Button size: `'sm'` 32px (default), `'md'` 40px, `'lg'` 48px for a touch
|
|
26
|
+
* register.
|
|
27
|
+
*/
|
|
28
|
+
size?: InlineConfirmSize;
|
|
29
|
+
/**
|
|
30
|
+
* `'li'` wraps the box in a list item, for swapping it in place of a row of
|
|
31
|
+
* a `ul`/`ol`. Default `'div'`.
|
|
32
|
+
*/
|
|
33
|
+
as?: 'li' | 'div';
|
|
34
|
+
className?: string;
|
|
35
|
+
/** Root test id; the buttons get `<id>-confirm` and `<id>-cancel`. */
|
|
36
|
+
'data-testid'?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare const InlineConfirm: React.FC<InlineConfirmProps>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { InlineConfirmVariant } from './InlineConfirm';
|
|
2
|
+
export declare const inlineConfirmClass: {
|
|
3
|
+
/** The `li` that keeps list semantics when the box replaces a row. */
|
|
4
|
+
readonly item: "list-none";
|
|
5
|
+
/**
|
|
6
|
+
* The alertdialog itself. It only takes focus programmatically, while pending,
|
|
7
|
+
* and then shows the system focus ring when the user is on the keyboard.
|
|
8
|
+
*/
|
|
9
|
+
readonly box: "outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus";
|
|
10
|
+
readonly body: "gap-3 px-4 py-3";
|
|
11
|
+
readonly text: "flex min-w-0 flex-col gap-1";
|
|
12
|
+
readonly message: "text-sm text-gray-900 [overflow-wrap:anywhere]";
|
|
13
|
+
readonly description: "text-sm text-gray-600 [overflow-wrap:anywhere]";
|
|
14
|
+
readonly actions: "flex flex-wrap items-center gap-2";
|
|
15
|
+
};
|
|
16
|
+
export declare const inlineConfirmSurface: Record<InlineConfirmVariant, string>;
|
|
@@ -1,7 +1,7 @@
|
|
|
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 = 'scheduled' | 'paid' | 'payment_due' | 'overdue' | 'failed' | 'refunded' | 'disputed' | 'canceled' | 'processing' | 'pending_confirmation';
|
|
4
|
+
export type InstallmentStatus = 'scheduled' | 'paid' | 'payment_due' | 'overdue' | 'failed' | 'refunded' | 'partially_refunded' | 'disputed' | 'canceled' | 'processing' | 'pending_confirmation';
|
|
5
5
|
export type ScheduledInstallment = {
|
|
6
6
|
id: string;
|
|
7
7
|
name?: string | null;
|
|
@@ -13,9 +13,22 @@ export type ScheduledInstallment = {
|
|
|
13
13
|
* or an ISO timestamp (shown in the viewer's timezone). Named after the
|
|
14
14
|
* field the commitments API already returns for this, so installments
|
|
15
15
|
* passed straight through from the API carry it without any mapping.
|
|
16
|
-
* `InstallmentTable` shows it on
|
|
16
|
+
* `InstallmentTable` shows it on rows whose payment happened (`paid`,
|
|
17
|
+
* `partially_refunded`, `refunded`) and on no other status; omit it to
|
|
18
|
+
* show none.
|
|
17
19
|
*/
|
|
18
20
|
fulfilledAt?: string | null;
|
|
21
|
+
/**
|
|
22
|
+
* FR-1422 — how much of the installment was refunded, in the same units as
|
|
23
|
+
* `amount` (a major-unit number: `50` is $50.00). `InstallmentTable`
|
|
24
|
+
* formats it with its own `currency` and `locale` and shows it as
|
|
25
|
+
* "Refunded $50.00" under the amount of a `partially_refunded` row.
|
|
26
|
+
*
|
|
27
|
+
* Ignored on every other status: a `refunded` row gave the whole amount
|
|
28
|
+
* back, so its amount and badge already say it. Also ignored when missing,
|
|
29
|
+
* zero or negative, so a row never reads "Refunded $0.00".
|
|
30
|
+
*/
|
|
31
|
+
refundedAmount?: number | null;
|
|
19
32
|
};
|
|
20
33
|
export type AutomaticScheduleSettings = {
|
|
21
34
|
numberOfInstallments: number;
|
|
@@ -120,8 +133,18 @@ export type InstallmentTableLabels = {
|
|
|
120
133
|
installmentId?: string;
|
|
121
134
|
amount?: string;
|
|
122
135
|
scheduledDate?: string;
|
|
123
|
-
/**
|
|
136
|
+
/**
|
|
137
|
+
* Prefix of the paid date shown under the scheduled date of a row whose
|
|
138
|
+
* payment happened: "Paid on Jun 3, 2026".
|
|
139
|
+
*/
|
|
124
140
|
paidOn?: string;
|
|
141
|
+
/** FR-1422 — text of the `partially_refunded` status badge. Defaults to "Partially refunded". */
|
|
142
|
+
partiallyRefunded?: string;
|
|
143
|
+
/**
|
|
144
|
+
* FR-1422 — prefix of the refunded amount shown under the amount of a
|
|
145
|
+
* `partially_refunded` row: "Refunded $50.00". Defaults to "Refunded".
|
|
146
|
+
*/
|
|
147
|
+
refundedAmount?: string;
|
|
125
148
|
status?: string;
|
|
126
149
|
actions?: string;
|
|
127
150
|
payNow?: string;
|
|
@@ -151,8 +174,9 @@ export type InstallmentTableProps = {
|
|
|
151
174
|
/**
|
|
152
175
|
* FR-1619 — statuses for which the Pay Now button is NOT rendered on a row.
|
|
153
176
|
* Typed with the `InstallmentStatus` union so consumers get compile-time
|
|
154
|
-
* safety on status keys.
|
|
155
|
-
*
|
|
177
|
+
* safety on status keys. A Pay Now button that IS rendered is still
|
|
178
|
+
* disabled on a row whose payment already happened (`paid`,
|
|
179
|
+
* `partially_refunded`, `refunded`). Defaults to `[]`.
|
|
156
180
|
*/
|
|
157
181
|
payNowHiddenStatuses?: InstallmentStatus[];
|
|
158
182
|
showSavedIndicator?: boolean;
|
|
@@ -28,3 +28,9 @@ export declare function hasManualRowErrors(errors: ManualRowErrors): boolean;
|
|
|
28
28
|
* where the generator put it.
|
|
29
29
|
*/
|
|
30
30
|
export declare function applyFirstInstallmentDateOverride(installments: ScheduledInstallment[], firstInstallmentDateOverride?: string): ScheduledInstallment[];
|
|
31
|
+
/**
|
|
32
|
+
* Whether the installment's payment already happened: it was paid, and may
|
|
33
|
+
* since have been refunded in part or in full. Such a row is a record of money
|
|
34
|
+
* that moved, so it cannot be paid again, edited or deleted.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isSettledInstallment(status: ScheduledInstallment['status']): boolean;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface KeyValueRow {
|
|
3
|
+
id?: string;
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
value: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export type KeyValueRowsDensity = 'regular' | 'compact';
|
|
8
|
+
export interface KeyValueRowsProps {
|
|
9
|
+
rows: KeyValueRow[];
|
|
10
|
+
density?: KeyValueRowsDensity;
|
|
11
|
+
'data-testid'?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const KeyValueRows: React.FC<KeyValueRowsProps>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { KeyValueRowsDensity } from './KeyValueRows';
|
|
2
|
+
export declare const keyValueRowsClass: {
|
|
3
|
+
readonly list: "m-0 divide-y divide-pos-hair";
|
|
4
|
+
readonly row: "flex items-baseline gap-3";
|
|
5
|
+
readonly label: "min-w-0 text-[0.84375rem] text-default-500";
|
|
6
|
+
readonly value: "m-0 ml-auto flex min-w-0 flex-wrap justify-end gap-[0.3125rem] text-right text-[0.875rem] text-default-900 [overflow-wrap:anywhere]";
|
|
7
|
+
};
|
|
8
|
+
export declare const keyValueRowPadding: Record<KeyValueRowsDensity, string>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface LineItemRow {
|
|
3
|
+
id: string;
|
|
4
|
+
name: React.ReactNode;
|
|
5
|
+
details?: React.ReactNode[];
|
|
6
|
+
amount: React.ReactNode;
|
|
7
|
+
originalAmount?: React.ReactNode;
|
|
8
|
+
chip?: React.ReactNode;
|
|
9
|
+
tone?: 'violet';
|
|
10
|
+
}
|
|
11
|
+
export interface LineItemRowsProps {
|
|
12
|
+
items: LineItemRow[];
|
|
13
|
+
ariaLabel?: string;
|
|
14
|
+
originalAmountLabel?: string;
|
|
15
|
+
'data-testid'?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const LineItemRows: React.FC<LineItemRowsProps>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const lineItemRowsClass: {
|
|
2
|
+
readonly list: "m-0 list-none p-0";
|
|
3
|
+
readonly row: "flex items-start gap-[0.875rem] border-t border-pos-hair px-5 py-3";
|
|
4
|
+
readonly body: "min-w-0 flex-1";
|
|
5
|
+
readonly name: "text-[0.90625rem] font-semibold text-default-900 [overflow-wrap:anywhere] [text-wrap:pretty]";
|
|
6
|
+
readonly details: "mt-[0.3125rem] flex flex-wrap items-center gap-[0.4375rem] text-[0.8125rem] text-default-500";
|
|
7
|
+
readonly separator: "text-default-400";
|
|
8
|
+
readonly detail: "tabular-nums";
|
|
9
|
+
readonly trailing: "flex shrink-0 flex-col items-end gap-1.5 text-right";
|
|
10
|
+
readonly amounts: "inline-flex items-baseline gap-2";
|
|
11
|
+
readonly original: "text-[0.8125rem] tabular-nums text-default-500 line-through";
|
|
12
|
+
readonly amount: "whitespace-nowrap text-[0.9375rem] font-bold tabular-nums text-default-900";
|
|
13
|
+
};
|
|
@@ -38,6 +38,8 @@ export interface ListPanelProps {
|
|
|
38
38
|
emptyContent?: React.ReactNode;
|
|
39
39
|
/** The table/list rendered when none of the async states apply. */
|
|
40
40
|
children?: React.ReactNode;
|
|
41
|
+
toolbar?: React.ReactNode;
|
|
42
|
+
variant?: 'default' | 'framed';
|
|
41
43
|
className?: string;
|
|
42
44
|
classNames?: ListPanelClassNames;
|
|
43
45
|
'data-testid'?: string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const loadMoreFooterClass: {
|
|
2
|
+
readonly base: "flex flex-wrap items-center justify-center gap-2.5 border-t border-pos-hair px-5 py-[0.875rem] text-[0.84375rem] text-default-500";
|
|
3
|
+
readonly idle: "w-full";
|
|
4
|
+
readonly sentinel: "h-px w-full";
|
|
5
|
+
readonly spinner: "inline-flex";
|
|
6
|
+
readonly error: "text-pos-danger";
|
|
7
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type LoadMoreStatus = 'idle' | 'loading' | 'error' | 'end';
|
|
2
|
+
export interface LoadMoreFooterProps {
|
|
3
|
+
status: LoadMoreStatus;
|
|
4
|
+
onLoadMore: () => void;
|
|
5
|
+
loadingLabel: string;
|
|
6
|
+
errorLabel: string;
|
|
7
|
+
retryLabel: string;
|
|
8
|
+
endLabel?: string;
|
|
9
|
+
'data-testid'?: string;
|
|
10
|
+
}
|
|
@@ -9,6 +9,8 @@ export interface MetaCardRowProps {
|
|
|
9
9
|
label: string;
|
|
10
10
|
/** Associates the caption with the control it labels. */
|
|
11
11
|
htmlFor?: string;
|
|
12
|
+
/** Marks the caption with a red asterisk; pair it with the control's own required state. */
|
|
13
|
+
required?: boolean;
|
|
12
14
|
children: ReactNode;
|
|
13
15
|
className?: string;
|
|
14
16
|
'data-testid'?: string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { ModalPanelEntry, ModalPanelsController } from './useModalPanels';
|
|
3
|
+
export interface ModalPanelsProps<TPanel> {
|
|
4
|
+
/** The stack from `useModalPanels()`. */
|
|
5
|
+
panels: ModalPanelsController<TPanel>;
|
|
6
|
+
/** Renders one panel. Called for every entry on the stack; only the top one is shown. */
|
|
7
|
+
children: (panel: TPanel, entry: ModalPanelEntry<TPanel>) => React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export declare function ModalPanels<TPanel>({ panels, children }: ModalPanelsProps<TPanel>): React.ReactElement;
|
|
10
|
+
export interface ModalPanelHeaderProps {
|
|
11
|
+
/** Panel title, rendered as an `h2`. */
|
|
12
|
+
title: React.ReactNode;
|
|
13
|
+
/**
|
|
14
|
+
* Where Back goes. Default: the panel beneath, from the stack. Either way
|
|
15
|
+
* it goes through the discard guard, scoped to this panel.
|
|
16
|
+
*/
|
|
17
|
+
onBack?: () => void;
|
|
18
|
+
/** Back's accessible name. Default `'Back'`. */
|
|
19
|
+
backLabel?: string;
|
|
20
|
+
isBackDisabled?: boolean;
|
|
21
|
+
/** Back button size: `'md'` 40px, `'lg'` 48px (touch registers). Default `'md'`. */
|
|
22
|
+
size?: 'md' | 'lg';
|
|
23
|
+
/** Content at the end of the header, before the modal's close button. */
|
|
24
|
+
actions?: React.ReactNode;
|
|
25
|
+
className?: string;
|
|
26
|
+
/** Root test id; derives `-back` and `-title`. Default `'modal-panel-header'`. */
|
|
27
|
+
'data-testid'?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Back + title for a panel pushed over the first one. Back is navigation, not
|
|
31
|
+
* one of the footer's decisions, so it lives top-left where it never moves.
|
|
32
|
+
* It is shown when there is somewhere to go back to (or `onBack` is given),
|
|
33
|
+
* and it is the element focus lands on when the panel opens.
|
|
34
|
+
*/
|
|
35
|
+
export declare const ModalPanelHeader: React.FC<ModalPanelHeaderProps>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ModalPanelContextValue {
|
|
2
|
+
isActive: boolean;
|
|
3
|
+
canGoBack: boolean;
|
|
4
|
+
back: () => void;
|
|
5
|
+
setEntryFocus: (node: HTMLElement | null) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const ModalPanelContext: import('react').Context<ModalPanelContextValue | null>;
|
|
8
|
+
export interface ModalPanelState {
|
|
9
|
+
/** True for the panel on screen. */
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
/** True when a panel lies beneath this one. */
|
|
12
|
+
canGoBack: boolean;
|
|
13
|
+
/** Returns to the panel beneath — asking first if this panel holds unsaved input. */
|
|
14
|
+
back: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The enclosing panel, for controls other than the header's Back — a footer
|
|
18
|
+
* Cancel, say. Outside `ModalPanels` it reports a lone, active panel.
|
|
19
|
+
*/
|
|
20
|
+
export declare function useModalPanel(): ModalPanelState;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** First element in `container` a Tab press would reach, skipping anything inside a hidden or inert subtree. */
|
|
2
|
+
export declare function firstTabbable(container: HTMLElement): HTMLElement | null;
|
|
3
|
+
/** Still in `container` and still able to take focus — not removed, disabled or hidden since it was recorded. */
|
|
4
|
+
export declare function canStillFocus(element: HTMLElement | null, container: HTMLElement): element is HTMLElement;
|
|
5
|
+
/**
|
|
6
|
+
* A popup (menu, listbox) currently open from a trigger inside `container`,
|
|
7
|
+
* found through the trigger's own ARIA wiring: `aria-expanded="true"` plus
|
|
8
|
+
* `aria-controls` naming the popup.
|
|
9
|
+
*
|
|
10
|
+
* Only POPUPS: the trigger declares `aria-haspopup`, or the element it
|
|
11
|
+
* controls has a popup role. An expanded accordion or disclosure carries the
|
|
12
|
+
* same `aria-expanded` + `aria-controls` pair, but its region is page content
|
|
13
|
+
* that cannot take focus; treating it as a popup sent focus nowhere.
|
|
14
|
+
*/
|
|
15
|
+
export declare function openPopupFrom(container: HTMLElement): HTMLElement | null;
|
|
16
|
+
/**
|
|
17
|
+
* Fired by react-aria's `FocusScope` on the element it is about to restore
|
|
18
|
+
* focus to when an overlay (a menu, a select, a dialog) unmounts; cancelable,
|
|
19
|
+
* and bubbles from that element. It is react-aria's own seam for redirecting a
|
|
20
|
+
* restore, and the reason no timer is needed here (see the file header).
|
|
21
|
+
*/
|
|
22
|
+
export declare const FOCUS_RESTORE_EVENT = "react-aria-focus-scope-restore";
|
|
23
|
+
/** DOM handles per panel key, and which panel is on screen. Plain bookkeeping; never read during render. */
|
|
24
|
+
export declare class PanelFocusMemory {
|
|
25
|
+
private readonly panels;
|
|
26
|
+
private active;
|
|
27
|
+
setContainer(key: string, node: HTMLElement | null): void;
|
|
28
|
+
setEntry(key: string, node: HTMLElement | null): void;
|
|
29
|
+
remember(key: string, node: HTMLElement): void;
|
|
30
|
+
/** The panel now on screen, and whether the operator came back to it (vs. opened it). */
|
|
31
|
+
setActive(key: string, isReturn: boolean): void;
|
|
32
|
+
/**
|
|
33
|
+
* Puts focus in the panel on screen, unless it is already there. Returning:
|
|
34
|
+
* the element that last had focus in it — the opener of the panel just left.
|
|
35
|
+
* Entering, or when that element is gone: Back, then the first tabbable element.
|
|
36
|
+
*/
|
|
37
|
+
focusActive(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Focus was dropped by an overlay closing over a hidden panel. If the
|
|
40
|
+
* operator has since opened a menu or select in the panel on screen, that
|
|
41
|
+
* is where they are; otherwise it is the panel's own target.
|
|
42
|
+
*/
|
|
43
|
+
recoverFocus(): void;
|
|
44
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ModalPanels, ModalPanelHeader } from './ModalPanels';
|
|
2
|
+
export type { ModalPanelsProps, ModalPanelHeaderProps } from './ModalPanels';
|
|
3
|
+
export { useModalPanel } from './context';
|
|
4
|
+
export type { ModalPanelState } from './context';
|
|
5
|
+
export { useModalPanels } from './useModalPanels';
|
|
6
|
+
export type { ModalPanelsController, ModalPanelEntry } from './useModalPanels';
|