@agg-build/ui 4.18.2 → 4.19.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.
Files changed (31) hide show
  1. package/README.md +1 -0
  2. package/dist/{chunk-RFMA5ABT.mjs → chunk-GT3DCFIT.mjs} +489 -36
  3. package/dist/index.js +1070 -603
  4. package/dist/index.mjs +9 -1
  5. package/dist/pages.js +502 -35
  6. package/dist/pages.mjs +9 -1
  7. package/dist/styles.css +1 -1
  8. package/dist/tailwind.css +1 -1
  9. package/dist/types/pages/index.d.mts +1 -0
  10. package/dist/types/pages/index.d.ts +1 -0
  11. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.mts +7 -0
  12. package/dist/types/pages/leaderboard/components/leaderboard-header-row.d.ts +7 -0
  13. package/dist/types/pages/leaderboard/components/leaderboard-row.d.mts +7 -0
  14. package/dist/types/pages/leaderboard/components/leaderboard-row.d.ts +7 -0
  15. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.mts +3 -0
  16. package/dist/types/pages/leaderboard/components/leaderboard-skeleton.d.ts +3 -0
  17. package/dist/types/pages/leaderboard/components/segmented-control.d.mts +18 -0
  18. package/dist/types/pages/leaderboard/components/segmented-control.d.ts +18 -0
  19. package/dist/types/pages/leaderboard/index.d.mts +28 -0
  20. package/dist/types/pages/leaderboard/index.d.ts +28 -0
  21. package/dist/types/pages/leaderboard/leaderboard.constants.d.mts +8 -0
  22. package/dist/types/pages/leaderboard/leaderboard.constants.d.ts +8 -0
  23. package/dist/types/pages/leaderboard/leaderboard.types.d.mts +11 -0
  24. package/dist/types/pages/leaderboard/leaderboard.types.d.ts +11 -0
  25. package/dist/types/pages/user-profile/position-view-model.d.mts +2 -4
  26. package/dist/types/pages/user-profile/position-view-model.d.ts +2 -4
  27. package/dist/types/shared/pnl-format.d.mts +20 -0
  28. package/dist/types/shared/pnl-format.d.ts +20 -0
  29. package/package.json +3 -3
  30. /package/dist/types/{pages/user-profile/components → shared}/default-avatar.d.mts +0 -0
  31. /package/dist/types/{pages/user-profile/components → shared}/default-avatar.d.ts +0 -0
