@nexub/patterns 2.1.0 → 2.3.0

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.
@@ -0,0 +1 @@
1
+ 'use client';
@@ -0,0 +1,101 @@
1
+ 'use client';
2
+ import {
3
+ AuthCard
4
+ } from "./chunk-HMJRSNJD.js";
5
+ import {
6
+ usePageMessages
7
+ } from "./chunk-7QCJC2DV.js";
8
+
9
+ // src/components/SignInPage/SignInPage.tsx
10
+ import * as React from "react";
11
+ import { Alert, Button, FormField, Input, PasswordInput } from "@nexub/react";
12
+ import { ShieldCheck } from "@nexub/icons";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ var SignInPage = React.forwardRef(function SignInPage2({
15
+ onSubmit,
16
+ biometricLabel,
17
+ onBiometric,
18
+ onForgotPassword,
19
+ onCreateAccount,
20
+ loading,
21
+ error,
22
+ logo,
23
+ title,
24
+ description,
25
+ submitLabel,
26
+ as: Tag = "main",
27
+ messages,
28
+ className,
29
+ ...props
30
+ }, ref) {
31
+ const m = usePageMessages(messages);
32
+ const [email, setEmail] = React.useState("");
33
+ const [password, setPassword] = React.useState("");
34
+ return /* @__PURE__ */ jsx(
35
+ Tag,
36
+ {
37
+ ref,
38
+ className: ["flex min-h-full w-full items-start justify-center px-4 py-10 sm:items-center", className].filter(Boolean).join(" "),
39
+ ...props,
40
+ children: /* @__PURE__ */ jsx(
41
+ AuthCard,
42
+ {
43
+ logo,
44
+ title: title ?? m.signIn,
45
+ description,
46
+ footer: onCreateAccount && /* @__PURE__ */ jsx(Button, { variant: "link", onClick: onCreateAccount, children: m.createAccount }),
47
+ children: /* @__PURE__ */ jsxs(
48
+ "form",
49
+ {
50
+ className: "flex flex-col gap-4",
51
+ onSubmit: (e) => {
52
+ e.preventDefault();
53
+ if (email && password) onSubmit(email, password);
54
+ },
55
+ children: [
56
+ error && /* @__PURE__ */ jsx(Alert, { tone: "danger", role: "alert", children: error }),
57
+ /* @__PURE__ */ jsxs(FormField.Root, { required: true, children: [
58
+ /* @__PURE__ */ jsx(FormField.Label, { children: m.email }),
59
+ /* @__PURE__ */ jsx(FormField.Control, { children: /* @__PURE__ */ jsx(
60
+ Input,
61
+ {
62
+ type: "email",
63
+ autoComplete: "username webauthn",
64
+ inputMode: "email",
65
+ value: email,
66
+ onChange: (e) => setEmail(e.target.value)
67
+ }
68
+ ) })
69
+ ] }),
70
+ /* @__PURE__ */ jsxs(FormField.Root, { required: true, children: [
71
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
72
+ /* @__PURE__ */ jsx(FormField.Label, { children: m.password }),
73
+ onForgotPassword && /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "xs", onClick: onForgotPassword, children: m.forgotPassword })
74
+ ] }),
75
+ /* @__PURE__ */ jsx(FormField.Control, { children: /* @__PURE__ */ jsx(PasswordInput, { autoComplete: "current-password", value: password, onChange: (e) => setPassword(e.target.value) }) })
76
+ ] }),
77
+ /* @__PURE__ */ jsx(Button, { type: "submit", size: "lg", fullWidth: true, loading, disabled: !email || !password, children: submitLabel ?? m.signIn }),
78
+ onBiometric && biometricLabel && /* @__PURE__ */ jsx(
79
+ Button,
80
+ {
81
+ type: "button",
82
+ variant: "secondary",
83
+ size: "lg",
84
+ fullWidth: true,
85
+ leadingIcon: /* @__PURE__ */ jsx(ShieldCheck, { size: "sm", "aria-hidden": "true" }),
86
+ onClick: onBiometric,
87
+ children: biometricLabel
88
+ }
89
+ )
90
+ ]
91
+ }
92
+ )
93
+ }
94
+ )
95
+ }
96
+ );
97
+ });
98
+
99
+ export {
100
+ SignInPage
101
+ };
@@ -11,22 +11,26 @@ function SectionNav({
11
11
  activeId,
12
12
  onChoose,
13
13
  label,
14
+ footer,
14
15
  className
15
16
  }) {
16
- return /* @__PURE__ */ jsx(Sidebar.Root, { "aria-label": label, className, children: /* @__PURE__ */ jsx(Sidebar.Group, { children: items.map((item) => /* @__PURE__ */ jsx(
17
- Sidebar.Item,
18
- {
19
- href: item.href,
20
- icon: item.icon,
21
- active: item.id === activeId,
22
- onClick: (e) => onChoose(e, item),
23
- children: item.label
24
- },
25
- item.id
26
- )) }) });
17
+ return /* @__PURE__ */ jsxs(Sidebar.Root, { "aria-label": label, className, children: [
18
+ /* @__PURE__ */ jsx(Sidebar.Group, { children: items.map((item) => /* @__PURE__ */ jsx(
19
+ Sidebar.Item,
20
+ {
21
+ href: item.href,
22
+ icon: item.icon,
23
+ active: item.id === activeId,
24
+ onClick: (e) => onChoose(e, item),
25
+ children: item.label
26
+ },
27
+ item.id
28
+ )) }),
29
+ footer && /* @__PURE__ */ jsx(Sidebar.Footer, { className: "px-5 py-3 text-xs text-[var(--color-on-surface-muted)]", children: footer })
30
+ ] });
27
31
  }
