@agg-build/ui 4.4.0 → 4.7.1
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 +4 -0
- package/dist/{chunk-64BBTXFE.mjs → chunk-3RQCBGIK.mjs} +11 -6
- package/dist/{chunk-V5CRUO6S.mjs → chunk-C4GFVJ62.mjs} +98 -30
- package/dist/{chunk-WW5QKNIM.mjs → chunk-EOLR7DHL.mjs} +302 -26
- package/dist/{chunk-UCU2XCV5.mjs → chunk-LXQ3U4X2.mjs} +2 -2
- package/dist/{chunk-N7UPPT5J.mjs → chunk-RDBMHBR2.mjs} +14 -0
- package/dist/{chunk-6STRIKUA.mjs → chunk-WYCSTAN7.mjs} +1 -1
- package/dist/{chunk-734VTGCV.mjs → chunk-XN2NB2NP.mjs} +1 -1
- package/dist/events.js +97 -25
- package/dist/events.mjs +3 -3
- package/dist/index.js +407 -50
- package/dist/index.mjs +7 -7
- package/dist/modals.mjs +3 -3
- package/dist/pages.js +407 -50
- package/dist/pages.mjs +6 -6
- package/dist/primitives.mjs +1 -1
- package/dist/trading.js +8 -3
- package/dist/trading.mjs +4 -4
- package/dist/types/events/list/event-list.constants.d.mts +3 -1
- package/dist/types/events/list/event-list.constants.d.ts +3 -1
- package/dist/types/events/list/event-list.types.d.mts +17 -0
- package/dist/types/events/list/event-list.types.d.ts +17 -0
- package/dist/types/events/list/event-list.utils.d.mts +4 -0
- package/dist/types/events/list/event-list.utils.d.ts +4 -0
- package/dist/types/events/list/index.d.mts +2 -2
- package/dist/types/events/list/index.d.ts +2 -2
- package/dist/types/pages/home/event-discovery-url-state.d.mts +35 -0
- package/dist/types/pages/home/event-discovery-url-state.d.ts +35 -0
- package/package.json +3 -3
package/dist/pages.mjs
CHANGED
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
formatRecurringCountdown,
|
|
12
12
|
formatShareAmount,
|
|
13
13
|
useHomePageModals
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
14
|
+
} from "./chunk-EOLR7DHL.mjs";
|
|
15
|
+
import "./chunk-C4GFVJ62.mjs";
|
|
16
16
|
import {
|
|
17
17
|
DEPOSIT_MODAL_OPEN_EVENT,
|
|
18
18
|
WITHDRAW_MODAL_OPEN_EVENT,
|
|
19
19
|
requestAggDepositModalOpen,
|
|
20
20
|
requestAggWithdrawModalOpen
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
21
|
+
} from "./chunk-3RQCBGIK.mjs";
|
|
22
|
+
import "./chunk-WYCSTAN7.mjs";
|
|
23
|
+
import "./chunk-XN2NB2NP.mjs";
|
|
24
|
+
import "./chunk-RDBMHBR2.mjs";
|
|
25
25
|
export {
|
|
26
26
|
DEPOSIT_MODAL_OPEN_EVENT,
|
|
27
27
|
EventMarketPage,
|
package/dist/primitives.mjs
CHANGED
package/dist/trading.js
CHANGED
|
@@ -8528,7 +8528,7 @@ var getSmartRouteTotalFees = (feeBreakdown) => {
|
|
|
8528
8528
|
if (!feeBreakdown) return null;
|
|
8529
8529
|
const feeParts = [feeBreakdown.venueFees, feeBreakdown.bridgeFees, feeBreakdown.executionGas];
|
|
8530
8530
|
if (!feeParts.every(Number.isFinite)) return null;
|
|
8531
|
-
return feeParts.reduce((total, fee) => total + fee, 0);
|
|
8531
|
+
return feeParts.reduce((total, fee) => total + Math.round(fee * 100) / 100, 0);
|
|
8532
8532
|
};
|
|
8533
8533
|
var getPlaceOrderContainerClassName = () => {
|
|
8534
8534
|
return PLACE_ORDER_CONTAINER_CLASS_NAME;
|
|
@@ -8790,7 +8790,7 @@ var buildLiveRouteCards = ({
|
|
|
8790
8790
|
// balance condition, and `handleExecuteQuote` rejects an empty quoteId.
|
|
8791
8791
|
sq.venue !== primaryWinnerVenue
|
|
8792
8792
|
).map((sq) => {
|
|
8793
|
-
var _a2;
|
|
8793
|
+
var _a2, _b2;
|
|
8794
8794
|
const parsedVenue = parseVenue(sq.venue);
|
|
8795
8795
|
const venue = parsedVenue.success ? parsedVenue.data : void 0;
|
|
8796
8796
|
if (geoBlockedVenues.has(sq.venue)) {
|
|
@@ -8823,7 +8823,12 @@ var buildLiveRouteCards = ({
|
|
|
8823
8823
|
estimatedProfit: sq.estimatedProfit,
|
|
8824
8824
|
returnPct: sq.returnPct,
|
|
8825
8825
|
// venueSoloQuotes stripped on solo card's quoteData (only the primary needs them)
|
|
8826
|
-
venueSoloQuotes: void 0
|
|
8826
|
+
venueSoloQuotes: void 0,
|
|
8827
|
+
// This solo's OWN fee breakdown. Without it the spread above leaves the
|
|
8828
|
+
// primary route's breakdown in place, so selecting a bridge-free venue
|
|
8829
|
+
// still showed the primary's bridging charge. Falls back to the
|
|
8830
|
+
// primary only when the router omitted one (non-"ok" solos).
|
|
8831
|
+
feeBreakdown: (_b2 = sq.feeBreakdown) != null ? _b2 : quoteData.feeBreakdown
|
|
8827
8832
|
}), sq.quoteId ? { status: "ok", error: void 0 } : null);
|
|
8828
8833
|
return {
|
|
8829
8834
|
id: `live-solo-${sq.venue}`,
|
package/dist/trading.mjs
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
parseVenue,
|
|
13
13
|
useClaimWinnings,
|
|
14
14
|
useResolvedMarketClaim
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-3RQCBGIK.mjs";
|
|
16
16
|
import {
|
|
17
17
|
SETTLEMENT_SECTION_ID,
|
|
18
18
|
Settlement,
|
|
@@ -30,9 +30,9 @@ import {
|
|
|
30
30
|
prepareSettlementDifferences,
|
|
31
31
|
resolveDifferenceIconClassName,
|
|
32
32
|
useEventTradingContext
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
33
|
+
} from "./chunk-WYCSTAN7.mjs";
|
|
34
|
+
import "./chunk-XN2NB2NP.mjs";
|
|
35
|
+
import "./chunk-RDBMHBR2.mjs";
|
|
36
36
|
export {
|
|
37
37
|
FundKalshiModal,
|
|
38
38
|
PlaceOrder,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { AggUiLabels } from "@agg-build/hooks";
|
|
2
|
-
import type { EventListTab } from "./event-list.types";
|
|
2
|
+
import type { EventListSortValue, EventListTab } from "./event-list.types";
|
|
3
3
|
export declare const DEFAULT_EVENTS_LIMIT = 50;
|
|
4
|
+
export declare const DEFAULT_EVENT_LIST_SORT: EventListSortValue;
|
|
5
|
+
export declare const EVENT_LIST_SORT_VALUES: readonly ["volume24hr", "topArbitrage", "volume", "endDate"];
|
|
4
6
|
export declare const getDefaultEventListTabs: (labels: AggUiLabels) => EventListTab[];
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { AggUiLabels } from "@agg-build/hooks";
|
|
2
|
-
import type { EventListTab } from "./event-list.types";
|
|
2
|
+
import type { EventListSortValue, EventListTab } from "./event-list.types";
|
|
3
3
|
export declare const DEFAULT_EVENTS_LIMIT = 50;
|
|
4
|
+
export declare const DEFAULT_EVENT_LIST_SORT: EventListSortValue;
|
|
5
|
+
export declare const EVENT_LIST_SORT_VALUES: readonly ["volume24hr", "topArbitrage", "volume", "endDate"];
|
|
4
6
|
export declare const getDefaultEventListTabs: (labels: AggUiLabels) => EventListTab[];
|
|
@@ -4,7 +4,12 @@ import type { MutableRefObject } from "react";
|
|
|
4
4
|
import type { IconName } from "../../primitives/icon";
|
|
5
5
|
import type { VenueLogoName } from "../../primitives/venue-logo";
|
|
6
6
|
import type { VenueEventWithMarkets, VenueMarket, VenueMarketOutcome } from "../item";
|
|
7
|
+
import type { SubcategoryPathEntry } from "./event-list.utils";
|
|
7
8
|
export type EventListTabValue = "matched" | "all" | `${Venue}` | (string & {});
|
|
9
|
+
export type EventListSortValue = "volume24hr" | "topArbitrage" | "volume" | "endDate";
|
|
10
|
+
export type EventListFilterChangeOptions = {
|
|
11
|
+
history: "push" | "replace";
|
|
12
|
+
};
|
|
8
13
|
/** Exposes EventList internal state for snapshot capture by parent components. */
|
|
9
14
|
export type EventListStateRef = {
|
|
10
15
|
venueTab: EventListTabValue;
|
|
@@ -43,6 +48,18 @@ export type EventListProps = {
|
|
|
43
48
|
getEventHref?: (event: VenueEventWithMarkets) => string;
|
|
44
49
|
/** Venue tab value to restore on mount (from navigation snapshot). */
|
|
45
50
|
initialVenueTab?: EventListTabValue;
|
|
51
|
+
/** Controlled venue tab value. Omit to retain EventList's local-state behavior. */
|
|
52
|
+
activeVenueTab?: EventListTabValue;
|
|
53
|
+
/** Called when the controlled venue tab changes. */
|
|
54
|
+
onActiveVenueTabChange?: (value: EventListTabValue, options: EventListFilterChangeOptions) => void;
|
|
55
|
+
/** Controlled sort value. Omit to retain EventList's local-state behavior. */
|
|
56
|
+
selectedSort?: EventListSortValue;
|
|
57
|
+
/** Called when the controlled sort changes. */
|
|
58
|
+
onSelectedSortChange?: (value: EventListSortValue, options: EventListFilterChangeOptions) => void;
|
|
59
|
+
/** Controlled ordered subcategory path. Omit to retain EventList's local-state behavior. */
|
|
60
|
+
categoryPath?: SubcategoryPathEntry[];
|
|
61
|
+
/** Called when the controlled subcategory path changes. */
|
|
62
|
+
onCategoryPathChange?: (value: SubcategoryPathEntry[], options: EventListFilterChangeOptions) => void;
|
|
46
63
|
/** Number of infinite query pages to eagerly prefetch on mount (from navigation snapshot). */
|
|
47
64
|
initialLoadedPageCount?: number;
|
|
48
65
|
/** Ref that EventList writes its internal state to, so parents can read it for snapshot capture. */
|
|
@@ -4,7 +4,12 @@ import type { MutableRefObject } from "react";
|
|
|
4
4
|
import type { IconName } from "../../primitives/icon";
|
|
5
5
|
import type { VenueLogoName } from "../../primitives/venue-logo";
|
|
6
6
|
import type { VenueEventWithMarkets, VenueMarket, VenueMarketOutcome } from "../item";
|
|
7
|
+
import type { SubcategoryPathEntry } from "./event-list.utils";
|
|
7
8
|
export type EventListTabValue = "matched" | "all" | `${Venue}` | (string & {});
|
|
9
|
+
export type EventListSortValue = "volume24hr" | "topArbitrage" | "volume" | "endDate";
|
|
10
|
+
export type EventListFilterChangeOptions = {
|
|
11
|
+
history: "push" | "replace";
|
|
12
|
+
};
|
|
8
13
|
/** Exposes EventList internal state for snapshot capture by parent components. */
|
|
9
14
|
export type EventListStateRef = {
|
|
10
15
|
venueTab: EventListTabValue;
|
|
@@ -43,6 +48,18 @@ export type EventListProps = {
|
|
|
43
48
|
getEventHref?: (event: VenueEventWithMarkets) => string;
|
|
44
49
|
/** Venue tab value to restore on mount (from navigation snapshot). */
|
|
45
50
|
initialVenueTab?: EventListTabValue;
|
|
51
|
+
/** Controlled venue tab value. Omit to retain EventList's local-state behavior. */
|
|
52
|
+
activeVenueTab?: EventListTabValue;
|
|
53
|
+
/** Called when the controlled venue tab changes. */
|
|
54
|
+
onActiveVenueTabChange?: (value: EventListTabValue, options: EventListFilterChangeOptions) => void;
|
|
55
|
+
/** Controlled sort value. Omit to retain EventList's local-state behavior. */
|
|
56
|
+
selectedSort?: EventListSortValue;
|
|
57
|
+
/** Called when the controlled sort changes. */
|
|
58
|
+
onSelectedSortChange?: (value: EventListSortValue, options: EventListFilterChangeOptions) => void;
|
|
59
|
+
/** Controlled ordered subcategory path. Omit to retain EventList's local-state behavior. */
|
|
60
|
+
categoryPath?: SubcategoryPathEntry[];
|
|
61
|
+
/** Called when the controlled subcategory path changes. */
|
|
62
|
+
onCategoryPathChange?: (value: SubcategoryPathEntry[], options: EventListFilterChangeOptions) => void;
|
|
46
63
|
/** Number of infinite query pages to eagerly prefetch on mount (from navigation snapshot). */
|
|
47
64
|
initialLoadedPageCount?: number;
|
|
48
65
|
/** Ref that EventList writes its internal state to, so parents can read it for snapshot capture. */
|
|
@@ -31,4 +31,8 @@ export declare const sortCategoriesForNavigation: <TCategory extends CategoryNav
|
|
|
31
31
|
* - With an empty path, use the provided fallback category ids.
|
|
32
32
|
*/
|
|
33
33
|
export declare const resolveCategoryIdsFromPath: (path: readonly SubcategoryPathEntry[], fallbackCategoryIds: string[] | undefined) => string[] | undefined;
|
|
34
|
+
export declare const validateSubcategoryPath: <TCategory extends {
|
|
35
|
+
id: string;
|
|
36
|
+
parentId: string | null;
|
|
37
|
+
}>(requestedPath: readonly string[], rootCategoryId: string | null, childrenByParentId: ReadonlyMap<string, readonly TCategory[]>) => string[];
|
|
34
38
|
export declare const resolveTabVenus: (tab: EventListTab | undefined, visibleVenues?: readonly string[]) => UseVenueEventsOptions["venues"] | undefined;
|
|
@@ -31,4 +31,8 @@ export declare const sortCategoriesForNavigation: <TCategory extends CategoryNav
|
|
|
31
31
|
* - With an empty path, use the provided fallback category ids.
|
|
32
32
|
*/
|
|
33
33
|
export declare const resolveCategoryIdsFromPath: (path: readonly SubcategoryPathEntry[], fallbackCategoryIds: string[] | undefined) => string[] | undefined;
|
|
34
|
+
export declare const validateSubcategoryPath: <TCategory extends {
|
|
35
|
+
id: string;
|
|
36
|
+
parentId: string | null;
|
|
37
|
+
}>(requestedPath: readonly string[], rootCategoryId: string | null, childrenByParentId: ReadonlyMap<string, readonly TCategory[]>) => string[];
|
|
34
38
|
export declare const resolveTabVenus: (tab: EventListTab | undefined, visibleVenues?: readonly string[]) => UseVenueEventsOptions["venues"] | undefined;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { EventListProps } from "./event-list.types";
|
|
2
2
|
export type { CategorySidebarLabels, CategorySidebarProps } from "./category-sidebar";
|
|
3
|
-
export type { EventListProps, EventListStateRef } from "./event-list.types";
|
|
3
|
+
export type { EventListFilterChangeOptions, EventListProps, EventListSortValue, EventListStateRef, } from "./event-list.types";
|
|
4
4
|
export declare const EventList: {
|
|
5
|
-
({ title, limit, maxVisibleItems, search, categoryIds, onCategoryRootChange, onEventClick, onMarketClick, getMarketHref, getEventHref, initialVenueTab, initialLoadedPageCount, stateRef, }: EventListProps): JSX.Element;
|
|
5
|
+
({ title, limit, maxVisibleItems, search, categoryIds, onCategoryRootChange, onEventClick, onMarketClick, getMarketHref, getEventHref, initialVenueTab, activeVenueTab: controlledActiveVenueTab, onActiveVenueTabChange, selectedSort: controlledSelectedSort, onSelectedSortChange, categoryPath: controlledCategoryPath, onCategoryPathChange, initialLoadedPageCount, stateRef, }: EventListProps): JSX.Element;
|
|
6
6
|
displayName: string;
|
|
7
7
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { EventListProps } from "./event-list.types";
|
|
2
2
|
export type { CategorySidebarLabels, CategorySidebarProps } from "./category-sidebar";
|
|
3
|
-
export type { EventListProps, EventListStateRef } from "./event-list.types";
|
|
3
|
+
export type { EventListFilterChangeOptions, EventListProps, EventListSortValue, EventListStateRef, } from "./event-list.types";
|
|
4
4
|
export declare const EventList: {
|
|
5
|
-
({ title, limit, maxVisibleItems, search, categoryIds, onCategoryRootChange, onEventClick, onMarketClick, getMarketHref, getEventHref, initialVenueTab, initialLoadedPageCount, stateRef, }: EventListProps): JSX.Element;
|
|
5
|
+
({ title, limit, maxVisibleItems, search, categoryIds, onCategoryRootChange, onEventClick, onMarketClick, getMarketHref, getEventHref, initialVenueTab, activeVenueTab: controlledActiveVenueTab, onActiveVenueTabChange, selectedSort: controlledSelectedSort, onSelectedSortChange, categoryPath: controlledCategoryPath, onCategoryPathChange, initialLoadedPageCount, stateRef, }: EventListProps): JSX.Element;
|
|
6
6
|
displayName: string;
|
|
7
7
|
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { DEFAULT_EVENT_LIST_SORT, EVENT_LIST_SORT_VALUES } from "../../events/list/event-list.constants";
|
|
2
|
+
import type { EventListSortValue } from "../../events/list/event-list.types";
|
|
3
|
+
export { DEFAULT_EVENT_LIST_SORT, EVENT_LIST_SORT_VALUES };
|
|
4
|
+
export type { EventListSortValue };
|
|
5
|
+
export type EventDiscoveryUrlState = {
|
|
6
|
+
category: string;
|
|
7
|
+
subcategoryPath: string[];
|
|
8
|
+
venue: string;
|
|
9
|
+
sort: EventListSortValue;
|
|
10
|
+
};
|
|
11
|
+
type ParsedEventDiscoveryUrlState = {
|
|
12
|
+
category?: string;
|
|
13
|
+
subcategoryPath: string[];
|
|
14
|
+
venue?: string;
|
|
15
|
+
sort?: EventListSortValue;
|
|
16
|
+
categoryIsInvalid: boolean;
|
|
17
|
+
shouldCanonicalize: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare const readEventDiscoveryUrlState: (searchParams: URLSearchParams) => ParsedEventDiscoveryUrlState;
|
|
20
|
+
export declare const resolveEventDiscoveryUrlState: ({ parsedState, categoryValues, venueValues, defaultCategory, defaultVenue, }: {
|
|
21
|
+
parsedState: ParsedEventDiscoveryUrlState;
|
|
22
|
+
categoryValues: readonly string[];
|
|
23
|
+
venueValues: readonly string[];
|
|
24
|
+
defaultCategory: string;
|
|
25
|
+
defaultVenue: string;
|
|
26
|
+
}) => {
|
|
27
|
+
state: EventDiscoveryUrlState;
|
|
28
|
+
shouldCanonicalize: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare const buildEventDiscoveryUrl: ({ currentUrl, state, defaultCategory, defaultVenue, }: {
|
|
31
|
+
currentUrl: URL;
|
|
32
|
+
state: EventDiscoveryUrlState;
|
|
33
|
+
defaultCategory: string;
|
|
34
|
+
defaultVenue: string;
|
|
35
|
+
}) => string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { DEFAULT_EVENT_LIST_SORT, EVENT_LIST_SORT_VALUES } from "../../events/list/event-list.constants";
|
|
2
|
+
import type { EventListSortValue } from "../../events/list/event-list.types";
|
|
3
|
+
export { DEFAULT_EVENT_LIST_SORT, EVENT_LIST_SORT_VALUES };
|
|
4
|
+
export type { EventListSortValue };
|
|
5
|
+
export type EventDiscoveryUrlState = {
|
|
6
|
+
category: string;
|
|
7
|
+
subcategoryPath: string[];
|
|
8
|
+
venue: string;
|
|
9
|
+
sort: EventListSortValue;
|
|
10
|
+
};
|
|
11
|
+
type ParsedEventDiscoveryUrlState = {
|
|
12
|
+
category?: string;
|
|
13
|
+
subcategoryPath: string[];
|
|
14
|
+
venue?: string;
|
|
15
|
+
sort?: EventListSortValue;
|
|
16
|
+
categoryIsInvalid: boolean;
|
|
17
|
+
shouldCanonicalize: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare const readEventDiscoveryUrlState: (searchParams: URLSearchParams) => ParsedEventDiscoveryUrlState;
|
|
20
|
+
export declare const resolveEventDiscoveryUrlState: ({ parsedState, categoryValues, venueValues, defaultCategory, defaultVenue, }: {
|
|
21
|
+
parsedState: ParsedEventDiscoveryUrlState;
|
|
22
|
+
categoryValues: readonly string[];
|
|
23
|
+
venueValues: readonly string[];
|
|
24
|
+
defaultCategory: string;
|
|
25
|
+
defaultVenue: string;
|
|
26
|
+
}) => {
|
|
27
|
+
state: EventDiscoveryUrlState;
|
|
28
|
+
shouldCanonicalize: boolean;
|
|
29
|
+
};
|
|
30
|
+
export declare const buildEventDiscoveryUrl: ({ currentUrl, state, defaultCategory, defaultVenue, }: {
|
|
31
|
+
currentUrl: URL;
|
|
32
|
+
state: EventDiscoveryUrlState;
|
|
33
|
+
defaultCategory: string;
|
|
34
|
+
defaultVenue: string;
|
|
35
|
+
}) => string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agg-build/ui",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.7.1",
|
|
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/
|
|
104
|
-
"@agg-build/
|
|
103
|
+
"@agg-build/sdk": "^4.7.0",
|
|
104
|
+
"@agg-build/hooks": "^4.7.0"
|
|
105
105
|
},
|
|
106
106
|
"dependencies": {
|
|
107
107
|
"@number-flow/react": "^0.6.0",
|