@@ -0,0 +1,7 @@
1
+ import type { LeaderboardRow } from "../leaderboard.types";
2
+ export interface LeaderboardRowViewProps {
3
+ row: LeaderboardRow;
4
+ isCurrentUser: boolean;
5
+ className?: string;
6
+ }
7
+ export declare function LeaderboardRowView({ row, isCurrentUser, className, }: LeaderboardRowViewProps): JSX.Element;
@@ -0,0 +1,3 @@
1
+ export declare function LeaderboardSkeleton({ rows }: {
2
+ rows?: number;
3
+ }): JSX.Element;
@@ -0,0 +1,3 @@
1
+ export declare function LeaderboardSkeleton({ rows }: {
2
+ rows?: number;
3
+ }): JSX.Element;
@@ -0,0 +1,18 @@
1
+ export interface SegmentedControlItem<T extends string> {
2
+ value: T;
3
+ label: string;
4
+ }
5
+ export interface SegmentedControlProps<T extends string> {
6
+ /** Accessible group name, e.g. "Period". */
7
+ label: string;
8
+ value: T;
9
+ onChange: (value: T) => void;
10
+ items: SegmentedControlItem<T>[];
11
+ className?: string;
12
+ itemClassName?: string;
13
+ }
14
+ /**
15
+ * Bordered segmented toggle — the same shell as the profile page's position
16
+ * filters (`rounded-agg-sm border`, 1px dividers, pressed item filled).
17
+ */
18
+ export declare function SegmentedControl<T extends string>({ label, value, onChange, items, className, itemClassName, }: SegmentedControlProps<T>): JSX.Element;
@@ -0,0 +1,18 @@
1
+ export interface SegmentedControlItem<T extends string> {
2
+ value: T;
3
+ label: string;
4
+ }
5
+ export interface SegmentedControlProps<T extends string> {
6
+ /** Accessible group name, e.g. "Period". */
7
+ label: string;
8
+ value: T;
9
+ onChange: (value: T) => void;
10
+ items: SegmentedControlItem<T>[];
11
+ className?: string;
12
+ itemClassName?: string;
13
+ }
14
+ /**
15
+ * Bordered segmented toggle — the same shell as the profile page's position
16
+ * filters (`rounded-agg-sm border`, 1px dividers, pressed item filled).
17
+ */
18
+ export declare function SegmentedControl<T extends string>({ label, value, onChange, items, className, itemClassName, }: SegmentedControlProps<T>): JSX.Element;
@@ -0,0 +1,28 @@
1
+ import type { LeaderboardClassNames, LeaderboardMetric, LeaderboardPeriod, LeaderboardRow } from "./leaderboard.types";
2
+ export type { LeaderboardClassNames, LeaderboardMetric, LeaderboardPeriod, LeaderboardRow, } from "./leaderboard.types";
3
+ export { LEADERBOARD_DEFAULT_METRIC, LEADERBOARD_DEFAULT_PERIOD, LEADERBOARD_METRICS, } from "./leaderboard.constants";
4
+ export interface LeaderboardPageProps {
5
+ /** Rows to render. When absent the page fetches via `useLeaderboard`. */
6
+ rows?: LeaderboardRow[];
7
+ isLoading?: boolean;
8
+ error?: unknown;
9
+ hasNextPage?: boolean;
10
+ isLoadingMore?: boolean;
11
+ onLoadMore?: () => void;
12
+ /** Controlled period; uncontrolled state is used when absent. */
13
+ period?: LeaderboardPeriod;
14
+ onPeriodChange?: (period: LeaderboardPeriod) => void;
15
+ metric?: LeaderboardMetric;
16
+ onMetricChange?: (metric: LeaderboardMetric) => void;
17
+ /** Row to mark as "you". Defaults to the signed-in user. */
18
+ currentUserId?: string;
19
+ /** Shown in the subtitle as "Top traders on {appName}". */
20
+ appName?: string;
21
+ onError?: (error: Error) => void;
22
+ className?: string;
23
+ classNames?: LeaderboardClassNames;
24
+ }
25
+ export declare function LeaderboardPage(props: LeaderboardPageProps): JSX.Element;
26
+ export declare namespace LeaderboardPage {
27
+ var displayName: string;
28
+ }
@@ -0,0 +1,28 @@
1
+ import type { LeaderboardClassNames, LeaderboardMetric, LeaderboardPeriod, LeaderboardRow } from "./leaderboard.types";
2
+ export type { LeaderboardClassNames, LeaderboardMetric, LeaderboardPeriod, LeaderboardRow, } from "./leaderboard.types";
3
+ export { LEADERBOARD_DEFAULT_METRIC, LEADERBOARD_DEFAULT_PERIOD, LEADERBOARD_METRICS, } from "./leaderboard.constants";
4
+ export interface LeaderboardPageProps {
5
+ /** Rows to render. When absent the page fetches via `useLeaderboard`. */
6
+ rows?: LeaderboardRow[];
7
+ isLoading?: boolean;
8
+ error?: unknown;
9
+ hasNextPage?: boolean;
10
+ isLoadingMore?: boolean;
11
+ onLoadMore?: () => void;
12
+ /** Controlled period; uncontrolled state is used when absent. */
13
+ period?: LeaderboardPeriod;
14
+ onPeriodChange?: (period: LeaderboardPeriod) => void;
15
+ metric?: LeaderboardMetric;
16
+ onMetricChange?: (metric: LeaderboardMetric) => void;
17
+ /** Row to mark as "you". Defaults to the signed-in user. */
18
+ currentUserId?: string;
19
+ /** Shown in the subtitle as "Top traders on {appName}". */
20
+ appName?: string;
21
+ onError?: (error: Error) => void;
22
+ className?: string;
23
+ classNames?: LeaderboardClassNames;
24
+ }
25
+ export declare function LeaderboardPage(props: LeaderboardPageProps): JSX.Element;
26
+ export declare namespace LeaderboardPage {
27
+ var displayName: string;
28
+ }
@@ -0,0 +1,8 @@
1
+ import type { LeaderboardMetric, LeaderboardPeriod } from "./leaderboard.types";
2
+ export declare const LEADERBOARD_DEFAULT_PERIOD: LeaderboardPeriod;
3
+ export declare const LEADERBOARD_DEFAULT_METRIC: LeaderboardMetric;
4
+ export declare const LEADERBOARD_METRICS: readonly LeaderboardMetric[];
5
+ /** Ranks that get the emphasised chip. */
6
+ export declare const LEADERBOARD_TOP_RANKS = 3;
7
+ /** Shared grid template: rank | identity | trades | volume | P&L. */
8
+ export declare const LEADERBOARD_GRID_CLASS = "grid grid-cols-[36px_minmax(0,1fr)] grid-rows-[auto_auto] gap-x-3 gap-y-2 sm:grid-cols-[48px_minmax(0,1fr)_88px_128px_128px] sm:grid-rows-1 sm:gap-x-3 sm:gap-y-0";
@@ -0,0 +1,8 @@
1
+ import type { LeaderboardMetric, LeaderboardPeriod } from "./leaderboard.types";
2
+ export declare const LEADERBOARD_DEFAULT_PERIOD: LeaderboardPeriod;
3
+ export declare const LEADERBOARD_DEFAULT_METRIC: LeaderboardMetric;
4
+ export declare const LEADERBOARD_METRICS: readonly LeaderboardMetric[];
5
+ /** Ranks that get the emphasised chip. */
6
+ export declare const LEADERBOARD_TOP_RANKS = 3;
7
+ /** Shared grid template: rank | identity | trades | volume | P&L. */
8
+ export declare const LEADERBOARD_GRID_CLASS = "grid grid-cols-[36px_minmax(0,1fr)] grid-rows-[auto_auto] gap-x-3 gap-y-2 sm:grid-cols-[48px_minmax(0,1fr)_88px_128px_128px] sm:grid-rows-1 sm:gap-x-3 sm:gap-y-0";
@@ -0,0 +1,11 @@
1
+ import type { LeaderboardMetric, LeaderboardRow } from "@agg-build/sdk";
2
+ import type { LeaderboardPeriod } from "@agg-build/hooks";
3
+ export type { LeaderboardMetric, LeaderboardRow, LeaderboardPeriod };
4
+ export interface LeaderboardClassNames {
5
+ root?: string;
6
+ header?: string;
7
+ toolbar?: string;
8
+ list?: string;
9
+ row?: string;
10
+ footer?: string;
11
+ }
@@ -0,0 +1,11 @@
1
+ import type { LeaderboardMetric, LeaderboardRow } from "@agg-build/sdk";
2
+ import type { LeaderboardPeriod } from "@agg-build/hooks";
3
+ export type { LeaderboardMetric, LeaderboardRow, LeaderboardPeriod };
4
+ export interface LeaderboardClassNames {
5
+ root?: string;
6
+ header?: string;
7
+ toolbar?: string;
8
+ list?: string;
9
+ row?: string;
10
+ footer?: string;
11
+ }
@@ -1,7 +1,8 @@
1
+ import { formatCurrency, formatSignedCurrency, getPositionTone, type PositionTone } from "../../shared/pnl-format";
1
2
  import type { UserProfilePosition } from "./user-profile.types";