28
32
  var Root = React.forwardRef(
29
- ({ items, activeId, onSelect, logo, actions, header, title, description, navLabel = "Settings", className, children, ...props }, ref) => {
33
+ ({ items, activeId, onSelect, logo, actions, header, title, description, navLabel = "Settings", navFooter, className, children, ...props }, ref) => {
30
34
  const [menuOpen, setMenuOpen] = React.useState(false);
31
35
  const onChoose = (e, item) => {
32
36
  if (!isPlainClick(e)) return;
@@ -51,6 +55,7 @@ var Root = React.forwardRef(
51
55
  activeId,
52
56
  onChoose,
53
57
  label: navLabel,
58
+ footer: navFooter,
54
59
  className: "sticky top-[var(--app-header-height,64px)] hidden h-[calc(100vh-var(--app-header-height,64px))] shrink-0 md:flex"
55
60
  }
56
61
  ),
@@ -66,7 +71,7 @@ var Root = React.forwardRef(
66
71
  /* @__PURE__ */ jsx(Sheet.Overlay, { className: "md:hidden" }),
67
72
  /* @__PURE__ */ jsxs(Sheet.Content, { side: "left", "aria-describedby": void 0, className: "md:hidden", children: [
68
73
  /* @__PURE__ */ jsx(Sheet.Title, { className: "px-5 pb-2 pt-5 text-base", children: navLabel }),
69
- /* @__PURE__ */ jsx(SectionNav, { items, activeId, onChoose, label: navLabel, className: "w-full border-e-0" })
74
+ /* @__PURE__ */ jsx(SectionNav, { items, activeId, onChoose, label: navLabel, footer: navFooter, className: "min-h-0 w-full flex-1 border-e-0" })
70
75
  ] })
71
76
  ] }) })
72
77
  ] });