3
+ export { formatCurrency, formatSignedCurrency, getPositionTone, type PositionTone };
2
4
  export type PositionStatus = "open" | "won_unclaimed" | "won_claimed" | "lost" | "sold";
3
5
  export type PositionBucket = "active" | "closed";
4
- export type PositionTone = "positive" | "negative" | "neutral";
5
6
  export type PositionValueDisplay = {
6
7
  primaryLabel: string;
7
8
  deltaLabel: string;
@@ -43,8 +44,6 @@ export type PositionViewModelFormatters = {
43
44
  /** Receives a dollar amount. */
44
45
  formatCurrency?: (value: number) => string;
45
46
  };
46
- export declare const formatCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
47
- export declare const formatSignedCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
48
47
  export declare const formatPriceCents: (value: number | null | undefined, formatPrice?: (value: number) => string) => string;
49
48
  export declare const formatSignedPercent: (value: number | null | undefined) => string;
50
49
  export declare const resolvePositionStatus: (position: UserProfilePosition) => PositionStatus;
@@ -61,5 +60,4 @@ export declare const getPnlValue: (position: UserProfilePosition, value: number
61
60
  export declare const getPnlPercent: (position: UserProfilePosition, pnlValue: number | null) => number | null;
62
61
  export declare const getFinalPnlValue: (position: UserProfilePosition, value: number | null) => number | null;
63
62
  export declare const getFinalPnlPercent: (position: UserProfilePosition, pnlValue: number | null) => number | null;
64
- export declare const getPositionTone: (value: number | null | undefined) => PositionTone;
65
63
  export declare const toPositionRowViewModel: (position: UserProfilePosition, labels?: PositionViewModelLabels, formatters?: PositionViewModelFormatters) => PositionRowViewModel;
@@ -1,7 +1,8 @@
1
+ import { formatCurrency, formatSignedCurrency, getPositionTone, type PositionTone } from "../../shared/pnl-format";
1
2
  import type { UserProfilePosition } from "./user-profile.types";
3
+ export { formatCurrency, formatSignedCurrency, getPositionTone, type PositionTone };
2
4
  export type PositionStatus = "open" | "won_unclaimed" | "won_claimed" | "lost" | "sold";
3
5
  export type PositionBucket = "active" | "closed";
4
- export type PositionTone = "positive" | "negative" | "neutral";
5
6
  export type PositionValueDisplay = {
6
7
  primaryLabel: string;
7
8
  deltaLabel: string;
@@ -43,8 +44,6 @@ export type PositionViewModelFormatters = {
43
44
  /** Receives a dollar amount. */
44
45
  formatCurrency?: (value: number) => string;
45
46
  };
46
- export declare const formatCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
47
- export declare const formatSignedCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
48
47
  export declare const formatPriceCents: (value: number | null | undefined, formatPrice?: (value: number) => string) => string;
49
48
  export declare const formatSignedPercent: (value: number | null | undefined) => string;
50
49
  export declare const resolvePositionStatus: (position: UserProfilePosition) => PositionStatus;
@@ -61,5 +60,4 @@ export declare const getPnlValue: (position: UserProfilePosition, value: number
61
60
  export declare const getPnlPercent: (position: UserProfilePosition, pnlValue: number | null) => number | null;
62
61
  export declare const getFinalPnlValue: (position: UserProfilePosition, value: number | null) => number | null;
63
62
  export declare const getFinalPnlPercent: (position: UserProfilePosition, pnlValue: number | null) => number | null;
64
- export declare const getPositionTone: (value: number | null | undefined) => PositionTone;
65
63
  export declare const toPositionRowViewModel: (position: UserProfilePosition, labels?: PositionViewModelLabels, formatters?: PositionViewModelFormatters) => PositionRowViewModel;
@@ -0,0 +1,20 @@
1
+ export type PositionTone = "positive" | "negative" | "neutral";
2
+ export declare const MISSING_VALUE_LABEL = "\u2014";
3
+ export declare const isFiniteNumber: (value: number | null | undefined) => value is number;
4
+ export declare const formatCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
5
+ /** Magnitudes below this render as "<$0.01" instead of a misleading "$0.00" when `markNegligible` is set. */
6
+ export declare const NEGLIGIBLE_CURRENCY_THRESHOLD = 0.005;
7
+ export interface SignedCurrencyOptions {
8
+ /**
9
+ * Render a non-zero value that would round to $0.00 as `+<$0.01` / `-<$0.01`
10
+ * so dust (fractional-share settlements, rounding residue) reads as
11
+ * negligible rather than as exactly zero. Exact 0 still renders `$0.00`.
12
+ */
13
+ markNegligible?: boolean;
14
+ }
15
+ export declare const formatSignedCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string, options?: SignedCurrencyOptions) => string;
16
+ /** Unsigned counterpart for volume: a positive value below half a cent reads `<$0.01`. */
17
+ export declare const formatCurrencyMarkingNegligible: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
18
+ export declare const getPositionTone: (value: number | null | undefined) => PositionTone;
19
+ /** Token class for a P&L tone; mirrors position-row.tsx's mapping. */
20
+ export declare const toneClassName: (tone: PositionTone) => string;
@@ -0,0 +1,20 @@
1
+ export type PositionTone = "positive" | "negative" | "neutral";
2
+ export declare const MISSING_VALUE_LABEL = "\u2014";
3
+ export declare const isFiniteNumber: (value: number | null | undefined) => value is number;
4
+ export declare const formatCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
5
+ /** Magnitudes below this render as "<$0.01" instead of a misleading "$0.00" when `markNegligible` is set. */
6
+ export declare const NEGLIGIBLE_CURRENCY_THRESHOLD = 0.005;
7
+ export interface SignedCurrencyOptions {
8
+ /**
9
+ * Render a non-zero value that would round to $0.00 as `+<$0.01` / `-<$0.01`
10
+ * so dust (fractional-share settlements, rounding residue) reads as
11
+ * negligible rather than as exactly zero. Exact 0 still renders `$0.00`.
12
+ */
13
+ markNegligible?: boolean;
14
+ }
15
+ export declare const formatSignedCurrency: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string, options?: SignedCurrencyOptions) => string;
16
+ /** Unsigned counterpart for volume: a positive value below half a cent reads `<$0.01`. */
17
+ export declare const formatCurrencyMarkingNegligible: (value: number | null | undefined, formatCurrencyOverride?: (value: number) => string) => string;
18
+ export declare const getPositionTone: (value: number | null | undefined) => PositionTone;
19
+ /** Token class for a P&L tone; mirrors position-row.tsx's mapping. */
20
+ export declare const toneClassName: (tone: PositionTone) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agg-build/ui",
3
- "version": "4.18.2",
3
+ "version": "4.19.0",
4
4
  "description": "Pre-built React component library for the AGG prediction market aggregator. Tailwind-based, themeable, with primitives, event surfaces, trading flows, full pages, and modals.",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",
@@ -100,8 +100,8 @@
100
100
  "liveline": "^0.0.7",
101
101
  "react": "^18.0.0 || ^19.0.0",
102
102
  "react-dom": "^18.0.0 || ^19.0.0",
103
- "@agg-build/hooks": "^4.18.2",
104
- "@agg-build/sdk": "^4.18.0"
103
+ "@agg-build/hooks": "^4.19.0",
104
+ "@agg-build/sdk": "^4.19.0"
105
105
  },
106
106
  "dependencies": {
107
107
  "@number-flow/react": "^0.6.0",