@@ -0,0 +1,11 @@
1
+ 'use client';
2
+ import "../../chunk-CWFZA7ZQ.js";
3
+ import {
4
+ ActivityPage,
5
+ TransactionRow
6
+ } from "../../chunk-OC4XY3US.js";
7
+ import "../../chunk-7QCJC2DV.js";
8
+ export {
9
+ ActivityPage,
10
+ TransactionRow
11
+ };
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import {
3
+ ChatPage
4
+ } from "../../chunk-64PSI75E.js";
5
+ import "../../chunk-WRP73TXG.js";
6
+ import "../../chunk-7QCJC2DV.js";
7
+ export {
8
+ ChatPage
9
+ };
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import {
3
+ CheckoutPage
4
+ } from "../../chunk-CZR6NZDH.js";
5
+ import "../../chunk-WPNT5JOU.js";
6
+ import "../../chunk-7QCJC2DV.js";
7
+ export {
8
+ CheckoutPage
9
+ };
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ import {
3
+ DashboardPage
4
+ } from "../../chunk-33Z2ZPO7.js";
5
+ import "../../chunk-INKX2GYA.js";
6
+ import "../../chunk-OC4XY3US.js";
7
+ import "../../chunk-7QCJC2DV.js";
8
+ export {
9
+ DashboardPage
10
+ };
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import "../../chunk-RFCPEZGF.js";
3
+ import {
4
+ PageFrame,
5
+ defaultPageTemplateMessages,
6
+ groupByDay,
7
+ usePageMessages
8
+ } from "../../chunk-7QCJC2DV.js";
9
+ export {
10
+ PageFrame,
11
+ defaultPageTemplateMessages,
12
+ groupByDay,
13
+ usePageMessages
14
+ };
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+ import {
3
+ PaywallPage
4
+ } from "../../chunk-M3OHX4F4.js";
5
+ import "../../chunk-7QCJC2DV.js";
6
+ export {
7
+ PaywallPage
8
+ };
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  SettingsLayout,
4
4
  SettingsRow
5
- } from "../../chunk-WIHNK7RT.js";
5
+ } from "../../chunk-Z4FCC42C.js";
6
6
  export {
7
7
  SettingsLayout,
8
8
  SettingsRow
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+ import {
3
+ SettingsPage
4
+ } from "../../chunk-27N33TGN.js";
5
+ import "../../chunk-7QCJC2DV.js";
6
+ export {
7
+ SettingsPage
8
+ };
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import {
3
+ SignInPage
4
+ } from "../../chunk-UNQD426H.js";
5
+ import "../../chunk-HMJRSNJD.js";
6
+ import "../../chunk-7QCJC2DV.js";
7
+ export {
8
+ SignInPage
9
+ };
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import {
3
+ TransactionDetailPage
4
+ } from "../../chunk-CJBHDX2U.js";
5
+ import "../../chunk-WPNT5JOU.js";
6
+ import "../../chunk-7QCJC2DV.js";
7
+ export {
8
+ TransactionDetailPage
9
+ };
package/dist/index.d.ts CHANGED
@@ -199,6 +199,8 @@ interface SettingsLayoutProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
199
199
  description?: React.ReactNode;
200
200
  /** Accessible name of the section navigation. */
201
201
  navLabel?: string;
202
+ /** Pinned to the bottom of the section sidebar (and the phone menu) while the items scroll, e.g. `v1.2.0 · Updated 21 Oct 2026`. */
203
+ navFooter?: React.ReactNode;
202
204
  }
203
205
  interface SettingsLayoutSectionProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
204
206
  title?: React.ReactNode;
@@ -370,4 +372,333 @@ interface ConversationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, '
370
372
  */
371
373
  declare const Conversation: React.ForwardRefExoticComponent<ConversationProps & React.RefAttributes<HTMLDivElement>>;
372
374
 
373
- export { ActivityFeed, type ActivityItemProps, AppHeader, type AppHeaderOrg, type AppHeaderProps, type AppHeaderSearchGroup, type AppHeaderSearchItem, type AppHeaderUser, AppLauncher, type AppLauncherApp, type AppLauncherProps, AuthCard, type AuthCardProps, BentoGrid, type BentoGridProps, BentoTile, type BentoTileProps, type BentoTileSize, Conversation, type ConversationMessages, type ConversationProps, ErrorSummary, type ErrorSummaryItem, type ErrorSummaryProps, FilterBar, type FilterBarProps, type FormErrorMap, InfoList, type InfoListItemProps, type InfoListRootProps, ListDetail, type ListDetailProps, NotificationItem, type NotificationItemProps, PlanCard, type PlanCardProps, SettingsLayout, type SettingsLayoutItem, type SettingsLayoutProps, type SettingsLayoutSectionProps, SettingsRow, type SettingsRowProps, SettingsSection, type SettingsSectionProps, StatCard, type StatCardProps, StepIndicator, type StepIndicatorProps, type StepIndicatorStep, UserCard, type UserCardProps, useFormErrors };
375
+ interface Transaction {
376
+ id: string;
377
+ title: string;
378
+ subtitle?: string;
379
+ /** Negative = money out. */
380
+ amount: number;
381
+ currency: string;
382
+ date: Date;
383
+ status?: 'pending' | 'failed';
384
+ /** Avatar image URL. */
385
+ image?: string;
386
+ }
387
+ interface ReviewRow {
388
+ label: string;
389
+ value: string;
390
+ }
391
+ interface Quote {
392
+ fee: number;
393
+ /** Units of `to` per unit of `from`. */
394
+ rate: number;
395
+ /** e.g. "In seconds", "By Friday". */
396
+ arrives: string;
397
+ }
398
+ interface ChatMessage {
399
+ id: string;
400
+ role: 'user' | 'assistant';
401
+ text: string;
402
+ /** Still streaming in. */
403
+ streaming?: boolean;
404
+ }
405
+ interface Plan {
406
+ id: string;
407
+ name: string;
408
+ /** Preformatted, e.g. "$9.99 / month". */
409
+ price: string;
410
+ features: string[];
411
+ badge?: string;
412
+ }
413
+ interface QuickAction {
414
+ id: string;
415
+ label: string;
416
+ icon?: React.ReactNode;
417
+ onSelect: () => void;
418
+ }
419
+ interface Insight {
420
+ id: string;
421
+ title: string;
422
+ body: string;
423
+ action?: {
424
+ label: string;
425
+ onSelect: () => void;
426
+ };
427
+ }
428
+ interface PageTemplateMessages {
429
+ activity: string;
430
+ noActivityTitle: string;
431
+ noActivityDescription: string;
432
+ loadMore: string;
433
+ refresh: string;
434
+ pending: string;
435
+ failed: string;
436
+ completed: string;
437
+ date: string;
438
+ details: string;
439
+ back: string;
440
+ settings: string;
441
+ signIn: string;
442
+ email: string;
443
+ password: string;
444
+ forgotPassword: string;
445
+ createAccount: string;
446
+ howMuch: string;
447
+ amountToSend: string;
448
+ balance: (formatted: string) => string;
449
+ overBalance: (formatted: string) => string;
450
+ fee: string;
451
+ rate: string;
452
+ recipientGets: string;
453
+ arrives: string;
454
+ continue: string;
455
+ checkDetails: string;
456
+ edit: string;
457
+ done: string;
458
+ stepOf: (step: number, total: number) => string;
459
+ sent: string;
460
+ chat: string;
461
+ chatEmpty: string;
462
+ restorePurchases: string;
463
+ choosePlan: string;
464
+ totalBalance: string;
465
+ quickActions: string;
466
+ recentActivity: string;
467
+ seeAll: string;
468
+ insights: string;
469
+ }
470
+ declare const defaultPageTemplateMessages: PageTemplateMessages;
471
+ /** Defaults ← NexubProvider `messages` ← the template's own `messages` prop. */
472
+ declare function usePageMessages(overrides?: Partial<PageTemplateMessages>): PageTemplateMessages;
473
+ /** Newest first, grouped under a medium date heading ("30 Oct 2026"). */
474
+ declare function groupByDay(transactions: Transaction[], locale: string): {
475
+ title: string;
476
+ data: Transaction[];
477
+ }[];
478
+ interface PageFrameProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
479
+ /** Landmark element. Use `div` inside an app shell that already renders `<main>`. @default 'main' */
480
+ as?: 'main' | 'div' | 'section';
481
+ title?: React.ReactNode;
482
+ description?: React.ReactNode;
483
+ /** Top-right of the header: buttons, filters. */
484
+ actions?: React.ReactNode;
485
+ /** Above the title, e.g. a back link. */
486
+ eyebrow?: React.ReactNode;
487
+ /** Content width. @default 'md' */
488
+ width?: 'sm' | 'md' | 'lg';
489
+ }
490
+ /** Page frame shared by the templates: centred column, h1 header, responsive padding. */
491
+ declare const PageFrame: React.ForwardRefExoticComponent<PageFrameProps & React.RefAttributes<HTMLElement>>;
492
+
493
+ interface ActivityPageProps extends Omit<PageFrameProps, 'title' | 'children' | 'onSelect'> {
494
+ transactions: Transaction[];
495
+ /** Open one transaction. Rows become buttons when set. */
496
+ onSelect?: (t: Transaction) => void;
497
+ /** Shows a "Refresh" button (the web stand-in for pull-to-refresh). */
498
+ onRefresh?: () => void;
499
+ refreshing?: boolean;
500
+ /** Shows "Load more" under the list while `hasMore`. */
501
+ onLoadMore?: () => void;
502
+ hasMore?: boolean;
503
+ loadingMore?: boolean;
504
+ /** Per-row actions (the web stand-in for swipe actions), e.g. a menu button. */
505
+ rowActions?: (t: Transaction) => React.ReactNode;
506
+ /** Between the header and the list: filters, search. */
507
+ toolbar?: React.ReactNode;
508
+ empty?: React.ReactNode;
509
+ /** @default messages.activity */
510
+ title?: React.ReactNode;
511
+ messages?: Partial<PageTemplateMessages>;
512
+ }
513
+ /** One transaction row: avatar, title, amount coloured by direction, status. */
514
+ declare function TransactionRow({ t, onSelect, actions, m, locale, }: {
515
+ t: Transaction;
516
+ onSelect?: (t: Transaction) => void;
517
+ actions?: React.ReactNode;
518
+ m: PageTemplateMessages;
519
+ locale: string;
520
+ }): React.JSX.Element;
521
+ /**
522
+ * Transactions grouped by day, newest first. Web twin of the native
523
+ * `ActivityList`: pull-to-refresh becomes a Refresh button, paging a
524
+ * "Load more" button and swipe actions `rowActions`.
525
+ */
526
+ declare const ActivityPage: React.ForwardRefExoticComponent<ActivityPageProps & React.RefAttributes<HTMLElement>>;
527
+
528
+ interface TransactionDetailPageProps extends Omit<PageFrameProps, 'title' | 'children'> {
529
+ transaction: Transaction;
530
+ /** Extra rows: reference, account, category… */
531
+ rows?: ReviewRow[];
532
+ /** Under the details: "Download receipt", "Report a problem". */
533
+ footer?: React.ReactNode;
534
+ /** Shows a back button above the hero. */
535
+ onBack?: () => void;
536
+ messages?: Partial<PageTemplateMessages>;
537
+ }
538
+ /** One transaction: hero amount, status and summary rows. Web twin of the native `TransactionDetail`. */
539
+ declare const TransactionDetailPage: React.ForwardRefExoticComponent<TransactionDetailPageProps & React.RefAttributes<HTMLElement>>;
540
+
541
+ interface SettingsItem {
542
+ title: string;
543
+ subtitle?: string;
544
+ /** Icon or avatar before the title. */
545
+ leading?: React.ReactNode;
546
+ /** Current value, shown at the end (e.g. "English"). */
547
+ value?: React.ReactNode;
548
+ /** A Switch, Select or Button at the end. The row itself stays static. */
549
+ control?: React.ReactNode;
550
+ /** Makes the row a link. */
551
+ href?: string;
552
+ /** Makes the row a button (navigation to a sub-page, a dialog…). */
553
+ onSelect?: () => void;
554
+ /** Destructive row ("Sign out", "Delete account"): error colour. */
555
+ destructive?: boolean;
556
+ }
557
+ interface SettingsGroup {
558
+ header?: string;
559
+ footer?: string;
560
+ items: SettingsItem[];
561
+ }
562
+ interface SettingsPageProps extends Omit<PageFrameProps, 'title' | 'children'> {
563
+ groups: SettingsGroup[];
564
+ /** Above the groups: a profile card. */
565
+ header?: React.ReactNode;
566
+ /** @default messages.settings */
567
+ title?: React.ReactNode;
568
+ messages?: Partial<PageTemplateMessages>;
569
+ }
570
+ /**
571
+ * Grouped settings on one page, inset-grouped like iOS Settings. Web twin of
572
+ * the native `SettingsScreen`. For a multi-section account area with a
573
+ * sidebar, wrap pages in `SettingsLayout`.
574
+ */
575
+ declare const SettingsPage: React.ForwardRefExoticComponent<SettingsPageProps & React.RefAttributes<HTMLElement>>;
576
+
577
+ interface SignInPageProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onSubmit' | 'title'> {
578
+ onSubmit: (email: string, password: string) => void;
579
+ /** Passkey/biometric sign-in, named: "Sign in with a passkey". */
580
+ biometricLabel?: string;
581
+ onBiometric?: () => void;
582
+ onForgotPassword?: () => void;
583
+ onCreateAccount?: () => void;
584
+ loading?: boolean;
585
+ /** Error from the last attempt (announced). */
586
+ error?: string;
587
+ logo?: React.ReactNode;
588
+ /** Copy overrides. */
589
+ title?: string;
590
+ description?: string;
591
+ submitLabel?: string;
592
+ /** Landmark element. @default 'main' */
593
+ as?: 'main' | 'div';
594
+ messages?: Partial<PageTemplateMessages>;
595
+ }
596
+ /**
597
+ * Email + password sign-in with browser autofill (`username`,
598
+ * `current-password`, `webauthn`) and an optional passkey path. Web twin of
599
+ * the native `SignInScreen`.
600
+ */
601
+ declare const SignInPage: React.ForwardRefExoticComponent<SignInPageProps & React.RefAttributes<HTMLElement>>;
602
+
603
+ interface CheckoutPageProps extends Omit<PageFrameProps, 'title' | 'children'> {
604
+ from: string;
605
+ to: string;
606
+ /** Available balance in `from`. */
607
+ balance: number;
608
+ /** Quote for an amount: fee, rate and arrival are shown before anything else. */
609
+ quote: (amount: number) => Quote;
610
+ /** Rows on the review step. Defaults to amount, fee, rate, recipient gets, arrives. */
611
+ reviewRows?: (amount: number, quote: Quote) => ReviewRow[];
612
+ /** "Confirm and send". */
613
+ confirmLabel: string;
614
+ /** Named second factor under the button: "You'll confirm with your passkey". */
615
+ confirmHint?: string;
616
+ /** Moves the money. A rejected promise shows its message and stays on review. */
617
+ onConfirm: (amount: number) => void | Promise<void>;
618
+ /** Result screen title. @default messages.sent */
619
+ resultTitle?: string;
620
+ resultDescription?: string;
621
+ onDone: () => void;
622
+ messages?: Partial<PageTemplateMessages>;
623
+ }
624
+ /**
625
+ * Three-step pay flow: amount (live fee and rate) → review (every number,
626
+ * one confirming action) → result. Web twin of the native `AmountStep`,
627
+ * `ReviewStep` and `ResultScreen`.
628
+ */
629
+ declare const CheckoutPage: React.ForwardRefExoticComponent<CheckoutPageProps & React.RefAttributes<HTMLElement>>;
630
+
631
+ interface ChatPageProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
632
+ messages: ChatMessage[];
633
+ onSend: (text: string) => void;
634
+ /** Stop a streaming reply. Shows the stop button while the last message streams. */
635
+ onStop?: () => void;
636
+ /** Assistant is thinking (before the first token). */
637
+ thinking?: boolean;
638
+ placeholder?: string;
639
+ /** Shown while there are no messages. */
640
+ empty?: React.ReactNode;
641
+ /** Assistant avatar beside its messages. */
642
+ assistantAvatar?: React.ReactNode;
643
+ /** Visible page title. Hidden headings still name the page for screen readers. @default messages.chat */
644
+ title?: string;
645
+ /** Show `title` visually. @default false */
646
+ showTitle?: boolean;
647
+ /** Landmark element. @default 'main' */
648
+ as?: 'main' | 'div';
649
+ /** Copy overrides (`messages` is the conversation). */
650
+ strings?: Partial<PageTemplateMessages>;
651
+ }
652
+ /**
653
+ * Full-height conversation: message list that follows new content, a
654
+ * thinking indicator and a composer. Web twin of the native `ChatScreen`.
655
+ * The parent sets the height (e.g. `h-dvh` or the app shell's content area).
656
+ */
657
+ declare const ChatPage: React.ForwardRefExoticComponent<ChatPageProps & React.RefAttributes<HTMLElement>>;
658
+
659
+ interface PaywallPageProps extends Omit<PageFrameProps, 'title' | 'children'> {
660
+ title: string;
661
+ plans: Plan[];
662
+ defaultPlan?: string;
663
+ onSubscribe: (planId: string) => void;
664
+ onRestore?: () => void;
665
+ /** Legal copy (auto-renewal terms). */
666
+ terms?: string;
667
+ loading?: boolean;
668
+ messages?: Partial<PageTemplateMessages>;
669
+ }
670
+ /**
671
+ * Choose a plan, then one Continue: plans are a radio group, not a row of
672
+ * buttons, so the choice and the commitment stay separate. Web twin of the
673
+ * native `PaywallScreen`. For a pricing page with a button per plan, use `PlanCard`.
674
+ */
675
+ declare const PaywallPage: React.ForwardRefExoticComponent<PaywallPageProps & React.RefAttributes<HTMLElement>>;
676
+
677
+ type DashboardStat = Pick<StatCardProps, 'label' | 'value' | 'delta' | 'deltaType' | 'sentiment' | 'icon' | 'description'>;
678
+ interface DashboardPageProps extends Omit<PageFrameProps, 'title' | 'children'> {
679
+ /** Page title, e.g. "Good morning, Mei". */
680
+ title: React.ReactNode;
681
+ balance: {
682
+ value: number;
683
+ currency: string;
684
+ label?: string;
685
+ };
686
+ /** Send, Add money, Request… Keep to four. */
687
+ quickActions?: QuickAction[];
688
+ /** Key figures under the balance. */
689
+ stats?: DashboardStat[];
690
+ /** The latest few transactions. */
691
+ recent?: Transaction[];
692
+ onSelectTransaction?: (t: Transaction) => void;
693
+ /** Shows "See all" beside Recent activity. */
694
+ onSeeAllActivity?: () => void;
695
+ insights?: Insight[];
696
+ messages?: Partial<PageTemplateMessages>;
697
+ }
698
+ /**
699
+ * Money-app home: balance with quick actions, key figures, recent activity and
700
+ * insights. Two columns from `lg`, one on phones. Web twin of the native `HomeScreen`.
701
+ */
702
+ declare const DashboardPage: React.ForwardRefExoticComponent<DashboardPageProps & React.RefAttributes<HTMLElement>>;
703
+
704
+ export { ActivityFeed, type ActivityItemProps, ActivityPage, type ActivityPageProps, AppHeader, type AppHeaderOrg, type AppHeaderProps, type AppHeaderSearchGroup, type AppHeaderSearchItem, type AppHeaderUser, AppLauncher, type AppLauncherApp, type AppLauncherProps, AuthCard, type AuthCardProps, BentoGrid, type BentoGridProps, BentoTile, type BentoTileProps, type BentoTileSize, type ChatMessage, ChatPage, type ChatPageProps, CheckoutPage, type CheckoutPageProps, Conversation, type ConversationMessages, type ConversationProps, DashboardPage, type DashboardPageProps, type DashboardStat, ErrorSummary, type ErrorSummaryItem, type ErrorSummaryProps, FilterBar, type FilterBarProps, type FormErrorMap, InfoList, type InfoListItemProps, type InfoListRootProps, type Insight, ListDetail, type ListDetailProps, NotificationItem, type NotificationItemProps, PageFrame, type PageFrameProps, type PageTemplateMessages, PaywallPage, type PaywallPageProps, type Plan, PlanCard, type PlanCardProps, type QuickAction, type Quote, type ReviewRow, type SettingsGroup, type SettingsItem, SettingsLayout, type SettingsLayoutItem, type SettingsLayoutProps, type SettingsLayoutSectionProps, SettingsPage, type SettingsPageProps, SettingsRow, type SettingsRowProps, SettingsSection, type SettingsSectionProps, SignInPage, type SignInPageProps, StatCard, type StatCardProps, StepIndicator, type StepIndicatorProps, type StepIndicatorStep, type Transaction, TransactionDetailPage, type TransactionDetailPageProps, TransactionRow, UserCard, type UserCardProps, defaultPageTemplateMessages, groupByDay, useFormErrors, usePageMessages };